diff --git a/src/discord/accounts.ts b/src/discord/accounts.ts index 6692820a2d..ac29741c67 100644 --- a/src/discord/accounts.ts +++ b/src/discord/accounts.ts @@ -1,6 +1,7 @@ import type { OpenClawConfig } from "../config/config.js"; import type { DiscordAccountConfig } from "../config/types.js"; -import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; +import { createAccountListHelpers } from "../channels/plugins/account-helpers.js"; +import { normalizeAccountId } from "../routing/session-key.js"; import { resolveDiscordToken } from "./token.js"; export type ResolvedDiscordAccount = { @@ -12,29 +13,9 @@ export type ResolvedDiscordAccount = { config: DiscordAccountConfig; }; -function listConfiguredAccountIds(cfg: OpenClawConfig): string[] { - const accounts = cfg.channels?.discord?.accounts; - if (!accounts || typeof accounts !== "object") { - return []; - } - return Object.keys(accounts).filter(Boolean); -} - -export function listDiscordAccountIds(cfg: OpenClawConfig): string[] { - const ids = listConfiguredAccountIds(cfg); - if (ids.length === 0) { - return [DEFAULT_ACCOUNT_ID]; - } - return ids.toSorted((a, b) => a.localeCompare(b)); -} - -export function resolveDefaultDiscordAccountId(cfg: OpenClawConfig): string { - const ids = listDiscordAccountIds(cfg); - if (ids.includes(DEFAULT_ACCOUNT_ID)) { - return DEFAULT_ACCOUNT_ID; - } - return ids[0] ?? DEFAULT_ACCOUNT_ID; -} +const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("discord"); +export const listDiscordAccountIds = listAccountIds; +export const resolveDefaultDiscordAccountId = resolveDefaultAccountId; function resolveAccountConfig( cfg: OpenClawConfig, diff --git a/src/imessage/accounts.ts b/src/imessage/accounts.ts index ed8ad886e8..cfaee974a8 100644 --- a/src/imessage/accounts.ts +++ b/src/imessage/accounts.ts @@ -1,6 +1,7 @@ import type { OpenClawConfig } from "../config/config.js"; import type { IMessageAccountConfig } from "../config/types.js"; -import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; +import { createAccountListHelpers } from "../channels/plugins/account-helpers.js"; +import { normalizeAccountId } from "../routing/session-key.js"; export type ResolvedIMessageAccount = { accountId: string; @@ -10,29 +11,9 @@ export type ResolvedIMessageAccount = { configured: boolean; }; -function listConfiguredAccountIds(cfg: OpenClawConfig): string[] { - const accounts = cfg.channels?.imessage?.accounts; - if (!accounts || typeof accounts !== "object") { - return []; - } - return Object.keys(accounts).filter(Boolean); -} - -export function listIMessageAccountIds(cfg: OpenClawConfig): string[] { - const ids = listConfiguredAccountIds(cfg); - if (ids.length === 0) { - return [DEFAULT_ACCOUNT_ID]; - } - return ids.toSorted((a, b) => a.localeCompare(b)); -} - -export function resolveDefaultIMessageAccountId(cfg: OpenClawConfig): string { - const ids = listIMessageAccountIds(cfg); - if (ids.includes(DEFAULT_ACCOUNT_ID)) { - return DEFAULT_ACCOUNT_ID; - } - return ids[0] ?? DEFAULT_ACCOUNT_ID; -} +const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("imessage"); +export const listIMessageAccountIds = listAccountIds; +export const resolveDefaultIMessageAccountId = resolveDefaultAccountId; function resolveAccountConfig( cfg: OpenClawConfig, diff --git a/src/signal/accounts.ts b/src/signal/accounts.ts index 3d96a3d833..3899d8160d 100644 --- a/src/signal/accounts.ts +++ b/src/signal/accounts.ts @@ -1,6 +1,7 @@ import type { OpenClawConfig } from "../config/config.js"; import type { SignalAccountConfig } from "../config/types.js"; -import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; +import { createAccountListHelpers } from "../channels/plugins/account-helpers.js"; +import { normalizeAccountId } from "../routing/session-key.js"; export type ResolvedSignalAccount = { accountId: string; @@ -11,29 +12,9 @@ export type ResolvedSignalAccount = { config: SignalAccountConfig; }; -function listConfiguredAccountIds(cfg: OpenClawConfig): string[] { - const accounts = cfg.channels?.signal?.accounts; - if (!accounts || typeof accounts !== "object") { - return []; - } - return Object.keys(accounts).filter(Boolean); -} - -export function listSignalAccountIds(cfg: OpenClawConfig): string[] { - const ids = listConfiguredAccountIds(cfg); - if (ids.length === 0) { - return [DEFAULT_ACCOUNT_ID]; - } - return ids.toSorted((a, b) => a.localeCompare(b)); -} - -export function resolveDefaultSignalAccountId(cfg: OpenClawConfig): string { - const ids = listSignalAccountIds(cfg); - if (ids.includes(DEFAULT_ACCOUNT_ID)) { - return DEFAULT_ACCOUNT_ID; - } - return ids[0] ?? DEFAULT_ACCOUNT_ID; -} +const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("signal"); +export const listSignalAccountIds = listAccountIds; +export const resolveDefaultSignalAccountId = resolveDefaultAccountId; function resolveAccountConfig( cfg: OpenClawConfig, diff --git a/src/slack/accounts.ts b/src/slack/accounts.ts index f492b25269..fea00630b7 100644 --- a/src/slack/accounts.ts +++ b/src/slack/accounts.ts @@ -1,6 +1,7 @@ import type { OpenClawConfig } from "../config/config.js"; import type { SlackAccountConfig } from "../config/types.js"; import { normalizeChatType } from "../channels/chat-type.js"; +import { createAccountListHelpers } from "../channels/plugins/account-helpers.js"; import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; import { resolveSlackAppToken, resolveSlackBotToken } from "./token.js"; @@ -28,29 +29,9 @@ export type ResolvedSlackAccount = { channels?: SlackAccountConfig["channels"]; }; -function listConfiguredAccountIds(cfg: OpenClawConfig): string[] { - const accounts = cfg.channels?.slack?.accounts; - if (!accounts || typeof accounts !== "object") { - return []; - } - return Object.keys(accounts).filter(Boolean); -} - -export function listSlackAccountIds(cfg: OpenClawConfig): string[] { - const ids = listConfiguredAccountIds(cfg); - if (ids.length === 0) { - return [DEFAULT_ACCOUNT_ID]; - } - return ids.toSorted((a, b) => a.localeCompare(b)); -} - -export function resolveDefaultSlackAccountId(cfg: OpenClawConfig): string { - const ids = listSlackAccountIds(cfg); - if (ids.includes(DEFAULT_ACCOUNT_ID)) { - return DEFAULT_ACCOUNT_ID; - } - return ids[0] ?? DEFAULT_ACCOUNT_ID; -} +const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("slack"); +export const listSlackAccountIds = listAccountIds; +export const resolveDefaultSlackAccountId = resolveDefaultAccountId; function resolveAccountConfig( cfg: OpenClawConfig, diff --git a/src/web/accounts.ts b/src/web/accounts.ts index fd0dab05d4..fdd9380833 100644 --- a/src/web/accounts.ts +++ b/src/web/accounts.ts @@ -2,6 +2,7 @@ import fs from "node:fs"; import path from "node:path"; import type { OpenClawConfig } from "../config/config.js"; import type { DmPolicy, GroupPolicy, WhatsAppAccountConfig } from "../config/types.js"; +import { createAccountListHelpers } from "../channels/plugins/account-helpers.js"; import { resolveOAuthDir } from "../config/paths.js"; import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; import { resolveUserPath } from "../utils.js"; @@ -29,13 +30,10 @@ export type ResolvedWhatsAppAccount = { debounceMs?: number; }; -function listConfiguredAccountIds(cfg: OpenClawConfig): string[] { - const accounts = cfg.channels?.whatsapp?.accounts; - if (!accounts || typeof accounts !== "object") { - return []; - } - return Object.keys(accounts).filter(Boolean); -} +const { listConfiguredAccountIds, listAccountIds, resolveDefaultAccountId } = + createAccountListHelpers("whatsapp"); +export const listWhatsAppAccountIds = listAccountIds; +export const resolveDefaultWhatsAppAccountId = resolveDefaultAccountId; export function listWhatsAppAuthDirs(cfg: OpenClawConfig): string[] { const oauthDir = resolveOAuthDir(); @@ -66,22 +64,6 @@ export function hasAnyWhatsAppAuth(cfg: OpenClawConfig): boolean { return listWhatsAppAuthDirs(cfg).some((authDir) => hasWebCredsSync(authDir)); } -export function listWhatsAppAccountIds(cfg: OpenClawConfig): string[] { - const ids = listConfiguredAccountIds(cfg); - if (ids.length === 0) { - return [DEFAULT_ACCOUNT_ID]; - } - return ids.toSorted((a, b) => a.localeCompare(b)); -} - -export function resolveDefaultWhatsAppAccountId(cfg: OpenClawConfig): string { - const ids = listWhatsAppAccountIds(cfg); - if (ids.includes(DEFAULT_ACCOUNT_ID)) { - return DEFAULT_ACCOUNT_ID; - } - return ids[0] ?? DEFAULT_ACCOUNT_ID; -} - function resolveAccountConfig( cfg: OpenClawConfig, accountId: string,