jinzd-ai-cli 0.4.319 → 0.4.320

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 (34) hide show
  1. package/dist/{batch-CQ542WJF.js → batch-LRYDPB6F.js} +2 -2
  2. package/dist/{chunk-YHMQMP2I.js → chunk-46M65JDN.js} +5 -5
  3. package/dist/{chunk-D6BLSFYD.js → chunk-4S2XD3M2.js} +4 -4
  4. package/dist/{chunk-662ZJPJE.js → chunk-5VZHSSLW.js} +1 -1
  5. package/dist/{chunk-KEOMNFBH.js → chunk-DB4HVUPI.js} +1 -1
  6. package/dist/{chunk-GVAAGBHX.js → chunk-E2W2MI6H.js} +74 -5
  7. package/dist/{chunk-A7YZLLWN.js → chunk-J7IPNING.js} +1 -1
  8. package/dist/{chunk-AC44E4CV.js → chunk-N6YFBRQV.js} +1 -1
  9. package/dist/{chunk-Y3SEC5EC.js → chunk-NOAWUEJJ.js} +1 -1
  10. package/dist/{chunk-OQZIP4LU.js → chunk-P4FJBD2H.js} +1 -1
  11. package/dist/{chunk-2PAQOR2X.js → chunk-QB3MECZJ.js} +8 -8
  12. package/dist/{chunk-DCQDFQDW.js → chunk-SKQUWDRM.js} +1 -1
  13. package/dist/{chunk-SZBSTSG4.js → chunk-TKBWA3XJ.js} +4 -4
  14. package/dist/{chunk-GP24X3KJ.js → chunk-WW2LFOWE.js} +1 -1
  15. package/dist/{chunk-PGQ5OV3P.js → chunk-WY4IWCQ5.js} +1 -1
  16. package/dist/{chunk-N2MHUA4B.js → chunk-YAMPLTYO.js} +1 -1
  17. package/dist/{ci-HAPWBC37.js → ci-7TSOMDHV.js} +6 -6
  18. package/dist/{ci-format-NGWP4GTQ.js → ci-format-6A2RFYZS.js} +2 -2
  19. package/dist/{constants-CPHZLOCQ.js → constants-EHYM2NS5.js} +1 -1
  20. package/dist/{constants-GSUK6ILC.js → constants-P33UDQVS.js} +1 -1
  21. package/dist/{doctor-cli-L6AK2GJ7.js → doctor-cli-2B72UMZO.js} +6 -6
  22. package/dist/electron-server.js +84 -15
  23. package/dist/{hub-TCZFG2ZG.js → hub-JACLTKYY.js} +1 -1
  24. package/dist/index.js +45 -24
  25. package/dist/{persistent-memory-E3UYP7RJ.js → persistent-memory-5ICLP275.js} +2 -2
  26. package/dist/{persistent-memory-IPNMYXU4.js → persistent-memory-ZIM6ICIR.js} +2 -2
  27. package/dist/{pr-J5TSU5P6.js → pr-UBGLNROK.js} +6 -6
  28. package/dist/{run-tests-PDD4KUQL.js → run-tests-HCID73KE.js} +2 -2
  29. package/dist/{run-tests-FLGSE63O.js → run-tests-SYJG4S3N.js} +2 -2
  30. package/dist/{server-XQ3IQUZ5.js → server-3UEEPEUD.js} +15 -15
  31. package/dist/{server-3C6IK3JE.js → server-BVTFIPB2.js} +6 -6
  32. package/dist/{task-orchestrator-544JETWF.js → task-orchestrator-6NRCGF5V.js} +9 -7
  33. package/dist/{usage-MQTA7HHZ.js → usage-6V64TTRE.js} +2 -2
  34. package/package.json +1 -1
@@ -4,12 +4,12 @@ import {
4
4
  } from "./chunk-RS7SKYTS.js";
5
5
  import {
6
6
  ConfigManager
7
- } from "./chunk-KEOMNFBH.js";
7
+ } from "./chunk-DB4HVUPI.js";
8
8
  import "./chunk-TU3L3PW7.js";
9
9
  import {
10
10
  atomicWriteFileSync
11
11
  } from "./chunk-BMLQPSHP.js";
12
- import "./chunk-A7YZLLWN.js";
12
+ import "./chunk-J7IPNING.js";
13
13
 
14
14
  // src/cli/batch.ts
15
15
  import Anthropic from "@anthropic-ai/sdk";
@@ -11,7 +11,7 @@ import {
11
11
  searchPersistentMemories,
12
12
  touchMemoryReferences,
13
13
  updateMemoryEntry
14
- } from "./chunk-PGQ5OV3P.js";
14
+ } from "./chunk-WY4IWCQ5.js";
15
15
  import {
16
16
  indexProject
17
17
  } from "./chunk-RWRZVQCB.js";
@@ -30,13 +30,13 @@ import {
30
30
  runHook,
31
31
  runLifecycleHooks,
32
32
  runTool
33
- } from "./chunk-662ZJPJE.js";
33
+ } from "./chunk-5VZHSSLW.js";
34
34
  import {
35
35
  buildTruncatedArgumentsError,
36
36
  getDangerLevel,
37
37
  isFileWriteTool,
38
38
  runLeanAgentLoop
39
- } from "./chunk-GVAAGBHX.js";
39
+ } from "./chunk-E2W2MI6H.js";
40
40
  import {
41
41
  EnvLoader,
42
42
  NetworkError,
@@ -64,7 +64,7 @@ import {
64
64
  recoverGbkMojibake,
65
65
  runTestsTool,
66
66
  shellInvocation
67
- } from "./chunk-Y3SEC5EC.js";
67
+ } from "./chunk-NOAWUEJJ.js";
68
68
  import {
69
69
  CONFIG_DIR_NAME,
70
70
  DEFAULT_MAX_TOOL_OUTPUT_CHARS_CAP,
@@ -73,7 +73,7 @@ import {
73
73
  SUBAGENT_ALLOWED_TOOLS,
74
74
  SUBAGENT_DEFAULT_MAX_ROUNDS,
75
75
  SUBAGENT_MAX_ROUNDS_LIMIT
76
- } from "./chunk-A7YZLLWN.js";
76
+ } from "./chunk-J7IPNING.js";
77
77
  import {
78
78
  getCurrentSessionKey,
79
79
  getExecutionConfigDir,
@@ -8,13 +8,13 @@ import {
8
8
  listHooks,
9
9
  listInstalledPlugins,
10
10
  resetStats
11
- } from "./chunk-662ZJPJE.js";
11
+ } from "./chunk-5VZHSSLW.js";
12
12
  import {
13
13
  ProviderRegistry
14
- } from "./chunk-N2MHUA4B.js";
14
+ } from "./chunk-YAMPLTYO.js";
15
15
  import {
16
16
  ConfigManager
17
- } from "./chunk-KEOMNFBH.js";
17
+ } from "./chunk-DB4HVUPI.js";
18
18
  import {
19
19
  getGitRoot
20
20
  } from "./chunk-HOSJZMQS.js";
@@ -26,7 +26,7 @@ import {
26
26
  MCP_PROJECT_CONFIG_NAME,
27
27
  MEMORY_FILE_NAME,
28
28
  VERSION
29
- } from "./chunk-A7YZLLWN.js";
29
+ } from "./chunk-J7IPNING.js";
30
30
 
31
31
  // src/diagnostics/doctor-report.ts
32
32
  import { existsSync as existsSync3, statSync as statSync2 } from "fs";
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  CONFIG_DIR_NAME,
10
10
  PLUGINS_DIR_NAME
11
- } from "./chunk-A7YZLLWN.js";
11
+ } from "./chunk-J7IPNING.js";
12
12
 
13
13
  // src/diagnostics/tool-stats.ts
14
14
  import { mkdirSync } from "fs";
@@ -11,7 +11,7 @@ import {
11
11
  CONFIG_FILE_NAME,
12
12
  HISTORY_DIR_NAME,
13
13
  PLUGINS_DIR_NAME
14
- } from "./chunk-A7YZLLWN.js";
14
+ } from "./chunk-J7IPNING.js";
15
15
 
16
16
  // src/config/config-manager.ts
17
17
  import { readFileSync, existsSync, mkdirSync } from "fs";
@@ -14,6 +14,14 @@ var HALLUCINATION_PATTERNS = [
14
14
  // 已创建!
15
15
  /File\s+(?:written|saved|created)\s+(?:to|as|at)/i,
16
16
  // File written to / saved as(要求介词)
17
+ // 2026-10-07 审计 B-02:中英文判据不对称。中文「已保存到」要求引号、英文只认 `File saved to`,
18
+ // 于是「已保存到 report.md。」「I saved the changes to src/index.ts.」双双漏检。
19
+ // 改为「后面跟一个带扩展名的文件名」——同样挡得住「已保存到数据库」「saved my time」这类误报。
20
+ /已(?:保存|写入)到?\s*[^\s,,。;;::]{1,120}\.\w{1,6}(?![\w/])/,
21
+ // 动词后直接跟文件名(中间只许冠词 / both / the file 之类),或「动词 … to/into 文件名」。
22
+ // 刻意不放宽成「同句任意文件名」:「I saved you some time by checking README.md」不是写入声明。
23
+ /\b(?:I|We)(?:'ve| have)?\s+(?:now\s+|just\s+|also\s+|successfully\s+)?(?:created|written|wrote|saved|generated)\s+(?:(?:the|a|an|both|all|two|three|new|following)\s+)*(?:(?:files?|documents?|reports?|scripts?)\s+)?[`'"]?[\w./-]+\.(?:md|txt|json|ya?ml|csv|html?|css|[jt]sx?|py|sh|go|rs|java|sql|xml|toml|ini|cfg|pdf|docx?|xlsx?|pptx?)\b/i,
24
+ /\b(?:I|We)(?:'ve| have)?\s+(?:now\s+|just\s+|also\s+|successfully\s+)?(?:created|written|wrote|saved|generated)\b[^.\n]{0,40}?\b(?:to|into)\s+[`'"]?[\w./-]+\.(?:md|txt|json|ya?ml|csv|html?|css|[jt]sx?|py|sh|go|rs|java|sql|xml|toml|ini|cfg|pdf|docx?|xlsx?|pptx?)\b/i,
17
25
  /生成完成[!!]/,
18
26
  // 生成完成!
19
27
  /✅\s*(?:文件|已[生保写创]|第)\S*\.\w{1,5}/,
@@ -64,6 +72,8 @@ var QUICK_WRITE_KEYWORDS = [
64
72
  "saved",
65
73
  "written",
66
74
  "created",
75
+ "wrote",
76
+ "generated",
67
77
  "File",
68
78
  "file",
69
79
  // emoji 勾选标记
@@ -186,8 +196,13 @@ function extractClaimedFilePaths(content) {
186
196
  }
187
197
  const zhRe = /(?:已保存(?:到)?|已写入(?:到)?|已创建|已生成|文件路径[::]|保存为|写入到)\s*[`'”””]?([^\s`'”””,,。\n]+\.\w{1,6})/g;
188
198
  while ((m = zhRe.exec(content)) !== null) add(m[1]);
189
- const enRe = /(?:saved|written|created)\s+(?:to|as|at)\s+[`'”]?([^\s`'”\n,]+\.\w{1,6})/gi;
199
+ const enRe = /\b(?:saved|written|wrote|created)\b[^.\n]{0,40}?\b(?:to|as|at|into)\s+[`'”]?([^\s`'”\n,]+\.\w{1,6})/gi;
190
200
  while ((m = enRe.exec(content)) !== null) add(m[1]);
201
+ const enClaimRe = /\b(?:I|We)(?:'ve| have)?\s+(?:now\s+|just\s+|also\s+|successfully\s+)?(?:created|written|wrote|saved|generated)\b([^\n;]*)/gi;
202
+ while ((m = enClaimRe.exec(content)) !== null) {
203
+ const clause = m[1].split(/[.!?](?:\s|$)|\b(?:based on|from|using|per|according to|referencing|following|after|by|while|when|checking|reading|reviewing)\b/i)[0] ?? "";
204
+ for (const f of clause.matchAll(/[`'"]?([\w./-]+\.\w{1,6})\b/g)) add(f[1]);
205
+ }
191
206
  const checkRe = /✅[^\n`]*?[`'”]?([^\s`'”\n,,。]+?\.\w{1,6})/g;
192
207
  while ((m = checkRe.exec(content)) !== null) {
193
208
  const pathStart = m.index + m[0].lastIndexOf(m[1]);
@@ -462,8 +477,27 @@ var META_NARRATION_HEURISTICS = [
462
477
  /(?:我来|让我|容我)\s*(?:整理|梳理|归纳|想想|看看|重新|检查|核实)/u,
463
478
  // 过渡语(需要 2+ hits):"以下是:" / "如下:" 作为独立行。文档中可作小节标题,
464
479
  // 但配合另一个对话模式(如"好的")时是典型的 AI 内容包装。
465
- /^.{0,60}(?:以下是|下面是|如下)\s*[::,,]\s*$/mu
480
+ /^.{0,60}(?:以下是|下面是|如下)\s*[::,,]\s*$/mu,
481
+ // 叙述自己要调用工具(2026-10-07 审计 B-05):文档正文不会这样写自己。
482
+ /(?:让我|我来|我将|我会|接下来)\s*(?:调用|使用|用)\s*`?\w+`?\s*工具/u,
483
+ /\bI(?:'ll| will| am going to)\s+(?:now\s+)?(?:use|call|invoke)\s+the\s+`?\w+`?\s+tool\b/i
484
+ ];
485
+ var ANNOUNCEMENT_PATTERNS = [
486
+ /^\s*(?:好的|好|收到|明白|了解|嗯|OK|Okay|Sure|Certainly)[,,。.!!\s]/iu,
487
+ /(?:我(?:这就|马上|现在|立即|立刻|来|将|会)|让我|下面我|接下来我)\s*(?:为[您你])?\s*(?:开始|着手|撰写|写|生成|整理|输出|编写|准备|调用|使用)/u,
488
+ /(?:请稍[候等]|稍等|马上就好|这就开始)/u,
489
+ /\b(?:let me|I(?:'ll| will| am going to)|I'm going to)\s+(?:now\s+)?(?:write|draft|generate|create|start|prepare|produce|compose|use|call)\b/i,
490
+ /\b(?:please wait|one moment|stand by)\b/i
466
491
  ];
492
+ function looksLikeAnnouncementOnly(content) {
493
+ const text = content.trim();
494
+ if (!text || text.length > 300 || text.split("\n").length > 4) return null;
495
+ if (/^#{1,6}\s+\S/m.test(text)) return null;
496
+ for (const re of ANNOUNCEMENT_PATTERNS) {
497
+ if (re.test(text)) return re.source;
498
+ }
499
+ return null;
500
+ }
467
501
  var CHINESE_TAIL_CLOSING_MARKERS = [
468
502
  /(?:需要你|请你|麻烦你|你看)\s*(?:确认|决定|选择|帮忙|看[一看下]|过目|觉得|认为)/u,
469
503
  /(?:随时|有问题|有需要|需要调整|需要修改)\s*(?:联系|找我|告诉|沟通|调整|修改)/u,
@@ -600,6 +634,15 @@ This fresh stream has NO tools \u2014 output is captured verbatim. STOP emitting
600
634
  summary: `[save_last_response REJECTED] The content-only stream produced NO text at all (output budget likely spent on reasoning). ${saveToFile} was NOT saved.`
601
635
  };
602
636
  }
637
+ const announced = looksLikeAnnouncementOnly(rawContent);
638
+ if (announced) {
639
+ return fallback(`announcement only: ${announced}`) ?? {
640
+ kind: "reject",
641
+ reason: "not-a-document",
642
+ matched: announced,
643
+ summary: `[save_last_response REJECTED] The content-only stream produced only an announcement (e.g. "OK, I'll write the report now\u2026"), not the document itself. ${saveToFile} was NOT saved.`
644
+ };
645
+ }
603
646
  const { lines, bytes } = teeFileStats(rawContent);
604
647
  return {
605
648
  kind: "ok",
@@ -621,6 +664,7 @@ function teeStreamErrorSummary(saveToFile, errMsg) {
621
664
  // src/core/stalled-intent.ts
622
665
  var WAITING_FOR_USER_RE = /[??]\s*$|是否|要不要|需不需要|需要我|要我|可以吗|好吗|行吗|您看|你看看|请确认|确认后|同意后|如果(?:你|您)|若(?:你|您)|如(?:你|您)需要|等你|等待(?:你|您)|待(?:你|您)|我可以|我也可以|还可以|(?:你|您)可以|告诉我|或者(?:让我|我)|可以为(?:你|您)|可以帮|随时|\bwould you\b|\bshall i\b|\bshould i\b|\bdo you want\b|\blet me know\b|\bif you(?:'d| would)? like\b|\bonce you confirm\b|\byour (?:approval|confirmation)\b|\bif you want\b|\bi can also\b/i;
623
666
  var COMPLETED_RE = /已|完成|好了|完毕|写好|搞定|\b(?:done|finished|completed|have (?:written|created|generated))\b/i;
667
+ var NEGATION_RE = /没有?|未|无法|不(?:会|能|再|打算|需要|用|必|要)|n't\b|\b(?:not|never|no longer|cannot)\b/i;
624
668
  var CN_VERBS = "\u5F00\u5199|\u52A8\u624B|\u7F16\u5199|\u5199\u5165|\u5199|\u751F\u6210|\u521B\u5EFA|\u5236\u4F5C|\u6267\u884C|\u8FD0\u884C|\u5B89\u88C5|\u4FEE\u6539|\u66F4\u65B0|\u4FEE\u590D|\u5B9E\u73B0|\u6784\u5EFA|\u8F93\u51FA|\u4FDD\u5B58|\u8BFB\u53D6|\u67E5\u770B|\u68C0\u67E5|\u8C03\u7528|\u5904\u7406|\u6574\u7406|\u8865\u5145|\u5B8C\u5584|\u91CD\u5199|\u6539\u5199|\u843D\u76D8";
625
669
  var CN_FIRST_PERSON_INTENT_RE = new RegExp(
626
670
  `(?:\u6211|\u54B1\u4EEC|\u6211\u4EEC|\u8BA9\u6211)(?:\u73B0\u5728|\u8FD9\u5C31|\u9A6C\u4E0A|\u7ACB\u5373|\u7ACB\u523B|\u76F4\u63A5|\u63A5\u4E0B\u6765|\u4E0B\u9762|\u5148|\u518D|\u968F\u540E|\u7136\u540E|\u5C31)*(?:\u5C06|\u4F1A|\u8981|\u6765|\u53BB|\u5F00\u59CB|\u7740\u624B|\u51C6\u5907)?(?:[^\uFF0C,\u3002\uFF01!\uFF1B;\uFF1A:\\n]{0,4})?(?:${CN_VERBS})`
@@ -642,11 +686,11 @@ function detectStalledIntent(content) {
642
686
  if (WAITING_FOR_USER_RE.test(tail)) return null;
643
687
  const clauses = tail.split(/[,,;;。!!::\n]/).map((c) => c.trim()).filter(Boolean);
644
688
  for (const clause of clauses) {
645
- if (COMPLETED_RE.test(clause)) continue;
689
+ if (COMPLETED_RE.test(clause) || NEGATION_RE.test(clause)) continue;
646
690
  if (CN_FIRST_PERSON_INTENT_RE.test(clause) || CN_BARE_INTENT_RE.test(clause)) return clause;
647
691
  }
648
692
  for (const sentence of tail.split(/(?<=[.!])\s+|\n/)) {
649
- if (COMPLETED_RE.test(sentence)) continue;
693
+ if (COMPLETED_RE.test(sentence) || NEGATION_RE.test(sentence)) continue;
650
694
  const m = EN_INTENT_RE.exec(sentence);
651
695
  if (m) return sentence.trim();
652
696
  }
@@ -1094,7 +1138,12 @@ async function runAgentLoop(host) {
1094
1138
  if (tc.name.startsWith("mcp__")) host.onMcpToolUsed?.(tc.name);
1095
1139
  }
1096
1140
  host.persistRound?.(toolCalls, toolResults, {
1097
- assistantContent: outcome.content,
1141
+ // 工具调用前模型说的话("A 方向汇报:…"、"先看一下配置")挂在 _streamedText 上:
1142
+ // 本轮上下文里有(buildToolResultMessages 会带上),但此前存档只取 outcome.content,
1143
+ // 而工具调用轮次的 outcome 没有 content——2026-10-07 审计会话 157 条带工具调用的
1144
+ // assistant 消息正文**全部为空**:下一条用户消息时模型看不到自己之前的阶段性汇报,
1145
+ // /session show、导出、回放也全缺这部分(审计 X-01)。
1146
+ assistantContent: outcome.content ?? toolCalls._streamedText,
1098
1147
  reasoningContent: outcome.reasoningContent
1099
1148
  });
1100
1149
  host.afterToolRoundPersist?.(toolCalls, toolResults, extraMessages);
@@ -1149,6 +1198,7 @@ async function runLeanAgentLoop(opts) {
1149
1198
  let roundsUsed = 0;
1150
1199
  let toolCallCount = 0;
1151
1200
  let stalledIntentNudges = 0;
1201
+ let hallucinationRetries = 0;
1152
1202
  try {
1153
1203
  for (let round = 0; round < opts.maxRounds; round++) {
1154
1204
  roundsUsed = round + 1;
@@ -1164,6 +1214,7 @@ async function runLeanAgentLoop(opts) {
1164
1214
  timeout: opts.chatParams?.timeout,
1165
1215
  thinking: opts.chatParams?.thinking,
1166
1216
  thinkingEffort: opts.chatParams?.thinkingEffort,
1217
+ thinkingBudget: opts.chatParams?.thinkingBudget,
1167
1218
  ...extraMessages.length > 0 ? { _extraMessages: extraMessages } : {}
1168
1219
  },
1169
1220
  opts.toolDefsForRound(round)
@@ -1183,6 +1234,24 @@ async function runLeanAgentLoop(opts) {
1183
1234
  );
1184
1235
  continue;
1185
1236
  }
1237
+ const nextTools = round < opts.maxRounds - 1 ? opts.toolDefsForRound(round + 1) : [];
1238
+ const canWrite = nextTools.some((t) => t.name === "write_file" || t.name === "edit_file");
1239
+ if (canWrite && hallucinationRetries < 1 && result.content) {
1240
+ const alreadyWrote = hadPreviousWriteToolCalls(extraMessages);
1241
+ const coarse = !alreadyWrote && detectsHallucinatedFileOp(result.content) && extractBashCommands(extraMessages).length === 0;
1242
+ const phantom = coarse || alreadyWrote ? findPhantomClaims(result.content, extraMessages) : [];
1243
+ if (phantom.length > 0 || coarse) {
1244
+ hallucinationRetries++;
1245
+ extraMessages.push(
1246
+ { role: "assistant", content: result.content },
1247
+ {
1248
+ role: "user",
1249
+ content: phantom.length > 0 ? buildPhantomCorrectionMessage(phantom) : HALLUCINATION_CORRECTION_MESSAGE
1250
+ }
1251
+ );
1252
+ continue;
1253
+ }
1254
+ }
1186
1255
  content = result.content;
1187
1256
  break;
1188
1257
  }
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/core/constants.ts
4
- var VERSION = "0.4.319";
4
+ var VERSION = "0.4.320";
5
5
  var APP_NAME = "ai-cli";
6
6
  var CONFIG_DIR_NAME = ".aicli";
7
7
  var CONFIG_FILE_NAME = "config.json";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-QMFMST2T.js";
5
5
  import {
6
6
  TEST_TIMEOUT
7
- } from "./chunk-DCQDFQDW.js";
7
+ } from "./chunk-SKQUWDRM.js";
8
8
 
9
9
  // src/tools/builtin/run-tests.ts
10
10
  import { spawn as spawn2 } from "child_process";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  TEST_TIMEOUT
4
- } from "./chunk-A7YZLLWN.js";
4
+ } from "./chunk-J7IPNING.js";
5
5
  import {
6
6
  getExecutionConfigDir,
7
7
  getExecutionSignal
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  VERSION
4
- } from "./chunk-A7YZLLWN.js";
4
+ } from "./chunk-J7IPNING.js";
5
5
 
6
6
  // src/cli/ci-format.ts
7
7
  var DEFAULT_CI_THRESHOLDS = {
@@ -16,7 +16,7 @@ import {
16
16
  setPreferredAgentName,
17
17
  truncateForPersist,
18
18
  undoStack
19
- } from "./chunk-YHMQMP2I.js";
19
+ } from "./chunk-46M65JDN.js";
20
20
  import {
21
21
  buildReviewPrompt,
22
22
  buildSecurityReviewPrompt
@@ -51,7 +51,7 @@ import {
51
51
  touchMemoryReferences,
52
52
  updateMemoryApproval,
53
53
  updateMemoryEntry
54
- } from "./chunk-PGQ5OV3P.js";
54
+ } from "./chunk-WY4IWCQ5.js";
55
55
  import {
56
56
  theme
57
57
  } from "./chunk-5C76XDDF.js";
@@ -65,7 +65,7 @@ import {
65
65
  import {
66
66
  buildDoctorReport,
67
67
  formatDoctorReport
68
- } from "./chunk-D6BLSFYD.js";
68
+ } from "./chunk-4S2XD3M2.js";
69
69
  import {
70
70
  describePlugin,
71
71
  getActivePluginAssets,
@@ -80,11 +80,11 @@ import {
80
80
  trustHook,
81
81
  trustPlugin,
82
82
  untrustHook
83
- } from "./chunk-662ZJPJE.js";
83
+ } from "./chunk-5VZHSSLW.js";
84
84
  import {
85
85
  isCleanDocumentBody,
86
86
  stripOuterCodeFence
87
- } from "./chunk-GVAAGBHX.js";
87
+ } from "./chunk-E2W2MI6H.js";
88
88
  import {
89
89
  formatGitContextForPrompt,
90
90
  getGitContext
@@ -109,7 +109,7 @@ import {
109
109
  MCP_TOOL_PREFIX,
110
110
  REPO_URL,
111
111
  VERSION
112
- } from "./chunk-A7YZLLWN.js";
112
+ } from "./chunk-J7IPNING.js";
113
113
 
114
114
  // src/skills/manager.ts
115
115
  import { existsSync, readdirSync, mkdirSync, statSync } from "fs";
@@ -2426,7 +2426,7 @@ No tools match "${filter}".
2426
2426
  const { join: join6 } = await import("path");
2427
2427
  const { existsSync: existsSync6 } = await import("fs");
2428
2428
  const { getGitRoot } = await import("./git-context-EXOEHQSF.js");
2429
- const { MCP_PROJECT_CONFIG_NAME } = await import("./constants-GSUK6ILC.js");
2429
+ const { MCP_PROJECT_CONFIG_NAME } = await import("./constants-P33UDQVS.js");
2430
2430
  const { approveProject, hashMcpFile } = await import("./project-trust-KGG2BWKC.js");
2431
2431
  const cwd = process.cwd();
2432
2432
  const projectRoot = getGitRoot(cwd) ?? cwd;
@@ -3534,7 +3534,7 @@ function createReviewCommands() {
3534
3534
  usage: "/test [command|filter]",
3535
3535
  async execute(args, ctx) {
3536
3536
  try {
3537
- const { executeTests } = await import("./run-tests-FLGSE63O.js");
3537
+ const { executeTests } = await import("./run-tests-SYJG4S3N.js");
3538
3538
  const argStr = args.join(" ").trim();
3539
3539
  let testArgs = {};
3540
3540
  if (argStr) {
@@ -1,5 +1,5 @@
1
1
  // src/core/constants.ts
2
- var VERSION = "0.4.319";
2
+ var VERSION = "0.4.320";
3
3
  var APP_NAME = "ai-cli";
4
4
  var CONFIG_DIR_NAME = ".aicli";
5
5
  var CONFIG_FILE_NAME = "config.json";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  evaluateCiGate,
4
4
  normalizeCiThresholds
5
- } from "./chunk-OQZIP4LU.js";
5
+ } from "./chunk-P4FJBD2H.js";
6
6
  import {
7
7
  buildReviewPrompt,
8
8
  buildSecurityReviewPrompt,
@@ -13,13 +13,13 @@ import {
13
13
  } from "./chunk-6YZEZFX5.js";
14
14
  import {
15
15
  ProviderRegistry
16
- } from "./chunk-N2MHUA4B.js";
16
+ } from "./chunk-YAMPLTYO.js";
17
17
  import {
18
18
  ConfigManager
19
- } from "./chunk-KEOMNFBH.js";
19
+ } from "./chunk-DB4HVUPI.js";
20
20
  import {
21
21
  VERSION
22
- } from "./chunk-A7YZLLWN.js";
22
+ } from "./chunk-J7IPNING.js";
23
23
 
24
24
  // src/cli/ci.ts
25
25
  import { execFileSync } from "child_process";
@@ -12,7 +12,7 @@ import {
12
12
  MEMORY_FILE_NAME,
13
13
  MEMORY_MAX_CHARS,
14
14
  MEMORY_STORE_FILE_NAME
15
- } from "./chunk-DCQDFQDW.js";
15
+ } from "./chunk-SKQUWDRM.js";
16
16
 
17
17
  // src/memory/persistent-memory.ts
18
18
  import { copyFileSync, existsSync, mkdirSync, readFileSync, statSync } from "fs";
@@ -13,7 +13,7 @@ import {
13
13
  MEMORY_FILE_NAME,
14
14
  MEMORY_MAX_CHARS,
15
15
  MEMORY_STORE_FILE_NAME
16
- } from "./chunk-A7YZLLWN.js";
16
+ } from "./chunk-J7IPNING.js";
17
17
 
18
18
  // src/memory/persistent-memory.ts
19
19
  import { copyFileSync, existsSync, mkdirSync, readFileSync, statSync } from "fs";
@@ -3,7 +3,7 @@ import {
3
3
  detectsHallucinatedFileOp,
4
4
  parseToolCallArguments,
5
5
  schemaToJsonSchema
6
- } from "./chunk-GVAAGBHX.js";
6
+ } from "./chunk-E2W2MI6H.js";
7
7
  import {
8
8
  AuthError,
9
9
  ProviderError,
@@ -3,16 +3,16 @@ import {
3
3
  CI_COMMENT_MARKER,
4
4
  countSeverity,
5
5
  runCi
6
- } from "./chunk-SZBSTSG4.js";
7
- import "./chunk-OQZIP4LU.js";
6
+ } from "./chunk-TKBWA3XJ.js";
7
+ import "./chunk-P4FJBD2H.js";
8
8
  import "./chunk-HLWUDRBO.js";
9
9
  import "./chunk-6YZEZFX5.js";
10
- import "./chunk-N2MHUA4B.js";
11
- import "./chunk-KEOMNFBH.js";
12
- import "./chunk-GVAAGBHX.js";
10
+ import "./chunk-YAMPLTYO.js";
11
+ import "./chunk-DB4HVUPI.js";
12
+ import "./chunk-E2W2MI6H.js";
13
13
  import "./chunk-TU3L3PW7.js";
14
14
  import "./chunk-BMLQPSHP.js";
15
- import "./chunk-A7YZLLWN.js";
15
+ import "./chunk-J7IPNING.js";
16
16
  export {
17
17
  CI_COMMENT_MARKER,
18
18
  countSeverity,
@@ -6,8 +6,8 @@ import {
6
6
  formatCiResult,
7
7
  formatCiSarif,
8
8
  normalizeCiThresholds
9
- } from "./chunk-OQZIP4LU.js";
10
- import "./chunk-A7YZLLWN.js";
9
+ } from "./chunk-P4FJBD2H.js";
10
+ import "./chunk-J7IPNING.js";
11
11
  export {
12
12
  DEFAULT_CI_THRESHOLDS,
13
13
  detectCiGateSignals,
@@ -38,7 +38,7 @@ import {
38
38
  TEST_TIMEOUT,
39
39
  VERSION,
40
40
  buildUserIdentityPrompt
41
- } from "./chunk-DCQDFQDW.js";
41
+ } from "./chunk-SKQUWDRM.js";
42
42
  export {
43
43
  AGENTIC_BEHAVIOR_GUIDELINE,
44
44
  APP_NAME,
@@ -39,7 +39,7 @@ import {
39
39
  TEST_TIMEOUT,
40
40
  VERSION,
41
41
  buildUserIdentityPrompt
42
- } from "./chunk-A7YZLLWN.js";
42
+ } from "./chunk-J7IPNING.js";
43
43
  export {
44
44
  AGENTIC_BEHAVIOR_GUIDELINE,
45
45
  APP_NAME,
@@ -2,16 +2,16 @@
2
2
  import {
3
3
  formatDoctorReport,
4
4
  runDoctorCli
5
- } from "./chunk-D6BLSFYD.js";
6
- import "./chunk-662ZJPJE.js";
5
+ } from "./chunk-4S2XD3M2.js";
6
+ import "./chunk-5VZHSSLW.js";
7
7
  import "./chunk-RS7SKYTS.js";
8
- import "./chunk-N2MHUA4B.js";
9
- import "./chunk-KEOMNFBH.js";
10
- import "./chunk-GVAAGBHX.js";
8
+ import "./chunk-YAMPLTYO.js";
9
+ import "./chunk-DB4HVUPI.js";
10
+ import "./chunk-E2W2MI6H.js";
11
11
  import "./chunk-TU3L3PW7.js";
12
12
  import "./chunk-HOSJZMQS.js";
13
13
  import "./chunk-BMLQPSHP.js";
14
- import "./chunk-A7YZLLWN.js";
14
+ import "./chunk-J7IPNING.js";
15
15
  export {
16
16
  formatDoctorReport,
17
17
  runDoctorCli