Compare commits
3 Commits
main
...
fix/discor
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a81c1daca7 | ||
|
|
a3ff7daf70 | ||
|
|
e59e6aa757 |
@ -71,6 +71,8 @@ Status: beta.
|
|||||||
- **BREAKING:** Gateway auth mode "none" is removed; gateway now requires token/password (Tailscale Serve identity still allowed).
|
- **BREAKING:** Gateway auth mode "none" is removed; gateway now requires token/password (Tailscale Serve identity still allowed).
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
- Discord: restore username directory lookup in target resolution. (#3131) Thanks @bonald.
|
||||||
|
- Agents: align MiniMax base URL test expectation with default provider config. (#3131) Thanks @bonald.
|
||||||
- Agents: prevent retries on oversized image errors and surface size limits. (#2871) Thanks @Suksham-sharma.
|
- Agents: prevent retries on oversized image errors and surface size limits. (#2871) Thanks @Suksham-sharma.
|
||||||
- Agents: inherit provider baseUrl/api for inline models. (#2740) Thanks @lploc94.
|
- Agents: inherit provider baseUrl/api for inline models. (#2740) Thanks @lploc94.
|
||||||
- Memory Search: keep auto provider model defaults and only include remote when configured. (#2576) Thanks @papago2355.
|
- Memory Search: keep auto provider model defaults and only include remote when configured. (#2576) Thanks @papago2355.
|
||||||
|
|||||||
@ -136,7 +136,7 @@ describe("models-config", () => {
|
|||||||
}
|
}
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
expect(parsed.providers.minimax?.baseUrl).toBe("https://api.minimax.io/anthropic");
|
expect(parsed.providers.minimax?.baseUrl).toBe("https://api.minimax.chat/v1");
|
||||||
expect(parsed.providers.minimax?.apiKey).toBe("MINIMAX_API_KEY");
|
expect(parsed.providers.minimax?.apiKey).toBe("MINIMAX_API_KEY");
|
||||||
const ids = parsed.providers.minimax?.models?.map((model) => model.id);
|
const ids = parsed.providers.minimax?.models?.map((model) => model.id);
|
||||||
expect(ids).toContain("MiniMax-M2.1");
|
expect(ids).toContain("MiniMax-M2.1");
|
||||||
|
|||||||
@ -275,7 +275,7 @@ describe("image tool MiniMax VLM routing", () => {
|
|||||||
|
|
||||||
expect(fetch).toHaveBeenCalledTimes(1);
|
expect(fetch).toHaveBeenCalledTimes(1);
|
||||||
const [url, init] = fetch.mock.calls[0];
|
const [url, init] = fetch.mock.calls[0];
|
||||||
expect(String(url)).toBe("https://api.minimax.io/v1/coding_plan/vlm");
|
expect(String(url)).toBe("https://api.minimax.chat/v1/coding_plan/vlm");
|
||||||
expect(init?.method).toBe("POST");
|
expect(init?.method).toBe("POST");
|
||||||
expect(String((init?.headers as Record<string, string>)?.Authorization)).toBe(
|
expect(String((init?.headers as Record<string, string>)?.Authorization)).toBe(
|
||||||
"Bearer minimax-test",
|
"Bearer minimax-test",
|
||||||
|
|||||||
@ -1,3 +1,6 @@
|
|||||||
|
export type { DirectoryConfigParams } from "./plugins/directory-config.js";
|
||||||
|
export type { ChannelDirectoryEntry } from "./plugins/types.js";
|
||||||
|
|
||||||
export type MessagingTargetKind = "user" | "channel";
|
export type MessagingTargetKind = "user" | "channel";
|
||||||
|
|
||||||
export type MessagingTarget = {
|
export type MessagingTarget = {
|
||||||
|
|||||||
@ -10,7 +10,6 @@ import {
|
|||||||
import type { DirectoryConfigParams } from "../channels/plugins/directory-config.js";
|
import type { DirectoryConfigParams } from "../channels/plugins/directory-config.js";
|
||||||
|
|
||||||
import { listDiscordDirectoryPeersLive } from "./directory-live.js";
|
import { listDiscordDirectoryPeersLive } from "./directory-live.js";
|
||||||
import { resolveDiscordAccount } from "./accounts.js";
|
|
||||||
|
|
||||||
export type DiscordTargetKind = MessagingTargetKind;
|
export type DiscordTargetKind = MessagingTargetKind;
|
||||||
|
|
||||||
@ -81,13 +80,15 @@ export async function resolveDiscordTarget(
|
|||||||
const trimmed = raw.trim();
|
const trimmed = raw.trim();
|
||||||
if (!trimmed) return undefined;
|
if (!trimmed) return undefined;
|
||||||
|
|
||||||
const shouldLookup = isExplicitUserLookup(trimmed, options);
|
const parseOptions: DiscordTargetParseOptions = {};
|
||||||
const directParse = safeParseDiscordTarget(trimmed, options);
|
const likelyUsername = isLikelyUsername(trimmed);
|
||||||
if (directParse && directParse.kind !== "channel") {
|
const shouldLookup = isExplicitUserLookup(trimmed, parseOptions) || likelyUsername;
|
||||||
|
const directParse = safeParseDiscordTarget(trimmed, parseOptions);
|
||||||
|
if (directParse && directParse.kind !== "channel" && !likelyUsername) {
|
||||||
return directParse;
|
return directParse;
|
||||||
}
|
}
|
||||||
if (!shouldLookup) {
|
if (!shouldLookup) {
|
||||||
return directParse ?? parseDiscordTarget(trimmed, options);
|
return directParse ?? parseDiscordTarget(trimmed, parseOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to resolve as a username via directory lookup
|
// Try to resolve as a username via directory lookup
|
||||||
@ -104,13 +105,13 @@ export async function resolveDiscordTarget(
|
|||||||
const userId = match.id.replace(/^user:/, "");
|
const userId = match.id.replace(/^user:/, "");
|
||||||
return buildMessagingTarget("user", userId, trimmed);
|
return buildMessagingTarget("user", userId, trimmed);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch {
|
||||||
// Directory lookup failed - fall through to parse as-is
|
// Directory lookup failed - fall through to parse as-is
|
||||||
// This preserves existing behavior for channel names
|
// This preserves existing behavior for channel names
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fallback to original parsing (for channels, etc.)
|
// Fallback to original parsing (for channels, etc.)
|
||||||
return parseDiscordTarget(trimmed, options);
|
return parseDiscordTarget(trimmed, parseOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
function safeParseDiscordTarget(
|
function safeParseDiscordTarget(
|
||||||
@ -139,3 +140,16 @@ function isExplicitUserLookup(input: string, options: DiscordTargetParseOptions)
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a string looks like a Discord username (not a mention, prefix, or ID).
|
||||||
|
* Usernames typically don't start with special characters except underscore.
|
||||||
|
*/
|
||||||
|
function isLikelyUsername(input: string): boolean {
|
||||||
|
// Skip if it's already a known format
|
||||||
|
if (/^(user:|channel:|discord:|@|<@!?)|[\d]+$/.test(input)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Likely a username if it doesn't match known patterns
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|||||||
@ -13,8 +13,12 @@ describe("resolveTelegramForumThreadId", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("returns undefined for non-forum groups without messageThreadId", () => {
|
it("returns undefined for non-forum groups without messageThreadId", () => {
|
||||||
expect(resolveTelegramForumThreadId({ isForum: false, messageThreadId: undefined })).toBeUndefined();
|
expect(
|
||||||
expect(resolveTelegramForumThreadId({ isForum: undefined, messageThreadId: 99 })).toBeUndefined();
|
resolveTelegramForumThreadId({ isForum: false, messageThreadId: undefined }),
|
||||||
|
).toBeUndefined();
|
||||||
|
expect(
|
||||||
|
resolveTelegramForumThreadId({ isForum: undefined, messageThreadId: 99 }),
|
||||||
|
).toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("returns General topic (1) for forum groups without messageThreadId", () => {
|
it("returns General topic (1) for forum groups without messageThreadId", () => {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user