diff --git a/extensions/bluebubbles/src/accounts.ts b/extensions/bluebubbles/src/accounts.ts index 36a51ff50c..284dd2add6 100644 --- a/extensions/bluebubbles/src/accounts.ts +++ b/extensions/bluebubbles/src/accounts.ts @@ -1,5 +1,6 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk"; -import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id"; +import { createAccountListHelpers } from "openclaw/plugin-sdk"; +import { normalizeAccountId } from "openclaw/plugin-sdk/account-id"; import { normalizeBlueBubblesServerUrl, type BlueBubblesAccountConfig } from "./types.js"; export type ResolvedBlueBubblesAccount = { @@ -11,29 +12,9 @@ export type ResolvedBlueBubblesAccount = { baseUrl?: string; }; -function listConfiguredAccountIds(cfg: OpenClawConfig): string[] { - const accounts = cfg.channels?.bluebubbles?.accounts; - if (!accounts || typeof accounts !== "object") { - return []; - } - return Object.keys(accounts).filter(Boolean); -} - -export function listBlueBubblesAccountIds(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 resolveDefaultBlueBubblesAccountId(cfg: OpenClawConfig): string { - const ids = listBlueBubblesAccountIds(cfg); - if (ids.includes(DEFAULT_ACCOUNT_ID)) { - return DEFAULT_ACCOUNT_ID; - } - return ids[0] ?? DEFAULT_ACCOUNT_ID; -} +const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("bluebubbles"); +export const listBlueBubblesAccountIds = listAccountIds; +export const resolveDefaultBlueBubblesAccountId = resolveDefaultAccountId; function resolveAccountConfig( cfg: OpenClawConfig, diff --git a/extensions/feishu/src/accounts.ts b/extensions/feishu/src/accounts.ts index 4123bef4f2..ef61b7959b 100644 --- a/extensions/feishu/src/accounts.ts +++ b/extensions/feishu/src/accounts.ts @@ -1,5 +1,6 @@ import type { ClawdbotConfig } from "openclaw/plugin-sdk"; -import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id"; +import { createAccountListHelpers } from "openclaw/plugin-sdk"; +import { normalizeAccountId } from "openclaw/plugin-sdk/account-id"; import type { FeishuConfig, FeishuAccountConfig, @@ -7,40 +8,9 @@ import type { ResolvedFeishuAccount, } from "./types.js"; -/** - * List all configured account IDs from the accounts field. - */ -function listConfiguredAccountIds(cfg: ClawdbotConfig): string[] { - const accounts = (cfg.channels?.feishu as FeishuConfig)?.accounts; - if (!accounts || typeof accounts !== "object") { - return []; - } - return Object.keys(accounts).filter(Boolean); -} - -/** - * List all Feishu account IDs. - * If no accounts are configured, returns [DEFAULT_ACCOUNT_ID] for backward compatibility. - */ -export function listFeishuAccountIds(cfg: ClawdbotConfig): string[] { - const ids = listConfiguredAccountIds(cfg); - if (ids.length === 0) { - // Backward compatibility: no accounts configured, use default - return [DEFAULT_ACCOUNT_ID]; - } - return [...ids].toSorted((a, b) => a.localeCompare(b)); -} - -/** - * Resolve the default account ID. - */ -export function resolveDefaultFeishuAccountId(cfg: ClawdbotConfig): string { - const ids = listFeishuAccountIds(cfg); - if (ids.includes(DEFAULT_ACCOUNT_ID)) { - return DEFAULT_ACCOUNT_ID; - } - return ids[0] ?? DEFAULT_ACCOUNT_ID; -} +const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("feishu"); +export const listFeishuAccountIds = listAccountIds; +export const resolveDefaultFeishuAccountId = resolveDefaultAccountId; /** * Get the raw account-specific config. diff --git a/extensions/googlechat/src/accounts.ts b/extensions/googlechat/src/accounts.ts index 2c7126a58b..ee9937aa63 100644 --- a/extensions/googlechat/src/accounts.ts +++ b/extensions/googlechat/src/accounts.ts @@ -1,4 +1,5 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk"; +import { createAccountListHelpers } from "openclaw/plugin-sdk"; import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id"; import type { GoogleChatAccountConfig } from "./types.config.js"; @@ -17,21 +18,8 @@ export type ResolvedGoogleChatAccount = { const ENV_SERVICE_ACCOUNT = "GOOGLE_CHAT_SERVICE_ACCOUNT"; const ENV_SERVICE_ACCOUNT_FILE = "GOOGLE_CHAT_SERVICE_ACCOUNT_FILE"; -function listConfiguredAccountIds(cfg: OpenClawConfig): string[] { - const accounts = cfg.channels?.["googlechat"]?.accounts; - if (!accounts || typeof accounts !== "object") { - return []; - } - return Object.keys(accounts).filter(Boolean); -} - -export function listGoogleChatAccountIds(cfg: OpenClawConfig): string[] { - const ids = listConfiguredAccountIds(cfg); - if (ids.length === 0) { - return [DEFAULT_ACCOUNT_ID]; - } - return ids.toSorted((a, b) => a.localeCompare(b)); -} +const { listAccountIds } = createAccountListHelpers("googlechat"); +export const listGoogleChatAccountIds = listAccountIds; export function resolveDefaultGoogleChatAccountId(cfg: OpenClawConfig): string { const channel = cfg.channels?.["googlechat"]; diff --git a/extensions/mattermost/src/mattermost/accounts.ts b/extensions/mattermost/src/mattermost/accounts.ts index 0da9465613..358df0bb30 100644 --- a/extensions/mattermost/src/mattermost/accounts.ts +++ b/extensions/mattermost/src/mattermost/accounts.ts @@ -1,4 +1,5 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk"; +import { createAccountListHelpers } from "openclaw/plugin-sdk"; import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id"; import type { MattermostAccountConfig, MattermostChatMode } from "../types.js"; import { normalizeMattermostBaseUrl } from "./client.js"; @@ -23,29 +24,9 @@ export type ResolvedMattermostAccount = { blockStreamingCoalesce?: MattermostAccountConfig["blockStreamingCoalesce"]; }; -function listConfiguredAccountIds(cfg: OpenClawConfig): string[] { - const accounts = cfg.channels?.mattermost?.accounts; - if (!accounts || typeof accounts !== "object") { - return []; - } - return Object.keys(accounts).filter(Boolean); -} - -export function listMattermostAccountIds(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 resolveDefaultMattermostAccountId(cfg: OpenClawConfig): string { - const ids = listMattermostAccountIds(cfg); - if (ids.includes(DEFAULT_ACCOUNT_ID)) { - return DEFAULT_ACCOUNT_ID; - } - return ids[0] ?? DEFAULT_ACCOUNT_ID; -} +const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("mattermost"); +export const listMattermostAccountIds = listAccountIds; +export const resolveDefaultMattermostAccountId = resolveDefaultAccountId; function resolveAccountConfig( cfg: OpenClawConfig, diff --git a/extensions/zalo/src/accounts.ts b/extensions/zalo/src/accounts.ts index 5fb4d13bac..c181616b01 100644 --- a/extensions/zalo/src/accounts.ts +++ b/extensions/zalo/src/accounts.ts @@ -1,25 +1,13 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk"; +import { createAccountListHelpers } from "openclaw/plugin-sdk"; import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id"; import type { ResolvedZaloAccount, ZaloAccountConfig, ZaloConfig } from "./types.js"; import { resolveZaloToken } from "./token.js"; export type { ResolvedZaloAccount }; -function listConfiguredAccountIds(cfg: OpenClawConfig): string[] { - const accounts = (cfg.channels?.zalo as ZaloConfig | undefined)?.accounts; - if (!accounts || typeof accounts !== "object") { - return []; - } - return Object.keys(accounts).filter(Boolean); -} - -export function listZaloAccountIds(cfg: OpenClawConfig): string[] { - const ids = listConfiguredAccountIds(cfg); - if (ids.length === 0) { - return [DEFAULT_ACCOUNT_ID]; - } - return ids.toSorted((a, b) => a.localeCompare(b)); -} +const { listAccountIds } = createAccountListHelpers("zalo"); +export const listZaloAccountIds = listAccountIds; export function resolveDefaultZaloAccountId(cfg: OpenClawConfig): string { const zaloConfig = cfg.channels?.zalo as ZaloConfig | undefined;