jinzd-ai-cli 0.4.181 → 0.4.183
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/{batch-DG5STMLZ.js → batch-V4KR6ENR.js} +2 -2
- package/dist/{chunk-D4ZTYYBU.js → chunk-2AZX76LV.js} +1 -1
- package/dist/{chunk-P2VFMUR5.js → chunk-3GZ7RYAP.js} +1 -1
- package/dist/{chunk-CPZ7KG3Y.js → chunk-A56C3L4P.js} +1 -1
- package/dist/{chunk-4VB6UP4W.js → chunk-ETGCCZBT.js} +1 -1
- package/dist/{chunk-ORXPLVM7.js → chunk-G44XZPNZ.js} +9 -3
- package/dist/{chunk-D774AWKW.js → chunk-JWT54N7I.js} +1 -1
- package/dist/{chunk-ZWQ36YFI.js → chunk-M5JHEB35.js} +1 -1
- package/dist/{chunk-6SY45V62.js → chunk-UCPHXAHM.js} +2 -2
- package/dist/{ci-UXVUG3LC.js → ci-NS7PR27C.js} +2 -2
- package/dist/{constants-5DFFSPWI.js → constants-EQ7ULMVF.js} +1 -1
- package/dist/{doctor-cli-GQBR6RI6.js → doctor-cli-VWYAVULH.js} +4 -4
- package/dist/electron-server.js +8 -2
- package/dist/{hub-N75OQVNY.js → hub-DBGEPDIE.js} +1 -1
- package/dist/index.js +234 -159
- package/dist/{run-tests-673ABQQE.js → run-tests-3FJMYYIU.js} +2 -2
- package/dist/{run-tests-HZVKHQ33.js → run-tests-UM2YUDTP.js} +1 -1
- package/dist/{server-SLDE3AML.js → server-3KIQK257.js} +7 -7
- package/dist/{server-RCUIX4R5.js → server-CESWZS3I.js} +4 -4
- package/dist/{task-orchestrator-42D5LBAX.js → task-orchestrator-2S5WM7GH.js} +4 -4
- package/package.json +1 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
ConfigManager
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-3GZ7RYAP.js";
|
|
5
5
|
import "./chunk-TZQHYZKT.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-A56C3L4P.js";
|
|
7
7
|
import "./chunk-PDX44BCA.js";
|
|
8
8
|
|
|
9
9
|
// src/cli/batch.ts
|
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
} from "./chunk-HDSKW7Q3.js";
|
|
6
6
|
import {
|
|
7
7
|
runTestsTool
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-2AZX76LV.js";
|
|
9
9
|
import {
|
|
10
10
|
runTool
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-ETGCCZBT.js";
|
|
12
12
|
import {
|
|
13
13
|
getDangerLevel,
|
|
14
14
|
isFileWriteTool
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
SUBAGENT_ALLOWED_TOOLS,
|
|
26
26
|
SUBAGENT_DEFAULT_MAX_ROUNDS,
|
|
27
27
|
SUBAGENT_MAX_ROUNDS_LIMIT
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-A56C3L4P.js";
|
|
29
29
|
import {
|
|
30
30
|
fileCheckpoints
|
|
31
31
|
} from "./chunk-4BKXL7SM.js";
|
|
@@ -5545,6 +5545,12 @@ var ToolRegistry = class {
|
|
|
5545
5545
|
listPluginTools() {
|
|
5546
5546
|
return [...this.tools.values()].filter((t) => this.pluginToolNames.has(t.definition.name));
|
|
5547
5547
|
}
|
|
5548
|
+
/** Returns only built-in tools (excludes plugin + MCP tools). */
|
|
5549
|
+
listBuiltinTools() {
|
|
5550
|
+
return [...this.tools.values()].filter(
|
|
5551
|
+
(t) => !this.pluginToolNames.has(t.definition.name) && !this.mcpToolNames.has(t.definition.name)
|
|
5552
|
+
);
|
|
5553
|
+
}
|
|
5548
5554
|
/** 注册一个 MCP 工具(名称以 mcp__ 开头) */
|
|
5549
5555
|
registerMcpTool(tool) {
|
|
5550
5556
|
this.tools.set(tool.definition.name, tool);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
truncateForPersist
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-G44XZPNZ.js";
|
|
5
5
|
import {
|
|
6
6
|
APP_NAME,
|
|
7
7
|
CONFIG_DIR_NAME,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
MCP_PROTOCOL_VERSION,
|
|
12
12
|
MCP_TOOL_PREFIX,
|
|
13
13
|
VERSION
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-A56C3L4P.js";
|
|
15
15
|
|
|
16
16
|
// src/mcp/client.ts
|
|
17
17
|
import { spawn } from "child_process";
|
|
@@ -10,11 +10,11 @@ import {
|
|
|
10
10
|
import "./chunk-HIU2SH4V.js";
|
|
11
11
|
import {
|
|
12
12
|
ConfigManager
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-3GZ7RYAP.js";
|
|
14
14
|
import "./chunk-TZQHYZKT.js";
|
|
15
15
|
import {
|
|
16
16
|
VERSION
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-A56C3L4P.js";
|
|
18
18
|
import "./chunk-PDX44BCA.js";
|
|
19
19
|
|
|
20
20
|
// src/cli/ci.ts
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
getConfigDirUsage,
|
|
4
4
|
listRecentCrashes
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-M5JHEB35.js";
|
|
6
6
|
import {
|
|
7
7
|
ProviderRegistry
|
|
8
8
|
} from "./chunk-5LK7H45B.js";
|
|
@@ -11,17 +11,17 @@ import {
|
|
|
11
11
|
getTopFailingTools,
|
|
12
12
|
getTopUsedTools,
|
|
13
13
|
resetStats
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-ETGCCZBT.js";
|
|
15
15
|
import "./chunk-HIU2SH4V.js";
|
|
16
16
|
import {
|
|
17
17
|
ConfigManager
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-3GZ7RYAP.js";
|
|
19
19
|
import "./chunk-TZQHYZKT.js";
|
|
20
20
|
import {
|
|
21
21
|
DEV_STATE_FILE_NAME,
|
|
22
22
|
MEMORY_FILE_NAME,
|
|
23
23
|
VERSION
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-A56C3L4P.js";
|
|
25
25
|
import "./chunk-PDX44BCA.js";
|
|
26
26
|
|
|
27
27
|
// src/diagnostics/doctor-cli.ts
|
package/dist/electron-server.js
CHANGED
|
@@ -36,7 +36,7 @@ import {
|
|
|
36
36
|
VERSION,
|
|
37
37
|
buildUserIdentityPrompt,
|
|
38
38
|
runTestsTool
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-JWT54N7I.js";
|
|
40
40
|
import {
|
|
41
41
|
hasSemanticIndex,
|
|
42
42
|
semanticSearch
|
|
@@ -9819,6 +9819,12 @@ var ToolRegistry = class {
|
|
|
9819
9819
|
listPluginTools() {
|
|
9820
9820
|
return [...this.tools.values()].filter((t) => this.pluginToolNames.has(t.definition.name));
|
|
9821
9821
|
}
|
|
9822
|
+
/** Returns only built-in tools (excludes plugin + MCP tools). */
|
|
9823
|
+
listBuiltinTools() {
|
|
9824
|
+
return [...this.tools.values()].filter(
|
|
9825
|
+
(t) => !this.pluginToolNames.has(t.definition.name) && !this.mcpToolNames.has(t.definition.name)
|
|
9826
|
+
);
|
|
9827
|
+
}
|
|
9822
9828
|
/** 注册一个 MCP 工具(名称以 mcp__ 开头) */
|
|
9823
9829
|
registerMcpTool(tool) {
|
|
9824
9830
|
this.tools.set(tool.definition.name, tool);
|
|
@@ -13844,7 +13850,7 @@ ${undoResults.map((r) => ` \u2022 ${r}`).join("\n")}` });
|
|
|
13844
13850
|
case "test": {
|
|
13845
13851
|
this.send({ type: "info", message: "\u{1F9EA} Running tests..." });
|
|
13846
13852
|
try {
|
|
13847
|
-
const { executeTests } = await import("./run-tests-
|
|
13853
|
+
const { executeTests } = await import("./run-tests-UM2YUDTP.js");
|
|
13848
13854
|
const argStr = args.join(" ").trim();
|
|
13849
13855
|
let testArgs = {};
|
|
13850
13856
|
if (argStr) {
|
|
@@ -155,7 +155,7 @@ ${content}`);
|
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
157
|
async function runTaskMode(config, providers, configManager, topic) {
|
|
158
|
-
const { TaskOrchestrator } = await import("./task-orchestrator-
|
|
158
|
+
const { TaskOrchestrator } = await import("./task-orchestrator-2S5WM7GH.js");
|
|
159
159
|
const orchestrator = new TaskOrchestrator(config, providers, configManager);
|
|
160
160
|
let interrupted = false;
|
|
161
161
|
const onSigint = () => {
|
package/dist/index.js
CHANGED
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
saveDevState,
|
|
19
19
|
sessionHasMeaningfulContent,
|
|
20
20
|
setupProxy
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-UCPHXAHM.js";
|
|
22
22
|
import {
|
|
23
23
|
ToolExecutor,
|
|
24
24
|
ToolRegistry,
|
|
@@ -37,10 +37,10 @@ import {
|
|
|
37
37
|
spawnAgentContext,
|
|
38
38
|
theme,
|
|
39
39
|
undoStack
|
|
40
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-G44XZPNZ.js";
|
|
41
41
|
import "./chunk-HDSKW7Q3.js";
|
|
42
42
|
import "./chunk-ZWVIDFGY.js";
|
|
43
|
-
import "./chunk-
|
|
43
|
+
import "./chunk-2AZX76LV.js";
|
|
44
44
|
import {
|
|
45
45
|
SessionManager,
|
|
46
46
|
getContentText
|
|
@@ -49,7 +49,7 @@ import {
|
|
|
49
49
|
getConfigDirUsage,
|
|
50
50
|
listRecentCrashes,
|
|
51
51
|
writeCrashLog
|
|
52
|
-
} from "./chunk-
|
|
52
|
+
} from "./chunk-M5JHEB35.js";
|
|
53
53
|
import {
|
|
54
54
|
BudgetWarner,
|
|
55
55
|
CONTENT_ONLY_STREAM_REMINDER,
|
|
@@ -85,11 +85,11 @@ import {
|
|
|
85
85
|
getTopFailingTools,
|
|
86
86
|
getTopUsedTools,
|
|
87
87
|
installFlushOnExit
|
|
88
|
-
} from "./chunk-
|
|
88
|
+
} from "./chunk-ETGCCZBT.js";
|
|
89
89
|
import "./chunk-HIU2SH4V.js";
|
|
90
90
|
import {
|
|
91
91
|
ConfigManager
|
|
92
|
-
} from "./chunk-
|
|
92
|
+
} from "./chunk-3GZ7RYAP.js";
|
|
93
93
|
import {
|
|
94
94
|
AuthError,
|
|
95
95
|
ProviderError,
|
|
@@ -116,7 +116,7 @@ import {
|
|
|
116
116
|
SKILLS_DIR_NAME,
|
|
117
117
|
VERSION,
|
|
118
118
|
buildUserIdentityPrompt
|
|
119
|
-
} from "./chunk-
|
|
119
|
+
} from "./chunk-A56C3L4P.js";
|
|
120
120
|
import {
|
|
121
121
|
formatGitContextForPrompt,
|
|
122
122
|
getGitContext,
|
|
@@ -224,6 +224,68 @@ function fmtContextWindow(tokens) {
|
|
|
224
224
|
if (tokens >= 1e3) return `${Math.round(tokens / 1024)}K`;
|
|
225
225
|
return `${tokens}`;
|
|
226
226
|
}
|
|
227
|
+
var ABOUT_TOOL_DESCRIPTIONS = {
|
|
228
|
+
bash: "Execute shell commands (PowerShell/bash, UTF-8 on Windows)",
|
|
229
|
+
read_file: "Read file contents",
|
|
230
|
+
write_file: "Write to file (danger level: write, requires confirmation)",
|
|
231
|
+
edit_file: "Edit file via exact string replacement / unified-diff patch",
|
|
232
|
+
list_dir: "List directory contents",
|
|
233
|
+
grep_files: "Search file contents with regex",
|
|
234
|
+
glob_files: "Match file paths by glob pattern",
|
|
235
|
+
run_interactive: "Run programs requiring stdin interaction (direct spawn)",
|
|
236
|
+
web_fetch: "Fetch web content (converted to Markdown, 2MB cap)",
|
|
237
|
+
web_search: "Keyless web search (Bing/Google scrape, structured results)",
|
|
238
|
+
google_search: "Google search (requires API Key + CX config)",
|
|
239
|
+
save_last_response: "Save AI response to file (tee streaming to disk)",
|
|
240
|
+
save_memory: "Persist info to ~/.aicli/memory.md, auto-injected across sessions",
|
|
241
|
+
ask_user: "Ask the user a question and wait for an answer mid-loop",
|
|
242
|
+
write_todos: "Break tasks into a subtask list with live progress display",
|
|
243
|
+
spawn_agent: "Delegate to an independent sub-agent (isolated tool-call loop)",
|
|
244
|
+
run_tests: "Run project tests, structured report (Maven/npm/pytest auto-detect)",
|
|
245
|
+
task_create: "Start a command running in the background",
|
|
246
|
+
task_list: "List background tasks and their status/output",
|
|
247
|
+
task_stop: "Stop a running background task",
|
|
248
|
+
git_status: "Show working tree status (branch, staged, modified, untracked)",
|
|
249
|
+
git_diff: "Show file diffs (staged/unstaged, stat summary)",
|
|
250
|
+
git_log: "Show commit history (oneline/full, filter by file/author)",
|
|
251
|
+
git_commit: "Create a git commit (stage files, message, stage_all)",
|
|
252
|
+
notebook_edit: "Edit Jupyter notebook cells (add/edit/delete/move)",
|
|
253
|
+
find_symbol: "Locate symbol definitions via tree-sitter index (8 languages)",
|
|
254
|
+
get_outline: "Enumerate all top-level declarations in one source file",
|
|
255
|
+
find_references: "Search indexed files for references to a symbol name",
|
|
256
|
+
search_code: "Semantic (meaning-based) code search via local embeddings",
|
|
257
|
+
recall_memory: 'Semantic recall over past chat sessions ("remember when\u2026")'
|
|
258
|
+
};
|
|
259
|
+
var ABOUT_FEATURES = [
|
|
260
|
+
"Agentic loop: up to 200 tool-call rounds (configurable), final answer streamed",
|
|
261
|
+
"Multimodal input: @filepath inlines images (base64) or text into messages",
|
|
262
|
+
"Git context awareness: branch + file-change status auto-injected on startup",
|
|
263
|
+
"Project context files: auto-load AICLI.md / CLAUDE.md (global/project/subdir)",
|
|
264
|
+
"Plan Mode: /plan read-only planning with safe tools, /plan execute resumes",
|
|
265
|
+
'Headless mode: aicli -p "\u2026" non-interactive, stdin pipe + --json / NDJSON output',
|
|
266
|
+
"Context auto-management: token estimate, auto-compact above 80%, /compact + smart trim",
|
|
267
|
+
"Prompt caching: system prompt split stable/volatile \u2014 Claude caches the stable half",
|
|
268
|
+
"Provider retry + fallback chain: backoff on transient errors, walk config.fallback",
|
|
269
|
+
"Smart model routing: /route per-message model override by tag/keyword/length rules",
|
|
270
|
+
"Sub-agents: spawn_agent delegates complex subtasks to an isolated tool-call loop",
|
|
271
|
+
"Agent Skills: ~/.aicli/skills/ reusable packs (system prompt + tool whitelist)",
|
|
272
|
+
"MCP protocol: connect external MCP server tools; aicli mcp-serve reverses aicli into a server",
|
|
273
|
+
"Plugin system: ~/.aicli/plugins/*.js custom tools (allowPlugins, off by default)",
|
|
274
|
+
"Permission rules + hooks: auto-approve/deny/confirm + pre/post tool execution hooks",
|
|
275
|
+
"User identity (/profile): persistent profile injected into every provider",
|
|
276
|
+
"Symbol + semantic code index: find_symbol/get_outline/find_references/search_code (8 languages)",
|
|
277
|
+
"Chat memory recall: semantic index over past sessions + recall_memory tool",
|
|
278
|
+
"Session tooling: /checkpoint, /fork, /branch (diff/cherry-pick), /rewind, /session show|page|remove",
|
|
279
|
+
"Session Replay \u{1F3AC} + Web UI: timeline of every message, tool call, reasoning, token usage",
|
|
280
|
+
"Cross-session search (/search) + sensitive-data redaction before anything hits disk",
|
|
281
|
+
"Cost dashboard: /cost history \u2014 daily/weekly/monthly spend with budget progress",
|
|
282
|
+
"File operation undo (/undo) for write_file / edit_file / bash-created files",
|
|
283
|
+
"Multi-Agent Hub: aicli hub \u2014 mixed-model debate, --steer, --vote, Web UI room",
|
|
284
|
+
"aicli ci: headless PR review for GitHub Actions (posts/updates one comment, CI gate)",
|
|
285
|
+
"Anthropic Batches API: aicli batch submit/list/status/results/cancel (50% off, 24h)",
|
|
286
|
+
"Theme customization + full semantic-color coverage (dark/light/custom)",
|
|
287
|
+
"Standalone executable packaging (no Node.js required), Electron desktop app"
|
|
288
|
+
];
|
|
227
289
|
var SPINNER_FRAMES = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
|
|
228
290
|
function createSpinner(text) {
|
|
229
291
|
if (!process.stdout.isTTY) {
|
|
@@ -324,9 +386,18 @@ var Renderer = class {
|
|
|
324
386
|
console.log(theme.dim(" Commands : ") + theme.dim("/help \xB7 /about \xB7 /profile \xB7 Ctrl+C to exit"));
|
|
325
387
|
console.log();
|
|
326
388
|
}
|
|
327
|
-
|
|
389
|
+
/**
|
|
390
|
+
* /about — 项目门面。
|
|
391
|
+
*
|
|
392
|
+
* v0.4.183: 计数与清单一律从 live registry 派生(曾硬编码 "30 工具 / 45 命令"
|
|
393
|
+
* + 手敲命令名块,每次发版都漂)。功能墙砍掉逐版历史尾巴,只留常青能力描述,
|
|
394
|
+
* 末尾指向 CHANGELOG.md(与 v0.4.177 给 CLAUDE.md 瘦身同一思路——/about 是
|
|
395
|
+
* 展示台,CHANGELOG 才是版本史的权威记录)。
|
|
396
|
+
*/
|
|
397
|
+
printAbout(opts) {
|
|
398
|
+
const { pluginCount = 0, mcpInfo, builtinTools, commandNames } = opts;
|
|
328
399
|
const HR = theme.dim(" " + "\u2500".repeat(56));
|
|
329
|
-
const label = (s) => theme.dim(` ${s.padEnd(
|
|
400
|
+
const label = (s) => theme.dim(` ${s.padEnd(7)}`);
|
|
330
401
|
const tool = (name, desc) => theme.accent(` ${name.padEnd(22)}`) + theme.dim(desc);
|
|
331
402
|
const feat = (s) => theme.dim(" \u2726 ") + chalk.white(s);
|
|
332
403
|
console.log();
|
|
@@ -342,149 +413,29 @@ var Renderer = class {
|
|
|
342
413
|
console.log(theme.dim(" Gemini (Google) \xB7 Zhipu (GLM) \xB7 OpenRouter \xB7 Ollama (Local, no API key)"));
|
|
343
414
|
console.log(HR);
|
|
344
415
|
const mcpToolCount = mcpInfo?.tools ?? 0;
|
|
345
|
-
const toolTotal =
|
|
416
|
+
const toolTotal = builtinTools.length + pluginCount + mcpToolCount;
|
|
346
417
|
const extras = [];
|
|
347
418
|
if (pluginCount > 0) extras.push(`${pluginCount} plugin(s)`);
|
|
348
419
|
if (mcpToolCount > 0) extras.push(`${mcpToolCount} MCP`);
|
|
349
420
|
const toolLabel = extras.length > 0 ? `, incl. ${extras.join(" + ")}` : ", extensible via plugins/MCP";
|
|
350
421
|
console.log(theme.dim(` Agentic Tools (${toolTotal}${toolLabel}):`));
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
console.log(tool("grep_files", "Search file contents with regex"));
|
|
357
|
-
console.log(tool("glob_files", "Match file paths by glob pattern"));
|
|
358
|
-
console.log(tool("run_interactive", "Run programs requiring stdin interaction (direct spawn)"));
|
|
359
|
-
console.log(tool("web_fetch", "Fetch web content (converted to Markdown)"));
|
|
360
|
-
console.log(tool("web_search", "Search web via Bing/Google scraping \u2014 no API key, structured {title,url,snippet} results (v0.4.135+)"));
|
|
361
|
-
console.log(tool("google_search", "Google search (requires API Key + CX config)"));
|
|
362
|
-
console.log(tool("save_last_response", "Save AI response to file (tee streaming to disk)"));
|
|
363
|
-
console.log(tool("save_memory", "Persist important info to ~/.aicli/memory.md, auto-injected across sessions"));
|
|
364
|
-
console.log(tool("ask_user", "Ask user a question and wait for answer (clarification in agentic loop)"));
|
|
365
|
-
console.log(tool("write_todos", "Break tasks into subtask list with real-time progress display"));
|
|
366
|
-
console.log(tool("spawn_agent", "Delegate to independent sub-agent (isolated dialog + auto tool-call loop)"));
|
|
367
|
-
console.log(tool("run_tests", "Run project tests and return structured report (auto-detect Maven/npm/pytest etc.)"));
|
|
368
|
-
console.log(tool("task_create", "Start a command running in the background"));
|
|
369
|
-
console.log(tool("task_list", "List background tasks and their status/output"));
|
|
370
|
-
console.log(tool("task_stop", "Stop a running background task"));
|
|
371
|
-
console.log(tool("git_status", "Show working tree status (branch, staged, modified, untracked)"));
|
|
372
|
-
console.log(tool("git_diff", "Show file diffs (staged/unstaged, stat summary)"));
|
|
373
|
-
console.log(tool("git_log", "Show commit history (oneline/full, filter by file/author)"));
|
|
374
|
-
console.log(tool("git_commit", "Create a git commit (stage files, message, stage_all)"));
|
|
375
|
-
console.log(tool("notebook_edit", "Edit Jupyter notebook cells (add/edit/delete/move)"));
|
|
376
|
-
console.log(tool("find_symbol", "Locate symbol definitions via persistent tree-sitter index (TS/JS/TSX/Python/Go/Rust/Java/C++)"));
|
|
377
|
-
console.log(tool("get_outline", "Enumerate all top-level declarations in one source file"));
|
|
378
|
-
console.log(tool("find_references", "Search indexed files for references to a symbol name"));
|
|
379
|
-
console.log(tool("search_code", 'Semantic (meaning-based) code search via local embeddings \u2014 "grep by meaning", bilingual'));
|
|
380
|
-
console.log(tool("recall_memory", 'Semantic recall over past chat sessions \u2014 "remember when we discussed X" across history (v0.4.89+)'));
|
|
422
|
+
for (const { name, description } of builtinTools) {
|
|
423
|
+
const curated = ABOUT_TOOL_DESCRIPTIONS[name];
|
|
424
|
+
const desc = curated ?? (description.length > 90 ? description.slice(0, 89) + "\u2026" : description);
|
|
425
|
+
console.log(tool(name, desc));
|
|
426
|
+
}
|
|
381
427
|
console.log(HR);
|
|
382
|
-
console.log(theme.dim(
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
console.log(theme.dim(" /diff /fork /branch /index /yolo /snapshot /exit"));
|
|
428
|
+
console.log(theme.dim(` REPL Commands (${commandNames.length}):`));
|
|
429
|
+
const withSlash = commandNames.map((n) => `/${n}`);
|
|
430
|
+
const perRow = 8;
|
|
431
|
+
for (let i = 0; i < withSlash.length; i += perRow) {
|
|
432
|
+
console.log(theme.dim(" " + withSlash.slice(i, i + perRow).join(" ")));
|
|
433
|
+
}
|
|
389
434
|
console.log(HR);
|
|
390
435
|
console.log(theme.dim(" Key Features:"));
|
|
391
|
-
console.log(feat(
|
|
392
|
-
console.log(
|
|
393
|
-
console.log(
|
|
394
|
-
console.log(feat("Project context files: auto-load AICLI.md / CLAUDE.md (3 levels: global/project/subdir)"));
|
|
395
|
-
console.log(feat("Cross-session full-text history search (/search <keyword>)"));
|
|
396
|
-
console.log(feat("File operation undo (/undo [list|<n>], supports write_file / edit_file / bash-created files/dirs)"));
|
|
397
|
-
console.log(feat("Thinking mode collapse (<think> blocks auto-collapsed, GLM-5 etc.)"));
|
|
398
|
-
console.log(feat("Token usage tracking (per-response + session cumulative, Gemini/Claude/DeepSeek etc.)"));
|
|
399
|
-
console.log(feat("User identity (/profile): persistent profile injected into every AI provider \u2014 AI knows who you are"));
|
|
400
|
-
console.log(feat("MCP protocol support: connect external MCP server tools (config.json mcpServers)"));
|
|
401
|
-
console.log(feat("Plugin system: ~/.aicli/plugins/*.js custom tools (requires allowPlugins:true, off by default)"));
|
|
402
|
-
console.log(feat("Plan Mode: /plan enters read-only planning, AI uses safe tools only, /plan execute resumes"));
|
|
403
|
-
console.log(feat('Headless mode: aicli -p "..." single-round non-interactive, supports stdin pipe and --json output'));
|
|
404
|
-
console.log(feat("/compact context compression: generate summary replacing old messages, keep last 4, solve context overflow"));
|
|
405
|
-
console.log(feat("Kimi tool-call reliability: XML pseudo-calls auto-detected and converted to real API calls (v0.1.19)"));
|
|
406
|
-
console.log(feat("Sub-Agent: spawn_agent delegates to independent sub-agent with isolated loop for complex subtasks"));
|
|
407
|
-
console.log(feat("Agent Skills: ~/.aicli/skills/ reusable skill packs, inject system prompt + tool whitelist"));
|
|
408
|
-
console.log(feat("/init project initialization: scan project structure, AI generates AICLI.md context file"));
|
|
409
|
-
console.log(feat("Multi-file edit preview: batch diff preview + selective approve/reject"));
|
|
410
|
-
console.log(feat("Hooks system: pre/post tool execution hooks (shell commands, template variable substitution)"));
|
|
411
|
-
console.log(feat("Permission Rules: rule-based tool permission control (auto-approve/deny/confirm)"));
|
|
412
|
-
console.log(feat("Checkpointing: /checkpoint save/restore/list/delete session checkpoints"));
|
|
413
|
-
console.log(feat("/review code review: read git diff, AI generates structured review comments"));
|
|
414
|
-
console.log(feat("Custom Commands: ~/.aicli/commands/*.md user-defined REPL commands"));
|
|
415
|
-
console.log(feat("Tab auto-completion: command names/subcommand args/@file paths, press Tab to trigger"));
|
|
416
|
-
console.log(feat("Streaming token count: inline display of exact/estimated token count after stream ends"));
|
|
417
|
-
console.log(feat("Context auto-management: estimate token usage, auto-compact above 80%, /status shows percentage"));
|
|
418
|
-
console.log(feat("run_tests tool: auto-detect project type, run tests, JUnit XML parsing, structured report"));
|
|
419
|
-
console.log(feat("/scaffold: describe project requirements, AI uses tools to auto-create full project skeleton"));
|
|
420
|
-
console.log(feat("Standalone executable packaging (~56MB, no Node.js required)"));
|
|
421
|
-
console.log(feat("Parallel tool calls: safe-level tools run via Promise.all(), improving batch efficiency"));
|
|
422
|
-
console.log(feat("/add-dir dynamic directory context: inject dir tree + file contents into AI context at runtime (40K char limit)"));
|
|
423
|
-
console.log(feat("/memory command: view/manually append/clear memory.md, supplement AI long-term memory"));
|
|
424
|
-
console.log(feat("/doctor health check: diagnose API keys, config file, MCP connections and context usage"));
|
|
425
|
-
console.log(feat("--allowed-tools / --blocked-tools: whitelist/blacklist AI available tools at startup"));
|
|
426
|
-
console.log(feat("/bug feedback: generate bug report template with system info, --copy to clipboard"));
|
|
427
|
-
console.log(feat("--output-format streaming-json: headless NDJSON per-chunk output for scripts/CI"));
|
|
428
|
-
console.log(feat("Desktop notifications: system notification when AI task exceeds threshold (default 10s, macOS/Win/Linux)"));
|
|
429
|
-
console.log(feat("Project-level .mcp.json: place MCP config in project root, auto-merge with global, /mcp shows source"));
|
|
430
|
-
console.log(feat("--resume <id>: restore a specific session on CLI startup, supports prefix matching"));
|
|
431
|
-
console.log(feat("Word wrap config: config.ui.wordWrap sets terminal output wrap width (0=auto)"));
|
|
432
|
-
console.log(feat("Theme customization: config.ui.theme dark/light/custom + colors custom color slots"));
|
|
433
|
-
console.log(feat("Extended Thinking: Claude deep reasoning mode, /think runtime toggle, thinking block collapse"));
|
|
434
|
-
console.log(feat("Full theme coverage: all terminal output uses semantic color slots, dark/light/custom one-click switch"));
|
|
435
|
-
console.log(feat('edit_file smart hints: show "did you mean" similar lines on mismatch + ignore_whitespace tolerance'));
|
|
436
|
-
console.log(feat("/config set|get|show: quick config read/write in REPL, no wizard needed (dot-path + auto type conversion)"));
|
|
437
|
-
console.log(feat("Streaming final answer in tool calls: typewriter-style chunked output, zero extra API calls, Escape to interrupt"));
|
|
438
|
-
console.log(feat("/diff command: show aggregated diff of all file modifications in current session (merge multi-edit per file)"));
|
|
439
|
-
console.log(feat("/fork conversation branch: fork from current position or checkpoint into new session, explore alternatives"));
|
|
440
|
-
console.log(feat("Streaming Tool Use: real-time text streaming + instant tool name display in agentic loop (OpenAI/Claude)"));
|
|
441
|
-
console.log(feat("User interjection: type a message + Enter during agentic loop to redirect AI mid-execution"));
|
|
442
|
-
console.log(feat("Multi-Agent Hub: aicli hub \u2014 multiple AI roles discuss/brainstorm with round-robin turns"));
|
|
443
|
-
console.log(feat("Hub distributed mode: aicli hub --distributed + aicli join \u2014 multi-process via WebSocket"));
|
|
444
|
-
console.log(feat("Human participation: aicli join --human \u2014 real person joins multi-agent discussion"));
|
|
445
|
-
console.log(feat("Context injection: aicli hub -c doc.md \u2014 inject external documents for all agents"));
|
|
446
|
-
console.log(feat("Task Mode: aicli hub --task \u2014 agents plan, write code, and execute with tools (plan\u2192approve\u2192execute\u2192review)"));
|
|
447
|
-
console.log(feat("Ollama local models: built-in provider, no API key, auto-discovers installed models via /v1/models"));
|
|
448
|
-
console.log(feat("MCP tool budget: auto-trim MCP tool definitions when exceeding 20% context window, prioritize used tools"));
|
|
449
|
-
console.log(feat("Smart compact: tool-history-aware compression preserves full tool call rounds (no mid-round splits)"));
|
|
450
|
-
console.log(feat("Session size control: auto-trim old tool output when session exceeds 2MB, keep recent rounds intact"));
|
|
451
|
-
console.log(feat("Crash recovery: detect incomplete agentic loops on /resume, warn and offer continuation"));
|
|
452
|
-
console.log(feat("Cost dashboard: /cost history shows cross-session daily/weekly/monthly spend with budget progress bar"));
|
|
453
|
-
console.log(feat("Prompt caching (A1, v0.4.70+): system prompt split into stable/volatile \u2014 Claude caches stable half, 10% cost on hits"));
|
|
454
|
-
console.log(feat("edit_file patch mode (A2, v0.4.72+): accepts unified diff (@@ hunks) \u2014 most compact for scattered small changes in large files"));
|
|
455
|
-
console.log(feat("Anthropic Batches API (A3, v0.4.73+): aicli batch submit/list/status/results/cancel \u2014 50% off, 24h window"));
|
|
456
|
-
console.log(feat("Session Replay (B1, v0.4.71+): Web UI \u{1F3AC} button \u2014 timeline view of every message, tool call, reasoning, and cache-aware token usage"));
|
|
457
|
-
console.log(feat("Conversation Branching (B2, v0.4.74+): /branch list/new/switch/delete/rename \u2014 fork the conversation at any message; Web UI replay \u{1F33F} fork-here button"));
|
|
458
|
-
console.log(feat("Branch tree sidebar (B2 polish, v0.4.75+): Web UI \u{1F33F} Branches tab with tree-indented picker, click to switch, hover to rename/delete, + Fork button"));
|
|
459
|
-
console.log(feat("Cross-branch ops (B3, v0.4.80+): /branch diff and /branch cherry-pick \u2014 compare branches and pick messages across forks; v0.4.81 accepts id/title/prefix"));
|
|
460
|
-
console.log(feat("MCP Server mode (E1, v0.4.84+): aicli mcp-serve \u2014 reverse aicli into an MCP server so Claude Desktop/Cursor/any MCP client can use its 28 built-in tools (excluding ask_user/spawn_agent which need interactive stdin)"));
|
|
461
|
-
console.log(feat("Session sensitive-data redaction (v0.4.88+): unified redactor scrubs passwords/tokens/keys from every message before it hits disk; /security status and scan to audit"));
|
|
462
|
-
console.log(feat('Chat memory recall (B4, v0.4.89+): "human-like long-term memory" \u2014 semantic index over all past sessions + recall_memory AI tool + /memory rebuild|refresh|status|recall, AI auto-recalls on "last time"/"\u4E0A\u6B21"'));
|
|
463
|
-
console.log(feat("Web UI Memory panel (B4, v0.4.90+): \u{1F9E0} Memory sidebar tab \u2014 cross-session semantic search with \u2795 Inject-to-input (quotes hit into chat box for user-reviewed recall) and \u2197 jump-to-session"));
|
|
464
|
-
console.log(feat("Ctrl+C tool interrupt (v0.4.92+): pressing Ctrl+C during a long-running tool call (bash/run_tests/etc.) actually aborts the child process and returns control to the REPL"));
|
|
465
|
-
console.log(feat("Skill size warning threshold (v0.4.93+): config.skills.maxSize (default 10000 chars) \u2014 warn when a loaded skill pack exceeds budget, configurable per project"));
|
|
466
|
-
console.log(feat("DeepSeek V4 family (v0.4.94+): deepseek-pro / deepseek-flash with reasoning_content thinking mode \u2014 full roundtrip persisted across multi-turn (v0.4.95\u20130.4.97)"));
|
|
467
|
-
console.log(feat("Smart model routing (/route, config.routing): per-message model override by tag/keyword/length rules \u2014 e.g. route short msgs to Haiku, code-heavy to Opus; /route test <msg> previews decision"));
|
|
468
|
-
console.log(feat("Write-task auto-test suppression (v0.4.98+): AI no longer chains run_tests after write_file/edit_file unless explicitly asked \u2014 keeps single-file edits from ballooning into test runs"));
|
|
469
|
-
console.log(feat("Tool history ordering (v0.4.100+): preserve original tool-call order across multi-turn rounds \u2014 fixes reasoning drift on long agentic loops"));
|
|
470
|
-
console.log(feat("save_last_response Web mode (v0.4.101\u20130.4.102+): hidden from CLI-only contexts and tee-streams chunks to disk in Web UI as the response arrives"));
|
|
471
|
-
console.log(feat("write_file long-content guidance (v0.4.103+): tool description no longer encourages AI to chunk long files \u2014 single-shot writes prevented from being split into truncated parts"));
|
|
472
|
-
console.log(feat("Provider retry + fallback chain (v0.4.144+): transient network / 5xx / 429 errors retry on the same provider with exponential backoff; persistent failures walk config.fallback.chain (per-entry provider+model). Opt-in via config.fallback.enabled. Stream-safe: never retries after first chunk yielded"));
|
|
473
|
-
console.log(feat("aicli ci \u2014 headless PR review for GitHub Actions (v0.4.145+): `aicli ci --pr <num> --post` reads diff via gh CLI, runs code + security review, posts/updates a single PR comment via sentinel marker. Drop-in workflow YAML at docs/github-actions-example.yml. Critical/high findings \u2192 exit 1 (CI gate)"));
|
|
474
|
-
console.log(feat("Kimi K2.6 family + temperature fix (v0.4.146\u20130.4.149): kimi-k2.6 / k2.5 / k2-thinking default models; auto-migrate retired k2-0711/k2-turbo ids in config + history; K2.x models force temperature=1 (API requires it)"));
|
|
475
|
-
console.log(feat("bash error hints (v0.4.146\u20130.4.165): on common Windows/PowerShell failures the bash tool appends actionable hints \u2014 Test-Path over -EA SilentlyContinue probes, python (not python3) incl. the WindowsApps stub that exits 1 silently, write_file over hallucinated Write-Content cmdlets"));
|
|
476
|
-
console.log(feat("6th security + perf audit (v0.4.151): SSRF hardening (IPv4 int/hex/octal + IPv6 + DNS-rebinding pinned via undici lookup), newline command-chain bypass in permissions, timing-safe token compare, interpreter inline-code (-c/-e) danger elevation, vector-store top-k + redactor perf"));
|
|
477
|
-
console.log(feat("C1/C2 index extended to Go/Rust/Java/C++ (v0.4.143): find_symbol/get_outline/find_references/search_code now cover 8 languages via bundled tree-sitter grammars"));
|
|
478
|
-
console.log(feat("Provider streaming tool-call fixes (v0.4.142): Zhipu/GLM repeated id+name delta aggregation no longer drops args; conformance tests across OpenAI-standard vs repeated-chunk shapes"));
|
|
479
|
-
console.log(feat("Hub P1 \u2014 mixed multi-model brainstorm (v0.4.152): aicli hub --mix spreads configured providers across roles (Claude vs GPT vs DeepSeek really debate); fixes per-role model bug via resolveRoleProviders"));
|
|
480
|
-
console.log(feat("Hub P2 \u2014 human-in-the-loop + convergence (v0.4.154): --steer pauses each round for guidance/stop; --vote lets agents append [CONVERGED], 2/3 majority ends early (zero extra API calls); structured Decision/Action-Items summary"));
|
|
481
|
-
console.log(feat("Hub P3 \u2014 discussion persistence (v0.4.155): finished discussions auto-save to ~/.aicli/history as a normal session, listed by `aicli sessions`, replayable via Web UI \u{1F3AC} \u2014 reuses Session Replay, zero new machinery"));
|
|
482
|
-
console.log(feat("Hub P4 \u2014 Web UI multi-agent room (v0.4.156\u20130.4.158): \u{1F3DB} Hub sidebar tab runs discussions live in the browser (streaming per-role blocks, vote rows, summary card); P4b adds in-browser --steer and side-by-side agent lanes. Hub roadmap complete"));
|
|
483
|
-
console.log(feat("aicli web fixes (v0.4.153): honor config.mcpEnabled in web mode; vendor Tailwind/DaisyUI/marked/highlight.js locally (GFW-blocked CDNs broke styling + login overlay)"));
|
|
484
|
-
console.log(feat("Self-updating service worker (v0.4.159): network-only HTML/JS + activate-time reload broadcast \u2014 upgrades take effect without manual SW unregister; fixes stale-cache ghost"));
|
|
485
|
-
console.log(feat("Web UI CSP fix (v0.4.160\u20130.4.162): restore missing \u{1F3DB} Hub tab button; loosen script-src to unsafe-inline so inline onclick handlers fire (strict CSP had silently blocked every button)"));
|
|
486
|
-
console.log(feat("Windows process-tree kill (v0.4.163): killChild uses taskkill /T /F so Ctrl+C actually interrupts ssh/psql grandchildren (child.kill only hit the powershell parent)"));
|
|
487
|
-
console.log(feat("Hallucination detector bash-aware (v0.4.165): files written via bash (python open().write(), Out-File, scp, redirects) no longer false-flagged as phantom claims; coarse check suppressed when bash ran this turn"));
|
|
436
|
+
for (const f of ABOUT_FEATURES) console.log(feat(f));
|
|
437
|
+
console.log();
|
|
438
|
+
console.log(theme.dim(" \u2726 ") + theme.accent("Full per-version history \u2192 CHANGELOG.md"));
|
|
488
439
|
console.log();
|
|
489
440
|
}
|
|
490
441
|
printPrompt(provider, _model) {
|
|
@@ -987,6 +938,61 @@ function copyToClipboard(text) {
|
|
|
987
938
|
}
|
|
988
939
|
}
|
|
989
940
|
}
|
|
941
|
+
var SESSION_PAGE_SIZE = 20;
|
|
942
|
+
function oneLinePreview(s, max) {
|
|
943
|
+
const flat = s.replace(/\s+/g, " ").trim();
|
|
944
|
+
return flat.length > max ? flat.slice(0, max - 1) + "\u2026" : flat;
|
|
945
|
+
}
|
|
946
|
+
function renderTranscriptMessage(msg, renderer) {
|
|
947
|
+
if (msg.role === "user") {
|
|
948
|
+
const text = getContentText(msg.content);
|
|
949
|
+
console.log(theme.success("You: ") + (text.includes("\n") ? "\n" + text : text));
|
|
950
|
+
console.log();
|
|
951
|
+
} else if (msg.role === "assistant") {
|
|
952
|
+
const text = getContentText(msg.content);
|
|
953
|
+
if (msg.toolCalls && msg.toolCalls.length > 0) {
|
|
954
|
+
if (text.trim()) {
|
|
955
|
+
console.log(theme.dim(`Assistant: ${oneLinePreview(text, 100)}`));
|
|
956
|
+
}
|
|
957
|
+
for (const tc of msg.toolCalls) {
|
|
958
|
+
console.log(theme.dim(` \u2699 ${tc.name} ${oneLinePreview(JSON.stringify(tc.arguments ?? {}), 80)}`));
|
|
959
|
+
}
|
|
960
|
+
} else if (text.trim()) {
|
|
961
|
+
renderer.renderResponse(text);
|
|
962
|
+
console.log();
|
|
963
|
+
}
|
|
964
|
+
} else if (msg.role === "tool") {
|
|
965
|
+
const preview = oneLinePreview(getContentText(msg.content), 80);
|
|
966
|
+
const paint = msg.isError ? theme.error : theme.dim;
|
|
967
|
+
console.log(paint(` \u2192 ${msg.toolName ?? "tool"}: ${preview}`));
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
function renderTranscriptPage(messages, renderer, requestedPage) {
|
|
971
|
+
const total = messages.length;
|
|
972
|
+
if (total === 0) {
|
|
973
|
+
renderer.printInfo("Session has no messages yet.");
|
|
974
|
+
return;
|
|
975
|
+
}
|
|
976
|
+
const totalPages = Math.max(1, Math.ceil(total / SESSION_PAGE_SIZE));
|
|
977
|
+
let page = requestedPage === void 0 || !Number.isFinite(requestedPage) ? totalPages : requestedPage;
|
|
978
|
+
if (page < 1) page = 1;
|
|
979
|
+
if (page > totalPages) page = totalPages;
|
|
980
|
+
const start = (page - 1) * SESSION_PAGE_SIZE;
|
|
981
|
+
const slice = messages.slice(start, start + SESSION_PAGE_SIZE);
|
|
982
|
+
console.log();
|
|
983
|
+
console.log(theme.info(` \u2500\u2500 Transcript page ${page}/${totalPages} (messages ${start + 1}\u2013${start + slice.length} of ${total}) \u2500\u2500`));
|
|
984
|
+
console.log();
|
|
985
|
+
for (const msg of slice) {
|
|
986
|
+
renderTranscriptMessage(msg, renderer);
|
|
987
|
+
}
|
|
988
|
+
const hints = [];
|
|
989
|
+
if (page > 1) hints.push(`/session page ${page - 1} = earlier`);
|
|
990
|
+
if (page < totalPages) hints.push(`/session page ${page + 1} = later`);
|
|
991
|
+
if (hints.length > 0) {
|
|
992
|
+
console.log(theme.dim(` \u2500\u2500 ${hints.join(" \xB7 ")} \u2500\u2500`));
|
|
993
|
+
}
|
|
994
|
+
console.log();
|
|
995
|
+
}
|
|
990
996
|
var CommandRegistry = class {
|
|
991
997
|
commands = /* @__PURE__ */ new Map();
|
|
992
998
|
register(command) {
|
|
@@ -1060,7 +1066,7 @@ function createDefaultCommands() {
|
|
|
1060
1066
|
rows: [
|
|
1061
1067
|
["/clear", "Clear conversation history"],
|
|
1062
1068
|
["/compact [instruction]", "Summarize & compress history"],
|
|
1063
|
-
["/session new|list|load
|
|
1069
|
+
["/session new|list|load|show|page|remove", "Manage saved sessions (show = transcript + continue)"],
|
|
1064
1070
|
["/checkpoint [save|restore|delete] <name>", "Session checkpoints"],
|
|
1065
1071
|
["/fork [checkpoint]", "Fork session from checkpoint or current"],
|
|
1066
1072
|
["/branch [list|new|switch|delete|rename|diff|cherry-pick]", "Conversation branches"],
|
|
@@ -1150,7 +1156,13 @@ No commands match "${filter}".
|
|
|
1150
1156
|
execute(_args, ctx) {
|
|
1151
1157
|
const manager = ctx.getMcpManager();
|
|
1152
1158
|
const mcpInfo = manager ? { servers: manager.getConnectedCount(), tools: manager.getTotalToolCount() } : void 0;
|
|
1153
|
-
ctx.
|
|
1159
|
+
const builtinTools = ctx.tools.listBuiltinTools().map((t) => ({ name: t.definition.name, description: t.definition.description }));
|
|
1160
|
+
ctx.renderer.printAbout({
|
|
1161
|
+
pluginCount: ctx.tools.listPluginTools().length,
|
|
1162
|
+
mcpInfo,
|
|
1163
|
+
builtinTools,
|
|
1164
|
+
commandNames: ctx.getCommandNames()
|
|
1165
|
+
});
|
|
1154
1166
|
}
|
|
1155
1167
|
},
|
|
1156
1168
|
{
|
|
@@ -1334,8 +1346,8 @@ No commands match "${filter}".
|
|
|
1334
1346
|
{
|
|
1335
1347
|
name: "session",
|
|
1336
1348
|
description: "Session management",
|
|
1337
|
-
usage: "/session new|list|load <id>",
|
|
1338
|
-
execute(args, ctx) {
|
|
1349
|
+
usage: "/session new|list|load <id>|show <id> [page]|page <n>|remove <id>",
|
|
1350
|
+
async execute(args, ctx) {
|
|
1339
1351
|
const sub = args[0];
|
|
1340
1352
|
if (sub === "new") {
|
|
1341
1353
|
const provider = ctx.getCurrentProvider();
|
|
@@ -1362,10 +1374,10 @@ No commands match "${filter}".
|
|
|
1362
1374
|
s.title ?? "(untitled)"
|
|
1363
1375
|
])
|
|
1364
1376
|
);
|
|
1365
|
-
} else if (sub === "load") {
|
|
1377
|
+
} else if (sub === "load" || sub === "show") {
|
|
1366
1378
|
const id = args[1];
|
|
1367
1379
|
if (!id) {
|
|
1368
|
-
ctx.renderer.renderError(
|
|
1380
|
+
ctx.renderer.renderError(`Usage: /session ${sub} <id>${sub === "show" ? " [page]" : ""}`);
|
|
1369
1381
|
return;
|
|
1370
1382
|
}
|
|
1371
1383
|
const sessions = ctx.sessions.listSessions();
|
|
@@ -1387,8 +1399,70 @@ No commands match "${filter}".
|
|
|
1387
1399
|
ctx.renderer.printSuccess(
|
|
1388
1400
|
`Loaded session ${match.id.slice(0, 8)}: ${match.title ?? "(untitled)"}`
|
|
1389
1401
|
);
|
|
1402
|
+
if (sub === "show") {
|
|
1403
|
+
const pageArg = args[2] !== void 0 ? Number.parseInt(args[2], 10) : void 0;
|
|
1404
|
+
const cur = ctx.sessions.current;
|
|
1405
|
+
if (cur) renderTranscriptPage(cur.messages, ctx.renderer, pageArg);
|
|
1406
|
+
}
|
|
1407
|
+
} else if (sub === "page") {
|
|
1408
|
+
const cur = ctx.sessions.current;
|
|
1409
|
+
if (!cur) {
|
|
1410
|
+
ctx.renderer.renderError("No active session. Use /session show <id> first.");
|
|
1411
|
+
return;
|
|
1412
|
+
}
|
|
1413
|
+
const n = Number.parseInt(args[1] ?? "", 10);
|
|
1414
|
+
if (Number.isNaN(n)) {
|
|
1415
|
+
ctx.renderer.renderError("Usage: /session page <n>");
|
|
1416
|
+
return;
|
|
1417
|
+
}
|
|
1418
|
+
renderTranscriptPage(cur.messages, ctx.renderer, n);
|
|
1419
|
+
} else if (sub === "remove" || sub === "delete") {
|
|
1420
|
+
const id = args[1];
|
|
1421
|
+
if (!id) {
|
|
1422
|
+
ctx.renderer.renderError("Usage: /session remove <id>");
|
|
1423
|
+
return;
|
|
1424
|
+
}
|
|
1425
|
+
const sessions = ctx.sessions.listSessions();
|
|
1426
|
+
const matches2 = sessions.filter((s) => s.id.startsWith(id));
|
|
1427
|
+
if (matches2.length === 0) {
|
|
1428
|
+
ctx.renderer.renderError(`Session '${id}' not found.`);
|
|
1429
|
+
return;
|
|
1430
|
+
}
|
|
1431
|
+
if (matches2.length > 1) {
|
|
1432
|
+
ctx.renderer.renderError(`Ambiguous prefix '${id}' matches ${matches2.length} sessions \u2014 be more specific:`);
|
|
1433
|
+
for (const m of matches2.slice(0, 10)) {
|
|
1434
|
+
console.log(theme.dim(` ${m.id.slice(0, 12)} ${String(m.messageCount).padStart(4)} msgs ${m.updated.toLocaleDateString()} ${m.title ?? "(untitled)"}`));
|
|
1435
|
+
}
|
|
1436
|
+
return;
|
|
1437
|
+
}
|
|
1438
|
+
const match = matches2[0];
|
|
1439
|
+
const isCurrent = ctx.sessions.current?.id === match.id;
|
|
1440
|
+
console.log();
|
|
1441
|
+
console.log(theme.warning(" About to permanently delete session (no undo):"));
|
|
1442
|
+
console.log(` ${theme.info(match.id.slice(0, 12))} ${match.provider}/${match.model} ${match.messageCount} messages ${match.updated.toLocaleDateString()}`);
|
|
1443
|
+
console.log(` ${match.title ?? "(untitled)"}${isCurrent ? theme.warning(" \u2190 current session") : ""}`);
|
|
1444
|
+
console.log();
|
|
1445
|
+
const choice = await ctx.select("Delete this session?", [
|
|
1446
|
+
{ label: "No \u2014 keep it", value: "no" },
|
|
1447
|
+
{ label: "Yes \u2014 delete permanently", value: "yes", hint: "unlinks the history file" }
|
|
1448
|
+
]);
|
|
1449
|
+
if (choice !== "yes") {
|
|
1450
|
+
ctx.renderer.printInfo("Cancelled \u2014 session kept.");
|
|
1451
|
+
return;
|
|
1452
|
+
}
|
|
1453
|
+
if (!ctx.sessions.deleteSession(match.id)) {
|
|
1454
|
+
ctx.renderer.renderError("Delete failed \u2014 session file not found on disk.");
|
|
1455
|
+
return;
|
|
1456
|
+
}
|
|
1457
|
+
ctx.renderer.printSuccess(`Deleted session ${match.id.slice(0, 8)}: ${match.title ?? "(untitled)"}`);
|
|
1458
|
+
if (isCurrent) {
|
|
1459
|
+
ctx.sessions.createSession(ctx.getCurrentProvider(), ctx.getCurrentModel());
|
|
1460
|
+
ctx.resetSessionTokenUsage();
|
|
1461
|
+
ctx.clearDevState();
|
|
1462
|
+
ctx.renderer.printInfo("Current session was deleted \u2014 started a fresh session.");
|
|
1463
|
+
}
|
|
1390
1464
|
} else {
|
|
1391
|
-
ctx.renderer.renderError("Usage: /session new|list|load <id>");
|
|
1465
|
+
ctx.renderer.renderError("Usage: /session new|list|load <id>|show <id> [page]|page <n>|remove <id>");
|
|
1392
1466
|
}
|
|
1393
1467
|
}
|
|
1394
1468
|
},
|
|
@@ -1757,7 +1831,7 @@ No tools match "${filter}".
|
|
|
1757
1831
|
const { join: join6 } = await import("path");
|
|
1758
1832
|
const { existsSync: existsSync6 } = await import("fs");
|
|
1759
1833
|
const { getGitRoot: getGitRoot2 } = await import("./git-context-7KIP4X2V.js");
|
|
1760
|
-
const { MCP_PROJECT_CONFIG_NAME: MCP_PROJECT_CONFIG_NAME2 } = await import("./constants-
|
|
1834
|
+
const { MCP_PROJECT_CONFIG_NAME: MCP_PROJECT_CONFIG_NAME2 } = await import("./constants-EQ7ULMVF.js");
|
|
1761
1835
|
const { approveProject, hashMcpFile } = await import("./project-trust-IFM7FXEV.js");
|
|
1762
1836
|
const cwd = process.cwd();
|
|
1763
1837
|
const projectRoot = getGitRoot2(cwd) ?? cwd;
|
|
@@ -2818,7 +2892,7 @@ ${hint}` : "")
|
|
|
2818
2892
|
usage: "/test [command|filter]",
|
|
2819
2893
|
async execute(args, ctx) {
|
|
2820
2894
|
try {
|
|
2821
|
-
const { executeTests } = await import("./run-tests-
|
|
2895
|
+
const { executeTests } = await import("./run-tests-3FJMYYIU.js");
|
|
2822
2896
|
const argStr = args.join(" ").trim();
|
|
2823
2897
|
let testArgs = {};
|
|
2824
2898
|
if (argStr) {
|
|
@@ -7294,6 +7368,7 @@ Tip: You can continue the conversation by asking the AI to proceed.`
|
|
|
7294
7368
|
getToolExecutor: () => this.toolExecutor,
|
|
7295
7369
|
getCostTracker: () => this.costTracker,
|
|
7296
7370
|
computeRoutingDecision: (userInput) => this.computeRoutingDecision(userInput),
|
|
7371
|
+
getCommandNames: () => this.commands.listAll().map((c) => c.name),
|
|
7297
7372
|
exit: () => this.handleExit()
|
|
7298
7373
|
};
|
|
7299
7374
|
await cmd.execute(args, ctx);
|
|
@@ -7416,7 +7491,7 @@ program.command("web").description("Start Web UI server with browser-based chat
|
|
|
7416
7491
|
console.error("Error: Invalid port number. Must be between 1 and 65535.");
|
|
7417
7492
|
process.exit(1);
|
|
7418
7493
|
}
|
|
7419
|
-
const { startWebServer } = await import("./server-
|
|
7494
|
+
const { startWebServer } = await import("./server-3KIQK257.js");
|
|
7420
7495
|
await startWebServer({ port, host: options.host });
|
|
7421
7496
|
});
|
|
7422
7497
|
program.command("user [action] [username]").description("Manage Web UI users (list | create <name> | delete <name> | reset-password <name> | logout-all <name> | migrate <name>)").action(async (action, username) => {
|
|
@@ -7583,12 +7658,12 @@ program.command("sessions").description("List recent conversation sessions").opt
|
|
|
7583
7658
|
console.log(footer + "\n");
|
|
7584
7659
|
});
|
|
7585
7660
|
program.command("doctor").description("Health check: API keys, config, MCP, recent crashes, tool usage, disk usage").option("--json", "Output as JSON (for scripting)").option("--reset-stats", "Reset accumulated tool usage statistics").action(async (options) => {
|
|
7586
|
-
const { runDoctorCli } = await import("./doctor-cli-
|
|
7661
|
+
const { runDoctorCli } = await import("./doctor-cli-VWYAVULH.js");
|
|
7587
7662
|
await runDoctorCli({ json: !!options.json, resetStats: !!options.resetStats });
|
|
7588
7663
|
});
|
|
7589
7664
|
program.command("batch <action> [arg] [arg2]").description("Anthropic Message Batches: submit | list | status <id> | results <id> [out] | cancel <id>").option("--dry-run", "Parse and validate input without submitting (submit only)").action(async (action, arg, arg2, options) => {
|
|
7590
7665
|
try {
|
|
7591
|
-
const batch = await import("./batch-
|
|
7666
|
+
const batch = await import("./batch-V4KR6ENR.js");
|
|
7592
7667
|
switch (action) {
|
|
7593
7668
|
case "submit":
|
|
7594
7669
|
if (!arg) {
|
|
@@ -7631,7 +7706,7 @@ program.command("batch <action> [arg] [arg2]").description("Anthropic Message Ba
|
|
|
7631
7706
|
}
|
|
7632
7707
|
});
|
|
7633
7708
|
program.command("mcp-serve").description("Start an MCP server over STDIO, exposing aicli's built-in tools to Claude Desktop / Cursor / other MCP clients").option("--allow-destructive", "Allow bash / run_interactive / task_create (always destructive in MCP mode)").option("--allow-outside-cwd", "Allow tool path arguments to escape the sandbox root \u2014 disabled by default").option("--tools <list>", "Comma-separated whitelist of tools to expose (default: all eligible tools)").option("--cwd <path>", "Working directory AND sandbox root (default: current directory)").action(async (options) => {
|
|
7634
|
-
const { startMcpServer } = await import("./server-
|
|
7709
|
+
const { startMcpServer } = await import("./server-CESWZS3I.js");
|
|
7635
7710
|
await startMcpServer({
|
|
7636
7711
|
allowDestructive: !!options.allowDestructive,
|
|
7637
7712
|
allowOutsideCwd: !!options.allowOutsideCwd,
|
|
@@ -7640,7 +7715,7 @@ program.command("mcp-serve").description("Start an MCP server over STDIO, exposi
|
|
|
7640
7715
|
});
|
|
7641
7716
|
});
|
|
7642
7717
|
program.command("ci").description("Headless PR review (code + security) \u2014 reads git/gh diff, optionally posts to PR. Designed for GitHub Actions.").option("--pr <num>", "PR number; diff fetched via `gh pr diff <num>`", (v) => parseInt(v, 10)).option("--base <ref>", "Base ref for `git diff <ref>...HEAD` (ignored when --pr set)").option("--post", "Post review as a PR comment (requires gh CLI + GH_TOKEN, needs --pr)").option("--no-update", "Always create a new comment instead of updating the previous aicli review").option("--skip-code", "Skip the code review section").option("--skip-security", "Skip the security review section").option("--detailed", "Use the detailed code-review prompt").option("--max-diff <n>", "Max diff chars sent to the model (default 30000)", (v) => parseInt(v, 10)).option("--provider <id>", "Override provider (default: config.defaultProvider)").option("--model <id>", "Override model").option("--dry-run", "Print result to stdout instead of posting (overrides --post)").action(async (options) => {
|
|
7643
|
-
const { runCi } = await import("./ci-
|
|
7718
|
+
const { runCi } = await import("./ci-NS7PR27C.js");
|
|
7644
7719
|
const result = await runCi({
|
|
7645
7720
|
pr: options.pr,
|
|
7646
7721
|
base: options.base,
|
|
@@ -7785,7 +7860,7 @@ program.command("hub [topic]").description("Start multi-agent hub (discuss / bra
|
|
|
7785
7860
|
}),
|
|
7786
7861
|
config.get("customProviders")
|
|
7787
7862
|
);
|
|
7788
|
-
const { startHub } = await import("./hub-
|
|
7863
|
+
const { startHub } = await import("./hub-DBGEPDIE.js");
|
|
7789
7864
|
await startHub(
|
|
7790
7865
|
{
|
|
7791
7866
|
topic: topic ?? "",
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
loadDevState,
|
|
22
22
|
persistToolRound,
|
|
23
23
|
setupProxy
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-UCPHXAHM.js";
|
|
25
25
|
import {
|
|
26
26
|
ToolExecutor,
|
|
27
27
|
ToolRegistry,
|
|
@@ -39,10 +39,10 @@ import {
|
|
|
39
39
|
spawnAgentContext,
|
|
40
40
|
truncateOutput,
|
|
41
41
|
undoStack
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-G44XZPNZ.js";
|
|
43
43
|
import "./chunk-HDSKW7Q3.js";
|
|
44
44
|
import "./chunk-ZWVIDFGY.js";
|
|
45
|
-
import "./chunk-
|
|
45
|
+
import "./chunk-2AZX76LV.js";
|
|
46
46
|
import {
|
|
47
47
|
SessionManager,
|
|
48
48
|
getContentText
|
|
@@ -74,13 +74,13 @@ import {
|
|
|
74
74
|
} from "./chunk-5LK7H45B.js";
|
|
75
75
|
import {
|
|
76
76
|
runTool
|
|
77
|
-
} from "./chunk-
|
|
77
|
+
} from "./chunk-ETGCCZBT.js";
|
|
78
78
|
import {
|
|
79
79
|
getDangerLevel
|
|
80
80
|
} from "./chunk-HIU2SH4V.js";
|
|
81
81
|
import {
|
|
82
82
|
ConfigManager
|
|
83
|
-
} from "./chunk-
|
|
83
|
+
} from "./chunk-3GZ7RYAP.js";
|
|
84
84
|
import "./chunk-TZQHYZKT.js";
|
|
85
85
|
import {
|
|
86
86
|
AGENTIC_BEHAVIOR_GUIDELINE,
|
|
@@ -100,7 +100,7 @@ import {
|
|
|
100
100
|
SKILLS_DIR_NAME,
|
|
101
101
|
VERSION,
|
|
102
102
|
buildUserIdentityPrompt
|
|
103
|
-
} from "./chunk-
|
|
103
|
+
} from "./chunk-A56C3L4P.js";
|
|
104
104
|
import {
|
|
105
105
|
formatGitContextForPrompt,
|
|
106
106
|
getGitContext,
|
|
@@ -2487,7 +2487,7 @@ ${undoResults.map((r) => ` \u2022 ${r}`).join("\n")}` });
|
|
|
2487
2487
|
case "test": {
|
|
2488
2488
|
this.send({ type: "info", message: "\u{1F9EA} Running tests..." });
|
|
2489
2489
|
try {
|
|
2490
|
-
const { executeTests } = await import("./run-tests-
|
|
2490
|
+
const { executeTests } = await import("./run-tests-3FJMYYIU.js");
|
|
2491
2491
|
const argStr = args.join(" ").trim();
|
|
2492
2492
|
let testArgs = {};
|
|
2493
2493
|
if (argStr) {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
ToolRegistry
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-G44XZPNZ.js";
|
|
5
5
|
import "./chunk-HDSKW7Q3.js";
|
|
6
6
|
import "./chunk-ZWVIDFGY.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-2AZX76LV.js";
|
|
8
8
|
import {
|
|
9
9
|
runTool
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-ETGCCZBT.js";
|
|
11
11
|
import {
|
|
12
12
|
getDangerLevel,
|
|
13
13
|
schemaToJsonSchema
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
import "./chunk-TZQHYZKT.js";
|
|
16
16
|
import {
|
|
17
17
|
VERSION
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-A56C3L4P.js";
|
|
19
19
|
import "./chunk-4BKXL7SM.js";
|
|
20
20
|
import "./chunk-MM3F43H6.js";
|
|
21
21
|
import "./chunk-KHYD3WXE.js";
|
|
@@ -3,20 +3,20 @@ import {
|
|
|
3
3
|
ToolRegistry,
|
|
4
4
|
googleSearchContext,
|
|
5
5
|
truncateOutput
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-G44XZPNZ.js";
|
|
7
7
|
import "./chunk-HDSKW7Q3.js";
|
|
8
8
|
import "./chunk-ZWVIDFGY.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-2AZX76LV.js";
|
|
10
10
|
import {
|
|
11
11
|
runTool
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-ETGCCZBT.js";
|
|
13
13
|
import {
|
|
14
14
|
getDangerLevel
|
|
15
15
|
} from "./chunk-HIU2SH4V.js";
|
|
16
16
|
import "./chunk-TZQHYZKT.js";
|
|
17
17
|
import {
|
|
18
18
|
SUBAGENT_ALLOWED_TOOLS
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-A56C3L4P.js";
|
|
20
20
|
import "./chunk-4BKXL7SM.js";
|
|
21
21
|
import "./chunk-MM3F43H6.js";
|
|
22
22
|
import "./chunk-KHYD3WXE.js";
|