@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
@@ -2,6 +2,15 @@ import type { CommandRegistry } from '../command-registry.ts';
2
2
  import { requireWebhookNotifier } from './runtime-services.ts';
3
3
 
4
4
  export function registerNotifyRuntimeCommands(registry: CommandRegistry): void {
5
+ registry.register({
6
+ name: 'notifications',
7
+ aliases: [],
8
+ description: 'Open the notification history: everything collected, newest first; Enter goes to its subject',
9
+ handler(_args, ctx) {
10
+ if (ctx.openNotifications) ctx.openNotifications();
11
+ else ctx.print('The Notifications view is not available in this session.');
12
+ },
13
+ });
5
14
  registry.register({
6
15
  name: 'notify',
7
16
  aliases: [],
@@ -2,14 +2,14 @@ import type { CommandRegistry } from '../command-registry.ts';
2
2
  import { ToolContractVerifier } from '@/runtime/index.ts';
3
3
  import type { ReplaySnapshotInput } from '@/runtime/index.ts';
4
4
  import { logger } from '@pellux/goodvibes-sdk/platform/utils';
5
- import { registerOperatorPanelCommand } from './operator-panel-runtime.ts';
5
+ import { registerLegacyPanelCommand } from './legacy-panel-command.ts';
6
6
  import { requireOpsApi, requireProfileManager, requireReplayEngine } from './runtime-services.ts';
7
7
  import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
8
8
  import { estimateConversationTokens } from '@pellux/goodvibes-sdk/platform/core';
9
9
  import { handleContextWindowSubcommand } from './context-window.ts';
10
10
 
11
11
  export function registerOperatorRuntimeCommands(registry: CommandRegistry): void {
12
- registerOperatorPanelCommand(registry);
12
+ registerLegacyPanelCommand(registry);
13
13
 
14
14
  registry.register({
15
15
  name: 'settings',
@@ -187,12 +187,10 @@ export function registerOperatorRuntimeCommands(registry: CommandRegistry): void
187
187
  const sub = args[0];
188
188
 
189
189
  if (sub === 'view' || sub === undefined) {
190
- // Parity with the Ctrl+O keybind (handler-shortcuts.ts): prefer the
191
- // flag-wired opener, else fall back to the always-registered panel,
192
- // which renders its own honest not-configured state.
193
- if (ctx.openOpsPanel) ctx.openOpsPanel();
194
- else if (ctx.showPanel) ctx.showPanel('ops-control');
195
- else ctx.print('Operator Control Plane panel is not available in this shell.');
190
+ // The flag-wired opener when the control plane is on, else the
191
+ // Agents view, which holds the live operations content either way.
192
+ if (ctx.openOpsView) ctx.openOpsView();
193
+ else if (!ctx.openView?.('ops-control')) ctx.print('The Agents view is not available in this shell.');
196
194
  return;
197
195
  }
198
196
 
@@ -242,7 +240,7 @@ export function registerOperatorRuntimeCommands(registry: CommandRegistry): void
242
240
 
243
241
  ctx.print(
244
242
  'Usage: /ops <subcommand>\n'
245
- + ' /ops view — open the Ops Control panel (Ctrl+O)\n'
243
+ + ' /ops view — open Agents (F2 or Ctrl+O)\n'
246
244
  + ' /ops task cancel <id> [note] — cancel a task\n'
247
245
  + ' /ops task pause <id> [note] — pause a task\n'
248
246
  + ' /ops task resume <id> [note] — resume a blocked task\n'
@@ -310,8 +308,8 @@ export function registerOperatorRuntimeCommands(registry: CommandRegistry): void
310
308
  handler(args, ctx) {
311
309
  const sub = args[0];
312
310
  if (sub === undefined || sub === 'view') {
313
- if (ctx.openForensicsPanel) ctx.openForensicsPanel();
314
- else ctx.print('Forensics panel is not available.');
311
+ if (ctx.openForensicsView) ctx.openForensicsView();
312
+ else ctx.print('The Agents view is not available.');
315
313
  return;
316
314
  }
317
315
  if (sub === 'latest') {
@@ -391,7 +389,7 @@ export function registerOperatorRuntimeCommands(registry: CommandRegistry): void
391
389
  }
392
390
  ctx.print(
393
391
  'Usage: /forensics <subcommand>\n'
394
- + ' /forensics — open the Forensics panel\n'
392
+ + ' /forensics — open Agents on forensics\n'
395
393
  + ' /forensics latest — print the most recent failure report summary\n'
396
394
  + ' /forensics show <id> — show full JSON for a specific report\n'
397
395
  + ' /forensics export <id> — export incident bundle JSON to the conversation'
@@ -4,7 +4,7 @@ import { CONFIG_SCHEMA } from '@pellux/goodvibes-sdk/platform/config';
4
4
  import { SHIPPED_CREDENTIAL_READ_RULES } from '@pellux/goodvibes-sdk/platform/permissions';
5
5
 
6
6
  // ---------------------------------------------------------------------------
7
- // /permissions provenance panel.
7
+ // /permissions provenance report.
8
8
  //
9
9
  // Shows every permission-relevant setting in effect AND where each value came
10
10
  // from. Provenance is taken from the platform's own ConfigManager.
@@ -58,7 +58,7 @@ export interface PermissionProvenance {
58
58
  readonly shippedRules: readonly ShippedPolicyRuleRow[];
59
59
  }
60
60
 
61
- /** The permission-relevant settings, in the order the panel lists them. */
61
+ /** The permission-relevant settings, in the order the report lists them. */
62
62
  const PERMISSION_KEYS: readonly { readonly key: string; readonly label: string; readonly note?: string }[] = [
63
63
  { key: 'permissions.mode', label: 'Permission mode', note: 'also the current session mode' },
64
64
  { key: 'permissions.backgroundAgents', label: 'Background-agent mode' },
@@ -218,7 +218,7 @@ function displayValue(value: unknown): string {
218
218
  return JSON.stringify(value);
219
219
  }
220
220
 
221
- /** Render the provenance panel as plain lines for the command surface. */
221
+ /** Render the provenance report as plain lines for the command surface. */
222
222
  export function renderPermissionProvenance(provenance: PermissionProvenance): string {
223
223
  const lines: string[] = [
224
224
  'Permissions: settings in effect and where each came from',
@@ -80,7 +80,7 @@ export function registerPlanningRuntimeCommands(registry: CommandRegistry): void
80
80
 
81
81
  const projectPlanningService = ctx.workspace.projectPlanningService;
82
82
  const projectId = ctx.workspace.projectPlanningProjectId;
83
- const openProjectPlanningPanel = () => openModalCommand(ctx, 'planning-modal');
83
+ const openProjectPlanningModal = () => openModalCommand(ctx, 'planning-modal');
84
84
 
85
85
  if (args.length === 0) {
86
86
  if (projectPlanningService && projectId) {
@@ -95,7 +95,7 @@ export function registerPlanningRuntimeCommands(registry: CommandRegistry): void
95
95
  const { evaluation } = stateResult.state
96
96
  ? await persistEvaluatedNextQuestion(projectPlanningService, projectId, stateResult.state, initialEvaluation)
97
97
  : { evaluation: initialEvaluation };
98
- openProjectPlanningPanel();
98
+ openProjectPlanningModal();
99
99
  ctx.print(
100
100
  `Project planning: ${evaluation.readiness}\n` +
101
101
  `Project: ${status.projectId}\n` +
@@ -116,8 +116,8 @@ export function registerPlanningRuntimeCommands(registry: CommandRegistry): void
116
116
  }
117
117
 
118
118
  if (args[0] === 'panel') {
119
- openProjectPlanningPanel();
120
- ctx.print('Opened project planning panel.');
119
+ openProjectPlanningModal();
120
+ ctx.print('Opened project planning.');
121
121
  return;
122
122
  }
123
123
 
@@ -144,7 +144,7 @@ export function registerPlanningRuntimeCommands(registry: CommandRegistry): void
144
144
  },
145
145
  });
146
146
  const evaluation = await projectPlanningService.evaluate({ projectId });
147
- openProjectPlanningPanel();
147
+ openProjectPlanningModal();
148
148
  ctx.print(`Project planning approved. Readiness: ${evaluation.readiness}. State: ${result.state?.id ?? 'current'}.`);
149
149
  return;
150
150
  }
@@ -255,7 +255,7 @@ export function registerPlanningRuntimeCommands(registry: CommandRegistry): void
255
255
  }
256
256
  return;
257
257
  }
258
- openProjectPlanningPanel();
258
+ openProjectPlanningModal();
259
259
  ctx.print(
260
260
  `Recorded answer to: ${answerResult.question?.prompt ?? 'question'}\n` +
261
261
  `Readiness: ${answerResult.evaluation.readiness}\n` +
@@ -307,7 +307,7 @@ export function registerPlanningRuntimeCommands(registry: CommandRegistry): void
307
307
  ? await persistEvaluatedNextQuestion(projectPlanningService, projectId, result.state, initialEvaluation)
308
308
  : { state: result.state, evaluation: initialEvaluation };
309
309
  sessionLineageTracker.setOriginalTask(taskDescription.slice(0, 200));
310
- openProjectPlanningPanel();
310
+ openProjectPlanningModal();
311
311
 
312
312
  ctx.print(
313
313
  `Project planning seeded: "${state?.goal ?? taskDescription}"\n` +
@@ -1,7 +1,7 @@
1
1
  import { mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
2
2
  import { dirname, resolve } from 'node:path';
3
3
  import type { CommandRegistry } from '../command-registry.ts';
4
- import { requirePanelManager, requireShellPaths } from './runtime-services.ts';
4
+ import { requireShellPaths } from './runtime-services.ts';
5
5
  import {
6
6
  getSandboxPreset,
7
7
  inspectSandboxBundle,
@@ -98,7 +98,7 @@ export function registerPlatformSandboxRuntimeCommands(registry: CommandRegistry
98
98
  const shellPaths = requireShellPaths(ctx);
99
99
  const sub = args[0] ?? 'open';
100
100
  if (sub === 'open' || sub === 'panel') {
101
- ctx.openModal?.('sandbox-modal'); // sandbox panel -> config modal
101
+ ctx.openModal?.('sandbox-modal'); // sandbox view -> config modal
102
102
  return;
103
103
  }
104
104
  if (sub === 'review') {
@@ -147,7 +147,7 @@ export function registerPlatformServicesRuntimeCommands(registry: CommandRegistr
147
147
  ` tasks: ${review.tasks}`,
148
148
  ` pending approvals: ${review.pendingApprovals}`,
149
149
  ` remote contracts: ${review.remoteContracts}`,
150
- ` registered panels: ${review.panels}`,
150
+ ` registered views: ${review.panels}`,
151
151
  ' api families:',
152
152
  ...review.apiFamilies.map((family) => ` - ${family}`),
153
153
  ' routes:',
@@ -289,7 +289,7 @@ async function handleStatus(_args: string[], context: CommandContext): Promise<v
289
289
  export function renderPolicyUsage(): string {
290
290
  return [
291
291
  'Usage: /policy <subcommand>',
292
- ' /policy — open the policy/governance panel',
292
+ ' /policy — open the policy/governance modal',
293
293
  ' load <bundle-id> [rule-count] — Load a candidate bundle',
294
294
  ' simulate [mode] — Run simulation (silent|warn|enforce)',
295
295
  ' diff — Show rule diff (current vs candidate)',
@@ -302,7 +302,7 @@ export function renderPolicyUsage(): string {
302
302
  }
303
303
 
304
304
  // W6 command-path parity: the policy modal dropped its 'r' (record a
305
- // divergence-dashboard trend sample) action because the panel used to call
305
+ // divergence-dashboard trend sample) action because the old view called
306
306
  // this._state.recordTrendEntry() directly and /policy had no equivalent verb.
307
307
  // This exposes it as a thin wrapper: recordTrendEntry() forwards to the attached
308
308
  // DivergencePanel, so it only captures a sample while a simulation dashboard is
@@ -4,12 +4,12 @@ import { dispatchPolicyCommand } from './policy-dispatch.ts';
4
4
  export const policyCommand: SlashCommand = {
5
5
  name: 'policy',
6
6
  aliases: ['pol'],
7
- description: 'Open the policy panel or manage versioned policy bundles (load, simulate, diff, promote, rollback)',
7
+ description: 'Open the policy modal or manage versioned policy bundles (load, simulate, diff, promote, rollback)',
8
8
  usage: '<subcommand> [args]',
9
9
  argsHint: 'load|simulate|diff|lint|preflight|promote|rollback|status',
10
10
  handler: async (args: string[], context: CommandContext): Promise<void> => {
11
- if (args.length === 0 && context.openPolicyPanel) {
12
- context.openPolicyPanel();
11
+ if (args.length === 0 && context.openPolicyView) {
12
+ context.openPolicyView();
13
13
  return;
14
14
  }
15
15
  await dispatchPolicyCommand(args, context);
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * /provider command handler.
3
3
  *
4
- * Implements the Provider Optimizer panel commands:
4
+ * Implements the Provider Optimizer commands:
5
5
  *
6
6
  * /provider optimizer on|off , Enable or disable the provider optimizer
7
7
  * /provider route auto|manual , Set optimizer routing mode
@@ -48,7 +48,7 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
48
48
  async handler(args, ctx) {
49
49
  if (args.length === 0) {
50
50
  if (ctx.openModal) {
51
- ctx.openModal('remote-modal'); // remote panel -> config modal
51
+ ctx.openModal('remote-modal'); // remote view -> config modal
52
52
  return;
53
53
  }
54
54
  ctx.print('Remote surface is not available in this runtime.');
@@ -1,8 +1,6 @@
1
1
  import type { CommandContext, CommandRegistry } from '../command-registry.ts';
2
- import type { DiffReviewPanel } from '../../panels/diff-review-panel.ts';
3
- import type { ReviewHunk } from '../../panels/diff-review-model.ts';
4
- import { hunkPatchText, buildHunkRevertReceiptBlock } from '../../panels/diff-review-model.ts';
5
- import { requirePanelManager } from './runtime-services.ts';
2
+ import type { ReviewHunk } from '../../views/diff-review-model.ts';
3
+ import { hunkPatchText, buildHunkRevertReceiptBlock } from '../../views/diff-review-model.ts';
6
4
 
7
5
  /** checkpoints.revertHunkPreview result, the read-only clean-or-conflict check plus a confirm token. */
8
6
  interface RevertHunkPreview {
@@ -50,17 +48,17 @@ function errorText(err: unknown): string {
50
48
  }
51
49
 
52
50
  /**
53
- * Reject one hunk: checkpoints.revertHunkPreview (read-only clean check + token)
54
- * → DiffPanel confirm of exactly what reverts → checkpoints.revertHunk with that
55
- * token. A stale hunk is an honest "changed since captured" with a refresh, never
56
- * a partial write; a success renders the HUNK_REVERTED receipt into the transcript
57
- * and refreshes the review panel so the reverted hunk disappears from the diff.
51
+ * Revert one hunk in the working tree: checkpoints.revertHunkPreview (a
52
+ * read-only clean check that returns a token), a confirm dialog naming exactly
53
+ * what reverts, then checkpoints.revertHunk with that token. A hunk that no
54
+ * longer applies is an honest "changed since captured", never a partial write;
55
+ * a success adds the [Revert] receipt to the transcript. Resolves to the line
56
+ * the Changes modal shows.
58
57
  */
59
- async function revertHunkFlow(ctx: CommandContext, panel: DiffReviewPanel, hunk: ReviewHunk): Promise<void> {
58
+ export async function revertReviewHunk(ctx: CommandContext, hunk: ReviewHunk): Promise<string> {
60
59
  const gateway = ctx.workspace.gatewayMethods;
61
60
  if (!gateway || !ctx.workspace.workspaceCheckpointManager) {
62
- panel.note('Hunk revert unavailable: the checkpoint/gateway surface is not wired in this session.');
63
- return;
61
+ return 'Hunk revert unavailable: the checkpoint/gateway surface is not wired in this session.';
64
62
  }
65
63
  const path = hunk.filePath;
66
64
  const hunkText = hunkPatchText(hunk);
@@ -70,103 +68,50 @@ async function revertHunkFlow(ctx: CommandContext, panel: DiffReviewPanel, hunk:
70
68
  try {
71
69
  preview = (await gateway.invoke('checkpoints.revertHunkPreview', { ...INVOKE_CONTEXT, body: { path, hunk: hunkText } })) as RevertHunkPreview;
72
70
  } catch (err) {
73
- panel.note(`Could not check this hunk: ${errorText(err)}`);
74
- return;
71
+ return `Could not check this hunk: ${errorText(err)}`;
75
72
  }
76
-
77
73
  if (!preview.applies || !preview.token) {
78
- panel.note(`Cannot revert: ${preview.conflict ?? 'this hunk no longer applies'}. The file changed since this diff was captured; press r again after /review reloads. Nothing was changed.`);
79
- await panel.refresh();
80
- return;
74
+ return `Cannot revert: ${preview.conflict ?? 'this hunk no longer applies'}. The file changed since this diff was captured; the view has been reloaded. Nothing was changed.`;
81
75
  }
82
76
 
83
- const { DiffPanel } = await import('../../panels/diff-panel.ts');
84
- const pm = requirePanelManager(ctx);
85
- let diff = pm.getAllOpen().find((p) => p.id === 'diff');
86
- if (!diff) {
87
- try { diff = pm.open('diff'); } catch { panel.note('Could not open the diff panel to confirm the revert.'); return; }
88
- }
89
- pm.activateById('diff');
90
- if (!pm.isVisible()) pm.show();
91
- ctx.focusPanels?.();
92
- const diffPanel = diff as InstanceType<typeof DiffPanel>;
93
- diffPanel.showDiff(path, hunkText);
77
+ const summary = `Restores ${preview.removedLinesRestored} deleted and drops ${preview.addedLinesRemoved} added line(s) in ${path} (${hunk.header}).`;
78
+ const confirmed = ctx.confirm
79
+ ? await ctx.confirm({ title: 'Revert this hunk?', body: `${summary}\nThe receipt in the transcript says how to undo it.`, confirmLabel: 'Revert', tone: 'danger' })
80
+ : false;
81
+ if (!confirmed) return 'Revert cancelled: nothing changed.';
94
82
 
95
- const summary = `restore ${preview.removedLinesRestored} deleted / drop ${preview.addedLinesRemoved} added line(s)`;
96
- diffPanel.confirmOverlay.arm({
97
- id: `${path}:${hunk.header}`,
98
- label: `Revert hunk in ${path}: ${summary}`,
99
- verb: 'Revert',
100
- onConfirm: async () => {
101
- let result: RevertHunkResult;
102
- try {
103
- result = (await gateway.invoke('checkpoints.revertHunk', { ...INVOKE_CONTEXT, body: { path, hunk: hunkText, confirmToken: preview.token, sessionId } })) as RevertHunkResult;
104
- } catch (err) {
105
- pm.close('diff');
106
- ctx.focusPanels?.();
107
- if (isConflict(err)) {
108
- panel.note(`Not reverted: ${errorText(err)}. The file changed since captured; nothing was written. Reloading /review…`);
109
- await panel.refresh();
110
- } else {
111
- panel.note(`Revert failed: ${errorText(err)}`);
112
- }
113
- return;
114
- }
115
- pm.close('diff');
116
- ctx.focusPanels?.();
117
- const receipt = result.receipt;
118
- if (!receipt) {
119
- panel.note(`Revert not applied: ${result.refusal?.reason ?? 'confirmation was refused.'}`);
120
- return;
121
- }
122
- ctx.session.conversationManager.addTypedSystemMessage(buildHunkRevertReceiptBlock(receipt), 'operational');
123
- await panel.refresh();
124
- },
125
- onCancel: () => {
126
- pm.close('diff');
127
- ctx.focusPanels?.();
128
- panel.note('Revert cancelled: nothing changed.');
129
- },
130
- });
131
- ctx.renderRequest();
83
+ let result: RevertHunkResult;
84
+ try {
85
+ result = (await gateway.invoke('checkpoints.revertHunk', { ...INVOKE_CONTEXT, body: { path, hunk: hunkText, confirmToken: preview.token, sessionId } })) as RevertHunkResult;
86
+ } catch (err) {
87
+ return isConflict(err)
88
+ ? `Not reverted: ${errorText(err)}. The file changed since captured; nothing was written.`
89
+ : `Revert failed: ${errorText(err)}`;
90
+ }
91
+ const receipt = result.receipt;
92
+ if (!receipt) return `Revert not applied: ${result.refusal?.reason ?? 'confirmation was refused.'}`;
93
+ ctx.session.conversationManager.addTypedSystemMessage(buildHunkRevertReceiptBlock(receipt), 'operational');
94
+ return `Reverted the hunk in ${receipt.path}; the receipt is in the transcript.`;
132
95
  }
133
96
 
134
97
  /**
135
- * `/review`, open the comment-on-hunk review loop. Loads this session's file
136
- * changes (the files the SDK SessionChangeTracker recorded) as a git working-
137
- * tree diff, hunk-boundaried, and wires the panel's steering submit path to the
138
- * session so an attached comment is sent to the model as a steering message with
139
- * structured context (file path, line range, patch excerpt). A hunk can also be
140
- * rejected: `r` reverse-applies exactly that one hunk via checkpoints.revertHunk
141
- * (preview + confirm), a working-tree change recorded as a [Revert] receipt.
98
+ * `/review`, the comment-on-hunk review loop, in the Changes modal: this
99
+ * session's file changes (the files the SDK SessionChangeTracker recorded) as a
100
+ * working-tree diff, hunk by hunk. c attaches a comment to a hunk and Enter
101
+ * sends the attached comments to the model as one steering message with each
102
+ * hunk's file, line range and patch excerpt; x reverts a hunk (asks first).
142
103
  */
143
104
  export function registerReviewRuntimeCommands(registry: CommandRegistry): void {
144
105
  registry.register({
145
106
  name: 'review',
146
107
  aliases: [],
147
108
  description: 'Review this session\'s diff hunk-by-hunk, steer comments, or revert a hunk',
148
- async handler(_args, ctx) {
149
- const pm = requirePanelManager(ctx);
150
- let panel = pm.getAllOpen().find((p) => p.id === 'review');
151
- if (!panel) {
152
- try {
153
- panel = pm.open('review');
154
- } catch {
155
- ctx.print('Could not open the review panel.');
156
- return;
157
- }
158
- }
159
- pm.activateById('review');
160
- if (!pm.isVisible()) pm.show();
161
-
162
- const reviewPanel = panel as DiffReviewPanel;
163
- if (ctx.submitInput) {
164
- reviewPanel.setSubmit((text) => ctx.submitInput!(text));
109
+ handler(_args, ctx) {
110
+ if (!ctx.openChanges) {
111
+ ctx.print('The Changes view is not available in this session.');
112
+ return;
165
113
  }
166
- reviewPanel.setRevertHandler((hunk) => { void revertHunkFlow(ctx, reviewPanel, hunk); });
167
- await reviewPanel.loadSessionReview();
168
- ctx.focusPanels?.();
169
- ctx.renderRequest();
114
+ ctx.openChanges({ source: 'session' });
170
115
  },
171
116
  });
172
117
  }