@pellux/goodvibes-tui 0.18.12 → 0.18.17
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 +172 -0
- package/README.md +1 -1
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +3 -2
- package/src/config/index.ts +1 -138
- package/src/core/conversation-rendering.ts +3 -3
- package/src/core/conversation.ts +176 -423
- package/src/core/history.ts +45 -0
- package/src/core/orchestrator.ts +3 -735
- package/src/core/system-message-router.ts +19 -58
- package/src/daemon/cli.ts +82 -6
- package/src/input/command-registry.ts +2 -0
- package/src/input/commands/control-room-runtime.ts +1 -1
- package/src/input/commands/health-runtime.ts +1 -1
- package/src/input/commands/local-setup-review.ts +1 -1
- package/src/input/commands/platform-access-runtime.ts +1 -1
- package/src/input/commands/qrcode-runtime.ts +20 -0
- package/src/input/commands/subscription-runtime.ts +1 -1
- package/src/input/commands.ts +2 -0
- package/src/input/handler-content-actions.ts +2 -2
- package/src/input/handler-feed.ts +7 -1
- package/src/input/handler-modal-routes.ts +19 -2
- package/src/input/handler-modal-token-routes.ts +4 -1
- package/src/input/handler-picker-routes.ts +4 -2
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +1 -1
- package/src/input/model-picker.ts +11 -0
- package/src/input/search.ts +1 -1
- package/src/input/selection.ts +2 -2
- package/src/input/settings-modal.ts +31 -3
- package/src/main.ts +1 -1
- package/src/panels/agent-inspector-panel.ts +3 -3
- package/src/panels/agent-logs-panel.ts +26 -27
- package/src/panels/approval-panel.ts +2 -2
- package/src/panels/automation-control-panel.ts +3 -3
- package/src/panels/base-panel.ts +14 -14
- package/src/panels/builtin/operations.ts +1 -1
- package/src/panels/builtin/session.ts +67 -1
- package/src/panels/builtin/shared.ts +4 -4
- package/src/panels/cockpit-panel.ts +2 -2
- package/src/panels/communication-panel.ts +3 -3
- package/src/panels/context-visualizer-panel.ts +2 -2
- package/src/panels/control-plane-panel.ts +3 -3
- package/src/panels/cost-tracker-panel.ts +3 -3
- package/src/panels/debug-panel.ts +2 -2
- package/src/panels/diff-panel.ts +2 -2
- package/src/panels/docs-panel.ts +1 -1
- package/src/panels/eval-panel.ts +2 -2
- package/src/panels/file-explorer-panel.ts +3 -3
- package/src/panels/file-preview-panel.ts +3 -3
- package/src/panels/forensics-panel.ts +2 -2
- package/src/panels/git-panel.ts +1 -1
- package/src/panels/hooks-panel.ts +3 -3
- package/src/panels/incident-review-panel.ts +1 -1
- package/src/panels/intelligence-panel.ts +2 -2
- package/src/panels/knowledge-panel.ts +1 -1
- package/src/panels/local-auth-panel.ts +2 -2
- package/src/panels/marketplace-panel.ts +1 -1
- package/src/panels/mcp-panel.ts +3 -3
- package/src/panels/memory-panel.ts +1 -1
- package/src/panels/ops-control-panel.ts +3 -3
- package/src/panels/ops-strategy-panel.ts +2 -2
- package/src/panels/orchestration-panel.ts +2 -2
- package/src/panels/panel-list-panel.ts +6 -6
- package/src/panels/plan-dashboard-panel.ts +1 -1
- package/src/panels/plugins-panel.ts +2 -2
- package/src/panels/policy-panel.ts +2 -2
- package/src/panels/polish.ts +3 -3
- package/src/panels/provider-account-snapshot.ts +1 -1
- package/src/panels/provider-accounts-panel.ts +25 -29
- package/src/panels/provider-health-panel.ts +2 -2
- package/src/panels/provider-stats-panel.ts +3 -3
- package/src/panels/qr-panel.ts +182 -0
- package/src/panels/remote-panel.ts +3 -3
- package/src/panels/routes-panel.ts +3 -3
- package/src/panels/sandbox-panel.ts +2 -2
- package/src/panels/schedule-panel.ts +1 -1
- package/src/panels/scrollable-list-panel.ts +407 -0
- package/src/panels/security-panel.ts +2 -2
- package/src/panels/services-panel.ts +3 -3
- package/src/panels/session-browser-panel.ts +2 -2
- package/src/panels/settings-sync-panel.ts +2 -2
- package/src/panels/skills-panel.ts +6 -6
- package/src/panels/subscription-panel.ts +3 -3
- package/src/panels/symbol-outline-panel.ts +3 -3
- package/src/panels/system-messages-panel.ts +4 -4
- package/src/panels/tasks-panel.ts +2 -2
- package/src/panels/thinking-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +1 -1
- package/src/panels/tool-inspector-panel.ts +3 -3
- package/src/panels/types.ts +5 -5
- package/src/panels/watchers-panel.ts +3 -3
- package/src/panels/welcome-panel.ts +1 -1
- package/src/panels/worktree-panel.ts +22 -21
- package/src/panels/wrfc-panel.ts +3 -3
- package/src/permissions/prompt.ts +3 -22
- package/src/plugins/loader.ts +15 -304
- package/src/renderer/agent-detail-modal.ts +1 -1
- package/src/renderer/autocomplete-overlay.ts +2 -2
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/bottom-bar.ts +2 -2
- package/src/renderer/buffer.ts +1 -1
- package/src/renderer/code-block.ts +2 -2
- package/src/renderer/compositor.ts +2 -2
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +1 -1
- package/src/renderer/conversation-surface.ts +2 -2
- package/src/renderer/diff-view.ts +2 -2
- package/src/renderer/diff.ts +1 -1
- package/src/renderer/file-picker-overlay.ts +2 -2
- package/src/renderer/file-tree.ts +2 -2
- package/src/renderer/help-overlay.ts +1 -1
- package/src/renderer/history-search-overlay.ts +2 -2
- package/src/renderer/live-tail-modal.ts +1 -1
- package/src/renderer/markdown.ts +2 -2
- package/src/renderer/modal-factory.ts +3 -3
- package/src/renderer/model-picker-overlay.ts +2 -2
- package/src/renderer/overlay-box.ts +2 -2
- package/src/renderer/panel-composite.ts +1 -1
- package/src/renderer/panel-picker-overlay.ts +2 -2
- package/src/renderer/panel-tab-bar.ts +1 -1
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +2 -2
- package/src/renderer/process-modal.ts +1 -1
- package/src/renderer/profile-picker-modal.ts +2 -2
- package/src/renderer/progress.ts +2 -2
- package/src/renderer/qr-renderer.ts +117 -0
- package/src/renderer/search-overlay.ts +2 -2
- package/src/renderer/selection-modal-overlay.ts +2 -2
- package/src/renderer/session-picker-modal.ts +2 -2
- package/src/renderer/settings-modal-helpers.ts +122 -0
- package/src/renderer/settings-modal.ts +149 -113
- package/src/renderer/shell-surface.ts +1 -1
- package/src/renderer/system-message.ts +1 -1
- package/src/renderer/tab-strip.ts +2 -2
- package/src/renderer/text-layout.ts +1 -1
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +2 -2
- package/src/renderer/ui-factory.ts +2 -2
- package/src/runtime/bootstrap-command-context.ts +5 -6
- package/src/runtime/bootstrap-command-parts.ts +32 -18
- package/src/runtime/bootstrap-core.ts +3 -2
- package/src/runtime/bootstrap-hook-bridge.ts +15 -174
- package/src/runtime/bootstrap-shell.ts +4 -4
- package/src/runtime/bootstrap.ts +7 -2
- package/src/runtime/context.ts +4 -20
- package/src/runtime/diagnostics/panels/index.ts +6 -6
- package/src/runtime/diagnostics/panels/ops.ts +1 -1
- package/src/runtime/diagnostics/panels/panel-resources.ts +118 -0
- package/src/runtime/perf/panel-contracts.ts +32 -0
- package/src/runtime/perf/panel-health-monitor.ts +18 -0
- package/src/runtime/services.ts +5 -5
- package/src/runtime/store/domains/domain-read-matrix.ts +0 -2
- package/src/runtime/store/selectors/index.ts +11 -6
- package/src/runtime/store/state.ts +12 -4
- package/src/runtime/ui-events.ts +1 -0
- package/src/runtime/ui-read-model-helpers.ts +1 -32
- package/src/runtime/ui-read-models-observability-maintenance.ts +1 -81
- package/src/runtime/ui-read-models-observability-options.ts +1 -5
- package/src/runtime/ui-read-models-observability-remote.ts +1 -73
- package/src/runtime/ui-read-models-observability-security.ts +1 -172
- package/src/runtime/ui-read-models-observability-system.ts +1 -217
- package/src/runtime/ui-read-models-observability.ts +1 -59
- package/src/runtime/ui-service-queries.ts +1 -114
- package/src/runtime/ui-services.ts +1 -1
- package/src/shell/ui-openers.ts +1 -1
- package/src/tools/index.ts +1 -186
- package/src/types/grid.ts +48 -0
- package/src/utils/clipboard.ts +21 -0
- package/src/utils/splash-lines.ts +1 -1
- package/src/utils/terminal-width.ts +185 -0
- package/src/version.ts +1 -1
- package/src/config/service-registry.ts +0 -1
- package/src/config/subscription-providers.ts +0 -127
- package/src/daemon/facade-composition.ts +0 -398
- package/src/daemon/facade.ts +0 -638
- package/src/daemon/surface-policy.ts +0 -60
- package/src/daemon/types.ts +0 -191
- package/src/runtime/diagnostics/actions.ts +0 -776
- package/src/runtime/diagnostics/index.ts +0 -99
- package/src/runtime/diagnostics/panels/agents.ts +0 -252
- package/src/runtime/diagnostics/panels/events.ts +0 -188
- package/src/runtime/diagnostics/panels/health.ts +0 -242
- package/src/runtime/diagnostics/panels/tasks.ts +0 -251
- package/src/runtime/diagnostics/panels/tool-calls.ts +0 -267
- package/src/runtime/diagnostics/provider.ts +0 -262
- package/src/runtime/store/domains/conversation.ts +0 -181
- package/src/runtime/store/domains/permissions.ts +0 -143
- package/src/runtime/store/helpers/reducers/conversation.ts +0 -228
- package/src/runtime/store/helpers/reducers/lifecycle.ts +0 -440
- package/src/runtime/store/helpers/reducers/shared.ts +0 -60
- package/src/runtime/store/helpers/reducers/sync.ts +0 -555
- package/src/runtime/store/helpers/reducers.ts +0 -30
- package/src/runtime/ui-read-models-core.ts +0 -95
- package/src/runtime/ui-read-models-operations.ts +0 -203
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,178 @@ All notable changes to GoodVibes TUI.
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [0.18.17] — 2026-04-16
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
- **Companion pairing token registered with embedded daemon**: `src/runtime/bootstrap.ts` now loads the persistent companion-pairing token via `getOrCreateCompanionToken('tui')` and passes it as `sharedDaemonToken` to `startExternalServices`. The TUI's QR panel advertises this token as the bearer for phone pairing; before this fix, the embedded daemon was started with no shared token and rejected every scanned token with `authenticated: false, authMode: "invalid"`
|
|
12
|
+
- **QR code visual alignment**: `src/renderer/qr-renderer.ts` now uses `leftPad = 1` (down from 2) and prepends a single top quiet-band row. The QR's finder patterns now register symmetrically on both axes; previous rendering was mis-aligned by one cell horizontally and had no top quiet band
|
|
13
|
+
|
|
14
|
+
### Dependencies
|
|
15
|
+
|
|
16
|
+
- Bumped `@pellux/goodvibes-sdk` 0.18.36 → 0.18.37, picking up: `sharedDaemonToken`/`sharedHttpListenerToken` factory options on `startHostServices`, bootstrap credential drift detection that warns when `auth-bootstrap.txt` falls out of sync with `auth-users.json`
|
|
17
|
+
- Regenerated `docs/foundation-artifacts/*` against SDK 0.18.37
|
|
18
|
+
|
|
19
|
+
### Tests
|
|
20
|
+
|
|
21
|
+
- Updated `src/test/runtime/bootstrap-services.test.ts` `daemonEnable`/`listenerEnable` expectations to include the new second argument (`undefined` when no shared token is supplied)
|
|
22
|
+
- Test suite: 437/437 passing, typecheck clean, architecture check green
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## [0.18.16] — 2026-04-16
|
|
27
|
+
|
|
28
|
+
### Bug Fixes
|
|
29
|
+
|
|
30
|
+
- **resolveToolLLM tests**: enabled `tools.llmEnabled` by default in `createTestManagers()` (`src/test/helpers/test-managers.ts`) so tool LLM resolution tests exercise the resolution logic directly; previously every test hit the gate and resolved to `null`
|
|
31
|
+
- **Domain boundary contract test (GC-ARCH-001)**: removed `'conversation'` and `'permissions'` from the `DOMAINS` array in `src/runtime/store/domains/domain-read-matrix.ts` — the files they referenced were deleted in 0.18.15 and the filesystem↔array consistency check was failing
|
|
32
|
+
|
|
33
|
+
### Architecture
|
|
34
|
+
|
|
35
|
+
- **settings-modal decomposition**: extracted 10 pure helpers (`formatValue`, `valueColor`, `flagStateColor`, `mcpTrustColor`, `subscriptionStateColor`, `inferSubscriptionRouteReason`, `CATEGORY_LABELS`, `SETTING_LABELS`, `getSettingLabel`, `describeUiRouting`) into `src/renderer/settings-modal-helpers.ts`. `settings-modal.ts` drops from 844 → 737 lines, back under the 800-line architecture cap
|
|
36
|
+
|
|
37
|
+
### Dependencies
|
|
38
|
+
|
|
39
|
+
- Bumped `@pellux/goodvibes-sdk` 0.18.33 → 0.18.36, picking up: daemon shutdown symmetry, event bus iteration fix, atomic session writes, rate limiter TTL + LRU + sweep, `fetchWithTimeout` helper, restored port honoring in `resolveHostBinding` for `local`/`network` hostModes, and restored constructor-injected port/host in `resolveDaemonFacadeRuntime`
|
|
40
|
+
- Regenerated `docs/foundation-artifacts/*` against the new SDK
|
|
41
|
+
|
|
42
|
+
### Tests & Checks
|
|
43
|
+
|
|
44
|
+
- Test suite: 437/437 passing (was 431/437 after 0.18.15)
|
|
45
|
+
- Architecture check: passing (was failing with `settings-modal.ts` 844 > 800-line cap)
|
|
46
|
+
- Typecheck: clean
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## [0.18.15] — 2026-04-16
|
|
51
|
+
|
|
52
|
+
### Correctness Fix
|
|
53
|
+
|
|
54
|
+
- **daemon SIGINT/SIGTERM drain**: `src/daemon/cli.ts` — added AbortController signaling for in-flight requests, 15-second `Promise.race` shutdown deadline, hard `process.exit(1)` if deadline exceeded, debounced double-signal guard (`shutdownInFlight` flag)
|
|
55
|
+
|
|
56
|
+
### Dead Code Removal (Tier 3 items 15-17)
|
|
57
|
+
|
|
58
|
+
- Deleted 15 TUI mirror files with zero external importers:
|
|
59
|
+
- `src/runtime/diagnostics/index.ts`, `provider.ts`, `actions.ts`
|
|
60
|
+
- `src/runtime/diagnostics/panels/agents.ts`, `events.ts`, `health.ts`, `tasks.ts`, `tool-calls.ts`
|
|
61
|
+
- `src/runtime/store/helpers/reducers.ts` (barrel) and 4 sub-reducers
|
|
62
|
+
- `src/runtime/store/domains/permissions.ts`, `conversation.ts`
|
|
63
|
+
- Updated `src/runtime/diagnostics/panels/index.ts` to re-export deleted panels from SDK
|
|
64
|
+
|
|
65
|
+
### Config Re-export Shim Inlining (Tier 3 item 18)
|
|
66
|
+
|
|
67
|
+
- Deleted `src/config/service-registry.ts` and `src/config/subscription-providers.ts` (1-line SDK re-exports)
|
|
68
|
+
- Updated 29 call sites to import directly from `@pellux/goodvibes-sdk/platform/config/*`
|
|
69
|
+
|
|
70
|
+
### SDK Consolidation — UI Read Models (Tier 3 items 19-20)
|
|
71
|
+
|
|
72
|
+
- Converted 9 TUI mirror files to 1-line SDK re-exports (preserving all call-site import paths):
|
|
73
|
+
- `ui-events.ts`, `ui-service-queries.ts`, `ui-read-model-helpers.ts`
|
|
74
|
+
- `ui-read-models-observability.ts` and 4 observability sub-files (maintenance, options, remote, security, system)
|
|
75
|
+
- Skipped (TUI-specific divergence): `ui-services.ts` (uses TUI `SecretsManager` subclass), `ui-read-models.ts` (depends on TUI `RuntimeServices`)
|
|
76
|
+
- panel-resources drift: TUI version (119 lines) uses `panel-health-monitor.ts`; SDK version (152 lines) uses `component-health-monitor.js` — different monitor interfaces, TUI-specific binding kept
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## [0.18.14] — 2026-04-16
|
|
81
|
+
|
|
82
|
+
### Panel Navigation Overhaul
|
|
83
|
+
|
|
84
|
+
- Created `ScrollableListPanel<T>` and `SearchableListPanel<T>` base classes in `src/panels/scrollable-list-panel.ts`
|
|
85
|
+
- Migrated 30 panels from hand-coded scroll/cursor management to the shared base classes
|
|
86
|
+
- All list panels now have consistent navigation: up/down/j/k, pageup/pagedown, home/end/g/G, enter to select
|
|
87
|
+
- Selection is always visible within the viewport — guaranteed by `getVisibleWindow()` from `surface-layout.ts`
|
|
88
|
+
- Removed ~150 lines of duplicated scroll boilerplate across panels
|
|
89
|
+
|
|
90
|
+
### Modal Viewport Fixes
|
|
91
|
+
|
|
92
|
+
- Fixed modal sizing: height is exactly 45% of viewport (both min and max — all modals same size), width is 50% with 25% minimum
|
|
93
|
+
- Fixed modal scroll/selection: 6 modal/overlay files updated to use shared `getVisibleWindow()` instead of inline scroll math
|
|
94
|
+
- Autocomplete overlay, file picker, bookmark modal, session picker, profile picker, and live tail modal all use the same viewport function
|
|
95
|
+
|
|
96
|
+
### Settings Modal: Tools Tab
|
|
97
|
+
|
|
98
|
+
- Added proper tools tab UI with "Tool LLM" and "Helper Model" section headers
|
|
99
|
+
- Helper config keys (`helper.enabled`, `helper.globalProvider`, `helper.globalModel`) now routed into the tools tab
|
|
100
|
+
- Boolean settings display as [on]/[off] toggles
|
|
101
|
+
- Selecting a provider/model setting opens the full model picker instead of a text field
|
|
102
|
+
- Model picker now supports 3 target modes: main, helper, and tool
|
|
103
|
+
- Selecting a helper/tool model auto-enables the feature (`helper.enabled: true` / `tools.llmEnabled: true`)
|
|
104
|
+
|
|
105
|
+
### QR Code Pairing for Companion Apps
|
|
106
|
+
|
|
107
|
+
- Added `/qrcode` command (aliases `/qr`, `/pair`) that opens a QR code panel
|
|
108
|
+
- QR panel displays connection info (daemon URL, token, username) + scannable QR code
|
|
109
|
+
- QR rendered using Unicode half-block characters (▀/▄/█) for compact terminal display
|
|
110
|
+
- Supports `r` to regenerate token (invalidates old one) and `c` to copy token to clipboard
|
|
111
|
+
- Daemon standalone mode (`goodvibes-daemon`) now prints QR + connection info to stdout on startup
|
|
112
|
+
- Companion tokens persist to `.goodvibes/tui/companion-token.json` with `gv_` prefix
|
|
113
|
+
- Built on SDK 0.18.30 pairing module
|
|
114
|
+
|
|
115
|
+
### Health Monitoring Rename
|
|
116
|
+
|
|
117
|
+
- Renamed `panelHealthMonitor` to `componentHealthMonitor` across 20 files to align with SDK 0.18.29's generic naming
|
|
118
|
+
- Deprecated `Panel*` type aliases preserved for backward compatibility
|
|
119
|
+
|
|
120
|
+
### SDK 0.18.30 Update
|
|
121
|
+
|
|
122
|
+
- Updated to `@pellux/goodvibes-sdk@0.18.30`
|
|
123
|
+
- Consumes new pairing module, `tools.llmEnabled` config, and all 0.18.29 boundary cleanup
|
|
124
|
+
|
|
125
|
+
### Verification
|
|
126
|
+
|
|
127
|
+
- Full typecheck passes: `bun x tsc --noEmit` — 0 errors
|
|
128
|
+
|
|
129
|
+
## [0.18.13] — 2026-04-16
|
|
130
|
+
|
|
131
|
+
### SDK/TUI Boundary Separation
|
|
132
|
+
|
|
133
|
+
Major cleanup of the SDK/TUI boundary. The TUI is now a thin rendering/input/wiring layer built on `@pellux/goodvibes-sdk@0.18.29`. Thousands of lines of duplicated, forked, and dead code have been removed and replaced with SDK imports.
|
|
134
|
+
|
|
135
|
+
#### Dead Code Removed
|
|
136
|
+
|
|
137
|
+
- Deleted 4 dead daemon files that nothing imported (`facade.ts`, `facade-composition.ts`, `surface-policy.ts`, `types.ts`) — 1,291 lines removed
|
|
138
|
+
- Deleted 2 dead UI read-model files (`ui-read-models-core.ts`, `ui-read-models-operations.ts`) — the barrel already delegates to SDK
|
|
139
|
+
|
|
140
|
+
#### Forks Replaced with SDK Imports
|
|
141
|
+
|
|
142
|
+
- Replaced `src/core/orchestrator.ts` (736 lines) with a 3-line re-export from SDK — the SDK's Orchestrator already includes `getSpinner()`
|
|
143
|
+
- Replaced `src/plugins/loader.ts` (305 lines) with re-exports from SDK — the SDK now supports `additionalDirectories` and `entryDefault` options
|
|
144
|
+
- Replaced `src/tools/index.ts` (187 lines) with re-export of SDK's `registerAllTools`
|
|
145
|
+
- Replaced `src/config/subscription-providers.ts` (128 lines) with `export *` from SDK
|
|
146
|
+
- Replaced `src/config/index.ts` API key functions with re-exports from SDK's new `config/api-keys.ts`
|
|
147
|
+
- Replaced `src/permissions/prompt.ts` type definitions with imports from SDK — kept `PermissionPromptUI` class (TUI-specific rendering)
|
|
148
|
+
- Replaced 4 store/runtime duplicate files with SDK re-exports (conversation domain, permissions domain, conversation reducers, lifecycle reducers)
|
|
149
|
+
|
|
150
|
+
#### ConversationManager Refactored
|
|
151
|
+
|
|
152
|
+
- Refactored `src/core/conversation.ts` from a 776-line standalone class to a ~450-line subclass extending SDK's `ConversationManager`
|
|
153
|
+
- Removed all duplicated message management methods (CRUD, branching, persistence, compaction, undo/redo) — now inherited from SDK
|
|
154
|
+
- Defined `TuiBlockMeta extends BlockMeta` with rendering fields (`blockIndex`, `startLine`, `lineCount`, `collapseKey`)
|
|
155
|
+
- Kept all TUI-specific rendering methods (history buffer, block registry, collapse state, display navigation)
|
|
156
|
+
|
|
157
|
+
#### Health Monitoring Renamed
|
|
158
|
+
|
|
159
|
+
- Renamed `panelHealthMonitor` to `componentHealthMonitor` throughout the TUI to align with SDK 0.18.29's generic naming
|
|
160
|
+
- Updated 20 files across runtime, panels, diagnostics, bootstrap, and tests
|
|
161
|
+
- Added deprecated `Panel*` type aliases for backward compatibility
|
|
162
|
+
|
|
163
|
+
#### RuntimeState Aligned with SDK
|
|
164
|
+
|
|
165
|
+
- Updated `store/state.ts` to use SDK's `surfacePerf: SurfacePerfDomainState` instead of `uiPerf: UiPerfDomainState`
|
|
166
|
+
- Updated `store/selectors/index.ts` to match SDK's selector shape
|
|
167
|
+
- Health monitoring perf files rewritten as SDK re-export shims
|
|
168
|
+
|
|
169
|
+
#### Clipboard Split
|
|
170
|
+
|
|
171
|
+
- Created `src/utils/clipboard.ts` with TUI-specific OSC 52 `copyToClipboard` function
|
|
172
|
+
- Platform clipboard paste functions remain in SDK
|
|
173
|
+
|
|
174
|
+
### Verification
|
|
175
|
+
|
|
176
|
+
- Full typecheck passes: `bun x tsc --noEmit` — 0 errors
|
|
177
|
+
- Updated to `@pellux/goodvibes-sdk@0.18.29`
|
|
178
|
+
|
|
7
179
|
## [0.18.12] — 2026-04-15
|
|
8
180
|
|
|
9
181
|
### SDK `0.18.28` Session-Persistence Boundary Fix
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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
|
A terminal-native AI coding, operations, automation, knowledge, and integration console with a typed runtime, omnichannel surfaces, structured memory/knowledge, and a raw ANSI renderer.
|
|
8
8
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-tui",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.17",
|
|
4
4
|
"description": "Terminal-native GoodVibes product for coding, operations, automation, knowledge, channels, and daemon-backed control-plane workflows.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/main.ts",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"src",
|
|
17
17
|
"!src/test",
|
|
18
18
|
"!src/**/*.test.ts",
|
|
19
|
+
"!src/**/__tests__",
|
|
19
20
|
"scripts/postinstall.js",
|
|
20
21
|
"README.md",
|
|
21
22
|
"CHANGELOG.md",
|
|
@@ -88,7 +89,7 @@
|
|
|
88
89
|
"@anthropic-ai/vertex-sdk": "^0.16.0",
|
|
89
90
|
"@ast-grep/napi": "^0.42.0",
|
|
90
91
|
"@aws/bedrock-token-generator": "^1.1.0",
|
|
91
|
-
"@pellux/goodvibes-sdk": "0.18.
|
|
92
|
+
"@pellux/goodvibes-sdk": "0.18.37",
|
|
92
93
|
"bash-language-server": "^5.6.0",
|
|
93
94
|
"fuse.js": "^7.1.0",
|
|
94
95
|
"graphql": "^16.13.2",
|
package/src/config/index.ts
CHANGED
|
@@ -15,7 +15,6 @@ export { ConfigError } from '@pellux/goodvibes-sdk/platform/types/errors';
|
|
|
15
15
|
import { readFileSync } from 'fs';
|
|
16
16
|
import { ConfigManager } from '@pellux/goodvibes-sdk/platform/config/manager';
|
|
17
17
|
import type { GoodVibesConfig } from '@pellux/goodvibes-sdk/platform/config/schema';
|
|
18
|
-
import { SecretsManager } from './secrets.ts';
|
|
19
18
|
import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
|
|
20
19
|
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
21
20
|
|
|
@@ -54,140 +53,4 @@ export function getConfiguredSystemPrompt(configManager: Pick<ConfigManager, 'ge
|
|
|
54
53
|
}
|
|
55
54
|
}
|
|
56
55
|
|
|
57
|
-
export
|
|
58
|
-
return loadEnvApiKeys();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function loadEnvApiKeys(): Record<string, string> {
|
|
62
|
-
const keys: Record<string, string> = {};
|
|
63
|
-
const mapping: Record<string, string> = {
|
|
64
|
-
openai: 'OPENAI_API_KEY',
|
|
65
|
-
anthropic: 'ANTHROPIC_API_KEY',
|
|
66
|
-
gemini: 'GEMINI_API_KEY',
|
|
67
|
-
inceptionlabs: 'INCEPTION_API_KEY',
|
|
68
|
-
openrouter: 'OPENROUTER_API_KEY',
|
|
69
|
-
aihubmix: 'AIHUBMIX_API_KEY',
|
|
70
|
-
groq: 'GROQ_API_KEY',
|
|
71
|
-
cerebras: 'CEREBRAS_API_KEY',
|
|
72
|
-
mistral: 'MISTRAL_API_KEY',
|
|
73
|
-
'ollama-cloud': 'OLLAMA_CLOUD_API_KEY',
|
|
74
|
-
// Note: also checked as OLLAMA_API_KEY below
|
|
75
|
-
huggingface: 'HF_API_KEY',
|
|
76
|
-
nvidia: 'NVIDIA_API_KEY',
|
|
77
|
-
llm7: 'LLM7_API_KEY',
|
|
78
|
-
deepseek: 'DEEPSEEK_API_KEY',
|
|
79
|
-
fireworks: 'FIREWORKS_API_KEY',
|
|
80
|
-
'github-copilot': 'COPILOT_GITHUB_TOKEN',
|
|
81
|
-
'microsoft-foundry': 'AZURE_OPENAI_API_KEY',
|
|
82
|
-
minimax: 'MINIMAX_API_KEY',
|
|
83
|
-
moonshot: 'MOONSHOT_API_KEY',
|
|
84
|
-
qianfan: 'QIANFAN_API_KEY',
|
|
85
|
-
qwen: 'QWEN_API_KEY',
|
|
86
|
-
sglang: 'SGLANG_API_KEY',
|
|
87
|
-
stepfun: 'STEPFUN_API_KEY',
|
|
88
|
-
together: 'TOGETHER_API_KEY',
|
|
89
|
-
venice: 'VENICE_API_KEY',
|
|
90
|
-
volcengine: 'VOLCANO_ENGINE_API_KEY',
|
|
91
|
-
xai: 'XAI_API_KEY',
|
|
92
|
-
xiaomi: 'XIAOMI_API_KEY',
|
|
93
|
-
zai: 'ZAI_API_KEY',
|
|
94
|
-
'cloudflare-ai-gateway': 'CLOUDFLARE_AI_GATEWAY_API_KEY',
|
|
95
|
-
'vercel-ai-gateway': 'AI_GATEWAY_API_KEY',
|
|
96
|
-
litellm: 'LITELLM_API_KEY',
|
|
97
|
-
'copilot-proxy': 'COPILOT_PROXY_API_KEY',
|
|
98
|
-
};
|
|
99
|
-
for (const [prov, envVar] of Object.entries(mapping)) {
|
|
100
|
-
let value = process.env[envVar];
|
|
101
|
-
// Fallback env var names
|
|
102
|
-
if (!value && prov === 'gemini') value = process.env['GOOGLE_API_KEY'] ?? process.env['GOOGLE_GEMINI_API_KEY'];
|
|
103
|
-
if (!value && prov === 'openai') value = process.env['OPENAI_KEY'];
|
|
104
|
-
if (!value && prov === 'anthropic') value = process.env['CLAUDE_API_KEY'];
|
|
105
|
-
if (!value && prov === 'ollama-cloud') value = process.env['OLLAMA_API_KEY'];
|
|
106
|
-
if (!value && prov === 'huggingface') value = process.env['HUGGINGFACE_API_KEY'] ?? process.env['HF_TOKEN'];
|
|
107
|
-
if (!value && prov === 'github-copilot') value = process.env['GH_TOKEN'] ?? process.env['GITHUB_TOKEN'];
|
|
108
|
-
if (!value && prov === 'qwen') value = process.env['DASHSCOPE_API_KEY'] ?? process.env['MODELSTUDIO_API_KEY'];
|
|
109
|
-
if (!value && prov === 'zai') value = process.env['Z_AI_API_KEY'];
|
|
110
|
-
if (value) keys[prov] = value;
|
|
111
|
-
}
|
|
112
|
-
return keys;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* resolveApiKeys — three-tier async resolution for all provider API keys.
|
|
117
|
-
*
|
|
118
|
-
* Resolution order per key:
|
|
119
|
-
* 1. Environment variable (process.env)
|
|
120
|
-
* 2. SecretsManager hierarchy-aware stores (secure preferred, plaintext policy-aware)
|
|
121
|
-
* 3. Omitted from result (null → skip)
|
|
122
|
-
*
|
|
123
|
-
* Returns a map of provider → apiKey for all providers where a key is found.
|
|
124
|
-
*/
|
|
125
|
-
export async function resolveApiKeys(
|
|
126
|
-
secrets: Pick<SecretsManager, 'get'>,
|
|
127
|
-
): Promise<Record<string, string>> {
|
|
128
|
-
const mapping: Array<{ prov: string; envVars: string[] }> = [
|
|
129
|
-
{ prov: 'openai', envVars: ['OPENAI_API_KEY', 'OPENAI_KEY'] },
|
|
130
|
-
{ prov: 'anthropic', envVars: ['ANTHROPIC_API_KEY', 'CLAUDE_API_KEY'] },
|
|
131
|
-
{ prov: 'gemini', envVars: ['GEMINI_API_KEY', 'GOOGLE_API_KEY', 'GOOGLE_GEMINI_API_KEY'] },
|
|
132
|
-
{ prov: 'inceptionlabs', envVars: ['INCEPTION_API_KEY'] },
|
|
133
|
-
{ prov: 'openrouter', envVars: ['OPENROUTER_API_KEY'] },
|
|
134
|
-
{ prov: 'aihubmix', envVars: ['AIHUBMIX_API_KEY'] },
|
|
135
|
-
{ prov: 'groq', envVars: ['GROQ_API_KEY'] },
|
|
136
|
-
{ prov: 'cerebras', envVars: ['CEREBRAS_API_KEY'] },
|
|
137
|
-
{ prov: 'mistral', envVars: ['MISTRAL_API_KEY'] },
|
|
138
|
-
{ prov: 'ollama-cloud', envVars: ['OLLAMA_CLOUD_API_KEY', 'OLLAMA_API_KEY'] },
|
|
139
|
-
{ prov: 'huggingface', envVars: ['HF_API_KEY', 'HUGGINGFACE_API_KEY', 'HF_TOKEN'] },
|
|
140
|
-
{ prov: 'nvidia', envVars: ['NVIDIA_API_KEY'] },
|
|
141
|
-
{ prov: 'llm7', envVars: ['LLM7_API_KEY'] },
|
|
142
|
-
{ prov: 'deepseek', envVars: ['DEEPSEEK_API_KEY'] },
|
|
143
|
-
{ prov: 'fireworks', envVars: ['FIREWORKS_API_KEY'] },
|
|
144
|
-
{ prov: 'github-copilot', envVars: ['COPILOT_GITHUB_TOKEN', 'GH_TOKEN', 'GITHUB_TOKEN'] },
|
|
145
|
-
{ prov: 'microsoft-foundry', envVars: ['AZURE_OPENAI_API_KEY'] },
|
|
146
|
-
{ prov: 'minimax', envVars: ['MINIMAX_API_KEY'] },
|
|
147
|
-
{ prov: 'moonshot', envVars: ['MOONSHOT_API_KEY'] },
|
|
148
|
-
{ prov: 'qianfan', envVars: ['QIANFAN_API_KEY'] },
|
|
149
|
-
{ prov: 'qwen', envVars: ['QWEN_API_KEY', 'DASHSCOPE_API_KEY', 'MODELSTUDIO_API_KEY'] },
|
|
150
|
-
{ prov: 'sglang', envVars: ['SGLANG_API_KEY'] },
|
|
151
|
-
{ prov: 'stepfun', envVars: ['STEPFUN_API_KEY'] },
|
|
152
|
-
{ prov: 'together', envVars: ['TOGETHER_API_KEY'] },
|
|
153
|
-
{ prov: 'venice', envVars: ['VENICE_API_KEY'] },
|
|
154
|
-
{ prov: 'volcengine', envVars: ['VOLCANO_ENGINE_API_KEY'] },
|
|
155
|
-
{ prov: 'xai', envVars: ['XAI_API_KEY'] },
|
|
156
|
-
{ prov: 'xiaomi', envVars: ['XIAOMI_API_KEY'] },
|
|
157
|
-
{ prov: 'zai', envVars: ['ZAI_API_KEY', 'Z_AI_API_KEY'] },
|
|
158
|
-
{ prov: 'cloudflare-ai-gateway', envVars: ['CLOUDFLARE_AI_GATEWAY_API_KEY'] },
|
|
159
|
-
{ prov: 'vercel-ai-gateway', envVars: ['AI_GATEWAY_API_KEY'] },
|
|
160
|
-
{ prov: 'litellm', envVars: ['LITELLM_API_KEY'] },
|
|
161
|
-
{ prov: 'copilot-proxy', envVars: ['COPILOT_PROXY_API_KEY'] },
|
|
162
|
-
];
|
|
163
|
-
|
|
164
|
-
const result: Record<string, string> = {};
|
|
165
|
-
|
|
166
|
-
for (const { prov, envVars } of mapping) {
|
|
167
|
-
// Tier 1: environment variables
|
|
168
|
-
let value: string | null = null;
|
|
169
|
-
for (const envVar of envVars) {
|
|
170
|
-
if (process.env[envVar]) {
|
|
171
|
-
value = process.env[envVar]!;
|
|
172
|
-
break;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Tier 2: SecretsManager hierarchy-aware secure/plaintext stores
|
|
177
|
-
if (value === null) {
|
|
178
|
-
for (const envVar of envVars) {
|
|
179
|
-
const stored = await secrets.get(envVar);
|
|
180
|
-
if (stored !== null) {
|
|
181
|
-
value = stored;
|
|
182
|
-
break;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
if (value !== null) {
|
|
188
|
-
result[prov] = value;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
return result;
|
|
193
|
-
}
|
|
56
|
+
export { getConfiguredApiKeys, resolveApiKeys } from '@pellux/goodvibes-sdk/platform/config/api-keys';
|
|
@@ -3,9 +3,9 @@ import { renderMarkdown, renderMarkdownTracked } from '../renderer/markdown.ts';
|
|
|
3
3
|
import { renderToolCallBlock } from '../renderer/tool-call.ts';
|
|
4
4
|
import { renderThinkingBlock } from '../renderer/thinking.ts';
|
|
5
5
|
import { renderSystemMessage } from '../renderer/system-message.ts';
|
|
6
|
-
import { createEmptyLine, type Line, type Cell } from '
|
|
7
|
-
import { getSplashLines, type SplashOptions } from '
|
|
8
|
-
import { interpolateColor, getDisplayWidth, wrapText } from '
|
|
6
|
+
import { createEmptyLine, type Line, type Cell } from '../types/grid.ts';
|
|
7
|
+
import { getSplashLines, type SplashOptions } from '../utils/splash-lines.ts';
|
|
8
|
+
import { interpolateColor, getDisplayWidth, wrapText } from '../utils/terminal-width.ts';
|
|
9
9
|
import { LAYOUT } from '../renderer/layout.ts';
|
|
10
10
|
import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config/manager';
|
|
11
11
|
import { renderConversationCollapsedFragment, renderConversationEventLine } from '../renderer/conversation-surface.ts';
|