Files
openclaw/extensions/feishu/src/tool-account.ts
2026-03-04 02:35:12 -05:00

71 lines
2.3 KiB
TypeScript

import type * as Lark from "@larksuiteoapi/node-sdk";
import type { OpenClawPluginApi } from "openclaw/plugin-sdk/feishu";
import { resolveFeishuAccount } from "./accounts.js";
import { createFeishuClient } from "./client.js";
import { resolveToolsConfig } from "./tools-config.js";
import type { FeishuToolsConfig, ResolvedFeishuAccount } from "./types.js";
type AccountAwareParams = { accountId?: string };
function normalizeOptionalAccountId(value: string | undefined): string | undefined {
const trimmed = value?.trim();
return trimmed ? trimmed : undefined;
}
function readConfiguredDefaultAccountId(config: OpenClawPluginApi["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<OpenClawPluginApi, "config">;
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<OpenClawPluginApi, "config">;
executeParams?: AccountAwareParams;
defaultAccountId?: string;
}): Lark.Client {
return createFeishuClient(resolveFeishuToolAccount(params));
}
export function resolveAnyEnabledFeishuToolsConfig(
accounts: ResolvedFeishuAccount[],
): Required<FeishuToolsConfig> {
const merged: Required<FeishuToolsConfig> = {
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;
}