@gencode/cli 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin.js CHANGED
@@ -4,9 +4,15 @@
4
4
  */
5
5
  import "./pkg-path.js";
6
6
  import { createProgram } from "./program.js";
7
+ import { logger } from "./logger.js";
8
+ const STARTUP_TIME = Date.now();
9
+ logger.info(`AIMax CLI starting (pid=${process.pid})`);
7
10
  const program = createProgram();
8
11
  program.parseAsync(process.argv).catch((err) => {
9
- process.stderr.write(`Unexpected error: ${err.message}\n`);
12
+ logger.error(`Unexpected error: ${err.message}`);
10
13
  process.exit(1);
14
+ }).finally(() => {
15
+ const uptime = Date.now() - STARTUP_TIME;
16
+ logger.info(`AIMax CLI exited (total uptime: ${uptime}ms)`);
11
17
  });
12
18
  //# sourceMappingURL=bin.js.map
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAsB,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAEhC,MAAM,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAEvD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,MAAM,CAAC,KAAK,CAAC,qBAAsB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;IACd,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;IACzC,MAAM,CAAC,IAAI,CAAC,mCAAmC,MAAM,KAAK,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC"}
@@ -5,7 +5,7 @@ import type { Command } from "commander";
5
5
  import type { Channel } from "@gencode/agents";
6
6
  import { type OutputFormat } from "../output.js";
7
7
  export type RunOptions = {
8
- dataDir: string;
8
+ dataDir?: string;
9
9
  message?: string;
10
10
  fromFile?: string;
11
11
  sessionId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAkD,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjG,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAkCF,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4IzD"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAkD,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjG,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAkCF,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6JzD"}
@@ -7,6 +7,7 @@ import { resolveLlmConfig } from "../config.js";
7
7
  import { printProgressEvent, printRunResult, writeError } from "../output.js";
8
8
  import { loadPluginsConfig } from "../plugins-config.js";
9
9
  import { resolveRunMessageInput } from "../utils/message-input.js";
10
+ import { logger, PerfTimer } from "../logger.js";
10
11
  async function sendCallback(url, payload) {
11
12
  const response = await fetch(url, {
12
13
  method: "POST",
@@ -37,7 +38,7 @@ export function registerRunCommand(program) {
37
38
  program
38
39
  .command("run")
39
40
  .description("Run an agent task")
40
- .requiredOption("-d, --data-dir <path>", "Data directory path")
41
+ .option("-d, --data-dir <path>", "Data directory path (overrides AIMAX_DATA_DIR)")
41
42
  .option("--message <text>", "User message to send to the agent")
42
43
  .option("--from-file <path>", "Load structured Message JSON from a file")
43
44
  .option("-s, --session-id <id>", "Resume an existing session by ID")
@@ -53,6 +54,14 @@ export function registerRunCommand(program) {
53
54
  .option("--output <format>", "Output format: text (default) or json", "text")
54
55
  .option("--plugins-config <path>", "Plugins config file path")
55
56
  .action(async (options) => {
57
+ const timer = new PerfTimer("run command");
58
+ const channel = options.channel ?? "WEB";
59
+ const dataDir = options.dataDir ?? process.env.AIMAX_DATA_DIR;
60
+ if (!dataDir) {
61
+ writeError("Data directory must be specified via --data-dir option or AIMAX_DATA_DIR environment variable");
62
+ process.exit(1);
63
+ }
64
+ logger.info(`run command started (channel=${channel}, dataDir=${dataDir}, sessionId=${options.sessionId ?? "new"})`);
56
65
  let llm;
57
66
  try {
58
67
  llm = resolveLlmConfig({
@@ -68,7 +77,6 @@ export function registerRunCommand(program) {
68
77
  process.exit(1);
69
78
  }
70
79
  // Validate channel
71
- const channel = options.channel ?? "WEB";
72
80
  if (channel !== "H5" && channel !== "WEB" && channel !== "KLPA" && channel !== "CRON") {
73
81
  writeError(`Invalid channel: ${channel}. Must be 'H5', 'WEB', 'KLPA', or 'CRON'`);
74
82
  process.exit(1);
@@ -93,19 +101,19 @@ export function registerRunCommand(program) {
93
101
  process.once("SIGTERM", abort);
94
102
  process.once("SIGINT", abort);
95
103
  try {
96
- await emitBootstrapEvent({ type: "bootstrap", phase: "checking", dataDir: options.dataDir }, { callbackUrl: options.callbackUrl, sessionId: options.sessionId, channel, messageId: options.messageId, format });
97
- const bootstrap = await ensureBootstrapMountLayout(options.dataDir);
104
+ await emitBootstrapEvent({ type: "bootstrap", phase: "checking", dataDir: dataDir }, { callbackUrl: options.callbackUrl, sessionId: options.sessionId, channel, messageId: options.messageId, format });
105
+ const bootstrap = await ensureBootstrapMountLayout(dataDir);
98
106
  if (bootstrap.performedBootstrap) {
99
- await emitBootstrapEvent({ type: "bootstrap", phase: "initializing", dataDir: options.dataDir }, { callbackUrl: options.callbackUrl, sessionId: options.sessionId, channel, messageId: options.messageId, format });
100
- await emitBootstrapEvent({ type: "bootstrap", phase: "initialized", dataDir: options.dataDir }, { callbackUrl: options.callbackUrl, sessionId: options.sessionId, channel, messageId: options.messageId, format });
107
+ await emitBootstrapEvent({ type: "bootstrap", phase: "initializing", dataDir: dataDir }, { callbackUrl: options.callbackUrl, sessionId: options.sessionId, channel, messageId: options.messageId, format });
108
+ await emitBootstrapEvent({ type: "bootstrap", phase: "initialized", dataDir: dataDir }, { callbackUrl: options.callbackUrl, sessionId: options.sessionId, channel, messageId: options.messageId, format });
101
109
  }
102
110
  else {
103
- await emitBootstrapEvent({ type: "bootstrap", phase: "ready", dataDir: options.dataDir }, { callbackUrl: options.callbackUrl, sessionId: options.sessionId, channel, messageId: options.messageId, format });
111
+ await emitBootstrapEvent({ type: "bootstrap", phase: "ready", dataDir: dataDir }, { callbackUrl: options.callbackUrl, sessionId: options.sessionId, channel, messageId: options.messageId, format });
104
112
  }
105
- const pluginsConfig = await loadPluginsConfig(options.dataDir, options.pluginsConfig);
113
+ const pluginsConfig = await loadPluginsConfig(dataDir, options.pluginsConfig);
106
114
  const runParams = input.kind === "messages"
107
115
  ? {
108
- dataDir: options.dataDir,
116
+ dataDir: dataDir,
109
117
  messages: input.messages,
110
118
  sessionId: options.sessionId,
111
119
  messageId: options.messageId,
@@ -116,8 +124,8 @@ export function registerRunCommand(program) {
116
124
  abortSignal: abortController.signal,
117
125
  plugins: pluginsConfig ? {
118
126
  config: pluginsConfig,
119
- dataDir: options.dataDir,
120
- workspaceDir: path.join(options.dataDir, "workspace"),
127
+ dataDir: dataDir,
128
+ workspaceDir: path.join(dataDir, "workspace"),
121
129
  bundledDir: process.env.AIMAX_PLUGINS_BUNDLED_DIR,
122
130
  llmAllowlist: pluginsConfig.llmAllowlist,
123
131
  } : undefined,
@@ -126,7 +134,7 @@ export function registerRunCommand(program) {
126
134
  : undefined,
127
135
  }
128
136
  : {
129
- dataDir: options.dataDir,
137
+ dataDir: dataDir,
130
138
  message: input.message,
131
139
  sessionId: options.sessionId,
132
140
  messageId: options.messageId,
@@ -137,8 +145,8 @@ export function registerRunCommand(program) {
137
145
  abortSignal: abortController.signal,
138
146
  plugins: pluginsConfig ? {
139
147
  config: pluginsConfig,
140
- dataDir: options.dataDir,
141
- workspaceDir: path.join(options.dataDir, "workspace"),
148
+ dataDir: dataDir,
149
+ workspaceDir: path.join(dataDir, "workspace"),
142
150
  bundledDir: process.env.AIMAX_PLUGINS_BUNDLED_DIR,
143
151
  llmAllowlist: pluginsConfig.llmAllowlist,
144
152
  } : undefined,
@@ -148,10 +156,19 @@ export function registerRunCommand(program) {
148
156
  };
149
157
  const result = await runAgent(runParams);
150
158
  printRunResult(result, format);
159
+ if (result.error) {
160
+ logger.error(`run command failed: ${result.error}`);
161
+ }
162
+ else {
163
+ logger.info(`run command succeeded`);
164
+ }
165
+ timer.end();
151
166
  process.exit(result.error ? 1 : 0);
152
167
  }
153
168
  catch (err) {
169
+ logger.error(`run command error: ${err.message}`);
154
170
  writeError(`Fatal: ${err.message}`);
171
+ timer.end();
155
172
  process.exit(1);
156
173
  }
157
174
  finally {
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
Binary file
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Simple logger for AIMax CLI with log4js-style formatting.
3
+ * Format: [YYYY-MM-DD HH:mm:ss.SSS] [LEVEL] message
4
+ */
5
+ export declare enum LogLevel {
6
+ INFO = "INFO",
7
+ ERROR = "ERROR",
8
+ WARN = "WARN"
9
+ }
10
+ export declare const logger: {
11
+ info: (message: string) => void;
12
+ warn: (message: string) => void;
13
+ error: (message: string) => void;
14
+ };
15
+ /**
16
+ * A simple performance timer for measuring execution time.
17
+ */
18
+ export declare class PerfTimer {
19
+ private startTime;
20
+ private name;
21
+ constructor(name: string);
22
+ /**
23
+ * End the timer and log the elapsed time in milliseconds.
24
+ */
25
+ end(): number;
26
+ }
27
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oBAAY,QAAQ;IAClB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,IAAI,SAAS;CACd;AAmBD,eAAO,MAAM,MAAM;oBACD,MAAM;oBACN,MAAM;qBACL,MAAM;CACxB,CAAC;AAEF;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,EAAE,MAAM;IAKxB;;OAEG;IACH,GAAG,IAAI,MAAM;CAKd"}
package/dist/logger.js ADDED
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Simple logger for AIMax CLI with log4js-style formatting.
3
+ * Format: [YYYY-MM-DD HH:mm:ss.SSS] [LEVEL] message
4
+ */
5
+ export var LogLevel;
6
+ (function (LogLevel) {
7
+ LogLevel["INFO"] = "INFO";
8
+ LogLevel["ERROR"] = "ERROR";
9
+ LogLevel["WARN"] = "WARN";
10
+ })(LogLevel || (LogLevel = {}));
11
+ function formatTimestamp() {
12
+ const now = new Date();
13
+ const year = now.getFullYear();
14
+ const month = String(now.getMonth() + 1).padStart(2, "0");
15
+ const day = String(now.getDate()).padStart(2, "0");
16
+ const hours = String(now.getHours()).padStart(2, "0");
17
+ const minutes = String(now.getMinutes()).padStart(2, "0");
18
+ const seconds = String(now.getSeconds()).padStart(2, "0");
19
+ const ms = String(now.getMilliseconds()).padStart(3, "0");
20
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${ms}`;
21
+ }
22
+ function log(level, message) {
23
+ const timestamp = formatTimestamp();
24
+ process.stderr.write(`[${timestamp}] [${level}] ${message}\n`);
25
+ }
26
+ export const logger = {
27
+ info: (message) => log(LogLevel.INFO, message),
28
+ warn: (message) => log(LogLevel.WARN, message),
29
+ error: (message) => log(LogLevel.ERROR, message),
30
+ };
31
+ /**
32
+ * A simple performance timer for measuring execution time.
33
+ */
34
+ export class PerfTimer {
35
+ startTime;
36
+ name;
37
+ constructor(name) {
38
+ this.name = name;
39
+ this.startTime = Date.now();
40
+ }
41
+ /**
42
+ * End the timer and log the elapsed time in milliseconds.
43
+ */
44
+ end() {
45
+ const elapsed = Date.now() - this.startTime;
46
+ logger.info(`${this.name} completed in ${elapsed}ms`);
47
+ return elapsed;
48
+ }
49
+ }
50
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAN,IAAY,QAIX;AAJD,WAAY,QAAQ;IAClB,yBAAa,CAAA;IACb,2BAAe,CAAA;IACf,yBAAa,CAAA;AACf,CAAC,EAJW,QAAQ,KAAR,QAAQ,QAInB;AAED,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,GAAG,CAAC,KAAe,EAAE,OAAe;IAC3C,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,SAAS,MAAM,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACtD,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACtD,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzD,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,SAAS;IACZ,SAAS,CAAS;IAClB,IAAI,CAAS;IAErB,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,GAAG;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,iBAAiB,OAAO,IAAI,CAAC,CAAC;QACtD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3C,2DAA2D;AAC3D,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAExC;AAED,8BAA8B;AAC9B,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED,8BAA8B;AAC9B,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CA8BlE;AAED,4CAA4C;AAC5C,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAYjF;AAED,wCAAwC;AACxC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAavF;AAED,wCAAwC;AACxC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAY7F"}
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3C,2DAA2D;AAC3D,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAExC;AAED,8BAA8B;AAC9B,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED,8BAA8B;AAC9B,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAiClE;AAED,4CAA4C;AAC5C,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAYjF;AAED,wCAAwC;AACxC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAavF;AAED,wCAAwC;AACxC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAY7F"}
package/dist/output.js CHANGED
@@ -31,6 +31,9 @@ export function printProgressEvent(event) {
31
31
  case "compaction":
32
32
  writeLine(`\n[compaction] ${event.reason}`);
33
33
  break;
34
+ case "skill_used":
35
+ writeLine(`\n[skill] ${event.skillName} agent=${event.agent} task=${event.taskId}`);
36
+ break;
34
37
  case "error":
35
38
  writeError(`\n[error] ${event.message}`);
36
39
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,765 @@
1
+ import { createRequire } from "node:module";
2
+ import { Command } from "commander";
3
+ import { MemoryIndexManager, bootstrapMountLayout, initializePluginSystem, listSessionSummaries, normalizePluginsConfig, runAgent } from "@pingclaw/agents";
4
+ import path from "node:path";
5
+ import gensign from "gensign-node";
6
+ import fs from "node:fs/promises";
7
+ import { addAgent, addBinding, getAgentConfig, listAgents, listBindings, loadAgentsConfig, normalizeAgentId, removeAgent, removeBindings, resolveAgentDir, resolveDefaultAgentId, updateAgentIdentity } from "@pingclaw/agents/config";
8
+
9
+ //#region src/output.ts
10
+ /** Writes a string to stdout without a trailing newline */
11
+ function write(text) {
12
+ process.stdout.write(text);
13
+ }
14
+ /** Writes a line to stdout */
15
+ function writeLine(text) {
16
+ process.stdout.write(text + "\n");
17
+ }
18
+ /** Writes a line to stderr */
19
+ function writeError(text) {
20
+ process.stderr.write(text + "\n");
21
+ }
22
+ /** Formats and prints a progress event during streaming execution */
23
+ function printProgressEvent(event) {
24
+ switch (event.type) {
25
+ case "text":
26
+ write(event.text);
27
+ break;
28
+ case "tool_start":
29
+ writeLine(`\n[tool:${event.name}] ${JSON.stringify(event.input)}`);
30
+ break;
31
+ case "tool_end":
32
+ writeLine(`[tool:${event.name}] ${event.isError ? "ERROR" : "OK"} ${event.output.slice(0, 200)}`);
33
+ break;
34
+ case "compaction":
35
+ writeLine(`\n[compaction] ${event.reason}`);
36
+ break;
37
+ case "error":
38
+ writeError(`\n[error] ${event.message}`);
39
+ break;
40
+ case "subagent_spawn":
41
+ writeLine(`\n[subagent:spawn]${event.label ? ` "${event.label}"` : ""} ${event.task}`);
42
+ break;
43
+ case "subagent_complete":
44
+ writeLine(`[subagent:${event.status}] ${event.task}`);
45
+ break;
46
+ }
47
+ }
48
+ /** Prints the final run result to stdout */
49
+ function printRunResult(result, format) {
50
+ if (format === "json") {
51
+ writeLine(JSON.stringify(result, null, 2));
52
+ return;
53
+ }
54
+ writeLine("\n");
55
+ writeLine(`session: ${result.sessionId}`);
56
+ writeLine(`duration: ${result.durationMs}ms`);
57
+ writeLine(`tokens: input=${result.usage.input} output=${result.usage.output} total=${result.usage.total}`);
58
+ if (result.error) writeError(`error: ${result.error}`);
59
+ }
60
+ /** Prints the session list to stdout */
61
+ function printSessionList(sessions, format) {
62
+ if (format === "json") {
63
+ writeLine(JSON.stringify(sessions, null, 2));
64
+ return;
65
+ }
66
+ if (sessions.length === 0) {
67
+ writeLine("No sessions found.");
68
+ return;
69
+ }
70
+ for (const session of sessions) {
71
+ const date = session.createdAt ? new Date(session.createdAt).toLocaleString() : "unknown";
72
+ writeLine(`${session.id} ${date} [${session.channel}] ${session.title}`);
73
+ }
74
+ }
75
+ /** Prints bootstrap result to stdout */
76
+ function printBootstrapResult(result, format) {
77
+ if (format === "json") {
78
+ writeLine(JSON.stringify(result, null, 2));
79
+ return;
80
+ }
81
+ writeLine("Bootstrap completed.");
82
+ writeLine(`dataDir: ${result.dataDir}`);
83
+ writeLine(`created dirs: ${result.createdDirs.length}`);
84
+ writeLine(`created files: ${result.createdFiles.length}`);
85
+ writeLine(`skipped dirs: ${result.skippedDirs.length}`);
86
+ writeLine(`skipped files: ${result.skippedFiles.length}`);
87
+ }
88
+
89
+ //#endregion
90
+ //#region src/commands/bootstrap.ts
91
+ /** Registers the `bootstrap` subcommand on the given Commander program */
92
+ function registerBootstrapCommand(program) {
93
+ program.command("bootstrap").description("Initialize the data directory with required directories and templates").requiredOption("-d, --data-dir <path>", "Data directory path").option("--output <format>", "Output format: text (default) or json", "text").action(async (options) => {
94
+ const format = options.output === "json" ? "json" : "text";
95
+ try {
96
+ printBootstrapResult(await bootstrapMountLayout(options.dataDir), format);
97
+ } catch (err) {
98
+ writeError(`Error bootstrapping data directory: ${err.message}`);
99
+ process.exit(1);
100
+ }
101
+ });
102
+ }
103
+
104
+ //#endregion
105
+ //#region src/auth.ts
106
+ if (!globalThis.getPkgPath) globalThis.getPkgPath = () => "@wizard/pingclaw";
107
+ function encryptWithSM4(ticket) {
108
+ return gensign.sm4_encrypt_ecb(ticket);
109
+ }
110
+ function generateApiKey(ticket) {
111
+ return encryptWithSM4(ticket);
112
+ }
113
+
114
+ //#endregion
115
+ //#region src/config.ts
116
+ /**
117
+ * LLM configuration resolution for @pingclaw/cli.
118
+ *
119
+ * Priority: auth token > CLI flags > environment variables > error
120
+ */
121
+ /**
122
+ * Resolves LLM configuration from CLI options and environment variables.
123
+ * CLI options take precedence over environment variables.
124
+ * Throws if required fields cannot be resolved.
125
+ */
126
+ function resolveLlmConfig(options = {}) {
127
+ const baseUrl = options.baseUrl ?? process.env["PINGCLAW_BASE_URL"];
128
+ const envAuthToken = process.env["PINGCLAW_AUTH_TOKEN"];
129
+ const apiKey = options.authToken ? generateApiKey(options.authToken) : envAuthToken ? generateApiKey(envAuthToken) : options.apiKey ?? process.env["PINGCLAW_API_KEY"];
130
+ const model = options.model ?? process.env["PINGCLAW_MODEL"];
131
+ const missing = [];
132
+ if (!baseUrl) missing.push("--base-url / PINGCLAW_BASE_URL");
133
+ if (!apiKey) missing.push("--api-key / PINGCLAW_API_KEY");
134
+ if (!model) missing.push("--model / PINGCLAW_MODEL");
135
+ if (missing.length > 0) throw new Error(`Missing required LLM configuration: ${missing.join(", ")}`);
136
+ return {
137
+ baseUrl,
138
+ apiKey,
139
+ model,
140
+ contextWindow: options.contextWindow ?? (process.env["PINGCLAW_CONTEXT_WINDOW"] ? Number(process.env["PINGCLAW_CONTEXT_WINDOW"]) : void 0)
141
+ };
142
+ }
143
+
144
+ //#endregion
145
+ //#region src/plugins-config.ts
146
+ const CONFIG_FILE = "plugins.json";
147
+ function resolvePluginsConfigPath(dataDir) {
148
+ return path.join(dataDir, ".pingclaw", CONFIG_FILE);
149
+ }
150
+ async function loadPluginsConfig(dataDir) {
151
+ const filePath = resolvePluginsConfigPath(dataDir);
152
+ try {
153
+ const raw = await fs.readFile(filePath, "utf-8");
154
+ return JSON.parse(raw);
155
+ } catch (err) {
156
+ if (err.code === "ENOENT") return;
157
+ throw err;
158
+ }
159
+ }
160
+ async function savePluginsConfig(dataDir, config) {
161
+ const filePath = resolvePluginsConfigPath(dataDir);
162
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
163
+ await fs.writeFile(filePath, JSON.stringify(config, null, 2), "utf-8");
164
+ }
165
+
166
+ //#endregion
167
+ //#region src/commands/run.ts
168
+ /** Registers the `run` subcommand on the given Commander program */
169
+ function registerRunCommand(program) {
170
+ program.command("run").description("Run an agent task").requiredOption("-d, --data-dir <path>", "Data directory path").requiredOption("--message <text>", "User message to send to the agent").option("-s, --session-id <id>", "Resume an existing session by ID").option("--message-id <id>", "Message ID for correlating events").option("-c, --channel <channel>", "Channel type: H5 | WEB | KLPA | CRON (default: WEB)", "WEB").option("--base-url <url>", "LLM API base URL (overrides PINGCLAW_BASE_URL)").option("--api-key <key>", "LLM API key (overrides PINGCLAW_API_KEY)").option("--auth-token <token>", "Auth token used to generate the API key (highest priority)").option("--model <name>", "LLM model name (overrides PINGCLAW_MODEL)").option("--context-window <n>", "LLM context window size").option("--callback-url <url>", "HTTP callback URL for progress events").option("--timeout <ms>", "Execution timeout in milliseconds (default: 600000)").option("--output <format>", "Output format: text (default) or json", "text").action(async (options) => {
171
+ let llm;
172
+ try {
173
+ llm = resolveLlmConfig({
174
+ baseUrl: options.baseUrl,
175
+ apiKey: options.apiKey,
176
+ authToken: options.authToken,
177
+ model: options.model,
178
+ contextWindow: options.contextWindow ? Number(options.contextWindow) : void 0
179
+ });
180
+ } catch (err) {
181
+ writeError(err.message);
182
+ process.exit(1);
183
+ }
184
+ const channel = options.channel ?? "WEB";
185
+ if (channel !== "H5" && channel !== "WEB" && channel !== "KLPA" && channel !== "CRON") {
186
+ writeError(`Invalid channel: ${channel}. Must be 'H5', 'WEB', 'KLPA', or 'CRON'`);
187
+ process.exit(1);
188
+ }
189
+ const format = options.output === "json" ? "json" : "text";
190
+ const abortController = new AbortController();
191
+ const abort = () => abortController.abort();
192
+ process.once("SIGTERM", abort);
193
+ process.once("SIGINT", abort);
194
+ try {
195
+ const pluginsConfig = await loadPluginsConfig(options.dataDir);
196
+ const result = await runAgent({
197
+ dataDir: options.dataDir,
198
+ message: options.message,
199
+ sessionId: options.sessionId,
200
+ messageId: options.messageId,
201
+ channel,
202
+ llm,
203
+ callbackUrl: options.callbackUrl,
204
+ timeoutMs: options.timeout ? Number(options.timeout) : void 0,
205
+ abortSignal: abortController.signal,
206
+ plugins: pluginsConfig ? {
207
+ config: pluginsConfig,
208
+ dataDir: options.dataDir,
209
+ workspaceDir: path.join(options.dataDir, "workspace"),
210
+ bundledDir: process.env.PINGCLAW_PLUGINS_BUNDLED_DIR,
211
+ llmAllowlist: pluginsConfig.llmAllowlist
212
+ } : void 0,
213
+ onProgress: format === "text" ? async (event) => {
214
+ printProgressEvent(event);
215
+ } : void 0
216
+ });
217
+ printRunResult(result, format);
218
+ process.exit(result.error ? 1 : 0);
219
+ } catch (err) {
220
+ writeError(`Fatal: ${err.message}`);
221
+ process.exit(1);
222
+ } finally {
223
+ process.off("SIGTERM", abort);
224
+ process.off("SIGINT", abort);
225
+ }
226
+ });
227
+ }
228
+
229
+ //#endregion
230
+ //#region src/commands/sessions.ts
231
+ /** Registers the `sessions` subcommand on the given Commander program */
232
+ function registerSessionsCommand(program) {
233
+ program.command("sessions").description("List sessions for a data directory").requiredOption("-d, --data-dir <path>", "Data directory path").option("-c, --channel <channel>", "Filter by channel type: H5 | WEB | KLPA | CRON").option("--output <format>", "Output format: text (default) or json", "text").action(async (options) => {
234
+ const format = options.output === "json" ? "json" : "text";
235
+ if (options.channel && options.channel !== "H5" && options.channel !== "WEB" && options.channel !== "KLPA" && options.channel !== "CRON") {
236
+ writeError(`Invalid channel: ${options.channel}. Must be 'H5', 'WEB', 'KLPA', or 'CRON'`);
237
+ process.exit(1);
238
+ }
239
+ try {
240
+ printSessionList(await listSessionSummaries(options.dataDir, options.channel), format);
241
+ } catch (err) {
242
+ writeError(`Error listing sessions: ${err.message}`);
243
+ process.exit(1);
244
+ }
245
+ });
246
+ }
247
+
248
+ //#endregion
249
+ //#region src/commands/memory.ts
250
+ function formatStatus(status, deep) {
251
+ const lines = [];
252
+ lines.push(`backend: ${status.backend}`);
253
+ lines.push(`provider: ${status.provider}${status.model ? ` (${status.model})` : ""}`);
254
+ if (typeof status.files === "number") lines.push(`files: ${status.files}`);
255
+ if (typeof status.chunks === "number") lines.push(`chunks: ${status.chunks}`);
256
+ if (typeof status.dirty === "boolean") lines.push(`dirty: ${status.dirty}`);
257
+ if (status.dbPath) lines.push(`db: ${status.dbPath}`);
258
+ if (status.sources?.length) lines.push(`sources: ${status.sources.join(", ")}`);
259
+ if (deep) {
260
+ if (status.fts) {
261
+ lines.push(`fts: enabled=${status.fts.enabled} available=${status.fts.available}`);
262
+ if (status.fts.error) lines.push(`fts_error: ${status.fts.error}`);
263
+ }
264
+ if (status.vector) {
265
+ lines.push(`vector: enabled=${status.vector.enabled} available=${status.vector.available ?? "unknown"}`);
266
+ if (status.vector.dims) lines.push(`vector_dims: ${status.vector.dims}`);
267
+ if (status.vector.loadError) lines.push(`vector_error: ${status.vector.loadError}`);
268
+ }
269
+ if (status.cache) lines.push(`cache: enabled=${status.cache.enabled} entries=${status.cache.entries ?? 0}`);
270
+ }
271
+ return lines.join("\n");
272
+ }
273
+ function getManager(dataDir, includeSessions) {
274
+ return MemoryIndexManager.get(dataDir, includeSessions ? {
275
+ experimental: { sessionMemory: true },
276
+ sources: ["memory", "sessions"]
277
+ } : void 0);
278
+ }
279
+ function registerMemoryCommand(program) {
280
+ const memory = program.command("memory").description("Manage semantic memory indexing and search");
281
+ memory.command("status").description("Show memory index status").requiredOption("-d, --data-dir <path>", "Data directory path").option("--deep", "Probe embedding/vector availability").option("--index", "Run a refresh before reporting status").option("--include-sessions", "Include session transcripts in indexing").option("--verbose", "Verbose output").option("--output <format>", "Output format: text (default) or json", "text").action(async (options) => {
282
+ const format = options.output === "json" ? "json" : "text";
283
+ try {
284
+ const manager = getManager(options.dataDir, options.includeSessions);
285
+ if (options.index) await manager.sync({ reason: "cli-status" });
286
+ const status = manager.status();
287
+ if (options.deep) {
288
+ const [embed, vector] = await Promise.all([manager.probeEmbeddingAvailability(), manager.probeVectorAvailability()]);
289
+ (status.custom ??= {}).embeddingProbe = embed;
290
+ (status.custom ??= {}).vectorProbe = { ok: vector };
291
+ }
292
+ if (format === "json") writeLine(JSON.stringify(status, null, 2));
293
+ else writeLine(formatStatus(status, options.deep));
294
+ } catch (err) {
295
+ writeError(`Error getting memory status: ${err.message}`);
296
+ process.exit(1);
297
+ }
298
+ });
299
+ memory.command("index").description("Reindex memory files").requiredOption("-d, --data-dir <path>", "Data directory path").option("--include-sessions", "Include session transcripts in indexing").option("--verbose", "Verbose output").action(async (options) => {
300
+ try {
301
+ await getManager(options.dataDir, options.includeSessions).sync({ reason: "cli-index" });
302
+ writeLine("Memory index refreshed.");
303
+ } catch (err) {
304
+ writeError(`Error indexing memory: ${err.message}`);
305
+ process.exit(1);
306
+ }
307
+ });
308
+ memory.command("search [query]").description("Search semantic memory").requiredOption("-d, --data-dir <path>", "Data directory path").option("--query <text>", "Search query").option("--include-sessions", "Include session transcripts in search").option("--output <format>", "Output format: text (default) or json", "text").action(async (query, options) => {
309
+ const format = options.output === "json" ? "json" : "text";
310
+ const q = options.query?.trim() || query?.trim();
311
+ if (!q) {
312
+ writeError("Query is required: provide [query] or --query <text>");
313
+ process.exit(1);
314
+ }
315
+ try {
316
+ const results = await getManager(options.dataDir, options.includeSessions).search(q);
317
+ if (format === "json") {
318
+ writeLine(JSON.stringify(results, null, 2));
319
+ return;
320
+ }
321
+ if (results.length === 0) {
322
+ writeLine(`No results found for: ${q}`);
323
+ return;
324
+ }
325
+ writeLine(results.map((r) => {
326
+ const base = `${r.path}:${r.startLine}-${r.endLine} (${r.score.toFixed(4)}) ${r.snippet}`;
327
+ return r.citation ? `${base}\n${r.citation}` : base;
328
+ }).join("\n"));
329
+ } catch (err) {
330
+ writeError(`Error searching memory: ${err.message}`);
331
+ process.exit(1);
332
+ }
333
+ });
334
+ }
335
+
336
+ //#endregion
337
+ //#region src/commands/agents.ts
338
+ /**
339
+ * Formats an agent binding for display.
340
+ */
341
+ function describeBinding(binding) {
342
+ return `${binding.match.accountId ? `${binding.match.channel}:${binding.match.accountId}` : binding.match.channel} -> ${binding.agentId}`;
343
+ }
344
+ /**
345
+ * Lists all configured agents.
346
+ */
347
+ function agentsListAction(options) {
348
+ return async (dataDir) => {
349
+ const config = await loadAgentsConfig(dataDir);
350
+ const agents = listAgents(config);
351
+ const bindings = listBindings(config);
352
+ resolveDefaultAgentId(config);
353
+ if (options.json) {
354
+ console.log(JSON.stringify({
355
+ agents,
356
+ bindings
357
+ }, null, 2));
358
+ return;
359
+ }
360
+ console.log("Agents:");
361
+ for (const agent of agents) {
362
+ const defaultTag = agent.default ? " (default)" : "";
363
+ const header = agent.name && agent.name !== agent.id ? `${agent.id}${defaultTag} (${agent.name})` : `${agent.id}${defaultTag}`;
364
+ console.log(` - ${header}`);
365
+ if (agent.identity?.emoji || agent.identity?.name) {
366
+ const identity = [agent.identity.emoji, agent.identity.name].filter(Boolean).join(" ");
367
+ console.log(` Identity: ${identity}`);
368
+ }
369
+ const agentDir = resolveAgentDir(dataDir, agent.id);
370
+ console.log(` Agent dir: ${agentDir}`);
371
+ if (agent.model) {
372
+ const modelStr = typeof agent.model === "string" ? agent.model : agent.model.primary;
373
+ console.log(` Model: ${modelStr}`);
374
+ }
375
+ const agentBindings = bindings.filter((b) => b.agentId === agent.id);
376
+ if (agentBindings.length > 0) {
377
+ console.log(` Routing rules:`);
378
+ for (const binding of agentBindings) console.log(` - ${describeBinding(binding)}`);
379
+ }
380
+ }
381
+ };
382
+ }
383
+ /**
384
+ * Adds a new agent.
385
+ */
386
+ function agentsAddAction(id, options) {
387
+ return async (dataDir) => {
388
+ if (getAgentConfig(await loadAgentsConfig(dataDir), normalizeAgentId(id))) {
389
+ console.error(`Agent "${id}" already exists.`);
390
+ process.exit(1);
391
+ }
392
+ if (!await addAgent(dataDir, {
393
+ id,
394
+ name: options.name,
395
+ model: options.model,
396
+ default: options.default
397
+ })) {
398
+ console.error(`Agent "${id}" already exists.`);
399
+ process.exit(1);
400
+ }
401
+ const agentDir = resolveAgentDir(dataDir, id);
402
+ console.log(`Agent "${id}" added successfully.`);
403
+ console.log(` Agent dir: ${agentDir}`);
404
+ };
405
+ }
406
+ /**
407
+ * Deletes an agent.
408
+ */
409
+ function agentsDeleteAction(id) {
410
+ return async (dataDir) => {
411
+ const agent = getAgentConfig(await loadAgentsConfig(dataDir), normalizeAgentId(id));
412
+ if (!agent) {
413
+ console.error(`Agent "${id}" not found.`);
414
+ process.exit(1);
415
+ }
416
+ if (agent.default === true) {
417
+ console.error(`Cannot delete default agent "${id}".`);
418
+ process.exit(1);
419
+ }
420
+ if (!await removeAgent(dataDir, id)) {
421
+ console.error(`Failed to delete agent "${id}".`);
422
+ process.exit(1);
423
+ }
424
+ console.log(`Agent "${id}" deleted.`);
425
+ };
426
+ }
427
+ /**
428
+ * Binds a channel to an agent.
429
+ */
430
+ function agentsBindAction(options) {
431
+ return async (dataDir) => {
432
+ const config = await loadAgentsConfig(dataDir);
433
+ const agentId = options.agent ?? resolveDefaultAgentId(config);
434
+ if (!getAgentConfig(config, agentId)) {
435
+ console.error(`Agent "${agentId}" not found.`);
436
+ process.exit(1);
437
+ }
438
+ if (!options.bind || options.bind.length === 0) {
439
+ console.error("Please specify --bind <channel>[:<account>]");
440
+ process.exit(1);
441
+ }
442
+ for (const bindSpec of options.bind) {
443
+ const [channel, ...rest] = bindSpec.split(":");
444
+ const accountId = rest.join(":");
445
+ const validChannels = [
446
+ "H5",
447
+ "WEB",
448
+ "KLPA",
449
+ "CRON"
450
+ ];
451
+ if (!validChannels.includes(channel)) {
452
+ console.error(`Invalid channel: ${channel}`);
453
+ console.error(`Valid channels: ${validChannels.join(", ")}`);
454
+ process.exit(1);
455
+ }
456
+ await addBinding(dataDir, {
457
+ agentId,
458
+ match: {
459
+ channel,
460
+ accountId: accountId || void 0
461
+ }
462
+ });
463
+ console.log(`Binding added: ${bindSpec} -> ${agentId}`);
464
+ }
465
+ };
466
+ }
467
+ /**
468
+ * Unbinds a channel from an agent.
469
+ */
470
+ function agentsUnbindAction(options) {
471
+ return async (dataDir) => {
472
+ const config = await loadAgentsConfig(dataDir);
473
+ const agentId = options.agent ?? resolveDefaultAgentId(config);
474
+ if (!getAgentConfig(config, agentId)) {
475
+ console.error(`Agent "${agentId}" not found.`);
476
+ process.exit(1);
477
+ }
478
+ if (options.all) {
479
+ const removed = await removeBindings(dataDir, agentId, "*");
480
+ console.log(`Removed ${removed} binding(s) for agent "${agentId}".`);
481
+ } else if (options.bind && options.bind.length > 0) {
482
+ let totalRemoved = 0;
483
+ for (const bindSpec of options.bind) {
484
+ const [channel, ...rest] = bindSpec.split(":");
485
+ const removed = await removeBindings(dataDir, agentId, channel, rest.join(":") || void 0);
486
+ if (removed > 0) {
487
+ console.log(`Binding removed: ${bindSpec} -> ${agentId}`);
488
+ totalRemoved += removed;
489
+ } else console.log(`No binding found: ${bindSpec} -> ${agentId}`);
490
+ }
491
+ } else {
492
+ console.error("Please specify --bind <channel>[:<account>] or --all");
493
+ process.exit(1);
494
+ }
495
+ };
496
+ }
497
+ /**
498
+ * Lists routing bindings.
499
+ */
500
+ function agentsBindingsAction(options) {
501
+ return async (dataDir) => {
502
+ let bindings = listBindings(await loadAgentsConfig(dataDir));
503
+ if (options.agent) bindings = bindings.filter((b) => b.agentId === options.agent);
504
+ if (options.json) {
505
+ console.log(JSON.stringify(bindings, null, 2));
506
+ return;
507
+ }
508
+ if (bindings.length === 0) {
509
+ console.log("No bindings configured.");
510
+ return;
511
+ }
512
+ console.log("Routing bindings:");
513
+ for (const binding of bindings) console.log(` ${describeBinding(binding)}`);
514
+ };
515
+ }
516
+ /**
517
+ * Sets agent identity.
518
+ */
519
+ function agentsSetIdentityAction(options) {
520
+ return async (dataDir) => {
521
+ const config = await loadAgentsConfig(dataDir);
522
+ const agentId = options.agent ?? resolveDefaultAgentId(config);
523
+ if (!getAgentConfig(config, agentId)) {
524
+ console.error(`Agent "${agentId}" not found.`);
525
+ process.exit(1);
526
+ }
527
+ if (!await updateAgentIdentity(dataDir, agentId, {
528
+ name: options.name,
529
+ emoji: options.emoji,
530
+ avatar: options.avatar
531
+ })) {
532
+ console.error(`Failed to update identity for agent "${agentId}".`);
533
+ process.exit(1);
534
+ }
535
+ console.log(`Identity updated for agent "${agentId}".`);
536
+ };
537
+ }
538
+ /**
539
+ * Registers all agents subcommands with the program.
540
+ */
541
+ function registerAgentsCommands(program, getDataDir) {
542
+ const agentsCmd = program.command("agents").description("Manage agents");
543
+ agentsCmd.command("list").description("List all configured agents").option("-j, --json", "Output as JSON").option("-b, --bindings", "Show detailed binding rules").action(async (opts) => {
544
+ const dataDir = getDataDir();
545
+ await agentsListAction(opts)(dataDir);
546
+ });
547
+ agentsCmd.command("add <id>").description("Add a new agent").option("-n, --name <name>", "Display name").option("-m, --model <model>", "Model identifier").option("--default", "Mark as default agent").action(async (id, opts) => {
548
+ const dataDir = getDataDir();
549
+ await agentsAddAction(id, opts)(dataDir);
550
+ });
551
+ agentsCmd.command("delete <id>").description("Delete an agent").action(async (id) => {
552
+ const dataDir = getDataDir();
553
+ await agentsDeleteAction(id)(dataDir);
554
+ });
555
+ agentsCmd.command("bind").description("Bind a channel to an agent").option("-a, --agent <id>", "Target agent ID").option("-b, --bind <channel...>", "Channel binding (e.g., WEB, KLPA:ops)").action(async (opts) => {
556
+ const dataDir = getDataDir();
557
+ await agentsBindAction(opts)(dataDir);
558
+ });
559
+ agentsCmd.command("unbind").description("Unbind a channel from an agent").option("-a, --agent <id>", "Target agent ID").option("-b, --bind <channel...>", "Channel binding to remove").option("--all", "Remove all bindings for the agent").action(async (opts) => {
560
+ const dataDir = getDataDir();
561
+ await agentsUnbindAction(opts)(dataDir);
562
+ });
563
+ agentsCmd.command("bindings").description("List routing bindings").option("-a, --agent <id>", "Filter by agent ID").option("-j, --json", "Output as JSON").action(async (opts) => {
564
+ const dataDir = getDataDir();
565
+ await agentsBindingsAction(opts)(dataDir);
566
+ });
567
+ agentsCmd.command("set-identity").description("Set agent identity").option("-a, --agent <id>", "Target agent ID").option("-n, --name <name>", "Agent name").option("-e, --emoji <emoji>", "Agent emoji").option("--avatar <path>", "Avatar path").action(async (opts) => {
568
+ const dataDir = getDataDir();
569
+ await agentsSetIdentityAction(opts)(dataDir);
570
+ });
571
+ }
572
+
573
+ //#endregion
574
+ //#region src/commands/plugins.ts
575
+ function resolveWorkspaceDir(dataDir) {
576
+ return path.join(dataDir, "workspace");
577
+ }
578
+ function resolveBundledDir() {
579
+ const raw = process.env.PINGCLAW_PLUGINS_BUNDLED_DIR;
580
+ return raw ? raw.trim() || void 0 : void 0;
581
+ }
582
+ function printPluginList(records) {
583
+ if (records.length === 0) {
584
+ writeLine("No plugins discovered.");
585
+ return;
586
+ }
587
+ for (const record of records) {
588
+ const status = record.status.padEnd(8, " ");
589
+ writeLine(`${record.id} ${status} ${record.origin} ${record.source}`);
590
+ }
591
+ }
592
+ function printPluginInfo(record) {
593
+ writeLine(`id: ${record.id}`);
594
+ writeLine(`status: ${record.status}`);
595
+ writeLine(`origin: ${record.origin}`);
596
+ writeLine(`source: ${record.source}`);
597
+ writeLine(`enabled: ${record.enabled}`);
598
+ if (record.error) writeLine(`error: ${record.error}`);
599
+ writeLine(`tools: ${record.toolCount}`);
600
+ writeLine(`hooks: ${record.hookCount}`);
601
+ if (record.skills.length > 0) writeLine(`skills: ${record.skills.join(", ")}`);
602
+ }
603
+ function normalizeAllowlist(list) {
604
+ return Array.from(new Set((list ?? []).map((entry) => entry.trim()).filter(Boolean)));
605
+ }
606
+ function printAllowlist(list) {
607
+ if (list.length === 0) {
608
+ writeLine("LLM allowlist is empty.");
609
+ return;
610
+ }
611
+ for (const entry of list) writeLine(entry);
612
+ }
613
+ function registerPluginsCommand(program, getDataDir) {
614
+ const cmd = program.command("plugins").description("Manage PingClaw plugins");
615
+ cmd.command("list").description("List discovered plugins").option("-d, --data-dir <path>", "Data directory path").action(async (options) => {
616
+ const dataDir = options.dataDir ?? getDataDir();
617
+ printPluginList(initializePluginSystem({
618
+ config: await loadPluginsConfig(dataDir),
619
+ dataDir,
620
+ workspaceDir: resolveWorkspaceDir(dataDir),
621
+ bundledDir: resolveBundledDir()
622
+ }).registry.plugins);
623
+ });
624
+ cmd.command("info").description("Show plugin details").argument("<id>", "Plugin id").option("-d, --data-dir <path>", "Data directory path").action(async (id, options) => {
625
+ const dataDir = options.dataDir ?? getDataDir();
626
+ const record = initializePluginSystem({
627
+ config: await loadPluginsConfig(dataDir),
628
+ dataDir,
629
+ workspaceDir: resolveWorkspaceDir(dataDir),
630
+ bundledDir: resolveBundledDir()
631
+ }).registry.plugins.find((entry) => entry.id === id);
632
+ if (!record) {
633
+ writeError(`Plugin not found: ${id}`);
634
+ process.exit(1);
635
+ }
636
+ printPluginInfo(record);
637
+ });
638
+ cmd.command("enable").description("Enable a plugin").argument("<id>", "Plugin id").option("-d, --data-dir <path>", "Data directory path").action(async (id, options) => {
639
+ const dataDir = options.dataDir ?? getDataDir();
640
+ const config = await loadPluginsConfig(dataDir) ?? {};
641
+ const normalized = normalizePluginsConfig(config);
642
+ if (!initializePluginSystem({
643
+ config,
644
+ dataDir,
645
+ workspaceDir: resolveWorkspaceDir(dataDir),
646
+ bundledDir: resolveBundledDir()
647
+ }).registry.plugins.some((entry) => entry.id === id)) {
648
+ writeError(`Plugin not found: ${id}`);
649
+ process.exit(1);
650
+ }
651
+ await savePluginsConfig(dataDir, {
652
+ ...config,
653
+ entries: {
654
+ ...config.entries,
655
+ [id]: {
656
+ ...config.entries?.[id] ?? {},
657
+ enabled: true
658
+ }
659
+ }
660
+ });
661
+ writeLine(`Enabled ${id}`);
662
+ if (normalized.allow.length > 0 && !normalized.allow.includes(id)) writeLine("Note: plugins.allow is set; add this plugin id to allowlist if needed.");
663
+ });
664
+ cmd.command("disable").description("Disable a plugin").argument("<id>", "Plugin id").option("-d, --data-dir <path>", "Data directory path").action(async (id, options) => {
665
+ const dataDir = options.dataDir ?? getDataDir();
666
+ const config = await loadPluginsConfig(dataDir) ?? {};
667
+ if (!initializePluginSystem({
668
+ config,
669
+ dataDir,
670
+ workspaceDir: resolveWorkspaceDir(dataDir),
671
+ bundledDir: resolveBundledDir()
672
+ }).registry.plugins.some((entry) => entry.id === id)) {
673
+ writeError(`Plugin not found: ${id}`);
674
+ process.exit(1);
675
+ }
676
+ await savePluginsConfig(dataDir, {
677
+ ...config,
678
+ entries: {
679
+ ...config.entries,
680
+ [id]: {
681
+ ...config.entries?.[id] ?? {},
682
+ enabled: false
683
+ }
684
+ }
685
+ });
686
+ writeLine(`Disabled ${id}`);
687
+ });
688
+ cmd.command("doctor").description("Validate plugin configuration").option("-d, --data-dir <path>", "Data directory path").action(async (options) => {
689
+ const dataDir = options.dataDir ?? getDataDir();
690
+ const system = initializePluginSystem({
691
+ config: await loadPluginsConfig(dataDir),
692
+ dataDir,
693
+ workspaceDir: resolveWorkspaceDir(dataDir),
694
+ bundledDir: resolveBundledDir()
695
+ });
696
+ if (system.diagnostics.length === 0) {
697
+ writeLine("No plugin issues detected.");
698
+ return;
699
+ }
700
+ for (const diag of system.diagnostics) writeLine(`${diag.level === "error" ? "ERROR" : "WARN"}${diag.pluginId ? ` ${diag.pluginId}` : ""}: ${diag.message}`);
701
+ if (system.diagnostics.some((d) => d.level === "error")) process.exit(1);
702
+ });
703
+ const llmCmd = cmd.command("llm-allow").description("Manage plugin LLM allowlist");
704
+ llmCmd.command("list").description("List LLM allowlist entries").option("-d, --data-dir <path>", "Data directory path").action(async (options) => {
705
+ printAllowlist(normalizeAllowlist((await loadPluginsConfig(options.dataDir ?? getDataDir()))?.llmAllowlist));
706
+ });
707
+ llmCmd.command("add").description("Add entries to the LLM allowlist (plugin id or tool name)").argument("<entry...>", "Plugin id or tool name").option("-d, --data-dir <path>", "Data directory path").action(async (entries, options) => {
708
+ const dataDir = options.dataDir ?? getDataDir();
709
+ const config = await loadPluginsConfig(dataDir) ?? {};
710
+ const allowlist = normalizeAllowlist([...config.llmAllowlist ?? [], ...entries]);
711
+ await savePluginsConfig(dataDir, {
712
+ ...config,
713
+ llmAllowlist: allowlist
714
+ });
715
+ writeLine(`LLM allowlist updated (${allowlist.length} entries).`);
716
+ });
717
+ llmCmd.command("remove").description("Remove entries from the LLM allowlist").argument("<entry...>", "Plugin id or tool name").option("-d, --data-dir <path>", "Data directory path").action(async (entries, options) => {
718
+ const dataDir = options.dataDir ?? getDataDir();
719
+ const config = await loadPluginsConfig(dataDir) ?? {};
720
+ const removeSet = new Set(entries.map((entry) => entry.trim()).filter(Boolean));
721
+ const allowlist = normalizeAllowlist(config.llmAllowlist).filter((entry) => !removeSet.has(entry));
722
+ await savePluginsConfig(dataDir, {
723
+ ...config,
724
+ llmAllowlist: allowlist
725
+ });
726
+ writeLine(`LLM allowlist updated (${allowlist.length} entries).`);
727
+ });
728
+ llmCmd.command("clear").description("Clear the LLM allowlist").option("-d, --data-dir <path>", "Data directory path").action(async (options) => {
729
+ const dataDir = options.dataDir ?? getDataDir();
730
+ await savePluginsConfig(dataDir, {
731
+ ...await loadPluginsConfig(dataDir) ?? {},
732
+ llmAllowlist: []
733
+ });
734
+ writeLine("LLM allowlist cleared.");
735
+ });
736
+ }
737
+
738
+ //#endregion
739
+ //#region src/program.ts
740
+ /**
741
+ * Commander program setup for @pingclaw/cli.
742
+ * Exported separately from the binary entrypoint to allow unit testing.
743
+ */
744
+ const cliPackage = createRequire(import.meta.url)("../package.json");
745
+ /**
746
+ * Resolves the data directory from environment or current working directory.
747
+ */
748
+ function getDataDir() {
749
+ return process.env.PINGCLAW_DATA_DIR || process.cwd();
750
+ }
751
+ function createProgram() {
752
+ const program = new Command();
753
+ program.name("pingclaw").description("PingClaw CLI — runs agent tasks in a containerized environment").version(cliPackage.version);
754
+ registerRunCommand(program);
755
+ registerSessionsCommand(program);
756
+ registerBootstrapCommand(program);
757
+ registerMemoryCommand(program);
758
+ registerAgentsCommands(program, getDataDir);
759
+ registerPluginsCommand(program, getDataDir);
760
+ return program;
761
+ }
762
+
763
+ //#endregion
764
+ export { getDataDir as n, createProgram as t };
765
+ //# sourceMappingURL=program-glxy0j6y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program-glxy0j6y.js","names":[],"sources":["../src/output.ts","../src/commands/bootstrap.ts","../src/auth.ts","../src/config.ts","../src/plugins-config.ts","../src/commands/run.ts","../src/commands/sessions.ts","../src/commands/memory.ts","../src/commands/agents.ts","../src/commands/plugins.ts","../src/program.ts"],"sourcesContent":["/**\n * Output formatting utilities for @pingclaw/cli.\n */\n\nimport type {\n AgentRunResult,\n AgentProgressEvent,\n SessionSummary,\n BootstrapMountResult,\n} from \"@pingclaw/agents\";\n\nexport type OutputFormat = \"text\" | \"json\";\n\n/** Writes a string to stdout without a trailing newline */\nexport function write(text: string): void {\n process.stdout.write(text);\n}\n\n/** Writes a line to stdout */\nexport function writeLine(text: string): void {\n process.stdout.write(text + \"\\n\");\n}\n\n/** Writes a line to stderr */\nexport function writeError(text: string): void {\n process.stderr.write(text + \"\\n\");\n}\n\n/** Formats and prints a progress event during streaming execution */\nexport function printProgressEvent(event: AgentProgressEvent): void {\n switch (event.type) {\n case \"text\":\n write(event.text);\n break;\n case \"tool_start\":\n writeLine(`\\n[tool:${event.name}] ${JSON.stringify(event.input)}`);\n break;\n case \"tool_end\":\n writeLine(`[tool:${event.name}] ${event.isError ? \"ERROR\" : \"OK\"} ${event.output.slice(0, 200)}`);\n break;\n case \"compaction\":\n writeLine(`\\n[compaction] ${event.reason}`);\n break;\n case \"error\":\n writeError(`\\n[error] ${event.message}`);\n break;\n case \"subagent_spawn\": {\n const label = event.label ? ` \"${event.label}\"` : \"\";\n writeLine(`\\n[subagent:spawn]${label} ${event.task}`);\n break;\n }\n case \"subagent_complete\": {\n writeLine(`[subagent:${event.status}] ${event.task}`);\n break;\n }\n }\n}\n\n/** Prints the final run result to stdout */\nexport function printRunResult(result: AgentRunResult, format: OutputFormat): void {\n if (format === \"json\") {\n writeLine(JSON.stringify(result, null, 2));\n return;\n }\n writeLine(\"\\n\");\n writeLine(`session: ${result.sessionId}`);\n writeLine(`duration: ${result.durationMs}ms`);\n writeLine(`tokens: input=${result.usage.input} output=${result.usage.output} total=${result.usage.total}`);\n if (result.error) {\n writeError(`error: ${result.error}`);\n }\n}\n\n/** Prints the session list to stdout */\nexport function printSessionList(sessions: SessionSummary[], format: OutputFormat): void {\n if (format === \"json\") {\n writeLine(JSON.stringify(sessions, null, 2));\n return;\n }\n if (sessions.length === 0) {\n writeLine(\"No sessions found.\");\n return;\n }\n for (const session of sessions) {\n const date = session.createdAt ? new Date(session.createdAt).toLocaleString() : \"unknown\";\n writeLine(`${session.id} ${date} [${session.channel}] ${session.title}`);\n }\n}\n\n/** Prints bootstrap result to stdout */\nexport function printBootstrapResult(result: BootstrapMountResult, format: OutputFormat): void {\n if (format === \"json\") {\n writeLine(JSON.stringify(result, null, 2));\n return;\n }\n\n writeLine(\"Bootstrap completed.\");\n writeLine(`dataDir: ${result.dataDir}`);\n writeLine(`created dirs: ${result.createdDirs.length}`);\n writeLine(`created files: ${result.createdFiles.length}`);\n writeLine(`skipped dirs: ${result.skippedDirs.length}`);\n writeLine(`skipped files: ${result.skippedFiles.length}`);\n}\n","/**\n * `pingclaw bootstrap` command — initializes the data directory structure.\n */\n\nimport type { Command } from \"commander\";\nimport { bootstrapMountLayout } from \"@pingclaw/agents\";\nimport { printBootstrapResult, writeError, type OutputFormat } from \"../output.js\";\n\nexport type BootstrapOptions = {\n dataDir: string;\n output?: OutputFormat;\n};\n\n/** Registers the `bootstrap` subcommand on the given Commander program */\nexport function registerBootstrapCommand(program: Command): void {\n program\n .command(\"bootstrap\")\n .description(\"Initialize the data directory with required directories and templates\")\n .requiredOption(\"-d, --data-dir <path>\", \"Data directory path\")\n .option(\"--output <format>\", \"Output format: text (default) or json\", \"text\")\n .action(async (options: BootstrapOptions) => {\n const format: OutputFormat = options.output === \"json\" ? \"json\" : \"text\";\n try {\n const result = await bootstrapMountLayout(options.dataDir);\n printBootstrapResult(result, format);\n } catch (err) {\n writeError(`Error bootstrapping data directory: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import gensign from \"gensign-node\";\n\ndeclare global {\n // Provided by gensign-node consumers to locate package info.\n // eslint-disable-next-line no-var\n var getPkgPath: () => string;\n}\n\nif (!globalThis.getPkgPath) {\n globalThis.getPkgPath = () => \"@wizard/pingclaw\";\n}\n\nexport function encryptWithSM4(ticket: string): string {\n return gensign.sm4_encrypt_ecb(ticket);\n}\n\nexport function generateApiKey(ticket: string): string {\n return encryptWithSM4(ticket);\n}\n\nexport {};\n","/**\n * LLM configuration resolution for @pingclaw/cli.\n *\n * Priority: auth token > CLI flags > environment variables > error\n */\nimport { generateApiKey } from \"./auth.js\";\n\nexport type LlmConfig = {\n baseUrl: string;\n apiKey: string;\n model: string;\n contextWindow?: number;\n};\n\n/** Resolved CLI options that may override env vars */\nexport type LlmCliOptions = {\n baseUrl?: string;\n apiKey?: string;\n authToken?: string;\n model?: string;\n contextWindow?: number;\n};\n\n/**\n * Resolves LLM configuration from CLI options and environment variables.\n * CLI options take precedence over environment variables.\n * Throws if required fields cannot be resolved.\n */\nexport function resolveLlmConfig(options: LlmCliOptions = {}): LlmConfig {\n const baseUrl = options.baseUrl ?? process.env[\"PINGCLAW_BASE_URL\"];\n const envAuthToken = process.env[\"PINGCLAW_AUTH_TOKEN\"];\n const apiKey = options.authToken\n ? generateApiKey(options.authToken)\n : (envAuthToken ? generateApiKey(envAuthToken) : (options.apiKey ?? process.env[\"PINGCLAW_API_KEY\"]));\n const model = options.model ?? process.env[\"PINGCLAW_MODEL\"];\n\n const missing: string[] = [];\n if (!baseUrl) missing.push(\"--base-url / PINGCLAW_BASE_URL\");\n if (!apiKey) missing.push(\"--api-key / PINGCLAW_API_KEY\");\n if (!model) missing.push(\"--model / PINGCLAW_MODEL\");\n\n if (missing.length > 0) {\n throw new Error(`Missing required LLM configuration: ${missing.join(\", \")}`);\n }\n\n const contextWindow = options.contextWindow\n ?? (process.env[\"PINGCLAW_CONTEXT_WINDOW\"] ? Number(process.env[\"PINGCLAW_CONTEXT_WINDOW\"]) : undefined);\n\n return { baseUrl: baseUrl!, apiKey: apiKey!, model: model!, contextWindow };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { PluginsConfig } from \"@pingclaw/agents\";\n\nconst CONFIG_FILE = \"plugins.json\";\n\nexport function resolvePluginsConfigPath(dataDir: string): string {\n return path.join(dataDir, \".pingclaw\", CONFIG_FILE);\n}\n\nexport async function loadPluginsConfig(dataDir: string): Promise<PluginsConfig | undefined> {\n const filePath = resolvePluginsConfigPath(dataDir);\n try {\n const raw = await fs.readFile(filePath, \"utf-8\");\n const parsed = JSON.parse(raw) as PluginsConfig;\n return parsed;\n } catch (err) {\n const code = (err as { code?: string }).code;\n if (code === \"ENOENT\") {\n return undefined;\n }\n throw err;\n }\n}\n\nexport async function savePluginsConfig(dataDir: string, config: PluginsConfig): Promise<void> {\n const filePath = resolvePluginsConfigPath(dataDir);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, JSON.stringify(config, null, 2), \"utf-8\");\n}\n","/**\n * `pingclaw run` command — executes an agent task.\n */\n\nimport type { Command } from \"commander\";\nimport { runAgent } from \"@pingclaw/agents\";\nimport type { Channel } from \"@pingclaw/agents\";\nimport path from \"node:path\";\nimport { resolveLlmConfig } from \"../config.js\";\nimport { printProgressEvent, printRunResult, writeError, type OutputFormat } from \"../output.js\";\nimport { loadPluginsConfig } from \"../plugins-config.js\";\n\nexport type RunOptions = {\n dataDir: string;\n message: string;\n sessionId?: string;\n messageId?: string;\n channel?: Channel;\n baseUrl?: string;\n apiKey?: string;\n authToken?: string;\n model?: string;\n contextWindow?: string;\n callbackUrl?: string;\n timeout?: string;\n output?: OutputFormat;\n};\n\n/** Registers the `run` subcommand on the given Commander program */\nexport function registerRunCommand(program: Command): void {\n program\n .command(\"run\")\n .description(\"Run an agent task\")\n .requiredOption(\"-d, --data-dir <path>\", \"Data directory path\")\n .requiredOption(\"--message <text>\", \"User message to send to the agent\")\n .option(\"-s, --session-id <id>\", \"Resume an existing session by ID\")\n .option(\"--message-id <id>\", \"Message ID for correlating events\")\n .option(\"-c, --channel <channel>\", \"Channel type: H5 | WEB | KLPA | CRON (default: WEB)\", \"WEB\")\n .option(\"--base-url <url>\", \"LLM API base URL (overrides PINGCLAW_BASE_URL)\")\n .option(\"--api-key <key>\", \"LLM API key (overrides PINGCLAW_API_KEY)\")\n .option(\"--auth-token <token>\", \"Auth token used to generate the API key (highest priority)\")\n .option(\"--model <name>\", \"LLM model name (overrides PINGCLAW_MODEL)\")\n .option(\"--context-window <n>\", \"LLM context window size\")\n .option(\"--callback-url <url>\", \"HTTP callback URL for progress events\")\n .option(\"--timeout <ms>\", \"Execution timeout in milliseconds (default: 600000)\")\n .option(\"--output <format>\", \"Output format: text (default) or json\", \"text\")\n .action(async (options: RunOptions) => {\n let llm;\n try {\n llm = resolveLlmConfig({\n baseUrl: options.baseUrl,\n apiKey: options.apiKey,\n authToken: options.authToken,\n model: options.model,\n contextWindow: options.contextWindow ? Number(options.contextWindow) : undefined,\n });\n } catch (err) {\n writeError((err as Error).message);\n process.exit(1);\n }\n\n // Validate channel\n const channel: Channel = options.channel ?? \"WEB\";\n if (channel !== \"H5\" && channel !== \"WEB\" && channel !== \"KLPA\" && channel !== \"CRON\") {\n writeError(`Invalid channel: ${channel}. Must be 'H5', 'WEB', 'KLPA', or 'CRON'`);\n process.exit(1);\n }\n\n const format: OutputFormat = options.output === \"json\" ? \"json\" : \"text\";\n\n // Wire abort signal to OS termination signals so the agent can be\n // gracefully cancelled when the container is stopped (SIGTERM) or\n // the user presses Ctrl-C (SIGINT).\n const abortController = new AbortController();\n const abort = () => abortController.abort();\n process.once(\"SIGTERM\", abort);\n process.once(\"SIGINT\", abort);\n\n try {\n const pluginsConfig = await loadPluginsConfig(options.dataDir);\n const result = await runAgent({\n dataDir: options.dataDir,\n message: options.message,\n sessionId: options.sessionId,\n messageId: options.messageId,\n channel,\n llm,\n callbackUrl: options.callbackUrl,\n timeoutMs: options.timeout ? Number(options.timeout) : undefined,\n abortSignal: abortController.signal,\n plugins: pluginsConfig ? {\n config: pluginsConfig,\n dataDir: options.dataDir,\n workspaceDir: path.join(options.dataDir, \"workspace\"),\n bundledDir: process.env.PINGCLAW_PLUGINS_BUNDLED_DIR,\n llmAllowlist: pluginsConfig.llmAllowlist,\n } : undefined,\n onProgress: format === \"text\"\n ? async (event) => { printProgressEvent(event); }\n : undefined,\n });\n\n printRunResult(result, format);\n process.exit(result.error ? 1 : 0);\n } catch (err) {\n writeError(`Fatal: ${(err as Error).message}`);\n process.exit(1);\n } finally {\n process.off(\"SIGTERM\", abort);\n process.off(\"SIGINT\", abort);\n }\n });\n}\n","/**\n * `pingclaw sessions` command — lists sessions for a data directory.\n */\n\nimport type { Command } from \"commander\";\nimport { listSessionSummaries, type Channel } from \"@pingclaw/agents\";\nimport { printSessionList, writeError, type OutputFormat } from \"../output.js\";\n\nexport type SessionsOptions = {\n dataDir: string;\n channel?: Channel;\n output?: OutputFormat;\n};\n\n/** Registers the `sessions` subcommand on the given Commander program */\nexport function registerSessionsCommand(program: Command): void {\n program\n .command(\"sessions\")\n .description(\"List sessions for a data directory\")\n .requiredOption(\"-d, --data-dir <path>\", \"Data directory path\")\n .option(\"-c, --channel <channel>\", \"Filter by channel type: H5 | WEB | KLPA | CRON\")\n .option(\"--output <format>\", \"Output format: text (default) or json\", \"text\")\n .action(async (options: SessionsOptions) => {\n const format: OutputFormat = options.output === \"json\" ? \"json\" : \"text\";\n\n // Validate channel if provided\n if (options.channel && options.channel !== \"H5\" && options.channel !== \"WEB\" && options.channel !== \"KLPA\" && options.channel !== \"CRON\") {\n writeError(`Invalid channel: ${options.channel}. Must be 'H5', 'WEB', 'KLPA', or 'CRON'`);\n process.exit(1);\n }\n\n try {\n const sessions = await listSessionSummaries(options.dataDir, options.channel);\n printSessionList(sessions, format);\n } catch (err) {\n writeError(`Error listing sessions: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n","/**\n * `pingclaw memory` command — status/index/search for semantic memory.\n */\n\nimport type { Command } from \"commander\";\nimport { MemoryIndexManager, type MemoryProviderStatus } from \"@pingclaw/agents\";\nimport { writeError, writeLine, type OutputFormat } from \"../output.js\";\n\nexport type MemoryCommandOptions = {\n dataDir: string;\n output?: OutputFormat;\n includeSessions?: boolean;\n};\n\ntype StatusOptions = MemoryCommandOptions & {\n deep?: boolean;\n index?: boolean;\n verbose?: boolean;\n};\n\ntype IndexOptions = MemoryCommandOptions & {\n verbose?: boolean;\n};\n\ntype SearchOptions = MemoryCommandOptions & {\n query?: string;\n};\n\nfunction formatStatus(status: MemoryProviderStatus, deep?: boolean): string {\n const lines: string[] = [];\n lines.push(`backend: ${status.backend}`);\n lines.push(`provider: ${status.provider}${status.model ? ` (${status.model})` : \"\"}`);\n if (typeof status.files === \"number\") {\n lines.push(`files: ${status.files}`);\n }\n if (typeof status.chunks === \"number\") {\n lines.push(`chunks: ${status.chunks}`);\n }\n if (typeof status.dirty === \"boolean\") {\n lines.push(`dirty: ${status.dirty}`);\n }\n if (status.dbPath) {\n lines.push(`db: ${status.dbPath}`);\n }\n if (status.sources?.length) {\n lines.push(`sources: ${status.sources.join(\", \")}`);\n }\n if (deep) {\n if (status.fts) {\n lines.push(`fts: enabled=${status.fts.enabled} available=${status.fts.available}`);\n if (status.fts.error) {\n lines.push(`fts_error: ${status.fts.error}`);\n }\n }\n if (status.vector) {\n lines.push(`vector: enabled=${status.vector.enabled} available=${status.vector.available ?? \"unknown\"}`);\n if (status.vector.dims) {\n lines.push(`vector_dims: ${status.vector.dims}`);\n }\n if (status.vector.loadError) {\n lines.push(`vector_error: ${status.vector.loadError}`);\n }\n }\n if (status.cache) {\n lines.push(`cache: enabled=${status.cache.enabled} entries=${status.cache.entries ?? 0}`);\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction getManager(dataDir: string, includeSessions?: boolean): MemoryIndexManager {\n return MemoryIndexManager.get(dataDir, includeSessions ? {\n experimental: { sessionMemory: true },\n sources: [\"memory\", \"sessions\"],\n } : undefined);\n}\n\nexport function registerMemoryCommand(program: Command): void {\n const memory = program.command(\"memory\").description(\"Manage semantic memory indexing and search\");\n\n memory\n .command(\"status\")\n .description(\"Show memory index status\")\n .requiredOption(\"-d, --data-dir <path>\", \"Data directory path\")\n .option(\"--deep\", \"Probe embedding/vector availability\")\n .option(\"--index\", \"Run a refresh before reporting status\")\n .option(\"--include-sessions\", \"Include session transcripts in indexing\")\n .option(\"--verbose\", \"Verbose output\")\n .option(\"--output <format>\", \"Output format: text (default) or json\", \"text\")\n .action(async (options: StatusOptions) => {\n const format: OutputFormat = options.output === \"json\" ? \"json\" : \"text\";\n try {\n const manager = getManager(options.dataDir, options.includeSessions);\n if (options.index) {\n await manager.sync({ reason: \"cli-status\" });\n }\n const status = manager.status();\n if (options.deep) {\n const [embed, vector] = await Promise.all([\n manager.probeEmbeddingAvailability(),\n manager.probeVectorAvailability(),\n ]);\n (status.custom ??= {}).embeddingProbe = embed;\n (status.custom ??= {}).vectorProbe = { ok: vector };\n }\n if (format === \"json\") {\n writeLine(JSON.stringify(status, null, 2));\n } else {\n writeLine(formatStatus(status, options.deep));\n }\n } catch (err) {\n writeError(`Error getting memory status: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n memory\n .command(\"index\")\n .description(\"Reindex memory files\")\n .requiredOption(\"-d, --data-dir <path>\", \"Data directory path\")\n .option(\"--include-sessions\", \"Include session transcripts in indexing\")\n .option(\"--verbose\", \"Verbose output\")\n .action(async (options: IndexOptions) => {\n try {\n const manager = getManager(options.dataDir, options.includeSessions);\n await manager.sync({ reason: \"cli-index\" });\n writeLine(\"Memory index refreshed.\");\n } catch (err) {\n writeError(`Error indexing memory: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n memory\n .command(\"search [query]\")\n .description(\"Search semantic memory\")\n .requiredOption(\"-d, --data-dir <path>\", \"Data directory path\")\n .option(\"--query <text>\", \"Search query\")\n .option(\"--include-sessions\", \"Include session transcripts in search\")\n .option(\"--output <format>\", \"Output format: text (default) or json\", \"text\")\n .action(async (query: string | undefined, options: SearchOptions) => {\n const format: OutputFormat = options.output === \"json\" ? \"json\" : \"text\";\n const q = options.query?.trim() || query?.trim();\n if (!q) {\n writeError(\"Query is required: provide [query] or --query <text>\");\n process.exit(1);\n }\n try {\n const manager = getManager(options.dataDir, options.includeSessions);\n const results = await manager.search(q);\n if (format === \"json\") {\n writeLine(JSON.stringify(results, null, 2));\n return;\n }\n if (results.length === 0) {\n writeLine(`No results found for: ${q}`);\n return;\n }\n const lines = results.map((r) => {\n const base = `${r.path}:${r.startLine}-${r.endLine} (${r.score.toFixed(4)}) ${r.snippet}`;\n return r.citation ? `${base}\\n${r.citation}` : base;\n });\n writeLine(lines.join(\"\\n\"));\n } catch (err) {\n writeError(`Error searching memory: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n","/**\n * Agents command group for @pingclaw/cli.\n * Manages multi-agent configuration (add, delete, list, bind, unbind, set-identity).\n */\n\nimport { Command } from \"commander\";\nimport {\n loadAgentsConfig,\n saveAgentsConfig,\n listAgents,\n listBindings,\n getAgentConfig,\n resolveDefaultAgentId,\n resolveAgentDir,\n normalizeAgentId,\n addAgent,\n removeAgent,\n addBinding,\n removeBindings,\n updateAgentIdentity,\n type AgentConfig,\n type AgentBinding,\n} from \"@pingclaw/agents/config\";\nimport fs from \"node:fs/promises\";\n\n/**\n * Formats an agent binding for display.\n */\nfunction describeBinding(binding: AgentBinding): string {\n const route = binding.match.accountId\n ? `${binding.match.channel}:${binding.match.accountId}`\n : binding.match.channel;\n return `${route} -> ${binding.agentId}`;\n}\n\n/**\n * Lists all configured agents.\n */\nfunction agentsListAction(options: { json?: boolean; bindings?: boolean }) {\n return async (dataDir: string) => {\n const config = await loadAgentsConfig(dataDir);\n const agents = listAgents(config);\n const bindings = listBindings(config);\n const defaultId = resolveDefaultAgentId(config);\n\n if (options.json) {\n console.log(JSON.stringify({ agents, bindings }, null, 2));\n return;\n }\n\n console.log(\"Agents:\");\n for (const agent of agents) {\n const defaultTag = agent.default ? \" (default)\" : \"\";\n const header =\n agent.name && agent.name !== agent.id\n ? `${agent.id}${defaultTag} (${agent.name})`\n : `${agent.id}${defaultTag}`;\n\n console.log(` - ${header}`);\n\n if (agent.identity?.emoji || agent.identity?.name) {\n const identity = [agent.identity.emoji, agent.identity.name]\n .filter(Boolean)\n .join(\" \");\n console.log(` Identity: ${identity}`);\n }\n\n const agentDir = resolveAgentDir(dataDir, agent.id);\n console.log(` Agent dir: ${agentDir}`);\n\n if (agent.model) {\n const modelStr =\n typeof agent.model === \"string\"\n ? agent.model\n : agent.model.primary;\n console.log(` Model: ${modelStr}`);\n }\n\n // 绑定规则\n const agentBindings = bindings.filter((b) => b.agentId === agent.id);\n if (agentBindings.length > 0) {\n console.log(` Routing rules:`);\n for (const binding of agentBindings) {\n console.log(` - ${describeBinding(binding)}`);\n }\n }\n }\n };\n}\n\n/**\n * Adds a new agent.\n */\nfunction agentsAddAction(\n id: string,\n options: { name?: string; model?: string; default?: boolean },\n) {\n return async (dataDir: string) => {\n const config = await loadAgentsConfig(dataDir);\n\n // 检查 ID 是否已存在\n const normalizedId = normalizeAgentId(id);\n if (getAgentConfig(config, normalizedId)) {\n console.error(`Agent \"${id}\" already exists.`);\n process.exit(1);\n }\n\n const newAgent: AgentConfig = {\n id,\n name: options.name,\n model: options.model,\n default: options.default,\n };\n\n const created = await addAgent(dataDir, newAgent);\n if (!created) {\n console.error(`Agent \"${id}\" already exists.`);\n process.exit(1);\n }\n\n const agentDir = resolveAgentDir(dataDir, id);\n console.log(`Agent \"${id}\" added successfully.`);\n console.log(` Agent dir: ${agentDir}`);\n };\n}\n\n/**\n * Deletes an agent.\n */\nfunction agentsDeleteAction(id: string) {\n return async (dataDir: string) => {\n const config = await loadAgentsConfig(dataDir);\n\n const normalizedId = normalizeAgentId(id);\n const agent = getAgentConfig(config, normalizedId);\n\n if (!agent) {\n console.error(`Agent \"${id}\" not found.`);\n process.exit(1);\n }\n\n // 不允许删除默认 agent\n if (agent.default === true) {\n console.error(`Cannot delete default agent \"${id}\".`);\n process.exit(1);\n }\n\n const removed = await removeAgent(dataDir, id);\n if (!removed) {\n console.error(`Failed to delete agent \"${id}\".`);\n process.exit(1);\n }\n\n console.log(`Agent \"${id}\" deleted.`);\n };\n}\n\n/**\n * Binds a channel to an agent.\n */\nfunction agentsBindAction(options: {\n agent?: string;\n bind?: string[];\n}) {\n return async (dataDir: string) => {\n const config = await loadAgentsConfig(dataDir);\n const agentId = options.agent ?? resolveDefaultAgentId(config);\n\n // 验证 agent 存在\n if (!getAgentConfig(config, agentId)) {\n console.error(`Agent \"${agentId}\" not found.`);\n process.exit(1);\n }\n\n if (!options.bind || options.bind.length === 0) {\n console.error(\"Please specify --bind <channel>[:<account>]\");\n process.exit(1);\n }\n\n for (const bindSpec of options.bind) {\n const [channel, ...rest] = bindSpec.split(\":\");\n const accountId = rest.join(\":\");\n\n const validChannels = [\"H5\", \"WEB\", \"KLPA\", \"CRON\"];\n if (!validChannels.includes(channel)) {\n console.error(`Invalid channel: ${channel}`);\n console.error(`Valid channels: ${validChannels.join(\", \")}`);\n process.exit(1);\n }\n\n const binding: AgentBinding = {\n agentId,\n match: {\n channel: channel as \"H5\" | \"WEB\" | \"KLPA\" | \"CRON\",\n accountId: accountId || undefined,\n },\n };\n\n await addBinding(dataDir, binding);\n console.log(`Binding added: ${bindSpec} -> ${agentId}`);\n }\n };\n}\n\n/**\n * Unbinds a channel from an agent.\n */\nfunction agentsUnbindAction(options: {\n agent?: string;\n bind?: string[];\n all?: boolean;\n}) {\n return async (dataDir: string) => {\n const config = await loadAgentsConfig(dataDir);\n const agentId = options.agent ?? resolveDefaultAgentId(config);\n\n // 验证 agent 存在\n if (!getAgentConfig(config, agentId)) {\n console.error(`Agent \"${agentId}\" not found.`);\n process.exit(1);\n }\n\n if (options.all) {\n // 删除该 agent 的所有绑定\n const removed = await removeBindings(dataDir, agentId, \"*\");\n console.log(`Removed ${removed} binding(s) for agent \"${agentId}\".`);\n } else if (options.bind && options.bind.length > 0) {\n // 删除指定绑定\n let totalRemoved = 0;\n for (const bindSpec of options.bind) {\n const [channel, ...rest] = bindSpec.split(\":\");\n const accountId = rest.join(\":\");\n\n const removed = await removeBindings(\n dataDir,\n agentId,\n channel,\n accountId || undefined,\n );\n if (removed > 0) {\n console.log(`Binding removed: ${bindSpec} -> ${agentId}`);\n totalRemoved += removed;\n } else {\n console.log(`No binding found: ${bindSpec} -> ${agentId}`);\n }\n }\n } else {\n console.error('Please specify --bind <channel>[:<account>] or --all');\n process.exit(1);\n }\n };\n}\n\n/**\n * Lists routing bindings.\n */\nfunction agentsBindingsAction(options: {\n agent?: string;\n json?: boolean;\n}) {\n return async (dataDir: string) => {\n const config = await loadAgentsConfig(dataDir);\n let bindings = listBindings(config);\n\n if (options.agent) {\n bindings = bindings.filter((b) => b.agentId === options.agent);\n }\n\n if (options.json) {\n console.log(JSON.stringify(bindings, null, 2));\n return;\n }\n\n if (bindings.length === 0) {\n console.log(\"No bindings configured.\");\n return;\n }\n\n console.log(\"Routing bindings:\");\n for (const binding of bindings) {\n console.log(` ${describeBinding(binding)}`);\n }\n };\n}\n\n/**\n * Sets agent identity.\n */\nfunction agentsSetIdentityAction(options: {\n agent?: string;\n name?: string;\n emoji?: string;\n avatar?: string;\n}) {\n return async (dataDir: string) => {\n const config = await loadAgentsConfig(dataDir);\n const agentId = options.agent ?? resolveDefaultAgentId(config);\n\n // 验证 agent 存在\n if (!getAgentConfig(config, agentId)) {\n console.error(`Agent \"${agentId}\" not found.`);\n process.exit(1);\n }\n\n const updated = await updateAgentIdentity(dataDir, agentId, {\n name: options.name,\n emoji: options.emoji,\n avatar: options.avatar,\n });\n\n if (!updated) {\n console.error(`Failed to update identity for agent \"${agentId}\".`);\n process.exit(1);\n }\n\n console.log(`Identity updated for agent \"${agentId}\".`);\n };\n}\n\n/**\n * Registers all agents subcommands with the program.\n */\nexport function registerAgentsCommands(\n program: Command,\n getDataDir: () => string,\n): void {\n const agentsCmd = program\n .command(\"agents\")\n .description(\"Manage agents\");\n\n // agents list\n agentsCmd\n .command(\"list\")\n .description(\"List all configured agents\")\n .option(\"-j, --json\", \"Output as JSON\")\n .option(\"-b, --bindings\", \"Show detailed binding rules\")\n .action(async (opts) => {\n const dataDir = getDataDir();\n await agentsListAction(opts)(dataDir);\n });\n\n // agents add\n agentsCmd\n .command(\"add <id>\")\n .description(\"Add a new agent\")\n .option(\"-n, --name <name>\", \"Display name\")\n .option(\"-m, --model <model>\", \"Model identifier\")\n .option(\"--default\", \"Mark as default agent\")\n .action(async (id, opts) => {\n const dataDir = getDataDir();\n await agentsAddAction(id, opts)(dataDir);\n });\n\n // agents delete\n agentsCmd\n .command(\"delete <id>\")\n .description(\"Delete an agent\")\n .action(async (id) => {\n const dataDir = getDataDir();\n await agentsDeleteAction(id)(dataDir);\n });\n\n // agents bind\n agentsCmd\n .command(\"bind\")\n .description(\"Bind a channel to an agent\")\n .option(\"-a, --agent <id>\", \"Target agent ID\")\n .option(\"-b, --bind <channel...>\", \"Channel binding (e.g., WEB, KLPA:ops)\")\n .action(async (opts) => {\n const dataDir = getDataDir();\n await agentsBindAction(opts)(dataDir);\n });\n\n // agents unbind\n agentsCmd\n .command(\"unbind\")\n .description(\"Unbind a channel from an agent\")\n .option(\"-a, --agent <id>\", \"Target agent ID\")\n .option(\"-b, --bind <channel...>\", \"Channel binding to remove\")\n .option(\"--all\", \"Remove all bindings for the agent\")\n .action(async (opts) => {\n const dataDir = getDataDir();\n await agentsUnbindAction(opts)(dataDir);\n });\n\n // agents bindings\n agentsCmd\n .command(\"bindings\")\n .description(\"List routing bindings\")\n .option(\"-a, --agent <id>\", \"Filter by agent ID\")\n .option(\"-j, --json\", \"Output as JSON\")\n .action(async (opts) => {\n const dataDir = getDataDir();\n await agentsBindingsAction(opts)(dataDir);\n });\n\n // agents set-identity\n agentsCmd\n .command(\"set-identity\")\n .description(\"Set agent identity\")\n .option(\"-a, --agent <id>\", \"Target agent ID\")\n .option(\"-n, --name <name>\", \"Agent name\")\n .option(\"-e, --emoji <emoji>\", \"Agent emoji\")\n .option(\"--avatar <path>\", \"Avatar path\")\n .action(async (opts) => {\n const dataDir = getDataDir();\n await agentsSetIdentityAction(opts)(dataDir);\n });\n}\n","import type { Command } from \"commander\";\nimport path from \"node:path\";\nimport {\n initializePluginSystem,\n normalizePluginsConfig,\n type PluginsConfig,\n type PluginRecord,\n} from \"@pingclaw/agents\";\nimport { loadPluginsConfig, savePluginsConfig } from \"../plugins-config.js\";\nimport { writeError, writeLine } from \"../output.js\";\n\nfunction resolveWorkspaceDir(dataDir: string): string {\n return path.join(dataDir, \"workspace\");\n}\n\nfunction resolveBundledDir(): string | undefined {\n const raw = process.env.PINGCLAW_PLUGINS_BUNDLED_DIR;\n return raw ? raw.trim() || undefined : undefined;\n}\n\nfunction printPluginList(records: PluginRecord[]): void {\n if (records.length === 0) {\n writeLine(\"No plugins discovered.\");\n return;\n }\n for (const record of records) {\n const status = record.status.padEnd(8, \" \");\n writeLine(`${record.id} ${status} ${record.origin} ${record.source}`);\n }\n}\n\nfunction printPluginInfo(record: PluginRecord): void {\n writeLine(`id: ${record.id}`);\n writeLine(`status: ${record.status}`);\n writeLine(`origin: ${record.origin}`);\n writeLine(`source: ${record.source}`);\n writeLine(`enabled: ${record.enabled}`);\n if (record.error) {\n writeLine(`error: ${record.error}`);\n }\n writeLine(`tools: ${record.toolCount}`);\n writeLine(`hooks: ${record.hookCount}`);\n if (record.skills.length > 0) {\n writeLine(`skills: ${record.skills.join(\", \")}`);\n }\n}\n\nfunction normalizeAllowlist(list: string[] | undefined): string[] {\n return Array.from(\n new Set((list ?? []).map((entry) => entry.trim()).filter(Boolean)),\n );\n}\n\nfunction printAllowlist(list: string[]): void {\n if (list.length === 0) {\n writeLine(\"LLM allowlist is empty.\");\n return;\n }\n for (const entry of list) {\n writeLine(entry);\n }\n}\n\nexport function registerPluginsCommand(program: Command, getDataDir: () => string): void {\n const cmd = program.command(\"plugins\").description(\"Manage PingClaw plugins\");\n\n cmd\n .command(\"list\")\n .description(\"List discovered plugins\")\n .option(\"-d, --data-dir <path>\", \"Data directory path\")\n .action(async (options: { dataDir?: string }) => {\n const dataDir = options.dataDir ?? getDataDir();\n const config = await loadPluginsConfig(dataDir);\n const system = initializePluginSystem({\n config,\n dataDir,\n workspaceDir: resolveWorkspaceDir(dataDir),\n bundledDir: resolveBundledDir(),\n });\n printPluginList(system.registry.plugins);\n });\n\n cmd\n .command(\"info\")\n .description(\"Show plugin details\")\n .argument(\"<id>\", \"Plugin id\")\n .option(\"-d, --data-dir <path>\", \"Data directory path\")\n .action(async (id: string, options: { dataDir?: string }) => {\n const dataDir = options.dataDir ?? getDataDir();\n const config = await loadPluginsConfig(dataDir);\n const system = initializePluginSystem({\n config,\n dataDir,\n workspaceDir: resolveWorkspaceDir(dataDir),\n bundledDir: resolveBundledDir(),\n });\n const record = system.registry.plugins.find((entry) => entry.id === id);\n if (!record) {\n writeError(`Plugin not found: ${id}`);\n process.exit(1);\n }\n printPluginInfo(record);\n });\n\n cmd\n .command(\"enable\")\n .description(\"Enable a plugin\")\n .argument(\"<id>\", \"Plugin id\")\n .option(\"-d, --data-dir <path>\", \"Data directory path\")\n .action(async (id: string, options: { dataDir?: string }) => {\n const dataDir = options.dataDir ?? getDataDir();\n const config = (await loadPluginsConfig(dataDir)) ?? {};\n const normalized = normalizePluginsConfig(config);\n const system = initializePluginSystem({\n config,\n dataDir,\n workspaceDir: resolveWorkspaceDir(dataDir),\n bundledDir: resolveBundledDir(),\n });\n const exists = system.registry.plugins.some((entry) => entry.id === id);\n if (!exists) {\n writeError(`Plugin not found: ${id}`);\n process.exit(1);\n }\n const updated: PluginsConfig = {\n ...config,\n entries: {\n ...config.entries,\n [id]: { ...(config.entries?.[id] ?? {}), enabled: true },\n },\n };\n await savePluginsConfig(dataDir, updated);\n writeLine(`Enabled ${id}`);\n if (normalized.allow.length > 0 && !normalized.allow.includes(id)) {\n writeLine(\"Note: plugins.allow is set; add this plugin id to allowlist if needed.\");\n }\n });\n\n cmd\n .command(\"disable\")\n .description(\"Disable a plugin\")\n .argument(\"<id>\", \"Plugin id\")\n .option(\"-d, --data-dir <path>\", \"Data directory path\")\n .action(async (id: string, options: { dataDir?: string }) => {\n const dataDir = options.dataDir ?? getDataDir();\n const config = (await loadPluginsConfig(dataDir)) ?? {};\n const system = initializePluginSystem({\n config,\n dataDir,\n workspaceDir: resolveWorkspaceDir(dataDir),\n bundledDir: resolveBundledDir(),\n });\n const exists = system.registry.plugins.some((entry) => entry.id === id);\n if (!exists) {\n writeError(`Plugin not found: ${id}`);\n process.exit(1);\n }\n const updated: PluginsConfig = {\n ...config,\n entries: {\n ...config.entries,\n [id]: { ...(config.entries?.[id] ?? {}), enabled: false },\n },\n };\n await savePluginsConfig(dataDir, updated);\n writeLine(`Disabled ${id}`);\n });\n\n cmd\n .command(\"doctor\")\n .description(\"Validate plugin configuration\")\n .option(\"-d, --data-dir <path>\", \"Data directory path\")\n .action(async (options: { dataDir?: string }) => {\n const dataDir = options.dataDir ?? getDataDir();\n const config = await loadPluginsConfig(dataDir);\n const system = initializePluginSystem({\n config,\n dataDir,\n workspaceDir: resolveWorkspaceDir(dataDir),\n bundledDir: resolveBundledDir(),\n });\n if (system.diagnostics.length === 0) {\n writeLine(\"No plugin issues detected.\");\n return;\n }\n for (const diag of system.diagnostics) {\n const prefix = diag.level === \"error\" ? \"ERROR\" : \"WARN\";\n const id = diag.pluginId ? ` ${diag.pluginId}` : \"\";\n writeLine(`${prefix}${id}: ${diag.message}`);\n }\n const hasError = system.diagnostics.some((d) => d.level === \"error\");\n if (hasError) {\n process.exit(1);\n }\n });\n\n const llmCmd = cmd.command(\"llm-allow\").description(\"Manage plugin LLM allowlist\");\n\n llmCmd\n .command(\"list\")\n .description(\"List LLM allowlist entries\")\n .option(\"-d, --data-dir <path>\", \"Data directory path\")\n .action(async (options: { dataDir?: string }) => {\n const dataDir = options.dataDir ?? getDataDir();\n const config = await loadPluginsConfig(dataDir);\n const allowlist = normalizeAllowlist(config?.llmAllowlist);\n printAllowlist(allowlist);\n });\n\n llmCmd\n .command(\"add\")\n .description(\"Add entries to the LLM allowlist (plugin id or tool name)\")\n .argument(\"<entry...>\", \"Plugin id or tool name\")\n .option(\"-d, --data-dir <path>\", \"Data directory path\")\n .action(async (entries: string[], options: { dataDir?: string }) => {\n const dataDir = options.dataDir ?? getDataDir();\n const config = (await loadPluginsConfig(dataDir)) ?? {};\n const allowlist = normalizeAllowlist([...((config.llmAllowlist ?? [])), ...entries]);\n const updated: PluginsConfig = {\n ...config,\n llmAllowlist: allowlist,\n };\n await savePluginsConfig(dataDir, updated);\n writeLine(`LLM allowlist updated (${allowlist.length} entries).`);\n });\n\n llmCmd\n .command(\"remove\")\n .description(\"Remove entries from the LLM allowlist\")\n .argument(\"<entry...>\", \"Plugin id or tool name\")\n .option(\"-d, --data-dir <path>\", \"Data directory path\")\n .action(async (entries: string[], options: { dataDir?: string }) => {\n const dataDir = options.dataDir ?? getDataDir();\n const config = (await loadPluginsConfig(dataDir)) ?? {};\n const removeSet = new Set(entries.map((entry) => entry.trim()).filter(Boolean));\n const current = normalizeAllowlist(config.llmAllowlist);\n const allowlist = current.filter((entry) => !removeSet.has(entry));\n const updated: PluginsConfig = {\n ...config,\n llmAllowlist: allowlist,\n };\n await savePluginsConfig(dataDir, updated);\n writeLine(`LLM allowlist updated (${allowlist.length} entries).`);\n });\n\n llmCmd\n .command(\"clear\")\n .description(\"Clear the LLM allowlist\")\n .option(\"-d, --data-dir <path>\", \"Data directory path\")\n .action(async (options: { dataDir?: string }) => {\n const dataDir = options.dataDir ?? getDataDir();\n const config = (await loadPluginsConfig(dataDir)) ?? {};\n const updated: PluginsConfig = {\n ...config,\n llmAllowlist: [],\n };\n await savePluginsConfig(dataDir, updated);\n writeLine(\"LLM allowlist cleared.\");\n });\n}\n","/**\n * Commander program setup for @pingclaw/cli.\n * Exported separately from the binary entrypoint to allow unit testing.\n */\n\nimport { Command } from \"commander\";\nimport { registerBootstrapCommand } from \"./commands/bootstrap.js\";\nimport { registerRunCommand } from \"./commands/run.js\";\nimport { registerSessionsCommand } from \"./commands/sessions.js\";\nimport { registerMemoryCommand } from \"./commands/memory.js\";\nimport { registerAgentsCommands } from \"./commands/agents.js\";\nimport { registerPluginsCommand } from \"./commands/plugins.js\";\nimport { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst cliPackage = require(\"../package.json\") as { version: string };\n\n/**\n * Resolves the data directory from environment or current working directory.\n */\nexport function getDataDir(): string {\n return process.env.PINGCLAW_DATA_DIR || process.cwd();\n}\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"pingclaw\")\n .description(\"PingClaw CLI — runs agent tasks in a containerized environment\")\n .version(cliPackage.version);\n\n registerRunCommand(program);\n registerSessionsCommand(program);\n registerBootstrapCommand(program);\n registerMemoryCommand(program);\n registerAgentsCommands(program, getDataDir);\n registerPluginsCommand(program, getDataDir);\n\n return program;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gencode/cli",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "aimax": "./dist/bin.js"
@@ -20,7 +20,7 @@
20
20
  "dependencies": {
21
21
  "commander": "^14.0.3",
22
22
  "gensign-node": "latest",
23
- "@gencode/agents": "0.0.2"
23
+ "@gencode/agents": "0.0.3"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^22.0.0",