@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.
- package/CHANGELOG.md +65 -1
- package/README.md +30 -29
- package/docs/README.md +8 -5
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +28 -19
- package/src/cli/management.ts +5 -2
- package/src/cli/tui-startup.ts +34 -39
- package/src/core/agent-view-render.ts +157 -0
- package/src/core/approval-alert.ts +49 -11
- package/src/core/bookmark-navigation.ts +7 -1
- package/src/core/budget-breach-notifier.ts +27 -8
- package/src/core/compaction-receipt.ts +1 -1
- package/src/core/context-usage.ts +1 -1
- package/src/core/conversation-compaction-render.ts +3 -3
- package/src/core/conversation-display-only.ts +86 -0
- package/src/core/conversation-event-navigation.ts +27 -0
- package/src/core/conversation-line-cache.ts +216 -447
- package/src/core/conversation-render-context.ts +20 -27
- package/src/core/conversation-rendering.ts +157 -575
- package/src/core/conversation-splash-state.ts +6 -1
- package/src/core/conversation-types.ts +35 -0
- package/src/core/conversation-usage.ts +12 -0
- package/src/core/conversation.ts +130 -131
- package/src/core/long-task-notifier.ts +100 -31
- package/src/core/notices.ts +75 -0
- package/src/core/pairing-tailscale-gateway.ts +1 -1
- package/src/core/process-output-log.ts +143 -0
- package/src/core/rewind-receipt.ts +1 -1
- package/src/core/session-focus.ts +190 -0
- package/src/core/session-resume-core.ts +23 -81
- package/src/core/stream-event-wiring.ts +31 -5
- package/src/core/system-message-noise.ts +2 -2
- package/src/core/system-message-router.ts +16 -18
- package/src/core/turn-event-wiring.ts +272 -33
- package/src/core/work-tree-focus.ts +290 -0
- package/src/core/work-tree-fold-store.ts +143 -0
- package/src/core/work-tree-model.ts +799 -0
- package/src/core/work-tree-render.ts +384 -0
- package/src/core/work-tree-sources.ts +184 -0
- package/src/core/work-tree-wiring.ts +176 -0
- package/src/core/workstream-notification.ts +36 -6
- package/src/core/wrfc-notice-titles.ts +37 -0
- package/src/input/agents-modal-text.ts +119 -0
- package/src/input/agents-modal.ts +699 -0
- package/src/input/bookmark-modal.ts +33 -9
- package/src/input/changes-git.ts +251 -0
- package/src/input/changes-modal.ts +629 -0
- package/src/input/changes-model.ts +125 -0
- package/src/input/command-palette-types.ts +41 -0
- package/src/input/command-palette.ts +272 -0
- package/src/input/command-reference.ts +2 -2
- package/src/input/command-registry.ts +77 -35
- package/src/input/commands/acp-runtime.ts +19 -9
- package/src/input/commands/channel-runtime.ts +2 -2
- package/src/input/commands/ci-runtime.ts +1 -1
- package/src/input/commands/codebase-runtime.ts +1 -1
- package/src/input/commands/config.ts +7 -1
- package/src/input/commands/context-window.ts +25 -19
- package/src/input/commands/control-room-runtime.ts +18 -18
- package/src/input/commands/conversation-runtime.ts +0 -1
- package/src/input/commands/cost-runtime.ts +29 -20
- package/src/input/commands/diff-runtime.ts +35 -181
- package/src/input/commands/eval.ts +1 -1
- package/src/input/commands/experience-runtime.ts +3 -7
- package/src/input/commands/fresh-conversation.ts +86 -0
- package/src/input/commands/git-runtime.ts +5 -22
- package/src/input/commands/graph-runtime.ts +1 -1
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-runtime.ts +8 -9
- package/src/input/commands/hooks-runtime.ts +2 -2
- package/src/input/commands/hosted-runtime.ts +3 -3
- package/src/input/commands/incident-runtime.ts +3 -3
- package/src/input/commands/intelligence-runtime.ts +6 -9
- package/src/input/commands/knowledge.ts +2 -2
- package/src/input/commands/legacy-panel-command.ts +57 -0
- package/src/input/commands/local-auth-runtime.ts +8 -9
- package/src/input/commands/local-provider-runtime.ts +7 -4
- package/src/input/commands/local-runtime.ts +12 -15
- package/src/input/commands/local-setup-review.ts +1 -1
- package/src/input/commands/local-setup.ts +13 -19
- package/src/input/commands/memory.ts +1 -1
- package/src/input/commands/notify-runtime.ts +9 -0
- package/src/input/commands/operator-runtime.ts +10 -12
- package/src/input/commands/permissions-provenance.ts +3 -3
- package/src/input/commands/planning-runtime.ts +7 -7
- package/src/input/commands/platform-sandbox-runtime.ts +2 -2
- package/src/input/commands/platform-services-runtime.ts +1 -1
- package/src/input/commands/policy-dispatch.ts +2 -2
- package/src/input/commands/policy.ts +3 -3
- package/src/input/commands/provider.ts +1 -1
- package/src/input/commands/remote-runtime.ts +1 -1
- package/src/input/commands/review-runtime.ts +39 -94
- package/src/input/commands/rewind-runtime.ts +81 -108
- package/src/input/commands/runtime-services.ts +15 -17
- package/src/input/commands/services-runtime.ts +2 -2
- package/src/input/commands/session-content.ts +21 -5
- package/src/input/commands/session-workflow.ts +13 -38
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/shell-core.ts +19 -4
- package/src/input/commands/skills-runtime.ts +2 -2
- package/src/input/commands/status-runtime.ts +13 -0
- package/src/input/commands/subscription-runtime.ts +1 -1
- package/src/input/commands/tasks-runtime.ts +2 -8
- package/src/input/commands/work-plan-runtime.ts +4 -4
- package/src/input/commands/workstream-attempts.ts +24 -47
- package/src/input/commands/workstream-runtime.ts +2 -2
- package/src/input/commands/worktree-runtime.ts +3 -3
- package/src/input/commands.ts +3 -1
- package/src/input/composer-editor.ts +44 -0
- package/src/input/concealed-input.ts +1 -1
- package/src/input/config-modal-types.ts +20 -8
- package/src/input/config-modal.ts +106 -105
- package/src/input/confirm-dialog-types.ts +28 -0
- package/src/input/confirm-dialog.ts +70 -0
- package/src/input/delete-key-policy.ts +3 -3
- package/src/input/feed-context-factory.ts +15 -16
- package/src/input/handler-command-route.ts +7 -42
- package/src/input/handler-content-actions.ts +16 -15
- package/src/input/handler-feed-routes.ts +26 -211
- package/src/input/handler-feed.ts +68 -95
- package/src/input/handler-interactions.ts +5 -3
- package/src/input/handler-modal-routes.ts +215 -216
- package/src/input/handler-modal-stack.ts +81 -11
- package/src/input/handler-modal-token-routes.ts +4 -0
- package/src/input/handler-onboarding.ts +0 -1
- package/src/input/handler-picker-routes.ts +65 -107
- package/src/input/handler-session-view-route.ts +149 -0
- package/src/input/handler-shortcuts.ts +16 -154
- package/src/input/handler-types.ts +4 -2
- package/src/input/handler-ui-state.ts +45 -15
- package/src/input/handler-work-tree-route.ts +123 -0
- package/src/input/handler.ts +25 -70
- package/src/input/keybindings.ts +16 -71
- package/src/input/masked-entry-modal.ts +117 -0
- package/src/input/mcp-workspace.ts +48 -17
- package/src/input/model-picker-filter.ts +8 -0
- package/src/input/model-picker-open.ts +99 -0
- package/src/input/model-picker-types.ts +1 -1
- package/src/input/model-picker.ts +92 -9
- package/src/input/notifications-modal.ts +123 -0
- package/src/input/overlay-filter.ts +26 -0
- package/src/input/profile-picker-modal.ts +37 -8
- package/src/input/search.ts +3 -3
- package/src/input/selection-modal-queue.ts +2 -0
- package/src/input/selection-modal.ts +28 -16
- package/src/input/session-picker-modal.ts +33 -8
- package/src/input/settings-modal-activation.ts +7 -2
- package/src/input/settings-modal-data.ts +11 -6
- package/src/input/settings-modal-types.ts +1 -1
- package/src/input/settings-modal.ts +20 -20
- package/src/input/submission-intent.ts +1 -1
- package/src/input/submission-router.ts +4 -9
- package/src/input/surface-modal-host.ts +110 -0
- package/src/input/theme-settings-actions.ts +82 -0
- package/src/input/usage-modal.ts +183 -0
- package/src/input/views.ts +97 -0
- package/src/main.ts +175 -165
- package/src/permissions/hunk-selection.ts +1 -1
- package/src/permissions/prompt-card.ts +511 -0
- package/src/permissions/prompt.ts +59 -622
- package/src/renderer/agents-modal.ts +310 -0
- package/src/renderer/autocomplete-overlay.ts +42 -220
- package/src/renderer/back-to-bottom.ts +80 -0
- package/src/renderer/block-actions-overlay.ts +30 -48
- package/src/renderer/bookmark-modal.ts +48 -79
- package/src/renderer/changes-modal.ts +325 -0
- package/src/renderer/code-block.ts +184 -106
- package/src/renderer/command-palette.ts +93 -0
- package/src/renderer/composer-fragments.ts +4 -4
- package/src/renderer/composer.ts +146 -0
- package/src/renderer/compositor.ts +26 -160
- package/src/renderer/config-modal.ts +185 -81
- package/src/renderer/confirm-dialog.ts +50 -0
- package/src/renderer/context-inspector.ts +116 -154
- package/src/renderer/context-status-hint.ts +4 -4
- package/src/renderer/conversation-layout.ts +20 -0
- package/src/renderer/conversation-overlays.ts +94 -84
- package/src/renderer/conversation-surface.ts +19 -38
- package/src/renderer/diff-tint.ts +98 -0
- package/src/renderer/file-picker-overlay.ts +63 -90
- package/src/renderer/footer-targets.ts +38 -0
- package/src/renderer/git-status.ts +3 -4
- package/src/renderer/header-line.ts +140 -117
- package/src/renderer/help-overlay.ts +133 -219
- package/src/renderer/history-search-overlay.ts +15 -12
- package/src/renderer/lane-graph/bead.ts +800 -0
- package/src/renderer/lane-graph/glyphs.ts +134 -0
- package/src/renderer/lane-graph/layout.ts +248 -0
- package/src/renderer/lane-graph/paint.ts +537 -0
- package/src/renderer/lane-graph/semantic-memo.ts +77 -0
- package/src/renderer/layout-engine.ts +2 -57
- package/src/renderer/layout.ts +7 -13
- package/src/renderer/markdown-inline.ts +2 -1
- package/src/renderer/markdown-table.ts +17 -12
- package/src/renderer/markdown.ts +92 -34
- package/src/renderer/masked-entry-modal.ts +78 -0
- package/src/renderer/mcp-workspace.ts +166 -203
- package/src/renderer/model-workspace.ts +381 -436
- package/src/renderer/notifications-modal.ts +116 -0
- package/src/renderer/onboarding/onboarding-wizard.ts +178 -588
- package/src/renderer/process-view.ts +192 -0
- package/src/renderer/profile-picker-modal.ts +58 -110
- package/src/renderer/search-overlay.ts +6 -3
- package/src/renderer/selection-modal-overlay.ts +87 -327
- package/src/renderer/semantic-diff.ts +2 -2
- package/src/renderer/session-chips.ts +102 -0
- package/src/renderer/session-picker-modal.ts +177 -297
- package/src/renderer/settings-modal-connections.ts +14 -23
- package/src/renderer/settings-modal-context.ts +367 -0
- package/src/renderer/settings-modal-helpers.ts +6 -11
- package/src/renderer/settings-modal.ts +322 -726
- package/src/renderer/shell-surface.ts +277 -175
- package/src/renderer/shortcuts-overlay.ts +217 -0
- package/src/renderer/status-line.ts +475 -0
- package/src/renderer/surface-compose.ts +174 -0
- package/src/renderer/surface-kit-extra.ts +303 -0
- package/src/renderer/surface-kit-list.ts +366 -0
- package/src/renderer/surface-kit-parts.ts +360 -0
- package/src/renderer/surface-kit.ts +568 -0
- package/src/renderer/syntax-highlighter.ts +280 -197
- package/src/renderer/syntax-theme.ts +51 -0
- package/src/renderer/system-message.ts +0 -1
- package/src/renderer/term-caps.ts +42 -1
- package/src/renderer/terminal-bg-probe.ts +116 -19
- package/src/renderer/terminal-palette-probe.ts +322 -0
- package/src/renderer/terminal-palette-reader.ts +183 -0
- package/src/renderer/terminal-palette.ts +58 -0
- package/src/renderer/theme-mode-config.ts +16 -1
- package/src/renderer/theme.ts +234 -207
- package/src/renderer/thinking.ts +0 -1
- package/src/renderer/throbber.ts +188 -0
- package/src/renderer/toast-center.ts +119 -0
- package/src/renderer/ui-factory.ts +39 -602
- package/src/renderer/ui-primitives.ts +8 -25
- package/src/renderer/usage-modal.ts +353 -0
- package/src/renderer/user-message.ts +58 -0
- package/src/renderer/voice-capture-chip.ts +53 -0
- package/src/runtime/bootstrap-command-context.ts +0 -5
- package/src/runtime/bootstrap-command-parts.ts +38 -89
- package/src/runtime/bootstrap-core.ts +13 -15
- package/src/runtime/bootstrap-hook-bridge.ts +12 -21
- package/src/runtime/bootstrap-notifier-sync.ts +17 -1
- package/src/runtime/bootstrap-shell.ts +16 -50
- package/src/runtime/bootstrap.ts +14 -14
- package/src/runtime/client/fleet-union.ts +5 -5
- package/src/runtime/client/hosted-exit.ts +2 -2
- package/src/runtime/client/hosted-sessions.ts +1 -1
- package/src/runtime/client/spine-adoption.ts +1 -1
- package/src/runtime/context-accounting-source.ts +5 -4
- package/src/runtime/index.ts +1 -0
- package/src/runtime/notification-dispatch.ts +102 -29
- package/src/runtime/recovery-offer-wiring.ts +4 -1
- package/src/runtime/recovery-prompt.ts +31 -15
- package/src/runtime/runtime-services-types.ts +10 -6
- package/src/runtime/services.ts +17 -12
- package/src/runtime/session-continuity-hints.ts +2 -5
- package/src/runtime/session-inbound-inputs.ts +1 -1
- package/src/runtime/session-resume-liveness-confirm.ts +14 -2
- package/src/runtime/startup-typeahead-gate.ts +103 -0
- package/src/runtime/store/domains/domain-read-matrix.ts +0 -1
- package/src/runtime/store/domains/index.ts +0 -8
- package/src/runtime/store/selectors/index.ts +0 -28
- package/src/runtime/store/state.ts +0 -8
- package/src/runtime/ui-services.ts +4 -6
- package/src/runtime/usage-tracker.ts +348 -0
- package/src/runtime/wrfc-persistence.ts +4 -4
- package/src/shell/blocking-input.ts +92 -2
- package/src/shell/recovery-input-helpers.ts +1 -1
- package/src/shell/session-views.ts +539 -0
- package/src/shell/status-report.ts +86 -0
- package/src/shell/transcript-scroll.ts +68 -0
- package/src/shell/ui-openers.ts +84 -172
- package/src/shell/view-openers.ts +205 -0
- package/src/tools/wrfc-agent-guard.ts +22 -2
- package/src/utils/format-duration.ts +4 -8
- package/src/utils/splash-lines.ts +9 -1
- package/src/utils/terminal-width.ts +56 -0
- package/src/verification/live-verifier.ts +0 -10
- package/src/version.ts +1 -1
- package/src/{panels → views}/agent-inspector-shared.ts +2 -2
- package/src/{panels → views}/builtin-modals.ts +22 -21
- package/src/views/builtin-views.ts +135 -0
- package/src/{panels → views}/confirm-state.ts +9 -9
- package/src/{panels → views}/diff-review-model.ts +10 -3
- package/src/{panels → views}/eval-registry.ts +1 -1
- package/src/{panels → views}/fleet-acts.ts +49 -85
- package/src/{panels/fleet-panel-format.ts → views/fleet-format.ts} +40 -40
- package/src/{panels → views}/fleet-gateway.ts +5 -5
- package/src/{panels → views}/fleet-observed-render.ts +16 -16
- package/src/{panels → views}/fleet-read-model.ts +9 -9
- package/src/{panels/fleet-tabs.ts → views/fleet-session-tabs.ts} +13 -13
- package/src/{panels → views}/fleet-spawn.ts +33 -49
- package/src/{panels → views}/fleet-steer.ts +12 -12
- package/src/{panels → views}/fleet-stop.ts +4 -4
- package/src/{panels → views}/fleet-transcript.ts +26 -27
- package/src/{panels/fleet-panel-worktree-detail.ts → views/fleet-worktree-detail.ts} +7 -7
- package/src/{panels → views}/hosted-session-feed.ts +6 -6
- package/src/views/modal-surface-registry.ts +41 -0
- package/src/{panels → views}/modals/devices-modal.ts +2 -2
- package/src/{panels → views}/modals/hooks-modal.ts +13 -13
- package/src/{panels → views}/modals/keybindings-modal.ts +19 -27
- package/src/{panels → views}/modals/knowledge-modal.ts +6 -5
- package/src/{panels → views}/modals/local-auth-modal.ts +22 -21
- package/src/{panels → views}/modals/marketplace-modal.ts +11 -11
- package/src/{panels → views}/modals/memory-modal.ts +8 -8
- package/src/{panels → views}/modals/modal-surface-helpers.ts +15 -5
- package/src/{panels → views}/modals/pairing-modal.ts +9 -9
- package/src/{panels → views}/modals/planning-modal.ts +15 -20
- package/src/{panels → views}/modals/plugins-modal.ts +6 -6
- package/src/{panels → views}/modals/policy-modal.ts +13 -5
- package/src/{panels → views}/modals/provider-health-modal.ts +4 -4
- package/src/{panels → views}/modals/remote-modal.ts +3 -3
- package/src/{panels → views}/modals/sandbox-modal.ts +4 -4
- package/src/{panels → views}/modals/security-modal.ts +22 -16
- package/src/{panels → views}/modals/services-modal.ts +3 -3
- package/src/{panels → views}/modals/settings-sync-modal.ts +4 -4
- package/src/{panels → views}/modals/skills-modal.ts +9 -9
- package/src/{panels → views}/modals/subscription-modal.ts +3 -3
- package/src/{panels → views}/modals/work-plan-modal.ts +10 -13
- package/src/views/notifications-feed.ts +314 -0
- package/src/{panels → views}/polish-core.ts +38 -36
- package/src/{panels → views}/polish-tables.ts +35 -26
- package/src/{panels → views}/polish.ts +101 -95
- package/src/{panels → views}/project-planning-answer-actions.ts +3 -3
- package/src/{panels → views}/provider-health-routes.ts +14 -14
- package/src/{panels → views}/search-focus.ts +8 -8
- package/src/{panels → views}/session-maintenance.ts +11 -11
- package/src/views/skills-discovery.ts +159 -0
- package/src/views/view-deps.ts +80 -0
- package/src/views/view-panel-adapter.ts +53 -0
- package/src/{panels → views}/workstream-graph-render.ts +1 -1
- package/src/core/conversation-fold.ts +0 -101
- package/src/core/conversation-turn-structure.ts +0 -464
- package/src/core/conversation-user-receipts.ts +0 -42
- package/src/input/commands/operator-panel-runtime.ts +0 -186
- package/src/input/panel-integration-actions.ts +0 -33
- package/src/input/panel-mouse-geometry.ts +0 -97
- package/src/input/panel-paste-flood-guard.ts +0 -86
- package/src/panels/base-panel.ts +0 -301
- package/src/panels/builtin/agent.ts +0 -27
- package/src/panels/builtin/development.ts +0 -92
- package/src/panels/builtin/knowledge.ts +0 -12
- package/src/panels/builtin/operations.ts +0 -177
- package/src/panels/builtin/session.ts +0 -81
- package/src/panels/builtin/shared.ts +0 -357
- package/src/panels/builtin-panels.ts +0 -28
- package/src/panels/cost-tracker-panel.ts +0 -746
- package/src/panels/diff-panel.ts +0 -797
- package/src/panels/diff-review-panel.ts +0 -395
- package/src/panels/expandable-list-panel.ts +0 -189
- package/src/panels/fleet-deep-link.ts +0 -31
- package/src/panels/fleet-panel.ts +0 -799
- package/src/panels/git-panel.ts +0 -800
- package/src/panels/hosted-session-panel.ts +0 -221
- package/src/panels/index.ts +0 -21
- package/src/panels/local-auth-panel.ts +0 -478
- package/src/panels/notifications-feed.ts +0 -127
- package/src/panels/notifications-panel.ts +0 -160
- package/src/panels/panel-confirm-overlay.ts +0 -72
- package/src/panels/panel-manager.ts +0 -791
- package/src/panels/plugins-panel.ts +0 -371
- package/src/panels/scrollable-list-panel.ts +0 -498
- package/src/panels/skills-panel.ts +0 -454
- package/src/panels/token-budget-panel.ts +0 -688
- package/src/panels/types.ts +0 -191
- package/src/panels/wrfc-panel-format.ts +0 -133
- package/src/renderer/diff-view.ts +0 -134
- package/src/renderer/fleet-tab-strip.ts +0 -56
- package/src/renderer/footer-tips.ts +0 -53
- package/src/renderer/fullscreen-primitives.ts +0 -146
- package/src/renderer/fullscreen-workspace.ts +0 -194
- package/src/renderer/hint-grammar.ts +0 -52
- package/src/renderer/modal-factory.ts +0 -480
- package/src/renderer/overlay-box.ts +0 -154
- package/src/renderer/overlay-viewport.ts +0 -104
- package/src/renderer/panel-composite.ts +0 -145
- package/src/renderer/panel-workspace-bar.ts +0 -54
- package/src/renderer/process-indicator.ts +0 -163
- package/src/renderer/tab-strip.ts +0 -222
- package/src/renderer/text-layout.ts +0 -31
- package/src/renderer/tool-call.ts +0 -276
- package/src/renderer/tool-result-expanded-lines.ts +0 -48
- package/src/renderer/tool-result-summary.ts +0 -219
- package/src/runtime/diagnostics/panels/index.ts +0 -21
- package/src/runtime/diagnostics/panels/ops.ts +0 -156
- package/src/runtime/perf/panel-contracts.ts +0 -32
- package/src/runtime/store/domains/panels.ts +0 -117
- package/src/verification/verification-ledger.ts +0 -707
- /package/src/{panels → views}/memory-consolidation-gateway.ts +0 -0
- /package/src/{panels → views}/modals/modal-theme.ts +0 -0
- /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
|
-
-
|
|
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
|
[](https://github.com/mgd34msu/goodvibes-tui/actions/workflows/ci.yml)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
[](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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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="
|
|
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
|
|
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="
|
|
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
|
|
83
|
+
### The Agents control room
|
|
84
84
|
|
|
85
|
-
<img src="docs/assets/fleet-panel.png" alt="The
|
|
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
|
|
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="
|
|
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` |
|
|
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` |
|
|
106
|
-
| `F2`
|
|
107
|
-
| `
|
|
108
|
-
| `
|
|
109
|
-
| `
|
|
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` (
|
|
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
|
|
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 |
|
|
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
|
|
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
|
|
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,
|
|
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
|
-
├──
|
|
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
|
|
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
|
|
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
|
-
- [
|
|
65
|
-
|
|
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
|
-
- [
|
|
68
|
-
|
|
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.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-tui",
|
|
3
|
-
"version": "2.
|
|
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:
|
|
42
|
-
"
|
|
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:
|
|
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.
|
|
100
|
-
"@pellux/goodvibes-terminal-shell": "2.
|
|
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.
|
|
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": "^
|
|
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.
|
|
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.
|
|
130
|
-
"@pellux/goodvibes-tui-linux-arm64": "2.
|
|
131
|
-
"@pellux/goodvibes-tui-darwin-x64": "2.
|
|
132
|
-
"@pellux/goodvibes-tui-darwin-arm64": "2.
|
|
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
|
}
|
package/src/cli/management.ts
CHANGED
|
@@ -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
|
});
|
package/src/cli/tui-startup.ts
CHANGED
|
@@ -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
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
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
|
-
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
/**
|