/** * wrapCommand — 高阶函数,供其他扩展接入用户命令统计 * * 用法: * import { wrapCommand } from "@pi-atelier/usage-stats/wrap-command"; * wrapCommand(pi, "journal", { handler: async (ctx) => { ... } }); * * 替代 pi.registerCommand(),自动记录用户调用次数。 */ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; import { UsageTracker } from "./tracker"; import { homedir } from "node:os"; import { join } from "node:path"; // 共享全局 tracker 实例(由 index.ts 初始化) let _tracker: UsageTracker | null = null; export function setTracker(tracker: UsageTracker): void { _tracker = tracker; } export interface CommandDefinition { description: string; handler: (ctx: any, args: string) => Promise; /** 可选的其他属性透传 */ [key: string]: unknown; } /** * 包装 registerCommand,在执行 handler 前自动记录用户调用。 */ export function wrapCommand( pi: ExtensionAPI, name: string, def: CommandDefinition, ): void { const tracker = _tracker ?? new UsageTracker( join(homedir(), ".pi/agent/data/usage-stats.json"), ); pi.registerCommand(name, { ...def, handler: async (ctx: any, args: string) => { tracker.recordUserCall(name); return def.handler(ctx, args); }, }); }