import type { OpenClawPluginApi, ClawdbotConfig } from "openclaw/plugin-sdk"; import { listEnabledQiaoqiaoAccounts, resolveDefaultQiaoqiaoAccountId, resolveQiaoqiaoAccount, } from "../accounts.js"; import type { QiaoqiaoToolsConfig, ResolvedQiaoqiaoAccount } from "../types.js"; import { getCurrentQiaoqiaoToolContext } from "./tool-context.js"; export type QiaoqiaoToolFlag = keyof Required; const DEFAULT_TOOLS_CONFIG: Required = { message: true, feed: true, post: true, comment: true, dashboard: true, memory: true, dm: true, }; function resolveToolsConfig(cfg?: QiaoqiaoToolsConfig): Required { const result = {} as Required; for (const key in DEFAULT_TOOLS_CONFIG) { const typedKey = key as keyof Required; result[typedKey] = cfg?.[typedKey] ?? DEFAULT_TOOLS_CONFIG[typedKey]; } return result; } export function hasQiaoqiaoToolEnabledForAnyAccount( cfg: ClawdbotConfig, requiredTool?: QiaoqiaoToolFlag, ): boolean { const accounts = listEnabledQiaoqiaoAccounts(cfg); if (accounts.length === 0) { return false; } if (!requiredTool) { return true; } return accounts.some((account) => { const accountConfig = account.config as { tools?: QiaoqiaoToolsConfig }; return resolveToolsConfig(accountConfig.tools)[requiredTool]; }); } function resolveToolAccount(cfg: ClawdbotConfig): ResolvedQiaoqiaoAccount { const context = getCurrentQiaoqiaoToolContext(); if (context?.channel === "qiaoqiao" && context.accountId) { return resolveQiaoqiaoAccount({ cfg, accountId: context.accountId }); } return resolveQiaoqiaoAccount({ cfg, accountId: resolveDefaultQiaoqiaoAccountId(cfg) }); } function logToolAccountState( api: OpenClawPluginApi, toolName: string, account: ResolvedQiaoqiaoAccount, requiredTool?: QiaoqiaoToolFlag, ) { const accountConfig = account.config as { tools?: QiaoqiaoToolsConfig; dmPolicy?: string }; const toolsCfg = resolveToolsConfig(accountConfig.tools); const enabledForTool = requiredTool ? toolsCfg[requiredTool] : true; const message = `[Qiaoqiao Tools] ${toolName}: account_state ` + `accountId=${account.accountId} enabled=${account.enabled} configured=${account.configured} ` + `hasAppId=${Boolean(account.appId)} hasAppSecret=${Boolean(account.appSecret)} ` + `requiredTool=${requiredTool ?? "none"} toolEnabled=${enabledForTool} dmPolicy=${accountConfig.dmPolicy ?? "pairing(default)"}`; if (api.logger.info) { api.logger.info(message); } else { console.log(message); } } export async function withQiaoqiaoToolClient({ api, toolName, requiredTool, run, }: { api: OpenClawPluginApi; toolName: string; requiredTool?: QiaoqiaoToolFlag; run: (params: { account: ResolvedQiaoqiaoAccount }) => Promise; }): Promise { if (!api.config) { throw new Error("Qiaoqiao config is not available"); } const account = resolveToolAccount(api.config); logToolAccountState(api, toolName, account, requiredTool); if (!account.enabled) { throw new Error(`Qiaoqiao account "${account.accountId}" is disabled`); } if (!account.configured || !account.appId || !account.appSecret) { throw new Error(`Qiaoqiao account "${account.accountId}" is not configured`); } if (requiredTool) { const accountConfig = account.config as { tools?: QiaoqiaoToolsConfig }; const toolsCfg = resolveToolsConfig(accountConfig.tools); if (!toolsCfg[requiredTool]) { throw new Error(`Qiaoqiao tool "${toolName}" is disabled for account "${account.accountId}"`); } } return run({ account }); }