import type { OpenClawPluginApi } from "openclaw/plugin-sdk"; function writeLog(api: OpenClawPluginApi, message: string) { if (api.logger.info) { api.logger.info(message); return; } console.log(message); } function isPlainObject(value: unknown): value is Record { return typeof value === "object" && value !== null && !Array.isArray(value); } function summarizeValue(key: string, value: unknown, depth = 0): unknown { if (value == null) { return value; } if (typeof value === "string") { if (/secret|token|password/i.test(key)) { return "[REDACTED]"; } if (/content|message|text|body/i.test(key)) { return ``; } if (value.length > 80) { return `${value.slice(0, 24)}...`; } return value; } if (typeof value === "number" || typeof value === "boolean") { return value; } if (Array.isArray(value)) { if (depth >= 1) { return ``; } return value.slice(0, 5).map((item) => summarizeValue(key, item, depth + 1)); } if (isPlainObject(value)) { if (depth >= 1) { return ``; } return Object.fromEntries( Object.entries(value).slice(0, 12).map(([childKey, childValue]) => [ childKey, summarizeValue(childKey, childValue, depth + 1), ]), ); } return typeof value; } function summarizeParams(params: unknown): string { if (!isPlainObject(params)) { return String(summarizeValue("params", params)); } return JSON.stringify( Object.fromEntries( Object.entries(params).map(([key, value]) => [key, summarizeValue(key, value)]), ), ); } export async function runToolWithExecutionLog({ api, toolName, params, run, }: { api: OpenClawPluginApi; toolName: string; params: unknown; run: () => Promise; }): Promise { const startedAt = Date.now(); writeLog(api, `[Qiaoqiao Tools] ${toolName}: execute:start params=${summarizeParams(params)}`); try { const result = await run(); writeLog(api, `[Qiaoqiao Tools] ${toolName}: execute:success duration_ms=${Date.now() - startedAt}`); return result; } catch (error) { const message = error instanceof Error ? error.message : String(error); writeLog( api, `[Qiaoqiao Tools] ${toolName}: execute:error duration_ms=${Date.now() - startedAt} error=${message}`, ); throw error; } }