diff --git a/extensions/bluebubbles/src/accounts.ts b/extensions/bluebubbles/src/accounts.ts index 284dd2add6..36a51ff50c 100644 --- a/extensions/bluebubbles/src/accounts.ts +++ b/extensions/bluebubbles/src/accounts.ts @@ -1,6 +1,5 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk"; -import { createAccountListHelpers } from "openclaw/plugin-sdk"; -import { normalizeAccountId } from "openclaw/plugin-sdk/account-id"; +import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id"; import { normalizeBlueBubblesServerUrl, type BlueBubblesAccountConfig } from "./types.js"; export type ResolvedBlueBubblesAccount = { @@ -12,9 +11,29 @@ export type ResolvedBlueBubblesAccount = { baseUrl?: string; }; -const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("bluebubbles"); -export const listBlueBubblesAccountIds = listAccountIds; -export const resolveDefaultBlueBubblesAccountId = resolveDefaultAccountId; +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; +} function resolveAccountConfig( cfg: OpenClawConfig, diff --git a/extensions/feishu/src/accounts.ts b/extensions/feishu/src/accounts.ts index ef61b7959b..4123bef4f2 100644 --- a/extensions/feishu/src/accounts.ts +++ b/extensions/feishu/src/accounts.ts @@ -1,6 +1,5 @@ import type { ClawdbotConfig } from "openclaw/plugin-sdk"; -import { createAccountListHelpers } from "openclaw/plugin-sdk"; -import { normalizeAccountId } from "openclaw/plugin-sdk/account-id"; +import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id"; import type { FeishuConfig, FeishuAccountConfig, @@ -8,9 +7,40 @@ import type { ResolvedFeishuAccount, } from "./types.js"; -const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("feishu"); -export const listFeishuAccountIds = listAccountIds; -export const resolveDefaultFeishuAccountId = resolveDefaultAccountId; +/** + * 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; +} /** * Get the raw account-specific config. diff --git a/extensions/googlechat/src/accounts.ts b/extensions/googlechat/src/accounts.ts index ee9937aa63..2c7126a58b 100644 --- a/extensions/googlechat/src/accounts.ts +++ b/extensions/googlechat/src/accounts.ts @@ -1,5 +1,4 @@ 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"; @@ -18,8 +17,21 @@ export type ResolvedGoogleChatAccount = { const ENV_SERVICE_ACCOUNT = "GOOGLE_CHAT_SERVICE_ACCOUNT"; const ENV_SERVICE_ACCOUNT_FILE = "GOOGLE_CHAT_SERVICE_ACCOUNT_FILE"; -const { listAccountIds } = createAccountListHelpers("googlechat"); -export const listGoogleChatAccountIds = listAccountIds; +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)); +} 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 358df0bb30..0da9465613 100644 --- a/extensions/mattermost/src/mattermost/accounts.ts +++ b/extensions/mattermost/src/mattermost/accounts.ts @@ -1,5 +1,4 @@ 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"; @@ -24,9 +23,29 @@ export type ResolvedMattermostAccount = { blockStreamingCoalesce?: MattermostAccountConfig["blockStreamingCoalesce"]; }; -const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("mattermost"); -export const listMattermostAccountIds = listAccountIds; -export const resolveDefaultMattermostAccountId = resolveDefaultAccountId; +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; +} function resolveAccountConfig( cfg: OpenClawConfig, diff --git a/extensions/zalo/src/accounts.ts b/extensions/zalo/src/accounts.ts index 2b275103b1..7296a842e4 100644 --- a/extensions/zalo/src/accounts.ts +++ b/extensions/zalo/src/accounts.ts @@ -1,13 +1,25 @@ 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 { resolveZaloToken } from "./token.js"; import type { ResolvedZaloAccount, ZaloAccountConfig, ZaloConfig } from "./types.js"; export type { ResolvedZaloAccount }; -const { listAccountIds } = createAccountListHelpers("zalo"); -export const listZaloAccountIds = listAccountIds; +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)); +} export function resolveDefaultZaloAccountId(cfg: OpenClawConfig): string { const zaloConfig = cfg.channels?.zalo as ZaloConfig | undefined;