jinzd-ai-cli 0.4.28 → 0.4.30

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.
@@ -9,7 +9,7 @@ import {
9
9
  SUBAGENT_DEFAULT_MAX_ROUNDS,
10
10
  SUBAGENT_MAX_ROUNDS_LIMIT,
11
11
  runTestsTool
12
- } from "./chunk-7SW4XRDJ.js";
12
+ } from "./chunk-4WGZEAGJ.js";
13
13
 
14
14
  // src/tools/builtin/bash.ts
15
15
  import { execSync } from "child_process";
@@ -6,7 +6,7 @@ import { platform } from "os";
6
6
  import chalk from "chalk";
7
7
 
8
8
  // src/core/constants.ts
9
- var VERSION = "0.4.28";
9
+ var VERSION = "0.4.30";
10
10
  var APP_NAME = "ai-cli";
11
11
  var CONFIG_DIR_NAME = ".aicli";
12
12
  var CONFIG_FILE_NAME = "config.json";
@@ -8,7 +8,7 @@ import { platform } from "os";
8
8
  import chalk from "chalk";
9
9
 
10
10
  // src/core/constants.ts
11
- var VERSION = "0.4.28";
11
+ var VERSION = "0.4.30";
12
12
  var APP_NAME = "ai-cli";
13
13
  var CONFIG_DIR_NAME = ".aicli";
14
14
  var CONFIG_FILE_NAME = "config.json";
@@ -7,7 +7,7 @@ import {
7
7
  ProviderNotFoundError,
8
8
  RateLimitError,
9
9
  schemaToJsonSchema
10
- } from "./chunk-EWJQOJSB.js";
10
+ } from "./chunk-4EOFMJCR.js";
11
11
  import {
12
12
  APP_NAME,
13
13
  CONFIG_DIR_NAME,
@@ -20,7 +20,7 @@ import {
20
20
  MCP_TOOL_PREFIX,
21
21
  PLUGINS_DIR_NAME,
22
22
  VERSION
23
- } from "./chunk-7SW4XRDJ.js";
23
+ } from "./chunk-4WGZEAGJ.js";
24
24
 
25
25
  // src/config/config-manager.ts
26
26
  import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
@@ -1391,6 +1391,16 @@ function detectsCodeBlockPseudoCall(content) {
1391
1391
  return CODE_BLOCK_PATTERNS.some((pattern) => pattern.test(content));
1392
1392
  }
1393
1393
  var DEEPSEEK_CODE_BLOCK_CORRECTION = "You wrote a code block in your response text, but you did NOT actually execute it. Code blocks in text are NOT executed by the system. You MUST use the function calling API to invoke the appropriate tool (e.g., mcp__postgres__query for SQL queries, bash for shell commands). Please call the correct tool NOW to execute the query/command.";
1394
+ var DEEPSEEK_ANTI_HALLUCINATION = `
1395
+
1396
+ [CRITICAL: Anti-Hallucination Enforcement \u2014 DeepSeek Specific]
1397
+ You have a known tendency to claim files were "saved" or "created" without actually calling write_file. This is UNACCEPTABLE.
1398
+ Rules you MUST follow:
1399
+ - NEVER type file content into your response text. ALL file content goes through write_file tool calls ONLY.
1400
+ - After calling write_file, do NOT describe the file content again in text \u2014 just confirm the tool call result.
1401
+ - When generating multiple files: call write_file for file 1 \u2192 call write_file for file 2 \u2192 ... \u2192 THEN summarize.
1402
+ - If you catch yourself writing markdown/code that should be a file, STOP and use write_file instead.
1403
+ - The system will detect and reject phantom claims. Each failed detection wastes a round. Be honest.`;
1394
1404
  var DeepSeekProvider = class extends OpenAICompatibleProvider {
1395
1405
  defaultBaseUrl = "https://api.deepseek.com/v1";
1396
1406
  /** 禁用流式工具调用,确保 chatWithTools 覆写(代码块检测)生效 */
@@ -1427,7 +1437,11 @@ var DeepSeekProvider = class extends OpenAICompatibleProvider {
1427
1437
  * 检测到后注入纠正消息强制重试一次。
1428
1438
  */
1429
1439
  async chatWithTools(request, tools) {
1430
- const result = await super.chatWithTools(request, tools);
1440
+ const enhancedRequest = {
1441
+ ...request,
1442
+ systemPrompt: (request.systemPrompt ?? "") + DEEPSEEK_ANTI_HALLUCINATION
1443
+ };
1444
+ const result = await super.chatWithTools(enhancedRequest, tools);
1431
1445
  const hasBashTool = tools.some((t) => t.name === "bash");
1432
1446
  if (hasBashTool && "content" in result && result.content && detectsCodeBlockPseudoCall(result.content)) {
1433
1447
  process.stderr.write(
@@ -1545,8 +1559,20 @@ var HALLUCINATION_PATTERNS = [
1545
1559
  // File written to / saved as(要求介词)
1546
1560
  /生成完成[!!]/,
1547
1561
  // 生成完成!
1548
- /✅\s*(?:文件|已[生保写创]|第)\S*\.\w{1,5}/
1562
+ /✅\s*(?:文件|已[生保写创]|第)\S*\.\w{1,5}/,
1549
1563
  // ✅ 文件已保存 path.ext(要求文件扩展名)
1564
+ /文件已[成功]?创建/,
1565
+ // 文件已成功创建 / 文件已创建
1566
+ /教案已[成功]?[生创保写]/,
1567
+ // 教案已成功生成 / 教案已保存
1568
+ /已成功[保写创生]入?[::!!\s`'"]/,
1569
+ // 已成功保存 / 已成功写入 / 已成功创建
1570
+ /保存[到至]了?\s*[`'"]/,
1571
+ // 保存到了 `path` / 保存至 'path'
1572
+ /内容如下[::]/,
1573
+ // 内容如下:(后跟大段文件内容)
1574
+ /以下是.*(?:教案|文件|内容)[::]/
1575
+ // 以下是xx教案内容:(Kimi 常见模式)
1550
1576
  ];
1551
1577
  function detectsHallucinatedFileOp(content) {
1552
1578
  return HALLUCINATION_PATTERNS.some((pattern) => pattern.test(content));
@@ -1585,8 +1611,110 @@ When you need to create, write, or modify files, you MUST use the function calli
1585
1611
  NEVER claim "file saved", "file created", "written to", etc. in your response text without actually calling the tool.
1586
1612
  Describing file content in text without calling the tool = the file does not exist = task failure.
1587
1613
  If multiple files need to be generated, you MUST call write_file separately for each file \u2014 do not skip any.
1588
- Do NOT output fake "completion summaries" unless you have actually completed all file writes via tool_calls.`;
1614
+ Do NOT output fake "completion summaries" unless you have actually completed all file writes via tool_calls.
1615
+
1616
+ CRITICAL \u2014 Batch file generation rules:
1617
+ 1. You MUST call write_file once per file. There are NO shortcuts.
1618
+ 2. After writing file N, immediately proceed to call write_file for file N+1. Do NOT stop to summarize.
1619
+ 3. If you find yourself typing file content into your response text instead of into a write_file call, STOP and use the tool.
1620
+ 4. Only produce a text summary AFTER all write_file calls have been made and returned success.
1621
+ 5. The system compares every "file saved" claim against actual tool calls. Phantom claims trigger an automatic retry \u2014 do not waste rounds.`;
1622
+ function buildWriteRoundReminder(writtenCount) {
1623
+ return `
1624
+
1625
+ [Write Progress Reminder]
1626
+ You have successfully called write_file ${writtenCount} time(s) so far in this turn. If there are more files to write, call write_file NOW for the next file. Do NOT produce a text summary until ALL files have been written via tool calls.`;
1627
+ }
1589
1628
  var HALLUCINATION_CORRECTION_MESSAGE = "You did NOT actually call the write_file tool \u2014 the file was NOT created! Please immediately use the write_file tool via the function calling API to perform the actual file write. Do NOT describe file content in text \u2014 you MUST invoke write_file through the tool_calls mechanism.";
1629
+ function extractClaimedFilePaths(content) {
1630
+ const paths = /* @__PURE__ */ new Set();
1631
+ const add = (p) => {
1632
+ const trimmed = p.trim().replace(/[,,。、;;::]+$/, "");
1633
+ if (trimmed && /\.\w{1,6}$/.test(trimmed)) paths.add(trimmed);
1634
+ };
1635
+ const backtickRe = /`([^`\n]+?\.\w{1,6})`/g;
1636
+ let m;
1637
+ while ((m = backtickRe.exec(content)) !== null) add(m[1]);
1638
+ const zhRe = /(?:已保存(?:到)?|已写入(?:到)?|已创建|已生成|文件路径[::]|保存为|写入到)\s*[`'"“”]?([^\s`'"“”,,。\n]+?\.\w{1,6})/g;
1639
+ while ((m = zhRe.exec(content)) !== null) add(m[1]);
1640
+ const enRe = /(?:saved|written|created)\s+(?:to|as|at)\s+[`'"]?([^\s`'"\n,]+?\.\w{1,6})/gi;
1641
+ while ((m = enRe.exec(content)) !== null) add(m[1]);
1642
+ const checkRe = /✅[^\n`]*?[`'"]?([^\s`'"\n,,。]+?\.\w{1,6})/g;
1643
+ while ((m = checkRe.exec(content)) !== null) add(m[1]);
1644
+ return Array.from(paths);
1645
+ }
1646
+ function extractWrittenFilePaths(extraMessages) {
1647
+ const paths = /* @__PURE__ */ new Set();
1648
+ const msgs = extraMessages;
1649
+ const addFromArgs = (raw) => {
1650
+ if (typeof raw === "string") {
1651
+ try {
1652
+ const parsed = JSON.parse(raw);
1653
+ if (typeof parsed.path === "string") paths.add(parsed.path);
1654
+ } catch {
1655
+ }
1656
+ } else if (raw && typeof raw === "object") {
1657
+ const p = raw.path;
1658
+ if (typeof p === "string") paths.add(p);
1659
+ }
1660
+ };
1661
+ for (const msg of msgs) {
1662
+ if (msg.role === "assistant" && Array.isArray(msg.tool_calls)) {
1663
+ for (const tc of msg.tool_calls) {
1664
+ const fn = tc.function;
1665
+ const name = fn?.name ?? "";
1666
+ if (name === "write_file" || name === "edit_file") {
1667
+ addFromArgs(fn?.arguments);
1668
+ }
1669
+ }
1670
+ }
1671
+ if (msg.role === "assistant" && Array.isArray(msg.content)) {
1672
+ for (const block of msg.content) {
1673
+ if (block.type !== "tool_use") continue;
1674
+ const name = block.name ?? "";
1675
+ if (name === "write_file" || name === "edit_file") {
1676
+ addFromArgs(block.input);
1677
+ }
1678
+ }
1679
+ }
1680
+ if (msg.role === "model" && Array.isArray(msg.parts)) {
1681
+ for (const part of msg.parts) {
1682
+ const fc = part.functionCall;
1683
+ if (!fc) continue;
1684
+ const name = fc.name ?? "";
1685
+ if (name === "write_file" || name === "edit_file") {
1686
+ addFromArgs(fc.args);
1687
+ }
1688
+ }
1689
+ }
1690
+ }
1691
+ return Array.from(paths);
1692
+ }
1693
+ function findPhantomClaims(content, extraMessages) {
1694
+ const claimed = extractClaimedFilePaths(content);
1695
+ if (claimed.length === 0) return [];
1696
+ const normalize = (p) => p.replace(/\\/g, "/").toLowerCase().replace(/^\.\//, "");
1697
+ const basename2 = (p) => {
1698
+ const parts = normalize(p).split("/");
1699
+ return parts[parts.length - 1] ?? "";
1700
+ };
1701
+ const written = extractWrittenFilePaths(extraMessages).map(normalize);
1702
+ const writtenBases = new Set(written.map(basename2));
1703
+ const writtenFull = new Set(written);
1704
+ return claimed.filter((raw) => {
1705
+ const norm = normalize(raw);
1706
+ if (writtenFull.has(norm)) return false;
1707
+ for (const w of writtenFull) {
1708
+ if (w.endsWith("/" + norm) || norm.endsWith("/" + w)) return false;
1709
+ }
1710
+ if (writtenBases.has(basename2(norm))) return false;
1711
+ return true;
1712
+ });
1713
+ }
1714
+ function buildPhantomCorrectionMessage(phantoms) {
1715
+ const list = phantoms.map((p) => ` - ${p}`).join("\n");
1716
+ return "You claimed to have written the following file(s), but no matching write_file tool call was actually made in this turn:\n" + list + '\n\nEach of these files does NOT exist on disk. You MUST now invoke write_file (via the function calling API) for every missing file listed above. Do NOT output another "completion summary" until the tool calls have actually been made.';
1717
+ }
1590
1718
 
1591
1719
  // src/providers/kimi.ts
1592
1720
  var KIMI_XML_REMINDER = `
@@ -1594,7 +1722,16 @@ var KIMI_XML_REMINDER = `
1594
1722
  [IMPORTANT: Tool Call Format Rules - Kimi Specific]
1595
1723
  When calling any tool (write_file, bash, read_file, etc.), you MUST use the API's structured function calling interface exclusively.
1596
1724
  NEVER output XML-formatted pseudo tool call tags (such as <write_file>, <bash>, <read_file>, etc.) in your reply text.
1597
- XML tags in text will NOT be executed by the system, resulting in files not being written, commands not being run, and complete task failure.`;
1725
+ XML tags in text will NOT be executed by the system, resulting in files not being written, commands not being run, and complete task failure.
1726
+
1727
+ [CRITICAL: Anti-Hallucination Enforcement]
1728
+ You have a known tendency to claim files were "saved" or "created" without actually calling write_file. This is UNACCEPTABLE.
1729
+ Rules you MUST follow:
1730
+ - NEVER type file content into your response text. ALL file content goes through write_file tool calls ONLY.
1731
+ - After calling write_file, do NOT describe the file content again in text \u2014 just confirm the tool call result.
1732
+ - When generating multiple files: call write_file for file 1 \u2192 call write_file for file 2 \u2192 ... \u2192 THEN summarize.
1733
+ - If you catch yourself writing markdown/code that should be a file, STOP and use write_file instead.
1734
+ - The system will detect and reject phantom claims. Each failed detection wastes a round. Be honest.`;
1598
1735
  var KimiProvider = class extends OpenAICompatibleProvider {
1599
1736
  defaultBaseUrl = "https://api.moonshot.ai/v1";
1600
1737
  // 禁用流式工具调用:Kimi 的 XML 伪调用检测(方案 A)需要完整响应
@@ -3334,7 +3471,11 @@ export {
3334
3471
  detectsHallucinatedFileOp,
3335
3472
  hadPreviousWriteToolCalls,
3336
3473
  TOOL_CALL_REMINDER,
3474
+ buildWriteRoundReminder,
3337
3475
  HALLUCINATION_CORRECTION_MESSAGE,
3476
+ extractWrittenFilePaths,
3477
+ findPhantomClaims,
3478
+ buildPhantomCorrectionMessage,
3338
3479
  ProviderRegistry,
3339
3480
  getContentText,
3340
3481
  SessionManager,
@@ -387,7 +387,7 @@ ${content}`);
387
387
  }
388
388
  }
389
389
  async function runTaskMode(config, providers, configManager, topic) {
390
- const { TaskOrchestrator } = await import("./task-orchestrator-TDBWMIH4.js");
390
+ const { TaskOrchestrator } = await import("./task-orchestrator-VUAHWAAP.js");
391
391
  const orchestrator = new TaskOrchestrator(config, providers, configManager);
392
392
  let interrupted = false;
393
393
  const onSigint = () => {
package/dist/index.js CHANGED
@@ -8,8 +8,12 @@ import {
8
8
  SessionManager,
9
9
  SkillManager,
10
10
  TOOL_CALL_REMINDER,
11
+ buildPhantomCorrectionMessage,
12
+ buildWriteRoundReminder,
11
13
  clearDevState,
12
14
  detectsHallucinatedFileOp,
15
+ extractWrittenFilePaths,
16
+ findPhantomClaims,
13
17
  formatGitContextForPrompt,
14
18
  getContentText,
15
19
  getGitContext,
@@ -20,7 +24,7 @@ import {
20
24
  saveDevState,
21
25
  sessionHasMeaningfulContent,
22
26
  setupProxy
23
- } from "./chunk-SAJICC6G.js";
27
+ } from "./chunk-HNS4LEHL.js";
24
28
  import {
25
29
  ToolExecutor,
26
30
  ToolRegistry,
@@ -33,7 +37,7 @@ import {
33
37
  spawnAgentContext,
34
38
  theme,
35
39
  undoStack
36
- } from "./chunk-EWJQOJSB.js";
40
+ } from "./chunk-4EOFMJCR.js";
37
41
  import {
38
42
  fileCheckpoints
39
43
  } from "./chunk-4BKXL7SM.js";
@@ -57,7 +61,7 @@ import {
57
61
  SKILLS_DIR_NAME,
58
62
  VERSION,
59
63
  buildUserIdentityPrompt
60
- } from "./chunk-7SW4XRDJ.js";
64
+ } from "./chunk-4WGZEAGJ.js";
61
65
 
62
66
  // src/index.ts
63
67
  import { program } from "commander";
@@ -2083,7 +2087,7 @@ ${hint}` : "")
2083
2087
  usage: "/test [command|filter]",
2084
2088
  async execute(args, ctx) {
2085
2089
  try {
2086
- const { executeTests } = await import("./run-tests-QRH2Z2OH.js");
2090
+ const { executeTests } = await import("./run-tests-NBCWIU4B.js");
2087
2091
  const argStr = args.join(" ").trim();
2088
2092
  let testArgs = {};
2089
2093
  if (argStr) {
@@ -4807,19 +4811,22 @@ You have a maximum of ${MAX_TOOL_ROUNDS} tool call rounds for this task. Plan ef
4807
4811
  if ("content" in result) {
4808
4812
  const hasWriteTools = toolDefs.some((t) => t.name === "write_file" || t.name === "edit_file");
4809
4813
  const alreadyWrote = hadPreviousWriteToolCalls(extraMessages);
4810
- if (!this.planMode && // Plan Mode 下跳过虚假声明检测
4811
- hasWriteTools && !alreadyWrote && result.content && detectsHallucinatedFileOp(result.content) && round < MAX_TOOL_ROUNDS - 1) {
4814
+ const phantomPaths = !this.planMode && hasWriteTools && result.content ? findPhantomClaims(result.content, extraMessages) : [];
4815
+ const coarseHallucination = !this.planMode && hasWriteTools && !alreadyWrote && !!result.content && detectsHallucinatedFileOp(result.content);
4816
+ if ((phantomPaths.length > 0 || coarseHallucination) && round < MAX_TOOL_ROUNDS - 1) {
4812
4817
  const providerName = this.currentProvider;
4818
+ const detail = phantomPaths.length > 0 ? ` phantom files: ${phantomPaths.join(", ")}` : "";
4813
4819
  process.stderr.write(
4814
- `[${providerName}] \u26A0 Hallucinated completion detected (AI claimed file was written but no tool was called), forcing retry...
4820
+ `[${providerName}] \u26A0 Hallucinated completion detected (AI claimed file was written but no tool was called), forcing retry...${detail}
4815
4821
  `
4816
4822
  );
4817
4823
  if (alreadyRendered) {
4818
4824
  process.stdout.write("\n");
4819
4825
  }
4826
+ const correctionMsg = phantomPaths.length > 0 ? buildPhantomCorrectionMessage(phantomPaths) : HALLUCINATION_CORRECTION_MESSAGE;
4820
4827
  extraMessages.push(
4821
4828
  { role: "assistant", content: result.content },
4822
- { role: "user", content: HALLUCINATION_CORRECTION_MESSAGE }
4829
+ { role: "user", content: correctionMsg }
4823
4830
  );
4824
4831
  spinner.start(`Retrying... (round ${round + 2}/${MAX_TOOL_ROUNDS})`);
4825
4832
  continue;
@@ -4962,6 +4969,18 @@ You have a maximum of ${MAX_TOOL_ROUNDS} tool call rounds for this task. Plan ef
4962
4969
  const reasoningContent = "reasoningContent" in result ? result.reasoningContent : void 0;
4963
4970
  const newMsgs = provider.buildToolResultMessages(result.toolCalls, toolResults, reasoningContent);
4964
4971
  extraMessages.push(...newMsgs);
4972
+ const thisRoundHadWrite = result.toolCalls.some(
4973
+ (tc) => tc.name === "write_file" || tc.name === "edit_file"
4974
+ );
4975
+ if (thisRoundHadWrite) {
4976
+ const totalWritten = extractWrittenFilePaths(extraMessages).length;
4977
+ if (totalWritten > 0) {
4978
+ extraMessages.push({
4979
+ role: "user",
4980
+ content: buildWriteRoundReminder(totalWritten)
4981
+ });
4982
+ }
4983
+ }
4965
4984
  const allFree = result.toolCalls.every((tc) => FREE_ROUND_TOOLS.has(tc.name));
4966
4985
  if (allFree) {
4967
4986
  consecutiveFreeRounds++;
@@ -5378,7 +5397,7 @@ program.command("web").description("Start Web UI server with browser-based chat
5378
5397
  console.error("Error: Invalid port number. Must be between 1 and 65535.");
5379
5398
  process.exit(1);
5380
5399
  }
5381
- const { startWebServer } = await import("./server-46ANSDN7.js");
5400
+ const { startWebServer } = await import("./server-67B52TFH.js");
5382
5401
  await startWebServer({ port, host: options.host });
5383
5402
  });
5384
5403
  program.command("user [action] [username]").description("Manage Web UI users (list | create <name> | delete <name> | reset-password <name> | migrate <name>)").action(async (action, username) => {
@@ -5611,7 +5630,7 @@ program.command("hub [topic]").description("Start multi-agent hub (discuss / bra
5611
5630
  }),
5612
5631
  config.get("customProviders")
5613
5632
  );
5614
- const { startHub } = await import("./hub-QJBT4RDT.js");
5633
+ const { startHub } = await import("./hub-FKLTP6IO.js");
5615
5634
  await startHub(
5616
5635
  {
5617
5636
  topic: topic ?? "",
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  executeTests,
3
3
  runTestsTool
4
- } from "./chunk-L7OCMF5F.js";
4
+ } from "./chunk-4TUVB27S.js";
5
5
  export {
6
6
  executeTests,
7
7
  runTestsTool
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  executeTests,
4
4
  runTestsTool
5
- } from "./chunk-7SW4XRDJ.js";
5
+ } from "./chunk-4WGZEAGJ.js";
6
6
  export {
7
7
  executeTests,
8
8
  runTestsTool
@@ -15,7 +15,7 @@ import {
15
15
  hadPreviousWriteToolCalls,
16
16
  loadDevState,
17
17
  setupProxy
18
- } from "./chunk-SAJICC6G.js";
18
+ } from "./chunk-HNS4LEHL.js";
19
19
  import {
20
20
  AuthManager
21
21
  } from "./chunk-BYNY5JPB.js";
@@ -33,7 +33,7 @@ import {
33
33
  spawnAgentContext,
34
34
  truncateOutput,
35
35
  undoStack
36
- } from "./chunk-EWJQOJSB.js";
36
+ } from "./chunk-4EOFMJCR.js";
37
37
  import "./chunk-4BKXL7SM.js";
38
38
  import {
39
39
  AGENTIC_BEHAVIOR_GUIDELINE,
@@ -52,7 +52,7 @@ import {
52
52
  SKILLS_DIR_NAME,
53
53
  VERSION,
54
54
  buildUserIdentityPrompt
55
- } from "./chunk-7SW4XRDJ.js";
55
+ } from "./chunk-4WGZEAGJ.js";
56
56
 
57
57
  // src/web/server.ts
58
58
  import express from "express";
@@ -1606,7 +1606,7 @@ ${undoResults.map((r) => ` \u2022 ${r}`).join("\n")}` });
1606
1606
  case "test": {
1607
1607
  this.send({ type: "info", message: "\u{1F9EA} Running tests..." });
1608
1608
  try {
1609
- const { executeTests } = await import("./run-tests-QRH2Z2OH.js");
1609
+ const { executeTests } = await import("./run-tests-NBCWIU4B.js");
1610
1610
  const argStr = args.join(" ").trim();
1611
1611
  let testArgs = {};
1612
1612
  if (argStr) {
@@ -4,11 +4,11 @@ import {
4
4
  getDangerLevel,
5
5
  googleSearchContext,
6
6
  truncateOutput
7
- } from "./chunk-EWJQOJSB.js";
7
+ } from "./chunk-4EOFMJCR.js";
8
8
  import "./chunk-4BKXL7SM.js";
9
9
  import {
10
10
  SUBAGENT_ALLOWED_TOOLS
11
- } from "./chunk-7SW4XRDJ.js";
11
+ } from "./chunk-4WGZEAGJ.js";
12
12
 
13
13
  // src/hub/task-orchestrator.ts
14
14
  import { createInterface } from "readline";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jinzd-ai-cli",
3
- "version": "0.4.28",
3
+ "version": "0.4.30",
4
4
  "description": "Cross-platform REPL-style AI CLI with multi-provider support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",