zen-gitsync 2.18.11 → 2.18.13

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 (94) hide show
  1. package/README.md +14 -14
  2. package/package.json +6 -1
  3. package/src/cli/ai/agent.js +1385 -1385
  4. package/src/cli/ai/context.js +431 -431
  5. package/src/cli/ai/context.test.js +376 -376
  6. package/src/cli/ai/turn.js +190 -190
  7. package/src/ui/public/assets/AgentView-CuEM6xzC.js +11 -0
  8. package/src/ui/public/assets/{AgentView-CbBLjlfr.css → AgentView-D6MJOrJt.css} +1 -1
  9. package/src/ui/public/assets/AppVersionBadge-BK1Fiv3b.js +2 -0
  10. package/src/ui/public/assets/BranchSelector-avxY_m05.js +1 -0
  11. package/src/ui/public/assets/CommitForm-hThTnoNt.js +14 -0
  12. package/src/ui/public/assets/CommonDialog-zaBdFGFH.js +1 -0
  13. package/src/ui/public/assets/CopySessionButton-CAxaqLQL.js +21 -0
  14. package/src/ui/public/assets/EditorView-B7Rq9QV1.css +1 -0
  15. package/src/ui/public/assets/EditorView-iSA2SXJR.js +37 -0
  16. package/src/ui/public/assets/{FlowExecutionViewer-D7FaZSHd.js → FlowExecutionViewer-C5ylYV2C.js} +1 -1
  17. package/src/ui/public/assets/FlowOrchestrationWorkspace-CiQ07ZQv.js +21 -0
  18. package/src/ui/public/assets/LogList-Sjb8vmvq.js +7 -0
  19. package/src/ui/public/assets/MindmapView-B5rChFMP.js +2 -0
  20. package/src/ui/public/assets/MonitorView-Dcc-i2Fo.js +3 -0
  21. package/src/ui/public/assets/ProjectStartupButton-fz6eLCZU.js +1 -0
  22. package/src/ui/public/assets/RecentDirectoriesChat-BDnNp9jh.js +3 -0
  23. package/src/ui/public/assets/RemoteManagerDialog-NA1jRC7O.js +4 -0
  24. package/src/ui/public/assets/RemoteRepoCard-CKm4KqHs.js +7 -0
  25. package/src/ui/public/assets/SourceMapView-Drfato_u.js +3 -0
  26. package/src/ui/public/assets/SvgIcon-DR_79iBR.js +1 -0
  27. package/src/ui/public/assets/UserInputNode-DroKvDOa.js +1 -0
  28. package/src/ui/public/assets/WorkbenchView-CW7OACCU.js +326 -0
  29. package/src/ui/public/assets/WorkbenchView-C_u6BptZ.css +1 -0
  30. package/src/ui/public/assets/_plugin-vue_export-helper-bQQyMRS6.js +19 -0
  31. package/src/ui/public/assets/agentConversations-wYAksLq1.js +10 -0
  32. package/src/ui/public/assets/{configStore-Z6Z8hVMO.js → configStore-BeHB-gV4.js} +1 -1
  33. package/src/ui/public/assets/{css.worker-BDCmgL4U.js → css.worker-DFdt6_zu.js} +9 -9
  34. package/src/ui/public/assets/{dagre-CiGYsZhd.js → dagre-CXi8gaG9.js} +4 -4
  35. package/src/ui/public/assets/editor.worker-O-CH8JUO.js +26 -0
  36. package/src/ui/public/assets/{element-plus-D-6gla1z.css → element-plus-DJ3ZQa98.css} +1 -1
  37. package/src/ui/public/assets/element-plus-DgSY_Wt4.js +48 -0
  38. package/src/ui/public/assets/{flow-mindmap-C-X_QPQI.js → flow-mindmap-BsTRkgat.js} +56 -56
  39. package/src/ui/public/assets/{html.worker-DG8hnSJR.js → html.worker-JUzsMP-j.js} +8 -8
  40. package/src/ui/public/assets/index-BRQstBzy.js +211 -0
  41. package/src/ui/public/assets/json.worker-B4dEhy0e.js +58 -0
  42. package/src/ui/public/assets/{monaco-CbN14ZVi.js → monaco-CnWeufxc.js} +6 -6
  43. package/src/ui/public/assets/{office-docx-8MF5-THx.js → office-docx-EUfAIM4w.js} +6 -6
  44. package/src/ui/public/assets/{office-excel-BTzQyK6y.js → office-excel-BZW0bXQo.js} +1 -1
  45. package/src/ui/public/assets/{office-pptx-DhxvWA0D.js → office-pptx-CBvDNZ4m.js} +3 -3
  46. package/src/ui/public/assets/{ts.worker-DgFMIcEs.js → ts.worker-CmEKzkmF.js} +49 -49
  47. package/src/ui/public/assets/useOrchestrator-Bhl7DGKW.js +1 -0
  48. package/src/ui/public/assets/{vendor-Bd8DyOF9.css → vendor-CSFGMcMB.css} +1 -1
  49. package/src/ui/public/assets/{vendor-Cd7TGb0b.js → vendor-CZlKgriV.js} +43 -43
  50. package/src/ui/public/assets/vue-flow-DawpR_uk.js +39 -0
  51. package/src/ui/public/index.html +13 -13
  52. package/src/ui/server/routes/config.js +1348 -1348
  53. package/src/ui/server/routes/fileOpen.js +85 -16
  54. package/src/ui/server/routes/workbench/agentChat.js +752 -752
  55. package/src/ui/server/routes/workbench/agentChatShared.test.js +496 -497
  56. package/src/ui/server/routes/workbench/agentRoutes.js +13 -1
  57. package/src/ui/server/routes/workbench/agentRoutes.test.js +75 -0
  58. package/src/ui/server/routes/workbench/dispatchInstruction.js +6 -7
  59. package/src/ui/server/routes/workbench/dispatchInstruction.test.js +3 -19
  60. package/src/ui/server/routes/workbench/index.js +8 -17
  61. package/src/ui/server/routes/workbench/orchestratorPrompt.test.js +2 -2
  62. package/src/ui/server/routes/workbench/orchestratorStore.js +2 -16
  63. package/src/ui/server/routes/workbench/projectRegistry.test.js +1 -5
  64. package/src/ui/server/routes/workbench/scheduleRoutes.js +2 -2
  65. package/src/ui/server/routes/workbench/shared.js +18 -1
  66. package/src/ui/public/assets/AgentView-D3I3D3YR.js +0 -11
  67. package/src/ui/public/assets/AppVersionBadge-CrDf0lYs.js +0 -2
  68. package/src/ui/public/assets/BranchSelector-DEHLVln4.js +0 -1
  69. package/src/ui/public/assets/CommitForm-D2rVFZf2.js +0 -14
  70. package/src/ui/public/assets/CommonDialog-CV7T8OCb.js +0 -1
  71. package/src/ui/public/assets/CopySessionButton-BbVtrOa7.js +0 -21
  72. package/src/ui/public/assets/EditorView-BiNRO222.css +0 -1
  73. package/src/ui/public/assets/EditorView-CiW0kkpS.js +0 -37
  74. package/src/ui/public/assets/FlowOrchestrationWorkspace-BR3cPhyU.js +0 -21
  75. package/src/ui/public/assets/LogList-D_Q3pyMF.js +0 -7
  76. package/src/ui/public/assets/MindmapView-A4QZ6_c3.js +0 -2
  77. package/src/ui/public/assets/MonitorView-BljWw76B.js +0 -3
  78. package/src/ui/public/assets/ProjectStartupButton-Be5DovFL.js +0 -1
  79. package/src/ui/public/assets/RecentDirectoriesChat-DN7ruCU7.js +0 -3
  80. package/src/ui/public/assets/RemoteManagerDialog-BSCNy4RC.js +0 -4
  81. package/src/ui/public/assets/RemoteRepoCard-CeCRQp9p.js +0 -7
  82. package/src/ui/public/assets/SourceMapView-B_S-vspy.js +0 -3
  83. package/src/ui/public/assets/SvgIcon-9IbiSszR.js +0 -1
  84. package/src/ui/public/assets/UserInputNode-DASGnUCl.js +0 -1
  85. package/src/ui/public/assets/WorkbenchView-B3v-0vWa.js +0 -305
  86. package/src/ui/public/assets/WorkbenchView-DO2ndsES.css +0 -1
  87. package/src/ui/public/assets/_plugin-vue_export-helper-zp6tdw8N.js +0 -19
  88. package/src/ui/public/assets/agentConversations-Cplq42kA.js +0 -10
  89. package/src/ui/public/assets/editor.worker-GCPm6rMv.js +0 -26
  90. package/src/ui/public/assets/element-plus-CJqN49tX.js +0 -48
  91. package/src/ui/public/assets/index-C90dYckz.js +0 -211
  92. package/src/ui/public/assets/json.worker-CxwlJRnL.js +0 -58
  93. package/src/ui/public/assets/useOrchestrator-C3wjJ7p4.js +0 -1
  94. package/src/ui/public/assets/vue-flow-x4TlHHzT.js +0 -39
@@ -523,18 +523,52 @@ async function launchOpenCode(dirPath, { permissionMode } = {}) {
523
523
  }
524
524
 
525
525
  /**
526
- * 用 CodeBuddy Code 打开目录(交互 TUI,2026-10-12 随执行器接入一起补)。
526
+ * codebuddy 的权限档位(`--permission-mode`,用 CLI 自己的档位名当 token)。
527
+ *
528
+ * 档位名与 claude **逐字相同**(acceptEdits / bypassPermissions),所以直接沿用
529
+ * claude 那套 token,不必再造一份 —— 前端两处菜单传的是同一个字符串。
527
530
  *
528
- * `--port 0` 是**必须**的:CLI 每次运行都自带一个引擎服务器,默认端口写死 62443,
529
- * 而 WorkBuddy 桌面版常驻占着它 —— 实测裸跑 `codebuddy`(交互也一样)直接
530
- * EADDRINUSE 退出。0 = 让 OS 选空闲端口,与 headless 执行器
531
+ * 'bypassPermissions' → `--permission-mode bypassPermissions`
532
+ * 官方档位说明原文 "Skips all permission prompts",这就是它的**完全批准**档。
533
+ * 实测(2026-10-14,本机 CLI)`codebuddy -p --output-format stream-json
534
+ * --permission-mode bypassPermissions` 的 init 事件回传
535
+ * `permissionMode: "bypassPermissions"` —— 档位真的生效,不是被静默忽略。
536
+ * `-y / --dangerously-skip-permissions` 是同一档的别名(headless 执行器走的就是
537
+ * -y,init 同样回传 bypassPermissions),这里用 `--permission-mode` 是因为它
538
+ * 是 TUI 也认的正式写法(help: "Default permission mode for this process
539
+ * (TUI, --serve Web, ACP)"),且与 claude 的启动参数形状一致。
540
+ * 'acceptEdits' → `--permission-mode acceptEdits`(自动批准文件编辑,中间档)
541
+ * 其余一切(undefined / 未知串 / 非字符串)→ 一个 flag 都不带,跟随 CLI 自己的配置
542
+ *
543
+ * 白名单式:只有表里这两个 token 能变成参数,不存在拼参数注入的面。
544
+ * 回归 `test/open-with-permission.test.mjs`。
545
+ */
546
+ const CODEBUDDY_MODE_FLAGS = new Map([
547
+ ['acceptEdits', ['--permission-mode', 'acceptEdits']],
548
+ ['bypassPermissions', ['--permission-mode', 'bypassPermissions']],
549
+ ]);
550
+
551
+ /**
552
+ * codebuddy 的启动参数(按权限档位)。
553
+ *
554
+ * `--port 0` 是**必须**的(与档位无关,恒定带上):CLI 每次运行都自带一个引擎服务器,
555
+ * 默认端口写死 62443,而 WorkBuddy 桌面版常驻占着它 —— 实测裸跑 `codebuddy`
556
+ * (交互也一样)直接 EADDRINUSE 退出。0 = 让 OS 选空闲端口,与 headless 执行器
531
557
  * (taskRunner.launchCodebuddyPrint)同一个口径。
558
+ */
559
+ export function buildCodebuddyArgs(permissionMode) {
560
+ return ['--port', '0', ...(CODEBUDDY_MODE_FLAGS.get(permissionMode) || [])];
561
+ }
562
+
563
+ /**
564
+ * 用 CodeBuddy Code 打开目录(交互 TUI,2026-10-12 随执行器接入一起补)。
565
+ * 权限档位见 buildCodebuddyArgs。
532
566
  *
533
- * 登录态同样来自 ~/.codebuddy:没登录过的话 TUI 里会提示 /login 扫码。
567
+ * 登录态来自 ~/.codebuddy:没登录过的话 TUI 里会提示 /login 扫码。
534
568
  */
535
- async function launchCodebuddy(dirPath) {
569
+ async function launchCodebuddy(dirPath, { permissionMode } = {}) {
536
570
  // CodeBuddy Code CLI - https://www.codebuddy.cn/docs/cli
537
- const cliArgs = ['--port', '0'];
571
+ const cliArgs = buildCodebuddyArgs(permissionMode);
538
572
  if (process.platform === 'win32') {
539
573
  return spawnDetached('cmd.exe', ['/c', 'start', '""', 'codebuddy', ...cliArgs], {
540
574
  cwd: dirPath
@@ -592,13 +626,42 @@ export async function launchGai(dirPath, {
592
626
  });
593
627
  }
594
628
 
595
- async function launchKimiCode(dirPath) {
629
+ /**
630
+ * kimi 的权限档位。
631
+ *
632
+ * 'auto' | 'bypassPermissions' → `--auto`
633
+ * 官方 help 原文 "Start in Never Ask mode: never interrupts you; everything runs
634
+ * and is decided automatically" —— 这才是它的**完全批准**档。
635
+ * `bypassPermissions` 只是让调用方与 claude / codex / opencode 那档共用同一个
636
+ * 字符串,不是另一种行为。
637
+ * 其余一切(undefined / 未知串 / 非字符串)→ 一个 flag 都不带(默认档:该问的照问)
638
+ *
639
+ * ⚠️ 这个 `--auto` 与 opencode 的 `--auto` **同名但语义不同**:opencode 是"自动批准
640
+ * 未被显式拒绝的权限"(配置里 deny 的仍拦),kimi 是"从不打断"。档位 token 各按各家
641
+ * CLI 的叫法走,别硬凑一个公共词(同 codex 那段的取舍)。
642
+ * ⚠️ kimi 还有一个中间档 `-y / --yolo`(Ask When Needed:常规编辑与命令自动放行,
643
+ * 危险动作 / 提问 / 计划仍会问),菜单暂未暴露 —— 要加时在 KIMI_MODE_FLAGS 补一行。
644
+ *
645
+ * 白名单式:只有表里这两个 token 能变成参数。
646
+ * 回归 `test/open-with-permission.test.mjs`。
647
+ */
648
+ const KIMI_MODE_FLAGS = new Map([
649
+ ['auto', ['--auto']],
650
+ ['bypassPermissions', ['--auto']],
651
+ ]);
652
+
653
+ export function buildKimiArgs(permissionMode) {
654
+ return [...(KIMI_MODE_FLAGS.get(permissionMode) || [])];
655
+ }
656
+
657
+ async function launchKimiCode(dirPath, { permissionMode } = {}) {
658
+ const cliArgs = buildKimiArgs(permissionMode);
596
659
  if (process.platform === 'win32') {
597
660
  const executable = await findKimiExecutable();
598
661
  if (!executable) throw new Error('未检测到 Kimi Code,请先安装 kimi CLI');
599
- return spawnDetached('cmd.exe', ['/c', 'start', '""', executable], { cwd: dirPath });
662
+ return spawnDetached('cmd.exe', ['/c', 'start', '""', executable, ...cliArgs], { cwd: dirPath });
600
663
  }
601
- return launchInTerminal(dirPath, 'kimi');
664
+ return launchInTerminal(dirPath, 'kimi', cliArgs);
602
665
  }
603
666
 
604
667
  async function launchDsh(dirPath) {
@@ -1126,7 +1189,7 @@ export function registerFileOpenRoutes({
1126
1189
  // 用 CodeBuddy Code 打开目录
1127
1190
  app.post('/api/open-directory-with-codebuddy', asyncRoute(async (req, res) => {
1128
1191
  try {
1129
- const { path: dirPath } = req.body || {};
1192
+ const { path: dirPath, permissionMode } = req.body || {};
1130
1193
  if (!dirPath) {
1131
1194
  throw new HttpError(400, '目录路径不能为空');
1132
1195
  }
@@ -1138,8 +1201,11 @@ export function registerFileOpenRoutes({
1138
1201
  }
1139
1202
 
1140
1203
  try {
1141
- await launchCodebuddy(dirPath);
1142
- res.json({ success: true, message: '已用 CodeBuddy Code 打开目录' });
1204
+ await launchCodebuddy(dirPath, { permissionMode });
1205
+ const message = CODEBUDDY_MODE_FLAGS.has(permissionMode)
1206
+ ? `已用 CodeBuddy Code 打开目录(permission-mode=${permissionMode})`
1207
+ : '已用 CodeBuddy Code 打开目录';
1208
+ res.json({ success: true, message });
1143
1209
  } catch (error) {
1144
1210
  res.status(400).json({
1145
1211
  success: false,
@@ -1181,12 +1247,15 @@ export function registerFileOpenRoutes({
1181
1247
 
1182
1248
  // 用 Kimi Code 打开目录
1183
1249
  app.post('/api/open-directory-with-kimi', asyncRoute(async (req, res) => {
1184
- const { path: dirPath } = req.body || {};
1250
+ const { path: dirPath, permissionMode } = req.body || {};
1185
1251
  if (!dirPath) throw new HttpError(400, '目录路径不能为空');
1186
1252
  try {
1187
1253
  await fs.access(dirPath);
1188
- await launchKimiCode(dirPath);
1189
- res.json({ success: true, message: '已用 Kimi Code 打开目录' });
1254
+ await launchKimiCode(dirPath, { permissionMode });
1255
+ const message = KIMI_MODE_FLAGS.has(permissionMode)
1256
+ ? '已用 Kimi Code 打开目录(--auto:从不打断)'
1257
+ : '已用 Kimi Code 打开目录';
1258
+ res.json({ success: true, message });
1190
1259
  } catch (error) {
1191
1260
  res.status(400).json({ success: false, error: error.message || '未检测到 Kimi Code,请先安装 kimi CLI' });
1192
1261
  }