jinzd-ai-cli 0.4.308 → 0.4.309

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 (36) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/dist/{batch-S7XLEEOH.js → batch-H4WWSZQ3.js} +2 -2
  4. package/dist/{chunk-7OHXFTZO.js → chunk-2E5W2E64.js} +1 -1
  5. package/dist/{chunk-2MNUMLN4.js → chunk-3CNPJLVI.js} +1 -1
  6. package/dist/{chunk-JJNUASMJ.js → chunk-3GEO2LPO.js} +1 -1
  7. package/dist/{chunk-3537CQ5M.js → chunk-4BXTGXZ6.js} +1 -1
  8. package/dist/{chunk-2DYQDLLF.js → chunk-EAVX3RLD.js} +1 -1
  9. package/dist/{chunk-WT252ZDV.js → chunk-EHMMBIZT.js} +14 -10
  10. package/dist/{chunk-LR3TGZWQ.js → chunk-HXINWG37.js} +1 -1
  11. package/dist/{chunk-BGZN4K7Q.js → chunk-IW6Q66WS.js} +4 -4
  12. package/dist/{chunk-NLK45GUS.js → chunk-K4F7QEGW.js} +1 -1
  13. package/dist/{chunk-G6DVGQ4I.js → chunk-LONB36SP.js} +15 -2
  14. package/dist/{chunk-TPTFV3Y6.js → chunk-O7MMYJAD.js} +4 -4
  15. package/dist/{chunk-YBZM7PHI.js → chunk-RBCKX2FZ.js} +8 -3
  16. package/dist/{chunk-WVEIUSXE.js → chunk-RLERORUI.js} +1 -1
  17. package/dist/{chunk-E2PNXNKI.js → chunk-SCG2VBPB.js} +4 -4
  18. package/dist/{chunk-HC33C4U3.js → chunk-T42GXE7Y.js} +8 -8
  19. package/dist/{ci-5HONSUAS.js → ci-H6GPHG4T.js} +5 -5
  20. package/dist/{ci-format-URUH3ZZ5.js → ci-format-U47GSGYU.js} +2 -2
  21. package/dist/{constants-FG27DQMS.js → constants-GYJTB6KI.js} +1 -1
  22. package/dist/{constants-BLDBI7IG.js → constants-SNJR6546.js} +1 -1
  23. package/dist/{doctor-cli-QQLMNJN7.js → doctor-cli-J6LAQ5LU.js} +5 -5
  24. package/dist/electron-server.js +46 -24
  25. package/dist/{hub-GGFW3DCC.js → hub-G5FMMTVZ.js} +1 -1
  26. package/dist/index.js +25 -21
  27. package/dist/{persistent-memory-UNLCXUWH.js → persistent-memory-EXJBXL33.js} +2 -2
  28. package/dist/{persistent-memory-YYWIN6BG.js → persistent-memory-LEE454DW.js} +2 -2
  29. package/dist/{pr-YCFGPFI7.js → pr-6PUHVJ6K.js} +5 -5
  30. package/dist/{run-tests-KRNMFXAN.js → run-tests-2C7MWZBN.js} +2 -2
  31. package/dist/{run-tests-GHY4BYDE.js → run-tests-33ZVQE3Q.js} +2 -2
  32. package/dist/{server-QRAWSG4Z.js → server-AJH5TBVO.js} +15 -15
  33. package/dist/{server-73UBHSFV.js → server-CYAB56O3.js} +5 -5
  34. package/dist/{task-orchestrator-GI3RGLZI.js → task-orchestrator-HNRV3YUD.js} +5 -5
  35. package/dist/{usage-GWTIGZF5.js → usage-ZN5DU6Z7.js} +3 -3
  36. package/package.json +1 -1
package/README.md CHANGED
@@ -131,7 +131,7 @@ aicli user delete x # Delete user
131
131
  |----------|--------|-------------|
132
132
  | **Claude** | Opus 4, Sonnet 4, Haiku 4 | [console.anthropic.com](https://console.anthropic.com) |
133
133
  | **Gemini** | 2.5 Pro, 2.5 Flash | [aistudio.google.com](https://aistudio.google.com) |
134
- | **DeepSeek** | deepseek-v4-flash (default), deepseek-v4-pro | [platform.deepseek.com](https://platform.deepseek.com) |
134
+ | **DeepSeek** | deepseek-flash (default, multimodal), deepseek-v4-pro | [platform.deepseek.com](https://platform.deepseek.com) |
135
135
  | **OpenAI** | GPT-5.4, GPT-5, GPT-4.1, o3, o4-mini | [platform.openai.com](https://platform.openai.com) |
136
136
  | **OpenRouter** | 300+ models (Claude, GPT, Gemini, Llama, Qwen, Mistral...) | [openrouter.ai](https://openrouter.ai) |
137
137
  | **Zhipu** | GLM-4, GLM-5 | [open.bigmodel.cn](https://open.bigmodel.cn) |
package/README.zh-CN.md CHANGED
@@ -119,7 +119,7 @@ aicli user delete x # 删除用户
119
119
  |----------|------|-------------|
120
120
  | **Claude** | Opus 4, Sonnet 4, Haiku 4 | [console.anthropic.com](https://console.anthropic.com) |
121
121
  | **Gemini** | 2.5 Pro, 2.5 Flash | [aistudio.google.com](https://aistudio.google.com) |
122
- | **DeepSeek** | deepseek-v4-flash(默认), deepseek-v4-pro | [platform.deepseek.com](https://platform.deepseek.com) |
122
+ | **DeepSeek** | deepseek-flash(默认,多模态), deepseek-v4-pro | [platform.deepseek.com](https://platform.deepseek.com) |
123
123
  | **OpenAI** | GPT-5.4, GPT-5, GPT-4.1, o3, o4-mini | [platform.openai.com](https://platform.openai.com) |
124
124
  | **OpenRouter** | 300+ 模型(Claude/GPT/Gemini/Llama/Qwen/Mistral...) | [openrouter.ai](https://openrouter.ai) |
125
125
  | **Zhipu(智谱)** | GLM-4, GLM-5 | [open.bigmodel.cn](https://open.bigmodel.cn) |
@@ -4,12 +4,12 @@ import {
4
4
  } from "./chunk-RS7SKYTS.js";
5
5
  import {
6
6
  ConfigManager
7
- } from "./chunk-YBZM7PHI.js";
7
+ } from "./chunk-RBCKX2FZ.js";
8
8
  import "./chunk-TU3L3PW7.js";
9
9
  import {
10
10
  atomicWriteFileSync
11
11
  } from "./chunk-BMLQPSHP.js";
12
- import "./chunk-2MNUMLN4.js";
12
+ import "./chunk-3CNPJLVI.js";
13
13
 
14
14
  // src/cli/batch.ts
15
15
  import Anthropic from "@anthropic-ai/sdk";
@@ -12,7 +12,7 @@ import {
12
12
  MEMORY_FILE_NAME,
13
13
  MEMORY_MAX_CHARS,
14
14
  MEMORY_STORE_FILE_NAME
15
- } from "./chunk-2DYQDLLF.js";
15
+ } from "./chunk-EAVX3RLD.js";
16
16
 
17
17
  // src/memory/persistent-memory.ts
18
18
  import { copyFileSync, existsSync, mkdirSync, readFileSync, statSync } from "fs";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/core/constants.ts
4
- var VERSION = "0.4.308";
4
+ var VERSION = "0.4.309";
5
5
  var APP_NAME = "ai-cli";
6
6
  var CONFIG_DIR_NAME = ".aicli";
7
7
  var CONFIG_FILE_NAME = "config.json";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  TEST_TIMEOUT
4
- } from "./chunk-2MNUMLN4.js";
4
+ } from "./chunk-3CNPJLVI.js";
5
5
  import {
6
6
  getExecutionConfigDir,
7
7
  getExecutionSignal
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  CONFIG_DIR_NAME,
10
10
  PLUGINS_DIR_NAME
11
- } from "./chunk-2MNUMLN4.js";
11
+ } from "./chunk-3CNPJLVI.js";
12
12
 
13
13
  // src/diagnostics/tool-stats.ts
14
14
  import { mkdirSync } from "fs";
@@ -1,5 +1,5 @@
1
1
  // src/core/constants.ts
2
- var VERSION = "0.4.308";
2
+ var VERSION = "0.4.309";
3
3
  var APP_NAME = "ai-cli";
4
4
  var CONFIG_DIR_NAME = ".aicli";
5
5
  var CONFIG_FILE_NAME = "config.json";
@@ -1670,30 +1670,34 @@ var DeepSeekProvider = class extends OpenAICompatibleProvider {
1670
1670
  info = {
1671
1671
  id: "deepseek",
1672
1672
  displayName: "DeepSeek",
1673
- defaultModel: "deepseek-v4-flash",
1673
+ defaultModel: "deepseek-flash",
1674
1674
  apiKeyEnvVar: "AICLI_API_KEY_DEEPSEEK",
1675
1675
  requiresApiKey: true,
1676
1676
  baseUrl: this.defaultBaseUrl,
1677
1677
  models: [
1678
- // ── V4 family (2026-04-23+):1M context,支持 Thinking / Non-Thinking 双模式 ──
1678
+ // ── V4.1 Flash (2026-09):1M context,原生多模态,Thinking / Non-Thinking 双模式 ──
1679
+ // model code 实测取自端点本身:`/v1/models` 只列 `deepseek-flash` 与 `deepseek-v4-pro`,
1680
+ // 传 `deepseek-v4.1-flash` 报 400 并把合法名字写在错误消息里。**不要**按发布公告里的
1681
+ // 版本号拼 code(v0.4.198 的 `glm-5.2[1m]` 就是这么栽的)。
1679
1682
  {
1680
- id: "deepseek-v4-pro",
1681
- displayName: "DeepSeek V4 Pro (0813, 1.6T MoE, 49B active)",
1683
+ id: "deepseek-flash",
1684
+ displayName: "DeepSeek V4.1 Flash (multimodal, 1M)",
1682
1685
  contextWindow: 1048576,
1683
1686
  supportsStreaming: true,
1684
1687
  supportsThinking: true
1685
1688
  },
1686
1689
  {
1687
- id: "deepseek-v4-flash",
1688
- displayName: "DeepSeek V4 Flash (0731, 284B MoE, 13B active)",
1690
+ id: "deepseek-v4-pro",
1691
+ displayName: "DeepSeek V4 Pro (text-only; routes to V4.1 Flash from 2026-09-14)",
1689
1692
  contextWindow: 1048576,
1690
1693
  supportsStreaming: true,
1691
1694
  supportsThinking: true
1692
1695
  }
1693
- // Legacy aliases (deepseek-chat / deepseek-reasoner) removed in v0.4.140 —
1694
- // they retire 2026-07-24 and DeepSeek already routes them to V4 Flash server-side.
1695
- // Pre-existing sessions were migrated to deepseek-v4-flash; pricing.ts keeps the
1696
- // old ids for any historical cost calculations.
1696
+ // Legacy aliases:`deepseek-v4-flash` / `deepseek-v4-flash-vision-exp` 的底层模型已退役,
1697
+ // 端点仍接受这两个名字并路由到 V4.1 Flash(实测传 `deepseek-v4-flash` 返回 200 且响应
1698
+ // `model` 字段回显 `deepseek-flash`)。它们不再列进推荐清单,config pin 过的会被
1699
+ // `migrateLegacyModels()` 自愈到 `deepseek-flash`;pricing.ts 保留旧 id 供历史成本回算。
1700
+ // `deepseek-chat` / `deepseek-reasoner` 早在 v0.4.140 移除(2026-07-24 停用)。
1697
1701
  ]
1698
1702
  };
1699
1703
  /**
@@ -13,7 +13,7 @@ import {
13
13
  MEMORY_FILE_NAME,
14
14
  MEMORY_MAX_CHARS,
15
15
  MEMORY_STORE_FILE_NAME
16
- } from "./chunk-2MNUMLN4.js";
16
+ } from "./chunk-3CNPJLVI.js";
17
17
 
18
18
  // src/memory/persistent-memory.ts
19
19
  import { copyFileSync, existsSync, mkdirSync, readFileSync, statSync } from "fs";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  evaluateCiGate,
4
4
  normalizeCiThresholds
5
- } from "./chunk-NLK45GUS.js";
5
+ } from "./chunk-K4F7QEGW.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-WT252ZDV.js";
16
+ } from "./chunk-EHMMBIZT.js";
17
17
  import {
18
18
  ConfigManager
19
- } from "./chunk-YBZM7PHI.js";
19
+ } from "./chunk-RBCKX2FZ.js";
20
20
  import {
21
21
  VERSION
22
- } from "./chunk-2MNUMLN4.js";
22
+ } from "./chunk-3CNPJLVI.js";
23
23
 
24
24
  // src/cli/ci.ts
25
25
  import { execFileSync } from "child_process";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  VERSION
4
- } from "./chunk-2MNUMLN4.js";
4
+ } from "./chunk-3CNPJLVI.js";
5
5
 
6
6
  // src/cli/ci-format.ts
7
7
  var DEFAULT_CI_THRESHOLDS = {
@@ -16,15 +16,28 @@ function deepSeekCnyPricing(cacheRead, input, output) {
16
16
  output: output / CNY_PER_USD
17
17
  };
18
18
  }
19
+ var DEEPSEEK_V4_PRO_ROUTED_TO_FLASH_AT = /* @__PURE__ */ new Date("2026-09-14T04:00:00.000Z");
20
+ var DEEPSEEK_V41_FLASH_ROUTING_CONFIRMED_AT = /* @__PURE__ */ new Date("2026-09-11T00:00:00.000Z");
21
+ function isDeepSeekPeakHour(at) {
22
+ const weekday = at.getUTCDay();
23
+ if (weekday === 0 || weekday === 6) return false;
24
+ const hour = at.getUTCHours();
25
+ return hour >= 1 && hour < 4 || hour >= 6 && hour < 10;
26
+ }
27
+ function deepSeekFlash41Pricing(at) {
28
+ return isDeepSeekPeakHour(at) ? { cacheRead: 6e-3, input: 0.3, output: 1.2 } : { cacheRead: 3e-3, input: 0.15, output: 0.6 };
29
+ }
19
30
  function getDeepSeekV4Pricing(model, at) {
31
+ if (model.startsWith("deepseek-flash")) return deepSeekFlash41Pricing(at);
20
32
  const isPro = model.startsWith("deepseek-v4-pro");
21
33
  const isFlash = model.startsWith("deepseek-v4-flash");
22
34
  if (!isPro && !isFlash) return null;
35
+ if (isPro && at >= DEEPSEEK_V4_PRO_ROUTED_TO_FLASH_AT) return deepSeekFlash41Pricing(at);
36
+ if (isFlash && at >= DEEPSEEK_V41_FLASH_ROUTING_CONFIRMED_AT) return deepSeekFlash41Pricing(at);
23
37
  if (at < DEEPSEEK_TIME_PRICING_EFFECTIVE_AT) {
24
38
  return isPro ? deepSeekCnyPricing(0.025, 3, 6) : deepSeekCnyPricing(0.02, 1, 2);
25
39
  }
26
- const beijingHour = (at.getUTCHours() + 8) % 24;
27
- const isPeak = beijingHour >= 9 && beijingHour < 12 || beijingHour >= 14 && beijingHour < 18;
40
+ const isPeak = isDeepSeekPeakHour(at);
28
41
  if (isPro) {
29
42
  return isPeak ? deepSeekCnyPricing(0.3, 9, 27) : deepSeekCnyPricing(0.15, 4.5, 13.5);
30
43
  }
@@ -11,7 +11,7 @@ import {
11
11
  searchPersistentMemories,
12
12
  touchMemoryReferences,
13
13
  updateMemoryEntry
14
- } from "./chunk-LR3TGZWQ.js";
14
+ } from "./chunk-HXINWG37.js";
15
15
  import {
16
16
  indexProject
17
17
  } from "./chunk-RWRZVQCB.js";
@@ -30,7 +30,7 @@ import {
30
30
  runHook,
31
31
  runLifecycleHooks,
32
32
  runTool
33
- } from "./chunk-3537CQ5M.js";
33
+ } from "./chunk-4BXTGXZ6.js";
34
34
  import {
35
35
  buildTruncatedArgumentsError,
36
36
  getDangerLevel,
@@ -63,7 +63,7 @@ import {
63
63
  recoverGbkMojibake,
64
64
  runTestsTool,
65
65
  shellInvocation
66
- } from "./chunk-JJNUASMJ.js";
66
+ } from "./chunk-3GEO2LPO.js";
67
67
  import {
68
68
  CONFIG_DIR_NAME,
69
69
  DEFAULT_MAX_TOOL_OUTPUT_CHARS_CAP,
@@ -72,7 +72,7 @@ import {
72
72
  SUBAGENT_ALLOWED_TOOLS,
73
73
  SUBAGENT_DEFAULT_MAX_ROUNDS,
74
74
  SUBAGENT_MAX_ROUNDS_LIMIT
75
- } from "./chunk-2MNUMLN4.js";
75
+ } from "./chunk-3CNPJLVI.js";
76
76
  import {
77
77
  getCurrentSessionKey,
78
78
  getExecutionConfigDir,
@@ -11,7 +11,7 @@ import {
11
11
  CONFIG_FILE_NAME,
12
12
  HISTORY_DIR_NAME,
13
13
  PLUGINS_DIR_NAME
14
- } from "./chunk-2MNUMLN4.js";
14
+ } from "./chunk-3CNPJLVI.js";
15
15
 
16
16
  // src/config/config-manager.ts
17
17
  import { readFileSync, existsSync, mkdirSync } from "fs";
@@ -381,8 +381,13 @@ ${err}`
381
381
  * @returns true if config was modified and should be persisted.
382
382
  */
383
383
  migrateLegacyModels() {
384
- const LEGACY_DEEPSEEK = /* @__PURE__ */ new Set(["deepseek-chat", "deepseek-reasoner"]);
385
- const DEEPSEEK_TARGET = "deepseek-v4-flash";
384
+ const LEGACY_DEEPSEEK = /* @__PURE__ */ new Set([
385
+ "deepseek-chat",
386
+ "deepseek-reasoner",
387
+ "deepseek-v4-flash",
388
+ "deepseek-v4-flash-vision-exp"
389
+ ]);
390
+ const DEEPSEEK_TARGET = "deepseek-flash";
386
391
  const LEGACY_KIMI = /* @__PURE__ */ new Set(["kimi-k2-0711-preview", "kimi-k2-turbo-preview"]);
387
392
  const KIMI_TARGET = "kimi-k2.6";
388
393
  let changed = false;
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-QMFMST2T.js";
5
5
  import {
6
6
  TEST_TIMEOUT
7
- } from "./chunk-2DYQDLLF.js";
7
+ } from "./chunk-EAVX3RLD.js";
8
8
 
9
9
  // src/tools/builtin/run-tests.ts
10
10
  import { spawn as spawn2 } from "child_process";
@@ -8,13 +8,13 @@ import {
8
8
  listHooks,
9
9
  listInstalledPlugins,
10
10
  resetStats
11
- } from "./chunk-3537CQ5M.js";
11
+ } from "./chunk-4BXTGXZ6.js";
12
12
  import {
13
13
  ProviderRegistry
14
- } from "./chunk-WT252ZDV.js";
14
+ } from "./chunk-EHMMBIZT.js";
15
15
  import {
16
16
  ConfigManager
17
- } from "./chunk-YBZM7PHI.js";
17
+ } from "./chunk-RBCKX2FZ.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-2MNUMLN4.js";
29
+ } from "./chunk-3CNPJLVI.js";
30
30
 
31
31
  // src/diagnostics/doctor-report.ts
32
32
  import { existsSync as existsSync3, statSync as statSync2 } from "fs";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  computeCost,
4
4
  formatCost
5
- } from "./chunk-G6DVGQ4I.js";
5
+ } from "./chunk-LONB36SP.js";
6
6
  import {
7
7
  clearRecentlyDeniedAutoActions,
8
8
  estimateTokens,
@@ -16,7 +16,7 @@ import {
16
16
  setPreferredAgentName,
17
17
  truncateForPersist,
18
18
  undoStack
19
- } from "./chunk-TPTFV3Y6.js";
19
+ } from "./chunk-O7MMYJAD.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-LR3TGZWQ.js";
54
+ } from "./chunk-HXINWG37.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-E2PNXNKI.js";
68
+ } from "./chunk-SCG2VBPB.js";
69
69
  import {
70
70
  describePlugin,
71
71
  getActivePluginAssets,
@@ -80,7 +80,7 @@ import {
80
80
  trustHook,
81
81
  trustPlugin,
82
82
  untrustHook
83
- } from "./chunk-3537CQ5M.js";
83
+ } from "./chunk-4BXTGXZ6.js";
84
84
  import {
85
85
  isCleanDocumentBody,
86
86
  stripOuterCodeFence
@@ -109,7 +109,7 @@ import {
109
109
  MCP_TOOL_PREFIX,
110
110
  REPO_URL,
111
111
  VERSION
112
- } from "./chunk-2MNUMLN4.js";
112
+ } from "./chunk-3CNPJLVI.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-BLDBI7IG.js");
2429
+ const { MCP_PROJECT_CONFIG_NAME } = await import("./constants-SNJR6546.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-GHY4BYDE.js");
3537
+ const { executeTests } = await import("./run-tests-33ZVQE3Q.js");
3538
3538
  const argStr = args.join(" ").trim();
3539
3539
  let testArgs = {};
3540
3540
  if (argStr) {
@@ -3,16 +3,16 @@ import {
3
3
  CI_COMMENT_MARKER,
4
4
  countSeverity,
5
5
  runCi
6
- } from "./chunk-BGZN4K7Q.js";
7
- import "./chunk-NLK45GUS.js";
6
+ } from "./chunk-IW6Q66WS.js";
7
+ import "./chunk-K4F7QEGW.js";
8
8
  import "./chunk-HLWUDRBO.js";
9
9
  import "./chunk-6YZEZFX5.js";
10
- import "./chunk-WT252ZDV.js";
11
- import "./chunk-YBZM7PHI.js";
10
+ import "./chunk-EHMMBIZT.js";
11
+ import "./chunk-RBCKX2FZ.js";
12
12
  import "./chunk-RMEJR3AW.js";
13
13
  import "./chunk-TU3L3PW7.js";
14
14
  import "./chunk-BMLQPSHP.js";
15
- import "./chunk-2MNUMLN4.js";
15
+ import "./chunk-3CNPJLVI.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-NLK45GUS.js";
10
- import "./chunk-2MNUMLN4.js";
9
+ } from "./chunk-K4F7QEGW.js";
10
+ import "./chunk-3CNPJLVI.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-2DYQDLLF.js";
41
+ } from "./chunk-EAVX3RLD.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-2MNUMLN4.js";
42
+ } from "./chunk-3CNPJLVI.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-E2PNXNKI.js";
6
- import "./chunk-3537CQ5M.js";
5
+ } from "./chunk-SCG2VBPB.js";
6
+ import "./chunk-4BXTGXZ6.js";
7
7
  import "./chunk-RS7SKYTS.js";
8
- import "./chunk-WT252ZDV.js";
9
- import "./chunk-YBZM7PHI.js";
8
+ import "./chunk-EHMMBIZT.js";
9
+ import "./chunk-RBCKX2FZ.js";
10
10
  import "./chunk-RMEJR3AW.js";
11
11
  import "./chunk-TU3L3PW7.js";
12
12
  import "./chunk-HOSJZMQS.js";
13
13
  import "./chunk-BMLQPSHP.js";
14
- import "./chunk-2MNUMLN4.js";
14
+ import "./chunk-3CNPJLVI.js";
15
15
  export {
16
16
  formatDoctorReport,
17
17
  runDoctorCli
@@ -55,7 +55,7 @@ import {
55
55
  touchMemoryReferences,
56
56
  updateMemoryApproval,
57
57
  updateMemoryEntry
58
- } from "./chunk-7OHXFTZO.js";
58
+ } from "./chunk-2E5W2E64.js";
59
59
  import {
60
60
  DEFAULT_PATTERNS,
61
61
  redactJson,
@@ -80,7 +80,7 @@ import {
80
80
  recoverGbkMojibake,
81
81
  runTestsTool,
82
82
  shellInvocation
83
- } from "./chunk-WVEIUSXE.js";
83
+ } from "./chunk-RLERORUI.js";
84
84
  import {
85
85
  getCurrentSessionKey,
86
86
  getExecutionConfigDir,
@@ -122,7 +122,7 @@ import {
122
122
  SUBAGENT_MAX_ROUNDS_LIMIT,
123
123
  VERSION,
124
124
  buildUserIdentityPrompt
125
- } from "./chunk-2DYQDLLF.js";
125
+ } from "./chunk-EAVX3RLD.js";
126
126
 
127
127
  // src/web/access.ts
128
128
  import { randomBytes, timingSafeEqual } from "crypto";
@@ -683,8 +683,13 @@ ${err}`
683
683
  * @returns true if config was modified and should be persisted.
684
684
  */
685
685
  migrateLegacyModels() {
686
- const LEGACY_DEEPSEEK = /* @__PURE__ */ new Set(["deepseek-chat", "deepseek-reasoner"]);
687
- const DEEPSEEK_TARGET = "deepseek-v4-flash";
686
+ const LEGACY_DEEPSEEK = /* @__PURE__ */ new Set([
687
+ "deepseek-chat",
688
+ "deepseek-reasoner",
689
+ "deepseek-v4-flash",
690
+ "deepseek-v4-flash-vision-exp"
691
+ ]);
692
+ const DEEPSEEK_TARGET = "deepseek-flash";
688
693
  const LEGACY_KIMI = /* @__PURE__ */ new Set(["kimi-k2-0711-preview", "kimi-k2-turbo-preview"]);
689
694
  const KIMI_TARGET = "kimi-k2.6";
690
695
  let changed = false;
@@ -883,15 +888,28 @@ function deepSeekCnyPricing(cacheRead, input, output) {
883
888
  output: output / CNY_PER_USD
884
889
  };
885
890
  }
891
+ var DEEPSEEK_V4_PRO_ROUTED_TO_FLASH_AT = /* @__PURE__ */ new Date("2026-09-14T04:00:00.000Z");
892
+ var DEEPSEEK_V41_FLASH_ROUTING_CONFIRMED_AT = /* @__PURE__ */ new Date("2026-09-11T00:00:00.000Z");
893
+ function isDeepSeekPeakHour(at) {
894
+ const weekday = at.getUTCDay();
895
+ if (weekday === 0 || weekday === 6) return false;
896
+ const hour = at.getUTCHours();
897
+ return hour >= 1 && hour < 4 || hour >= 6 && hour < 10;
898
+ }
899
+ function deepSeekFlash41Pricing(at) {
900
+ return isDeepSeekPeakHour(at) ? { cacheRead: 6e-3, input: 0.3, output: 1.2 } : { cacheRead: 3e-3, input: 0.15, output: 0.6 };
901
+ }
886
902
  function getDeepSeekV4Pricing(model, at) {
903
+ if (model.startsWith("deepseek-flash")) return deepSeekFlash41Pricing(at);
887
904
  const isPro = model.startsWith("deepseek-v4-pro");
888
905
  const isFlash = model.startsWith("deepseek-v4-flash");
889
906
  if (!isPro && !isFlash) return null;
907
+ if (isPro && at >= DEEPSEEK_V4_PRO_ROUTED_TO_FLASH_AT) return deepSeekFlash41Pricing(at);
908
+ if (isFlash && at >= DEEPSEEK_V41_FLASH_ROUTING_CONFIRMED_AT) return deepSeekFlash41Pricing(at);
890
909
  if (at < DEEPSEEK_TIME_PRICING_EFFECTIVE_AT) {
891
910
  return isPro ? deepSeekCnyPricing(0.025, 3, 6) : deepSeekCnyPricing(0.02, 1, 2);
892
911
  }
893
- const beijingHour = (at.getUTCHours() + 8) % 24;
894
- const isPeak = beijingHour >= 9 && beijingHour < 12 || beijingHour >= 14 && beijingHour < 18;
912
+ const isPeak = isDeepSeekPeakHour(at);
895
913
  if (isPro) {
896
914
  return isPeak ? deepSeekCnyPricing(0.3, 9, 27) : deepSeekCnyPricing(0.15, 4.5, 13.5);
897
915
  }
@@ -4166,30 +4184,34 @@ var DeepSeekProvider = class extends OpenAICompatibleProvider {
4166
4184
  info = {
4167
4185
  id: "deepseek",
4168
4186
  displayName: "DeepSeek",
4169
- defaultModel: "deepseek-v4-flash",
4187
+ defaultModel: "deepseek-flash",
4170
4188
  apiKeyEnvVar: "AICLI_API_KEY_DEEPSEEK",
4171
4189
  requiresApiKey: true,
4172
4190
  baseUrl: this.defaultBaseUrl,
4173
4191
  models: [
4174
- // ── V4 family (2026-04-23+):1M context,支持 Thinking / Non-Thinking 双模式 ──
4192
+ // ── V4.1 Flash (2026-09):1M context,原生多模态,Thinking / Non-Thinking 双模式 ──
4193
+ // model code 实测取自端点本身:`/v1/models` 只列 `deepseek-flash` 与 `deepseek-v4-pro`,
4194
+ // 传 `deepseek-v4.1-flash` 报 400 并把合法名字写在错误消息里。**不要**按发布公告里的
4195
+ // 版本号拼 code(v0.4.198 的 `glm-5.2[1m]` 就是这么栽的)。
4175
4196
  {
4176
- id: "deepseek-v4-pro",
4177
- displayName: "DeepSeek V4 Pro (0813, 1.6T MoE, 49B active)",
4197
+ id: "deepseek-flash",
4198
+ displayName: "DeepSeek V4.1 Flash (multimodal, 1M)",
4178
4199
  contextWindow: 1048576,
4179
4200
  supportsStreaming: true,
4180
4201
  supportsThinking: true
4181
4202
  },
4182
4203
  {
4183
- id: "deepseek-v4-flash",
4184
- displayName: "DeepSeek V4 Flash (0731, 284B MoE, 13B active)",
4204
+ id: "deepseek-v4-pro",
4205
+ displayName: "DeepSeek V4 Pro (text-only; routes to V4.1 Flash from 2026-09-14)",
4185
4206
  contextWindow: 1048576,
4186
4207
  supportsStreaming: true,
4187
4208
  supportsThinking: true
4188
4209
  }
4189
- // Legacy aliases (deepseek-chat / deepseek-reasoner) removed in v0.4.140 —
4190
- // they retire 2026-07-24 and DeepSeek already routes them to V4 Flash server-side.
4191
- // Pre-existing sessions were migrated to deepseek-v4-flash; pricing.ts keeps the
4192
- // old ids for any historical cost calculations.
4210
+ // Legacy aliases:`deepseek-v4-flash` / `deepseek-v4-flash-vision-exp` 的底层模型已退役,
4211
+ // 端点仍接受这两个名字并路由到 V4.1 Flash(实测传 `deepseek-v4-flash` 返回 200 且响应
4212
+ // `model` 字段回显 `deepseek-flash`)。它们不再列进推荐清单,config pin 过的会被
4213
+ // `migrateLegacyModels()` 自愈到 `deepseek-flash`;pricing.ts 保留旧 id 供历史成本回算。
4214
+ // `deepseek-chat` / `deepseek-reasoner` 早在 v0.4.140 移除(2026-07-24 停用)。
4193
4215
  ]
4194
4216
  };
4195
4217
  /**
@@ -17236,7 +17258,7 @@ Cache: write=${cacheCreate} read=${cacheRead}` : "";
17236
17258
  Cost: ${formatCost(cost)}` : "";
17237
17259
  let memoryLine = "";
17238
17260
  try {
17239
- const { countPendingMemories: countPendingMemories2 } = await import("./persistent-memory-UNLCXUWH.js");
17261
+ const { countPendingMemories: countPendingMemories2 } = await import("./persistent-memory-EXJBXL33.js");
17240
17262
  const pending = countPendingMemories2(ctx.config.getConfigDir());
17241
17263
  if (pending > 0) memoryLine = `
17242
17264
  Memory: \u26A0 ${pending} pending approval \u2014 see the Memory panel or /memory`;
@@ -18224,7 +18246,7 @@ async function handleTest(args, ctx) {
18224
18246
  const isCommand = argStr.includes(" ") || /^(mvn|gradle|npm|pytest|cargo|go)\b/.test(argStr);
18225
18247
  testArgs = isCommand ? { command: argStr } : { filter: argStr };
18226
18248
  }
18227
- const runTests = ctx.runTests ?? (await import("./run-tests-KRNMFXAN.js")).executeTests;
18249
+ const runTests = ctx.runTests ?? (await import("./run-tests-2C7MWZBN.js")).executeTests;
18228
18250
  const report = await runTests(testArgs);
18229
18251
  ctx.send({ type: "info", message: report });
18230
18252
  } catch (err) {
@@ -18615,7 +18637,7 @@ async function handleMemory(args, ctx) {
18615
18637
  }
18616
18638
  if (intent.kind === "status") {
18617
18639
  const { getChatIndexStatus: getChatIndexStatus2 } = await import("./chat-index-RLVLQRRC.js");
18618
- const { listMemoryEntries: listMemoryEntries2, isMemoryExpired: isMemoryExpired2, formatMemoryForPrompt: formatMemoryForPrompt2 } = await import("./persistent-memory-UNLCXUWH.js");
18640
+ const { listMemoryEntries: listMemoryEntries2, isMemoryExpired: isMemoryExpired2, formatMemoryForPrompt: formatMemoryForPrompt2 } = await import("./persistent-memory-EXJBXL33.js");
18619
18641
  const memories = listMemoryEntries2(configDir, { includeExpired: true, includeRejected: true });
18620
18642
  const injected = formatMemoryForPrompt2(configDir, process.cwd(), ctx.config.get("memory")?.maxChars);
18621
18643
  const view = buildMemoryStatusView({
@@ -18638,7 +18660,7 @@ async function handleMemory(args, ctx) {
18638
18660
  return;
18639
18661
  }
18640
18662
  if (intent.kind === "recall") {
18641
- const { searchPersistentMemories: searchPersistentMemories2, touchMemoryReferences: touchMemoryReferences2 } = await import("./persistent-memory-UNLCXUWH.js");
18663
+ const { searchPersistentMemories: searchPersistentMemories2, touchMemoryReferences: touchMemoryReferences2 } = await import("./persistent-memory-EXJBXL33.js");
18642
18664
  const { searchChatMemory: searchChatMemory2 } = await import("./chat-index-RLVLQRRC.js");
18643
18665
  const persistentHits = searchPersistentMemories2(configDir, intent.query, process.cwd(), 3);
18644
18666
  if (persistentHits.length > 0) {
@@ -18759,7 +18781,7 @@ async function handleMemory(args, ctx) {
18759
18781
  ctx.handleMemoryManage(intent.action, args[1], intent.action === "expire" ? args[2] : void 0);
18760
18782
  } else if (intent.kind === "export") {
18761
18783
  if (args[1] === "md") {
18762
- const { exportMemoryEntries: exportMemoryEntries2 } = await import("./persistent-memory-UNLCXUWH.js");
18784
+ const { exportMemoryEntries: exportMemoryEntries2 } = await import("./persistent-memory-EXJBXL33.js");
18763
18785
  ctx.send({
18764
18786
  type: "export_data",
18765
18787
  format: "md",
@@ -19764,7 +19786,7 @@ No tools match "${filter}".
19764
19786
  const { join: join26 } = await import("path");
19765
19787
  const { existsSync: existsSync32 } = await import("fs");
19766
19788
  const { getGitRoot: getGitRoot2 } = await import("./git-context-VNCA2GU7.js");
19767
- const { MCP_PROJECT_CONFIG_NAME: MCP_PROJECT_CONFIG_NAME2 } = await import("./constants-FG27DQMS.js");
19789
+ const { MCP_PROJECT_CONFIG_NAME: MCP_PROJECT_CONFIG_NAME2 } = await import("./constants-GYJTB6KI.js");
19768
19790
  const { approveProject, hashMcpFile } = await import("./project-trust-6CJB5ZMX.js");
19769
19791
  const cwd = process.cwd();
19770
19792
  const projectRoot = getGitRoot2(cwd) ?? cwd;
@@ -20683,7 +20705,7 @@ function createReviewCommands() {
20683
20705
  usage: "/test [command|filter]",
20684
20706
  async execute(args, ctx) {
20685
20707
  try {
20686
- const { executeTests } = await import("./run-tests-KRNMFXAN.js");
20708
+ const { executeTests } = await import("./run-tests-2C7MWZBN.js");
20687
20709
  const argStr = args.join(" ").trim();
20688
20710
  let testArgs = {};
20689
20711
  if (argStr) {
@@ -158,7 +158,7 @@ ${content}`);
158
158
  }
159
159
  }
160
160
  async function runTaskMode(config, providers, configManager, topic) {
161
- const { TaskOrchestrator } = await import("./task-orchestrator-GI3RGLZI.js");
161
+ const { TaskOrchestrator } = await import("./task-orchestrator-HNRV3YUD.js");
162
162
  const orchestrator = new TaskOrchestrator(config, providers, configManager);
163
163
  let interrupted = false;
164
164
  const onSigint = () => {
package/dist/index.js CHANGED
@@ -24,12 +24,12 @@ import {
24
24
  setupProxy,
25
25
  snapshotFile,
26
26
  stripRoutingTags
27
- } from "./chunk-HC33C4U3.js";
27
+ } from "./chunk-T42GXE7Y.js";
28
28
  import {
29
29
  CostTracker,
30
30
  getPricing,
31
31
  setCostCurrency
32
- } from "./chunk-G6DVGQ4I.js";
32
+ } from "./chunk-LONB36SP.js";
33
33
  import {
34
34
  ToolExecutor,
35
35
  ToolRegistry,
@@ -47,7 +47,7 @@ import {
47
47
  setMaxOutputCap,
48
48
  spawnAgentContext,
49
49
  undoStack
50
- } from "./chunk-TPTFV3Y6.js";
50
+ } from "./chunk-O7MMYJAD.js";
51
51
  import "./chunk-HLWUDRBO.js";
52
52
  import {
53
53
  NO_THINKING,
@@ -60,7 +60,7 @@ import {
60
60
  countPendingMemories,
61
61
  detectStaleLegacyMarkdownEdit,
62
62
  formatMemoryForPrompt
63
- } from "./chunk-LR3TGZWQ.js";
63
+ } from "./chunk-HXINWG37.js";
64
64
  import "./chunk-RWRZVQCB.js";
65
65
  import "./chunk-B3MPYI4E.js";
66
66
  import "./chunk-M6HLYG33.js";
@@ -81,22 +81,22 @@ import {
81
81
  import {
82
82
  loadContextFiles,
83
83
  writeCrashLog
84
- } from "./chunk-E2PNXNKI.js";
84
+ } from "./chunk-SCG2VBPB.js";
85
85
  import {
86
86
  getActivePluginAssets,
87
87
  getPendingHookTrust,
88
88
  installFlushOnExit,
89
89
  mergePluginHooks,
90
90
  runLifecycleHooks
91
- } from "./chunk-3537CQ5M.js";
91
+ } from "./chunk-4BXTGXZ6.js";
92
92
  import "./chunk-RS7SKYTS.js";
93
93
  import {
94
94
  ProviderRegistry,
95
95
  listBuiltInProviderMetadata
96
- } from "./chunk-WT252ZDV.js";
96
+ } from "./chunk-EHMMBIZT.js";
97
97
  import {
98
98
  ConfigManager
99
- } from "./chunk-YBZM7PHI.js";
99
+ } from "./chunk-RBCKX2FZ.js";
100
100
  import {
101
101
  CONTENT_ONLY_STREAM_REMINDER,
102
102
  TEE_FINAL_USER_NUDGE,
@@ -134,7 +134,7 @@ import {
134
134
  isInterrupted,
135
135
  requestInterrupt,
136
136
  resetInterrupt
137
- } from "./chunk-JJNUASMJ.js";
137
+ } from "./chunk-3GEO2LPO.js";
138
138
  import {
139
139
  AGENTIC_BEHAVIOR_GUIDELINE,
140
140
  AUTHOR,
@@ -152,7 +152,7 @@ import {
152
152
  SKILLS_DIR_NAME,
153
153
  VERSION,
154
154
  buildUserIdentityPrompt
155
- } from "./chunk-2MNUMLN4.js";
155
+ } from "./chunk-3CNPJLVI.js";
156
156
  import "./chunk-SXIJLSVF.js";
157
157
 
158
158
  // src/index.ts
@@ -1077,7 +1077,10 @@ function getVisionModelHint(model, provider) {
1077
1077
  if (bare.includes("vision") || bare.includes("vl") || bare.includes("5v") || // glm-5v-turbo
1078
1078
  bare.endsWith(".6v") || // glm-4.6v
1079
1079
  bare === "glm-5.3-flash" || // GLM-5 系列首个原生多模态(名字里没有 v,得单独认)
1080
- bare.endsWith("-v")) return null;
1080
+ // DeepSeek V4.1 Flash(2026-09)原生多模态。放在这条通用规则里而不是只写进下面的
1081
+ // deepseek 分支,是为了让 OpenRouter 的 `deepseek/deepseek-flash` 也一并放行——
1082
+ // 按 provider 分支写就会重演 v0.4.295「同一个坑换个前缀又漏一次」。
1083
+ bare.startsWith("deepseek-flash") || bare.endsWith("-v")) return null;
1081
1084
  if (provider === "kimi") {
1082
1085
  if (model.startsWith("moonshot-v1-")) {
1083
1086
  const visionModel = model + "-vision-preview";
@@ -1089,7 +1092,8 @@ function getVisionModelHint(model, provider) {
1089
1092
  return `model "${model}" does not support images. Use /model glm-5.3-flash (or glm-4.6v)`;
1090
1093
  }
1091
1094
  if (provider === "deepseek") {
1092
- return `model "${model}" does not support vision. DeepSeek standard models are text-only.`;
1095
+ if (bare.startsWith("deepseek-v4-flash")) return null;
1096
+ return `model "${model}" does not support images. Use /model deepseek-flash (DeepSeek V4.1 Flash)`;
1093
1097
  }
1094
1098
  return `model "${model}" may not support image input`;
1095
1099
  }
@@ -4064,7 +4068,7 @@ program.command("web").description("Start Web UI server with browser-based chat
4064
4068
  console.error("Error: Invalid port number. Must be between 1 and 65535.");
4065
4069
  process.exit(1);
4066
4070
  }
4067
- const { startWebServer } = await import("./server-QRAWSG4Z.js");
4071
+ const { startWebServer } = await import("./server-AJH5TBVO.js");
4068
4072
  await startWebServer({ port, host: options.host, externalOrigin: options.externalOrigin });
4069
4073
  });
4070
4074
  program.command("user [action] [username]").description("Manage Web UI users (list | create <name> | delete <name> | reset-password <name> | logout-all <name> | migrate <name>)").action(async (action, username) => {
@@ -4231,11 +4235,11 @@ program.command("sessions").description("List recent conversation sessions").opt
4231
4235
  console.log(footer + "\n");
4232
4236
  });
4233
4237
  program.command("usage").description("Show token + cost usage grouped by provider/model (cross-session)").option("--days <n>", "Only the last N days (inclusive of today)").option("--month <ym>", "Only a specific month, format YYYY-MM (e.g. 2026-06)").option("--json", "Output as JSON (for scripting)").action(async (options) => {
4234
- const { runUsageCli } = await import("./usage-GWTIGZF5.js");
4238
+ const { runUsageCli } = await import("./usage-ZN5DU6Z7.js");
4235
4239
  await runUsageCli(options);
4236
4240
  });
4237
4241
  program.command("doctor").description("Health check: API keys, config, MCP, recent crashes, tool usage, disk usage").option("--json", "Output as JSON (for scripting)").option("--reset-stats", "Reset accumulated tool usage statistics").action(async (options) => {
4238
- const { runDoctorCli } = await import("./doctor-cli-QQLMNJN7.js");
4242
+ const { runDoctorCli } = await import("./doctor-cli-J6LAQ5LU.js");
4239
4243
  const argv = process.argv.slice(2);
4240
4244
  await runDoctorCli({
4241
4245
  json: !!options.json || argv.includes("--json"),
@@ -4244,7 +4248,7 @@ program.command("doctor").description("Health check: API keys, config, MCP, rece
4244
4248
  });
4245
4249
  program.command("batch <action> [arg] [arg2]").description("Anthropic Message Batches: submit | list | status <id> | results <id> [out] | cancel <id>").option("--dry-run", "Parse and validate input without submitting (submit only)").action(async (action, arg, arg2, options) => {
4246
4250
  try {
4247
- const batch = await import("./batch-S7XLEEOH.js");
4251
+ const batch = await import("./batch-H4WWSZQ3.js");
4248
4252
  switch (action) {
4249
4253
  case "submit":
4250
4254
  if (!arg) {
@@ -4287,7 +4291,7 @@ program.command("batch <action> [arg] [arg2]").description("Anthropic Message Ba
4287
4291
  }
4288
4292
  });
4289
4293
  program.command("mcp-serve").description("Start an MCP server over STDIO, exposing aicli's built-in tools to Claude Desktop / Cursor / other MCP clients").option("--allow-destructive", "Allow bash / run_interactive / task_create (always destructive in MCP mode)").option("--allow-outside-cwd", "Allow tool path arguments to escape the sandbox root \u2014 disabled by default").option("--tools <list>", "Comma-separated whitelist of tools to expose (default: all eligible tools)").option("--cwd <path>", "Working directory AND sandbox root (default: current directory)").action(async (options) => {
4290
- const { startMcpServer } = await import("./server-73UBHSFV.js");
4294
+ const { startMcpServer } = await import("./server-CYAB56O3.js");
4291
4295
  await startMcpServer({
4292
4296
  allowDestructive: !!options.allowDestructive,
4293
4297
  allowOutsideCwd: !!options.allowOutsideCwd,
@@ -4300,7 +4304,7 @@ program.command("pr <action> [target]").description("PR review helpers: review |
4300
4304
  console.error(`Unknown pr action: ${action}. Use review | security-review | summarize.`);
4301
4305
  process.exit(1);
4302
4306
  }
4303
- const { runPrCli } = await import("./pr-YCFGPFI7.js");
4307
+ const { runPrCli } = await import("./pr-6PUHVJ6K.js");
4304
4308
  const result = await runPrCli({
4305
4309
  action,
4306
4310
  target,
@@ -4320,8 +4324,8 @@ program.command("pr <action> [target]").description("PR review helpers: review |
4320
4324
  process.exit(result.exitCode);
4321
4325
  });
4322
4326
  program.command("ci").description("Headless PR review (code + security) \u2014 reads git/gh diff, optionally posts to PR. Designed for GitHub Actions.").option("--pr <num>", "PR number or URL; diff fetched via gh pr diff <value>", (v) => /^#?\d+$/.test(v) ? parseInt(v.replace(/^#/, ""), 10) : v).option("--base <ref>", "Base ref for git diff <ref>...HEAD (ignored when --pr set)").option("--post", "Post review as a PR comment (requires gh CLI + GH_TOKEN, needs --pr)").option("--no-update", "Always create a new comment instead of updating the previous aicli review").option("--skip-code", "Skip the code review section").option("--skip-security", "Skip the security review section").option("--detailed", "Use the detailed code-review prompt").option("--max-diff <n>", "Max diff chars sent to the model (default 30000)", (v) => parseInt(v, 10)).option("--provider <id>", "Override provider (default: config.defaultProvider)").option("--model <id>", "Override model").option("--dry-run", "Print result to stdout instead of posting (overrides --post)").option("--json", "Output a structured JSON report").option("--markdown", "Output Markdown report (default)").option("--sarif", "Output SARIF 2.1.0 for code scanning artifacts").option("--fail-on-security-high", "Fail when the security review contains HIGH/CRITICAL findings (default)").option("--no-fail-on-security-high", "Do not fail on security HIGH/CRITICAL findings").option("--fail-on-test-failure", "Fail when the report mentions test failures (default)").option("--no-fail-on-test-failure", "Do not fail on test failure findings").option("--fail-on-lint-failure", "Fail when the report mentions lint/typecheck failures (default)").option("--no-fail-on-lint-failure", "Do not fail on lint/typecheck failure findings").action(async (options) => {
4323
- const { runCi } = await import("./ci-5HONSUAS.js");
4324
- const { formatCiResult } = await import("./ci-format-URUH3ZZ5.js");
4327
+ const { runCi } = await import("./ci-H6GPHG4T.js");
4328
+ const { formatCiResult } = await import("./ci-format-U47GSGYU.js");
4325
4329
  const formats = [options.json, options.markdown, options.sarif].filter(Boolean).length;
4326
4330
  if (formats > 1) {
4327
4331
  console.error("Choose only one output format: --json, --markdown, or --sarif.");
@@ -4480,7 +4484,7 @@ program.command("hub [topic]").description("Start multi-agent hub (discuss / bra
4480
4484
  config.get("customProviders"),
4481
4485
  config.getConfigDir()
4482
4486
  );
4483
- const { startHub } = await import("./hub-GGFW3DCC.js");
4487
+ const { startHub } = await import("./hub-G5FMMTVZ.js");
4484
4488
  await startHub(
4485
4489
  {
4486
4490
  topic: topic ?? "",
@@ -27,11 +27,11 @@ import {
27
27
  touchMemoryReferences,
28
28
  updateMemoryApproval,
29
29
  updateMemoryEntry
30
- } from "./chunk-7OHXFTZO.js";
30
+ } from "./chunk-2E5W2E64.js";
31
31
  import "./chunk-FSC6KEWU.js";
32
32
  import "./chunk-2XMUCC42.js";
33
33
  import "./chunk-CGLYJRFA.js";
34
- import "./chunk-2DYQDLLF.js";
34
+ import "./chunk-EAVX3RLD.js";
35
35
  export {
36
36
  addMemoryEntry,
37
37
  backupMemoryStore,
@@ -28,11 +28,11 @@ import {
28
28
  touchMemoryReferences,
29
29
  updateMemoryApproval,
30
30
  updateMemoryEntry
31
- } from "./chunk-LR3TGZWQ.js";
31
+ } from "./chunk-HXINWG37.js";
32
32
  import "./chunk-3FEZSLGI.js";
33
33
  import "./chunk-HOSJZMQS.js";
34
34
  import "./chunk-BMLQPSHP.js";
35
- import "./chunk-2MNUMLN4.js";
35
+ import "./chunk-3CNPJLVI.js";
36
36
  export {
37
37
  addMemoryEntry,
38
38
  backupMemoryStore,
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  countSeverity,
4
4
  runCi
5
- } from "./chunk-BGZN4K7Q.js";
6
- import "./chunk-NLK45GUS.js";
5
+ } from "./chunk-IW6Q66WS.js";
6
+ import "./chunk-K4F7QEGW.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-WT252ZDV.js";
17
+ } from "./chunk-EHMMBIZT.js";
18
18
  import {
19
19
  ConfigManager
20
- } from "./chunk-YBZM7PHI.js";
20
+ } from "./chunk-RBCKX2FZ.js";
21
21
  import "./chunk-RMEJR3AW.js";
22
22
  import "./chunk-TU3L3PW7.js";
23
23
  import "./chunk-BMLQPSHP.js";
24
24
  import {
25
25
  VERSION
26
- } from "./chunk-2MNUMLN4.js";
26
+ } from "./chunk-3CNPJLVI.js";
27
27
 
28
28
  // src/cli/pr.ts
29
29
  import { execFileSync } from "child_process";
@@ -2,9 +2,9 @@ import {
2
2
  executeTests,
3
3
  runTestProcess,
4
4
  runTestsTool
5
- } from "./chunk-WVEIUSXE.js";
5
+ } from "./chunk-RLERORUI.js";
6
6
  import "./chunk-QMFMST2T.js";
7
- import "./chunk-2DYQDLLF.js";
7
+ import "./chunk-EAVX3RLD.js";
8
8
  export {
9
9
  executeTests,
10
10
  runTestProcess,
@@ -3,8 +3,8 @@ import {
3
3
  executeTests,
4
4
  runTestProcess,
5
5
  runTestsTool
6
- } from "./chunk-JJNUASMJ.js";
7
- import "./chunk-2MNUMLN4.js";
6
+ } from "./chunk-3GEO2LPO.js";
7
+ import "./chunk-3CNPJLVI.js";
8
8
  import "./chunk-SXIJLSVF.js";
9
9
  export {
10
10
  executeTests,
@@ -86,7 +86,7 @@ import {
86
86
  skillHistoryNote,
87
87
  snapshotFile,
88
88
  stripRoutingTags
89
- } from "./chunk-HC33C4U3.js";
89
+ } from "./chunk-T42GXE7Y.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-G6DVGQ4I.js";
98
+ } from "./chunk-LONB36SP.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-TPTFV3Y6.js";
133
+ } from "./chunk-O7MMYJAD.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-LR3TGZWQ.js";
160
+ } from "./chunk-HXINWG37.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-E2PNXNKI.js";
179
+ } from "./chunk-SCG2VBPB.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-3537CQ5M.js";
194
+ } from "./chunk-4BXTGXZ6.js";
195
195
  import "./chunk-RS7SKYTS.js";
196
196
  import {
197
197
  ProviderRegistry
198
- } from "./chunk-WT252ZDV.js";
198
+ } from "./chunk-EHMMBIZT.js";
199
199
  import {
200
200
  ConfigManager
201
- } from "./chunk-YBZM7PHI.js";
201
+ } from "./chunk-RBCKX2FZ.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-JJNUASMJ.js";
234
+ import "./chunk-3GEO2LPO.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-2MNUMLN4.js";
250
+ } from "./chunk-3CNPJLVI.js";
251
251
  import {
252
252
  runWithExecutionContext,
253
253
  runWithSessionKey
@@ -978,7 +978,7 @@ Cache: write=${cacheCreate} read=${cacheRead}` : "";
978
978
  Cost: ${formatCost(cost)}` : "";
979
979
  let memoryLine = "";
980
980
  try {
981
- const { countPendingMemories: countPendingMemories2 } = await import("./persistent-memory-YYWIN6BG.js");
981
+ const { countPendingMemories: countPendingMemories2 } = await import("./persistent-memory-LEE454DW.js");
982
982
  const pending = countPendingMemories2(ctx.config.getConfigDir());
983
983
  if (pending > 0) memoryLine = `
984
984
  Memory: \u26A0 ${pending} pending approval \u2014 see the Memory panel or /memory`;
@@ -1907,7 +1907,7 @@ async function handleTest(args, ctx) {
1907
1907
  const isCommand = argStr.includes(" ") || /^(mvn|gradle|npm|pytest|cargo|go)\b/.test(argStr);
1908
1908
  testArgs = isCommand ? { command: argStr } : { filter: argStr };
1909
1909
  }
1910
- const runTests = ctx.runTests ?? (await import("./run-tests-GHY4BYDE.js")).executeTests;
1910
+ const runTests = ctx.runTests ?? (await import("./run-tests-33ZVQE3Q.js")).executeTests;
1911
1911
  const report = await runTests(testArgs);
1912
1912
  ctx.send({ type: "info", message: report });
1913
1913
  } catch (err) {
@@ -2183,7 +2183,7 @@ async function handleMemory(args, ctx) {
2183
2183
  }
2184
2184
  if (intent.kind === "status") {
2185
2185
  const { getChatIndexStatus } = await import("./chat-index-7CLR4CBG.js");
2186
- const { listMemoryEntries: listMemoryEntries2, isMemoryExpired: isMemoryExpired2, formatMemoryForPrompt: formatMemoryForPrompt2 } = await import("./persistent-memory-YYWIN6BG.js");
2186
+ const { listMemoryEntries: listMemoryEntries2, isMemoryExpired: isMemoryExpired2, formatMemoryForPrompt: formatMemoryForPrompt2 } = await import("./persistent-memory-LEE454DW.js");
2187
2187
  const memories = listMemoryEntries2(configDir, { includeExpired: true, includeRejected: true });
2188
2188
  const injected = formatMemoryForPrompt2(configDir, process.cwd(), ctx.config.get("memory")?.maxChars);
2189
2189
  const view = buildMemoryStatusView({
@@ -2206,7 +2206,7 @@ async function handleMemory(args, ctx) {
2206
2206
  return;
2207
2207
  }
2208
2208
  if (intent.kind === "recall") {
2209
- const { searchPersistentMemories, touchMemoryReferences } = await import("./persistent-memory-YYWIN6BG.js");
2209
+ const { searchPersistentMemories, touchMemoryReferences } = await import("./persistent-memory-LEE454DW.js");
2210
2210
  const { searchChatMemory } = await import("./chat-index-7CLR4CBG.js");
2211
2211
  const persistentHits = searchPersistentMemories(configDir, intent.query, process.cwd(), 3);
2212
2212
  if (persistentHits.length > 0) {
@@ -2327,7 +2327,7 @@ async function handleMemory(args, ctx) {
2327
2327
  ctx.handleMemoryManage(intent.action, args[1], intent.action === "expire" ? args[2] : void 0);
2328
2328
  } else if (intent.kind === "export") {
2329
2329
  if (args[1] === "md") {
2330
- const { exportMemoryEntries: exportMemoryEntries2 } = await import("./persistent-memory-YYWIN6BG.js");
2330
+ const { exportMemoryEntries: exportMemoryEntries2 } = await import("./persistent-memory-LEE454DW.js");
2331
2331
  ctx.send({
2332
2332
  type: "export_data",
2333
2333
  format: "md",
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ToolRegistry
4
- } from "./chunk-TPTFV3Y6.js";
4
+ } from "./chunk-O7MMYJAD.js";
5
5
  import "./chunk-6JHACXB3.js";
6
- import "./chunk-LR3TGZWQ.js";
6
+ import "./chunk-HXINWG37.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-3537CQ5M.js";
17
+ } from "./chunk-4BXTGXZ6.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-JJNUASMJ.js";
27
+ import "./chunk-3GEO2LPO.js";
28
28
  import {
29
29
  VERSION
30
- } from "./chunk-2MNUMLN4.js";
30
+ } from "./chunk-3CNPJLVI.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-TPTFV3Y6.js";
7
+ } from "./chunk-O7MMYJAD.js";
8
8
  import "./chunk-6JHACXB3.js";
9
- import "./chunk-LR3TGZWQ.js";
9
+ import "./chunk-HXINWG37.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-3537CQ5M.js";
20
+ } from "./chunk-4BXTGXZ6.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-JJNUASMJ.js";
32
+ import "./chunk-3GEO2LPO.js";
33
33
  import {
34
34
  SUBAGENT_ALLOWED_TOOLS
35
- } from "./chunk-2MNUMLN4.js";
35
+ } from "./chunk-3CNPJLVI.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-G6DVGQ4I.js";
8
+ } from "./chunk-LONB36SP.js";
9
9
  import "./chunk-RS7SKYTS.js";
10
10
  import {
11
11
  ConfigManager
12
- } from "./chunk-YBZM7PHI.js";
12
+ } from "./chunk-RBCKX2FZ.js";
13
13
  import "./chunk-TU3L3PW7.js";
14
14
  import "./chunk-BMLQPSHP.js";
15
- import "./chunk-2MNUMLN4.js";
15
+ import "./chunk-3CNPJLVI.js";
16
16
 
17
17
  // src/cli/usage.ts
18
18
  function classifyRowCost(row) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jinzd-ai-cli",
3
- "version": "0.4.308",
3
+ "version": "0.4.309",
4
4
  "description": "Cross-platform REPL-style AI CLI with multi-provider support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",