@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
@@ -1,6 +1,7 @@
1
1
  import type { InputToken } from '@pellux/goodvibes-sdk/platform/core';
2
2
  import type { InfiniteBuffer } from '@pellux/goodvibes-terminal-shell';
3
3
  import type { CommandContext, CommandRegistry } from './command-registry.ts';
4
+ import type { SurfaceModalHost } from './surface-modal-host.ts';
4
5
  import { AutocompleteEngine } from './autocomplete.ts';
5
6
  import { FilePickerModal } from './file-picker.ts';
6
7
  import { ModelPickerModal } from './model-picker.ts';
@@ -11,6 +12,7 @@ import type { InputHistory, HistorySearch } from './input-history.ts';
11
12
  import type { BlockMeta, ConversationManager } from '../core/conversation';
12
13
  import { BlockActionsMenu } from '../renderer/block-actions.ts';
13
14
  import { ContextInspectorModal } from '../renderer/context-inspector.ts';
15
+ import type { OverlayFilters } from './overlay-filter.ts';
14
16
  import { BookmarkModal } from './bookmark-modal.ts';
15
17
  import { SettingsModal } from './settings-modal.ts';
16
18
  import type { McpWorkspace } from './mcp-workspace.ts';
@@ -27,21 +29,17 @@ import {
27
29
  import {
28
30
  handleIndicatorFocusToken,
29
31
  handleMouseToken,
30
- handlePanelFocusToken,
31
32
  handlePromptKeyToken,
32
33
  handlePromptTextToken,
33
- type PanelMouseLayout,
34
34
  } from './handler-feed-routes.ts';
35
- import type { PanelBurstGuardState } from './panel-paste-flood-guard.ts';
36
35
  import type { WrappedPromptInfo } from './handler-prompt-buffer.ts';
37
36
  import { getViewportBottomLine } from '../renderer/conversation-layout.ts';
37
+ import { handleWorkTreeToken } from './handler-work-tree-route.ts';
38
+ import { handleSessionViewToken } from './handler-session-view-route.ts';
38
39
  import { handleModalTokenRoutes } from './handler-modal-token-routes.ts';
39
40
  import { handleCommandModeToken } from './handler-command-route.ts';
40
41
  import { handleGlobalShortcutToken } from './handler-shortcuts.ts';
41
- import type { Panel } from '../panels/types.ts';
42
- import { handlePanelIntegrationAction } from './panel-integration-actions.ts';
43
42
  import { SelectionManager } from '@pellux/goodvibes-terminal-shell';
44
- import type { PanelManager } from '../panels/panel-manager.ts';
45
43
  import type { KeybindingsManager } from './keybindings.ts';
46
44
  import type { ModelPickerTarget } from './model-picker.ts';
47
45
  import type { KillRing } from './kill-ring.ts';
@@ -55,7 +53,7 @@ import type { FocusTracker } from '@pellux/goodvibes-sdk/platform/runtime/operat
55
53
  * **Mutable per-feed** (synced from handler at the top of every feed() call, and
56
54
  * updated inside action closures via syncFeedContextMutableFields):
57
55
  * - `prompt`, `cursorPos`, current text buffer state
58
- * - `commandMode`, `panelFocused`, `indicatorFocused`, focus-mode flags
56
+ * - `commandMode`, `indicatorFocused`, focus-mode flags
59
57
  * - `helpOverlayActive`, `helpScrollOffset`, help overlay visibility and scroll
60
58
  * - `shortcutsOverlayActive`, `shortcutsScrollOffset`, shortcuts overlay state
61
59
  * - `nextPasteId`, `nextImageId`, monotonically increasing ID counters
@@ -76,7 +74,7 @@ import type { FocusTracker } from '@pellux/goodvibes-sdk/platform/runtime/operat
76
74
  * - `filePicker`, `modelPicker`, `onboardingWizard`,
77
75
  * `contextInspectorModal`, `blockActionsMenu`, `searchManager`, `historySearch`,
78
76
  * service objects constructed once
79
- * - `panelManager`, `keybindingsManager`, from uiServices, stable for app lifetime
77
+ * - `keybindingsManager`, from uiServices, stable for app lifetime
80
78
  * - `modalStack`, reference to the handler's shared array (mutated in place)
81
79
  * - `getHistory`, `getViewportHeight`, `getScrollTop`, `scroll`, `exitApp`, stable
82
80
  * callbacks bound in the InputHandler constructor
@@ -90,7 +88,6 @@ export interface InputFeedContext {
90
88
  cursorPos: number;
91
89
  inputScrollTop: number;
92
90
  commandMode: boolean;
93
- panelFocused: boolean;
94
91
  indicatorFocused: boolean;
95
92
  helpOverlayActive: boolean;
96
93
  helpScrollOffset: number;
@@ -121,10 +118,11 @@ export interface InputFeedContext {
121
118
  readonly modelPicker: ModelPickerModal;
122
119
  readonly onboardingWizard: OnboardingWizardController;
123
120
  readonly contextInspectorModal: ContextInspectorModal;
121
+ readonly overlayFilters: OverlayFilters;
124
122
  readonly blockActionsMenu: BlockActionsMenu;
123
+ /** Kit modals (command palette, confirm dialog, ...): they take every key while open. */
124
+ readonly surfaceModals?: SurfaceModalHost;
125
125
  readonly searchManager: SearchManager;
126
- readonly panelManager: PanelManager;
127
- panelMouseLayout: PanelMouseLayout | null;
128
126
  readonly keybindingsManager: KeybindingsManager;
129
127
  readonly modalStack: string[];
130
128
  inputHistory: InputHistory | null;
@@ -132,14 +130,14 @@ export interface InputFeedContext {
132
130
  readonly killRing: KillRing;
133
131
  /** Terminal focus tracker, updated here from 'focus' tokens, read by the unfocused-alert notifiers in core/. */
134
132
  readonly focusTracker: FocusTracker;
135
- /** item 5, the paste-flood guard's persistent state, mutated in place across tokens by handlePanelFocusToken (see panel-paste-flood-guard.ts). Never reallocated. */
136
- readonly panelBurstGuard: PanelBurstGuardState;
137
133
  readonly getHistory: () => InfiniteBuffer;
138
134
  readonly getViewportHeight: () => number;
139
135
  readonly getScrollTop: () => number;
140
136
  readonly scroll: (delta: number) => void;
141
137
  requestRender: () => void;
142
138
  readonly modalOpened: (name: string) => void;
139
+ /** The agent or process view controls (null before the shell wires them). */
140
+ readonly getSessionView: () => import('./handler-session-view-route.ts').SessionViewControls | null;
143
141
  readonly handleEscape: () => void;
144
142
  /** Deliver a concealed submission; returns true when concealed mode consumed it. */
145
143
  readonly submitConcealedInput: (value: string) => boolean;
@@ -160,11 +158,12 @@ export interface InputFeedContext {
160
158
  readonly ensureInputCursorVisible: (contentWidth?: number) => void;
161
159
  readonly registerPaste: (content: string) => string;
162
160
  readonly executeBlockAction: (id: string) => void;
163
- readonly cyclePanelTab: (direction: 'next' | 'prev') => void;
164
- readonly onPanelInputConsumed: (activePanel: Panel | null, key: string) => void;
165
161
  readonly getWrappedPromptInfo: (contentWidth: number) => WrappedPromptInfo;
166
162
  readonly moveCursorVertical: (direction: -1 | 1) => boolean;
167
163
  readonly handlePathCompletion: () => boolean;
164
+ readonly footerTargetAt: (row: number) => import('../renderer/footer-targets.ts').FooterTarget | undefined;
165
+ readonly openFooterTarget: (target: import('../renderer/footer-targets.ts').FooterTarget) => void;
166
+ readonly bodyTopRow: () => number;
168
167
  readonly handleBlockToggle: () => void;
169
168
  readonly findMarkerAtPos: (pos: number) => { start: number; end: number } | null;
170
169
  readonly cleanupMarkerRegistry: (text: string) => void;
@@ -185,31 +184,11 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
185
184
  const lineCount = history.getLineCount();
186
185
  const keybindings = context.keybindingsManager;
187
186
 
188
- // Shared opener for the Fleet panel: makes it visible AND transfers keyboard
189
- // focus to it. panelManager.open() only makes the panel active, focus is a
190
- // separate axis (see PanelManager.focusPanels()/getFocusTarget()); without the
191
- // focusPanels() call, j/k/i/K land silently in the composer until Tab. Used by
192
- // the footer indicator's [Enter] and by F2 (F2 and the footer
193
- // indicator both subsume the retired process modal). Mirrors the Ctrl+P
194
- // panel-picker launcher (ui-openers.ts openPanelPicker).
195
- const openFleetPanel = (): void => {
196
- context.panelManager.open('fleet');
197
- context.panelManager.focusPanels();
198
- context.panelFocused = true;
187
+ // The footer process indicator's Enter opens the Agents modal (so does F2).
188
+ const openAgentsView = (): void => {
189
+ context.commandContext?.openAgents?.();
199
190
  };
200
191
 
201
- // Paste-ness is a per-TOKEN property, computed at the handlePanelFocusToken
202
- // call below, never a per-feed character sum. The SDK tokenizer emits a
203
- // bracketed paste (\x1b[?2004h, enabled in main.ts terminal init) as ONE
204
- // 'text' token holding the whole payload, while discrete keystrokes, even
205
- // several batched into one feed() by render-tick latency, arrive as
206
- // separate 1-char 'text' tokens. The old per-feed sum misread two quick nav
207
- // keystrokes (e.g. j then k in one drain) as a "burst" and yanked focus.
208
- // item 5's flood guard reuses that same per-token model but adds
209
- // real timing: one `now` per feed() call (not per token) is intentional,
210
- // a genuine flood delivers many tokens in one drain, and they should all
211
- // measure as arriving "at once", not spread across meaningless sub-ms noise.
212
- const now = Date.now();
213
192
  for (const token of tokens) {
214
193
  // Focus-reporting tokens (CSI ?1004h) never reach the composer or any
215
194
  // modal route, consumed here, first, unconditionally. No render needed.
@@ -223,6 +202,16 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
223
202
  continue;
224
203
  }
225
204
 
205
+ // Kit modals sit on top of everything else: focus belongs to the top one.
206
+ // Esc goes through the shared chain (handler-modal-stack.ts), which pops
207
+ // exactly one level of the host before anything else.
208
+ if (context.surfaceModals?.active && (token.type === 'key' || token.type === 'text')) {
209
+ if (token.type === 'key' && token.logicalName === 'escape') context.handleEscape();
210
+ else context.surfaceModals.handleToken(token);
211
+ context.requestRender();
212
+ continue;
213
+ }
214
+
226
215
  const modalRoute = handleModalTokenRoutes({
227
216
  history,
228
217
  conversationManager: context.conversationManager,
@@ -254,6 +243,7 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
254
243
  requestRender: context.requestRender,
255
244
  handleEscape: context.handleEscape,
256
245
  contextInspectorModal: context.contextInspectorModal,
246
+ overlayFilters: context.overlayFilters,
257
247
  modalOpened: context.modalOpened,
258
248
  filePicker: context.filePicker,
259
249
  imageRegistry: context.imageRegistry,
@@ -286,19 +276,46 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
286
276
  continue;
287
277
  }
288
278
 
279
+ // An agent or process open full screen, and the session chips' Tab (handler-session-view-route.ts).
280
+ const sessionView = context.getSessionView();
281
+ const viewState = {
282
+ controls: sessionView,
283
+ prompt: context.prompt,
284
+ cursorPos: context.cursorPos,
285
+ commandMode: context.commandMode,
286
+ saveUndoState: context.saveUndoState,
287
+ requestRender: context.requestRender,
288
+ };
289
+ if (handleSessionViewToken(viewState, token)) {
290
+ context.prompt = viewState.prompt;
291
+ context.cursorPos = viewState.cursorPos;
292
+ continue;
293
+ }
294
+
295
+ // The keyboard inside the work tree (Alt+Up enters, Esc leaves; see
296
+ // handler-work-tree-route.ts). The work tree is main's: inside a view it is not on screen.
297
+ if (!sessionView?.active && handleWorkTreeToken({
298
+ conversationManager: context.conversationManager,
299
+ enterMatch: token.type === 'key' && keybindings.matches('focus-work-tree', token),
300
+ anchorLine: getViewportBottomLine(scrollTop, viewportHeight, lineCount),
301
+ scrollTop: context.getScrollTop(),
302
+ viewportHeight,
303
+ scroll: context.scroll,
304
+ requestRender: context.requestRender,
305
+ onCopied: () => { /* the copy receipt is the transcript line handleBlockCopy logs */ },
306
+ openAgent: (id) => context.commandContext?.openSessionView?.({ kind: 'agent', id }) ?? false,
307
+ openProcess: (id) => context.commandContext?.openSessionView?.({ kind: 'process', id }) ?? false,
308
+ }, token)) {
309
+ continue;
310
+ }
311
+
289
312
  if (token.type === 'key') {
290
- // Focus can never disagree with workspace visibility: PanelManager owns
291
- // focusTarget and self-heals it, and context.panelFocused was seeded from
292
- // it at feed entry, so no manual "unfocus if panels vanished" patch is
293
- // needed here anymore.
294
- // Snapshot these four BEFORE dispatch so the write-back below can tell
295
- // a pipeline-driven change (see comment there) from a stale copy.
313
+ // Snapshot these BEFORE dispatch so the write-back below can tell a
314
+ // pipeline-driven change (see comment there) from a stale copy.
296
315
  const promptBefore = context.prompt;
297
316
  const cursorPosBefore = context.cursorPos;
298
317
  const commandModeBefore = context.commandMode;
299
- const panelFocusedBefore = context.panelFocused;
300
318
  const shortcutState = {
301
- panelFocused: context.panelFocused,
302
319
  prompt: context.prompt,
303
320
  cursorPos: context.cursorPos,
304
321
  commandMode: context.commandMode,
@@ -324,8 +341,6 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
324
341
  handleRedo: context.handleRedo,
325
342
  handlePaste: context.handlePaste,
326
343
  handleEscape: context.handleEscape,
327
- cyclePanelTab: context.cyclePanelTab,
328
- panelManager: context.panelManager,
329
344
  keybindingsManager: context.keybindingsManager,
330
345
  killRing: context.killRing,
331
346
  };
@@ -345,7 +360,6 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
345
360
  context.prompt = context.prompt === promptBefore ? shortcutState.prompt : context.prompt;
346
361
  context.cursorPos = context.cursorPos === cursorPosBefore ? shortcutState.cursorPos : context.cursorPos;
347
362
  context.commandMode = context.commandMode === commandModeBefore ? shortcutState.commandMode : context.commandMode;
348
- context.panelFocused = context.panelFocused === panelFocusedBefore ? shortcutState.panelFocused : context.panelFocused;
349
363
  if (context.commandMode) {
350
364
  if (!context.prompt.startsWith('/')) {
351
365
  context.commandMode = false;
@@ -363,40 +377,10 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
363
377
  }
364
378
  }
365
379
 
366
- const panelRoute = handlePanelFocusToken({
367
- panelFocused: context.panelFocused,
368
- commandMode: context.commandMode,
369
- searchActive: context.searchManager.active,
370
- autocompleteActive: !!context.autocomplete?.isActive,
371
- requestRender: context.requestRender,
372
- handlePathCompletion: context.handlePathCompletion,
373
- cyclePanelTab: context.cyclePanelTab,
374
- panelManager: context.panelManager,
375
- keybindingsManager: context.keybindingsManager,
376
- onPanelInputConsumed: context.onPanelInputConsumed,
377
- now,
378
- burstGuard: context.panelBurstGuard,
379
- // Per-token paste classification (Invariant B): a paste is a single
380
- // 'text' token whose value holds more than one character.
381
- isPasteToken: token.type === 'text' && token.value.length > 1,
382
- // One-shot honesty hint when a paste is dropped into a non-capturing
383
- // focused panel (Invariant A: focus never silently flips to the composer).
384
- onPasteDropped: (panelName: string) =>
385
- context.commandContext?.print(
386
- `paste ignored: focus is on ${panelName}; Tab returns to composer`,
387
- ),
388
- isTurnActive: () => context.commandContext?.isGenerating?.() ?? false,
389
- cancelGeneration: () => context.commandContext?.cancelGeneration?.(),
390
- }, token);
391
- context.panelFocused = panelRoute.panelFocused;
392
- if (panelRoute.handled) {
393
- continue;
394
- }
395
-
396
380
  const indicatorRoute = handleIndicatorFocusToken({
397
381
  indicatorFocused: context.indicatorFocused,
398
382
  modalOpened: context.modalOpened,
399
- openFleetPanel,
383
+ openAgentsView,
400
384
  requestRender: context.requestRender,
401
385
  }, token);
402
386
  context.indicatorFocused = indicatorRoute.indicatorFocused;
@@ -441,8 +425,6 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
441
425
  modalStack: context.modalStack,
442
426
  commandRegistry: context.commandRegistry,
443
427
  commandContext: context.commandContext,
444
- panelFocused: context.panelFocused,
445
- panelManager: context.panelManager,
446
428
  conversationManager: context.conversationManager,
447
429
  requestRender: context.requestRender,
448
430
  handleEscape: context.handleEscape,
@@ -458,7 +440,6 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
458
440
  context.commandMode = commandState.commandMode;
459
441
  context.prompt = commandState.prompt;
460
442
  context.cursorPos = commandState.cursorPos;
461
- context.panelFocused = commandState.panelFocused;
462
443
  context.nextPasteId = commandState.nextPasteId;
463
444
  context.nextImageId = commandState.nextImageId;
464
445
  continue;
@@ -480,7 +461,7 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
480
461
  autocomplete: context.autocomplete,
481
462
  blockActionsMenu: { open: (block: BlockMeta) => context.blockActionsMenu.open(block) },
482
463
  getBlockAnchorLine: () => getViewportBottomLine(scrollTop, viewportHeight, lineCount),
483
- openFleetPanel,
464
+ openAgentsView,
484
465
  modalOpened: context.modalOpened,
485
466
  saveUndoState: context.saveUndoState,
486
467
  breakUndoCoalesce: context.breakUndoCoalesce,
@@ -509,8 +490,6 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
509
490
  const mouseRoute = handleMouseToken({
510
491
  conversationManager: context.conversationManager,
511
492
  selection: context.selection,
512
- panelManager: context.panelManager,
513
- panelMouseLayout: context.panelMouseLayout,
514
493
  mouseDownRow: context.mouseDownRow,
515
494
  mouseDownCol: context.mouseDownCol,
516
495
  scrollTop,
@@ -520,6 +499,9 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
520
499
  requestRender: context.requestRender,
521
500
  handlePaste: context.handlePaste,
522
501
  handleCopy: context.handleCopy,
502
+ footerTargetAt: context.footerTargetAt,
503
+ openFooterTarget: context.openFooterTarget,
504
+ bodyTopRow: context.bodyTopRow,
523
505
  }, token);
524
506
  context.mouseDownRow = mouseRoute.mouseDownRow;
525
507
  context.mouseDownCol = mouseRoute.mouseDownCol;
@@ -531,12 +513,3 @@ export function feedInputTokens(context: InputFeedContext, tokens: readonly Inpu
531
513
 
532
514
  context.requestRender();
533
515
  }
534
-
535
- export function defaultPanelInputConsumer(
536
- panelManager: PanelManager,
537
- activePanel: Panel | null,
538
- key: string,
539
- commandContext?: CommandContext,
540
- ): void {
541
- handlePanelIntegrationAction(panelManager, activePanel, key, commandContext);
542
- }
@@ -1,3 +1,4 @@
1
+ import { activeTokens } from '../renderer/theme.ts';
1
2
  import { buildProviderAccountSnapshot } from '@/runtime/index.ts';
2
3
  import { enrichProviderAccountsSnapshot } from '../runtime/onboarding/provider-key-capture.ts';
3
4
  import type { OnboardingWizardMode } from './onboarding/onboarding-wizard.ts';
@@ -91,7 +92,7 @@ export function handlePasteForHandler(handler: InputHandler): ReturnType<typeof
91
92
  handler.nextPasteId = result.nextPasteId;
92
93
 
93
94
  if (!result.pasted) {
94
- handler.conversationManager?.log('[Paste: clipboard does not contain supported text or image data]', { fg: '240' });
95
+ handler.conversationManager?.log('[Paste: clipboard does not contain supported text or image data]', { fg: activeTokens().textFaint });
95
96
  handler.requestRender();
96
97
  }
97
98
  return result;
@@ -270,12 +271,14 @@ export function handleEscapeForHandler(handler: InputHandler): void {
270
271
  modelPicker: handler.modelPicker,
271
272
  filePicker: handler.filePicker,
272
273
  blockActionsMenu: handler.blockActionsMenu,
274
+ surfaceModals: handler.surfaceModals,
275
+ sessionView: handler.sessionView ?? undefined,
276
+ transcriptScroll: handler.transcriptScroll ?? undefined,
273
277
  selectionModal: handler.selectionModal,
274
278
  onboardingWizard: handler.onboardingWizard,
275
279
  commandMode: handler.commandMode,
276
280
  modalStack: handler.modalStack,
277
281
  modalReturnFocus: handler.modalReturnFocus,
278
- panelFocused: handler.panelFocused,
279
282
  indicatorFocused: handler.indicatorFocused,
280
283
  prompt: handler.prompt,
281
284
  cursorPos: handler.cursorPos,
@@ -298,7 +301,6 @@ export function handleEscapeForHandler(handler: InputHandler): void {
298
301
  handler.shortcutsOverlayActive = result.shortcutsOverlayActive;
299
302
  handler.shortcutsScrollOffset = result.shortcutsScrollOffset;
300
303
  handler.selectionCallback = result.selectionCallback;
301
- handler.panelFocused = result.panelFocused;
302
304
  handler.indicatorFocused = result.indicatorFocused;
303
305
  handler.modalReturnFocus = result.modalReturnFocus;
304
306
  }