zen-gitsync 2.18.20 → 2.18.22

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 (88) hide show
  1. package/package.json +4 -1
  2. package/src/cli/ai/agent.js +9 -2
  3. package/src/cli/ai/extensions.js +1 -1
  4. package/src/cli/ai/runtime.test.js +57 -1
  5. package/src/cli/ai/termui.js +11 -2
  6. package/src/cli/ai/tools.js +266 -5
  7. package/src/cli/ai/tools.test.js +81 -0
  8. package/src/cli/ai/transport.js +1 -1
  9. package/src/cli/ai/turn.js +59 -3
  10. package/src/config.js +60 -4
  11. package/src/mcp/install.js +548 -529
  12. package/src/ui/public/assets/AgentView-DdiyBMDD.js +26 -0
  13. package/src/ui/public/assets/{AgentView-BE7GD8rc.css → AgentView-_DUYxFmp.css} +1 -1
  14. package/src/ui/public/assets/{AppVersionBadge-86tbKU20.js → AppVersionBadge-CSEM45L4.js} +2 -2
  15. package/src/ui/public/assets/{BranchSelector-CsrkmTCA.js → BranchSelector-cSx2ZxYM.js} +1 -1
  16. package/src/ui/public/assets/ChatSilenceBadge-Dtv23ZmV.js +16 -0
  17. package/src/ui/public/assets/{CommitForm-DBK0GXEh.js → CommitForm-CrAsbDkq.js} +2 -2
  18. package/src/ui/public/assets/{CommonDialog-BkuDIWro.js → CommonDialog-BtO3uKdw.js} +1 -1
  19. package/src/ui/public/assets/{EditorView-CnWsMdHg.css → EditorView-B-t-nuf0.css} +1 -1
  20. package/src/ui/public/assets/EditorView-BesiWTV2.js +10 -0
  21. package/src/ui/public/assets/{FlowExecutionViewer-ClUkAmA2.js → FlowExecutionViewer-CfU9DLFG.js} +1 -1
  22. package/src/ui/public/assets/{FlowOrchestrationWorkspace-B3sOK3fz.js → FlowOrchestrationWorkspace-D3CSRMvG.js} +1 -1
  23. package/src/ui/public/assets/{LogList-6aO0-2xh.js → LogList-CT-SRIS3.js} +4 -4
  24. package/src/ui/public/assets/MindmapView-BCGq2zdh.js +35 -0
  25. package/src/ui/public/assets/MindmapView-CoUbyadF.css +1 -0
  26. package/src/ui/public/assets/{MonitorView-fcNrgVaU.js → MonitorView-BuBJJVhR.js} +1 -1
  27. package/src/ui/public/assets/{ProjectManagerView-CZfrML6A.js → ProjectManagerView-DlSfRn9N.js} +2 -2
  28. package/src/ui/public/assets/{ProjectStartupButton-D5MREz6F.js → ProjectStartupButton-DKZttDb3.js} +1 -1
  29. package/src/ui/public/assets/RemoteManagerDialog-CVrhhUPg.js +4 -0
  30. package/src/ui/public/assets/{RemoteRepoCard-CTnmfv2y.js → RemoteRepoCard-CmdYDF24.js} +1 -1
  31. package/src/ui/public/assets/{SourceMapView-B4q5qiE8.js → SourceMapView-DClgTmda.js} +1 -1
  32. package/src/ui/public/assets/{SvgIcon-WpEiC1rI.js → SvgIcon-D5fhBiJr.js} +1 -1
  33. package/src/ui/public/assets/TaskExecutorPicker-CzvWdS_K.js +1 -0
  34. package/src/ui/public/assets/TaskExecutorPicker-Dn8SgrTZ.css +1 -0
  35. package/src/ui/public/assets/{UserInputNode-Deoc3UvQ.js → UserInputNode-CNuW_Dtu.js} +1 -1
  36. package/src/ui/public/assets/WorkbenchView-D61DxNnn.css +1 -0
  37. package/src/ui/public/assets/WorkbenchView-WKNPn-oz.js +341 -0
  38. package/src/ui/public/assets/_plugin-vue_export-helper-E2AaPXn7.js +19 -0
  39. package/src/ui/public/assets/configStore-JIX2MOKo.js +1 -0
  40. package/src/ui/public/assets/{dagre-CpKxpMNH.js → dagre-yiQDclZv.js} +3 -3
  41. package/src/ui/public/assets/{element-plus-Bz6lYur-.js → element-plus-BeZBQw4X.js} +1 -1
  42. package/src/ui/public/assets/{flow-mindmap-cTg78Krq.js → flow-mindmap-CGjPqCv0.js} +1 -1
  43. package/src/ui/public/assets/{index-cDiVh_ZL.js → index-Cjv2Z6nF.js} +134 -125
  44. package/src/ui/public/assets/index-IjYv2goK.css +1 -0
  45. package/src/ui/public/assets/{monaco-CvMddat7.js → monaco-CMQow_j-.js} +1 -1
  46. package/src/ui/public/assets/{office-docx-VOB-i4K2.js → office-docx-nuGPI15f.js} +1 -1
  47. package/src/ui/public/assets/{office-excel-CJ2JvfA8.js → office-excel-CK-HOYi8.js} +1 -1
  48. package/src/ui/public/assets/{office-pptx-Z88k9qnx.js → office-pptx-9onMeLux.js} +1 -1
  49. package/src/ui/public/assets/{relativeTime-CoXAs57j.js → relativeTime-DHhE9Ihn.js} +1 -1
  50. package/src/ui/public/assets/taskExecutionExport-DlBMELzX.js +15 -0
  51. package/src/ui/public/assets/toolsStore-h5iqPyST.js +1 -0
  52. package/src/ui/public/assets/{useWorkbenchProjects-BS59r5Rj.js → useWorkbenchProjects-DW3vBHpK.js} +1 -1
  53. package/src/ui/public/assets/{vendor-CSFGMcMB.css → vendor-CAhoE06w.css} +1 -1
  54. package/src/ui/public/assets/{vendor-C2k0GBzj.js → vendor-KxSgeiUX.js} +303 -303
  55. package/src/ui/public/assets/{vue-flow-Cnxq2qrs.js → vue-flow-BMMiguH1.js} +1 -1
  56. package/src/ui/public/index.html +14 -14
  57. package/src/ui/server/routes/config.js +13 -0
  58. package/src/ui/server/routes/fileOpen.js +1851 -1736
  59. package/src/ui/server/routes/fileOpen.test.js +39 -1
  60. package/src/ui/server/routes/workbench/agentChat.js +48 -8
  61. package/src/ui/server/routes/workbench/agentChatShared.test.js +584 -496
  62. package/src/ui/server/routes/workbench/agentEngines.js +7 -4
  63. package/src/ui/server/routes/workbench/executorModels.js +25 -4
  64. package/src/ui/server/routes/workbench/executorModels.test.js +557 -530
  65. package/src/ui/server/routes/workbench/jobActivity.js +2 -2
  66. package/src/ui/server/routes/workbench/taskRunner.codearts.test.js +252 -0
  67. package/src/ui/server/routes/workbench/taskRunner.codebuddy.test.js +317 -317
  68. package/src/ui/server/routes/workbench/taskRunner.js +216 -7
  69. package/src/ui/server/routes/workbench/taskRunner.opencode.test.js +130 -130
  70. package/src/ui/server/routes/workbench/taskRunner.pi.test.js +298 -298
  71. package/src/ui/public/assets/AgentView-Du9akUeZ.js +0 -12
  72. package/src/ui/public/assets/ChatSilenceBadge-BBoFeSqe.js +0 -21
  73. package/src/ui/public/assets/EditorAgentPanel-BMUphuG0.css +0 -1
  74. package/src/ui/public/assets/EditorAgentPanel-KiHbQPJP.js +0 -34
  75. package/src/ui/public/assets/EditorView-B18B4yNJ.js +0 -13
  76. package/src/ui/public/assets/MindmapView-BDI3D_1h.css +0 -1
  77. package/src/ui/public/assets/MindmapView-aJ9TTijE.js +0 -4
  78. package/src/ui/public/assets/RecentDirectoriesChat-DBGoUlkn.css +0 -1
  79. package/src/ui/public/assets/RecentDirectoriesChat-wfkSF6NU.js +0 -3
  80. package/src/ui/public/assets/RemoteManagerDialog-BBwNlK9J.js +0 -4
  81. package/src/ui/public/assets/WorkbenchView-CVqXb__l.css +0 -1
  82. package/src/ui/public/assets/WorkbenchView-CijzpDWN.js +0 -360
  83. package/src/ui/public/assets/_plugin-vue_export-helper-BhdsvhKo.js +0 -19
  84. package/src/ui/public/assets/agentConversations-DaAtF1v4.js +0 -10
  85. package/src/ui/public/assets/configStore-Drlw8KtR.js +0 -1
  86. package/src/ui/public/assets/index-DSQ6mp_N.css +0 -1
  87. package/src/ui/public/assets/toolsStore-CnX34C96.js +0 -1
  88. package/src/ui/public/assets/useOrchestrator-BXmxJsRl.js +0 -1
@@ -19,18 +19,20 @@
19
19
  // gai ── 内置。**服务端**跑循环:LLM 流式 + 服务端执行工具(src/cli/ai/tools.js),
20
20
  // 前端只渲染事件。默认引擎,历史行为。
21
21
  //
22
- // claude / opencode / codex / codebuddy / pi ── 外部 CLI。**CLI 自己**跑循环:它有自己的工具集、
22
+ // claude / opencode / codex / codebuddy / pi / codearts ── 外部 CLI。**CLI 自己**跑循环:它有自己的工具集、
23
23
  // 自己的系统提示词、自己的权限模型。服务端退化成一根管子 —— spawn 出来、
24
24
  // 把它的 NDJSON 翻译成同一组 SSE 事件。见 runExternalTurn.js。
25
25
  // (codebuddy = 腾讯 CodeBuddy Code CLI,即 WorkBuddy 桌面版的引擎,
26
26
  // 2026-10-12 加入;协议与 claude 的 stream-json 对齐。
27
27
  // pi = earendil-works 开源终端编程 Agent,2026-10-13 加入;
28
- // 自有 JSONL 协议,无权限系统,详见 taskRunner.js 的 pi 段。)
28
+ // 自有 JSONL 协议,无权限系统,详见 taskRunner.js 的 pi 段。
29
+ // codearts = 华为云码道 CLI,2026-10-25 加入;是 opencode 的 fork,
30
+ // 事件流同构,handler 直接转调 opencode 那套。)
29
31
  //
30
- // ⚠️ 这儿**不新写一份 id 清单**:外部五家直接复用 config.js 的 TASK_EXECUTORS。
32
+ // ⚠️ 这儿**不新写一份 id 清单**:外部六家直接复用 config.js 的 TASK_EXECUTORS。
31
33
  // 本仓库为"同一份口径在多个地方各写一遍"吃过亏(见 agentParity.test.js 的注释:
32
34
  // 提示词四处、路径归一三处,分叉的失效方式是「不报错,两个入口表现不一样」)。
33
- // 工作台那份是任务执行器,这里是对话引擎,但**底层是同一批 CLI**,加第五家时
35
+ // 工作台那份是任务执行器,这里是对话引擎,但**底层是同一批 CLI**,加第六家时
34
36
  // 应当只改 config.js 一处(taskRunner.js 的运行时分发表是第二处,见那里的注释)。
35
37
  // 有单测钉住这条。
36
38
 
@@ -56,6 +58,7 @@ export const ENGINE_LABELS = {
56
58
  codex: 'Codex',
57
59
  codebuddy: 'CodeBuddy Code',
58
60
  pi: 'Pi Agent',
61
+ codearts: 'CodeArts 码道',
59
62
  };
60
63
 
61
64
  export function isAgentEngine(value) {
@@ -445,28 +445,44 @@ function detectPi(json, sessionState) {
445
445
  return sessionState;
446
446
  }
447
447
 
448
+ function detectCodeArts(json) {
449
+ // 与 opencode 同一条判定:它是 opencode 的 fork,配置 schema 都写着 opencode.ai/config.json。
450
+ // 顶层 `model` 可以是 "provider/model" 字符串,也可以是 { model, variant } 对象。
451
+ const raw = json && json.model;
452
+ if (typeof raw === 'string' && raw.trim()) {
453
+ return { model: raw.trim(), display: null, provider: null, source: 'config' };
454
+ }
455
+ if (raw && typeof raw === 'object' && typeof raw.model === 'string' && raw.model.trim()) {
456
+ const variant = typeof raw.variant === 'string' && raw.variant.trim() ? ` (${raw.variant.trim()})` : '';
457
+ return { model: raw.model.trim() + variant, display: null, provider: null, source: 'config' };
458
+ }
459
+ return null;
460
+ }
461
+
448
462
  function escapeRe(s) {
449
463
  return String(s).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
450
464
  }
451
465
 
452
466
  /**
453
- * 探测五个执行器当前在用的模型。
467
+ * 探测六个执行器当前在用的模型。
454
468
  *
455
469
  * @param {object} [opts]
456
470
  * @param {string} [opts.homeDir] 测试沙箱用(默认 os.homedir())
457
- * @returns {Promise<{ claude: object|null, codex: object|null, opencode: object|null, codebuddy: object|null, pi: object|null }>}
471
+ * @returns {Promise<{ claude: object|null, codex: object|null, opencode: object|null, codebuddy: object|null, pi: object|null, codearts: object|null }>}
458
472
  * 每项 `{ model, display, provider, source }`;该执行器没配模型时为 null。
459
473
  * source = 'config'(配置文件里写死的)| 'state'(CLI 自己记的"上次用的")。
460
474
  *
461
- * 八路并发、互不阻塞:任何一个文件读失败都只让**它自己**变成 null。
475
+ * 多路并发、互不阻塞:任何一个文件读失败都只让**它自己**变成 null。
462
476
  * 两处来源的执行器(opencode / pi)都是 config 优先、state 兜底,
463
477
  * 由 detectOpencode / detectPi 各自收口。
464
478
  */
465
479
  export async function detectExecutorModels({ homeDir } = {}) {
466
480
  const home = homeDir || os.homedir();
467
481
  const piDir = piAgentDir(home);
482
+ // 码道的 OPENCODE_CONFIG / OPENCODE_CONFIG_FILE(见 taskRunner.buildCodeArtsEnv)
483
+ const codeArtsDir = path.join(home, '.codeartsdoer');
468
484
 
469
- const [claudeRaw, codexRaw, opencodeJsonRaw, opencodeJsoncRaw, opencodeStateRaw, codebuddyRaw, piRaw, piState] = await Promise.all([
485
+ const [claudeRaw, codexRaw, opencodeJsonRaw, opencodeJsoncRaw, opencodeStateRaw, codebuddyRaw, piRaw, piState, codeArtsJsonRaw, codeArtsJsoncRaw] = await Promise.all([
470
486
  readTextOrNull(path.join(home, '.claude', 'settings.json')),
471
487
  readTextOrNull(path.join(home, '.codex', 'config.toml')),
472
488
  // .json 优先(标准名),.jsonc 兜底。opencode 两个都认。
@@ -480,6 +496,9 @@ export async function detectExecutorModels({ homeDir } = {}) {
480
496
  readTextOrNull(path.join(piDir, 'settings.json')),
481
497
  // Pi 的"最近使用"(defaultModel 只在显式「设为默认」时才写,见 detectPiSessionState)
482
498
  detectPiSessionState(piDir),
499
+ // 码道 CLI:文件名由 codearts.cmd 的 OPENCODE_CONFIG_FILE 指定(json 优先、jsonc 兜底)
500
+ readTextOrNull(path.join(codeArtsDir, 'codearts_cli.json')),
501
+ readTextOrNull(path.join(codeArtsDir, 'codearts_cli.jsonc')),
483
502
  ]);
484
503
 
485
504
  const pickJson = (raw) => {
@@ -494,6 +513,7 @@ export async function detectExecutorModels({ homeDir } = {}) {
494
513
  const opencodeState = pickJson(opencodeStateRaw);
495
514
  const codebuddyCfg = pickJson(codebuddyRaw);
496
515
  const piCfg = pickJson(piRaw);
516
+ const codeArtsCfg = pickJson(codeArtsJsonRaw) || pickJson(codeArtsJsoncRaw);
497
517
 
498
518
  return {
499
519
  claude: claudeCfg && typeof claudeCfg.env === 'object' && claudeCfg.env
@@ -503,6 +523,7 @@ export async function detectExecutorModels({ homeDir } = {}) {
503
523
  opencode: detectOpencode(opencodeCfg, opencodeState),
504
524
  codebuddy: detectCodebuddy(codebuddyCfg),
505
525
  pi: detectPi(piCfg, piState),
526
+ codearts: detectCodeArts(codeArtsCfg),
506
527
  };
507
528
  }
508
529