@pellux/goodvibes-tui 2.0.20 → 2.1.0

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 (388) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/README.md +16 -16
  3. package/docs/README.md +4 -4
  4. package/docs/foundation-artifacts/operator-contract.json +59 -4
  5. package/package.json +16 -6
  6. package/src/cli/management.ts +5 -2
  7. package/src/cli/tui-startup.ts +34 -39
  8. package/src/core/agent-view-render.ts +157 -0
  9. package/src/core/approval-alert.ts +49 -11
  10. package/src/core/bookmark-navigation.ts +7 -1
  11. package/src/core/budget-breach-notifier.ts +27 -8
  12. package/src/core/compaction-receipt.ts +1 -1
  13. package/src/core/context-usage.ts +1 -1
  14. package/src/core/conversation-compaction-render.ts +3 -3
  15. package/src/core/conversation-display-only.ts +86 -0
  16. package/src/core/conversation-event-navigation.ts +27 -0
  17. package/src/core/conversation-line-cache.ts +216 -447
  18. package/src/core/conversation-render-context.ts +20 -27
  19. package/src/core/conversation-rendering.ts +157 -575
  20. package/src/core/conversation-splash-state.ts +6 -1
  21. package/src/core/conversation-types.ts +35 -0
  22. package/src/core/conversation-usage.ts +12 -0
  23. package/src/core/conversation.ts +130 -131
  24. package/src/core/long-task-notifier.ts +100 -31
  25. package/src/core/notices.ts +75 -0
  26. package/src/core/pairing-tailscale-gateway.ts +1 -1
  27. package/src/core/process-output-log.ts +143 -0
  28. package/src/core/rewind-receipt.ts +1 -1
  29. package/src/core/session-focus.ts +190 -0
  30. package/src/core/session-resume-core.ts +23 -81
  31. package/src/core/stream-event-wiring.ts +31 -5
  32. package/src/core/system-message-noise.ts +2 -2
  33. package/src/core/system-message-router.ts +16 -18
  34. package/src/core/turn-event-wiring.ts +272 -33
  35. package/src/core/work-tree-focus.ts +290 -0
  36. package/src/core/work-tree-fold-store.ts +143 -0
  37. package/src/core/work-tree-model.ts +799 -0
  38. package/src/core/work-tree-render.ts +384 -0
  39. package/src/core/work-tree-sources.ts +184 -0
  40. package/src/core/work-tree-wiring.ts +176 -0
  41. package/src/core/workstream-notification.ts +36 -6
  42. package/src/core/wrfc-notice-titles.ts +37 -0
  43. package/src/input/agents-modal-text.ts +119 -0
  44. package/src/input/agents-modal.ts +699 -0
  45. package/src/input/bookmark-modal.ts +33 -9
  46. package/src/input/changes-git.ts +251 -0
  47. package/src/input/changes-modal.ts +629 -0
  48. package/src/input/changes-model.ts +125 -0
  49. package/src/input/command-palette-types.ts +41 -0
  50. package/src/input/command-palette.ts +272 -0
  51. package/src/input/command-registry.ts +77 -35
  52. package/src/input/commands/acp-runtime.ts +19 -9
  53. package/src/input/commands/channel-runtime.ts +2 -2
  54. package/src/input/commands/ci-runtime.ts +1 -1
  55. package/src/input/commands/codebase-runtime.ts +1 -1
  56. package/src/input/commands/config.ts +7 -1
  57. package/src/input/commands/context-window.ts +25 -19
  58. package/src/input/commands/control-room-runtime.ts +18 -18
  59. package/src/input/commands/conversation-runtime.ts +0 -1
  60. package/src/input/commands/cost-runtime.ts +29 -20
  61. package/src/input/commands/diff-runtime.ts +35 -181
  62. package/src/input/commands/eval.ts +1 -1
  63. package/src/input/commands/experience-runtime.ts +3 -7
  64. package/src/input/commands/fresh-conversation.ts +86 -0
  65. package/src/input/commands/git-runtime.ts +5 -22
  66. package/src/input/commands/graph-runtime.ts +1 -1
  67. package/src/input/commands/guidance-runtime.ts +1 -1
  68. package/src/input/commands/health-runtime.ts +8 -9
  69. package/src/input/commands/hooks-runtime.ts +2 -2
  70. package/src/input/commands/hosted-runtime.ts +3 -3
  71. package/src/input/commands/incident-runtime.ts +3 -3
  72. package/src/input/commands/intelligence-runtime.ts +6 -9
  73. package/src/input/commands/knowledge.ts +2 -2
  74. package/src/input/commands/legacy-panel-command.ts +57 -0
  75. package/src/input/commands/local-auth-runtime.ts +8 -9
  76. package/src/input/commands/local-provider-runtime.ts +7 -4
  77. package/src/input/commands/local-runtime.ts +12 -15
  78. package/src/input/commands/local-setup-review.ts +1 -1
  79. package/src/input/commands/local-setup.ts +13 -19
  80. package/src/input/commands/memory.ts +1 -1
  81. package/src/input/commands/notify-runtime.ts +9 -0
  82. package/src/input/commands/operator-runtime.ts +10 -12
  83. package/src/input/commands/permissions-provenance.ts +3 -3
  84. package/src/input/commands/planning-runtime.ts +7 -7
  85. package/src/input/commands/platform-sandbox-runtime.ts +2 -2
  86. package/src/input/commands/platform-services-runtime.ts +1 -1
  87. package/src/input/commands/policy-dispatch.ts +2 -2
  88. package/src/input/commands/policy.ts +3 -3
  89. package/src/input/commands/provider.ts +1 -1
  90. package/src/input/commands/remote-runtime.ts +1 -1
  91. package/src/input/commands/review-runtime.ts +39 -94
  92. package/src/input/commands/rewind-runtime.ts +81 -108
  93. package/src/input/commands/runtime-services.ts +15 -17
  94. package/src/input/commands/services-runtime.ts +2 -2
  95. package/src/input/commands/session-content.ts +21 -5
  96. package/src/input/commands/session-workflow.ts +13 -38
  97. package/src/input/commands/settings-sync-runtime.ts +2 -2
  98. package/src/input/commands/shell-core.ts +19 -4
  99. package/src/input/commands/skills-runtime.ts +2 -2
  100. package/src/input/commands/status-runtime.ts +13 -0
  101. package/src/input/commands/subscription-runtime.ts +1 -1
  102. package/src/input/commands/tasks-runtime.ts +2 -8
  103. package/src/input/commands/work-plan-runtime.ts +4 -4
  104. package/src/input/commands/workstream-attempts.ts +24 -47
  105. package/src/input/commands/workstream-runtime.ts +2 -2
  106. package/src/input/commands/worktree-runtime.ts +3 -3
  107. package/src/input/commands.ts +3 -1
  108. package/src/input/composer-editor.ts +44 -0
  109. package/src/input/concealed-input.ts +1 -1
  110. package/src/input/config-modal-types.ts +20 -8
  111. package/src/input/config-modal.ts +106 -105
  112. package/src/input/confirm-dialog-types.ts +28 -0
  113. package/src/input/confirm-dialog.ts +70 -0
  114. package/src/input/delete-key-policy.ts +3 -3
  115. package/src/input/feed-context-factory.ts +15 -16
  116. package/src/input/handler-command-route.ts +7 -42
  117. package/src/input/handler-content-actions.ts +16 -15
  118. package/src/input/handler-feed-routes.ts +26 -211
  119. package/src/input/handler-feed.ts +68 -95
  120. package/src/input/handler-interactions.ts +5 -3
  121. package/src/input/handler-modal-routes.ts +215 -216
  122. package/src/input/handler-modal-stack.ts +81 -11
  123. package/src/input/handler-modal-token-routes.ts +4 -0
  124. package/src/input/handler-onboarding.ts +0 -1
  125. package/src/input/handler-picker-routes.ts +65 -107
  126. package/src/input/handler-session-view-route.ts +149 -0
  127. package/src/input/handler-shortcuts.ts +16 -154
  128. package/src/input/handler-types.ts +4 -2
  129. package/src/input/handler-ui-state.ts +45 -15
  130. package/src/input/handler-work-tree-route.ts +123 -0
  131. package/src/input/handler.ts +25 -70
  132. package/src/input/keybindings.ts +16 -71
  133. package/src/input/masked-entry-modal.ts +117 -0
  134. package/src/input/mcp-workspace.ts +48 -17
  135. package/src/input/model-picker-filter.ts +8 -0
  136. package/src/input/model-picker-open.ts +99 -0
  137. package/src/input/model-picker-types.ts +1 -1
  138. package/src/input/model-picker.ts +92 -9
  139. package/src/input/notifications-modal.ts +123 -0
  140. package/src/input/overlay-filter.ts +26 -0
  141. package/src/input/profile-picker-modal.ts +37 -8
  142. package/src/input/search.ts +3 -3
  143. package/src/input/selection-modal-queue.ts +2 -0
  144. package/src/input/selection-modal.ts +28 -16
  145. package/src/input/session-picker-modal.ts +33 -8
  146. package/src/input/settings-modal-activation.ts +7 -2
  147. package/src/input/settings-modal-data.ts +11 -6
  148. package/src/input/settings-modal-types.ts +1 -1
  149. package/src/input/settings-modal.ts +20 -20
  150. package/src/input/submission-intent.ts +1 -1
  151. package/src/input/submission-router.ts +4 -9
  152. package/src/input/surface-modal-host.ts +110 -0
  153. package/src/input/theme-settings-actions.ts +82 -0
  154. package/src/input/usage-modal.ts +183 -0
  155. package/src/input/views.ts +97 -0
  156. package/src/main.ts +175 -165
  157. package/src/permissions/hunk-selection.ts +1 -1
  158. package/src/permissions/prompt-card.ts +511 -0
  159. package/src/permissions/prompt.ts +59 -622
  160. package/src/renderer/agents-modal.ts +310 -0
  161. package/src/renderer/autocomplete-overlay.ts +42 -220
  162. package/src/renderer/back-to-bottom.ts +80 -0
  163. package/src/renderer/block-actions-overlay.ts +30 -48
  164. package/src/renderer/bookmark-modal.ts +48 -79
  165. package/src/renderer/changes-modal.ts +325 -0
  166. package/src/renderer/code-block.ts +184 -106
  167. package/src/renderer/command-palette.ts +93 -0
  168. package/src/renderer/composer-fragments.ts +4 -4
  169. package/src/renderer/composer.ts +146 -0
  170. package/src/renderer/compositor.ts +26 -160
  171. package/src/renderer/config-modal.ts +185 -81
  172. package/src/renderer/confirm-dialog.ts +50 -0
  173. package/src/renderer/context-inspector.ts +116 -154
  174. package/src/renderer/context-status-hint.ts +4 -4
  175. package/src/renderer/conversation-layout.ts +20 -0
  176. package/src/renderer/conversation-overlays.ts +94 -84
  177. package/src/renderer/conversation-surface.ts +19 -38
  178. package/src/renderer/diff-tint.ts +98 -0
  179. package/src/renderer/file-picker-overlay.ts +63 -90
  180. package/src/renderer/footer-targets.ts +38 -0
  181. package/src/renderer/git-status.ts +3 -4
  182. package/src/renderer/header-line.ts +140 -117
  183. package/src/renderer/help-overlay.ts +133 -219
  184. package/src/renderer/history-search-overlay.ts +15 -12
  185. package/src/renderer/lane-graph/bead.ts +800 -0
  186. package/src/renderer/lane-graph/glyphs.ts +134 -0
  187. package/src/renderer/lane-graph/layout.ts +248 -0
  188. package/src/renderer/lane-graph/paint.ts +537 -0
  189. package/src/renderer/lane-graph/semantic-memo.ts +77 -0
  190. package/src/renderer/layout-engine.ts +2 -57
  191. package/src/renderer/layout.ts +7 -13
  192. package/src/renderer/markdown-inline.ts +2 -1
  193. package/src/renderer/markdown-table.ts +17 -12
  194. package/src/renderer/markdown.ts +92 -34
  195. package/src/renderer/masked-entry-modal.ts +78 -0
  196. package/src/renderer/mcp-workspace.ts +166 -203
  197. package/src/renderer/model-workspace.ts +381 -436
  198. package/src/renderer/notifications-modal.ts +116 -0
  199. package/src/renderer/onboarding/onboarding-wizard.ts +178 -588
  200. package/src/renderer/process-view.ts +192 -0
  201. package/src/renderer/profile-picker-modal.ts +58 -110
  202. package/src/renderer/search-overlay.ts +6 -3
  203. package/src/renderer/selection-modal-overlay.ts +87 -327
  204. package/src/renderer/semantic-diff.ts +2 -2
  205. package/src/renderer/session-chips.ts +102 -0
  206. package/src/renderer/session-picker-modal.ts +177 -297
  207. package/src/renderer/settings-modal-connections.ts +14 -23
  208. package/src/renderer/settings-modal-context.ts +367 -0
  209. package/src/renderer/settings-modal-helpers.ts +6 -11
  210. package/src/renderer/settings-modal.ts +322 -726
  211. package/src/renderer/shell-surface.ts +277 -175
  212. package/src/renderer/shortcuts-overlay.ts +217 -0
  213. package/src/renderer/status-line.ts +475 -0
  214. package/src/renderer/surface-compose.ts +174 -0
  215. package/src/renderer/surface-kit-extra.ts +303 -0
  216. package/src/renderer/surface-kit-list.ts +366 -0
  217. package/src/renderer/surface-kit-parts.ts +360 -0
  218. package/src/renderer/surface-kit.ts +568 -0
  219. package/src/renderer/syntax-highlighter.ts +280 -197
  220. package/src/renderer/syntax-theme.ts +51 -0
  221. package/src/renderer/system-message.ts +0 -1
  222. package/src/renderer/term-caps.ts +42 -1
  223. package/src/renderer/terminal-bg-probe.ts +116 -19
  224. package/src/renderer/terminal-palette-probe.ts +322 -0
  225. package/src/renderer/terminal-palette-reader.ts +183 -0
  226. package/src/renderer/terminal-palette.ts +58 -0
  227. package/src/renderer/theme-mode-config.ts +16 -1
  228. package/src/renderer/theme.ts +234 -207
  229. package/src/renderer/thinking.ts +0 -1
  230. package/src/renderer/throbber.ts +188 -0
  231. package/src/renderer/toast-center.ts +119 -0
  232. package/src/renderer/ui-factory.ts +39 -602
  233. package/src/renderer/ui-primitives.ts +8 -25
  234. package/src/renderer/usage-modal.ts +353 -0
  235. package/src/renderer/user-message.ts +58 -0
  236. package/src/renderer/voice-capture-chip.ts +53 -0
  237. package/src/runtime/bootstrap-command-context.ts +0 -5
  238. package/src/runtime/bootstrap-command-parts.ts +38 -89
  239. package/src/runtime/bootstrap-core.ts +13 -15
  240. package/src/runtime/bootstrap-hook-bridge.ts +12 -21
  241. package/src/runtime/bootstrap-notifier-sync.ts +17 -1
  242. package/src/runtime/bootstrap-shell.ts +16 -50
  243. package/src/runtime/bootstrap.ts +14 -14
  244. package/src/runtime/client/fleet-union.ts +5 -5
  245. package/src/runtime/client/hosted-exit.ts +2 -2
  246. package/src/runtime/client/hosted-sessions.ts +1 -1
  247. package/src/runtime/client/spine-adoption.ts +1 -1
  248. package/src/runtime/context-accounting-source.ts +5 -4
  249. package/src/runtime/index.ts +1 -0
  250. package/src/runtime/notification-dispatch.ts +102 -29
  251. package/src/runtime/recovery-offer-wiring.ts +4 -1
  252. package/src/runtime/recovery-prompt.ts +31 -15
  253. package/src/runtime/runtime-services-types.ts +10 -6
  254. package/src/runtime/services.ts +17 -12
  255. package/src/runtime/session-continuity-hints.ts +2 -5
  256. package/src/runtime/session-inbound-inputs.ts +1 -1
  257. package/src/runtime/session-resume-liveness-confirm.ts +14 -2
  258. package/src/runtime/startup-typeahead-gate.ts +103 -0
  259. package/src/runtime/store/domains/domain-read-matrix.ts +0 -1
  260. package/src/runtime/store/domains/index.ts +0 -8
  261. package/src/runtime/store/selectors/index.ts +0 -28
  262. package/src/runtime/store/state.ts +0 -8
  263. package/src/runtime/ui-services.ts +4 -6
  264. package/src/runtime/usage-tracker.ts +348 -0
  265. package/src/runtime/wrfc-persistence.ts +4 -4
  266. package/src/shell/blocking-input.ts +92 -2
  267. package/src/shell/recovery-input-helpers.ts +1 -1
  268. package/src/shell/session-views.ts +539 -0
  269. package/src/shell/status-report.ts +86 -0
  270. package/src/shell/transcript-scroll.ts +68 -0
  271. package/src/shell/ui-openers.ts +84 -172
  272. package/src/shell/view-openers.ts +205 -0
  273. package/src/tools/wrfc-agent-guard.ts +22 -2
  274. package/src/utils/format-duration.ts +4 -8
  275. package/src/utils/splash-lines.ts +9 -1
  276. package/src/utils/terminal-width.ts +56 -0
  277. package/src/verification/verification-ledger.ts +18 -16
  278. package/src/{panels → views}/agent-inspector-shared.ts +2 -2
  279. package/src/{panels → views}/builtin-modals.ts +22 -21
  280. package/src/views/builtin-views.ts +135 -0
  281. package/src/{panels → views}/confirm-state.ts +9 -9
  282. package/src/{panels → views}/diff-review-model.ts +10 -3
  283. package/src/{panels → views}/eval-registry.ts +1 -1
  284. package/src/{panels → views}/fleet-acts.ts +49 -85
  285. package/src/{panels/fleet-panel-format.ts → views/fleet-format.ts} +40 -40
  286. package/src/{panels → views}/fleet-gateway.ts +5 -5
  287. package/src/{panels → views}/fleet-observed-render.ts +16 -16
  288. package/src/{panels → views}/fleet-read-model.ts +9 -9
  289. package/src/{panels/fleet-tabs.ts → views/fleet-session-tabs.ts} +13 -13
  290. package/src/{panels → views}/fleet-spawn.ts +33 -49
  291. package/src/{panels → views}/fleet-steer.ts +12 -12
  292. package/src/{panels → views}/fleet-stop.ts +4 -4
  293. package/src/{panels → views}/fleet-transcript.ts +26 -27
  294. package/src/{panels/fleet-panel-worktree-detail.ts → views/fleet-worktree-detail.ts} +7 -7
  295. package/src/{panels → views}/hosted-session-feed.ts +6 -6
  296. package/src/views/modal-surface-registry.ts +41 -0
  297. package/src/{panels → views}/modals/devices-modal.ts +2 -2
  298. package/src/{panels → views}/modals/hooks-modal.ts +13 -13
  299. package/src/{panels → views}/modals/keybindings-modal.ts +19 -27
  300. package/src/{panels → views}/modals/knowledge-modal.ts +6 -5
  301. package/src/{panels → views}/modals/local-auth-modal.ts +22 -21
  302. package/src/{panels → views}/modals/marketplace-modal.ts +11 -11
  303. package/src/{panels → views}/modals/memory-modal.ts +8 -8
  304. package/src/{panels → views}/modals/modal-surface-helpers.ts +15 -5
  305. package/src/{panels → views}/modals/pairing-modal.ts +9 -9
  306. package/src/{panels → views}/modals/planning-modal.ts +15 -20
  307. package/src/{panels → views}/modals/plugins-modal.ts +6 -6
  308. package/src/{panels → views}/modals/policy-modal.ts +13 -5
  309. package/src/{panels → views}/modals/provider-health-modal.ts +4 -4
  310. package/src/{panels → views}/modals/remote-modal.ts +3 -3
  311. package/src/{panels → views}/modals/sandbox-modal.ts +4 -4
  312. package/src/{panels → views}/modals/security-modal.ts +22 -16
  313. package/src/{panels → views}/modals/services-modal.ts +3 -3
  314. package/src/{panels → views}/modals/settings-sync-modal.ts +4 -4
  315. package/src/{panels → views}/modals/skills-modal.ts +9 -9
  316. package/src/{panels → views}/modals/subscription-modal.ts +3 -3
  317. package/src/{panels → views}/modals/work-plan-modal.ts +10 -13
  318. package/src/views/notifications-feed.ts +314 -0
  319. package/src/{panels → views}/polish-core.ts +38 -36
  320. package/src/{panels → views}/polish-tables.ts +35 -26
  321. package/src/{panels → views}/polish.ts +101 -95
  322. package/src/{panels → views}/project-planning-answer-actions.ts +3 -3
  323. package/src/{panels → views}/provider-health-routes.ts +14 -14
  324. package/src/{panels → views}/search-focus.ts +8 -8
  325. package/src/{panels → views}/session-maintenance.ts +11 -11
  326. package/src/views/skills-discovery.ts +159 -0
  327. package/src/views/view-deps.ts +80 -0
  328. package/src/views/view-panel-adapter.ts +53 -0
  329. package/src/{panels → views}/workstream-graph-render.ts +1 -1
  330. package/src/core/conversation-fold.ts +0 -101
  331. package/src/core/conversation-turn-structure.ts +0 -464
  332. package/src/core/conversation-user-receipts.ts +0 -42
  333. package/src/input/commands/operator-panel-runtime.ts +0 -186
  334. package/src/input/panel-integration-actions.ts +0 -33
  335. package/src/input/panel-mouse-geometry.ts +0 -97
  336. package/src/input/panel-paste-flood-guard.ts +0 -86
  337. package/src/panels/base-panel.ts +0 -301
  338. package/src/panels/builtin/agent.ts +0 -27
  339. package/src/panels/builtin/development.ts +0 -92
  340. package/src/panels/builtin/knowledge.ts +0 -12
  341. package/src/panels/builtin/operations.ts +0 -177
  342. package/src/panels/builtin/session.ts +0 -81
  343. package/src/panels/builtin/shared.ts +0 -357
  344. package/src/panels/builtin-panels.ts +0 -28
  345. package/src/panels/cost-tracker-panel.ts +0 -746
  346. package/src/panels/diff-panel.ts +0 -797
  347. package/src/panels/diff-review-panel.ts +0 -395
  348. package/src/panels/expandable-list-panel.ts +0 -189
  349. package/src/panels/fleet-deep-link.ts +0 -31
  350. package/src/panels/fleet-panel.ts +0 -799
  351. package/src/panels/git-panel.ts +0 -800
  352. package/src/panels/hosted-session-panel.ts +0 -221
  353. package/src/panels/index.ts +0 -21
  354. package/src/panels/local-auth-panel.ts +0 -478
  355. package/src/panels/notifications-feed.ts +0 -127
  356. package/src/panels/notifications-panel.ts +0 -160
  357. package/src/panels/panel-confirm-overlay.ts +0 -72
  358. package/src/panels/panel-manager.ts +0 -791
  359. package/src/panels/plugins-panel.ts +0 -371
  360. package/src/panels/scrollable-list-panel.ts +0 -498
  361. package/src/panels/skills-panel.ts +0 -454
  362. package/src/panels/token-budget-panel.ts +0 -688
  363. package/src/panels/types.ts +0 -191
  364. package/src/panels/wrfc-panel-format.ts +0 -133
  365. package/src/renderer/diff-view.ts +0 -134
  366. package/src/renderer/fleet-tab-strip.ts +0 -56
  367. package/src/renderer/footer-tips.ts +0 -53
  368. package/src/renderer/fullscreen-primitives.ts +0 -146
  369. package/src/renderer/fullscreen-workspace.ts +0 -194
  370. package/src/renderer/hint-grammar.ts +0 -52
  371. package/src/renderer/modal-factory.ts +0 -480
  372. package/src/renderer/overlay-box.ts +0 -154
  373. package/src/renderer/overlay-viewport.ts +0 -104
  374. package/src/renderer/panel-composite.ts +0 -145
  375. package/src/renderer/panel-workspace-bar.ts +0 -54
  376. package/src/renderer/process-indicator.ts +0 -163
  377. package/src/renderer/tab-strip.ts +0 -222
  378. package/src/renderer/text-layout.ts +0 -31
  379. package/src/renderer/tool-call.ts +0 -276
  380. package/src/renderer/tool-result-expanded-lines.ts +0 -48
  381. package/src/renderer/tool-result-summary.ts +0 -219
  382. package/src/runtime/diagnostics/panels/index.ts +0 -21
  383. package/src/runtime/diagnostics/panels/ops.ts +0 -156
  384. package/src/runtime/perf/panel-contracts.ts +0 -32
  385. package/src/runtime/store/domains/panels.ts +0 -117
  386. /package/src/{panels → views}/memory-consolidation-gateway.ts +0 -0
  387. /package/src/{panels → views}/modals/modal-theme.ts +0 -0
  388. /package/src/{panels → views}/provider-health-domains.ts +0 -0
@@ -7,10 +7,10 @@
7
7
  // pickAttemptWinner, the same seam the fleet.attempts.* gateway verbs use).
8
8
  // This module drives that seam from the /workstream command:
9
9
  // • list , the held-merge groups awaiting a pick, with candidates.
10
- // • diff <c> , one candidate's worktree diff in the existing DiffPanel.
10
+ // • diff <c> , one candidate's worktree diff in a Changes preview.
11
11
  // • judge , the OPTIONAL model proposal, clearly labelled a model
12
12
  // judgment (scoredBy 'model'), with its reasons; never a pick.
13
- // • pick <c> , behind a DiffPanel confirm; merges the winner and lets
13
+ // • pick <c> , behind a question on its Changes preview; merges the winner and lets
14
14
  // the engine clean the losers, then renders the receipt.
15
15
  // ---------------------------------------------------------------------------
16
16
 
@@ -24,7 +24,6 @@ import { AttemptError } from '@pellux/goodvibes-sdk/platform/orchestration';
24
24
  import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
25
25
  import type { CommandContext } from '../command-registry.ts';
26
26
  import type { WorkstreamCommandService } from '@pellux/goodvibes-sdk/platform/orchestration';
27
- import { requirePanelManager } from './runtime-services.ts';
28
27
  import { describeFailureReason, isTurnBudgetReason } from '../../core/turn-budget-outcome.ts';
29
28
  import { type AttemptGraphItem, renderDependentHoldLines } from './workstream-attempt-dependents.ts';
30
29
 
@@ -183,15 +182,9 @@ export async function handleAttemptsSubcommand(ctx: CommandContext, service: Wor
183
182
  ctx.print(`Attempt ${cand.attemptIndex + 1} has no viewable diff (${cand.state === 'failed' ? 'it failed' : 'its worktree was already cleaned'}).`);
184
183
  return true;
185
184
  }
186
- const { DiffPanel } = await import('../../panels/diff-panel.ts');
187
- const pm = requirePanelManager(ctx);
188
- let panel = pm.getAllOpen().find((p) => p.id === 'diff');
189
- if (!panel) { try { panel = pm.open('diff'); } catch { ctx.print('Could not open the diff panel.'); return true; } }
190
- pm.activateById('diff');
191
- if (!pm.isVisible()) pm.show();
192
- ctx.focusPanels?.();
193
- (panel as InstanceType<typeof DiffPanel>).loadRawDiff(cand.diff.unifiedDiff);
194
- ctx.print(`Showing attempt ${cand.attemptIndex + 1} ("${cand.title}") diff in the diff panel.`);
185
+ if (!ctx.previewChanges) { ctx.print('Showing a diff needs the Changes view, which is not available in this session.'); return true; }
186
+ void ctx.previewChanges({ title: `attempt ${cand.attemptIndex + 1}: ${cand.title}`, diff: cand.diff.unifiedDiff });
187
+ ctx.print(`Showing attempt ${cand.attemptIndex + 1} ("${cand.title}") in Changes.`);
195
188
  ctx.renderRequest();
196
189
  return true;
197
190
  }
@@ -204,42 +197,26 @@ export async function handleAttemptsSubcommand(ctx: CommandContext, service: Wor
204
197
  if ('error' in cand) { ctx.print(cand.error); return true; }
205
198
  if (cand.state !== 'held-merge') { ctx.print(`Attempt ${cand.attemptIndex + 1} failed: only a held (pick-ready) candidate can win.`); return true; }
206
199
 
207
- const { DiffPanel } = await import('../../panels/diff-panel.ts');
208
- const pm = requirePanelManager(ctx);
209
- let panel = pm.getAllOpen().find((p) => p.id === 'diff');
210
- if (!panel) { try { panel = pm.open('diff'); } catch { ctx.print('Could not open the diff panel to confirm.'); return true; } }
211
- pm.activateById('diff');
212
- if (!pm.isVisible()) pm.show();
213
- ctx.focusPanels?.();
214
- const diffPanel = panel as InstanceType<typeof DiffPanel>;
215
- if (cand.diff?.unifiedDiff.trim()) diffPanel.loadRawDiff(cand.diff.unifiedDiff);
216
- else diffPanel.showDiff(cand.title, '@@ pick @@\n (no diff to preview for this candidate)');
217
-
218
- diffPanel.confirmOverlay.arm({
219
- id: `${group.groupId}:${cand.itemId}`,
220
- label: `Pick attempt ${cand.attemptIndex + 1} ("${cand.title}"): merge it, clean the ${group.candidates.length - 1} other worktree(s)`,
221
- verb: 'Pick',
222
- onConfirm: async () => {
223
- try {
224
- const result = await service.engine.pickAttemptWinner(group.groupId, cand.itemId);
225
- pm.close('diff');
226
- ctx.focusPrompt?.();
227
- ctx.print(renderPickReceipt(result));
228
- } catch (err) {
229
- pm.close('diff');
230
- ctx.focusPrompt?.();
231
- ctx.print(err instanceof AttemptError ? `Pick refused: ${err.message}` : `Pick failed: ${summarizeError(err)}`);
232
- }
233
- ctx.renderRequest();
234
- },
235
- onCancel: () => {
236
- pm.close('diff');
237
- ctx.focusPrompt?.();
238
- ctx.print('Pick cancelled: nothing merged, no worktree cleaned.');
239
- ctx.renderRequest();
240
- },
200
+ if (!ctx.previewChanges) { ctx.print('Confirming a pick needs the Changes view, which is not available in this session.'); return true; }
201
+ ctx.print(`Confirm the pick in Changes: Enter or y merges attempt ${cand.attemptIndex + 1} and cleans the losers, n or Esc cancels.`);
202
+ ctx.renderRequest();
203
+ const confirmed = await ctx.previewChanges({
204
+ title: `attempt ${cand.attemptIndex + 1}: ${cand.title}`,
205
+ diff: cand.diff?.unifiedDiff.trim() ? cand.diff.unifiedDiff : undefined,
206
+ note: cand.diff?.unifiedDiff.trim() ? undefined : 'This candidate has no diff to preview.',
207
+ question: { text: `Pick attempt ${cand.attemptIndex + 1} ("${cand.title}")? It merges, and the ${group.candidates.length - 1} other worktree(s) are cleaned.`, confirmLabel: 'Pick', tone: 'warning' },
241
208
  });
242
- ctx.print(`Confirm the pick in the diff panel: Enter/y to merge attempt ${cand.attemptIndex + 1} and clean the losers, n/Esc to cancel.`);
209
+ if (!confirmed) {
210
+ ctx.print('Pick cancelled: nothing merged, no worktree cleaned.');
211
+ ctx.renderRequest();
212
+ return true;
213
+ }
214
+ try {
215
+ const result = await service.engine.pickAttemptWinner(group.groupId, cand.itemId);
216
+ ctx.print(renderPickReceipt(result));
217
+ } catch (err) {
218
+ ctx.print(err instanceof AttemptError ? `Pick refused: ${err.message}` : `Pick failed: ${summarizeError(err)}`);
219
+ }
243
220
  ctx.renderRequest();
244
221
  return true;
245
222
  }
@@ -8,7 +8,7 @@
8
8
  // already is (bootstrap-command-context.ts).
9
9
  //
10
10
  // Render precedent: TRANSCRIPT + subcommand approve (like /plan approve,
11
- // planning-runtime.ts), NOT a panel, a multi-phase proposal is too rich for
11
+ // planning-runtime.ts), NOT a modal, a multi-phase proposal is too rich for
12
12
  // a one-line confirm overlay, and Pillar-3 doctrine keeps work visible in the
13
13
  // transcript. create -> approve -> launch is a real three-step flow (edit and
14
14
  // cancel apply to the pending proposal too). The transcript IS the plan-review
@@ -126,7 +126,7 @@ async function launchApprovedDraft(ctx: CommandContext, service: WorkstreamComma
126
126
  ctx.print(`Could not launch ${id}.`);
127
127
  return;
128
128
  }
129
- ctx.print(`Launched workstream ${result.workstreamId}: track it with /workstream status ${result.workstreamId} or the Fleet panel.`);
129
+ ctx.print(`Launched workstream ${result.workstreamId}: track it with /workstream status ${result.workstreamId} or in Agents (F2).`);
130
130
  }
131
131
 
132
132
  /**
@@ -1,7 +1,7 @@
1
1
  import { getPersistedWorktreeMeta, reviewWorktreeAttachments, summarizeWorktreeOwnership } from '@/runtime/index.ts';
2
2
  import type { ManagedWorktreeMeta } from '@/runtime/index.ts';
3
3
  import type { CommandRegistry } from '../command-registry.ts';
4
- import { openCommandPanel, requireShellPaths } from './runtime-services.ts';
4
+ import { openCommandView, requireShellPaths } from './runtime-services.ts';
5
5
  import { describeOperatorRpcError, getOperatorRpc } from './operator-rpc.ts';
6
6
 
7
7
  /** Compact per-row setup-state tag for /worktree review, absent when setup has never run; failure stands out. */
@@ -43,7 +43,7 @@ export function registerWorktreeRuntimeCommands(registry: CommandRegistry): void
43
43
  return;
44
44
  }
45
45
  if (sub === 'panel' || sub === 'open') {
46
- openCommandPanel(ctx, 'worktrees');
46
+ openCommandView(ctx, 'worktrees');
47
47
  return;
48
48
  }
49
49
  if (sub === 'inspect') {
@@ -149,7 +149,7 @@ export function registerWorktreeRuntimeCommands(registry: CommandRegistry): void
149
149
  // Discard is a real destructive act, not a metadata flip: route it
150
150
  // through the worktrees.discard operator verb (preservation commit,
151
151
  // git worktree removal, honest receipt), the SAME behavior as the
152
- // Fleet panel's D key. Typing the verb with an explicit path is the
152
+ // Agents modal's D key. Typing the verb with an explicit path is the
153
153
  // confirmation.
154
154
  const path = args[1];
155
155
  if (!path) {
@@ -57,6 +57,7 @@ import { registerServicesRuntimeCommands } from './commands/services-runtime.ts'
57
57
  import { registerTasksRuntimeCommands } from './commands/tasks-runtime.ts';
58
58
  import { registerLocalProviderRuntimeCommands } from './commands/local-provider-runtime.ts';
59
59
  import { registerHealthRuntimeCommands } from './commands/health-runtime.ts';
60
+ import { registerStatusRuntimeCommands } from './commands/status-runtime.ts';
60
61
  import { registerClusterRuntimeCommands } from './commands/cluster-runtime.ts';
61
62
  import { registerSettingsSyncRuntimeCommands } from './commands/settings-sync-runtime.ts';
62
63
  import { registerWorktreeRuntimeCommands } from './commands/worktree-runtime.ts';
@@ -145,10 +146,11 @@ export const BUILTIN_COMMAND_GROUPS: readonly BuiltinCommandGroup[] = [
145
146
  { category: 'Tasks', register: registerTasksRuntimeCommands },
146
147
  { category: 'Local Providers', register: registerLocalProviderRuntimeCommands },
147
148
  { category: 'Health', register: registerHealthRuntimeCommands },
149
+ { category: 'Health', register: registerStatusRuntimeCommands },
148
150
  { category: 'Cluster', register: registerClusterRuntimeCommands },
149
151
  { category: 'Settings Sync', register: registerSettingsSyncRuntimeCommands },
150
152
  { category: 'Worktrees', register: registerWorktreeRuntimeCommands },
151
- { category: 'Fleet', register: registerAcpRuntimeCommands },
153
+ { category: 'Agents', register: registerAcpRuntimeCommands },
152
154
  { category: 'Provider Accounts', register: registerProviderAccountsRuntimeCommands },
153
155
  { category: 'Local Auth', register: registerLocalAuthRuntimeCommands },
154
156
  { category: 'Intelligence', register: registerIntelligenceRuntimeCommands },
@@ -136,3 +136,47 @@ export function makeComposerEditorOpener(deps: ComposerEditorOpenerDeps): () =>
136
136
  },
137
137
  });
138
138
  }
139
+
140
+ /** Editors known to take `+<line> <file>` to open at a line. */
141
+ const LINE_ARG_EDITORS = new Set(['vi', 'vim', 'nvim', 'nano', 'emacs', 'micro', 'kak', 'hx', 'helix', 'ne', 'joe', 'mg']);
142
+
143
+ export interface FileEditorOpenerDeps {
144
+ readonly stdin: { setRawMode(on: boolean): unknown };
145
+ readonly stdout: { write(seq: string): unknown };
146
+ readonly writeGuard: (fn: () => void) => void;
147
+ readonly repaint: () => void;
148
+ readonly cwd: string;
149
+ readonly env: NodeJS.ProcessEnv;
150
+ readonly notify: (message: string) => void;
151
+ readonly spawn?: EditorSpawn;
152
+ }
153
+
154
+ /**
155
+ * Build `openFileInEditor`: suspend the TUI, run $VISUAL / $EDITOR on a file
156
+ * (at a line when the editor is known to take `+<line>`), then restore and
157
+ * repaint. The Changes modal's `o` uses this.
158
+ */
159
+ export function makeFileEditorOpener(deps: FileEditorOpenerDeps): (path: string, line?: number) => void {
160
+ return (path, line) => {
161
+ const editor = resolveEditorCommand(deps.env);
162
+ if (!editor) {
163
+ deps.notify('[Editor] Set $EDITOR or $VISUAL to open files in an external editor.');
164
+ return;
165
+ }
166
+ const base = editor.cmd.split('/').pop() ?? editor.cmd;
167
+ const lineArgs = line !== undefined && line > 0 && LINE_ARG_EDITORS.has(base) ? [`+${line}`] : [];
168
+ const spawn = deps.spawn ?? defaultSpawn;
169
+ try { deps.stdin.setRawMode(false); } catch { /* stdin may not be a TTY */ }
170
+ deps.writeGuard(() => deps.stdout.write(LEAVE_TUI));
171
+ let result: EditorSpawnResult;
172
+ try {
173
+ result = spawn(editor.cmd, [...editor.args, ...lineArgs, path], { cwd: deps.cwd, env: deps.env });
174
+ } finally {
175
+ deps.writeGuard(() => deps.stdout.write(ENTER_TUI));
176
+ try { deps.stdin.setRawMode(true); } catch { /* stdin may not be a TTY */ }
177
+ deps.repaint();
178
+ }
179
+ if (result.error) deps.notify(`[Editor] Failed to launch ${editor.cmd}: ${result.error.message}`);
180
+ else if (result.status !== 0 && result.status !== null) deps.notify(`[Editor] ${editor.cmd} exited with code ${result.status}.`);
181
+ };
182
+ }
@@ -2,7 +2,7 @@
2
2
  * Composer concealed-input mode.
3
3
  *
4
4
  * Generalizes the masking that previously lived only on the two purpose-built
5
- * auth surfaces (local-auth panel, onboarding wizard) into the MAIN composer,
5
+ * auth surfaces (local-auth modal, onboarding wizard) into the MAIN composer,
6
6
  * so any password-like prompt can request concealed entry: the typed text is
7
7
  * masked in the composer AND never reaches input history or the transcript
8
8
  * plaintext. The plaintext is delivered exactly once, to the requester's
@@ -1,4 +1,10 @@
1
- import type { ModalSectionStyle } from '../renderer/modal-factory.ts';
1
+ /** A row's text style in a config modal (foreground, background, weight). */
2
+ export interface ModalSectionStyle {
3
+ fg?: string;
4
+ bg?: string;
5
+ bold?: boolean;
6
+ dim?: boolean;
7
+ }
2
8
 
3
9
  /**
4
10
  * Config-modal host, the shared seam every MIGRATE-TO-MODAL surface
@@ -37,6 +43,12 @@ export interface ConfigModalRow {
37
43
  * up/down navigation and never receives an action. Defaults to selectable.
38
44
  */
39
45
  readonly selectable?: boolean;
46
+ /**
47
+ * A group header (a section title such as "Next steps"): drawn as a kit
48
+ * group header (✦ lowercase accent) with a blank row above it. Always
49
+ * non-selectable and never filtered out.
50
+ */
51
+ readonly header?: boolean;
40
52
  }
41
53
 
42
54
  /** One tab (section) of a surface. Tabs are switched with left/right or Tab. */
@@ -79,8 +91,8 @@ export interface ConfigModalActionContext {
79
91
  /** Print a line to the conversation transcript. */
80
92
  readonly print: (message: string) => void;
81
93
  /**
82
- * Execute a slash command, the same seam panels used via
83
- * `PanelIntegrationContext.executeCommand`. This is how a migrated action
94
+ * Execute a slash command, the seam a migrated action
95
+ * uses to reach its existing command. This is how a migrated action
84
96
  * preserves parity: the mutation still runs through its existing, tested
85
97
  * command (e.g. `/settings-sync resolve`, `/local-auth delete-user`).
86
98
  */
@@ -124,10 +136,10 @@ export interface ConfigModalAction {
124
136
  /**
125
137
  * Trigger key: a single printable char ('r', 'd') or a named key ('enter').
126
138
  * Must not collide with the host-reserved nav keys (up/down/left/right/tab/
127
- * j/k/escape/'/'), those are consumed by the host before actions are
128
- * consulted. '/' arms the host's type-to-filter (item 1); while
129
- * filtering, EVERY printable key (not just j/k) is captured by the query
130
- * instead of firing an action, see handleConfigModalToken.
139
+ * escape), those are consumed by the host before actions are consulted.
140
+ * The search row is always live: a printable key that matches an action
141
+ * fires the action only while the query is empty; otherwise it is typed
142
+ * into the query, see handleConfigModalToken.
131
143
  */
132
144
  readonly key: string;
133
145
  /** Action id passed to `onAction`. */
@@ -151,7 +163,7 @@ export interface ConfigModalAction {
151
163
  /**
152
164
  * A named config-modal surface. Pure seam, the host knows nothing about the
153
165
  * surface's data. Built once (closing over its read-models) and registered on
154
- * PanelManager via `registerModalSurface`; opened by name from a panel-id
166
+ * the panel manager via `registerModalSurface`; opened by name from a view-id
155
167
  * redirect hit or `ctx.openModal(name)`.
156
168
  */
157
169
  export interface ConfigModalSurface {