jinzd-ai-cli 0.4.48 → 0.4.49

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.
@@ -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.48";
9
+ var VERSION = "0.4.49";
10
10
  var APP_NAME = "ai-cli";
11
11
  var CONFIG_DIR_NAME = ".aicli";
12
12
  var CONFIG_FILE_NAME = "config.json";
@@ -81,9 +81,7 @@ var AGENTIC_BEHAVIOR_GUIDELINE = `# Important Behavioral Guidelines
81
81
 
82
82
  **Respond appropriately to the user's intent \u2014 do NOT over-react**:
83
83
  - For **greetings and casual chat** (e.g., "hello", "hi", "hey", "\u4F60\u597D", "what's up"): respond naturally with a friendly greeting. Do NOT use any tools. Do NOT explore directories, read files, or start any project work. Just chat.
84
- - When the user asks you to "read", "understand", "review", "analyze", "examine", or "look at" files or a project, your task is only to **read and summarize**, then wait for the user's next instruction.
85
- - **Be Efficient**: Minimize the number of tool calls. For "understanding a project", reading the README and a few key entry points or configuration files is usually sufficient. Do NOT recursively explore the entire file tree or read every single file unless explicitly asked to.
86
- - **Stop Early**: Once you have gathered enough information to provide a meaningful answer or summary, STOP using tools and provide your response. Do not use up rounds just because they are available.
84
+ - When the user asks you to "read", "understand", "review", "analyze", "examine", or "look at" files or a project, your task is only to **read and summarize**, then wait for the user's next instruction. Do not automatically start executing tasks described in the project.
87
85
  - Only begin using write/execute tools when the user **explicitly requests** an action (e.g., "generate", "create", "modify", "run", "start", etc.).
88
86
  - Project context files (CLAUDE.md, AICLI.md) provide background information about the project. They are NOT instructions to start working. Only use them as reference when the user asks a project-related question or task.
89
87
  - If you are unsure about the user's intent, use the ask_user tool to confirm with the user, rather than assuming and executing on your own.`;
@@ -7,7 +7,7 @@ import {
7
7
  ProviderNotFoundError,
8
8
  RateLimitError,
9
9
  schemaToJsonSchema
10
- } from "./chunk-IOBYDSAC.js";
10
+ } from "./chunk-KVYVWJYK.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-3LYM62CK.js";
23
+ } from "./chunk-NFIYEIFJ.js";
24
24
 
25
25
  // src/config/config-manager.ts
26
26
  import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
@@ -1544,31 +1544,38 @@ var ZhipuProvider = class extends OpenAICompatibleProvider {
1544
1544
  };
1545
1545
 
1546
1546
  // src/tools/hallucination.ts
1547
+ var HALLUCINATION_PATTERNS = [
1548
+ /文件路径[::]\s*`?[^\s`]+\.\w{1,5}/,
1549
+ // 文件路径: `path/to/file.ext`(要求文件扩展名)
1550
+ /已生成[::!!]/,
1551
+ // 已生成完成!
1552
+ /已保存到?\s*[`'"]/,
1553
+ // 已保存到 `path`(要求后跟路径引号)
1554
+ /已写入[::!!]/,
1555
+ // 已写入!
1556
+ /已创建[::!!]/,
1557
+ // 已创建!
1558
+ /File\s+(?:written|saved|created)\s+(?:to|as|at)/i,
1559
+ // File written to / saved as(要求介词)
1560
+ /生成完成[!!]/,
1561
+ // 生成完成!
1562
+ /✅\s*(?:文件|已[生保写创]|第)\S*\.\w{1,5}/,
1563
+ // ✅ 文件已保存 path.ext(要求文件扩展名)
1564
+ /文件已[成功]?创建/,
1565
+ // 文件已成功创建 / 文件已创建
1566
+ /教案已[成功]?[生创保写]/,
1567
+ // 教案已成功生成 / 教案已保存
1568
+ /已成功[保写创生]入?[::!!\s`'"]/,
1569
+ // 已成功保存 / 已成功写入 / 已成功创建
1570
+ /保存[到至]了?\s*[`'"]/,
1571
+ // 保存到了 `path` / 保存至 'path'
1572
+ /内容如下[::]/,
1573
+ // 内容如下:(后跟大段文件内容)
1574
+ /以下是.*(?:教案|文件|内容)[::]/
1575
+ // 以下是xx教案内容:(Kimi 常见模式)
1576
+ ];
1547
1577
  function detectsHallucinatedFileOp(content) {
1548
- const sentences = content.split(/[。!?;!?!;]/);
1549
- const objects = ["\u6559\u6848", "\u6587\u6863", "\u6587\u4EF6", "\u4EE3\u7801", "\u5185\u5BB9", "lesson plan", "file", "content", "document"];
1550
- const actions = ["\u5DF2\u4FDD\u5B58", "\u5DF2\u5199\u5165", "\u5DF2\u521B\u5EFA", "\u5DF2\u751F\u6210", "\u7F16\u5199\u5B8C\u6210", "\u4FDD\u5B58\u5B8C\u6210", "\u5199\u5165\u5B8C\u6210", "\u751F\u6210\u5B8C\u6210", "\u6210\u529F\u4FDD\u5B58", "\u6210\u529F\u5199\u5165", "\u4FDD\u5B58\u5230", "\u5199\u5165\u5230", "written", "saved", "created", "generated", "completed"];
1551
- const lessonPattern = /第\s*\d+\s*课时.*(?:完成|保存|编写)/;
1552
- for (const s of sentences) {
1553
- const trimmed = s.trim();
1554
- if (!trimmed) continue;
1555
- if (lessonPattern.test(trimmed)) return true;
1556
- const hasObject = objects.some((obj) => trimmed.includes(obj));
1557
- const hasAction = actions.some((act) => trimmed.includes(act));
1558
- if (hasObject && hasAction) {
1559
- const ignoreKeywords = ["\u662F\u5426", "\u786E\u8BA4", "\u9700\u8981", "\u51C6\u5907", "\u8BA1\u5212", "if you", "do you"];
1560
- if (!ignoreKeywords.some((ik) => trimmed.includes(ignoreKeywords))) {
1561
- return true;
1562
- }
1563
- }
1564
- }
1565
- const backupPatterns = [
1566
- /✅\s*已完成[::]?\s*第?\d+\s*课时/,
1567
- /内容如下[::]/,
1568
- /以下是.*(?:教案|文件|内容)[::]/,
1569
- /File\s+(?:written|saved|created)\s+(?:to|as|at)/i
1570
- ];
1571
- return backupPatterns.some((p) => p.test(content));
1578
+ return HALLUCINATION_PATTERNS.some((pattern) => pattern.test(content));
1572
1579
  }
1573
1580
  function hadPreviousWriteToolCalls(extraMessages) {
1574
1581
  const msgs = extraMessages;
@@ -1616,29 +1623,36 @@ function buildWriteRoundReminder(writtenCount) {
1616
1623
  return `
1617
1624
 
1618
1625
  [Write Progress Reminder]
1619
- You have successfully called write_file ${writtenCount} time(s) so far in this turn. If there are more files that MUST be written to complete the user's explicit request, continue now. Otherwise, if you have finished the task, you may provide your final summary.`;
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.`;
1620
1627
  }
1621
- var HALLUCINATION_CORRECTION_MESSAGE = 'I noticed you mentioned completing a file operation in your response, but no tool call was actually made. If your intention was to create or modify a file, please use the `write_file` or `edit_file` tool now. HOWEVER, if you were just providing an example, summarizing project specs, or referring to existing files, please clarify this in your next response and DO NOT attempt to write any files. Remember: if the user only asked for a "summary" or "analysis", you should NOT be writing files at all.';
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.";
1622
1629
  function extractClaimedFilePaths(content) {
1623
1630
  const paths = /* @__PURE__ */ new Set();
1624
1631
  const add = (p) => {
1625
1632
  const trimmed = p.trim().replace(/[,,。、;;::]+$/, "");
1626
- if (trimmed && /\.\w{1,6}$/.test(trimmed) && !trimmed.includes("<") && !trimmed.includes("{")) {
1627
- paths.add(trimmed);
1628
- }
1633
+ if (trimmed && /\.\w{1,6}$/.test(trimmed)) paths.add(trimmed);
1629
1634
  };
1630
- const lines = content.split("\n").filter((line) => {
1631
- const skipKeywords = ["\u793A\u4F8B", "\u4F8B\u5982", "\u6A21\u677F", "\u89C4\u8303", "example", "template", "instance", "spec"];
1632
- return !skipKeywords.some((k) => line.toLowerCase().includes(k));
1633
- });
1634
- const filteredContent = lines.join("\n");
1635
1635
  let m;
1636
- const zhRe = /(?:已保存(?:到)?|已写入(?:到)?|已成功(?:创建|生成)|保存为|写入到)\s*[`'"“”]?([^\s`'"“”,,。\n]+?\.\w{1,6})/g;
1637
- while ((m = zhRe.exec(filteredContent)) !== null) add(m[1]);
1638
- const enRe = /(?:saved|written|created|generated)\s+(?:to|as|at|successfully)\s+[`'"]?([^\s`'"\n,]+?\.\w{1,6})/gi;
1639
- while ((m = enRe.exec(filteredContent)) !== null) add(m[1]);
1640
- const checkRe = /✅\s*(?:文件|已[生保写创]|第)\s*[`'"]?([^\s`'"\n,,。]+?\.\w{1,6})/g;
1641
- while ((m = checkRe.exec(filteredContent)) !== null) add(m[1]);
1636
+ const actionLineRe = /(?:已[生保写创]|saved|written|created|完成.*(?:写入|保存|创建|生成)|输出|file\s+(?:saved|written|created))/i;
1637
+ const backtickRe = /`([^`\n]+?\.\w{1,6})`/g;
1638
+ while ((m = backtickRe.exec(content)) !== null) {
1639
+ let pos = m.index;
1640
+ let linesBack = 0;
1641
+ while (linesBack < 9 && pos > 0) {
1642
+ pos--;
1643
+ if (content[pos] === "\n") linesBack++;
1644
+ }
1645
+ const windowStart = pos === 0 ? 0 : pos + 1;
1646
+ const lineEndIdx = content.indexOf("\n", m.index + m[0].length);
1647
+ const window = content.slice(windowStart, lineEndIdx === -1 ? void 0 : lineEndIdx);
1648
+ if (actionLineRe.test(window)) add(m[1]);
1649
+ }
1650
+ const zhRe = /(?:已保存(?:到)?|已写入(?:到)?|已创建|已生成|文件路径[::]|保存为|写入到)\s*[`'”””]?([^\s`'”””,,。\n]+?\.\w{1,6})/g;
1651
+ while ((m = zhRe.exec(content)) !== null) add(m[1]);
1652
+ const enRe = /(?:saved|written|created)\s+(?:to|as|at)\s+[`'”]?([^\s`'”\n,]+?\.\w{1,6})/gi;
1653
+ while ((m = enRe.exec(content)) !== null) add(m[1]);
1654
+ const checkRe = /✅[^\n`]*?[`'”]?([^\s`'”\n,,。]+?\.\w{1,6})/g;
1655
+ while ((m = checkRe.exec(content)) !== null) add(m[1]);
1642
1656
  return Array.from(paths);
1643
1657
  }
1644
1658
  function extractWrittenFilePaths(extraMessages) {
@@ -1711,7 +1725,7 @@ function findPhantomClaims(content, extraMessages) {
1711
1725
  }
1712
1726
  function buildPhantomCorrectionMessage(phantoms) {
1713
1727
  const list = phantoms.map((p) => ` - ${p}`).join("\n");
1714
- return "You mentioned the following file(s) as if they were just processed, but no matching `write_file` tool call was detected in this turn:\n" + list + "\n\nVerification required:\n1. If you intended to CREATE these files, you MUST invoke `write_file` for each one now.\n2. If these are just EXAMPLES or EXISTING files you were summarizing, please ignore this warning, clarify your intent, and STOP your tool-calling loop. Do NOT write them if the user didn't ask you to.";
1728
+ 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.';
1715
1729
  }
1716
1730
 
1717
1731
  // src/providers/kimi.ts
@@ -9,7 +9,7 @@ import {
9
9
  SUBAGENT_DEFAULT_MAX_ROUNDS,
10
10
  SUBAGENT_MAX_ROUNDS_LIMIT,
11
11
  runTestsTool
12
- } from "./chunk-3LYM62CK.js";
12
+ } from "./chunk-NFIYEIFJ.js";
13
13
 
14
14
  // src/tools/builtin/bash.ts
15
15
  import { execSync } from "child_process";
@@ -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.48";
11
+ var VERSION = "0.4.49";
12
12
  var APP_NAME = "ai-cli";
13
13
  var CONFIG_DIR_NAME = ".aicli";
14
14
  var CONFIG_FILE_NAME = "config.json";
@@ -84,9 +84,7 @@ var AGENTIC_BEHAVIOR_GUIDELINE = `# Important Behavioral Guidelines
84
84
 
85
85
  **Respond appropriately to the user's intent \u2014 do NOT over-react**:
86
86
  - For **greetings and casual chat** (e.g., "hello", "hi", "hey", "\u4F60\u597D", "what's up"): respond naturally with a friendly greeting. Do NOT use any tools. Do NOT explore directories, read files, or start any project work. Just chat.
87
- - When the user asks you to "read", "understand", "review", "analyze", "examine", or "look at" files or a project, your task is only to **read and summarize**, then wait for the user's next instruction.
88
- - **Be Efficient**: Minimize the number of tool calls. For "understanding a project", reading the README and a few key entry points or configuration files is usually sufficient. Do NOT recursively explore the entire file tree or read every single file unless explicitly asked to.
89
- - **Stop Early**: Once you have gathered enough information to provide a meaningful answer or summary, STOP using tools and provide your response. Do not use up rounds just because they are available.
87
+ - When the user asks you to "read", "understand", "review", "analyze", "examine", or "look at" files or a project, your task is only to **read and summarize**, then wait for the user's next instruction. Do not automatically start executing tasks described in the project.
90
88
  - Only begin using write/execute tools when the user **explicitly requests** an action (e.g., "generate", "create", "modify", "run", "start", etc.).
91
89
  - Project context files (CLAUDE.md, AICLI.md) provide background information about the project. They are NOT instructions to start working. Only use them as reference when the user asks a project-related question or task.
92
90
  - If you are unsure about the user's intent, use the ask_user tool to confirm with the user, rather than assuming and executing on your own.`;
@@ -385,7 +385,7 @@ ${content}`);
385
385
  }
386
386
  }
387
387
  async function runTaskMode(config, providers, configManager, topic) {
388
- const { TaskOrchestrator } = await import("./task-orchestrator-FZ6MMN23.js");
388
+ const { TaskOrchestrator } = await import("./task-orchestrator-ITCC3NZL.js");
389
389
  const orchestrator = new TaskOrchestrator(config, providers, configManager);
390
390
  let interrupted = false;
391
391
  const onSigint = () => {
package/dist/index.js CHANGED
@@ -24,7 +24,7 @@ import {
24
24
  saveDevState,
25
25
  sessionHasMeaningfulContent,
26
26
  setupProxy
27
- } from "./chunk-6LRI6VU5.js";
27
+ } from "./chunk-47CNWVOC.js";
28
28
  import {
29
29
  ToolExecutor,
30
30
  ToolRegistry,
@@ -37,7 +37,7 @@ import {
37
37
  spawnAgentContext,
38
38
  theme,
39
39
  undoStack
40
- } from "./chunk-IOBYDSAC.js";
40
+ } from "./chunk-KVYVWJYK.js";
41
41
  import {
42
42
  fileCheckpoints
43
43
  } from "./chunk-4BKXL7SM.js";
@@ -61,7 +61,7 @@ import {
61
61
  SKILLS_DIR_NAME,
62
62
  VERSION,
63
63
  buildUserIdentityPrompt
64
- } from "./chunk-3LYM62CK.js";
64
+ } from "./chunk-NFIYEIFJ.js";
65
65
 
66
66
  // src/index.ts
67
67
  import { program } from "commander";
@@ -2099,7 +2099,7 @@ ${hint}` : "")
2099
2099
  usage: "/test [command|filter]",
2100
2100
  async execute(args, ctx) {
2101
2101
  try {
2102
- const { executeTests } = await import("./run-tests-G4WGBJGQ.js");
2102
+ const { executeTests } = await import("./run-tests-K6IYLG6T.js");
2103
2103
  const argStr = args.join(" ").trim();
2104
2104
  let testArgs = {};
2105
2105
  if (argStr) {
@@ -4190,58 +4190,45 @@ Session '${this.resumeSessionId}' not found.
4190
4190
  }
4191
4191
  async handleChat(userInput) {
4192
4192
  const session = this.sessions.current;
4193
- const readIntentKeywords = ["\u4E86\u89E3", "\u9605\u8BFB", "\u67E5\u770B", "\u5206\u6790", "\u6982\u62EC", "\u603B\u7ED3", "read", "understand", "analyze", "summarize", "review", "look at"];
4194
- const writeIntentKeywords = ["\u521B\u5EFA", "\u751F\u6210", "\u7F16\u5199", "\u4FEE\u6539", "\u66F4\u65B0", "\u8FD0\u884C", "create", "generate", "write", "modify", "update", "run", "fix", "start"];
4195
- const normalizedInput = userInput.toLowerCase();
4196
- const isReadIntent = readIntentKeywords.some((k) => normalizedInput.includes(k));
4197
- const isWriteIntent = writeIntentKeywords.some((k) => normalizedInput.includes(k));
4198
- const originalBlockedTools = this.blockedTools;
4199
- if (isReadIntent && !isWriteIntent) {
4200
- const readOnlyBlocks = ["write_file", "edit_file", "bash", "run_interactive", "task_create", "task_stop", "git_commit"];
4201
- const newBlocked = new Set(originalBlockedTools);
4202
- for (const t of readOnlyBlocks) newBlocked.add(t);
4203
- this.blockedTools = newBlocked;
4204
- process.stdout.write(theme.dim(" \u{1F6E1}\uFE0F Read-only intent detected: restricting write tools for this turn.\n"));
4205
- }
4206
- const t0 = Date.now();
4207
- try {
4208
- const { parts, hasImage, refs } = parseAtReferences(userInput, process.cwd());
4209
- for (const ref of refs) {
4210
- if (ref.type === "notfound") {
4211
- process.stdout.write(theme.warning(` \u26A0 File not found: ${ref.path}
4193
+ const { parts, hasImage, refs } = parseAtReferences(userInput, process.cwd());
4194
+ for (const ref of refs) {
4195
+ if (ref.type === "notfound") {
4196
+ process.stdout.write(theme.warning(` \u26A0 File not found: ${ref.path}
4212
4197
  `));
4213
- } else if (ref.type === "toolarge") {
4214
- process.stdout.write(theme.warning(` \u26A0 Image too large (> 10 MB): ${ref.path}
4198
+ } else if (ref.type === "toolarge") {
4199
+ process.stdout.write(theme.warning(` \u26A0 Image too large (> 10 MB): ${ref.path}
4215
4200
  `));
4216
- } else if (ref.type === "image") {
4217
- process.stdout.write(theme.dim(` \u{1F4CE} Image: ${ref.path}
4201
+ } else if (ref.type === "image") {
4202
+ process.stdout.write(theme.dim(` \u{1F4CE} Image: ${ref.path}
4218
4203
  `));
4219
- } else {
4220
- process.stdout.write(theme.dim(` \u{1F4C4} File: ${ref.path}
4204
+ } else {
4205
+ process.stdout.write(theme.dim(` \u{1F4C4} File: ${ref.path}
4221
4206
  `));
4222
- }
4223
4207
  }
4224
- const messageContent = parts.length > 0 ? parts.length === 1 && parts[0].type === "text" ? parts[0].text : parts : userInput;
4225
- if (hasImage) {
4226
- const visionHint = this.getVisionModelHint();
4227
- if (visionHint) {
4228
- process.stdout.write(
4229
- theme.warning(` \u2716 Vision not supported \u2013 ${visionHint}
4230
- `)
4231
- );
4232
- return;
4233
- }
4208
+ }
4209
+ const messageContent = parts.length > 0 ? parts.length === 1 && parts[0].type === "text" ? parts[0].text : parts : userInput;
4210
+ if (hasImage) {
4211
+ const visionHint = this.getVisionModelHint();
4212
+ if (visionHint) {
4234
4213
  process.stdout.write(
4235
- theme.dim(` \u{1F5BC} Vision request \u2013 sending image to ${this.currentProvider}
4214
+ theme.warning(` \u2716 Vision not supported \u2013 ${visionHint}
4236
4215
  `)
4237
4216
  );
4217
+ return;
4238
4218
  }
4239
- session.addMessage({
4240
- role: "user",
4241
- content: messageContent,
4242
- timestamp: /* @__PURE__ */ new Date()
4243
- });
4244
- this.events.emit("message.before", { input: userInput });
4219
+ process.stdout.write(
4220
+ theme.dim(` \u{1F5BC} Vision request \u2013 sending image to ${this.currentProvider}
4221
+ `)
4222
+ );
4223
+ }
4224
+ session.addMessage({
4225
+ role: "user",
4226
+ content: messageContent,
4227
+ timestamp: /* @__PURE__ */ new Date()
4228
+ });
4229
+ this.events.emit("message.before", { input: userInput });
4230
+ const t0 = Date.now();
4231
+ try {
4245
4232
  const provider = this.providers.get(this.currentProvider);
4246
4233
  const supportsTools = "chatWithTools" in provider;
4247
4234
  if (supportsTools) {
@@ -4262,8 +4249,6 @@ Session '${this.resumeSessionId}' not found.
4262
4249
  }
4263
4250
  } catch (err) {
4264
4251
  this.renderer.renderError(err);
4265
- } finally {
4266
- this.blockedTools = originalBlockedTools;
4267
4252
  }
4268
4253
  }
4269
4254
  /**
@@ -4899,8 +4884,8 @@ You have a maximum of ${MAX_TOOL_ROUNDS} tool call rounds for this task. Plan ef
4899
4884
  if ("content" in result) {
4900
4885
  const hasWriteTools = toolDefs.some((t) => t.name === "write_file" || t.name === "edit_file");
4901
4886
  const alreadyWrote = hadPreviousWriteToolCalls(extraMessages);
4902
- const phantomPaths = !this.planMode && hasWriteTools && result.content ? findPhantomClaims(result.content, extraMessages) : [];
4903
4887
  const coarseHallucination = !this.planMode && hasWriteTools && !alreadyWrote && !!result.content && detectsHallucinatedFileOp(result.content);
4888
+ const phantomPaths = (coarseHallucination || alreadyWrote) && !this.planMode && hasWriteTools && result.content ? findPhantomClaims(result.content, extraMessages) : [];
4904
4889
  if ((phantomPaths.length > 0 || coarseHallucination) && round < MAX_TOOL_ROUNDS - 1) {
4905
4890
  const providerName = this.currentProvider;
4906
4891
  const detail = phantomPaths.length > 0 ? ` phantom files: ${phantomPaths.join(", ")}` : "";
@@ -5484,7 +5469,7 @@ program.command("web").description("Start Web UI server with browser-based chat
5484
5469
  console.error("Error: Invalid port number. Must be between 1 and 65535.");
5485
5470
  process.exit(1);
5486
5471
  }
5487
- const { startWebServer } = await import("./server-SBFYZ3PX.js");
5472
+ const { startWebServer } = await import("./server-F3UVAUXJ.js");
5488
5473
  await startWebServer({ port, host: options.host });
5489
5474
  });
5490
5475
  program.command("user [action] [username]").description("Manage Web UI users (list | create <name> | delete <name> | reset-password <name> | migrate <name>)").action(async (action, username) => {
@@ -5717,7 +5702,7 @@ program.command("hub [topic]").description("Start multi-agent hub (discuss / bra
5717
5702
  }),
5718
5703
  config.get("customProviders")
5719
5704
  );
5720
- const { startHub } = await import("./hub-5SKCTVFM.js");
5705
+ const { startHub } = await import("./hub-TNV3IFDX.js");
5721
5706
  await startHub(
5722
5707
  {
5723
5708
  topic: topic ?? "",
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  executeTests,
3
3
  runTestsTool
4
- } from "./chunk-4FTOI5FP.js";
4
+ } from "./chunk-2K5YVZJI.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-3LYM62CK.js";
5
+ } from "./chunk-NFIYEIFJ.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-6LRI6VU5.js";
18
+ } from "./chunk-47CNWVOC.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-IOBYDSAC.js";
36
+ } from "./chunk-KVYVWJYK.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-3LYM62CK.js";
55
+ } from "./chunk-NFIYEIFJ.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-G4WGBJGQ.js");
1609
+ const { executeTests } = await import("./run-tests-K6IYLG6T.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-IOBYDSAC.js";
7
+ } from "./chunk-KVYVWJYK.js";
8
8
  import "./chunk-4BKXL7SM.js";
9
9
  import {
10
10
  SUBAGENT_ALLOWED_TOOLS
11
- } from "./chunk-3LYM62CK.js";
11
+ } from "./chunk-NFIYEIFJ.js";
12
12
 
13
13
  // src/hub/task-orchestrator.ts
14
14
  import { createInterface } from "readline";