jinzd-ai-cli 0.4.2 → 0.4.3

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.
@@ -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.2";
11
+ var VERSION = "0.4.3";
12
12
  var APP_NAME = "ai-cli";
13
13
  var CONFIG_DIR_NAME = ".aicli";
14
14
  var CONFIG_FILE_NAME = "config.json";
@@ -62,8 +62,8 @@ You are currently in read-only planning (Plan) mode.
62
62
  - Focus your analysis on reading files and producing actionable plans.
63
63
 
64
64
  Once planning is complete, clearly inform the user: type \`/plan execute\` to begin executing the plan, or \`/plan exit\` to discard it.`;
65
- var SUBAGENT_DEFAULT_MAX_ROUNDS = 10;
66
- var SUBAGENT_MAX_ROUNDS_LIMIT = 15;
65
+ var SUBAGENT_DEFAULT_MAX_ROUNDS = 15;
66
+ var SUBAGENT_MAX_ROUNDS_LIMIT = 30;
67
67
  var SUBAGENT_ALLOWED_TOOLS = /* @__PURE__ */ new Set([
68
68
  "bash",
69
69
  "read_file",
@@ -6,7 +6,7 @@ import {
6
6
  SUBAGENT_DEFAULT_MAX_ROUNDS,
7
7
  SUBAGENT_MAX_ROUNDS_LIMIT,
8
8
  runTestsTool
9
- } from "./chunk-UB6BRUQ4.js";
9
+ } from "./chunk-3LKIHGAR.js";
10
10
 
11
11
  // src/tools/builtin/bash.ts
12
12
  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.2";
9
+ var VERSION = "0.4.3";
10
10
  var APP_NAME = "ai-cli";
11
11
  var CONFIG_DIR_NAME = ".aicli";
12
12
  var CONFIG_FILE_NAME = "config.json";
@@ -59,8 +59,8 @@ You are currently in read-only planning (Plan) mode.
59
59
  - Focus your analysis on reading files and producing actionable plans.
60
60
 
61
61
  Once planning is complete, clearly inform the user: type \`/plan execute\` to begin executing the plan, or \`/plan exit\` to discard it.`;
62
- var SUBAGENT_DEFAULT_MAX_ROUNDS = 10;
63
- var SUBAGENT_MAX_ROUNDS_LIMIT = 15;
62
+ var SUBAGENT_DEFAULT_MAX_ROUNDS = 15;
63
+ var SUBAGENT_MAX_ROUNDS_LIMIT = 30;
64
64
  var SUBAGENT_ALLOWED_TOOLS = /* @__PURE__ */ new Set([
65
65
  "bash",
66
66
  "read_file",
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  EnvLoader,
4
4
  schemaToJsonSchema
5
- } from "./chunk-E2HVDEWW.js";
5
+ } from "./chunk-AQ4O6SVK.js";
6
6
  import {
7
7
  APP_NAME,
8
8
  CONFIG_DIR_NAME,
@@ -15,7 +15,7 @@ import {
15
15
  MCP_TOOL_PREFIX,
16
16
  PLUGINS_DIR_NAME,
17
17
  VERSION
18
- } from "./chunk-UB6BRUQ4.js";
18
+ } from "./chunk-3LKIHGAR.js";
19
19
 
20
20
  // src/config/config-manager.ts
21
21
  import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
@@ -366,7 +366,7 @@ ${content}`);
366
366
  defaultModel,
367
367
  maxRounds: options.maxRounds ?? (mode === "task" ? 15 : 10),
368
368
  enableTools: mode === "task",
369
- maxToolRoundsPerTurn: mode === "task" ? 15 : void 0,
369
+ maxToolRoundsPerTurn: mode === "task" ? 30 : void 0,
370
370
  context,
371
371
  contextFiles: contextFileNames.length > 0 ? contextFileNames : void 0
372
372
  };
@@ -381,7 +381,7 @@ ${content}`);
381
381
  }
382
382
  }
383
383
  async function runTaskMode(config, providers, configManager, topic) {
384
- const { TaskOrchestrator } = await import("./task-orchestrator-GONUQ6TN.js");
384
+ const { TaskOrchestrator } = await import("./task-orchestrator-7NTCIVCF.js");
385
385
  const orchestrator = new TaskOrchestrator(config, providers, configManager);
386
386
  let interrupted = false;
387
387
  const onSigint = () => {
package/dist/index.js CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  saveDevState,
24
24
  sessionHasMeaningfulContent,
25
25
  setupProxy
26
- } from "./chunk-LP2ZH4HH.js";
26
+ } from "./chunk-VC6DFUFP.js";
27
27
  import {
28
28
  ToolRegistry,
29
29
  askUserContext,
@@ -38,7 +38,7 @@ import {
38
38
  theme,
39
39
  truncateOutput,
40
40
  undoStack
41
- } from "./chunk-E2HVDEWW.js";
41
+ } from "./chunk-AQ4O6SVK.js";
42
42
  import {
43
43
  AGENTIC_BEHAVIOR_GUIDELINE,
44
44
  AUTHOR,
@@ -58,7 +58,7 @@ import {
58
58
  REPO_URL,
59
59
  SKILLS_DIR_NAME,
60
60
  VERSION
61
- } from "./chunk-UB6BRUQ4.js";
61
+ } from "./chunk-3LKIHGAR.js";
62
62
 
63
63
  // src/index.ts
64
64
  import { program } from "commander";
@@ -1914,7 +1914,7 @@ ${hint}` : "")
1914
1914
  description: "Run project tests and show structured report",
1915
1915
  usage: "/test [command|filter]",
1916
1916
  async execute(args, _ctx) {
1917
- const { executeTests } = await import("./run-tests-4WOG5THP.js");
1917
+ const { executeTests } = await import("./run-tests-W2RQN33S.js");
1918
1918
  const argStr = args.join(" ").trim();
1919
1919
  let testArgs = {};
1920
1920
  if (argStr) {
@@ -5524,7 +5524,7 @@ program.command("web").description("Start Web UI server with browser-based chat
5524
5524
  console.error("Error: Invalid port number. Must be between 1 and 65535.");
5525
5525
  process.exit(1);
5526
5526
  }
5527
- const { startWebServer } = await import("./server-JNWKHPBS.js");
5527
+ const { startWebServer } = await import("./server-WPLQ2AII.js");
5528
5528
  await startWebServer({ port, host: options.host });
5529
5529
  });
5530
5530
  program.command("user [action] [username]").description("Manage Web UI users (list | create <name> | delete <name> | reset-password <name> | migrate <name>)").action(async (action, username) => {
@@ -5757,7 +5757,7 @@ program.command("hub [topic]").description("Start multi-agent hub (discuss / bra
5757
5757
  }),
5758
5758
  config.get("customProviders")
5759
5759
  );
5760
- const { startHub } = await import("./hub-OXZNGBAY.js");
5760
+ const { startHub } = await import("./hub-UQ2IWPJK.js");
5761
5761
  await startHub(
5762
5762
  {
5763
5763
  topic: topic ?? "",
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  executeTests,
4
4
  runTestsTool
5
- } from "./chunk-UB6BRUQ4.js";
5
+ } from "./chunk-3LKIHGAR.js";
6
6
  export {
7
7
  executeTests,
8
8
  runTestsTool
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  executeTests,
3
3
  runTestsTool
4
- } from "./chunk-54EGIKT5.js";
4
+ } from "./chunk-ROFUA4O3.js";
5
5
  export {
6
6
  executeTests,
7
7
  runTestsTool
@@ -18,7 +18,7 @@ import {
18
18
  renderDiff,
19
19
  runHook,
20
20
  setupProxy
21
- } from "./chunk-LP2ZH4HH.js";
21
+ } from "./chunk-VC6DFUFP.js";
22
22
  import {
23
23
  AuthManager
24
24
  } from "./chunk-CPLT6CD3.js";
@@ -32,7 +32,7 @@ import {
32
32
  spawnAgentContext,
33
33
  truncateOutput,
34
34
  undoStack
35
- } from "./chunk-E2HVDEWW.js";
35
+ } from "./chunk-AQ4O6SVK.js";
36
36
  import {
37
37
  AGENTIC_BEHAVIOR_GUIDELINE,
38
38
  CONTEXT_FILE_CANDIDATES,
@@ -44,7 +44,7 @@ import {
44
44
  PLAN_MODE_SYSTEM_ADDON,
45
45
  SKILLS_DIR_NAME,
46
46
  VERSION
47
- } from "./chunk-UB6BRUQ4.js";
47
+ } from "./chunk-3LKIHGAR.js";
48
48
 
49
49
  // src/web/server.ts
50
50
  import express from "express";
@@ -1440,7 +1440,7 @@ ${undoResults.map((r) => ` \u2022 ${r}`).join("\n")}` });
1440
1440
  case "test": {
1441
1441
  this.send({ type: "info", message: "\u{1F9EA} Running tests..." });
1442
1442
  try {
1443
- const { executeTests } = await import("./run-tests-4WOG5THP.js");
1443
+ const { executeTests } = await import("./run-tests-W2RQN33S.js");
1444
1444
  const argStr = args.join(" ").trim();
1445
1445
  let testArgs = {};
1446
1446
  if (argStr) {
@@ -4,10 +4,10 @@ import {
4
4
  getDangerLevel,
5
5
  googleSearchContext,
6
6
  truncateOutput
7
- } from "./chunk-E2HVDEWW.js";
7
+ } from "./chunk-AQ4O6SVK.js";
8
8
  import {
9
9
  SUBAGENT_ALLOWED_TOOLS
10
- } from "./chunk-UB6BRUQ4.js";
10
+ } from "./chunk-3LKIHGAR.js";
11
11
 
12
12
  // src/hub/task-orchestrator.ts
13
13
  import { createInterface } from "readline";
@@ -63,6 +63,7 @@ ${task}`, timestamp: /* @__PURE__ */ new Date() }
63
63
  let finalContent = "";
64
64
  let roundsUsed = 0;
65
65
  const executor = new TaskToolExecutor(registry, onToolCall, onToolResult);
66
+ let toolCallCount = 0;
66
67
  try {
67
68
  for (let round = 0; round < maxRounds; round++) {
68
69
  roundsUsed = round + 1;
@@ -71,17 +72,24 @@ ${task}`, timestamp: /* @__PURE__ */ new Date() }
71
72
  if (configManager) {
72
73
  googleSearchContext.configManager = configManager;
73
74
  }
75
+ let activeSystemPrompt = systemPrompt;
76
+ if (round === maxRounds - 2) {
77
+ activeSystemPrompt += "\n\n\u26A0\uFE0F You have 2 rounds remaining. Start wrapping up \u2014 finish current work and prepare your summary.";
78
+ } else if (round === maxRounds - 1) {
79
+ activeSystemPrompt += "\n\n\u{1F6D1} LAST ROUND. Do NOT call any more tools. You MUST respond with a text summary of what you accomplished. List files created/modified and the current state.";
80
+ }
74
81
  const result = await provider.chatWithTools(
75
82
  {
76
83
  messages,
77
84
  model,
78
- systemPrompt,
85
+ systemPrompt: activeSystemPrompt,
79
86
  stream: false,
80
87
  temperature: 0.3,
81
88
  maxTokens: 8192,
82
89
  ...extraMessages.length > 0 ? { _extraMessages: extraMessages } : {}
83
90
  },
84
- toolDefs
91
+ // On the very last round, send empty tools to force text response
92
+ round === maxRounds - 1 ? [] : toolDefs
85
93
  );
86
94
  if (result.usage) {
87
95
  totalUsage.inputTokens += result.usage.inputTokens;
@@ -91,13 +99,18 @@ ${task}`, timestamp: /* @__PURE__ */ new Date() }
91
99
  finalContent = result.content;
92
100
  break;
93
101
  }
102
+ toolCallCount += result.toolCalls.length;
94
103
  const toolResults = await executor.executeAll(result.toolCalls);
95
104
  const reasoningContent = "reasoningContent" in result ? result.reasoningContent : void 0;
96
105
  const newMsgs = provider.buildToolResultMessages(result.toolCalls, toolResults, reasoningContent);
97
106
  extraMessages.push(...newMsgs);
98
107
  }
99
108
  if (!finalContent) {
100
- finalContent = `(Task agent reached maximum rounds (${maxRounds}) without final response)`;
109
+ if (toolCallCount > 0) {
110
+ finalContent = `(Task completed work using ${toolCallCount} tool calls across ${maxRounds} rounds, but did not produce a final summary)`;
111
+ } else {
112
+ finalContent = `(Task agent reached maximum rounds (${maxRounds}) without producing output)`;
113
+ }
101
114
  }
102
115
  } catch (err) {
103
116
  const errMsg = err instanceof Error ? err.message : String(err);
@@ -105,7 +118,8 @@ ${task}`, timestamp: /* @__PURE__ */ new Date() }
105
118
  }
106
119
  return {
107
120
  content: finalContent,
108
- success: !finalContent.startsWith("(Task"),
121
+ // Success if: got a real response, OR did useful tool work (soft success)
122
+ success: !finalContent.startsWith("(Task") || toolCallCount > 0,
109
123
  roundsUsed,
110
124
  usage: totalUsage
111
125
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jinzd-ai-cli",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "Cross-platform REPL-style AI CLI with multi-provider support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",