import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core"; import { qiaoqiaoPlugin } from "./src/channel.js"; import { listQiaoqiaoAccountIds, resolveQiaoqiaoAccount } from "./src/accounts.js"; import { setQiaoqiaoRuntime } from "./src/runtime.js"; import { registerQiaoqiaoMessageTools } from "./src/message-tools/index.js"; import { registerQiaoqiaoFeedTools } from "./src/feed-tools/index.js"; import { registerQiaoqiaoPostTools } from "./src/post-tools/index.js"; import { registerQiaoqiaoCommentTools } from "./src/comment-tools/index.js"; import { registerQiaoqiaoDashboardTools } from "./src/dashboard-tools/index.js"; import { registerQiaoqiaoMemoryTools } from "./src/memory-tools/index.js"; import { registerQiaoqiaoDmTools } from "./src/dm-tools/index.js"; import { startQiaoqiaoPluginSocketClient } from "./src/plugin-websocket-server.js"; import type { QiaoqiaoToolRegistrationResult } from "./src/tools-common/tool-registration-log.js"; export { monitorQiaoqiaoProvider } from "./src/monitor.js"; export { qiaoqiaoPlugin } from "./src/channel.js"; function logQiaoqiaoConfigSnapshot(api: { config?: any; logger?: { info?: (message: string) => void } }) { const cfg = api.config; const qiaoqiaoCfg = cfg?.channels?.qiaoqiao ?? {}; const accountIds = cfg ? listQiaoqiaoAccountIds(cfg) : []; const accounts = cfg ? accountIds.map((accountId) => { const account = resolveQiaoqiaoAccount({ cfg, accountId }); return { accountId: account.accountId, enabled: account.enabled, configured: account.configured, hasAppId: Boolean(account.appId), hasAppSecret: Boolean(account.appSecret), dmPolicy: account.config?.dmPolicy ?? qiaoqiaoCfg?.dmPolicy ?? "pairing(default)", tools: account.config?.tools ?? null, }; }) : []; const snapshot = { hasChannelConfig: Boolean(qiaoqiaoCfg && typeof qiaoqiaoCfg === "object"), enabled: qiaoqiaoCfg?.enabled ?? null, hasTopLevelAppId: Boolean(qiaoqiaoCfg?.appId), hasTopLevelAppSecret: Boolean(qiaoqiaoCfg?.appSecret), dmPolicy: qiaoqiaoCfg?.dmPolicy ?? "pairing(default)", connectionMode: qiaoqiaoCfg?.connectionMode ?? null, backendWsUrl: qiaoqiaoCfg?.backendWsUrl ?? null, tools: qiaoqiaoCfg?.tools ?? null, accountCount: accounts.length, accounts, }; const message = `[Qiaoqiao Plugin] config_snapshot ${JSON.stringify(snapshot)}`; if (api.logger?.info) { api.logger.info(message); } else { console.log(message); } } function shouldStartBackgroundSocket(): boolean { const args = process.argv.slice(2).map((arg) => String(arg || "").trim().toLowerCase()); if (args.length === 0) { return true; } // `openclaw plugins ...` and similar one-shot management commands should not // hold the process open by creating a long-lived websocket connection. if (args[0] === "plugins") { return false; } return true; } export default defineChannelPluginEntry({ id: "qiaoqiao", name: "Qiaoqiao", description: "Qiaoqiao AI Agent social platform plugin", plugin: qiaoqiaoPlugin, registerFull(api) { console.log("[Qiaoqiao Plugin] Registering full plugin runtime"); setQiaoqiaoRuntime(api.runtime); logQiaoqiaoConfigSnapshot(api); const registrationResults: QiaoqiaoToolRegistrationResult[] = [ registerQiaoqiaoMessageTools(api), registerQiaoqiaoFeedTools(api), registerQiaoqiaoPostTools(api), registerQiaoqiaoCommentTools(api), registerQiaoqiaoDashboardTools(api), registerQiaoqiaoMemoryTools(api), registerQiaoqiaoDmTools(api), ]; const registeredTools = registrationResults.filter((item) => item.registered).map((item) => item.tool); const skippedTools = registrationResults .filter((item) => !item.registered) .map((item) => `${item.tool}${item.reason ? `:${item.reason}` : ""}`); const summary = `[Qiaoqiao Tools] summary registered=${registeredTools.length} skipped=${skippedTools.length}` + ` registeredTools=${registeredTools.join(",") || "none"}` + ` skippedTools=${skippedTools.join(",") || "none"}`; if (api.logger.info) { api.logger.info(summary); } else { console.log(summary); } if (shouldStartBackgroundSocket()) { startQiaoqiaoPluginSocketClient(api.config || {}, { log: console.log, error: console.error, exit: () => {}, }); } else { console.log("[Qiaoqiao Plugin] Skipping websocket startup during plugin management command"); } }, });