import type { BotPluginApi } from "@hanzo/bot/plugin-sdk/feishu"; import type * as Lark from "@larksuiteoapi/node-sdk"; import type { FeishuToolsConfig, ResolvedFeishuAccount } from "./types.js"; import { resolveFeishuAccount } from "./accounts.js"; import { createFeishuClient } from "./client.js"; import { resolveToolsConfig } from "./tools-config.js"; type AccountAwareParams = { accountId?: string }; function normalizeOptionalAccountId(value: string | undefined): string | undefined { const trimmed = value?.trim(); return trimmed ? trimmed : undefined; } function readConfiguredDefaultAccountId(config: BotPluginApi["config"]): string | undefined { const value = (config?.channels?.feishu as { defaultAccount?: unknown } | undefined) ?.defaultAccount; if (typeof value !== "string") { return undefined; } return normalizeOptionalAccountId(value); } export function resolveFeishuToolAccount(params: { api: Pick; executeParams?: AccountAwareParams; defaultAccountId?: string; }): ResolvedFeishuAccount { if (!params.api.config) { throw new Error("Feishu config unavailable"); } return resolveFeishuAccount({ cfg: params.api.config, accountId: normalizeOptionalAccountId(params.executeParams?.accountId) ?? readConfiguredDefaultAccountId(params.api.config) ?? normalizeOptionalAccountId(params.defaultAccountId), }); } export function createFeishuToolClient(params: { api: Pick; executeParams?: AccountAwareParams; defaultAccountId?: string; }): Lark.Client { return createFeishuClient(resolveFeishuToolAccount(params)); } export function resolveAnyEnabledFeishuToolsConfig( accounts: ResolvedFeishuAccount[], ): Required { const merged: Required = { doc: false, chat: false, wiki: false, drive: false, perm: false, scopes: false, }; for (const account of accounts) { const cfg = resolveToolsConfig(account.config.tools); merged.doc = merged.doc || cfg.doc; merged.chat = merged.chat || cfg.chat; merged.wiki = merged.wiki || cfg.wiki; merged.drive = merged.drive || cfg.drive; merged.perm = merged.perm || cfg.perm; merged.scopes = merged.scopes || cfg.scopes; } return merged; }