jinzd-ai-cli 0.4.328 → 0.4.330

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 (48) hide show
  1. package/README.md +4 -4
  2. package/README.zh-CN.md +4 -4
  3. package/dist/{batch-GE6XWXPK.js → batch-GXITPLER.js} +2 -2
  4. package/dist/{chunk-IEKVRC2E.js → chunk-265M6ZLH.js} +4 -4
  5. package/dist/{chunk-BRZZ3QAI.js → chunk-2BAFLDDL.js} +44 -7
  6. package/dist/{chunk-JXGE4T4U.js → chunk-2SYDIWRU.js} +1 -1
  7. package/dist/{chunk-LOS7T2JS.js → chunk-3YVZJHTF.js} +1 -1
  8. package/dist/{chunk-NOQKCHIQ.js → chunk-AJITHMRE.js} +1 -1
  9. package/dist/{chunk-T4K4RZKR.js → chunk-CCFCPAKN.js} +1 -1
  10. package/dist/{chunk-IOLDD5ZA.js → chunk-DU44SD6A.js} +1 -1
  11. package/dist/{chunk-E3RJEQZA.js → chunk-DX2U6QK4.js} +1 -1
  12. package/dist/{chunk-NKTCITLH.js → chunk-GEC3MEVQ.js} +48 -40
  13. package/dist/{chunk-VKQIHFI5.js → chunk-GWEBO4RF.js} +1 -1
  14. package/dist/{chunk-B4EBCSKM.js → chunk-HMQA2R3O.js} +1 -1
  15. package/dist/{chunk-WDEO7J3T.js → chunk-LLXHA2LA.js} +8 -8
  16. package/dist/{chunk-U6VATMAI.js → chunk-LUJ4JVMI.js} +4 -4
  17. package/dist/{chunk-UQI5TOL2.js → chunk-M5B6G6AY.js} +4 -4
  18. package/dist/{chunk-OVEZ6HB5.js → chunk-QU74ONFF.js} +9 -3
  19. package/dist/{ci-U5Q3BMQP.js → ci-6K3JNHB4.js} +5 -5
  20. package/dist/{ci-format-4RR2G3RR.js → ci-format-2L3RFJVH.js} +2 -2
  21. package/dist/{constants-5YWODQHN.js → constants-DLJECTGQ.js} +1 -1
  22. package/dist/{constants-J3346CYX.js → constants-J5SJ232X.js} +1 -1
  23. package/dist/{doctor-cli-PCSMI6ZV.js → doctor-cli-BHS7G2XY.js} +5 -5
  24. package/dist/electron-server.js +124 -59
  25. package/dist/{hub-R3WSYGNT.js → hub-PPG4N6QQ.js} +1 -1
  26. package/dist/index.js +32 -21
  27. package/dist/{persistent-memory-64EXCOV4.js → persistent-memory-3XTSZ3QR.js} +2 -2
  28. package/dist/{persistent-memory-JZWKXFUF.js → persistent-memory-O4T2OTVV.js} +2 -2
  29. package/dist/{pr-2EZKHIQ5.js → pr-M6ZY4CEK.js} +5 -5
  30. package/dist/{run-tests-CC24OLYI.js → run-tests-H3DIUCDB.js} +2 -2
  31. package/dist/{run-tests-RUYOX42E.js → run-tests-WQE3XTUL.js} +2 -2
  32. package/dist/{server-DQFHA3Z2.js → server-5NQSYQ2T.js} +31 -16
  33. package/dist/{server-GU7XSXSR.js → server-J2B26DZK.js} +5 -5
  34. package/dist/{task-orchestrator-62LRX42O.js → task-orchestrator-CI7EDT25.js} +5 -5
  35. package/dist/{usage-RDLAA5HC.js → usage-AJYZ5A7P.js} +3 -3
  36. package/dist/web/client/app.js +9 -0
  37. package/dist/web/client/app.js.br +0 -0
  38. package/dist/web/client/app.js.gz +0 -0
  39. package/dist/web/client/index.html +1 -0
  40. package/dist/web/client/index.html.br +0 -0
  41. package/dist/web/client/index.html.gz +0 -0
  42. package/dist/web/client/state.js +3 -0
  43. package/dist/web/client/state.js.br +0 -0
  44. package/dist/web/client/state.js.gz +0 -0
  45. package/dist/web/client/style.css +3 -0
  46. package/dist/web/client/style.css.br +0 -0
  47. package/dist/web/client/style.css.gz +0 -0
  48. package/package.json +1 -1
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  countSeverity,
4
4
  runCi
5
- } from "./chunk-U6VATMAI.js";
6
- import "./chunk-T4K4RZKR.js";
5
+ } from "./chunk-LUJ4JVMI.js";
6
+ import "./chunk-CCFCPAKN.js";
7
7
  import {
8
8
  buildReviewPrompt,
9
9
  buildSecurityReviewPrompt,
@@ -14,16 +14,16 @@ import {
14
14
  } from "./chunk-6YZEZFX5.js";
15
15
  import {
16
16
  ProviderRegistry
17
- } from "./chunk-NKTCITLH.js";
17
+ } from "./chunk-GEC3MEVQ.js";
18
18
  import {
19
19
  ConfigManager
20
- } from "./chunk-OVEZ6HB5.js";
20
+ } from "./chunk-QU74ONFF.js";
21
21
  import "./chunk-E2W2MI6H.js";
22
22
  import "./chunk-TU3L3PW7.js";
23
23
  import "./chunk-BMLQPSHP.js";
24
24
  import {
25
25
  VERSION
26
- } from "./chunk-NOQKCHIQ.js";
26
+ } from "./chunk-AJITHMRE.js";
27
27
 
28
28
  // src/cli/pr.ts
29
29
  import { execFileSync } from "child_process";
@@ -3,8 +3,8 @@ import {
3
3
  executeTests,
4
4
  runTestProcess,
5
5
  runTestsTool
6
- } from "./chunk-VKQIHFI5.js";
7
- import "./chunk-NOQKCHIQ.js";
6
+ } from "./chunk-GWEBO4RF.js";
7
+ import "./chunk-AJITHMRE.js";
8
8
  import "./chunk-SXIJLSVF.js";
9
9
  export {
10
10
  executeTests,
@@ -2,9 +2,9 @@ import {
2
2
  executeTests,
3
3
  runTestProcess,
4
4
  runTestsTool
5
- } from "./chunk-IOLDD5ZA.js";
5
+ } from "./chunk-DU44SD6A.js";
6
6
  import "./chunk-QMFMST2T.js";
7
- import "./chunk-LOS7T2JS.js";
7
+ import "./chunk-3YVZJHTF.js";
8
8
  export {
9
9
  executeTests,
10
10
  runTestProcess,
@@ -86,7 +86,7 @@ import {
86
86
  skillHistoryNote,
87
87
  snapshotFile,
88
88
  stripRoutingTags
89
- } from "./chunk-WDEO7J3T.js";
89
+ } from "./chunk-LLXHA2LA.js";
90
90
  import {
91
91
  CNY_PER_USD,
92
92
  CostTracker,
@@ -95,7 +95,7 @@ import {
95
95
  getCostCurrency,
96
96
  getPricing,
97
97
  setCostCurrency
98
- } from "./chunk-BRZZ3QAI.js";
98
+ } from "./chunk-2BAFLDDL.js";
99
99
  import {
100
100
  DEFAULT_MAX_TOOL_OUTPUT_CHARS,
101
101
  ToolExecutor,
@@ -130,7 +130,7 @@ import {
130
130
  spawnAgentContext,
131
131
  truncateOutput,
132
132
  undoStack
133
- } from "./chunk-UQI5TOL2.js";
133
+ } from "./chunk-M5B6G6AY.js";
134
134
  import {
135
135
  buildReviewPrompt,
136
136
  buildSecurityReviewPrompt
@@ -157,7 +157,7 @@ import {
157
157
  restoreMemoryEntries,
158
158
  updateMemoryApproval,
159
159
  updateMemoryEntry
160
- } from "./chunk-E3RJEQZA.js";
160
+ } from "./chunk-DX2U6QK4.js";
161
161
  import "./chunk-RWRZVQCB.js";
162
162
  import "./chunk-B3MPYI4E.js";
163
163
  import "./chunk-M6HLYG33.js";
@@ -176,7 +176,7 @@ import {
176
176
  buildDoctorReport,
177
177
  formatDoctorReport,
178
178
  loadContextFiles
179
- } from "./chunk-IEKVRC2E.js";
179
+ } from "./chunk-265M6ZLH.js";
180
180
  import {
181
181
  describePlugin,
182
182
  getActivePluginAssets,
@@ -191,14 +191,14 @@ import {
191
191
  runTool,
192
192
  setPluginEnabled,
193
193
  trustPlugin
194
- } from "./chunk-B4EBCSKM.js";
194
+ } from "./chunk-HMQA2R3O.js";
195
195
  import "./chunk-RS7SKYTS.js";
196
196
  import {
197
197
  ProviderRegistry
198
- } from "./chunk-NKTCITLH.js";
198
+ } from "./chunk-GEC3MEVQ.js";
199
199
  import {
200
200
  ConfigManager
201
- } from "./chunk-OVEZ6HB5.js";
201
+ } from "./chunk-QU74ONFF.js";
202
202
  import {
203
203
  CONTENT_ONLY_STREAM_REMINDER,
204
204
  TEE_FINAL_USER_NUDGE,
@@ -231,7 +231,7 @@ import {
231
231
  import {
232
232
  assertReadablePath
233
233
  } from "./chunk-JJFJWD35.js";
234
- import "./chunk-VKQIHFI5.js";
234
+ import "./chunk-GWEBO4RF.js";
235
235
  import {
236
236
  AGENTIC_BEHAVIOR_GUIDELINE,
237
237
  AUTHOR,
@@ -247,7 +247,7 @@ import {
247
247
  SKILLS_DIR_NAME,
248
248
  VERSION,
249
249
  buildUserIdentityPrompt
250
- } from "./chunk-NOQKCHIQ.js";
250
+ } from "./chunk-AJITHMRE.js";
251
251
  import {
252
252
  runWithExecutionContext,
253
253
  runWithSessionKey
@@ -979,7 +979,7 @@ Cache: write=${cacheCreate} read=${cacheRead}` : "";
979
979
  Cost: ${formatCost(cost)}` : "";
980
980
  let memoryLine = "";
981
981
  try {
982
- const { countPendingMemories: countPendingMemories2 } = await import("./persistent-memory-JZWKXFUF.js");
982
+ const { countPendingMemories: countPendingMemories2 } = await import("./persistent-memory-O4T2OTVV.js");
983
983
  const pending = countPendingMemories2(ctx.config.getConfigDir());
984
984
  if (pending > 0) memoryLine = `
985
985
  Memory: \u26A0 ${pending} pending approval \u2014 see the Memory panel or /memory`;
@@ -1908,7 +1908,7 @@ async function handleTest(args, ctx) {
1908
1908
  const isCommand = argStr.includes(" ") || /^(mvn|gradle|npm|pytest|cargo|go)\b/.test(argStr);
1909
1909
  testArgs = isCommand ? { command: argStr } : { filter: argStr };
1910
1910
  }
1911
- const runTests = ctx.runTests ?? (await import("./run-tests-CC24OLYI.js")).executeTests;
1911
+ const runTests = ctx.runTests ?? (await import("./run-tests-H3DIUCDB.js")).executeTests;
1912
1912
  const report = await runTests(testArgs);
1913
1913
  ctx.send({ type: "info", message: report });
1914
1914
  } catch (err) {
@@ -2184,7 +2184,7 @@ async function handleMemory(args, ctx) {
2184
2184
  }
2185
2185
  if (intent.kind === "status") {
2186
2186
  const { getChatIndexStatus } = await import("./chat-index-7CLR4CBG.js");
2187
- const { listMemoryEntries: listMemoryEntries2, isMemoryExpired: isMemoryExpired2, formatMemoryForPrompt: formatMemoryForPrompt2 } = await import("./persistent-memory-JZWKXFUF.js");
2187
+ const { listMemoryEntries: listMemoryEntries2, isMemoryExpired: isMemoryExpired2, formatMemoryForPrompt: formatMemoryForPrompt2 } = await import("./persistent-memory-O4T2OTVV.js");
2188
2188
  const memories = listMemoryEntries2(configDir, { includeExpired: true, includeRejected: true });
2189
2189
  const injected = formatMemoryForPrompt2(configDir, process.cwd(), ctx.config.get("memory")?.maxChars);
2190
2190
  const view = buildMemoryStatusView({
@@ -2207,7 +2207,7 @@ async function handleMemory(args, ctx) {
2207
2207
  return;
2208
2208
  }
2209
2209
  if (intent.kind === "recall") {
2210
- const { searchPersistentMemories, touchMemoryReferences } = await import("./persistent-memory-JZWKXFUF.js");
2210
+ const { searchPersistentMemories, touchMemoryReferences } = await import("./persistent-memory-O4T2OTVV.js");
2211
2211
  const { searchChatMemory } = await import("./chat-index-7CLR4CBG.js");
2212
2212
  const persistentHits = searchPersistentMemories(configDir, intent.query, process.cwd(), 3);
2213
2213
  if (persistentHits.length > 0) {
@@ -2328,7 +2328,7 @@ async function handleMemory(args, ctx) {
2328
2328
  ctx.handleMemoryManage(intent.action, args[1], intent.action === "expire" ? args[2] : void 0);
2329
2329
  } else if (intent.kind === "export") {
2330
2330
  if (args[1] === "md") {
2331
- const { exportMemoryEntries: exportMemoryEntries2 } = await import("./persistent-memory-JZWKXFUF.js");
2331
+ const { exportMemoryEntries: exportMemoryEntries2 } = await import("./persistent-memory-O4T2OTVV.js");
2332
2332
  ctx.send({
2333
2333
  type: "export_data",
2334
2334
  format: "md",
@@ -4392,6 +4392,12 @@ function getModuleDir() {
4392
4392
  }
4393
4393
  return resolve3(".");
4394
4394
  }
4395
+ var WebStartupError = class extends Error {
4396
+ constructor(message) {
4397
+ super(message);
4398
+ this.name = "WebStartupError";
4399
+ }
4400
+ };
4395
4401
  async function startWebServer(options = {}) {
4396
4402
  const port = options.port ?? 3e3;
4397
4403
  const host = options.host ?? "localhost";
@@ -4400,7 +4406,7 @@ async function startWebServer(options = {}) {
4400
4406
  const config = new ConfigManager();
4401
4407
  const authManager = new AuthManager(config.getConfigDir());
4402
4408
  if (!authManager.isEnabled() && !["localhost", "127.0.0.1", "::1"].includes(host)) {
4403
- throw new Error("Network listening requires authentication. Create a user with aicli user create first.");
4409
+ throw new WebStartupError("Network listening requires authentication. Create a user first: aicli user create <username>");
4404
4410
  }
4405
4411
  await setupProxy(config.get("proxy"));
4406
4412
  const providers = new ProviderRegistry();
@@ -4526,6 +4532,8 @@ async function startWebServer(options = {}) {
4526
4532
  const cookie = parseCookie(req.headers.cookie ?? "");
4527
4533
  return equalToken(cookie.aicli_local, access.localToken) || !!authManager.verifyToken(cookie.aicli_token ?? "");
4528
4534
  } });
4535
+ wss.on("error", () => {
4536
+ });
4529
4537
  if (authManager.isEnabled()) {
4530
4538
  console.log(` Auth: ${authManager.listUsers().length} user(s) registered`);
4531
4539
  } else {
@@ -5070,6 +5078,12 @@ async function startWebServer(options = {}) {
5070
5078
  actualPort++;
5071
5079
  console.log(` \u26A0 Port ${actualPort - 1} in use, trying ${actualPort}...`);
5072
5080
  server.close(() => tryListen(attempt + 1));
5081
+ } else if (err.code === "EADDRINUSE") {
5082
+ reject(new WebStartupError(`Ports ${port}-${actualPort} are all in use. Pick another one: aicli web --port <number>`));
5083
+ } else if (err.code === "EACCES") {
5084
+ reject(new WebStartupError(`No permission to listen on port ${actualPort}. Pick another one: aicli web --port <number>`));
5085
+ } else if (err.code === "EADDRNOTAVAIL" || err.code === "ENOTFOUND") {
5086
+ reject(new WebStartupError(`Cannot listen on host "${host}" (${err.code}). Check the --host value.`));
5073
5087
  } else {
5074
5088
  reject(err);
5075
5089
  }
@@ -5172,5 +5186,6 @@ async function openBrowser(url) {
5172
5186
  }
5173
5187
  }
5174
5188
  export {
5189
+ WebStartupError,
5175
5190
  startWebServer
5176
5191
  };
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ToolRegistry
4
- } from "./chunk-UQI5TOL2.js";
4
+ } from "./chunk-M5B6G6AY.js";
5
5
  import "./chunk-6JHACXB3.js";
6
- import "./chunk-E3RJEQZA.js";
6
+ import "./chunk-DX2U6QK4.js";
7
7
  import "./chunk-RWRZVQCB.js";
8
8
  import "./chunk-B3MPYI4E.js";
9
9
  import "./chunk-M6HLYG33.js";
@@ -14,7 +14,7 @@ import "./chunk-JL44HGZC.js";
14
14
  import "./chunk-3FEZSLGI.js";
15
15
  import {
16
16
  runTool
17
- } from "./chunk-B4EBCSKM.js";
17
+ } from "./chunk-HMQA2R3O.js";
18
18
  import "./chunk-RS7SKYTS.js";
19
19
  import {
20
20
  getDangerLevel,
@@ -24,10 +24,10 @@ import "./chunk-TU3L3PW7.js";
24
24
  import "./chunk-HOSJZMQS.js";
25
25
  import "./chunk-BMLQPSHP.js";
26
26
  import "./chunk-JJFJWD35.js";
27
- import "./chunk-VKQIHFI5.js";
27
+ import "./chunk-GWEBO4RF.js";
28
28
  import {
29
29
  VERSION
30
- } from "./chunk-NOQKCHIQ.js";
30
+ } from "./chunk-AJITHMRE.js";
31
31
  import "./chunk-SXIJLSVF.js";
32
32
 
33
33
  // src/mcp/server.ts
@@ -4,9 +4,9 @@ import {
4
4
  googleSearchContext,
5
5
  isToolCapableProvider,
6
6
  truncateOutput
7
- } from "./chunk-UQI5TOL2.js";
7
+ } from "./chunk-M5B6G6AY.js";
8
8
  import "./chunk-6JHACXB3.js";
9
- import "./chunk-E3RJEQZA.js";
9
+ import "./chunk-DX2U6QK4.js";
10
10
  import "./chunk-RWRZVQCB.js";
11
11
  import "./chunk-B3MPYI4E.js";
12
12
  import "./chunk-M6HLYG33.js";
@@ -17,7 +17,7 @@ import "./chunk-JL44HGZC.js";
17
17
  import "./chunk-3FEZSLGI.js";
18
18
  import {
19
19
  runTool
20
- } from "./chunk-B4EBCSKM.js";
20
+ } from "./chunk-HMQA2R3O.js";
21
21
  import "./chunk-RS7SKYTS.js";
22
22
  import {
23
23
  getDangerLevel,
@@ -29,10 +29,10 @@ import {
29
29
  atomicWriteFileSync
30
30
  } from "./chunk-BMLQPSHP.js";
31
31
  import "./chunk-JJFJWD35.js";
32
- import "./chunk-VKQIHFI5.js";
32
+ import "./chunk-GWEBO4RF.js";
33
33
  import {
34
34
  SUBAGENT_ALLOWED_TOOLS
35
- } from "./chunk-NOQKCHIQ.js";
35
+ } from "./chunk-AJITHMRE.js";
36
36
  import "./chunk-SXIJLSVF.js";
37
37
 
38
38
  // src/hub/task-orchestrator.ts
@@ -5,14 +5,14 @@ import {
5
5
  formatCost,
6
6
  getPricing,
7
7
  setCostCurrency
8
- } from "./chunk-BRZZ3QAI.js";
8
+ } from "./chunk-2BAFLDDL.js";
9
9
  import "./chunk-RS7SKYTS.js";
10
10
  import {
11
11
  ConfigManager
12
- } from "./chunk-OVEZ6HB5.js";
12
+ } from "./chunk-QU74ONFF.js";
13
13
  import "./chunk-TU3L3PW7.js";
14
14
  import "./chunk-BMLQPSHP.js";
15
- import "./chunk-NOQKCHIQ.js";
15
+ import "./chunk-AJITHMRE.js";
16
16
 
17
17
  // src/cli/usage.ts
18
18
  function classifyRowCost(row) {
@@ -2705,6 +2705,7 @@ function showAuthScreen(hasUsers) {
2705
2705
  screen.classList.remove('hidden');
2706
2706
  app.style.display = 'none';
2707
2707
 
2708
+ authHasUsers = !!hasUsers;
2708
2709
  // If no users registered, show register form by default
2709
2710
  if (!hasUsers) {
2710
2711
  authMode = 'register';
@@ -2734,10 +2735,18 @@ function updateAuthForm() {
2734
2735
 
2735
2736
  errorEl.classList.add('hidden');
2736
2737
 
2738
+ // Registration is closed server-side once a user exists: say how accounts
2739
+ // are added instead of offering a Register link that always fails with 403.
2740
+ const registrationClosed = authMode === 'login' && authHasUsers;
2741
+ toggle.classList.toggle('hidden', registrationClosed);
2742
+ document.getElementById('auth-closed-hint')?.classList.toggle('hidden', !registrationClosed);
2737
2743
  if (authMode === 'register') {
2738
2744
  subtitle.textContent = 'Create your account to get started';
2739
2745
  submit.textContent = 'Create Account';
2740
2746
  toggle.innerHTML = 'Already have an account? <span class="text-primary">Sign In</span>';
2747
+ } else if (registrationClosed) {
2748
+ subtitle.textContent = 'Sign in to continue';
2749
+ submit.textContent = 'Sign In';
2741
2750
  } else {
2742
2751
  subtitle.textContent = 'Sign in to continue';
2743
2752
  submit.textContent = 'Sign In';
Binary file
Binary file
@@ -59,6 +59,7 @@
59
59
  <button id="auth-toggle" class="btn btn-ghost btn-sm" data-action="toggle-auth-mode" type="button">
60
60
  Don't have an account? <span class="text-primary">Register</span>
61
61
  </button>
62
+ <p id="auth-closed-hint" class="hidden text-sm opacity-70">New accounts are added on the host:<br><code>aicli user create &lt;name&gt;</code></p>
62
63
  </div>
63
64
  </div>
64
65
  </div>
Binary file
Binary file
@@ -54,6 +54,9 @@ let authToken = '';
54
54
  try { localStorage.removeItem('aicli-auth-token'); } catch {}
55
55
  let authUsername = localStorage.getItem('aicli-auth-user') || '';
56
56
  let authMode = 'login'; // 'login' or 'register'
57
+ // Once a user exists the server closes registration (403) — the login form
58
+ // must not offer a Register link it can never honour.
59
+ let authHasUsers = false;
57
60
 
58
61
  // ── Streaming render state ─────────────────────────────────────────
59
62
  /** @type {HTMLElement|null} */
Binary file
Binary file
@@ -791,6 +791,9 @@ button, a, .session-item, .file-tree-row, .template-item, .tool-item, .mcp-serve
791
791
  #btn-think, #btn-plan { font-size: 0.8rem; padding: 0 0.4rem; }
792
792
  }
793
793
 
794
+ /* Brand stays on one line: in a crowded navbar it wrapped to "ai-" / "cli". */
795
+ .brand-text { white-space: nowrap; }
796
+
794
797
  /* ── Responsive: Phone ──────────────────────────────── */
795
798
  @media (max-width: 640px) {
796
799
  /* Navbar: compact layout */
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jinzd-ai-cli",
3
- "version": "0.4.328",
3
+ "version": "0.4.330",
4
4
  "description": "Cross-platform REPL-style AI CLI with multi-provider support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",