@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
@@ -1,177 +0,0 @@
1
- import type { PanelManager } from '../panel-manager.ts';
2
- import { FleetPanel } from '../fleet-panel.ts';
3
- import { FleetActs, type FleetDiffSurface } from '../fleet-acts.ts';
4
- import { createFleetGateway } from '../fleet-gateway.ts';
5
- import { FleetSpawn, createAcpSpawnGateway } from '../fleet-spawn.ts';
6
- import { DiffPanel } from '../diff-panel.ts';
7
- import { LocalAuthPanel } from '../local-auth-panel.ts';
8
- import { NotificationsPanel } from '../notifications-panel.ts';
9
- import type { ResolvedBuiltinPanelDeps } from './shared.ts';
10
- import { requireUiServices } from './shared.ts';
11
- import { GOODVIBES_TUI_SURFACE_ROOT } from '../../config/surface.ts';
12
-
13
- // the former single 'monitoring' category (33 panels pre-merge) is
14
- // split into five operator domains, applied per-registration below. Kept in
15
- // this file's original registration order (rather than physically regrouped
16
- // by category) because several registrations below close over shared local
17
- // state, `ui`, defined once near the top of this function.
18
- //
19
- // (the purge): cockpit, approval, automation, routes, control-plane,
20
- // worktrees, tasks, orchestration, ops, ops-control, and communication were
21
- // RETIRE-INTO-FLEET (their live views are subsumed by the Fleet panel below
22
- //, each id now redirects there via registerAlias); debug and eval were
23
- // DELETE-disposition (no surviving human surface). See
24
- // .goodvibes/audit/2026-07-04-wave6-briefs.json for the full
25
- // disposition map. The rosterReadModel/agent-lifecycle wiring that used to
26
- // feed CockpitPanel exclusively was removed along with it, Fleet reads the
27
- // process registry directly via fleetReadModel below, not via the roster
28
- // read-model.
29
- //
30
- // MIGRATE-TO-MODAL: the Providers & Connectivity group (services,
31
- // subscription, remote, provider-health) and Security group (settings-sync,
32
- // sandbox) migrated to config-modal surfaces registered in builtin-modals.ts
33
- //; the Ecosystem & Governance group (plugins, skills, hooks, security,
34
- // marketplace, policy, knowledge, memory, docs, qr-code, work-plan,
35
- // project-planning) migrated to config-modal surfaces. All surfaces AND
36
- // their panel-id redirects are registered centrally in registerBuiltinModals
37
- // (builtin-modals.ts) now, the interim ecosystem redirect bridge was deleted
38
- // with the group-B port. local-auth is a DELIBERATE EXCEPTION, see below.
39
- export function registerOperationsPanels(manager: PanelManager, deps: ResolvedBuiltinPanelDeps): void {
40
- const ui = requireUiServices(deps);
41
-
42
- // Fleet, everything running, not just what this terminal started. The read
43
- // model is composed once in runtime/services.ts (so its refresh timer has an
44
- // owner that stops it) and unions this surface's own live process registry
45
- // with the adopted daemon's rows; see runtime/client/fleet-union.ts for who
46
- // wins on a shared id and why the daemon half is polled rather than streamed.
47
- const fleetReadModel = ui.runtime.fleetReadModel;
48
-
49
- // The Fleet panel's waiting-on-human acts (pick / conflict / discard) drive
50
- // gateway verbs over the same operator invoke path the command layer uses, and
51
- // reuse the shared DiffPanel (candidate diffs + the pick confirm overlay) and
52
- // the CI fix-session jump affordance. Built here so the panel stays thin.
53
- const fleetNotify = deps.fleetActsNotify ?? (() => {});
54
- const armFixSessionAttach = deps.armFixSessionAttach ?? (() => {});
55
- const diffSurface: FleetDiffSurface = {
56
- show: (_title, unifiedDiff) => {
57
- let panel = manager.getAllOpen().find((p) => p.id === 'diff');
58
- if (!panel) { try { panel = manager.open('diff'); } catch { return; } }
59
- manager.activateById('diff');
60
- if (!manager.isVisible()) manager.show();
61
- manager.focusPanels();
62
- (panel as DiffPanel).loadRawDiff(unifiedDiff);
63
- },
64
- armConfirm: (opts) => {
65
- let panel = manager.getAllOpen().find((p) => p.id === 'diff');
66
- if (!panel) { try { panel = manager.open('diff'); } catch { return; } }
67
- manager.activateById('diff');
68
- if (!manager.isVisible()) manager.show();
69
- manager.focusPanels();
70
- (panel as DiffPanel).confirmOverlay.arm(opts);
71
- },
72
- close: () => { manager.close('diff'); },
73
- };
74
- const fleetActs = new FleetActs({
75
- resolveGateway: () => createFleetGateway({
76
- configManager: deps.configManager,
77
- homeDirectory: ui.environment.shellPaths.homeDirectory,
78
- armFixSessionAttach,
79
- }),
80
- diffSurface,
81
- notify: fleetNotify,
82
- markDirty: deps.requestRender ?? (() => {}),
83
- findNode: (nodeId: string) => fleetReadModel.getSnapshot().rows.find((r) => r.node.id === nodeId)?.node ?? null,
84
- });
85
-
86
- // The ACP spawn affordance ('n'): host a discovered third-party agent as an
87
- // acp-agent row over the same operator invoke path the acts use.
88
- const fleetSpawn = new FleetSpawn({
89
- resolveGateway: () => createAcpSpawnGateway({
90
- configManager: deps.configManager,
91
- homeDirectory: ui.environment.shellPaths.homeDirectory,
92
- }),
93
- currentDirectory: () => ui.environment.shellPaths.workingDirectory,
94
- notify: fleetNotify,
95
- markDirty: deps.requestRender ?? (() => {}),
96
- });
97
-
98
- manager.registerType({
99
- id: 'fleet',
100
- name: 'Fleet',
101
- // '⊟' verified free against the full icon registry at wiring time.
102
- icon: '⊟',
103
- category: 'runtime-ops',
104
- description: 'Live unified process tree: agents, WRFC chains, workflows, watchers, and background processes, with interrupt/kill/steer controls',
105
- factory: () => new FleetPanel(fleetReadModel, {
106
- interrupt: (id: string) => fleetReadModel.interrupt(id),
107
- // Re-arm a paused trigger/schedule/automation job.
108
- resume: (id: string) => fleetReadModel.resume(id),
109
- kill: (id: string, opts: { cascade: boolean }) => fleetReadModel.kill(id, opts),
110
- // Full-fidelity transcript source for an attached agent
111
- // tab, live while the agent runs, frozen briefly after it completes
112
- // (AgentManager's bounded retention ring), empty once evicted (the
113
- // panel degrades to the on-disk ledger fallback in that case).
114
- getConversationSnapshot: (agentId: string) => ui.agents.agentManager.getConversationSnapshot(agentId),
115
- resolveSessionLogPath: (agentId: string) => ui.environment.shellPaths.resolveProjectPath(GOODVIBES_TUI_SURFACE_ROOT, 'sessions', `${agentId}.jsonl`),
116
- // Queue a message for a live in-process agent/wrfc-subtask member.
117
- steer: (id: string, text: string) => fleetReadModel.steer(id, text),
118
- }, deps.configManager, fleetActs, fleetSpawn),
119
- });
120
-
121
- // Compat: '/panel open <id>' (and any saved layout/muscle memory) for
122
- // every retired runtime-ops console still resolves, redirected to fleet,
123
- // which absorbs orchestration, permissions, communication, task, and
124
- // process-tree views (see FleetPanel's own description above).
125
- manager.registerAlias('cockpit', 'fleet');
126
- manager.registerAlias('approval', 'fleet');
127
- manager.registerAlias('automation', 'fleet');
128
- manager.registerAlias('routes', 'fleet');
129
- manager.registerAlias('control-plane', 'fleet');
130
- manager.registerAlias('worktrees', 'fleet');
131
- manager.registerAlias('tasks', 'fleet');
132
- manager.registerAlias('orchestration', 'fleet');
133
- manager.registerAlias('ops', 'fleet');
134
- manager.registerAlias('ops-control', 'fleet');
135
- manager.registerAlias('communication', 'fleet');
136
- manager.registerAlias('incident', 'fleet');
137
- // Re-pointed: forensics used to resolve to the (now-retired) incident
138
- // workspace; both ids now land on fleet directly, alias
139
- // resolution is a single hop, so this cannot chain through 'incident'.
140
- manager.registerAlias('forensics', 'fleet');
141
-
142
- // Notifications, the visible home for the panel_only notification
143
- // target: anything a NotificationRouter (SDK) routes there (including
144
- // burst/batch-collapsed groups, shown with their real running count)
145
- // renders here instead of having nowhere to go. See notifications-feed.ts
146
- // for why this exists. Not preloaded (only 'tokens' preloads, per the
147
- // panel-consolidation cleanup below), the shared feed singleton
148
- // accumulates independently of whether this view has been opened yet, so
149
- // nothing is lost by instantiating it lazily on first open like every
150
- // other panel here.
151
- manager.registerType({
152
- id: 'notifications',
153
- name: 'Notifications',
154
- icon: 'N',
155
- category: 'runtime-ops',
156
- description: 'Notifications routed to the panel-only target (quiet/balanced-mode operational chatter, burst- and batch-collapsed groups) with their real collapsed counts',
157
- factory: () => new NotificationsPanel(),
158
- });
159
-
160
- // local-auth is a DELIBERATE EXCEPTION to the purge: it stays a
161
- // registered panel because it is the host for the masked password-entry
162
- // sub-mode (LocalAuthPanel.openMaskedEntry, driven by
163
- // ctx.openLocalAuthMaskedEntry, the only path that keeps a plaintext
164
- // password out of argv/history/scrollback). Its browse view is mirrored by
165
- // local-auth-modal (reached via the /local-auth front-door), but the panel
166
- // itself cannot be retired without regressing that secure input, and no
167
- // 'local-auth' modal redirect is registered (so openLocalAuthMaskedEntry's
168
- // showPanel('local-auth') + getPanel('local-auth') still resolve to it).
169
- manager.registerType({
170
- id: 'local-auth',
171
- name: 'Local Auth',
172
- icon: 'U',
173
- category: 'security-policy',
174
- description: 'Local daemon/listener auth users, bootstrap posture, and active sessions (also the masked password-entry host)',
175
- factory: () => new LocalAuthPanel(deps.localUserAuthManager),
176
- });
177
- }
@@ -1,81 +0,0 @@
1
- import type { PanelManager } from '../panel-manager.ts';
2
- import { TokenBudgetPanel } from '../token-budget-panel.ts';
3
- import { HostedSessionPanel } from '../hosted-session-panel.ts';
4
- import type { ResolvedBuiltinPanelDeps } from './shared.ts';
5
- import { requireUiServices } from './shared.ts';
6
-
7
- // (the purge): panel-list and system-messages were registered here
8
- // before the purge, both DELETE-disposition. panel-list was a picker over a
9
- // handful of panels (dead weight now that the registry is much smaller,
10
- // the picker itself is replaced by a live-registry selection modal on
11
- // Ctrl+P, see shell/ui-openers.ts). system-messages' buffered notices are
12
- // rerouted to the transcript's system channel instead of vanishing: with no
13
- // panel attached, SystemMessageRouter's delivery resolution
14
- // (resolveSystemMessageDelivery, SDK) already falls back to
15
- // conversation.addTypedSystemMessage for every kind/target combination, see
16
- // bootstrap-shell.ts and core/system-message-router.ts.
17
- //
18
- // (the purge), group B: 'qr-code', 'sessions', and 'docs' also
19
- // migrated. 'qr-code' → the 'pairing-modal' surface; 'docs' → the
20
- // 'keybindings-modal' surface (merged with the shortcuts-overlay content);
21
- // 'sessions' folds into the existing session-picker modal ('sessions' redirects
22
- // to 'sessionPicker'). Their surfaces AND panel→modal redirects are registered
23
- // centrally in registerBuiltinModals (builtin-modals.ts). Only 'tokens' (KEEP)
24
- // is still registered here.
25
- export function registerSessionPanels(manager: PanelManager, deps: ResolvedBuiltinPanelDeps): void {
26
- manager.registerType({
27
- id: 'tokens',
28
- name: 'Tokens',
29
- // registry previously said 'K' while the live panel's own
30
- // super() call used 'T', a pre-existing registry/instance mismatch as
31
- // well as a collision ('K' with knowledge/skills, 'T' with thinking).
32
- // Unified to a single unique glyph in both places.
33
- icon: '▢',
34
- category: 'providers',
35
- description: 'Token + context console: gauge, true composition, per-turn history, inline cost, and one-key compact',
36
- // Preloaded (absorbed from the retired ContextVisualizerPanel) so turn
37
- // history and pressure accumulate in the background even before the user
38
- // opens the tab. The only builtin panel that still preloads post-purge
39
- //, see registerBuiltinPanels callers for the others' preload
40
- // removal.
41
- preload: true,
42
- retainOnClose: true,
43
- factory: () => {
44
- const panel = new TokenBudgetPanel(
45
- deps.sessionMemoryStore,
46
- deps.configManager,
47
- deps.requestRender,
48
- requireUiServices(deps).events.turns,
49
- );
50
- if (deps.orchestrator && deps.getCtxWindow) {
51
- panel.wire(
52
- deps.orchestrator,
53
- deps.getCtxWindow,
54
- requireUiServices(deps).readModels.session,
55
- () => deps.providerRegistry.getCurrentModel().id,
56
- );
57
- }
58
- return panel;
59
- },
60
- });
61
-
62
- // Hosted Session, a conversation whose loop runs INSIDE the daemon rather
63
- // than in this process, rendered from the same `turn`/`tools` event domains a
64
- // local turn emits (see panels/hosted-session-feed.ts). Not preloaded: a
65
- // terminal that never opts into hosting should not carry an empty tab for it,
66
- // and `/hosted new`/`/hosted attach` open it on the way in.
67
- manager.registerType({
68
- id: 'hosted',
69
- name: 'Hosted Session',
70
- // '◈' verified free against the registered builtin panel icons.
71
- icon: '◈',
72
- category: 'session',
73
- description: 'A daemon-hosted conversation: its live transcript, the tool calls it is running, and what detaching would do to it',
74
- retainOnClose: true,
75
- factory: () => new HostedSessionPanel(),
76
- });
77
-
78
- // compat: the retired 'context' panel id still resolves, redirected
79
- // to the merged tokens console ('/panel open context', saved layouts).
80
- manager.registerAlias('context', 'tokens');
81
- }
@@ -1,357 +0,0 @@
1
- import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
2
- import type { ServiceRegistry } from '@pellux/goodvibes-sdk/platform/config';
3
- import type { ToolRegistry } from '@pellux/goodvibes-sdk/platform/tools';
4
- import type { ProviderRegistry } from '@pellux/goodvibes-sdk/platform/providers';
5
- import type { Orchestrator } from '@pellux/goodvibes-sdk/platform/core';
6
- import type { MemoryAccess } from '@pellux/goodvibes-sdk/platform/runtime/memory-spine';
7
- import type { ApprovalBroker } from '@pellux/goodvibes-sdk/platform/control-plane';
8
- import type { SessionReadFacade } from '@pellux/goodvibes-sdk/platform/runtime/session-spine';
9
- import type { AutomationManager } from '@pellux/goodvibes-sdk/platform/automation';
10
- import type { ControlPlaneRecentEvent } from '@pellux/goodvibes-sdk/platform/control-plane';
11
- import type { UiRuntimeServices } from '../../runtime/ui-services.ts';
12
- import type { PluginManagerControls } from '../plugins-panel.ts';
13
- import type { HookWorkbench } from '@pellux/goodvibes-sdk/platform/hooks';
14
- import type { HookDispatcher } from '@pellux/goodvibes-sdk/platform/hooks';
15
- import type { HookActivityTracker } from '@pellux/goodvibes-sdk/platform/hooks';
16
- import type { McpRegistry } from '@pellux/goodvibes-sdk/platform/mcp';
17
- import type { PolicyRuntimeState } from '@/runtime/index.ts';
18
- import type { SessionManager } from '@pellux/goodvibes-sdk/platform/sessions';
19
- import type { SubscriptionManager } from '@pellux/goodvibes-sdk/platform/config';
20
- import type { UserAuthManager } from '@pellux/goodvibes-sdk/platform/security';
21
- import type { SessionMemoryStore } from '@pellux/goodvibes-sdk/platform/core';
22
- import type { ExecutionPlanManager } from '@pellux/goodvibes-sdk/platform/core';
23
- import type { AdaptivePlanner } from '@pellux/goodvibes-sdk/platform/core';
24
- import type { ProjectPlanningService } from '@pellux/goodvibes-sdk/platform/knowledge';
25
- import type { ApiTokenAuditor } from '@pellux/goodvibes-sdk/platform/security';
26
- import type { ComponentHealthMonitor } from '@pellux/goodvibes-sdk/platform/runtime/observability';
27
- import type { WorktreeRegistry } from '@/runtime/index.ts';
28
- import type { SandboxSessionRegistry } from '@/runtime/index.ts';
29
- import type { OpsApi, PlanRuntimeService } from '@/runtime/index.ts';
30
- import type { WatcherRegistry } from '@pellux/goodvibes-sdk/platform/watchers';
31
- import type { RuntimeStore } from '../../runtime/store/index.ts';
32
- import type { KnowledgeApi } from '@pellux/goodvibes-sdk/platform/knowledge';
33
- import type { SessionChangeTracker } from '@pellux/goodvibes-sdk/platform/sessions';
34
- import type { Line } from '@pellux/goodvibes-sdk/platform/types';
35
- import type { Panel, PanelCategory } from '../types.ts';
36
- import { BasePanel } from '../base-panel.ts';
37
- import { buildEmptyState, buildPanelWorkspace, DEFAULT_PANEL_PALETTE } from '../polish.ts';
38
-
39
- export interface BuiltinPanelDeps {
40
- /** Config manager for settings-sync and other config-backed panels. */
41
- configManager?: ConfigManager;
42
- /** Getter returning the main orchestrator's cumulative token usage. */
43
- getOrchestratorUsage?: () => { input: number; output: number; cacheRead: number; cacheWrite: number; model?: string };
44
- /** Optional cost budget alert threshold in USD (0 = disabled). */
45
- budgetThreshold?: number;
46
- /** Tool registry for Docs panel. */
47
- toolRegistry?: ToolRegistry;
48
- /** Provider registry for Docs panel model list. */
49
- providerRegistry: ProviderRegistry;
50
- /** Local auth manager for panels that inspect shared auth state. */
51
- localUserAuthManager?: UserAuthManager;
52
- /** Session manager for panels that inspect shared session state. */
53
- sessionManager?: SessionManager;
54
- /** Subscription manager for panels that inspect shared provider subscription state. */
55
- subscriptionManager?: SubscriptionManager;
56
- /** Shared service registry for services-backed panels. */
57
- serviceRegistry?: ServiceRegistry;
58
- /** Context window size in tokens. Unused since folded ContextVisualizerPanel into TokenBudgetPanel (which reads getCtxWindow instead); kept for source compatibility. */
59
- contextWindow?: number;
60
- /** Main Orchestrator instance for TokenBudgetPanel.wire(). */
61
- orchestrator?: Orchestrator;
62
- /** Callback returning the current model context window size (for TokenBudgetPanel). */
63
- getCtxWindow?: () => number;
64
- /** Resume a saved session directly through the session controller path. */
65
- resumeSession?: (sessionId: string) => void;
66
- /** Request a shell repaint directly rather than routing through a retired event path. */
67
- requestRender?: () => void;
68
- /** Submit a Planning panel answer through the normal TUI chat/planning coordinator path. */
69
- submitPlanningAnswer?: (answer: string) => void;
70
- /** Pause the TUI-owned planning loop and return focus to normal prompt input. */
71
- dismissPlanning?: () => void;
72
- /** ForensicsRegistry for the Forensics panel. */
73
- forensicsRegistry?: import('@/runtime/index.ts').ForensicsRegistry;
74
- /**
75
- * EvalRegistry for the `/eval` command surface.: 'eval' the panel was
76
- * deleted (DELETE-disposition), but this field is left in place, no
77
- * builtin panel factory reads it anymore, and it was never wired at
78
- * bootstrap in production either way (the eval CLI command reads its own
79
- * copy via CommandContext.extensions.evalRegistry).
80
- */
81
- evalRegistry?: import('../eval-registry.ts').EvalRegistry;
82
- /** Host-vs-client memory access for the Memory modal, the spine client, never the raw registry (routes over the wire when a daemon is adopted). */
83
- memoryRegistry?: MemoryAccess;
84
- /** Shared policy runtime state for governance/policy diagnostics. */
85
- policyRuntimeState?: import('@/runtime/index.ts').PolicyRuntimeState;
86
- /** Approval broker for control-plane/operator panels. */
87
- approvalBroker?: ApprovalBroker;
88
- /**
89
- * Cross-surface session READ facade for control-plane/operator panels.
90
- * Sync listSessions()/getSession() shape preserved; in adopted-daemon mode it
91
- * serves the daemon-hosted union (with an honest offline note when the wire is
92
- * down) instead of only this process's local broker. See session-union-cache.ts.
93
- */
94
- sessionBroker?: SessionReadFacade;
95
- /** Automation manager for schedule/operator panels. */
96
- automationManager?: AutomationManager;
97
- /** Recent control-plane events provider for control-plane/operator panels. */
98
- getControlPlaneRecentEvents?: (limit: number) => readonly ControlPlaneRecentEvent[];
99
- /** Token auditor for the security control-room panel. */
100
- tokenAuditor: ApiTokenAuditor;
101
- /** Shared component-health monitor for rate-limited panels and diagnostics. */
102
- componentHealthMonitor: ComponentHealthMonitor;
103
- /** Shared worktree registry for worktree surfaces. */
104
- worktreeRegistry: WorktreeRegistry;
105
- /** Shared sandbox session registry for sandbox surfaces and tools. */
106
- sandboxSessionRegistry: SandboxSessionRegistry;
107
- /**
108
- * Resolved daemon home directory (e.g. `~/.goodvibes/daemon`), owned by the composition root
109
- * and passed explicitly so panel factories do not discover cwd/home implicitly.
110
- */
111
- daemonHomeDir?: string;
112
- /** Session memory store for context and token budget panels. */
113
- sessionMemoryStore?: SessionMemoryStore;
114
- /** Execution plan manager for plan dashboard panels. */
115
- planManager?: ExecutionPlanManager;
116
- /** Adaptive planner for ops strategy panels. */
117
- adaptivePlanner?: AdaptivePlanner;
118
- /** Passive SDK-backed project planning artifact service. */
119
- projectPlanningService?: ProjectPlanningService;
120
- /** Stable workspace project id for project:<projectId> planning spaces. */
121
- projectPlanningProjectId?: string;
122
- /** TUI-owned persistent work plan store. */
123
- workPlanStore?: import('@pellux/goodvibes-sdk/platform/workflow').WorkPlanStore;
124
- /** Explicit UI-facing runtime services for agent/process/WRFC/remote panels and modals. */
125
- uiServices?: UiRuntimeServices;
126
- /** Shared plugin manager for plugin and security panels (widened past the read-only observer surface, so PluginsPanel can drive enable/disable/verify/lift-quarantine). */
127
- pluginManager?: PluginManagerControls;
128
- /** Shared hook dispatcher for the hooks control-room panel. */
129
- hookDispatcher?: Pick<HookDispatcher, 'listHooks' | 'getChains'>;
130
- /** Shared hook workbench for the hooks control-room panel. */
131
- hookWorkbench?: HookWorkbench;
132
- /** Shared hook activity tracker for the hooks control-room panel. */
133
- hookActivityTracker?: Pick<HookActivityTracker, 'listRecent'>;
134
- /** Shared MCP registry for security panels and MCP workspace commands. */
135
- mcpRegistry?: McpRegistry;
136
- /** Ops control-plane API (cancel/pause/resume/retry) for operator/ops panels to drive real actions. */
137
- opsApi?: OpsApi;
138
- /** Plan runtime service for plan/ops-strategy panels to drive adaptive-planner actions. */
139
- planRuntime?: PlanRuntimeService;
140
- /** Watcher registry for the watchers panel to drive watcher lifecycle actions. */
141
- watcherRegistry?: WatcherRegistry;
142
- /** Root runtime store for panels that need direct selector access to runtime state (see `src/runtime/store/selectors/index.ts`). */
143
- runtimeStore?: RuntimeStore;
144
- /** Knowledge API surface (graph nodes/sources/issues, search, schedules) for the Knowledge panel. */
145
- knowledgeApi?: KnowledgeApi;
146
- /** Optional session change tracker for the Git panel's session-changed file highlights. */
147
- sessionChangeTracker?: Pick<SessionChangeTracker, 'getChangedFiles'>;
148
- /**
149
- * Open (or focus) a panel by id, wrapping `PanelManager.open`. Use for direct
150
- * cross-panel navigation instead of printing a "/panel open …" signpost.
151
- */
152
- openPanel?: (panelId: string) => void;
153
- /**
154
- * Surface a Fleet act result/receipt/error to the operator (late-bound to the
155
- * command context's print, which the Fleet pick/conflict/discard acts use for
156
- * their receipts, the same conversation sink the command flow prints to).
157
- */
158
- fleetActsNotify?: (message: string) => void;
159
- /**
160
- * Hand a spawned session id to the shared one-key jump/attach affordance (the
161
- * CI fix-session machinery). Late-bound: main.ts patches it onto the command
162
- * context after bootstrap; the Fleet conflict-resolve act reuses it verbatim.
163
- */
164
- armFixSessionAttach?: (sessionId: string) => void;
165
- }
166
-
167
- export type ResolvedBuiltinPanelDeps = Omit<
168
- BuiltinPanelDeps,
169
- | 'configManager'
170
- | 'localUserAuthManager'
171
- | 'sessionManager'
172
- | 'subscriptionManager'
173
- | 'serviceRegistry'
174
- | 'sessionMemoryStore'
175
- | 'planManager'
176
- | 'adaptivePlanner'
177
- | 'projectPlanningService'
178
- | 'projectPlanningProjectId'
179
- | 'workPlanStore'
180
- | 'policyRuntimeState'
181
- > & {
182
- readonly configManager: ConfigManager;
183
- readonly localUserAuthManager: UserAuthManager;
184
- readonly sessionManager: SessionManager;
185
- readonly subscriptionManager: SubscriptionManager;
186
- readonly serviceRegistry: ServiceRegistry;
187
- readonly sessionMemoryStore: SessionMemoryStore;
188
- readonly planManager: ExecutionPlanManager;
189
- readonly adaptivePlanner: AdaptivePlanner;
190
- readonly projectPlanningService: ProjectPlanningService;
191
- readonly projectPlanningProjectId: string;
192
- readonly workPlanStore: import('@pellux/goodvibes-sdk/platform/workflow').WorkPlanStore;
193
- readonly policyRuntimeState: PolicyRuntimeState;
194
- };
195
-
196
- function requireBuiltinPanelDep<TValue>(value: TValue | undefined, message: string): TValue {
197
- if (value === undefined) {
198
- throw new Error(message);
199
- }
200
- return value;
201
- }
202
-
203
- export function resolveBuiltinPanelDeps(deps: BuiltinPanelDeps): ResolvedBuiltinPanelDeps {
204
- const uiServices = requireUiServices(deps);
205
- return {
206
- ...deps,
207
- configManager: requireBuiltinPanelDep(
208
- uiServices.platform.configManager,
209
- 'Config manager must be wired at bootstrap for builtin panels.',
210
- ),
211
- localUserAuthManager: requireBuiltinPanelDep(
212
- uiServices.platform.localUserAuthManager,
213
- 'Local auth manager must be wired at bootstrap for builtin panels.',
214
- ),
215
- sessionManager: requireBuiltinPanelDep(
216
- uiServices.sessions.sessionManager,
217
- 'Session manager must be wired at bootstrap for builtin panels.',
218
- ),
219
- subscriptionManager: requireBuiltinPanelDep(
220
- uiServices.platform.subscriptionManager,
221
- 'Subscription manager must be wired at bootstrap for builtin panels.',
222
- ),
223
- serviceRegistry: requireBuiltinPanelDep(
224
- uiServices.platform.serviceRegistry,
225
- 'Service registry must be wired at bootstrap for builtin panels.',
226
- ),
227
- sessionMemoryStore: requireBuiltinPanelDep(
228
- uiServices.sessions.sessionMemoryStore,
229
- 'Session memory store must be wired at bootstrap for builtin panels.',
230
- ),
231
- planManager: requireBuiltinPanelDep(
232
- uiServices.planning.planManager,
233
- 'Execution plan manager must be wired at bootstrap for builtin panels.',
234
- ),
235
- adaptivePlanner: requireBuiltinPanelDep(
236
- uiServices.planning.adaptivePlanner,
237
- 'Adaptive planner must be wired at bootstrap for builtin panels.',
238
- ),
239
- projectPlanningService: requireBuiltinPanelDep(
240
- uiServices.planning.projectPlanningService,
241
- 'Project planning service must be wired at bootstrap for builtin panels.',
242
- ),
243
- projectPlanningProjectId: requireBuiltinPanelDep(
244
- uiServices.planning.projectPlanningProjectId,
245
- 'Project planning project id must be wired at bootstrap for builtin panels.',
246
- ),
247
- workPlanStore: requireBuiltinPanelDep(
248
- uiServices.planning.workPlanStore,
249
- 'Work plan store must be wired at bootstrap for builtin panels.',
250
- ),
251
- policyRuntimeState: requireBuiltinPanelDep(
252
- uiServices.platform.policyRuntimeState,
253
- 'Policy runtime state must be wired at bootstrap for builtin panels.',
254
- ),
255
- };
256
- }
257
-
258
- export function requireUiServices(deps: BuiltinPanelDeps): UiRuntimeServices {
259
- if (!deps.uiServices) {
260
- throw new Error('UI runtime services must be wired at bootstrap for agent, process, WRFC, and remote panels.');
261
- }
262
- return deps.uiServices;
263
- }
264
-
265
- export function requirePluginManager(deps: BuiltinPanelDeps): PluginManagerControls {
266
- if (!deps.pluginManager) {
267
- throw new Error('Plugin manager must be wired at bootstrap for plugin and security panels.');
268
- }
269
- return deps.pluginManager;
270
- }
271
-
272
- export function requireHookPanelDeps(deps: BuiltinPanelDeps): {
273
- readonly hookDispatcher: Pick<HookDispatcher, 'listHooks' | 'getChains'>;
274
- readonly hookWorkbench: HookWorkbench;
275
- readonly hookActivityTracker: Pick<HookActivityTracker, 'listRecent'>;
276
- } {
277
- if (!deps.hookDispatcher || !deps.hookWorkbench || !deps.hookActivityTracker) {
278
- throw new Error('Hook dispatcher, hook activity tracker, and hook workbench must be wired at bootstrap for the hooks panel.');
279
- }
280
- return {
281
- hookDispatcher: deps.hookDispatcher,
282
- hookWorkbench: deps.hookWorkbench,
283
- hookActivityTracker: deps.hookActivityTracker,
284
- };
285
- }
286
-
287
- export function requireMcpRegistry(deps: BuiltinPanelDeps): McpRegistry {
288
- if (!deps.mcpRegistry) {
289
- throw new Error('MCP registry must be wired at bootstrap for security panels and MCP workspace commands.');
290
- }
291
- return deps.mcpRegistry;
292
- }
293
-
294
- export function requireKnowledgeApi(deps: BuiltinPanelDeps): KnowledgeApi {
295
- if (!deps.knowledgeApi) {
296
- throw new Error('Knowledge API must be wired at bootstrap for the Knowledge panel.');
297
- }
298
- return deps.knowledgeApi;
299
- }
300
-
301
- // ---------------------------------------------------------------------------
302
- // always-register conditional panels with a "dependency not
303
- // configured" empty state instead of skipping registration entirely.
304
- // ---------------------------------------------------------------------------
305
-
306
- /**
307
- * Minimal placeholder Panel used when a builtin panel's runtime dependency
308
- * (e.g. an orchestrator usage getter, a memory registry, an eval registry)
309
- * was not wired at bootstrap for this build/session. Renders a single
310
- * "dependency not configured" empty state via `buildEmptyState` so opening
311
- * the panel id (`/panel open <id>`, a saved layout, a cross-panel jump)
312
- * always resolves to a real panel instead of "Unknown panel", the panel
313
- * type is always registered; only its data source is sometimes absent.
314
- */
315
- class UnconfiguredDependencyPanel extends BasePanel {
316
- constructor(
317
- id: string,
318
- name: string,
319
- icon: string,
320
- category: PanelCategory,
321
- private readonly emptyTitle: string,
322
- private readonly emptyBody: string,
323
- ) {
324
- super(id, name, icon, category);
325
- }
326
-
327
- render(width: number, height: number): Line[] {
328
- if (width <= 0 || height <= 0) return [];
329
- return buildPanelWorkspace(width, height, {
330
- title: `${this.name} Workspace`,
331
- sections: [{
332
- lines: buildEmptyState(width, this.emptyTitle, this.emptyBody, [], DEFAULT_PANEL_PALETTE),
333
- }],
334
- palette: DEFAULT_PANEL_PALETTE,
335
- });
336
- }
337
- }
338
-
339
- /**
340
- * Build a factory that instantiates `configured()` when `dependencyPresent`
341
- * is true, otherwise a placeholder Panel rendering `emptyTitle`/`emptyBody`
342
- * via `buildEmptyState`. Use for builtin panels whose registration used to
343
- * be gated behind an `if (deps.xyz)` check (cost/memory/incident/eval).
344
- */
345
- export function withUnconfiguredFallback(
346
- dependencyPresent: boolean,
347
- id: string,
348
- name: string,
349
- icon: string,
350
- category: PanelCategory,
351
- emptyTitle: string,
352
- emptyBody: string,
353
- configured: () => Panel,
354
- ): () => Panel {
355
- if (dependencyPresent) return configured;
356
- return () => new UnconfiguredDependencyPanel(id, name, icon, category, emptyTitle, emptyBody);
357
- }
@@ -1,28 +0,0 @@
1
- import type { PanelManager } from './panel-manager.ts';
2
- import { resolveBuiltinPanelDeps, type BuiltinPanelDeps } from './builtin/shared.ts';
3
- import { registerDevelopmentPanels } from './builtin/development.ts';
4
- import { registerOperationsPanels } from './builtin/operations.ts';
5
- import { registerAgentPanels } from './builtin/agent.ts';
6
- import { registerSessionPanels } from './builtin/session.ts';
7
- import { registerKnowledgePanels } from './builtin/knowledge.ts';
8
- import { registerBuiltinModals } from './builtin-modals.ts';
9
-
10
- /**
11
- * Register all built-in panel types with the given PanelManager.
12
- *
13
- * Call this once during application startup, before opening any panels.
14
- */
15
- export function registerBuiltinPanels(manager: PanelManager, deps: BuiltinPanelDeps): void {
16
- const resolved = resolveBuiltinPanelDeps(deps);
17
- registerDevelopmentPanels(manager, resolved);
18
- registerOperationsPanels(manager, resolved);
19
- registerAgentPanels(manager, resolved);
20
- registerSessionPanels(manager, resolved);
21
- registerKnowledgePanels(manager, resolved);
22
- // (the purge): register MIGRATE-TO-MODAL surfaces + their panel-id
23
- // redirects. Must run after the panel registrations so a redirected id wins
24
- // over any lingering panel registration in open().
25
- registerBuiltinModals(manager, resolved);
26
- }
27
-
28
- export type { BuiltinPanelDeps } from './builtin/shared.ts';