@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.
Files changed (196) hide show
  1. package/CHANGELOG.md +172 -0
  2. package/README.md +1 -1
  3. package/docs/foundation-artifacts/operator-contract.json +1 -1
  4. package/package.json +3 -2
  5. package/src/config/index.ts +1 -138
  6. package/src/core/conversation-rendering.ts +3 -3
  7. package/src/core/conversation.ts +176 -423
  8. package/src/core/history.ts +45 -0
  9. package/src/core/orchestrator.ts +3 -735
  10. package/src/core/system-message-router.ts +19 -58
  11. package/src/daemon/cli.ts +82 -6
  12. package/src/input/command-registry.ts +2 -0
  13. package/src/input/commands/control-room-runtime.ts +1 -1
  14. package/src/input/commands/health-runtime.ts +1 -1
  15. package/src/input/commands/local-setup-review.ts +1 -1
  16. package/src/input/commands/platform-access-runtime.ts +1 -1
  17. package/src/input/commands/qrcode-runtime.ts +20 -0
  18. package/src/input/commands/subscription-runtime.ts +1 -1
  19. package/src/input/commands.ts +2 -0
  20. package/src/input/handler-content-actions.ts +2 -2
  21. package/src/input/handler-feed.ts +7 -1
  22. package/src/input/handler-modal-routes.ts +19 -2
  23. package/src/input/handler-modal-token-routes.ts +4 -1
  24. package/src/input/handler-picker-routes.ts +4 -2
  25. package/src/input/handler-ui-state.ts +1 -1
  26. package/src/input/handler.ts +1 -1
  27. package/src/input/model-picker.ts +11 -0
  28. package/src/input/search.ts +1 -1
  29. package/src/input/selection.ts +2 -2
  30. package/src/input/settings-modal.ts +31 -3
  31. package/src/main.ts +1 -1
  32. package/src/panels/agent-inspector-panel.ts +3 -3
  33. package/src/panels/agent-logs-panel.ts +26 -27
  34. package/src/panels/approval-panel.ts +2 -2
  35. package/src/panels/automation-control-panel.ts +3 -3
  36. package/src/panels/base-panel.ts +14 -14
  37. package/src/panels/builtin/operations.ts +1 -1
  38. package/src/panels/builtin/session.ts +67 -1
  39. package/src/panels/builtin/shared.ts +4 -4
  40. package/src/panels/cockpit-panel.ts +2 -2
  41. package/src/panels/communication-panel.ts +3 -3
  42. package/src/panels/context-visualizer-panel.ts +2 -2
  43. package/src/panels/control-plane-panel.ts +3 -3
  44. package/src/panels/cost-tracker-panel.ts +3 -3
  45. package/src/panels/debug-panel.ts +2 -2
  46. package/src/panels/diff-panel.ts +2 -2
  47. package/src/panels/docs-panel.ts +1 -1
  48. package/src/panels/eval-panel.ts +2 -2
  49. package/src/panels/file-explorer-panel.ts +3 -3
  50. package/src/panels/file-preview-panel.ts +3 -3
  51. package/src/panels/forensics-panel.ts +2 -2
  52. package/src/panels/git-panel.ts +1 -1
  53. package/src/panels/hooks-panel.ts +3 -3
  54. package/src/panels/incident-review-panel.ts +1 -1
  55. package/src/panels/intelligence-panel.ts +2 -2
  56. package/src/panels/knowledge-panel.ts +1 -1
  57. package/src/panels/local-auth-panel.ts +2 -2
  58. package/src/panels/marketplace-panel.ts +1 -1
  59. package/src/panels/mcp-panel.ts +3 -3
  60. package/src/panels/memory-panel.ts +1 -1
  61. package/src/panels/ops-control-panel.ts +3 -3
  62. package/src/panels/ops-strategy-panel.ts +2 -2
  63. package/src/panels/orchestration-panel.ts +2 -2
  64. package/src/panels/panel-list-panel.ts +6 -6
  65. package/src/panels/plan-dashboard-panel.ts +1 -1
  66. package/src/panels/plugins-panel.ts +2 -2
  67. package/src/panels/policy-panel.ts +2 -2
  68. package/src/panels/polish.ts +3 -3
  69. package/src/panels/provider-account-snapshot.ts +1 -1
  70. package/src/panels/provider-accounts-panel.ts +25 -29
  71. package/src/panels/provider-health-panel.ts +2 -2
  72. package/src/panels/provider-stats-panel.ts +3 -3
  73. package/src/panels/qr-panel.ts +182 -0
  74. package/src/panels/remote-panel.ts +3 -3
  75. package/src/panels/routes-panel.ts +3 -3
  76. package/src/panels/sandbox-panel.ts +2 -2
  77. package/src/panels/schedule-panel.ts +1 -1
  78. package/src/panels/scrollable-list-panel.ts +407 -0
  79. package/src/panels/security-panel.ts +2 -2
  80. package/src/panels/services-panel.ts +3 -3
  81. package/src/panels/session-browser-panel.ts +2 -2
  82. package/src/panels/settings-sync-panel.ts +2 -2
  83. package/src/panels/skills-panel.ts +6 -6
  84. package/src/panels/subscription-panel.ts +3 -3
  85. package/src/panels/symbol-outline-panel.ts +3 -3
  86. package/src/panels/system-messages-panel.ts +4 -4
  87. package/src/panels/tasks-panel.ts +2 -2
  88. package/src/panels/thinking-panel.ts +3 -3
  89. package/src/panels/token-budget-panel.ts +1 -1
  90. package/src/panels/tool-inspector-panel.ts +3 -3
  91. package/src/panels/types.ts +5 -5
  92. package/src/panels/watchers-panel.ts +3 -3
  93. package/src/panels/welcome-panel.ts +1 -1
  94. package/src/panels/worktree-panel.ts +22 -21
  95. package/src/panels/wrfc-panel.ts +3 -3
  96. package/src/permissions/prompt.ts +3 -22
  97. package/src/plugins/loader.ts +15 -304
  98. package/src/renderer/agent-detail-modal.ts +1 -1
  99. package/src/renderer/autocomplete-overlay.ts +2 -2
  100. package/src/renderer/bookmark-modal.ts +1 -1
  101. package/src/renderer/bottom-bar.ts +2 -2
  102. package/src/renderer/buffer.ts +1 -1
  103. package/src/renderer/code-block.ts +2 -2
  104. package/src/renderer/compositor.ts +2 -2
  105. package/src/renderer/context-inspector.ts +1 -1
  106. package/src/renderer/conversation-layout.ts +2 -2
  107. package/src/renderer/conversation-overlays.ts +1 -1
  108. package/src/renderer/conversation-surface.ts +2 -2
  109. package/src/renderer/diff-view.ts +2 -2
  110. package/src/renderer/diff.ts +1 -1
  111. package/src/renderer/file-picker-overlay.ts +2 -2
  112. package/src/renderer/file-tree.ts +2 -2
  113. package/src/renderer/help-overlay.ts +1 -1
  114. package/src/renderer/history-search-overlay.ts +2 -2
  115. package/src/renderer/live-tail-modal.ts +1 -1
  116. package/src/renderer/markdown.ts +2 -2
  117. package/src/renderer/modal-factory.ts +3 -3
  118. package/src/renderer/model-picker-overlay.ts +2 -2
  119. package/src/renderer/overlay-box.ts +2 -2
  120. package/src/renderer/panel-composite.ts +1 -1
  121. package/src/renderer/panel-picker-overlay.ts +2 -2
  122. package/src/renderer/panel-tab-bar.ts +1 -1
  123. package/src/renderer/panel-workspace-bar.ts +1 -1
  124. package/src/renderer/process-indicator.ts +2 -2
  125. package/src/renderer/process-modal.ts +1 -1
  126. package/src/renderer/profile-picker-modal.ts +2 -2
  127. package/src/renderer/progress.ts +2 -2
  128. package/src/renderer/qr-renderer.ts +117 -0
  129. package/src/renderer/search-overlay.ts +2 -2
  130. package/src/renderer/selection-modal-overlay.ts +2 -2
  131. package/src/renderer/session-picker-modal.ts +2 -2
  132. package/src/renderer/settings-modal-helpers.ts +122 -0
  133. package/src/renderer/settings-modal.ts +149 -113
  134. package/src/renderer/shell-surface.ts +1 -1
  135. package/src/renderer/system-message.ts +1 -1
  136. package/src/renderer/tab-strip.ts +2 -2
  137. package/src/renderer/text-layout.ts +1 -1
  138. package/src/renderer/thinking.ts +1 -1
  139. package/src/renderer/tool-call.ts +2 -2
  140. package/src/renderer/ui-factory.ts +2 -2
  141. package/src/runtime/bootstrap-command-context.ts +5 -6
  142. package/src/runtime/bootstrap-command-parts.ts +32 -18
  143. package/src/runtime/bootstrap-core.ts +3 -2
  144. package/src/runtime/bootstrap-hook-bridge.ts +15 -174
  145. package/src/runtime/bootstrap-shell.ts +4 -4
  146. package/src/runtime/bootstrap.ts +7 -2
  147. package/src/runtime/context.ts +4 -20
  148. package/src/runtime/diagnostics/panels/index.ts +6 -6
  149. package/src/runtime/diagnostics/panels/ops.ts +1 -1
  150. package/src/runtime/diagnostics/panels/panel-resources.ts +118 -0
  151. package/src/runtime/perf/panel-contracts.ts +32 -0
  152. package/src/runtime/perf/panel-health-monitor.ts +18 -0
  153. package/src/runtime/services.ts +5 -5
  154. package/src/runtime/store/domains/domain-read-matrix.ts +0 -2
  155. package/src/runtime/store/selectors/index.ts +11 -6
  156. package/src/runtime/store/state.ts +12 -4
  157. package/src/runtime/ui-events.ts +1 -0
  158. package/src/runtime/ui-read-model-helpers.ts +1 -32
  159. package/src/runtime/ui-read-models-observability-maintenance.ts +1 -81
  160. package/src/runtime/ui-read-models-observability-options.ts +1 -5
  161. package/src/runtime/ui-read-models-observability-remote.ts +1 -73
  162. package/src/runtime/ui-read-models-observability-security.ts +1 -172
  163. package/src/runtime/ui-read-models-observability-system.ts +1 -217
  164. package/src/runtime/ui-read-models-observability.ts +1 -59
  165. package/src/runtime/ui-service-queries.ts +1 -114
  166. package/src/runtime/ui-services.ts +1 -1
  167. package/src/shell/ui-openers.ts +1 -1
  168. package/src/tools/index.ts +1 -186
  169. package/src/types/grid.ts +48 -0
  170. package/src/utils/clipboard.ts +21 -0
  171. package/src/utils/splash-lines.ts +1 -1
  172. package/src/utils/terminal-width.ts +185 -0
  173. package/src/version.ts +1 -1
  174. package/src/config/service-registry.ts +0 -1
  175. package/src/config/subscription-providers.ts +0 -127
  176. package/src/daemon/facade-composition.ts +0 -398
  177. package/src/daemon/facade.ts +0 -638
  178. package/src/daemon/surface-policy.ts +0 -60
  179. package/src/daemon/types.ts +0 -191
  180. package/src/runtime/diagnostics/actions.ts +0 -776
  181. package/src/runtime/diagnostics/index.ts +0 -99
  182. package/src/runtime/diagnostics/panels/agents.ts +0 -252
  183. package/src/runtime/diagnostics/panels/events.ts +0 -188
  184. package/src/runtime/diagnostics/panels/health.ts +0 -242
  185. package/src/runtime/diagnostics/panels/tasks.ts +0 -251
  186. package/src/runtime/diagnostics/panels/tool-calls.ts +0 -267
  187. package/src/runtime/diagnostics/provider.ts +0 -262
  188. package/src/runtime/store/domains/conversation.ts +0 -181
  189. package/src/runtime/store/domains/permissions.ts +0 -143
  190. package/src/runtime/store/helpers/reducers/conversation.ts +0 -228
  191. package/src/runtime/store/helpers/reducers/lifecycle.ts +0 -440
  192. package/src/runtime/store/helpers/reducers/shared.ts +0 -60
  193. package/src/runtime/store/helpers/reducers/sync.ts +0 -555
  194. package/src/runtime/store/helpers/reducers.ts +0 -30
  195. package/src/runtime/ui-read-models-core.ts +0 -95
  196. 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
  [![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-0.18.12-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
5
+ [![Version](https://img.shields.io/badge/version-0.18.17-blue.svg)](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
 
@@ -3,7 +3,7 @@
3
3
  "product": {
4
4
  "id": "goodvibes",
5
5
  "surface": "operator",
6
- "version": "0.18.28"
6
+ "version": "0.18.37"
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": "0.18.12",
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.28",
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",
@@ -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 function getConfiguredApiKeys(): Record<string, string> {
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 '@pellux/goodvibes-sdk/platform/types/grid';
7
- import { getSplashLines, type SplashOptions } from '@pellux/goodvibes-sdk/platform/utils/splash-lines';
8
- import { interpolateColor, getDisplayWidth, wrapText } from '@pellux/goodvibes-sdk/platform/utils/terminal-width';
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';