@pellux/goodvibes-tui 2.0.21 → 2.1.1

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 (391) hide show
  1. package/CHANGELOG.md +65 -1
  2. package/README.md +30 -29
  3. package/docs/README.md +8 -5
  4. package/docs/foundation-artifacts/operator-contract.json +1 -1
  5. package/package.json +28 -19
  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-reference.ts +2 -2
  52. package/src/input/command-registry.ts +77 -35
  53. package/src/input/commands/acp-runtime.ts +19 -9
  54. package/src/input/commands/channel-runtime.ts +2 -2
  55. package/src/input/commands/ci-runtime.ts +1 -1
  56. package/src/input/commands/codebase-runtime.ts +1 -1
  57. package/src/input/commands/config.ts +7 -1
  58. package/src/input/commands/context-window.ts +25 -19
  59. package/src/input/commands/control-room-runtime.ts +18 -18
  60. package/src/input/commands/conversation-runtime.ts +0 -1
  61. package/src/input/commands/cost-runtime.ts +29 -20
  62. package/src/input/commands/diff-runtime.ts +35 -181
  63. package/src/input/commands/eval.ts +1 -1
  64. package/src/input/commands/experience-runtime.ts +3 -7
  65. package/src/input/commands/fresh-conversation.ts +86 -0
  66. package/src/input/commands/git-runtime.ts +5 -22
  67. package/src/input/commands/graph-runtime.ts +1 -1
  68. package/src/input/commands/guidance-runtime.ts +1 -1
  69. package/src/input/commands/health-runtime.ts +8 -9
  70. package/src/input/commands/hooks-runtime.ts +2 -2
  71. package/src/input/commands/hosted-runtime.ts +3 -3
  72. package/src/input/commands/incident-runtime.ts +3 -3
  73. package/src/input/commands/intelligence-runtime.ts +6 -9
  74. package/src/input/commands/knowledge.ts +2 -2
  75. package/src/input/commands/legacy-panel-command.ts +57 -0
  76. package/src/input/commands/local-auth-runtime.ts +8 -9
  77. package/src/input/commands/local-provider-runtime.ts +7 -4
  78. package/src/input/commands/local-runtime.ts +12 -15
  79. package/src/input/commands/local-setup-review.ts +1 -1
  80. package/src/input/commands/local-setup.ts +13 -19
  81. package/src/input/commands/memory.ts +1 -1
  82. package/src/input/commands/notify-runtime.ts +9 -0
  83. package/src/input/commands/operator-runtime.ts +10 -12
  84. package/src/input/commands/permissions-provenance.ts +3 -3
  85. package/src/input/commands/planning-runtime.ts +7 -7
  86. package/src/input/commands/platform-sandbox-runtime.ts +2 -2
  87. package/src/input/commands/platform-services-runtime.ts +1 -1
  88. package/src/input/commands/policy-dispatch.ts +2 -2
  89. package/src/input/commands/policy.ts +3 -3
  90. package/src/input/commands/provider.ts +1 -1
  91. package/src/input/commands/remote-runtime.ts +1 -1
  92. package/src/input/commands/review-runtime.ts +39 -94
  93. package/src/input/commands/rewind-runtime.ts +81 -108
  94. package/src/input/commands/runtime-services.ts +15 -17
  95. package/src/input/commands/services-runtime.ts +2 -2
  96. package/src/input/commands/session-content.ts +21 -5
  97. package/src/input/commands/session-workflow.ts +13 -38
  98. package/src/input/commands/settings-sync-runtime.ts +2 -2
  99. package/src/input/commands/shell-core.ts +19 -4
  100. package/src/input/commands/skills-runtime.ts +2 -2
  101. package/src/input/commands/status-runtime.ts +13 -0
  102. package/src/input/commands/subscription-runtime.ts +1 -1
  103. package/src/input/commands/tasks-runtime.ts +2 -8
  104. package/src/input/commands/work-plan-runtime.ts +4 -4
  105. package/src/input/commands/workstream-attempts.ts +24 -47
  106. package/src/input/commands/workstream-runtime.ts +2 -2
  107. package/src/input/commands/worktree-runtime.ts +3 -3
  108. package/src/input/commands.ts +3 -1
  109. package/src/input/composer-editor.ts +44 -0
  110. package/src/input/concealed-input.ts +1 -1
  111. package/src/input/config-modal-types.ts +20 -8
  112. package/src/input/config-modal.ts +106 -105
  113. package/src/input/confirm-dialog-types.ts +28 -0
  114. package/src/input/confirm-dialog.ts +70 -0
  115. package/src/input/delete-key-policy.ts +3 -3
  116. package/src/input/feed-context-factory.ts +15 -16
  117. package/src/input/handler-command-route.ts +7 -42
  118. package/src/input/handler-content-actions.ts +16 -15
  119. package/src/input/handler-feed-routes.ts +26 -211
  120. package/src/input/handler-feed.ts +68 -95
  121. package/src/input/handler-interactions.ts +5 -3
  122. package/src/input/handler-modal-routes.ts +215 -216
  123. package/src/input/handler-modal-stack.ts +81 -11
  124. package/src/input/handler-modal-token-routes.ts +4 -0
  125. package/src/input/handler-onboarding.ts +0 -1
  126. package/src/input/handler-picker-routes.ts +65 -107
  127. package/src/input/handler-session-view-route.ts +149 -0
  128. package/src/input/handler-shortcuts.ts +16 -154
  129. package/src/input/handler-types.ts +4 -2
  130. package/src/input/handler-ui-state.ts +45 -15
  131. package/src/input/handler-work-tree-route.ts +123 -0
  132. package/src/input/handler.ts +25 -70
  133. package/src/input/keybindings.ts +16 -71
  134. package/src/input/masked-entry-modal.ts +117 -0
  135. package/src/input/mcp-workspace.ts +48 -17
  136. package/src/input/model-picker-filter.ts +8 -0
  137. package/src/input/model-picker-open.ts +99 -0
  138. package/src/input/model-picker-types.ts +1 -1
  139. package/src/input/model-picker.ts +92 -9
  140. package/src/input/notifications-modal.ts +123 -0
  141. package/src/input/overlay-filter.ts +26 -0
  142. package/src/input/profile-picker-modal.ts +37 -8
  143. package/src/input/search.ts +3 -3
  144. package/src/input/selection-modal-queue.ts +2 -0
  145. package/src/input/selection-modal.ts +28 -16
  146. package/src/input/session-picker-modal.ts +33 -8
  147. package/src/input/settings-modal-activation.ts +7 -2
  148. package/src/input/settings-modal-data.ts +11 -6
  149. package/src/input/settings-modal-types.ts +1 -1
  150. package/src/input/settings-modal.ts +20 -20
  151. package/src/input/submission-intent.ts +1 -1
  152. package/src/input/submission-router.ts +4 -9
  153. package/src/input/surface-modal-host.ts +110 -0
  154. package/src/input/theme-settings-actions.ts +82 -0
  155. package/src/input/usage-modal.ts +183 -0
  156. package/src/input/views.ts +97 -0
  157. package/src/main.ts +175 -165
  158. package/src/permissions/hunk-selection.ts +1 -1
  159. package/src/permissions/prompt-card.ts +511 -0
  160. package/src/permissions/prompt.ts +59 -622
  161. package/src/renderer/agents-modal.ts +310 -0
  162. package/src/renderer/autocomplete-overlay.ts +42 -220
  163. package/src/renderer/back-to-bottom.ts +80 -0
  164. package/src/renderer/block-actions-overlay.ts +30 -48
  165. package/src/renderer/bookmark-modal.ts +48 -79
  166. package/src/renderer/changes-modal.ts +325 -0
  167. package/src/renderer/code-block.ts +184 -106
  168. package/src/renderer/command-palette.ts +93 -0
  169. package/src/renderer/composer-fragments.ts +4 -4
  170. package/src/renderer/composer.ts +146 -0
  171. package/src/renderer/compositor.ts +26 -160
  172. package/src/renderer/config-modal.ts +185 -81
  173. package/src/renderer/confirm-dialog.ts +50 -0
  174. package/src/renderer/context-inspector.ts +116 -154
  175. package/src/renderer/context-status-hint.ts +4 -4
  176. package/src/renderer/conversation-layout.ts +20 -0
  177. package/src/renderer/conversation-overlays.ts +94 -84
  178. package/src/renderer/conversation-surface.ts +19 -38
  179. package/src/renderer/diff-tint.ts +98 -0
  180. package/src/renderer/file-picker-overlay.ts +63 -90
  181. package/src/renderer/footer-targets.ts +38 -0
  182. package/src/renderer/git-status.ts +3 -4
  183. package/src/renderer/header-line.ts +140 -117
  184. package/src/renderer/help-overlay.ts +133 -219
  185. package/src/renderer/history-search-overlay.ts +15 -12
  186. package/src/renderer/lane-graph/bead.ts +800 -0
  187. package/src/renderer/lane-graph/glyphs.ts +134 -0
  188. package/src/renderer/lane-graph/layout.ts +248 -0
  189. package/src/renderer/lane-graph/paint.ts +537 -0
  190. package/src/renderer/lane-graph/semantic-memo.ts +77 -0
  191. package/src/renderer/layout-engine.ts +2 -57
  192. package/src/renderer/layout.ts +7 -13
  193. package/src/renderer/markdown-inline.ts +2 -1
  194. package/src/renderer/markdown-table.ts +17 -12
  195. package/src/renderer/markdown.ts +92 -34
  196. package/src/renderer/masked-entry-modal.ts +78 -0
  197. package/src/renderer/mcp-workspace.ts +166 -203
  198. package/src/renderer/model-workspace.ts +381 -436
  199. package/src/renderer/notifications-modal.ts +116 -0
  200. package/src/renderer/onboarding/onboarding-wizard.ts +178 -588
  201. package/src/renderer/process-view.ts +192 -0
  202. package/src/renderer/profile-picker-modal.ts +58 -110
  203. package/src/renderer/search-overlay.ts +6 -3
  204. package/src/renderer/selection-modal-overlay.ts +87 -327
  205. package/src/renderer/semantic-diff.ts +2 -2
  206. package/src/renderer/session-chips.ts +102 -0
  207. package/src/renderer/session-picker-modal.ts +177 -297
  208. package/src/renderer/settings-modal-connections.ts +14 -23
  209. package/src/renderer/settings-modal-context.ts +367 -0
  210. package/src/renderer/settings-modal-helpers.ts +6 -11
  211. package/src/renderer/settings-modal.ts +322 -726
  212. package/src/renderer/shell-surface.ts +277 -175
  213. package/src/renderer/shortcuts-overlay.ts +217 -0
  214. package/src/renderer/status-line.ts +475 -0
  215. package/src/renderer/surface-compose.ts +174 -0
  216. package/src/renderer/surface-kit-extra.ts +303 -0
  217. package/src/renderer/surface-kit-list.ts +366 -0
  218. package/src/renderer/surface-kit-parts.ts +360 -0
  219. package/src/renderer/surface-kit.ts +568 -0
  220. package/src/renderer/syntax-highlighter.ts +280 -197
  221. package/src/renderer/syntax-theme.ts +51 -0
  222. package/src/renderer/system-message.ts +0 -1
  223. package/src/renderer/term-caps.ts +42 -1
  224. package/src/renderer/terminal-bg-probe.ts +116 -19
  225. package/src/renderer/terminal-palette-probe.ts +322 -0
  226. package/src/renderer/terminal-palette-reader.ts +183 -0
  227. package/src/renderer/terminal-palette.ts +58 -0
  228. package/src/renderer/theme-mode-config.ts +16 -1
  229. package/src/renderer/theme.ts +234 -207
  230. package/src/renderer/thinking.ts +0 -1
  231. package/src/renderer/throbber.ts +188 -0
  232. package/src/renderer/toast-center.ts +119 -0
  233. package/src/renderer/ui-factory.ts +39 -602
  234. package/src/renderer/ui-primitives.ts +8 -25
  235. package/src/renderer/usage-modal.ts +353 -0
  236. package/src/renderer/user-message.ts +58 -0
  237. package/src/renderer/voice-capture-chip.ts +53 -0
  238. package/src/runtime/bootstrap-command-context.ts +0 -5
  239. package/src/runtime/bootstrap-command-parts.ts +38 -89
  240. package/src/runtime/bootstrap-core.ts +13 -15
  241. package/src/runtime/bootstrap-hook-bridge.ts +12 -21
  242. package/src/runtime/bootstrap-notifier-sync.ts +17 -1
  243. package/src/runtime/bootstrap-shell.ts +16 -50
  244. package/src/runtime/bootstrap.ts +14 -14
  245. package/src/runtime/client/fleet-union.ts +5 -5
  246. package/src/runtime/client/hosted-exit.ts +2 -2
  247. package/src/runtime/client/hosted-sessions.ts +1 -1
  248. package/src/runtime/client/spine-adoption.ts +1 -1
  249. package/src/runtime/context-accounting-source.ts +5 -4
  250. package/src/runtime/index.ts +1 -0
  251. package/src/runtime/notification-dispatch.ts +102 -29
  252. package/src/runtime/recovery-offer-wiring.ts +4 -1
  253. package/src/runtime/recovery-prompt.ts +31 -15
  254. package/src/runtime/runtime-services-types.ts +10 -6
  255. package/src/runtime/services.ts +17 -12
  256. package/src/runtime/session-continuity-hints.ts +2 -5
  257. package/src/runtime/session-inbound-inputs.ts +1 -1
  258. package/src/runtime/session-resume-liveness-confirm.ts +14 -2
  259. package/src/runtime/startup-typeahead-gate.ts +103 -0
  260. package/src/runtime/store/domains/domain-read-matrix.ts +0 -1
  261. package/src/runtime/store/domains/index.ts +0 -8
  262. package/src/runtime/store/selectors/index.ts +0 -28
  263. package/src/runtime/store/state.ts +0 -8
  264. package/src/runtime/ui-services.ts +4 -6
  265. package/src/runtime/usage-tracker.ts +348 -0
  266. package/src/runtime/wrfc-persistence.ts +4 -4
  267. package/src/shell/blocking-input.ts +92 -2
  268. package/src/shell/recovery-input-helpers.ts +1 -1
  269. package/src/shell/session-views.ts +539 -0
  270. package/src/shell/status-report.ts +86 -0
  271. package/src/shell/transcript-scroll.ts +68 -0
  272. package/src/shell/ui-openers.ts +84 -172
  273. package/src/shell/view-openers.ts +205 -0
  274. package/src/tools/wrfc-agent-guard.ts +22 -2
  275. package/src/utils/format-duration.ts +4 -8
  276. package/src/utils/splash-lines.ts +9 -1
  277. package/src/utils/terminal-width.ts +56 -0
  278. package/src/verification/live-verifier.ts +0 -10
  279. package/src/version.ts +1 -1
  280. package/src/{panels → views}/agent-inspector-shared.ts +2 -2
  281. package/src/{panels → views}/builtin-modals.ts +22 -21
  282. package/src/views/builtin-views.ts +135 -0
  283. package/src/{panels → views}/confirm-state.ts +9 -9
  284. package/src/{panels → views}/diff-review-model.ts +10 -3
  285. package/src/{panels → views}/eval-registry.ts +1 -1
  286. package/src/{panels → views}/fleet-acts.ts +49 -85
  287. package/src/{panels/fleet-panel-format.ts → views/fleet-format.ts} +40 -40
  288. package/src/{panels → views}/fleet-gateway.ts +5 -5
  289. package/src/{panels → views}/fleet-observed-render.ts +16 -16
  290. package/src/{panels → views}/fleet-read-model.ts +9 -9
  291. package/src/{panels/fleet-tabs.ts → views/fleet-session-tabs.ts} +13 -13
  292. package/src/{panels → views}/fleet-spawn.ts +33 -49
  293. package/src/{panels → views}/fleet-steer.ts +12 -12
  294. package/src/{panels → views}/fleet-stop.ts +4 -4
  295. package/src/{panels → views}/fleet-transcript.ts +26 -27
  296. package/src/{panels/fleet-panel-worktree-detail.ts → views/fleet-worktree-detail.ts} +7 -7
  297. package/src/{panels → views}/hosted-session-feed.ts +6 -6
  298. package/src/views/modal-surface-registry.ts +41 -0
  299. package/src/{panels → views}/modals/devices-modal.ts +2 -2
  300. package/src/{panels → views}/modals/hooks-modal.ts +13 -13
  301. package/src/{panels → views}/modals/keybindings-modal.ts +19 -27
  302. package/src/{panels → views}/modals/knowledge-modal.ts +6 -5
  303. package/src/{panels → views}/modals/local-auth-modal.ts +22 -21
  304. package/src/{panels → views}/modals/marketplace-modal.ts +11 -11
  305. package/src/{panels → views}/modals/memory-modal.ts +8 -8
  306. package/src/{panels → views}/modals/modal-surface-helpers.ts +15 -5
  307. package/src/{panels → views}/modals/pairing-modal.ts +9 -9
  308. package/src/{panels → views}/modals/planning-modal.ts +15 -20
  309. package/src/{panels → views}/modals/plugins-modal.ts +6 -6
  310. package/src/{panels → views}/modals/policy-modal.ts +13 -5
  311. package/src/{panels → views}/modals/provider-health-modal.ts +4 -4
  312. package/src/{panels → views}/modals/remote-modal.ts +3 -3
  313. package/src/{panels → views}/modals/sandbox-modal.ts +4 -4
  314. package/src/{panels → views}/modals/security-modal.ts +22 -16
  315. package/src/{panels → views}/modals/services-modal.ts +3 -3
  316. package/src/{panels → views}/modals/settings-sync-modal.ts +4 -4
  317. package/src/{panels → views}/modals/skills-modal.ts +9 -9
  318. package/src/{panels → views}/modals/subscription-modal.ts +3 -3
  319. package/src/{panels → views}/modals/work-plan-modal.ts +10 -13
  320. package/src/views/notifications-feed.ts +314 -0
  321. package/src/{panels → views}/polish-core.ts +38 -36
  322. package/src/{panels → views}/polish-tables.ts +35 -26
  323. package/src/{panels → views}/polish.ts +101 -95
  324. package/src/{panels → views}/project-planning-answer-actions.ts +3 -3
  325. package/src/{panels → views}/provider-health-routes.ts +14 -14
  326. package/src/{panels → views}/search-focus.ts +8 -8
  327. package/src/{panels → views}/session-maintenance.ts +11 -11
  328. package/src/views/skills-discovery.ts +159 -0
  329. package/src/views/view-deps.ts +80 -0
  330. package/src/views/view-panel-adapter.ts +53 -0
  331. package/src/{panels → views}/workstream-graph-render.ts +1 -1
  332. package/src/core/conversation-fold.ts +0 -101
  333. package/src/core/conversation-turn-structure.ts +0 -464
  334. package/src/core/conversation-user-receipts.ts +0 -42
  335. package/src/input/commands/operator-panel-runtime.ts +0 -186
  336. package/src/input/panel-integration-actions.ts +0 -33
  337. package/src/input/panel-mouse-geometry.ts +0 -97
  338. package/src/input/panel-paste-flood-guard.ts +0 -86
  339. package/src/panels/base-panel.ts +0 -301
  340. package/src/panels/builtin/agent.ts +0 -27
  341. package/src/panels/builtin/development.ts +0 -92
  342. package/src/panels/builtin/knowledge.ts +0 -12
  343. package/src/panels/builtin/operations.ts +0 -177
  344. package/src/panels/builtin/session.ts +0 -81
  345. package/src/panels/builtin/shared.ts +0 -357
  346. package/src/panels/builtin-panels.ts +0 -28
  347. package/src/panels/cost-tracker-panel.ts +0 -746
  348. package/src/panels/diff-panel.ts +0 -797
  349. package/src/panels/diff-review-panel.ts +0 -395
  350. package/src/panels/expandable-list-panel.ts +0 -189
  351. package/src/panels/fleet-deep-link.ts +0 -31
  352. package/src/panels/fleet-panel.ts +0 -799
  353. package/src/panels/git-panel.ts +0 -800
  354. package/src/panels/hosted-session-panel.ts +0 -221
  355. package/src/panels/index.ts +0 -21
  356. package/src/panels/local-auth-panel.ts +0 -478
  357. package/src/panels/notifications-feed.ts +0 -127
  358. package/src/panels/notifications-panel.ts +0 -160
  359. package/src/panels/panel-confirm-overlay.ts +0 -72
  360. package/src/panels/panel-manager.ts +0 -791
  361. package/src/panels/plugins-panel.ts +0 -371
  362. package/src/panels/scrollable-list-panel.ts +0 -498
  363. package/src/panels/skills-panel.ts +0 -454
  364. package/src/panels/token-budget-panel.ts +0 -688
  365. package/src/panels/types.ts +0 -191
  366. package/src/panels/wrfc-panel-format.ts +0 -133
  367. package/src/renderer/diff-view.ts +0 -134
  368. package/src/renderer/fleet-tab-strip.ts +0 -56
  369. package/src/renderer/footer-tips.ts +0 -53
  370. package/src/renderer/fullscreen-primitives.ts +0 -146
  371. package/src/renderer/fullscreen-workspace.ts +0 -194
  372. package/src/renderer/hint-grammar.ts +0 -52
  373. package/src/renderer/modal-factory.ts +0 -480
  374. package/src/renderer/overlay-box.ts +0 -154
  375. package/src/renderer/overlay-viewport.ts +0 -104
  376. package/src/renderer/panel-composite.ts +0 -145
  377. package/src/renderer/panel-workspace-bar.ts +0 -54
  378. package/src/renderer/process-indicator.ts +0 -163
  379. package/src/renderer/tab-strip.ts +0 -222
  380. package/src/renderer/text-layout.ts +0 -31
  381. package/src/renderer/tool-call.ts +0 -276
  382. package/src/renderer/tool-result-expanded-lines.ts +0 -48
  383. package/src/renderer/tool-result-summary.ts +0 -219
  384. package/src/runtime/diagnostics/panels/index.ts +0 -21
  385. package/src/runtime/diagnostics/panels/ops.ts +0 -156
  386. package/src/runtime/perf/panel-contracts.ts +0 -32
  387. package/src/runtime/store/domains/panels.ts +0 -117
  388. package/src/verification/verification-ledger.ts +0 -707
  389. /package/src/{panels → views}/memory-consolidation-gateway.ts +0 -0
  390. /package/src/{panels → views}/modals/modal-theme.ts +0 -0
  391. /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 {