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
package/README.md CHANGED
@@ -198,7 +198,7 @@ In either mode, click **AI Generate** to fill in the fields automatically based
198
198
 
199
199
  > Click the directory name in the header (or the folder icon) to open this dialog. Type a path, hit **浏览** to use the OS file picker, or pick from **常用目录** for one-click switching. **使用新标签打开** spawns a new GUI tab on that path so you can keep the current project open.
200
200
 
201
- The header row beside the directory name carries its own quick actions: open in the file manager, open in a terminal, copy the folder name (last path segment only), open with `g ai`, and one button per detected editor / AI tool — VS Code, Codex, OpenCode, Kimi Code, ZCode, DeepSeek Harness and Claude Code (right-click the Claude button for the default / fully-approved menu, or right-click any tool button to update it to the latest version). Tools that are not installed are collected into a **more** menu, where clicking one opens the install guide.
201
+ The header row beside the directory name carries its own quick actions: open in the file manager, open in a terminal, copy the folder name (last path segment only), open with `g ai`, and one button per detected editor / AI tool — VS Code, Codex, OpenCode, CodeBuddy Code, Pi Agent, Kimi Code, ZCode, DeepSeek Harness and Claude Code. Right-clicking a tool button opens its menu: the tools whose CLI can skip approval prompts (Claude Code, Codex, OpenCode, CodeBuddy Code, Kimi Code) list their permission tiers there — default plus that CLI's own fully-approved switch, each row naming the flag it passes — above **update to the latest version**. Tools that are not installed are collected into a **more** menu, where clicking one opens the install guide.
202
202
 
203
203
  When the GUI is opened on a directory that is not a Git repository, the right pane shows the **Recent projects** list instead — every recent directory with its Git badges (behind / ahead / uncommitted) and one-click "open in a new tab". Each page load runs a `git fetch` pass over all of them automatically, so the ahead/behind badges show the real state rather than the snapshot from the last fetch; the **刷新全部** button does the same thing on demand. The switcher dialog shows the same list as **常用目录** and carries the very same **刷新全部** button at the right end of its heading — the automatic pass stays panel-only (opening a dialog should not fetch a dozen repositories behind your back), but the manual one is identical in both places, right down to the progress readout. Both places also have a search box above the cards: type any fragment of a path to filter the list (the AI status summary below keeps describing the whole set, not the filtered view).
204
204
 
@@ -397,15 +397,15 @@ A dedicated view for running coding agents across one or many projects. Every ta
397
397
  | Task list | Create, edit, delete tasks. Rows are grouped by project (current project first), each a single line — the title, or the first characters of the description (ellipsised) when the title is empty. Tasks with neither a title nor a description count as drafts that are never saved (switching away drops them) |
398
398
  | Multi-project board | Three resizable / collapsible panes: the project list with its run monitor, the kanban board, and the master-agent console. Drag a divider to resize (project list 180–420 px, console 260–560 px), double-click it to reset the responsive default, or fold a side away — the top-bar button folds the project list, the console folds into a 32 px rail that expands on click. The run monitor has its own divider (120 px up to half the viewport height) for when several jobs run at once. All widths / heights are remembered across sessions. Below 860 px the panes stack vertically with the console **above** the board — a stacked board runs to five figures of pixels, so a console placed after it would be out of reach — and the progress report is shown in full instead of clamped to six lines |
399
399
  | Kanban board | **Todo / Doing / Done** columns with the done column sorted newest-first; a filter checkbox narrows the board to tasks whose last run failed, and a table view is one click away for a denser listing. A **New task** entry sits at the end of the Todo column whether or not that column already holds cards (it doubles as the empty state, and opens the same create dialog as the top-right button). Task attachments of the image kind get a **cover** across the top of the card — the first one, with a `+N` badge when there are more — and clicking it opens the full-size viewer with arrow-key paging through the whole set (clicking it does *not* open the task: the card is one big click target, so the cover opts out). An attachment whose file has gone missing drops the cover instead of leaving a broken-image icon on the board; the table view marks the same fact with an `N image(s)` chip next to the title so the two views never disagree |
400
- | Card status while running | A running task is more than a blinking dot: the card itself carries its executor's brand icon (hover for the product name), the elapsed time, how many tool calls it has made (hover for the mix of types), its most recent tool call, what it is thinking right now, and its newest reply — plus a silence figure once the job has gone quiet for a while. A row with nothing in it is left out instead of being filled with "none yet", and a card that is not running has no such block at all. The facts come from the execution log, the same source the progress report reads, so they refresh with the board's 5-second poll and a task running in another `g ui` instance shows up here too; in table view the same summary sits under the task name. Hovering the card also reveals a **Stop** button in the very slot an idle card puts **Run** in (a running card does not show both — there is no second run to start), so killing a stuck run no longer means opening the editor and scrolling down to it; it goes through the same endpoint and the very same confirmation text as the editor's stop, and a job running inside another `g ui` instance cannot be stopped from this window — the server says exactly that instead of a flat "stop failed" |
401
- | Master-agent console | Give the master agent an instruction and it dispatches a new task, deciding the target project itself (or honouring the project you selected). Enter dispatches, Shift+Enter starts a new line. Dispatching can be paused and resumed — while paused, a dispatch creates the task without running it |
400
+ | Card status while running | A running task is more than a blinking dot: the card itself carries its executor's brand icon (hover for the product name), the elapsed time, how many tool calls it has made (hover for the mix of types), its most recent tool call, what it is thinking right now, and its newest reply — plus a silence figure once the job has gone quiet for a while. Above those lines sits the task's own **progress bar** with the master agent's estimate labelled **AI estimate** (hover explains where the number comes from); it is drawn only when a recent report covers *this* run — the model gave no number, gave a nonsense one, or the report only covers a previous run of the same task, and the bar stays away rather than showing 0%. A row with nothing in it is left out instead of being filled with "none yet", and a card that is not running has no such block at all. The facts come from the execution log, the same source the progress report reads, so they refresh with the board's 5-second poll and a task running in another `g ui` instance shows up here too; in table view the same summary sits under the task name (with the estimate as plain text). Hovering the card also reveals a **Stop** button in the very slot an idle card puts **Run** in (a running card does not show both — there is no second run to start), so killing a stuck run no longer means opening the editor and scrolling down to it; it goes through the same endpoint and the very same confirmation text as the editor's stop, and a job running inside another `g ui` instance cannot be stopped from this window — the server says exactly that instead of a flat "stop failed" |
401
+ | Master-agent console | Give the master agent an instruction and it dispatches a new task, deciding the target project itself (or honouring the project you selected). Enter dispatches, Shift+Enter starts a new line |
402
402
  | Card after a run | A card in Done no longer stops at its title and timestamp: it keeps a short excerpt of the last thing the agent said — the tail of the newest run's reply, flattened to one line and capped at 100 characters. This is the case it was built for: a run often ends by asking you something ("shall I push?"), so a task sitting in Done may still be waiting on your answer, and the only way to find out used to be opening the editor and reading the log. The executor's brand icon sits at the head of that excerpt — the line is what **it** said, so the icon that says which CLI said it belongs there rather than somewhere else on the card. A task that is still running keeps showing the live block instead (the two are mutually exclusive), a run that wrote no body text leaves this line out entirely rather than borrowing an earlier run's words, and the full excerpt is in the hover tooltip; the table view carries the same line under the task name. Executor icons are drawn only when the executor is actually known — a run recorded before the `agent` field existed, or one whose value this build does not recognise, gets no icon rather than a guessed brand (in the table view, icons appear on the status line for a running task and on the last-reply line for a finished one) |
403
- | Progress report | The console's **Instruction** pane reports where your running tasks actually stand instead of listing what was dispatched and what finished (the board already shows that). The master agent reads each running job — elapsed time, **its latest thinking**, **what mix of tools it has been calling**, **how long it has been silent**, and the latest output — and writes a short paragraph per report: what each task is doing, how far it has got, and whether it looks stuck. Each report also carries a **progress bar**: the model is asked for its own estimate of overall progress plus one figure per task, and those numbers are drawn as bars labelled **AI estimate** (hover says what the guess is based on). It is an estimate, not a measurement — and when the model declines to give a number, the bar is simply not drawn instead of defaulting to 0%. The thinking line is what makes this work for tasks that never write a line of prose (they are the common case — their output stays empty from start to finish); "looks stuck" now has to come with evidence — a silence figure, or a tool mix going in circles — instead of being inferred from a high call count. Reports appear on an interval you pick (5 / 10 / 15 / 30 / 60 minutes, or off) or whenever you hit **Report now**, and the newest one is shown with the facts behind it (project, elapsed, tool mix, latest thinking, last tool call, silence) while earlier ones stay browsable from the history list. **A report only stays in the main slot while the tasks it covers are still running** — a report is a snapshot of the moment it was generated, so once those tasks finish the card's "{n} running" line becomes a lie, while the counter right above it already reads 0 running. When they do, the slot stops showing it and states what is actually true instead: "No task is running right now" once everything has finished, or "No progress report for the running tasks yet" when a new batch has started but nothing covers it yet; to read an older one, open it from the history list — it comes back tagged **Finished** Automatic reports are generated **server-side**, so the history keeps filling up while the tab is closed and is waiting for you when you come back. Nothing running means nothing filed: automatic reports are skipped outright, and **Report now** answers with a plain "no task is running right now" rather than filing an empty entry (no empty entries, no wasted model call), while two identical reports arriving seconds apart are collapsed into one so a double click leaves no duplicate. The paragraph is written in the UI language and, when a task's output is inconclusive, it says so rather than inventing progress. **History and Project overview fold down to a single line by default** — the report count, and branch plus working-tree state, stay on that line — and open again on click, with your choice remembered. Both are fixed-height blocks, so on a short screen they squeeze the report card into a slit (about a dozen pixels at 1366×768); folded away, the report's window roughly doubles |
403
+ | Progress report | The console's **Instruction** pane reports where your running tasks actually stand instead of listing what was dispatched and what finished (the board already shows that). The master agent reads each running job — elapsed time, **its latest thinking**, **what mix of tools it has been calling**, **how long it has been silent**, and the latest output — and writes a short paragraph per report: what each task is doing, how far it has got, and whether it looks stuck. Each report also carries a **progress bar**: the model is asked for its own estimate of overall progress plus one figure per task, and those numbers are drawn as bars labelled **AI estimate** (hover says what the guess is based on). It is an estimate, not a measurement — and when the model declines to give a number, the bar is simply not drawn instead of defaulting to 0%. The thinking line is what makes this work for tasks that never write a line of prose (they are the common case — their output stays empty from start to finish); "looks stuck" now has to come with evidence — a silence figure, or a tool mix going in circles — instead of being inferred from a high call count. Reports appear on an interval you pick (5 / 10 / 15 / 30 / 60 minutes, or off) or whenever you hit **Report now**, and the pane shows the newest report's own text plus its overall estimate — the per-task facts behind it (project, elapsed, tool mix, latest thinking, last tool call, silence) live on the board's **In progress** cards instead, where they are read in the same glance as the task itself, while earlier reports stay browsable from the history list. **A report only stays in the main slot while the tasks it covers are still running** — a report is a snapshot of the moment it was generated, so once those tasks finish the card's "{n} running" line becomes a lie, while the counter right above it already reads 0 running. When they do, the slot stops showing it and states what is actually true instead: "No task is running right now" once everything has finished, or "No progress report for the running tasks yet" when a new batch has started but nothing covers it yet; to read an older one, open it from the history list — it comes back tagged **Finished** Automatic reports are generated **server-side**, so the history keeps filling up while the tab is closed and is waiting for you when you come back. Nothing running means nothing filed: automatic reports are skipped outright, and **Report now** answers with a plain "no task is running right now" rather than filing an empty entry (no empty entries, no wasted model call), while two identical reports arriving seconds apart are collapsed into one so a double click leaves no duplicate. The paragraph is written in the UI language and, when a task's output is inconclusive, it says so rather than inventing progress. **History and Project overview fold down to a single line by default** — the report count, and branch plus working-tree state, stay on that line — and open again on click, with your choice remembered. Both are fixed-height blocks, so on a short screen they squeeze the report card into a slit (about a dozen pixels at 1366×768); folded away, the report's window roughly doubles |
404
404
  | Silent wrap-up | When a run has been silent for more than **10 minutes** (no prose, no thinking, no tool call) the console asks the master agent to read the facts it has — latest thinking, the last thing it said, the tool mix — and decide whether it **has finished** or is still working / stuck. A "finished" verdict settles that run: the card moves from In progress to Done, with an **AI marked done** chip under the elapsed time whose tooltip carries the model's reasoning. When the evidence is thin it does nothing at all (it only books the check, waits another 10 minutes, and asks at most 3 times per run) — not acting beats marking a running task as done. It changes the record, never the process: killing a hung process stays the job of the **Stop** button on the card. Only runs owned by **this instance** are judged — a task started in another `g ui` window is settled by that window |
405
405
  | Marking a task done by hand | The columns are derived from execution facts, which cannot express the two things only you know: a task sitting in **Todo** that was really finished somewhere else, and an **In progress** task whose model has gone quiet while you can see the work is done. Both cards now hover out a **Done** button next to **Run** / **Stop**, and a card that got into Done *by hand* trades it for **Undo**. A card that finished on its own keeps showing neither — undoing a mark it never had would do nothing at all. Marking a still-running task done asks first and stops that run as part of the same action (a card cannot be Done and running at once), which holds across windows too: if the job lives in another `g ui` instance the server refuses with that very reason instead of pretending. The mark is stored on the task rather than faked as a run record, and a later run of that task supersedes it, so the card goes back to following the facts. Undo is one click with no confirmation — it is the "I clicked the wrong one" path — and hands the card back to the execution facts, which is why it is offered only where the mark is what keeps the card in Done |
406
406
  | Dispatch default prompts | Give every dispatch a standing prompt: one **global** entry that applies to all projects, plus one **per project** that is appended after it whenever you dispatch to that project (it supplements the global one rather than replacing it). Both are edited from the gear button in the console's composer; the combined text is prepended to the instruction, a "Default prompt (global + this project)" checkbox appears next to **Run now** so a single dispatch can opt out, and the instruction log records which level was attached. The prompt is copied onto the task at dispatch time, so editing the setting later never rewrites tasks that already exist; it lands in the task's own prompt field, where you can still edit it per task |
407
- | Project icon | Every project row leads with **the project's own favicon** instead of a generic folder — a 32 px tile spanning the name and branch lines, so the list reads at a glance. The same icon is used on the **recent-directories** cards in the switch-directory dialog. The server looks for the icon the project actually ships: first the `<link rel="icon">` declared in its `index.html`, then a `favicon.svg` / `.png` / `.webp` / `.ico` found within two levels of the project root (which is what finds layouts like `frontend/public/favicon.svg`). The lookup is bounded (dependency, VCS and cache folders are skipped outright; build output is searched last) and cached for five minutes, so the board's five-second poll never re-walks the disk. Projects that ship no icon — and icons that fail to load, such as a CDN URL the browser refuses — fall back to the folder glyph, so a row never shows a broken image. Nested repositories are skipped on purpose: a folder that merely *contains* your projects keeps the folder glyph instead of borrowing one of theirs |
408
- | Open-with menu per project | Hovering a project row in the board's project list reveals two buttons: **Open folder** (straight to your file manager) and **Open with**, a menu holding file manager / terminal / `g ui` in a new tab plus every editor and AI tool (VS Code, Codex, OpenCode, Kimi Code, ZCode, DeepSeek Harness, and Claude Code in default or fully-approved mode). Tools that are not installed are dimmed and labelled "Not installed" — clicking one opens the very same install guide the top bar uses. Every action applies to that row's project only; the board's selection is never touched |
407
+ | Project icon | Every project row leads with **the project's own favicon** instead of a generic folder — a 32 px tile spanning the name and branch lines, so the list reads at a glance. The same icon is used on the **recent-directories** cards in the switch-directory dialog, on the **top-bar directory pill**, and on the **board's own title line** (one lookup, one fallback — only the slot height differs per row: 32 px in the list, 24 px on the board, 20 px in the top bar). The server looks for the icon the project actually ships: first the `<link rel="icon">` declared in its `index.html`, then a `favicon.svg` / `.png` / `.webp` / `.ico` found within two levels of the project root (which is what finds layouts like `frontend/public/favicon.svg`). The lookup is bounded (dependency, VCS and cache folders are skipped outright; build output is searched last) and cached for five minutes, so the board's five-second poll never re-walks the disk. Projects that ship no icon — and icons that fail to load, such as a CDN URL the browser refuses — fall back to the folder glyph, so a row never shows a broken image. Nested repositories are skipped on purpose: a folder that merely *contains* your projects keeps the folder glyph instead of borrowing one of theirs |
408
+ | Open-with menu per project | Hovering a project row in the board's project list reveals two buttons: **Open folder** (straight to your file manager) and **Open with**, a menu holding file manager / terminal / `g ui` in a new tab plus every editor and AI tool (VS Code, Codex, OpenCode, CodeBuddy Code, Pi Agent, Kimi Code, ZCode, DeepSeek Harness). The tools whose CLI can skip approval prompts — Claude Code, Codex, OpenCode, CodeBuddy Code, Kimi Code — each add their own fully-approved entry (Codex also gets its auto-approve-but-still-sandboxed one). Tools that are not installed are dimmed and labelled "Not installed" — clicking one opens the very same install guide the top bar uses. Every action applies to that row's project only; the board's selection is never touched |
409
409
  | Remove a dead project | A row whose folder no longer exists still shows up — the list is the union of recent directories and the paths your tasks remember — so that row gets a single red **Remove from list** button instead of the open actions (opening a missing folder can only fail). The confirm dialog spells it out: **no tasks are deleted**, and the toast repeats how many were kept. The entry disappears from the list while every task, job and history record stays put; if you ever clone the folder back, the row returns on its own |
410
410
  | Task editor overlay | Clicking a board card opens the editor as an overlay: a flat sidebar holding the task list and prompt presets, then the task header, preset selector, executor split-button, the copy-execution / execution-log / clear-execution actions, and a chat-style execution body. The description collapses into a one-line "Task description (optional)" summary until clicked, showing a "Filled" badge and the attachment count once there is content. Opening the overlay lands the conversation on its **newest** turn rather than its first: the flow keeps re-pinning to the bottom while markdown highlighting and tool-call folding are still growing it after mount, and lets go as soon as you scroll yourself. The thin bar on top carries the back-to-board button, the current project, then a **task-status badge** (running / done / failed / to-do, in the same role colors as the board column headers, its dot pulsing while it runs; hover for the "AI marked done" / "marked done manually" reasoning — before this the bar showed only time and duration, so a running task could still wear last turn's "1 hour ago · took 13 min" and look finished), and — just left of the "Task execution" label at its right end — the task's **relative time and how long it took** (a "took x" line once it has run, a live "running for x" while it is, and only the time — no placeholder — if it never ran), word for word the same two values the board card shows. When the window narrows, this block and the status badge yield first (the badge is dropped entirely at roughly phone width rather than squashing the project name): the back button, project and execution-path chips never give up a single pixel |
411
411
  | Copy execution content | **Copy execution content** in the task header puts the whole task — every turn, not just whatever is on screen — on the clipboard as plain Markdown: a header line for the task and its project, then one section per turn (`## Round N`, with the executor, status and start time on the line under it) holding the user's prompt, the agent's thinking, its tool calls (arguments and results in fenced blocks) and the model's output. It is assembled from the run records rather than scraped from the DOM, so what you get never depends on what happens to be selected. The user side goes through the same trimming the chat bubbles use, so what you copy is what you typed — the injected environment / memory blocks and the attachment list stay behind in `job.prompt`. Turns with nothing in them are skipped without renumbering the ones after them, and a task that has never run answers with a "nothing to copy" toast instead of putting an empty string on the clipboard |
@@ -437,7 +437,7 @@ A dedicated view (robot icon in the activity bar) for chatting with the built-in
437
437
 
438
438
  | Feature | Description |
439
439
  |---|---|
440
- | Session list | Browse, search, rename, and delete past conversations; sessions created via `g ai` in the terminal also appear here with a **CLI** badge. A finished scheduled-task run lands here on its own (no manual refresh needed), and whatever **View session** on a task card opens is always listed and highlighted — even when that session belongs to another project (the list itself is filtered per project; that one is merged in as the exception) |
440
+ | Session list | Browse, search, rename, and delete past conversations; sessions created via `g ai` in the terminal also appear here with a **CLI** badge. A finished scheduled-task run lands here on its own (no manual refresh needed), and whatever **View session** on a task card opens is always listed and highlighted — even when that session belongs to another project (the list itself is filtered per project; that one is merged in as the exception). **The list collapses**: a button at the right of the "New session" row folds the whole column down to a slim rail (icon plus vertical label, the rail itself is the way back), handing its 240px to the conversation. The same collapse works wherever the list appears side by side with the chat — the file-space **g ai** panel and the workbench's main Agent console — and the state is one shared preference, remembered across reloads (only wide layouts have a column to fold; when the layout is narrow the list is a page of its own and the button is not shown) |
441
441
  | Engine choice | Run new sessions on the built-in **g ai** or hand them to an external CLI — **Claude Code**, **OpenCode** or **Codex**. The selector sits at the right of the chat tabs; engines whose CLI is not installed are greyed out and clicking one opens the install guide. The same selector lives in the file-space **g ai** chat panel. The engine is locked once a session is persisted, so switching means starting a new session |
442
442
  | Live session entry | Sending the first message of a new session makes it show up in the list **immediately** with a "Generating..." badge, instead of waiting for the whole turn to finish; once the reply ends and the server persists the session, the entry is replaced by the real timestamp and message count |
443
443
  | Streaming chat | SSE-based real-time streaming with thinking process, content, tool calls, and tool results rendered inline |
@@ -934,7 +934,7 @@ $ ZEN_ALLOWED_ORIGINS="https://zen.example.com,http://10.0.0.5:8080" g ui
934
934
 
935
935
  > 点击顶部条里的目录名(或文件夹图标)即可弹出该对话框。直接输入路径、点击 **浏览** 唤起系统文件选择器,或从 **常用目录** 一键切换。**使用新标签打开** 会在新 GUI 标签里加载目标路径,原项目保持不动。
936
936
 
937
- 目录名旁边的顶部条自带一排快捷操作:在资源管理器中打开、在终端中打开、复制文件夹名称(只复制最后一级目录名)、用 `g ai` 打开,以及每个已检测到的编辑器 / AI 工具各一个按钮 —— VS Code、Codex、OpenCode、Kimi Code、ZCode、DeepSeek Harness 与 Claude Code(右键 Claude 按钮可选默认 / 完全批准,右键任意工具按钮可升级到最新版本)。没安装的工具会收进 **更多** 菜单,点一下弹出安装引导。
937
+ 目录名旁边的顶部条自带一排快捷操作:在资源管理器中打开、在终端中打开、复制文件夹名称(只复制最后一级目录名)、用 `g ai` 打开,以及每个已检测到的编辑器 / AI 工具各一个按钮 —— VS Code、Codex、OpenCode、CodeBuddy Code、Pi Agent、Kimi Code、ZCode、DeepSeek Harness 与 Claude Code。右键工具按钮弹出的菜单里:CLI 本身有免批准档的工具(Claude Code、Codex、OpenCode、CodeBuddy Code、Kimi Code)逐档列出「默认权限」与它自己那个完全批准开关(每行都写明实际传的参数),排在「更新到最新版本」之上。没安装的工具会收进 **更多** 菜单,点一下弹出安装引导。
938
938
 
939
939
  当 GUI 打开在一个**不是 Git 仓库**的目录上时,右侧会改为显示「最近项目」列表 —— 每个最近目录一张卡片,带 Git 徽标(落后 / 领先 / 未提交)与「在新标签页打开」。每次打开界面时会自动对所有项目跑一遍 `git fetch`,让「领先/落后」显示真实状态而不是上次 fetch 时的快照;**刷新全部** 按钮可以随时手动再刷一遍。切换目录弹窗里是同一份列表(叫 **常用目录**),标题行右端摆着同一个 **刷新全部** 按钮 —— 自动刷新仍然只发生在常驻面板上(打开一个选目录的弹窗不该顺手联网刷十几个仓库),但手动刷新两处完全一致,连进度读数都是同一个。两处的卡片上方还各有一个搜索框:敲路径里的任意一段就能筛出对应的卡片(底下的 AI 状态解读始终按全量那批目录来讲,不跟着筛选变)。
940
940
 
@@ -1133,16 +1133,16 @@ Activity Bar 第四个视图,在 GUI 内直接浏览并编辑项目文件:
1133
1133
  | 任务列表 | 新建、编辑、删除任务;按项目分组(当前项目排在最前),每条任务只占一行 —— 有标题显示标题,没标题则显示描述前若干字符(超出省略);标题和描述都没填的任务视为草稿,切走时直接丢弃、不落盘 |
1134
1134
  | 多项目看板 | 三栏均可拖动 / 可折叠:项目列表(含执行监控)、看板、主 Agent 控制台。拖动分隔条调整宽度(项目列表 180–420 px、控制台 260 px ~ `min(900, 视口 46%)`),双击恢复响应式默认值;两侧也都能收起 —— 顶栏按钮收项目列表,控制台自己的按钮把它收成 32px 收纳条、点一下展开。项目列表下方的执行监控有独立分隔条(120 px ~ 视口高度一半),并行跑多个任务时上下拖动即可加高。所有宽高跨会话记住。窄屏(≤860px)三栏改成上下排列,主 Agent 控制台排在**看板前面**(看板三列摞起来有一万多像素,控制台落在它后面就够不着了),报告正文也不再按 6 行截断 |
1135
1135
  | 看板视图 | **待处理 / 进行中 / 已完成** 三列,已完成列按完成时间倒序;顶部勾选可只看「最近一次执行报错」的任务;一键切换成表格视图,信息密度更高。待处理列末尾常驻一个「新建任务」入口 —— 列里已有卡片时它照样在(列空时它还兼任空状态),点开的是和右上角按钮同一个新建弹窗。任务附件里的**图片会在卡片顶部画一张封面** —— 只画第一张,多张时角上压一枚 `+N`;点封面直接看大图,且能左右翻完整组(**不会**顺手把任务也打开:卡片整块是"打开任务"的可点区域,封面把自己摘出来了)。附件文件已经丢了的那种卡**不画封面**,而不是在板上留一枚裂图;表格视图用任务名前的「N 张图」标同一件事 —— 两种画法不会一个有一个没有 |
1136
- | 进行中卡片 | 正在跑的任务不只是右上角一个圆点:卡片上直接带着**执行器的品牌图标**(悬停看是哪个产品)、已运行时长、调用了多少次工具(悬停看类型分布)、最近一次工具调用、最近在思考什么、最新的回复 —— 一段时间没有产出时再补一句静默多久。某一项没有内容就**整行不渲染**(不写"暂无"),没在跑的任务则完全没有这块。这些事实与右栏进度报告同源(都来自执行记录),所以跟随看板 5 秒轮询刷新,别的 `g ui` 实例里跑的任务在这里同样看得到;切到表格视图时同一行摘要压在任务名下方。悬停时卡片右下角还会浮出 **停止** —— 位置正是空闲卡片摆「执行」的那一格(在跑时两者不并排:没有第二轮可跑),所以停掉一条卡住的任务不必再点进编辑器往下翻;它走的是与编辑器里那个「停止」**同一个接口、同一段确认文案**,而在**别的 g ui 实例**里跑的任务在这个窗口停不了 —— 服务端会直说这一句,而不是笼统回一句「停止失败」 |
1136
+ | 进行中卡片 | 正在跑的任务不只是右上角一个圆点:卡片上直接带着**执行器的品牌图标**(悬停看是哪个产品)、已运行时长、调用了多少次工具(悬停看类型分布)、最近一次工具调用、最近在思考什么、最新的回复 —— 一段时间没有产出时再补一句静默多久。这些证据上面还有一条**这个任务自己的进度条**,数字是主 Agent 估的(标着「AI 估计」,悬停说明它怎么估的):只有最近一份报告讲的是**这一轮**时才画 —— 模型没给数字、给了个越界的脏值、或那份报告讲的是同一个任务上一轮,都宁可不画,也不拿一个 0% 糊弄。某一项没有内容就**整行不渲染**(不写"暂无"),没在跑的任务则完全没有这块。这些事实与右栏进度报告同源(都来自执行记录),所以跟随看板 5 秒轮询刷新,别的 `g ui` 实例里跑的任务在这里同样看得到;切到表格视图时同一行摘要压在任务名下方(进度在那行以文字出现)。悬停时卡片右下角还会浮出 **停止** —— 位置正是空闲卡片摆「执行」的那一格(在跑时两者不并排:没有第二轮可跑),所以停掉一条卡住的任务不必再点进编辑器往下翻;它走的是与编辑器里那个「停止」**同一个接口、同一段确认文案**,而在**别的 g ui 实例**里跑的任务在这个窗口停不了 —— 服务端会直说这一句,而不是笼统回一句「停止失败」 |
1137
1137
  | 跑完卡片 | 「已完成」列的卡片不再只有标题和时间:它留下一小段**智能体最后说的话** —— 最近一轮执行的正文尾部,压平成一句话、最多 100 字。这条最有用的时候正是它被做出来的理由:一次执行常常以反问收尾(「要 push 吗?」),标着"已完成"的任务其实在等你回一句话,而以前只有点进编辑器翻日志才知道。**执行器的品牌图标就挂在这段摘录的开头** —— 这句话是"它"说的,图标说的是哪个 CLI 说的,放在这里比放在卡片别处更直接。正在跑的任务仍然走上面那块活动区(两者互斥);那次执行没写正文时这段整块不渲染,不拿上一轮的旧话顶;完整摘录在悬停提示里。表格视图的任务名下方同样有这一行。图标只在**执行器认得出来**时才画:加 `agent` 字段之前跑的记录、或值不在已知执行器里的,一律不画,而不是猜一个品牌显示(表格视图里,正在跑的任务图标在状态摘要行、跑完的在最后回复行) |
1138
- | 主 Agent 控制台 | 两种工作方式,拨片切换、选择记在浏览器里:**对话** —— 直接跟内置 g ai 聊,由它按需把活派给某个项目(可多轮、可先问清再派);**指令** —— 你自己写一句话,落点由主 Agent 判断(或遵从此前选中的项目),Enter 派发、Shift+Enter 换行。两种方式落到**同一条派发链路与同一条指令流水**,差别只在"谁决定派什么"。调度可暂停 / 恢复,暂停期间派发只建任务不执行 |
1139
- | 进度报告 | 「指令」模式下这块报的是**正在跑的任务现在到哪一步了**,而不是"谁派发了、谁完成了"(那些看板本身就能看出来)。主 Agent 会读一遍每个在跑的 job —— 已运行多久、**最近在想什么**、**最近 20 次都在调哪类工具**、**已经多久没动静**、最近一行输出 —— 写一段汇报:每个任务在做什么、走到哪一步、有没有卡住的迹象。每次汇报还带一条**进度条**:模型在正文之前先交它自己估的整体进度与每个任务各自的百分比,界面把它们画成条并标上「AI 估计」(悬停说明这个数字是怎么估出来的)。它是估计不是实测 —— 模型不肯给数字时不画那条,不会拿一个 0% 糊弄过去。**思考那一行是关键**:一句正文都不写的任务才是常态(它们的输出从头到尾是空的),只看输出就只能写"看不出来";而"是不是卡住了"现在必须给依据(静默时长、或工具分布是不是在原地打转),不许因为调用次数多就暗示卡住。报告按你设的间隔自动生成(5 / 10 / 15 / 30 / 60 分钟,也可以关掉),也能随时点「立即报告」;面板上展示最新那份及其依据(项目、已运行时长、工具分布、最近思考、最近一次工具调用、静默时长),更早的从下方历史列表里点开回看。**报告只在它讲的任务还在跑的时候才挂在主位** —— 报告是"生成那一刻"的快照,任务收工之后卡片头上那句「N 个任务进行中」就成了假话(而顶栏同一处正写着「0 个执行中」,两个数自己打起来了);跑完之后主位不再挂它,改说当前的情况:全部跑完说「当前没有正在执行的任务」,换了新任务在跑但还没有覆盖到它们的那份报告时说「这批任务还没有进度报告」。要回看就从历史列表点开,点开的那张标一个「已结束」**卡片分两层摆**:上面那段是主 Agent 自己的**判断**,下面「任务事实」那区是它**凭什么这么说** —— 每个任务一张卡(标题加粗、自己的进度条、三行证据前面各带一个「工具 / 思考 / 回复」的标签好一列扫下来),静默过久的那张卡整条描一遍告警色。这样正文与事实对不上时,你一眼能看出是模型在编,而不是两片同样灰度的小字糊在一起。右栏只有这么宽,正文默认只露 6 行(底下渐隐 + 「展开全文」,想看整段再点开),不然一段汇报会把下面几组任务事实整个顶出视口。自动报告由**服务端**定时产生,所以标签页关着也照样攒历史,回来就能看到;**没有任务在跑就不记条目** —— 自动报告直接跳过,「立即报告」改成回你一句"当前没有正在执行的任务"(都不白调一次模型);间隔内内容一样的两份也不重复落盘,连点两下只留一条。汇报按界面语言生成,输出看不出进度时会直说,而不是编一段像模像样的进展。**「历史报告」「项目概览」默认折成一行** —— 标题行上分别留着报告份数与分支·工作区状态 —— 点标题行即展开,选择跨会话记住。这两块是固定高度,矮屏上会把报告卡挤成一条缝(1366×768 实测只剩十来像素),折起来之后报告拿到的窗口差不多翻倍 |
1138
+ | 主 Agent 控制台 | 两种工作方式,拨片切换、选择记在浏览器里:**对话** —— 直接跟内置 g ai 聊,由它按需把活派给某个项目(可多轮、可先问清再派);**指令** —— 你自己写一句话,落点由主 Agent 判断(或遵从此前选中的项目),Enter 派发、Shift+Enter 换行。两种方式落到**同一条派发链路与同一条指令流水**,差别只在"谁决定派什么" |
1139
+ | 进度报告 | 「指令」模式下这块报的是**正在跑的任务现在到哪一步了**,而不是"谁派发了、谁完成了"(那些看板本身就能看出来)。主 Agent 会读一遍每个在跑的 job —— 已运行多久、**最近在想什么**、**最近 20 次都在调哪类工具**、**已经多久没动静**、最近一行输出 —— 写一段汇报:每个任务在做什么、走到哪一步、有没有卡住的迹象。每次汇报还带一条**进度条**:模型在正文之前先交它自己估的整体进度与每个任务各自的百分比,界面把它们画成条并标上「AI 估计」(悬停说明这个数字是怎么估出来的)。它是估计不是实测 —— 模型不肯给数字时不画那条,不会拿一个 0% 糊弄过去。**思考那一行是关键**:一句正文都不写的任务才是常态(它们的输出从头到尾是空的),只看输出就只能写"看不出来";而"是不是卡住了"现在必须给依据(静默时长、或工具分布是不是在原地打转),不许因为调用次数多就暗示卡住。报告按你设的间隔自动生成(5 / 10 / 15 / 30 / 60 分钟,也可以关掉),也能随时点「立即报告」;面板上展示最新那份的正文与整体进度,它**凭什么这么说**的那些事实(项目、已运行时长、工具分布、最近思考、最近一次工具调用、静默时长)则挂在中间看板的「进行中」卡片上 —— 那里正好和任务本身一起看,更早的报告从下方历史列表里点开回看。**报告只在它讲的任务还在跑的时候才挂在主位** —— 报告是"生成那一刻"的快照,任务收工之后卡片头上那句「N 个任务进行中」就成了假话(而顶栏同一处正写着「0 个执行中」,两个数自己打起来了);跑完之后主位不再挂它,改说当前的情况:全部跑完说「当前没有正在执行的任务」,换了新任务在跑但还没有覆盖到它们的那份报告时说「这批任务还没有进度报告」。要回看就从历史列表点开,点开的那张标一个「已结束」。这一栏只放主 Agent 的**判断**(正文 + 整体进度):它**凭什么这么说**的那些事实与每个任务各自的百分比,2026-10-14 起整块搬到了中间看板的「进行中」卡片上 —— 两边原本列的是同一批字段(服务端同一份实现),并排显示就是同一件事说两遍(用户反馈"左右都有,有点重叠"),而卡片那边更全(多 PID、执行器图标、静默的告警色)。右栏只有这么宽,正文默认只露 6 行(底下渐隐 + 「展开全文」,想看整段再点开),不然一段汇报会独占整张卡。自动报告由**服务端**定时产生,所以标签页关着也照样攒历史,回来就能看到;**没有任务在跑就不记条目** —— 自动报告直接跳过,「立即报告」改成回你一句"当前没有正在执行的任务"(都不白调一次模型);间隔内内容一样的两份也不重复落盘,连点两下只留一条。汇报按界面语言生成,输出看不出进度时会直说,而不是编一段像模像样的进展。**「历史报告」「项目概览」默认折成一行** —— 标题行上分别留着报告份数与分支·工作区状态 —— 点标题行即展开,选择跨会话记住。这两块是固定高度,矮屏上会把报告卡挤成一条缝(1366×768 实测只剩十来像素),折起来之后报告拿到的窗口差不多翻倍 |
1140
1140
  | 静默收尾 | 一条任务静默超过 **10 分钟**(没有正文、没有思考、也没有工具调用)时,编排台会让主 Agent 读一遍它手上的事实 —— 最近在想什么、最后说了什么、工具分布长什么样 —— 判断它是**已经做完了**,还是还在干活 / 卡住了。判成做完就把这一轮落成终态:卡片从「进行中」挪到「已完成」,并在用时下面标一枚 **AI 判定完成**,悬停看模型给的依据。判据不足时**什么都不做**(只记一笔,等下一个 10 分钟再问,同一条最多问 3 次)—— 不动手,好过把还在跑的任务标成完成。它只改记录、**不动进程**:真要把挂住的进程收掉,仍然是卡片上那个「停止」。只判**本实例**跑的任务 —— 别的 `g ui` 窗口里派出去的那条,由那个窗口自己收尾 |
1141
1141
  | 手动标记完成 | 列是执行事实推出来的,推不出两件只有你自己知道的事:一条躺在**待处理**里的任务其实早在别处干完了;一条**进行中**的任务模型已经不说话了,而你一眼能看出它做完了。这两种卡片现在 hover 会浮出一颗 **完成**(就在「执行 / 停止」旁边那一格),而**手动**收进已完成的卡片把那颗换成 **撤销**;自己跑完的卡片两颗都没有 —— 撤销一个它从来没有过的标记,点下去什么都不会发生。给正在跑的任务标完成会先问一句,并在同一次动作里把那一轮停掉(一张卡片不能既是「已完成」又在跑);跨窗口也一样:那个 job 活在别的 `g ui` 实例里时服务端直说原因,不假装标成功。标记记在任务身上,不补假的执行记录;这条任务之后再跑一轮,标记就作废,列重新跟着执行事实走。撤销是一键、不弹确认(它走的就是"点错了退回来"那条路),撤完回哪一列仍然由执行事实说了算 —— 所以那颗按钮只出现在"正是它把卡片留在已完成列"的卡上 |
1142
1142
  | 派发执行器 | 派出去的任务由哪个 CLI 跑:**对话模式**在输入框下方选,**指令模式**在派发栏选 —— 两处是同一个组件、同一份选择,与执行按钮的临时切换也共用。注意「引擎」和「执行器」不是一回事:只有**内置 g ai** 能在服务端跑工具循环、才有派发能力,所以对话模式下把引擎切成外部 CLI 时,执行器选择会换成一句「当前引擎只能对话,不能派发任务 —— 切到内置 g ai 才能派活」的说明,而不是让你点了个不会生效的下拉 |
1143
1143
  | 派发默认提示词 | 给每次派发配一段常驻提示词:一条**全局**的(所有项目都附加)+ 每个项目一条(派发到该项目时追加在全局之后,是补充而不是覆盖)。两者都在控制台输入区的齿轮按钮里设置;拼好的正文放在指令**之前**,「立即执行」旁边会多出一个「默认提示词(全局 + 本项目)」勾选,单次派发可以取消勾选,指令流水里也记下这条指令附带的是哪一级。提示词在派发那一刻就抄进任务自己的提示词字段,之后改设置不会回头改写已建任务,单条任务仍可再改 |
1144
- | 项目图标 | 每一行的图标位优先画**项目自己的 favicon**,而不是一律一枚文件夹 —— 32px 的方块,跨「名字行 + 分支行」两行,一屏扫下来认得出谁是谁;**切换目录弹窗里的「常用目录」卡片用的是同一枚图**(同一个探测、同一套兜底)。服务端去找项目真正带的那一枚:先是它 `index.html` 里声明的 `<link rel="icon">`,再是项目根往下两层内的 `favicon.svg` / `.png` / `.webp` / `.ico`(`frontend/public/favicon.svg` 这类布局正是靠这一条找到的)。扫描范围有界(依赖 / 版本控制 / 缓存目录直接不进,构建产物排在最后),结果缓存 5 分钟 —— 看板 5 秒轮询不会反复走盘。没带图标的项目、以及加载失败的图标(例如项目把图标放在 CDN 上而浏览器拒了那次请求)都退回文件夹图标,行上不会留一枚破图。嵌套仓库刻意跳过:只是"装着一堆项目"的目录显示文件夹图标,不去借里面某个项目的 logo |
1145
- | 项目行打开方式 | 编排台项目列表里 hover 任意一行会出现两个按钮:「打开文件夹」一键进资源管理器,以及「打开方式」菜单 —— 文件管理器 / 终端 / 新标签页跑 `g ui`,以及各编辑器与 AI 工具(VS Code、Codex、OpenCode、Kimi Code、ZCode、DeepSeek Harness,加上默认权限或完全批准的 Claude Code)。没安装的工具会置灰并标「未安装」,点它弹的是顶栏那套安装引导;菜单里的动作只作用于该行项目,不会改变看板选中态 |
1144
+ | 项目图标 | 每一行的图标位优先画**项目自己的 favicon**,而不是一律一枚文件夹 —— 32px 的方块,跨「名字行 + 分支行」两行,一屏扫下来认得出谁是谁;**切换目录弹窗里的「常用目录」卡片**用的是同一枚图,**顶栏目录胶囊**与**中间看板的标题行**也是这一枚(同一个探测、同一套兜底,只是槽高按各自那一行的高度定:左栏 32px / 看板 24px / 顶栏 20px)。服务端去找项目真正带的那一枚:先是它 `index.html` 里声明的 `<link rel="icon">`,再是项目根往下两层内的 `favicon.svg` / `.png` / `.webp` / `.ico`(`frontend/public/favicon.svg` 这类布局正是靠这一条找到的)。扫描范围有界(依赖 / 版本控制 / 缓存目录直接不进,构建产物排在最后),结果缓存 5 分钟 —— 看板 5 秒轮询不会反复走盘。没带图标的项目、以及加载失败的图标(例如项目把图标放在 CDN 上而浏览器拒了那次请求)都退回文件夹图标,行上不会留一枚破图。嵌套仓库刻意跳过:只是"装着一堆项目"的目录显示文件夹图标,不去借里面某个项目的 logo |
1145
+ | 项目行打开方式 | 编排台项目列表里 hover 任意一行会出现两个按钮:「打开文件夹」一键进资源管理器,以及「打开方式」菜单 —— 文件管理器 / 终端 / 新标签页跑 `g ui`,以及各编辑器与 AI 工具(VS Code、Codex、OpenCode、CodeBuddy Code、Pi Agent、Kimi Code、ZCode、DeepSeek Harness)。CLI 有免批准档的那几家 —— Claude Code、Codex、OpenCode、CodeBuddy Code、Kimi Code —— 各自多出一条「完全批准」项(Codex 还多一条"自动批准但仍在沙箱内")。没安装的工具会置灰并标「未安装」,点它弹的是顶栏那套安装引导;菜单里的动作只作用于该行项目,不会改变看板选中态 |
1146
1146
  | 移除死项目 | 目录已经不存在的项目行仍会留在清单里(清单是常用目录与任务路径两份来源的并集),这一行 hover 时不再给任何打开动作(点了只会报「无法打开目录」),只留一颗红色的**「从清单移除」**。确认框会写明**任务不会被删除**,成功提示还会带上保留的条数。移除后这一行从清单消失,而任务、执行记录、历史一条不动;目录哪天被克隆回来,它会自己现身 |
1147
1147
  | 任务编辑器浮层 | 点击看板卡片时以浮层打开:左侧是扁平化的任务列表与提示词预置,右侧依次是任务头部、预置下拉、执行器 split 按钮、「复制执行内容 / 执行日志 / 清空执行」动作,以及对话式执行主体。描述默认折叠成一行「任务描述(可选)」摘要,点击展开;已填写描述或挂有附件时摘要右侧显示「已填写」徽标与附件数量。打开浮层时对话流直接落在**最新一轮**而不是第一轮:正文异步高亮与工具调用折叠会在挂载后继续长高,这段时间里持续贴底,用户自己一滚就立刻撒手。顶部细栏在「返回看板」与当前项目之后补一枚**任务状态徽标**(执行中 / 已完成 / 执行失败 / 待处理,用与看板列头同一套角色色,在跑时圆点脉动;悬停可看「AI 判定完成」「手动已完成」等依据 —— 以前细栏只有时间与用时,正在跑的任务顶上可能还挂着上一轮的「1 小时前 · 用时 13 分」,看着像早就跑完了),右端靠着一枚「任务执行」,并给出这条任务的**相对时间与用时**(跑过给「用时 x」,正在跑给实时的「已运行 x」,从没跑过只给时间、不写占位),与看板卡片上那两个值逐字一致;窗口收窄时先让位的是这一块与状态徽标,左边的返回 / 项目 / 执行于一个字节都不动(状态徽标在≈手机宽时整体收起,而不是压着项目名变形) |
1148
1148
  | 复制执行内容 | 任务头部的「复制执行内容」把**整条任务**(所有轮次,不只是屏幕上那一段)以纯 Markdown 放进剪贴板:先是任务与项目的标题行,然后一轮一节(`## 第 N 轮`,下面一行是本轮执行器、状态与开始时间),每节依次是用户提示词、智能体思考、工具调用(参数与结果都放在围栏代码块里)与模型返回。内容是从执行记录现拼的、不是从 DOM 里抠的,所以复制到什么跟你当前选中了哪段文字无关。用户侧走的是与对话气泡同一套裁剪,复制出来的就是你真正说过的话 —— 注入的环境块 / 记忆块 / 附件清单留在 `job.prompt` 里不跟着出去。一个字都没有的轮次会被跳过,且不让后面的轮次跟着往前重编号;从没跑过的任务回答「暂无执行内容可复制」,而不是把空串写进剪贴板 |
@@ -1174,7 +1174,7 @@ Activity Bar 中的机器人图标视图,可直接在浏览器中与内置 AI
1174
1174
 
1175
1175
  | 功能 | 说明 |
1176
1176
  |---|---|
1177
- | 会话列表 | 浏览、搜索、重命名、删除历史对话;通过 `g ai` 在终端创建的会话也会出现在这里,带 **CLI** 标记。定时任务跑完那一轮会**自动入列**(不用手动刷新);点任务卡片上的「查看会话」打开的会话也一定在列表里并高亮 —— 哪怕它属于别的项目(列表本身按当前项目过滤,这一条是作为例外补进去的) |
1177
+ | 会话列表 | 浏览、搜索、重命名、删除历史对话;通过 `g ai` 在终端创建的会话也会出现在这里,带 **CLI** 标记。定时任务跑完那一轮会**自动入列**(不用手动刷新);点任务卡片上的「查看会话」打开的会话也一定在列表里并高亮 —— 哪怕它属于别的项目(列表本身按当前项目过滤,这一条是作为例外补进去的)。**列表可以收起**:「新建会话」那一行右端的按钮把整列收成一条窄收纳条(图标 + 竖排文案,点收纳条展开回来),腾出的 240px 全给对话区。会话列表与对话并排的每一处都能收 —— 文件空间的 **g ai** 面板、工作台的主 Agent 控制台同款;收起状态是**一份共用偏好**,刷新后仍是收起态(只有宽屏才有"旁边那一列"可收;窄屏时列表是独立一页,不显示这个按钮) |
1178
1178
  | 引擎选择 | 新建会话可跑内置 **g ai**,也可交给外部 CLI —— **Claude Code** / **OpenCode** / **Codex**。选择器在对话 Tab 行右端;未安装的引擎会置灰,点一下直接开安装引导。文件空间的 **g ai** 对话面板头部有同一个选择器。会话一旦落盘引擎就锁定,要换请新建会话 |
1179
1179
  | 会话实时入列 | 新会话发出第一条消息后,左侧列表**立刻**出现这一条(带「正在生成中…」标记),不用等整轮回答跑完;回答结束、服务端落盘后自动替换成真实的时间与条数 |
1180
1180
  | 流式对话 | 基于 SSE 的实时流式输出,包含思考过程、正文内容、工具调用和工具结果的内联渲染 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zen-gitsync",
3
- "version": "2.18.11",
3
+ "version": "2.18.13",
4
4
  "description": "Auto commit, scheduled sync, and visual GUI for Git. Run `g` in any repo for one-key commit & push, AI commit messages, scheduled background sync, and a drag-and-drop workflow builder.",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -54,6 +54,8 @@
54
54
  "verify:wb-overview": "node scripts/verify-workbench-overview.cjs",
55
55
  "verify:wb-progress-report": "node scripts/verify-wb-progress-report.cjs",
56
56
  "verify:wb-card-live": "node scripts/verify-wb-card-live.cjs",
57
+ "verify:wb-card-progress": "node scripts/verify-wb-card-progress.cjs",
58
+ "verify:wb-card-progress:reverse": "node scripts/verify-wb-card-progress.cjs --reverse",
57
59
  "verify:wb-card-row1": "node scripts/verify-wb-card-row1.cjs",
58
60
  "verify:wb-card-reply": "node scripts/verify-wb-card-reply.cjs",
59
61
  "verify:wb-task-duration": "node scripts/verify-wb-task-duration.cjs",
@@ -79,6 +81,7 @@
79
81
  "verify:agent-ask-sound": "node scripts/verify-agent-ask-sound.cjs",
80
82
  "verify:wb-proj-branch": "node scripts/verify-workbench-proj-branch.cjs",
81
83
  "verify:wb-proj-filter": "node scripts/verify-wb-proj-filter.cjs",
84
+ "verify:wb-proj-active": "node scripts/verify-wb-proj-active.cjs",
82
85
  "verify:wb-proj-icon": "node scripts/verify-wb-proj-icon.cjs",
83
86
  "verify:wb-proj-search": "node scripts/verify-wb-proj-search.cjs",
84
87
  "verify:wb-proj-search:reverse": "node scripts/verify-wb-proj-search.cjs --reverse",
@@ -89,6 +92,8 @@
89
92
  "verify:wb-editor-persist": "node scripts/verify-workbench-editor-persist.cjs",
90
93
  "verify:wb-open-scroll-bottom": "node scripts/verify-workbench-open-scroll-bottom.cjs",
91
94
  "verify:chat-rail": "node scripts/verify-chat-message-rail.cjs",
95
+ "verify:conv-collapse": "node scripts/verify-conv-collapse.cjs",
96
+ "verify:conv-collapse:reverse": "node scripts/verify-conv-collapse.cjs --reverse",
92
97
  "verify:agent-session-copy": "node scripts/verify-agent-session-copy.cjs",
93
98
  "verify:agent-retry": "node scripts/verify-agent-llm-retry.cjs",
94
99
  "verify:editor-preview-scroll": "node scripts/verify-editor-preview-scroll.cjs",