@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
package/CHANGELOG.md CHANGED
@@ -4,6 +4,70 @@ All notable changes to GoodVibes TUI.
4
4
 
5
5
  ---
6
6
 
7
+ ## [2.1.1] - 2026-11-02
8
+
9
+ ### Fixed
10
+
11
+ - Restore local llama.cpp replies, including DeepSeek responses after tool calls, by excluding the active assistant rendering block from model requests. This release uses SDK 2.1.1 and daemon 1.29.1 and adds a terminal regression check for the outgoing conversation.
12
+
13
+ ## [2.1.0] - 2026-09-30
14
+
15
+ ### Added
16
+
17
+ - **Themes.** display.theme picks goodvibes (the default), goodvibes-neon,
18
+ catppuccin, tokyonight, dracula, nord, gruvbox, one-dark, rosepine,
19
+ solarized, github, or system, which follows the terminal's own palette,
20
+ under tmux and over ssh too. Settings previews themes live. A theme you
21
+ already chose is kept.
22
+ - **Modals replace panes.** Usage, Changes, Agents and Notifications open as
23
+ large dimmed modals on one surface kit with a live search row and one-level
24
+ Esc; ctrl+p opens the command palette.
25
+ - **A calmer base screen.** A one-row header, an empty row under it,
26
+ full-width user messages, an input area that holds only input, and a status
27
+ line with the context bar and its compaction tick.
28
+ - **The throbber is back** on its own row above the input area, naming what
29
+ the session is doing with elapsed time, with half-row gaps between output,
30
+ throbber, input area and status line.
31
+ - **A lane-graph work tree** with status on each bead, agents as lanes,
32
+ folding, and a display.treeGlyphs choice of rounded, square or ascii.
33
+ - **Full-screen agent and process views** with session chips. Esc never
34
+ stops them and ctrl+x asks before stopping.
35
+ - **A back-to-bottom pill** shows while the output is scrolled back. Esc
36
+ returns to the live output and never interrupts the turn.
37
+ - **Notifications name the work** on the desktop, in the terminal, on
38
+ webhooks and for approvals, budgets, agents and workstreams. The
39
+ behavior.notificationsMetadataOnly setting sends metadata only and is off
40
+ by default.
41
+ - **System notices are toasts** kept in a /notifications history with plain
42
+ names, one entry per event.
43
+ - /context window and /status say where the context window came from.
44
+
45
+ ### Changed
46
+
47
+ - **WRFC chains run in their own git worktree.** A passed chain commits only
48
+ its own changes plus edits GoodVibes' own tools made, runs your git hooks,
49
+ and leaves your other uncommitted edits in place. A failed chain stops its
50
+ remaining fix tasks.
51
+ - A remote model with no real window takes it from the models.dev catalog,
52
+ so abacusai route-llm reads 128.0k instead of a guessed 8.2k.
53
+ - The pins move to sdk 2.1.0 and daemon 1.29.0.
54
+ - Every open dependency advisory is closed: undici, brace-expansion, the
55
+ Anthropic client (0.92), qs, body-parser, ip-address, fflate, fast-uri,
56
+ js-yaml and sharp move to patched versions.
57
+
58
+ ### Fixed
59
+
60
+ - Read and command bodies keep their indentation; wrapped prose no longer
61
+ starts one column right; long code lines wrap.
62
+ - A finished turn stops saying working; ended processes stop counting as
63
+ running.
64
+ - The recovery offer opens before the first frame and never takes keys typed
65
+ before it appeared.
66
+ - Instructions meant for the model no longer show as notices, and notices
67
+ keep their full text.
68
+ - Printed command output survives resizes.
69
+
70
+
7
71
  ## [2.0.21] - 2026-08-23
8
72
 
9
73
  ### Changes
@@ -1696,7 +1760,7 @@ First release of the best-in-class program: a full UX-first review of the codeba
1696
1760
  - `bun run tsc --noEmit --pretty false`
1697
1761
  - `bun run smoke:daemon`
1698
1762
  - local `npm pack` install smoke with `GOODVIBES_ASSET_SOURCE_DIR=dist`
1699
- - `/home/buzzkill/Projects/goodvibes-tui/dist/goodvibes-linux-x64 --version` from `/home/buzzkill/Projects/ttest1`
1763
+ - The compiled `goodvibes-linux-x64 --version` command from a separate test workspace.
1700
1764
 
1701
1765
  ---
1702
1766
 
package/README.md CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  [![CI](https://github.com/mgd34msu/goodvibes-tui/actions/workflows/ci.yml/badge.svg)](https://github.com/mgd34msu/goodvibes-tui/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
- [![Version](https://img.shields.io/badge/version-2.0.21-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
5
+ [![Version](https://img.shields.io/badge/version-2.1.1-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
6
6
 
7
7
  GoodVibes is a terminal console for coding and operations work with an AI model. You run `goodvibes` in a project directory and get a full-screen terminal app where you talk to a model that can read and edit your files, run shell commands, search the web, and hand work off to background agents, asking your permission before anything that writes or executes.
8
8
 
9
- It talks to many model providers (OpenAI, Anthropic, Gemini, Bedrock, Copilot, OpenRouter and other OpenAI-compatible gateways, plus local servers like Ollama and LM Studio that `/scan` finds on your machine and LAN), keeps its settings, sessions, and secrets on your own machine, and shows you the token count and running cost of every turn. Alongside the conversation, panels turn background work into live control rooms: running agents, git state, diffs, tokens, cost.
9
+ It talks to many model providers (OpenAI, Anthropic, Gemini, Bedrock, Copilot, OpenRouter and other OpenAI-compatible gateways, plus local servers like Ollama and LM Studio that `/scan` finds on your machine and LAN), keeps its settings, sessions, and secrets on your own machine, and shows you the token count and running cost of every turn. Background work opens in large modals over the conversation: running agents, changed files and diffs, tokens and cost.
10
10
 
11
- <img src="docs/assets/splash.png" alt="GoodVibes starting up in a terminal: a glitch-art GOODVIBES wordmark in cyan-to-magenta gradient, the version and tagline beneath it, the active model and tool count, the working directory, a line offering to resume the last session, and a hint line reading Ctrl+P panels / ? help / F2 fleet. A status footer shows mode, token usage, context usage, and the daemon and web listener addresses." width="900">
11
+ <img src="docs/assets/splash.png" alt="GoodVibes 2.1.0 starting up in a terminal. A thin header reads GoodVibes 2.1.0 on the left and the git branch main with a changes dot and the model gpt-6.1-sol on the right. Centered below is a block-letter GOODVIBES wordmark in a cyan-to-violet gradient between two rules, the tagline, the version v2.1.0 with terminal AI assistant, the active model openai:gpt-6.1-sol with 29 tools, the working directory /tmp/orbit-watch, and a hint line reading Ctrl+P commands / ? help / F2 agents. At the bottom is an empty input box reading Ask anything, or type / for commands and @ for files, and a status line showing the normal permission mode, the directory and branch, a cost of zero dollars, an empty context bar at 0 percent of 1.1M, and ctrl+p menu." width="900">
12
12
 
13
13
  ---
14
14
 
@@ -47,21 +47,21 @@ Deeper install notes are in [docs/getting-started.md](docs/getting-started.md):
47
47
 
48
48
  ### The conversation loop
49
49
 
50
- <img src="docs/assets/conversation.png" alt="Two conversation turns in the terminal. The tail of an earlier answer describes the project as a minimal ISS pass tracker whose calculation is still a stub. Below it the user asks the model to grep for nextPass and list every file that references it; an assistant block shows one find tool call with a green checkmark, and its result is expanded as syntax-highlighted JSON with line numbers listing the two matching file paths and a count of 2. The final answer names src/passes.ts and src/index.ts as a bulleted list. The footer reads Token Usage: Input em dash, Output 264, Cache Read 0, Cache Write 0, Total 264, approximately 0.0040 dollars, above a green context usage bar at 4 percent." width="900">
50
+ <img src="docs/assets/conversation.png" alt="Two conversation turns. The user asks the model to search for nextPass and list every file that references it; the reply shows one collapsed find nextPass tool row with a green checkmark and the summary 2 matches in 2 files, then the answer listing src/index.ts and src/passes.ts. In the second turn the user asks, without running anything, for three things the tracker still needs, and the model answers with three short bullets about orbital-data refresh, pass-prediction validation, and alerts before upcoming passes. Each user message sits in a shaded block and each reply carries a small header with the model name, tool count, and elapsed time. The status line below the input shows the normal mode, the directory /tmp/orbit-watch, an estimated cost of about 3 cents, and the context bar at 1 percent, 14.4k of 1.1M tokens." width="900">
51
51
 
52
52
  Tool calls stream inline as the model makes them, then their results fold into a collapsible group so a long working session stays readable. Expand any group to see what actually came back. Assistant messages render markdown, syntax-highlighted code, and inline diffs, and any block can be collapsed, bookmarked, copied, or saved to a file.
53
53
 
54
- The footer keeps an honest running total: fresh input tokens separated from cache reads, output tokens, the estimated cost so far, and how much of the context window is used. When a model's price is not in the catalog, the cost is reported as unavailable rather than guessed.
54
+ The status line under the input keeps a running total: the estimated cost so far and how much of the context window is used. `/usage` breaks that down into fresh input tokens, cache reads, and output tokens. When a model's price is not in the catalog, the cost is reported as unavailable rather than guessed.
55
55
 
56
56
  ### Permissions and workspace trust
57
57
 
58
- <img src="docs/assets/workspace-trust.png" alt="A modal titled New workspace, choose a trust level, offering two options: Trust this workspace, full capability, all tools may run; and Keep restricted, read-only, explore safely, writes and commands are denied until trusted. Navigation hints read Up/Down Navigate, Enter Choose, Esc Close." width="820">
58
+ <img src="docs/assets/workspace-trust.png" alt="A modal over the dimmed conversation, titled New workspace: choose a trust level, with an esc key on its right. Two options are listed: Trust this workspace, full capability, all tools may run, which is highlighted; and Keep restricted (read-only), explore safely, writes and commands are denied until trusted. The hint row reads up and down to move, Enter to choose. Behind it, the transcript shows the model starting exec mkdir -p build and waiting." width="820">
59
59
 
60
- The first time you open a directory, GoodVibes asks how much it is allowed to do there. Restricted is read-only. The model can look around, but writes and commands are refused until you trust the workspace.
60
+ The first time the model wants to write or run something in a new directory, GoodVibes asks how much it is allowed to do there. Restricted is read-only. The model can look around, but writes and commands are refused until you trust the workspace.
61
61
 
62
- <img src="docs/assets/permission-prompt.png" alt="An execution approval prompt. A header reads EXECUTE, Shell Execution Approval, one more waiting. Fields list the requesting session, the tool exec, the full command mkdir -p build, the working directory, a Risk line reading HIGH write in red, the surface and radius, a summary, the decision class, the effects: process execution, filesystem mutation, possible network access, a reviewer checklist, and the raw tool arguments. Below, four numbered remember options scope an approval to this exact command, to every mkdir command, to every exec call in this project, or to the rest of the session in memory only. The action line reads: Y Allow once, 1-4 Allow and remember, N Deny, or type a reason to deny." width="900">
62
+ <img src="docs/assets/permission-prompt.png" alt="A Shell Execution Approval modal with an amber top edge over the dimmed conversation. The header reads EXECUTE and the session id. A shaded row shows the command mkdir -p build, followed by a red high risk tag beside Execute shell command. Three choices sit in a row, Allow once highlighted, Allow for session, and Deny, with d details on the right. The hint row reads: arrows to choose, Enter to confirm, y allow once, 1-4 remember, n deny, or type a reason to deny. Behind the modal the transcript line reads Waiting for your approval, exec, mkdir -p build." width="900">
63
63
 
64
- After that, the default permission mode is `prompt`: writes, edits, shell commands, network fetches, agent spawns, and MCP calls each stop and ask. The prompt shows what will run, in which directory, its assessed risk, and what it can affect. You can allow it once, deny it (optionally typing a reason the model sees), or remember the decision at whichever scope fits: this exact command, this command shape, this tool for the whole project, or just for the rest of the session.
64
+ After that, the default permission mode is `prompt`: writes, edits, shell commands, network fetches, agent spawns, and MCP calls each stop and ask. The prompt shows what will run and its assessed risk; `d` expands the details, including the working directory, what it can affect, and the raw arguments. You can allow it once, deny it (optionally typing a reason the model sees), or remember the decision at whichever scope fits: this exact command, this command shape, this tool for the whole project, or just for the rest of the session.
65
65
 
66
66
  Four other modes are available when prompting is not what you want:
67
67
 
@@ -74,21 +74,21 @@ Four other modes are available when prompting is not what you want:
74
74
 
75
75
  ### Models and providers
76
76
 
77
- <img src="docs/assets/model-picker.png" alt="A fullscreen model workspace. A left column lists routing targets: Main Chat set, Helper Model off, Tool LLM off, TTS LLM inherit, and Embeddings set. The right pane shows the selected target with its current model and a filter row for search, price, capability, grouping, and availability. Below, a table of models lists model key, display name, provider, context window, tier, and capability flags across 2030 catalogued entries, with a footer of list shortcuts." width="900">
77
+ <img src="docs/assets/model-picker.png" alt="The Models modal opened with /model. Tabs across the top name the routing targets: Main Chat, selected, then Helper (off), Tool LLM (off), TTS, and Embeddings. Below is a search field and a count reading available only, 2,574 of 3,214. The left column lists models grouped by provider, here abacusai, with each model's context window; the right pane describes the highlighted model, its provider, the current Main Chat model openai:gpt-6.1-sol, its status configured, its context window and capability tags, and the filter shortcuts for price, capability, availability, benchmark sort, and grouping. The footer reads Enter use for Main Chat, tab next target, ctrl+f pin, ctrl+r refresh catalog, and 2550 more." width="900">
78
78
 
79
79
  Models come from a live catalog, so the picker lists far more than a hardcoded set, filterable by search, price, capability, and availability. Separate roles route independently: your main chat model, a cheaper helper model for grunt work, a tool model, a TTS model, and an embeddings model can each point somewhere different.
80
80
 
81
81
  The `synthetic` provider groups the same model across every backend that serves it into one entry. Pick it and requests route to whichever backend is healthy, failing over on rate limits and transient errors without changing the model you chose, and without ever crossing the free, paid, and subscription boundaries. Any OpenAI-compatible API can be added as a custom provider by dropping a JSON file in `~/.goodvibes/tui/providers/`. It is hot-reloaded. See [docs/providers-and-routing.md](docs/providers-and-routing.md).
82
82
 
83
- ### The Fleet control room
83
+ ### The Agents control room
84
84
 
85
- <img src="docs/assets/fleet-panel.png" alt="The Fleet panel open beside the conversation. It lists background work as rows with a kind, a name, elapsed time, token count, and cost: a CI watch poller and a runtime heartbeat watcher at 4 minutes 23 seconds each, and an idle code indexer. The detail region below shows the selected watcher's id, state idle, elapsed time, model, tokens, cost, a headline reading CI watch poller, healthy, an activity phase, and an approvals line. The action hints read j/k navigate, Enter attach, K kill, A archive finished, v archived, n host agent." width="900">
85
+ <img src="docs/assets/fleet-panel.png" alt="The Agents modal opened with F2, headed 0 running, the session's own cost, and the fleet cost. The filter field holds the word healthy and shows 3 of 8 rows. Under a running heading the list shows three watchers, CI watch poller, Daemon heartbeat, and Runtime heartbeat, each marked healthy with its elapsed time. The detail pane on the right describes the selected CI watch poller: watcher id ci-watch-poller, state idle, elapsed time, model unknown, tokens not applicable, cost unpriced, the headline CI watch poller, healthy, its activity phase, and approvals. The hint row reads Enter open full screen, s steer, ctrl+x stop, n new agent, v archive, a archive one, f follow." width="900">
86
86
 
87
- Work that is not conversation goes into panels instead of scrolling past in the transcript. Fleet, reached with `F2`, is the live control room for agents, workstreams, watchers, and scheduled jobs: what is running, for how long, at what token cost, and what it is waiting on. You can attach to a running agent to watch or steer it, detach again without killing it, pause and resume, and archive finished work. Git, diff, cost, token, and local-auth panels sit alongside it. Heavier operator surfaces open as review modals.
87
+ Work that is not conversation opens in modals instead of scrolling past in the transcript. Agents, reached with `F2`, is the live control room for agents, WRFC chains, workstreams, watchers, scheduled jobs and hosted sessions: what is running, for how long, at what token cost, and what it is waiting on. You can open a running agent to watch its live tail or steer it, back out with `Esc` without stopping it, stop it with `Ctrl+X` (it asks first), pause and resume, and archive finished work. Usage (`/usage`) shows context pressure, tokens and cost; Changes (`/changes`) shows changed files with a tinted diff, a semantic summary, hunk staging and review comments; Notifications (`/notifications`) keeps the history.
88
88
 
89
89
  ### Everything else is a command
90
90
 
91
- <img src="docs/assets/help-overlay.png" alt="A searchable help overlay titled Help, Commands, with a search field and results grouped by category. Under Provider Accounts is the /accounts command with review, panel, show, routes, and repair subcommands and a one-line description. Under Fleet is /agents, described as hosting third-party coding agents as fleet rows over ACP. Under Experience is /approval, for reviewing action-specific approval classes. A line reads 147 below, and the hints read Up/Down Navigate, Enter Run, / Search, Esc Close." width="820">
91
+ <img src="docs/assets/help-overlay.png" alt="The Help: Commands modal opened with the question-mark key, with a Type to filter field and a count of 160 items. Commands are grouped under category headings: provider accounts with /accounts and its review, panel, show, routes, and repair subcommands, highlighted; agents with /agents, which opens Agents and lists or hosts third-party coding agents over ACP; experience with /approval; platform access with /auth and its long list of subcommands; local runtime with /bookmarks; experience with /bootstrap; and branches with /branch. The hint row reads up and down to move, Enter to run, and 153 more." width="820">
92
92
 
93
93
  Press `?` for a searchable, categorized list of every slash command with its arguments and description. The same list is generated into [docs/commands-reference.md](docs/commands-reference.md).
94
94
 
@@ -99,17 +99,17 @@ Press `?` for a searchable, categorized list of every slash command with its arg
99
99
  | `Enter` / `Shift+Enter` | Send the message / insert a newline |
100
100
  | `?` | Help and command picker (on an empty prompt) |
101
101
  | `@` | File picker: insert a path into the prompt |
102
- | `Tab` | Toggle collapse on the nearest block, or complete a path |
102
+ | `Tab` | Complete a path, or toggle collapse on the nearest block. With the session chips showing and an empty composer, switch to the next session |
103
103
  | `Ctrl+F` | Search the conversation |
104
104
  | `Ctrl+Y` / `Ctrl+S` | Copy / save the nearest block |
105
- | `Ctrl+P` | Toggle the panel sidebar |
106
- | `F2` | Toggle Fleet: open and focus it, bring it to front, or close it |
107
- | `Ctrl+K` | Command palette: search and run any command |
108
- | `Shift+Tab` | Cycle the session permission mode |
109
- | `Esc` | Leave the current mode: search, command, or modal |
105
+ | `Ctrl+P` / `Ctrl+K` | Command palette: search and run any command, view or setting |
106
+ | `F2` / `Ctrl+O` | Open or close Agents |
107
+ | `Shift+Tab` | Cycle the session permission mode. With the session chips showing and an empty composer, switch to the previous session |
108
+ | `Esc` | Close the top modal (one level), clear the composer, leave an agent or process view (never stops it), or interrupt main's turn |
109
+ | `Ctrl+X` | Inside an agent or process view: stop it (press twice to confirm) |
110
110
  | `Ctrl+C` | Clear input, cancel a running turn. Press twice to quit |
111
111
 
112
- Most bindings are customizable in `~/.goodvibes/tui/keybindings.json`, and `/keybindings` shows what is currently bound. Five keys are fixed and stay out of that file: `F2` (Fleet), `Shift+Tab` (permission-mode cycle), `Esc` (leave the current mode), `?` (help), and `@` (file picker). The full reference is in [docs/tools-and-commands.md](docs/tools-and-commands.md).
112
+ Most bindings are customizable in `~/.goodvibes/tui/keybindings.json`, and `/keybindings` shows what is currently bound. Five keys are fixed and stay out of that file: `F2` (Agents), `Shift+Tab` (permission-mode cycle), `Esc` (leave the current mode), `?` (help), and `@` (file picker). The full reference is in [docs/tools-and-commands.md](docs/tools-and-commands.md).
113
113
 
114
114
  ---
115
115
 
@@ -129,7 +129,7 @@ Each row links to the page that documents it. The product's own `?` overlay and
129
129
  | CLI flags | Session lifecycle (`--continue`, `--resume`, `--fork`), non-interactive mode, output formats, host selection | [cli-flags.md](docs/cli-flags.md) |
130
130
  | Knowledge and memory | Session and durable memory, a structured knowledge store with connectors and extractors, embeddings and retrieval, artifacts, multimodal analysis | [knowledge-artifacts-and-multimodal.md](docs/knowledge-artifacts-and-multimodal.md) |
131
131
  | Session durability | Post-turn snapshots plus an fsync-per-record transcript journal replayed at every resume | [session-durability.md](docs/session-durability.md) |
132
- | Planning | Conversational planning loop, project-scoped knowledge spaces, readiness evaluation, the Planning panel | [project-planning.md](docs/project-planning.md) |
132
+ | Planning | Conversational planning loop, project-scoped knowledge spaces, readiness evaluation, the Planning modal | [project-planning.md](docs/project-planning.md) |
133
133
  | Sharing and export | `/share` to HTML, JSON, or Markdown with redaction, upload, and clipboard options | [share-command.md](docs/share-command.md) |
134
134
  | Daemon and services | Connecting to the standalone GoodVibes daemon, browser operator surface, background service and autostart, inbound TLS, outbound trust | [deployment-and-services.md](docs/deployment-and-services.md) |
135
135
  | Remote access | A worked home-server setup: always-on daemon, browser access, TUI over SSH, reachability and TLS | [remote-access.md](docs/remote-access.md) |
@@ -137,7 +137,7 @@ Each row links to the page that documents it. The product's own `?` overlay and
137
137
  | Voice | Live `/tts` playback, TTS and STT providers, streaming voice API | [voice-and-live-tts.md](docs/voice-and-live-tts.md) |
138
138
  | Sandboxing | Bounded eval and isolated MCP execution, with a QEMU-backed VM path | [qemu-sandbox.md](docs/qemu-sandbox.md) |
139
139
  | Integrations | Home Assistant surface, Cloudflare Workers/Queues batch, GitHub Action | [homeassistant-surface.md](docs/homeassistant-surface.md) · [cloudflare-batch.md](docs/cloudflare-batch.md) · [github-action.md](docs/github-action.md) |
140
- | Contributing surfaces | Writing a new TUI panel; the checked-in operator/peer contracts and knowledge schemas | [panel-authoring.md](docs/panel-authoring.md) · [foundation-artifacts](docs/foundation-artifacts/README.md) |
140
+ | Contributing surfaces | The checked-in operator/peer contracts and knowledge schemas | [foundation-artifacts](docs/foundation-artifacts/README.md) |
141
141
 
142
142
  Full index: [docs/README.md](docs/README.md).
143
143
 
@@ -213,17 +213,18 @@ bun run dev
213
213
  | Command | Does |
214
214
  | --- | --- |
215
215
  | `bun run dev` | Run the TUI from source |
216
- | `bun run test` | Run the suite through the parallel per-file runner |
216
+ | `bun run test:changed` | Run the test files your change affects (since `origin/main`) |
217
+ | `bun run test` | Run the whole suite through the parallel per-file runner (CI runs it on every push) |
217
218
  | `bun run build` | Compile `src/main.ts` into `dist/goodvibes` |
218
219
 
219
220
  The compiled binary is the TUI entrypoint. With `daemon.enabled` on (the default) it adopts a running standalone GoodVibes daemon over loopback, and when a daemon is installed as a service but stopped, it starts that service once and waits for it to come online. It never embeds or constructs a daemon of its own. The control plane, HTTP listener (`danger.httpListener`), and web surface are all hosted by the daemon; the TUI configures them and reports their bindings.
220
221
 
221
- Tests live under `src/test/`, mirroring the source tree, and cover contract, security, release-gate, runtime, renderer, panel, integration, and anti-regression cases. Several gates run alongside them in CI: byte-exact golden renderer frames, performance budgets for startup and frame composition and line production (`scripts/perf-baseline.json`), and architecture rules for import cycles, layer boundaries, source-file size, and unused renderer exports (`scripts/check-architecture.ts`).
222
+ Tests live under `src/test/`, mirroring the source tree; byte-exact golden renderer frames are part of that suite. End-to-end tests under `src/test/e2e/` drive the compiled binary in a real terminal against a scripted model. CI also checks import cycles and layer boundaries (`scripts/check-architecture.ts`), and the release gates hold the performance budgets (`scripts/perf-baseline.json`). [Testing and validation](docs/testing-and-validation.md) says what runs where.
222
223
 
223
224
  Some decisions worth knowing before you read the source:
224
225
 
225
226
  - **Bun runtime.** Native TypeScript execution, fast startup, built-in test runner.
226
- - **Raw ANSI renderer.** It writes the UI straight to the alternate screen buffer, giving direct control over every byte sent to the terminal. Conversation, panels, modals, overlays, and the footer all share that one renderer.
227
+ - **Raw ANSI renderer.** It writes the UI straight to the alternate screen buffer, giving direct control over every byte sent to the terminal. Conversation, modals, overlays, and the footer all share that one renderer.
227
228
  - **In-process agents.** Agents run in the same process rather than over IPC, staying isolated through scoped tool registries and namespaced state.
228
229
  - **Typed runtime store.** A plain `zustand/vanilla` store with typed selectors and dispatch paths, reachable from agents, tools, renderer, hooks, channels, and daemon surfaces alike.
229
230
  - **Tree-sitter and bundled language servers.** Grammars for structural analysis, outlines, and AST-level edits, several embedded as WASM for instant startup. TypeScript, Python, Bash, CSS, HTML, and JSON language servers ship as dependencies, while `rust-analyzer` and `gopls` are fetched on first use with checksum verification.
@@ -233,13 +234,13 @@ Some decisions worth knowing before you read the source:
233
234
 
234
235
  The TUI consumes the published `@pellux/goodvibes-sdk` platform layer for shared contracts, daemon routes, and transports, and keeps the terminal UI, host wiring, and product composition here. The dependency is pinned in `package.json`. Reference consumers of those surfaces live under [`examples/`](examples/reference-operator-client/README.md).
235
236
 
236
- Source layout, in brief:
237
+ Source layout, in brief (the layer rules and the operator API bridge are in [docs/architecture.md](docs/architecture.md)):
237
238
 
238
239
  ```text
239
240
  src/
240
241
  ├── main.ts, core/ terminal entrypoint, orchestrator, conversation and transcript state
241
242
  ├── renderer/ raw ANSI compositor, overlays, modals, fullscreen workspaces
242
- ├── panels/ panel manager, the Fleet control room, git/diff/cost/token consoles
243
+ ├── views/ modal surfaces, the fleet read model and acts behind Agents, view wiring
243
244
  ├── input/ slash commands, keybindings, composer, pickers, settings modals
244
245
  ├── runtime/ bootstrap wiring, typed store, service composition, session recovery
245
246
  ├── shell/ shell-level modal openers, blocking input, retry affordances
@@ -248,7 +249,7 @@ src/
248
249
  ├── cli/ flag parsing, management verbs, doctor, launch-time self-update
249
250
  ├── tools/, mcp/ TUI-local tool guards, MCP runtime reload
250
251
  ├── audio/, export/ voice capture, wake word, playback and speech routing; gist upload
251
- ├── verification/, widget/ live verifier and its ledger, the terminal widget module
252
+ ├── verification/, widget/ live verifier, the terminal widget module
252
253
  ├── utils/, scripts/ formatting and clipboard helpers, message processing script
253
254
  └── test/ the suite, mirroring the tree above
254
255
  ```
package/docs/README.md CHANGED
@@ -32,7 +32,7 @@ This directory contains the current product documentation for `goodvibes-tui`.
32
32
  Session memory, durable memory, structured knowledge, connectors, extractors, embeddings, artifacts, and multimodal analysis.
33
33
 
34
34
  - [Project planning](project-planning.md)
35
- TUI-owned conversational planning loop, passive SDK planning artifacts, project-scoped knowledge spaces, readiness evaluation, and the Planning panel.
35
+ TUI-owned conversational planning loop, passive SDK planning artifacts, project-scoped knowledge spaces, readiness evaluation, and the Planning modal.
36
36
 
37
37
  - [Channels, remote runtime, and API](channels-remote-and-api.md)
38
38
  Omnichannel surfaces, reply routing, remote peers, node-host contracts, and the daemon/control-plane HTTP + streaming surfaces.
@@ -46,6 +46,9 @@ This directory contains the current product documentation for `goodvibes-tui`.
46
46
  - [CLI flags](cli-flags.md)
47
47
  Global flags reference covering session lifecycle (`--continue`, `--resume`, `--fork`), the `-y`/`--non-interactive` commit gate for plugin bundle installs, output format consolidation, the `--host` alias, and all other startup and command-specific flags.
48
48
 
49
+ - [Architecture](architecture.md)
50
+ Source layout, the import-direction rules `bun run architecture:check` enforces, and the operator API bridge that answers `panels.list` / `panels.open` with the modal views.
51
+
49
52
  - [Commands reference](commands-reference.md)
50
53
  The generated, categorized list of every slash command, its arguments, and its description. It is the same list `?` renders in the product.
51
54
 
@@ -61,11 +64,11 @@ This directory contains the current product documentation for `goodvibes-tui`.
61
64
  - [Release and publishing](release-and-publishing.md)
62
65
  Release validation, GitHub CD, compiled binary releases, npm distribution, and the GitHub Packages mirror.
63
66
 
64
- - [Local verification](verification/local-verification.md)
65
- Inventory coverage, GoodVibes home audits, compiled CLI probes, authenticated daemon probes, and release-oriented local gates.
67
+ - [Testing and validation](testing-and-validation.md)
68
+ What runs while you work, on every push, and before a release; the test layers; the end-to-end tests against the built binary.
66
69
 
67
- - [Panel authoring](panel-authoring.md)
68
- Class hierarchy, canonical example, palette convention, rendering utilities, input handling, performance instrumentation, and contract test registration for contributors building new TUI panels.
70
+ - [Local verification](verification/local-verification.md)
71
+ GoodVibes home audits, compiled CLI probes, and authenticated daemon probes against your own machine.
69
72
 
70
73
  - [Changelog](../CHANGELOG.md)
71
74
  Current release history. Older per-version release-note files remain under `docs/releases/` for historical releases, but `CHANGELOG.md` is the canonical current stream.
@@ -3,7 +3,7 @@
3
3
  "product": {
4
4
  "id": "goodvibes",
5
5
  "surface": "operator",
6
- "version": "2.0.23"
6
+ "version": "2.1.1"
7
7
  },
8
8
  "auth": {
9
9
  "modes": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-tui",
3
- "version": "2.0.21",
3
+ "version": "2.1.1",
4
4
  "description": "Terminal-native GoodVibes client for coding, operations, knowledge and channel workflows; a pure client of the GoodVibes daemon.",
5
5
  "type": "module",
6
6
  "main": "src/main.ts",
@@ -36,10 +36,13 @@
36
36
  "build:all-shell": "bun run build:linux-x64 && bun run build:linux-arm64 && bun run build:macos-x64 && bun run build:macos-arm64 && bun run build:windows",
37
37
  "typecheck": "bunx tsc --noEmit",
38
38
  "typecheck:test": "bunx tsc --noEmit -p tsconfig.test.json",
39
- "typecheck:coverage": "bun run scripts/typecheck-coverage-rule.ts",
40
39
  "test": "bun run scripts/run-tests.ts",
41
- "test:coverage": "bun run scripts/coverage-gate.ts",
42
- "version": "bun run scripts/prebuild.ts",
40
+ "test:changed": "bun run scripts/run-tests.ts --changed=origin/main",
41
+ "test:e2e": "bun test --timeout=300000 src/test/e2e",
42
+ "test:e2e:fast": "bun test --timeout=120000 src/test/e2e/startup.e2e.test.ts src/test/e2e/first-turn.e2e.test.ts",
43
+ "test:e2e:release": "bun test --timeout=300000 src/test/e2e/daemon-adoption.e2e.test.ts src/test/e2e/wrfc-chain.e2e.test.ts src/test/e2e/turn-notification.e2e.test.ts src/test/e2e/resize.e2e.test.ts",
44
+ "version": "bun run scripts/release-prepare.ts --no-bump",
45
+ "release:prepare": "bun run scripts/release-prepare.ts",
43
46
  "preinstall": "sh scripts/check-bun.sh",
44
47
  "postinstall": "bun scripts/postinstall.js",
45
48
  "postbuild": "bun scripts/postinstall.js --no-download",
@@ -63,11 +66,7 @@
63
66
  "audit:home": "bun run scripts/audit-goodvibes-home.ts",
64
67
  "foundation:artifacts": "bun run scripts/export-foundation-artifacts.ts",
65
68
  "docs:commands": "bun run scripts/generate-command-reference.ts",
66
- "verification:ledger": "bun run scripts/verification-ledger.ts",
67
- "verification:live": "bun run scripts/verify-live.ts",
68
- "eval:gate": "bun run scripts/eval-gate.ts",
69
- "eval:gate:verbose": "bun run scripts/eval-gate.ts --verbose",
70
- "eval:baseline": "bun run scripts/eval-gate.ts --save-baseline"
69
+ "verification:live": "bun run scripts/verify-live.ts"
71
70
  },
72
71
  "license": "MIT",
73
72
  "repository": {
@@ -96,18 +95,18 @@
96
95
  "@anthropic-ai/bedrock-sdk": "^0.29.1",
97
96
  "@anthropic-ai/sdk": "^0.92.0",
98
97
  "@ast-grep/napi": "^0.42.0",
99
- "@pellux/goodvibes-sdk": "2.0.23",
100
- "@pellux/goodvibes-terminal-shell": "2.0.23",
98
+ "@pellux/goodvibes-sdk": "2.1.1",
99
+ "@pellux/goodvibes-terminal-shell": "2.1.1",
101
100
  "bash-language-server": "^5.6.0",
102
101
  "fuse.js": "^7.1.0",
103
- "@pellux/goodvibes-daemon": "1.28.25",
102
+ "@pellux/goodvibes-daemon": "1.29.1",
104
103
  "graphql": "^16.13.2",
105
104
  "jszip": "^3.10.1",
106
105
  "node-edge-tts": "^1.2.10",
107
106
  "onnxruntime-web": "^1.27.0",
108
107
  "openai": "6.46.0",
109
108
  "pyright": "^1.1.408",
110
- "simple-git": "^3.33.0",
109
+ "simple-git": "^4.0.2",
111
110
  "sql.js": "^1.14.1",
112
111
  "sqlite-vec": "^0.1.9",
113
112
  "tree-sitter-css": "^0.25.0",
@@ -121,18 +120,28 @@
121
120
  "zustand": "^5.0.12"
122
121
  },
123
122
  "devDependencies": {
124
- "@pellux/goodvibes-toolchain": "2.0.23",
123
+ "@pellux/goodvibes-toolchain": "2.1.1",
125
124
  "@types/bun": "^1.3.10",
126
125
  "typescript": "^5.9.3"
127
126
  },
128
127
  "optionalDependencies": {
129
- "@pellux/goodvibes-tui-linux-x64": "2.0.6",
130
- "@pellux/goodvibes-tui-linux-arm64": "2.0.6",
131
- "@pellux/goodvibes-tui-darwin-x64": "2.0.6",
132
- "@pellux/goodvibes-tui-darwin-arm64": "2.0.6"
128
+ "@pellux/goodvibes-tui-linux-x64": "2.1.1",
129
+ "@pellux/goodvibes-tui-linux-arm64": "2.1.1",
130
+ "@pellux/goodvibes-tui-darwin-x64": "2.1.1",
131
+ "@pellux/goodvibes-tui-darwin-arm64": "2.1.1"
133
132
  },
134
133
  "trustedDependencies": [],
135
134
  "overrides": {
136
- "minimatch": "^10.2.5"
135
+ "minimatch": "^10.2.5",
136
+ "undici": "^7.29.1",
137
+ "brace-expansion": "^5.0.11",
138
+ "@anthropic-ai/sdk": "^0.92.0",
139
+ "qs": "^6.16.0",
140
+ "body-parser": "^1.20.8",
141
+ "ip-address": "^10.7.2",
142
+ "fflate": "^0.8.3",
143
+ "fast-uri": "^3.1.6",
144
+ "js-yaml": "^4.3.2",
145
+ "sharp": "^0.35.4"
137
146
  }
138
147
  }
@@ -232,6 +232,8 @@ async function renderModels(runtime: CliCommandRuntime): Promise<string> {
232
232
  id: model.id,
233
233
  displayName: model.displayName,
234
234
  contextWindow: services.providerRegistry.getContextWindowForModel(model),
235
+ // False when nothing states the window (a guess, or disproven by a larger accepted request).
236
+ contextWindowKnown: services.providerRegistry.getKnownContextWindowForModel(model) !== null,
235
237
  providerConfigured: providerSnapshot?.runtime.auth?.configured ?? true,
236
238
  setup,
237
239
  };
@@ -241,7 +243,7 @@ async function renderModels(runtime: CliCommandRuntime): Promise<string> {
241
243
  ` provider: ${model.provider}`,
242
244
  ` setup: ${setup.setupLabel}`,
243
245
  ` provider configured: ${yesNo(value.providerConfigured)}`,
244
- ` context: ${value.contextWindow.toLocaleString()}`,
246
+ ` context: ${value.contextWindowKnown ? value.contextWindow.toLocaleString() : 'unknown'}`,
245
247
  ].join('\n'));
246
248
  }
247
249
  if (subOrFilter === 'use' || subOrFilter === 'set') {
@@ -316,6 +318,7 @@ async function renderModels(runtime: CliCommandRuntime): Promise<string> {
316
318
  id: model.id,
317
319
  displayName: model.displayName,
318
320
  contextWindow: services.providerRegistry.getContextWindowForModel(model),
321
+ contextWindowKnown: services.providerRegistry.getKnownContextWindowForModel(model) !== null,
319
322
  current: model.registryKey === current,
320
323
  ...(synthInfo !== null ? {
321
324
  isSynthetic: true,
@@ -331,7 +334,7 @@ async function renderModels(runtime: CliCommandRuntime): Promise<string> {
331
334
  const synthLabel = model.isSynthetic
332
335
  ? ` [synthetic ${model.syntheticConfiguredBackends}/${model.syntheticBackends}p]`
333
336
  : '';
334
- return ` ${model.current ? '*' : ' '} ${model.registryKey.padEnd(42)} setup=${model.setupClass} ctx=${model.contextWindow.toLocaleString()}${synthLabel} ${model.displayName}`;
337
+ return ` ${model.current ? '*' : ' '} ${model.registryKey.padEnd(42)} setup=${model.setupClass} ctx=${model.contextWindowKnown ? model.contextWindow.toLocaleString() : 'unknown'}${synthLabel} ${model.displayName}`;
335
338
  }),
336
339
  ].join('\n'));
337
340
  });
@@ -7,7 +7,7 @@ import { startOnboardingFastPath } from '../runtime/onboarding/fast-path.ts';
7
7
  import { checkRecoveryForSession, readLastSessionPointer, type SessionSurface } from '@/runtime/index.ts';
8
8
  import { logger } from '@pellux/goodvibes-sdk/platform/utils';
9
9
  import { writeFatalLine } from '@pellux/goodvibes-sdk/platform/daemon';
10
- import { offerRecoverySnapshot } from '../runtime/recovery-prompt.ts';
10
+ import { offerRecoverySnapshot, type RecoveryTypeaheadHooks } from '../runtime/recovery-prompt.ts';
11
11
  import { buildRecoveryOfferWiring } from '../runtime/recovery-offer-wiring.ts';
12
12
  import type { ConversationManager } from '../core/conversation.ts';
13
13
  import type { SessionManager } from '@pellux/goodvibes-sdk/platform/sessions';
@@ -34,6 +34,8 @@ export interface TuiStartupRecoveryDeps {
34
34
  readonly conversation: ConversationManager;
35
35
  readonly writeLastSessionPointer: (sessionId: string) => void;
36
36
  readonly receipt: (line: string) => void;
37
+ /** Holds typeahead out of the offer modal (see RecoveryPromptDeps.typeahead). */
38
+ readonly typeahead?: RecoveryTypeaheadHooks;
37
39
  }
38
40
 
39
41
  /**
@@ -59,11 +61,12 @@ export interface TuiStartupRecoveryDeps {
59
61
  * plain store resume, after the follow-up Keep/Remove question the
60
62
  * established flow always asks on decline.
61
63
  *
62
- * The modal itself is deferred to the next macrotask, mirroring
63
- * `scheduleRecoveryOffer`'s own reasoning: `applyInitialTuiCliState` runs
64
- * before the shell's first render, so asking a question here synchronously
65
- * would draw it at a blank terminal. The synchronous `checkRecoveryForSession`
66
- * probe above needs no such deferral, only opening the modal does.
64
+ * The modal opens synchronously, before the shell's first frame, like the
65
+ * general boot offer (startRecoveryOffer in runtime/recovery-prompt.ts): the
66
+ * first frame already carries the question, so the composer is never live
67
+ * underneath it, and keys typed before it was painted are held out of it by
68
+ * the typeahead gate (recovery.typeahead). This runs before the general
69
+ * offer, so it still asks first.
67
70
  */
68
71
  async function resumeNamedSessionWithRecoveryCheck(options: {
69
72
  readonly sessionId: string;
@@ -88,39 +91,31 @@ async function resumeNamedSessionWithRecoveryCheck(options: {
88
91
  return;
89
92
  }
90
93
 
91
- await new Promise<void>((resolve) => {
92
- const timer = setTimeout(() => {
93
- void (async () => {
94
- try {
95
- const deps = buildRecoveryOfferWiring({
96
- surface,
97
- sessionManager: recovery.sessionManager,
98
- runtime: recovery.runtime,
99
- conversation: recovery.conversation,
100
- commandContext,
101
- writeLastSessionPointer: recovery.writeLastSessionPointer,
102
- receipt: recovery.receipt,
103
- render,
104
- });
105
- const outcome = await offerRecoverySnapshot({ ...deps, targetSessionId: sessionId });
106
- if (outcome !== 'resumed') {
107
- await plainResume();
108
- }
109
- } catch {
110
- // Best-effort by construction (mirrors offerRecoverySnapshot's own
111
- // guarantee): a failure here must fall back to the plain resume
112
- // rather than leave the boot with nothing resumed at all.
113
- await plainResume().catch(() => {
114
- // A failing plain resume here is no worse than the pre-existing
115
- // behavior when session resume itself fails.
116
- });
117
- } finally {
118
- resolve();
119
- }
120
- })();
121
- }, 0);
122
- timer.unref?.();
123
- });
94
+ try {
95
+ const deps = buildRecoveryOfferWiring({
96
+ surface,
97
+ sessionManager: recovery.sessionManager,
98
+ runtime: recovery.runtime,
99
+ conversation: recovery.conversation,
100
+ commandContext,
101
+ writeLastSessionPointer: recovery.writeLastSessionPointer,
102
+ receipt: recovery.receipt,
103
+ render,
104
+ ...(recovery.typeahead ? { typeahead: recovery.typeahead } : {}),
105
+ });
106
+ const outcome = await offerRecoverySnapshot({ ...deps, targetSessionId: sessionId });
107
+ if (outcome !== 'resumed') {
108
+ await plainResume();
109
+ }
110
+ } catch {
111
+ // Best-effort by construction (mirrors offerRecoverySnapshot's own
112
+ // guarantee): a failure here must fall back to the plain resume rather
113
+ // than leave the boot with nothing resumed at all.
114
+ await plainResume().catch(() => {
115
+ // A failing plain resume here is no worse than the pre-existing
116
+ // behavior when session resume itself fails.
117
+ });
118
+ }
124
119
  }
125
120
 
126
121
  /**