import { createAccountActionGate } from "../../../src/channels/plugins/account-action-gate.js"; import { createAccountListHelpers } from "../../../src/channels/plugins/account-helpers.js"; import type { RemoteClawConfig } from "../../../src/config/config.js"; import type { DiscordAccountConfig, DiscordActionConfig } from "../../../src/config/types.js"; import { resolveAccountEntry } from "../../../src/routing/account-lookup.js"; import { normalizeAccountId } from "../../../src/routing/session-key.js"; import { resolveDiscordToken } from "./token.js"; export type ResolvedDiscordAccount = { accountId: string; enabled: boolean; name?: string; token: string; tokenSource: "env" | "config" | "none"; config: DiscordAccountConfig; }; const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("discord"); export const listDiscordAccountIds = listAccountIds; export const resolveDefaultDiscordAccountId = resolveDefaultAccountId; export function resolveDiscordAccountConfig( cfg: RemoteClawConfig, accountId: string, ): DiscordAccountConfig | undefined { return resolveAccountEntry(cfg.channels?.discord?.accounts, accountId); } export function mergeDiscordAccountConfig( cfg: RemoteClawConfig, accountId: string, ): DiscordAccountConfig { const { accounts: _ignored, ...base } = (cfg.channels?.discord ?? {}) as DiscordAccountConfig & { accounts?: unknown; }; const account = resolveDiscordAccountConfig(cfg, accountId) ?? {}; return { ...base, ...account }; } export function createDiscordActionGate(params: { cfg: RemoteClawConfig; accountId?: string | null; }): (key: keyof DiscordActionConfig, defaultValue?: boolean) => boolean { const accountId = normalizeAccountId(params.accountId); return createAccountActionGate({ baseActions: params.cfg.channels?.discord?.actions, accountActions: resolveDiscordAccountConfig(params.cfg, accountId)?.actions, }); } export function resolveDiscordAccount(params: { cfg: RemoteClawConfig; accountId?: string | null; }): ResolvedDiscordAccount { const accountId = normalizeAccountId(params.accountId); const baseEnabled = params.cfg.channels?.discord?.enabled !== false; const merged = mergeDiscordAccountConfig(params.cfg, accountId); const accountEnabled = merged.enabled !== false; const enabled = baseEnabled && accountEnabled; const tokenResolution = resolveDiscordToken(params.cfg, { accountId }); return { accountId, enabled, name: merged.name?.trim() || undefined, token: tokenResolution.token, tokenSource: tokenResolution.source, config: merged, }; } export function resolveDiscordMaxLinesPerMessage(params: { cfg: RemoteClawConfig; discordConfig?: DiscordAccountConfig | null; accountId?: string | null; }): number | undefined { if (typeof params.discordConfig?.maxLinesPerMessage === "number") { return params.discordConfig.maxLinesPerMessage; } return resolveDiscordAccount({ cfg: params.cfg, accountId: params.accountId, }).config.maxLinesPerMessage; } export function listEnabledDiscordAccounts(cfg: RemoteClawConfig): ResolvedDiscordAccount[] { return listDiscordAccountIds(cfg) .map((accountId) => resolveDiscordAccount({ cfg, accountId })) .filter((account) => account.enabled); }