jinzd-ai-cli 0.4.200 → 0.4.202

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.
Files changed (66) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +435 -435
  3. package/README.zh-CN.md +450 -450
  4. package/dist/agent-client-6GX6QQDU.js +0 -0
  5. package/dist/auth-FSTAKSYF.js +0 -0
  6. package/dist/{batch-5N4CXARG.js → batch-UF4EWYFD.js} +2 -2
  7. package/dist/chat-index-FDSGKWQV.js +0 -0
  8. package/dist/{chunk-JP6ESDV7.js → chunk-2NINHXEZ.js} +13 -1
  9. package/dist/{chunk-FQF6YJ6F.js → chunk-2YLYDFEX.js} +55 -14
  10. package/dist/chunk-4BKXL7SM.js +0 -0
  11. package/dist/chunk-5UR6ZOF4.js +0 -0
  12. package/dist/{chunk-HUTS2F6Y.js → chunk-75SUTNYY.js} +1 -1
  13. package/dist/chunk-A4GUGWEY.js +0 -0
  14. package/dist/chunk-BXP6YZ2P.js +0 -0
  15. package/dist/chunk-CITDVXXM.js +0 -0
  16. package/dist/chunk-CKH4KQ4E.js +0 -0
  17. package/dist/chunk-E44DTERW.js +0 -0
  18. package/dist/{chunk-JZCXULOJ.js → chunk-GOKVKOG3.js} +1 -1
  19. package/dist/chunk-HLWUDRBO.js +0 -0
  20. package/dist/chunk-HOSJZMQS.js +0 -0
  21. package/dist/{chunk-IDMCBIYZ.js → chunk-HZKC424D.js} +1 -1
  22. package/dist/chunk-IW3Q7AE5.js +0 -0
  23. package/dist/{chunk-NULOZSFA.js → chunk-JCY7RQIA.js} +1 -1
  24. package/dist/chunk-JVKAL5Q3.js +0 -0
  25. package/dist/chunk-KHYD3WXE.js +0 -0
  26. package/dist/chunk-MC34ISJU.js +0 -0
  27. package/dist/chunk-NZ4X6GUC.js +0 -0
  28. package/dist/chunk-O6UFCEUZ.js +0 -0
  29. package/dist/chunk-OJL3PY36.js +0 -0
  30. package/dist/{chunk-5SA7IACI.js → chunk-Q2MBPMTW.js} +2 -2
  31. package/dist/chunk-Q3ZUDA6S.js +0 -0
  32. package/dist/{chunk-2G62CKDL.js → chunk-SB77W6XS.js} +1 -1
  33. package/dist/chunk-SLSWPBK3.js +0 -0
  34. package/dist/chunk-T2NL5ZIA.js +0 -0
  35. package/dist/chunk-TB4W4Y4T.js +0 -0
  36. package/dist/chunk-TZQHYZKT.js +0 -0
  37. package/dist/{chunk-TBGVHRCL.js → chunk-Y6U6FMVV.js} +1 -1
  38. package/dist/{ci-2ZSBYWJE.js → ci-YOJTTP4J.js} +3 -3
  39. package/dist/{constants-GMPGZM4D.js → constants-VP7TYJL7.js} +1 -1
  40. package/dist/{doctor-cli-PG52ECBH.js → doctor-cli-PCIKXTNV.js} +5 -5
  41. package/dist/electron-server.js +67 -14
  42. package/dist/file-checkpoint-NKBHGC7L.js +0 -0
  43. package/dist/git-context-EXOEHQSF.js +0 -0
  44. package/dist/{hub-AI4ICH5E.js → hub-N2ZRAXRO.js} +1 -1
  45. package/dist/hub-server-LJ2JSKZ2.js +0 -0
  46. package/dist/index.js +17 -17
  47. package/dist/indexer-AKWMYNJI.js +0 -0
  48. package/dist/persist-L54DPLI7.js +0 -0
  49. package/dist/project-trust-NKYHL3VZ.js +0 -0
  50. package/dist/{run-tests-G2MCAQJL.js → run-tests-AXPZOPX7.js} +1 -1
  51. package/dist/{run-tests-NUWLWMHZ.js → run-tests-RNU733RF.js} +2 -2
  52. package/dist/semantic-PK7AUOJT.js +0 -0
  53. package/dist/{server-Y3XEAXTC.js → server-SLFGYGBO.js} +8 -8
  54. package/dist/{server-74PZ2PDM.js → server-YIBPZJ34.js} +28 -11
  55. package/dist/store-MWNHVGJT.js +0 -0
  56. package/dist/{task-orchestrator-IF3XCVZ7.js → task-orchestrator-FM4EXIBZ.js} +4 -4
  57. package/dist/{usage-7BAT3772.js → usage-QFW2XPF3.js} +2 -2
  58. package/dist/vector-store-BBDXB5IQ.js +0 -0
  59. package/dist/wasm/web-tree-sitter.wasm +0 -0
  60. package/dist/web/client/app.js +3351 -3351
  61. package/dist/web/client/icon.svg +22 -22
  62. package/dist/web/client/index.html +360 -360
  63. package/dist/web/client/manifest.json +15 -15
  64. package/dist/web/client/style.css +991 -991
  65. package/dist/web/client/sw.js +86 -86
  66. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ import {
15
15
  saveDevState,
16
16
  sessionHasMeaningfulContent,
17
17
  setupProxy
18
- } from "./chunk-5SA7IACI.js";
18
+ } from "./chunk-Q2MBPMTW.js";
19
19
  import {
20
20
  ToolExecutor,
21
21
  ToolRegistry,
@@ -35,10 +35,10 @@ import {
35
35
  spawnAgentContext,
36
36
  theme,
37
37
  undoStack
38
- } from "./chunk-FQF6YJ6F.js";
38
+ } from "./chunk-2YLYDFEX.js";
39
39
  import "./chunk-T2NL5ZIA.js";
40
40
  import "./chunk-BXP6YZ2P.js";
41
- import "./chunk-HUTS2F6Y.js";
41
+ import "./chunk-75SUTNYY.js";
42
42
  import {
43
43
  SessionManager,
44
44
  getContentText
@@ -55,16 +55,16 @@ import {
55
55
  getConfigDirUsage,
56
56
  listRecentCrashes,
57
57
  writeCrashLog
58
- } from "./chunk-2G62CKDL.js";
58
+ } from "./chunk-SB77W6XS.js";
59
59
  import {
60
60
  ProviderRegistry
61
- } from "./chunk-JP6ESDV7.js";
61
+ } from "./chunk-2NINHXEZ.js";
62
62
  import {
63
63
  getStatsSnapshot,
64
64
  getTopFailingTools,
65
65
  getTopUsedTools,
66
66
  installFlushOnExit
67
- } from "./chunk-JZCXULOJ.js";
67
+ } from "./chunk-GOKVKOG3.js";
68
68
  import {
69
69
  CONTENT_ONLY_STREAM_REMINDER,
70
70
  TEE_FINAL_USER_NUDGE,
@@ -85,7 +85,7 @@ import {
85
85
  } from "./chunk-5UR6ZOF4.js";
86
86
  import {
87
87
  ConfigManager
88
- } from "./chunk-NULOZSFA.js";
88
+ } from "./chunk-JCY7RQIA.js";
89
89
  import {
90
90
  AuthError,
91
91
  ProviderError,
@@ -112,7 +112,7 @@ import {
112
112
  SKILLS_DIR_NAME,
113
113
  VERSION,
114
114
  buildUserIdentityPrompt
115
- } from "./chunk-IDMCBIYZ.js";
115
+ } from "./chunk-HZKC424D.js";
116
116
  import {
117
117
  formatGitContextForPrompt,
118
118
  getGitContext,
@@ -1827,7 +1827,7 @@ No tools match "${filter}".
1827
1827
  const { join: join5 } = await import("path");
1828
1828
  const { existsSync: existsSync5 } = await import("fs");
1829
1829
  const { getGitRoot: getGitRoot2 } = await import("./git-context-EXOEHQSF.js");
1830
- const { MCP_PROJECT_CONFIG_NAME: MCP_PROJECT_CONFIG_NAME2 } = await import("./constants-GMPGZM4D.js");
1830
+ const { MCP_PROJECT_CONFIG_NAME: MCP_PROJECT_CONFIG_NAME2 } = await import("./constants-VP7TYJL7.js");
1831
1831
  const { approveProject, hashMcpFile } = await import("./project-trust-NKYHL3VZ.js");
1832
1832
  const cwd = process.cwd();
1833
1833
  const projectRoot = getGitRoot2(cwd) ?? cwd;
@@ -2888,7 +2888,7 @@ ${hint}` : "")
2888
2888
  usage: "/test [command|filter]",
2889
2889
  async execute(args, ctx) {
2890
2890
  try {
2891
- const { executeTests } = await import("./run-tests-NUWLWMHZ.js");
2891
+ const { executeTests } = await import("./run-tests-RNU733RF.js");
2892
2892
  const argStr = args.join(" ").trim();
2893
2893
  let testArgs = {};
2894
2894
  if (argStr) {
@@ -7265,7 +7265,7 @@ program.command("web").description("Start Web UI server with browser-based chat
7265
7265
  console.error("Error: Invalid port number. Must be between 1 and 65535.");
7266
7266
  process.exit(1);
7267
7267
  }
7268
- const { startWebServer } = await import("./server-Y3XEAXTC.js");
7268
+ const { startWebServer } = await import("./server-SLFGYGBO.js");
7269
7269
  await startWebServer({ port, host: options.host });
7270
7270
  });
7271
7271
  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) => {
@@ -7432,16 +7432,16 @@ program.command("sessions").description("List recent conversation sessions").opt
7432
7432
  console.log(footer + "\n");
7433
7433
  });
7434
7434
  program.command("usage").description("Show token + cost usage grouped by provider/model (cross-session)").option("--days <n>", "Only the last N days (inclusive of today)").option("--month <ym>", "Only a specific month, format YYYY-MM (e.g. 2026-06)").option("--json", "Output as JSON (for scripting)").action(async (options) => {
7435
- const { runUsageCli } = await import("./usage-7BAT3772.js");
7435
+ const { runUsageCli } = await import("./usage-QFW2XPF3.js");
7436
7436
  await runUsageCli(options);
7437
7437
  });
7438
7438
  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) => {
7439
- const { runDoctorCli } = await import("./doctor-cli-PG52ECBH.js");
7439
+ const { runDoctorCli } = await import("./doctor-cli-PCIKXTNV.js");
7440
7440
  await runDoctorCli({ json: !!options.json, resetStats: !!options.resetStats });
7441
7441
  });
7442
7442
  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) => {
7443
7443
  try {
7444
- const batch = await import("./batch-5N4CXARG.js");
7444
+ const batch = await import("./batch-UF4EWYFD.js");
7445
7445
  switch (action) {
7446
7446
  case "submit":
7447
7447
  if (!arg) {
@@ -7484,7 +7484,7 @@ program.command("batch <action> [arg] [arg2]").description("Anthropic Message Ba
7484
7484
  }
7485
7485
  });
7486
7486
  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) => {
7487
- const { startMcpServer } = await import("./server-74PZ2PDM.js");
7487
+ const { startMcpServer } = await import("./server-YIBPZJ34.js");
7488
7488
  await startMcpServer({
7489
7489
  allowDestructive: !!options.allowDestructive,
7490
7490
  allowOutsideCwd: !!options.allowOutsideCwd,
@@ -7493,7 +7493,7 @@ program.command("mcp-serve").description("Start an MCP server over STDIO, exposi
7493
7493
  });
7494
7494
  });
7495
7495
  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) => {
7496
- const { runCi } = await import("./ci-2ZSBYWJE.js");
7496
+ const { runCi } = await import("./ci-YOJTTP4J.js");
7497
7497
  const result = await runCi({
7498
7498
  pr: options.pr,
7499
7499
  base: options.base,
@@ -7639,7 +7639,7 @@ program.command("hub [topic]").description("Start multi-agent hub (discuss / bra
7639
7639
  }),
7640
7640
  config.get("customProviders")
7641
7641
  );
7642
- const { startHub } = await import("./hub-AI4ICH5E.js");
7642
+ const { startHub } = await import("./hub-N2ZRAXRO.js");
7643
7643
  await startHub(
7644
7644
  {
7645
7645
  topic: topic ?? "",
File without changes
File without changes
File without changes
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  executeTests,
3
3
  runTestsTool
4
- } from "./chunk-TBGVHRCL.js";
4
+ } from "./chunk-Y6U6FMVV.js";
5
5
  export {
6
6
  executeTests,
7
7
  runTestsTool
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  executeTests,
4
4
  runTestsTool
5
- } from "./chunk-HUTS2F6Y.js";
6
- import "./chunk-IDMCBIYZ.js";
5
+ } from "./chunk-75SUTNYY.js";
6
+ import "./chunk-HZKC424D.js";
7
7
  export {
8
8
  executeTests,
9
9
  runTestsTool
File without changes
@@ -19,7 +19,7 @@ import {
19
19
  loadDevState,
20
20
  persistToolRound,
21
21
  setupProxy
22
- } from "./chunk-5SA7IACI.js";
22
+ } from "./chunk-Q2MBPMTW.js";
23
23
  import {
24
24
  ToolExecutor,
25
25
  ToolRegistry,
@@ -38,10 +38,10 @@ import {
38
38
  spawnAgentContext,
39
39
  truncateOutput,
40
40
  undoStack
41
- } from "./chunk-FQF6YJ6F.js";
41
+ } from "./chunk-2YLYDFEX.js";
42
42
  import "./chunk-T2NL5ZIA.js";
43
43
  import "./chunk-BXP6YZ2P.js";
44
- import "./chunk-HUTS2F6Y.js";
44
+ import "./chunk-75SUTNYY.js";
45
45
  import {
46
46
  SessionManager,
47
47
  getContentText
@@ -52,10 +52,10 @@ import {
52
52
  } from "./chunk-E44DTERW.js";
53
53
  import {
54
54
  ProviderRegistry
55
- } from "./chunk-JP6ESDV7.js";
55
+ } from "./chunk-2NINHXEZ.js";
56
56
  import {
57
57
  runTool
58
- } from "./chunk-JZCXULOJ.js";
58
+ } from "./chunk-GOKVKOG3.js";
59
59
  import {
60
60
  CONTENT_ONLY_STREAM_REMINDER,
61
61
  TEE_FINAL_USER_NUDGE,
@@ -73,7 +73,7 @@ import {
73
73
  } from "./chunk-5UR6ZOF4.js";
74
74
  import {
75
75
  ConfigManager
76
- } from "./chunk-NULOZSFA.js";
76
+ } from "./chunk-JCY7RQIA.js";
77
77
  import "./chunk-TZQHYZKT.js";
78
78
  import {
79
79
  AGENTIC_BEHAVIOR_GUIDELINE,
@@ -93,7 +93,7 @@ import {
93
93
  SKILLS_DIR_NAME,
94
94
  VERSION,
95
95
  buildUserIdentityPrompt
96
- } from "./chunk-IDMCBIYZ.js";
96
+ } from "./chunk-HZKC424D.js";
97
97
  import {
98
98
  formatGitContextForPrompt,
99
99
  getGitContext,
@@ -2454,7 +2454,7 @@ ${undoResults.map((r) => ` \u2022 ${r}`).join("\n")}` });
2454
2454
  case "test": {
2455
2455
  this.send({ type: "info", message: "\u{1F9EA} Running tests..." });
2456
2456
  try {
2457
- const { executeTests } = await import("./run-tests-NUWLWMHZ.js");
2457
+ const { executeTests } = await import("./run-tests-RNU733RF.js");
2458
2458
  const argStr = args.join(" ").trim();
2459
2459
  let testArgs = {};
2460
2460
  if (argStr) {
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ToolRegistry
4
- } from "./chunk-FQF6YJ6F.js";
4
+ } from "./chunk-2YLYDFEX.js";
5
5
  import "./chunk-T2NL5ZIA.js";
6
6
  import "./chunk-BXP6YZ2P.js";
7
- import "./chunk-HUTS2F6Y.js";
7
+ import "./chunk-75SUTNYY.js";
8
8
  import {
9
9
  runTool
10
- } from "./chunk-JZCXULOJ.js";
10
+ } from "./chunk-GOKVKOG3.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-IDMCBIYZ.js";
18
+ } from "./chunk-HZKC424D.js";
19
19
  import "./chunk-4BKXL7SM.js";
20
20
  import "./chunk-TB4W4Y4T.js";
21
21
  import "./chunk-KHYD3WXE.js";
@@ -26,7 +26,7 @@ import "./chunk-IW3Q7AE5.js";
26
26
 
27
27
  // src/mcp/server.ts
28
28
  import { createInterface } from "readline";
29
- import { resolve } from "path";
29
+ import { resolve, dirname, basename } from "path";
30
30
  import { realpathSync } from "fs";
31
31
  var STDIN_TOOLS = /* @__PURE__ */ new Set(["ask_user", "spawn_agent"]);
32
32
  function looksLikePath(s) {
@@ -62,6 +62,21 @@ var TOOL_PATH_ARGS = {
62
62
  bash: ["cwd"],
63
63
  run_interactive: ["cwd"]
64
64
  };
65
+ function realpathExistingPrefix(abs) {
66
+ let current = abs;
67
+ const tail = [];
68
+ for (; ; ) {
69
+ try {
70
+ const real = realpathSync(current);
71
+ return tail.length ? resolve(real, ...tail) : real;
72
+ } catch {
73
+ const parent = dirname(current);
74
+ if (parent === current) return abs;
75
+ tail.unshift(basename(current));
76
+ current = parent;
77
+ }
78
+ }
79
+ }
65
80
  var McpServer = class {
66
81
  registry;
67
82
  opts;
@@ -243,10 +258,12 @@ var McpServer = class {
243
258
  * Validate that every known path-bearing argument of `toolName` resolves
244
259
  * inside the sandbox root. Returns an error message on violation, else undef.
245
260
  *
246
- * We do NOT realpath() per-call: write_file targets may not exist yet, and
247
- * realpath on every call is a syscall per arg. The root itself is realpath'd
248
- * once at construction, which stops the "sandbox root is a symlink pointing
249
- * elsewhere" class of attack. Symlinks inside the tree are allowed.
261
+ * Each candidate is canonicalized via {@link realpathExistingPrefix} before the
262
+ * containment check so symlinks in the existing prefix (notably the sandbox root
263
+ * itself `/var`→`/private/var` on macOS) match the realpath'd root. write_file
264
+ * targets that don't exist yet are handled by realpath-ing only the existing
265
+ * ancestor. The root is also realpath'd once at construction, stopping the
266
+ * "sandbox root is a symlink pointing elsewhere" class of attack.
250
267
  */
251
268
  validatePathArgs(toolName, args) {
252
269
  if (this.opts.allowOutsideCwd) return void 0;
@@ -258,7 +275,7 @@ var McpServer = class {
258
275
  const list = Array.isArray(value) ? value : [value];
259
276
  for (const entry of list) {
260
277
  if (typeof entry !== "string" || entry.length === 0) continue;
261
- const abs = resolve(this.sandboxRoot, entry);
278
+ const abs = realpathExistingPrefix(resolve(this.sandboxRoot, entry));
262
279
  if (!this.isInsideSandbox(abs)) {
263
280
  return `Path '${entry}' escapes sandbox root '${this.sandboxRoot}'. Pass --allow-outside-cwd to permit.`;
264
281
  }
@@ -270,7 +287,7 @@ var McpServer = class {
270
287
  if (knownKeys.has(k)) continue;
271
288
  if (typeof v !== "string" || v.length === 0) continue;
272
289
  if (!looksLikePath(v)) continue;
273
- const abs = resolve(this.sandboxRoot, v);
290
+ const abs = realpathExistingPrefix(resolve(this.sandboxRoot, v));
274
291
  if (!this.isInsideSandbox(abs)) {
275
292
  return `Path-like argument '${k}=${v}' escapes sandbox root '${this.sandboxRoot}'. Pass --allow-outside-cwd to permit.`;
276
293
  }
File without changes
@@ -3,13 +3,13 @@ import {
3
3
  ToolRegistry,
4
4
  googleSearchContext,
5
5
  truncateOutput
6
- } from "./chunk-FQF6YJ6F.js";
6
+ } from "./chunk-2YLYDFEX.js";
7
7
  import "./chunk-T2NL5ZIA.js";
8
8
  import "./chunk-BXP6YZ2P.js";
9
- import "./chunk-HUTS2F6Y.js";
9
+ import "./chunk-75SUTNYY.js";
10
10
  import {
11
11
  runTool
12
- } from "./chunk-JZCXULOJ.js";
12
+ } from "./chunk-GOKVKOG3.js";
13
13
  import {
14
14
  getDangerLevel,
15
15
  runLeanAgentLoop
@@ -17,7 +17,7 @@ import {
17
17
  import "./chunk-TZQHYZKT.js";
18
18
  import {
19
19
  SUBAGENT_ALLOWED_TOOLS
20
- } from "./chunk-IDMCBIYZ.js";
20
+ } from "./chunk-HZKC424D.js";
21
21
  import "./chunk-4BKXL7SM.js";
22
22
  import "./chunk-TB4W4Y4T.js";
23
23
  import "./chunk-KHYD3WXE.js";
@@ -8,9 +8,9 @@ import {
8
8
  } from "./chunk-E44DTERW.js";
9
9
  import {
10
10
  ConfigManager
11
- } from "./chunk-NULOZSFA.js";
11
+ } from "./chunk-JCY7RQIA.js";
12
12
  import "./chunk-TZQHYZKT.js";
13
- import "./chunk-IDMCBIYZ.js";
13
+ import "./chunk-HZKC424D.js";
14
14
  import "./chunk-IW3Q7AE5.js";
15
15
 
16
16
  // src/cli/usage.ts
File without changes
File without changes