@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,146 +0,0 @@
1
- import type { Line } from '@pellux/goodvibes-sdk/platform/types';
2
- import { createEmptyLine, createStyledCell } from '@pellux/goodvibes-sdk/platform/types';
3
- import { getDisplayWidth } from '../utils/terminal-width.ts';
4
- import { GLYPHS } from './ui-primitives.ts';
5
- import { activeUiTones, registerThemeRefresh } from './theme.ts';
6
-
7
- // Built from the mode-resolved chrome tones (activeUiTones) and rebuilt IN PLACE
8
- // on a mode flip via the registered refresher (read by reference across the
9
- // fullscreen workspace surfaces, see theme.ts's active-mode runtime note).
10
- function buildFullscreenPalette(): Record<string, string> {
11
- const t = activeUiTones();
12
- return {
13
- border: t.border,
14
- title: t.accent.browser,
15
- subtitle: t.accent.conversation,
16
- text: t.fg.primary,
17
- muted: t.fg.muted,
18
- dim: t.border,
19
- selectedBg: t.bg.selected,
20
- categoryBg: t.bg.section,
21
- contextBg: t.bg.surface,
22
- controlsBg: t.bg.base,
23
- footerBg: t.bg.footer,
24
- good: t.state.good,
25
- warn: t.state.warn,
26
- bad: t.state.bad,
27
- info: t.state.info,
28
- };
29
- }
30
-
31
- export const FULLSCREEN_PALETTE = buildFullscreenPalette() as {
32
- readonly border: string; readonly title: string; readonly subtitle: string;
33
- readonly text: string; readonly muted: string; readonly dim: string;
34
- readonly selectedBg: string; readonly categoryBg: string; readonly contextBg: string;
35
- readonly controlsBg: string; readonly footerBg: string; readonly good: string;
36
- readonly warn: string; readonly bad: string; readonly info: string;
37
- };
38
- registerThemeRefresh(() => Object.assign(FULLSCREEN_PALETTE as Record<string, string>, buildFullscreenPalette()));
39
-
40
- export type FullscreenTextStyle = Partial<Omit<Line[number], 'char'>>;
41
-
42
- export function clamp(value: number, min: number, max: number): number {
43
- return Math.max(min, Math.min(max, value));
44
- }
45
-
46
- export function fillRange(line: Line, startX: number, endX: number, bg: string): void {
47
- for (let x = Math.max(0, startX); x <= Math.min(line.length - 1, endX); x += 1) {
48
- const cell = line[x] ?? createStyledCell(' ');
49
- line[x] = createStyledCell(cell.char, {
50
- fg: cell.fg,
51
- bg,
52
- bold: cell.bold,
53
- dim: cell.dim,
54
- underline: cell.underline,
55
- italic: cell.italic,
56
- strikethrough: cell.strikethrough,
57
- link: cell.link,
58
- });
59
- }
60
- }
61
-
62
- export function fillWidth(line: Line, startX: number, width: number, bg: string): void {
63
- if (width <= 0) return;
64
- fillRange(line, startX, startX + width - 1, bg);
65
- }
66
-
67
- export function writeText(
68
- line: Line,
69
- startX: number,
70
- maxWidth: number,
71
- text: string,
72
- style: FullscreenTextStyle = {},
73
- ): void {
74
- let x = startX;
75
- let used = 0;
76
- for (const ch of text) {
77
- const width = getDisplayWidth(ch);
78
- if (width <= 0) continue;
79
- if (used + width > maxWidth || x >= line.length) break;
80
- line[x] = createStyledCell(ch, style);
81
- if (width > 1 && x + 1 < line.length) line[x + 1] = createStyledCell(' ', style);
82
- x += width;
83
- used += width;
84
- }
85
- }
86
-
87
- export function makeLine(width: number, bg = ''): Line {
88
- const line = createEmptyLine(width);
89
- if (bg) fillRange(line, 0, width - 1, bg);
90
- return line;
91
- }
92
-
93
- export function borderLine(width: number, left: string, fill: string, right: string, fg: string = FULLSCREEN_PALETTE.border): Line {
94
- const line = makeLine(width);
95
- if (width <= 0) return line;
96
- line[0] = createStyledCell(left, { fg });
97
- for (let x = 1; x < width - 1; x += 1) line[x] = createStyledCell(fill, { fg });
98
- if (width > 1) line[width - 1] = createStyledCell(right, { fg });
99
- return line;
100
- }
101
-
102
- export function contentLine(width: number, bg: string, borderFg: string = FULLSCREEN_PALETTE.border): Line {
103
- const line = makeLine(width, bg);
104
- if (width > 0) line[0] = createStyledCell(GLYPHS.frame.vertical, { fg: borderFg });
105
- if (width > 1) line[width - 1] = createStyledCell(GLYPHS.frame.vertical, { fg: borderFg });
106
- return line;
107
- }
108
-
109
- export function drawVerticalRule(line: Line, x: number, fg: string = FULLSCREEN_PALETTE.border, bg = ''): void {
110
- if (x < 0 || x >= line.length) return;
111
- line[x] = createStyledCell(GLYPHS.frame.vertical, { fg, bg });
112
- }
113
-
114
- export function drawHorizontalRule(line: Line, startX: number, endX: number, fg: string = FULLSCREEN_PALETTE.border, bg = ''): void {
115
- for (let x = Math.max(0, startX); x <= Math.min(line.length - 1, endX); x += 1) {
116
- line[x] = createStyledCell(GLYPHS.frame.horizontal, { fg, bg });
117
- }
118
- }
119
-
120
- function clipDisplay(text: string, width: number): string {
121
- if (width <= 0) return '';
122
- let used = 0;
123
- let output = '';
124
- for (const ch of text) {
125
- const chWidth = getDisplayWidth(ch);
126
- if (chWidth <= 0) continue;
127
- if (used + chWidth > width) break;
128
- output += ch;
129
- used += chWidth;
130
- }
131
- return output;
132
- }
133
-
134
- export function padDisplay(text: string, width: number): string {
135
- const clipped = clipDisplay(text, width);
136
- return `${clipped}${' '.repeat(Math.max(0, width - getDisplayWidth(clipped)))}`;
137
- }
138
-
139
- export function stableWindow(total: number, selectedIndex: number, visibleCount: number): { start: number; end: number } {
140
- if (total <= 0 || visibleCount <= 0) return { start: 0, end: 0 };
141
- if (total <= visibleCount) return { start: 0, end: total };
142
- const selected = clamp(selectedIndex, 0, total - 1);
143
- const half = Math.floor(visibleCount / 2);
144
- const start = clamp(selected - half, 0, total - visibleCount);
145
- return { start, end: start + visibleCount };
146
- }
@@ -1,194 +0,0 @@
1
- import type { Line } from '@pellux/goodvibes-sdk/platform/types';
2
- import { GLYPHS } from './ui-primitives.ts';
3
- import {
4
- borderLine,
5
- clamp,
6
- contentLine,
7
- drawHorizontalRule,
8
- drawVerticalRule,
9
- fillRange,
10
- FULLSCREEN_PALETTE,
11
- makeLine,
12
- writeText,
13
- } from './fullscreen-primitives.ts';
14
-
15
- export {
16
- clamp,
17
- padDisplay,
18
- stableWindow,
19
- } from './fullscreen-primitives.ts';
20
- export { FULLSCREEN_PALETTE as WORKSPACE_PALETTE } from './fullscreen-primitives.ts';
21
-
22
- const WORKSPACE_PALETTE = FULLSCREEN_PALETTE;
23
-
24
- export interface WorkspaceRow {
25
- readonly text: string;
26
- readonly selected?: boolean;
27
- readonly bold?: boolean;
28
- readonly dim?: boolean;
29
- readonly fg?: string;
30
- readonly bg?: string;
31
- readonly kind?: 'group' | 'item' | 'more' | 'empty';
32
- }
33
-
34
- export interface FullscreenWorkspaceRenderOptions {
35
- readonly width: number;
36
- readonly height: number;
37
- readonly title: string;
38
- readonly stateLabel?: string;
39
- readonly leftHeader: string;
40
- readonly mainHeader: string;
41
- readonly leftRows: readonly WorkspaceRow[];
42
- readonly contextRows: readonly WorkspaceRow[];
43
- readonly controlRows: readonly WorkspaceRow[];
44
- readonly footer: string;
45
- readonly leftWidth?: number;
46
- readonly contextRatio?: number;
47
- readonly minContextRows?: number;
48
- }
49
-
50
- export interface FullscreenWorkspaceMetrics {
51
- readonly safeWidth: number;
52
- readonly safeHeight: number;
53
- readonly leftWidth: number;
54
- readonly centerWidth: number;
55
- readonly bodyRows: number;
56
- readonly contextWidth: number;
57
- readonly contextRows: number;
58
- readonly controlRows: number;
59
- }
60
-
61
- function drawVertical(line: Line, x: number, bg = ''): void {
62
- if (x <= 0 || x >= line.length - 1) return;
63
- drawVerticalRule(line, x, WORKSPACE_PALETTE.border, bg);
64
- }
65
-
66
- function drawHorizontalRange(line: Line, startX: number, endX: number, bg = ''): void {
67
- drawHorizontalRule(line, Math.max(1, startX), Math.min(line.length - 2, endX), WORKSPACE_PALETTE.border, bg);
68
- }
69
-
70
- function leftWidthFor(width: number, explicit?: number): number {
71
- if (explicit !== undefined) return clamp(explicit, 14, Math.max(14, width - 24));
72
- return width < 80
73
- ? clamp(Math.round(width * 0.32), 14, Math.max(14, width - 24))
74
- : clamp(Math.round(width * 0.22), 24, 34);
75
- }
76
-
77
- export function getFullscreenWorkspaceMetrics(options: Pick<
78
- FullscreenWorkspaceRenderOptions,
79
- 'width' | 'height' | 'leftWidth' | 'contextRatio' | 'minContextRows'
80
- >): FullscreenWorkspaceMetrics {
81
- const safeWidth = Math.max(1, options.width);
82
- const safeHeight = Math.max(12, options.height);
83
- const leftWidth = leftWidthFor(safeWidth, options.leftWidth);
84
- const centerWidth = Math.max(20, safeWidth - leftWidth - 3);
85
- const bodyTop = 3;
86
- const footerY = safeHeight - 2;
87
- const bodyRows = Math.max(4, footerY - bodyTop);
88
- const contextWidth = Math.max(10, centerWidth - 2);
89
- const maxContextRows = Math.max(3, bodyRows - 4);
90
- const minContextRows = clamp(options.minContextRows ?? 10, 3, maxContextRows);
91
- const contextRows = clamp(
92
- Math.round(bodyRows * (options.contextRatio ?? 0.4)),
93
- Math.min(minContextRows, maxContextRows),
94
- maxContextRows,
95
- );
96
- const controlRows = Math.max(3, bodyRows - contextRows - 1);
97
- return { safeWidth, safeHeight, leftWidth, centerWidth, bodyRows, contextWidth, contextRows, controlRows };
98
- }
99
-
100
- function rowFg(row: WorkspaceRow, fallback: string): string {
101
- if (row.fg) return row.fg;
102
- if (row.kind === 'group') return WORKSPACE_PALETTE.subtitle;
103
- if (row.kind === 'more') return WORKSPACE_PALETTE.dim;
104
- return fallback;
105
- }
106
-
107
- export function renderFullscreenWorkspace(options: FullscreenWorkspaceRenderOptions): Line[] {
108
- const { safeWidth, safeHeight, leftWidth, centerWidth, bodyRows, contextWidth, contextRows } = getFullscreenWorkspaceMetrics(options);
109
- const leftStart = 1;
110
- const dividerX = leftWidth + 1;
111
- const centerStart = dividerX + 1;
112
- const centerEnd = safeWidth - 2;
113
- const bodyTop = 3;
114
- const separatorY = bodyTop + contextRows;
115
- const lines: Line[] = [];
116
-
117
- const top = borderLine(safeWidth, GLYPHS.frame.topLeft, GLYPHS.frame.horizontal, GLYPHS.frame.topRight);
118
- writeText(top, 2, safeWidth - 4, ` ${options.title} `, { fg: WORKSPACE_PALETTE.title, bold: true });
119
- if (options.stateLabel) {
120
- writeText(top, Math.max(2, safeWidth - options.stateLabel.length - 4), options.stateLabel.length, options.stateLabel, {
121
- fg: WORKSPACE_PALETTE.subtitle,
122
- });
123
- }
124
- lines.push(top);
125
-
126
- const header = contentLine(safeWidth, WORKSPACE_PALETTE.footerBg);
127
- drawVertical(header, dividerX, WORKSPACE_PALETTE.footerBg);
128
- writeText(header, leftStart + 1, leftWidth - 2, options.leftHeader, {
129
- fg: WORKSPACE_PALETTE.subtitle,
130
- bold: true,
131
- bg: WORKSPACE_PALETTE.footerBg,
132
- });
133
- writeText(header, centerStart + 1, centerWidth - 2, options.mainHeader, {
134
- fg: WORKSPACE_PALETTE.subtitle,
135
- bold: true,
136
- bg: WORKSPACE_PALETTE.footerBg,
137
- });
138
- lines.push(header);
139
-
140
- const headerSep = contentLine(safeWidth, '');
141
- drawVertical(headerSep, dividerX);
142
- drawHorizontalRange(headerSep, 1, safeWidth - 2);
143
- lines.push(headerSep);
144
-
145
- for (let row = 0; row < bodyRows; row += 1) {
146
- const y = bodyTop + row;
147
- const inContext = y < separatorY;
148
- const inSeparator = y === separatorY;
149
- const bg = inSeparator ? '' : inContext ? WORKSPACE_PALETTE.contextBg : WORKSPACE_PALETTE.controlsBg;
150
- const line = contentLine(safeWidth, bg);
151
- fillRange(line, 1, dividerX - 1, WORKSPACE_PALETTE.categoryBg);
152
- drawVertical(line, dividerX, bg);
153
-
154
- const leftRow = options.leftRows[row] ?? { text: '', kind: 'empty' as const };
155
- if (leftRow.selected) fillRange(line, leftStart, dividerX - 1, WORKSPACE_PALETTE.selectedBg);
156
- writeText(line, leftStart + 1, leftWidth - 3, leftRow.text, {
157
- fg: leftRow.selected ? WORKSPACE_PALETTE.text : rowFg(leftRow, WORKSPACE_PALETTE.muted),
158
- bg: leftRow.selected ? WORKSPACE_PALETTE.selectedBg : WORKSPACE_PALETTE.categoryBg,
159
- bold: leftRow.bold ?? (leftRow.selected || leftRow.kind === 'group'),
160
- dim: leftRow.dim,
161
- });
162
-
163
- if (inSeparator) {
164
- drawHorizontalRange(line, centerStart, centerEnd);
165
- } else if (inContext) {
166
- const contextRow = options.contextRows[row] ?? { text: '', kind: 'empty' as const };
167
- writeText(line, centerStart + 1, contextWidth, contextRow.text, {
168
- fg: rowFg(contextRow, WORKSPACE_PALETTE.text),
169
- bg,
170
- bold: contextRow.bold,
171
- dim: contextRow.dim ?? contextRow.text.length === 0,
172
- });
173
- } else {
174
- const controlRow = options.controlRows[row - contextRows - 1] ?? { text: '', kind: 'empty' as const };
175
- if (controlRow.selected) fillRange(line, centerStart, centerEnd, WORKSPACE_PALETTE.selectedBg);
176
- writeText(line, centerStart + 1, contextWidth, controlRow.text, {
177
- fg: controlRow.selected ? WORKSPACE_PALETTE.text : rowFg(controlRow, WORKSPACE_PALETTE.text),
178
- bg: controlRow.selected ? WORKSPACE_PALETTE.selectedBg : bg,
179
- bold: controlRow.bold ?? controlRow.selected,
180
- dim: controlRow.dim ?? controlRow.text.length === 0,
181
- });
182
- }
183
-
184
- lines.push(line);
185
- }
186
-
187
- const footer = contentLine(safeWidth, WORKSPACE_PALETTE.footerBg);
188
- writeText(footer, 2, safeWidth - 4, options.footer, { fg: WORKSPACE_PALETTE.muted, bg: WORKSPACE_PALETTE.footerBg });
189
- lines.push(footer);
190
- lines.push(borderLine(safeWidth, GLYPHS.frame.bottomLeft, GLYPHS.frame.horizontal, GLYPHS.frame.bottomRight));
191
-
192
- while (lines.length < safeHeight) lines.unshift(makeLine(safeWidth));
193
- return lines.slice(-safeHeight);
194
- }
@@ -1,52 +0,0 @@
1
- /**
2
- * hint-grammar.ts, the single hint-bar grammar for every overlay footer.
3
- *
4
- * one grammar across the model picker, settings modal, help/shortcuts
5
- * overlays, and ModalFactory variants so footers stop drifting into three
6
- * different dialects (verbless brackets, prose sentences, ad-hoc separators).
7
- *
8
- * The grammar is:
9
- * - each hint renders as `[Key] Verb` (a bracketed key followed by its verb),
10
- * - hints are joined by a middle-dot separator (` · `),
11
- * - any Escape hint is always sorted last (the conventional "way out").
12
- *
13
- * State segments that are not key hints (e.g. `Filter: All`) can be appended
14
- * verbatim via {@link joinHints}; they are never reordered.
15
- */
16
-
17
- /** A single key hint. `verb` may be omitted for a bare key affordance. */
18
- export interface HintSpec {
19
- key: string;
20
- verb?: string;
21
- }
22
-
23
- /** The canonical separator between hint segments. */
24
- export const HINT_SEPARATOR = ' · ';
25
-
26
- function isEscapeHint(spec: HintSpec): boolean {
27
- return spec.key.trim().toLowerCase() === 'esc';
28
- }
29
-
30
- /** Render one hint as `[Key] Verb` (or `[Key]` when it has no verb). */
31
- function formatHint(spec: HintSpec): string {
32
- return spec.verb ? `[${spec.key}] ${spec.verb}` : `[${spec.key}]`;
33
- }
34
-
35
- /**
36
- * Format a list of key hints into a single footer string using the shared
37
- * grammar. Escape hints are moved to the end (stable for everything else).
38
- */
39
- export function formatHints(specs: readonly HintSpec[]): string {
40
- // Stable partition: non-escape hints keep their order, escape hints trail.
41
- const ordered = [...specs].sort((a, b) => Number(isEscapeHint(a)) - Number(isEscapeHint(b)));
42
- return ordered.map(formatHint).join(HINT_SEPARATOR);
43
- }
44
-
45
- /**
46
- * Join already-rendered segments (hint bars, state tags) with the shared
47
- * separator, dropping empties. Order is preserved, use this to append state
48
- * indicators after a {@link formatHints} bar.
49
- */
50
- export function joinHints(...segments: Array<string | null | undefined>): string {
51
- return segments.filter((s): s is string => !!s && s.length > 0).join(HINT_SEPARATOR);
52
- }