@pellux/goodvibes-tui 0.19.7 → 0.19.10
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 +19 -0
- package/README.md +1 -1
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +2 -2
- package/src/runtime/bootstrap-core.ts +28 -11
- package/src/runtime/bootstrap.ts +7 -0
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,25 @@ All notable changes to GoodVibes TUI.
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [0.19.10] - 2026-04-19
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
- Upgraded `@pellux/goodvibes-sdk` to 0.21.16. Picks up the discovered-provider configuration fix: network-discovered providers (LM Studio, Ollama, vLLM, llama.cpp, TGI, LocalAI) are now reported as configured by `GET /api/providers` and accepted by `PATCH /api/providers/current` without a fake API-key requirement.
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- `PATCH /api/providers/current` with a discovered provider's registryKey (e.g. `"LM Studio (192.168.0.85):qwen3.6-35b-a3b@q2_k_xl"`) no longer returns `PROVIDER_NOT_CONFIGURED` with a placeholder `<API key for X>` message. The daemon accepts the switch and the turn uses the discovered provider.
|
|
14
|
+
|
|
15
|
+
## [0.19.9] - 2026-04-19
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
- Regenerated `docs/foundation-artifacts/operator-contract.json` after the 0.19.8 SDK bump; the foundation-artifacts-gate test failed on the 0.19.8 CI because the JSON was not regenerated. 0.19.8 tag has no npm artifact; 0.19.9 supersedes.
|
|
19
|
+
## [0.19.8] - 2026-04-19
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- Upgraded `@pellux/goodvibes-sdk` from 0.21.10 to 0.21.15. Carries the companion main-chat routing fix: `POST /api/sessions/:id/messages` with `kind: 'message'` now short-circuits the daemon's WRFC engineer-chain fall-through. The TUI wires `orchestrator.handleUserInput()` into the `COMPANION_MESSAGE_RECEIVED` runtime bus subscriber, so companion main-chat sends fire a real LLM turn via the same entry point as the TUI input box. Turn `STREAM_DELTA` / `TURN_COMPLETED` events stream back to both TUI and companion SSE.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
- Companion main-chat no longer produces engineer-agent acknowledgement boilerplate ("Update noted", "WRFC chain has passed all gates"). The message is received by the daemon, persisted, rendered in the TUI, and answered by a normal chat turn.
|
|
7
26
|
## [0.19.7] - 2026-04-18
|
|
8
27
|
|
|
9
28
|
### Changed
|
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.19.
|
|
3
|
+
"version": "0.19.10",
|
|
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",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"@anthropic-ai/vertex-sdk": "^0.16.0",
|
|
90
90
|
"@ast-grep/napi": "^0.42.0",
|
|
91
91
|
"@aws/bedrock-token-generator": "^1.1.0",
|
|
92
|
-
"@pellux/goodvibes-sdk": "0.21.
|
|
92
|
+
"@pellux/goodvibes-sdk": "0.21.16",
|
|
93
93
|
"bash-language-server": "^5.6.0",
|
|
94
94
|
"fuse.js": "^7.1.0",
|
|
95
95
|
"graphql": "^16.13.2",
|
|
@@ -50,6 +50,12 @@ export interface BootstrapCoreState {
|
|
|
50
50
|
readonly permissionPromptRef: { requestPermission: PermissionRequestHandler };
|
|
51
51
|
readonly systemMessageRouterRef: { value: SystemMessageRouter | null };
|
|
52
52
|
readonly conversationFollowUpRef: { value: ((item: ConversationFollowUpItem) => void) | null };
|
|
53
|
+
/**
|
|
54
|
+
* Mutable ref patched by bootstrap.ts after the Orchestrator is constructed.
|
|
55
|
+
* When non-null, COMPANION_MESSAGE_RECEIVED fires a real LLM turn via
|
|
56
|
+
* orchestrator.handleUserInput() instead of only appending the user message.
|
|
57
|
+
*/
|
|
58
|
+
readonly orchestratorHandleUserInputRef: { value: ((text: string) => void) | null };
|
|
53
59
|
readonly requestRender: () => void;
|
|
54
60
|
readonly setRenderRequest: (fn: () => void) => void;
|
|
55
61
|
readonly runtimeSessionIdRef: { value: string };
|
|
@@ -286,20 +292,30 @@ export async function initializeBootstrapCore(
|
|
|
286
292
|
wrfcController: services.wrfcController,
|
|
287
293
|
});
|
|
288
294
|
|
|
289
|
-
// Subscribe to companion
|
|
290
|
-
// The daemon emits COMPANION_MESSAGE_RECEIVED on the runtime bus
|
|
291
|
-
//
|
|
292
|
-
//
|
|
293
|
-
//
|
|
294
|
-
//
|
|
295
|
-
//
|
|
296
|
-
//
|
|
297
|
-
//
|
|
295
|
+
// Subscribe to companion main-chat messages received from the daemon's HTTP layer.
|
|
296
|
+
// The daemon emits COMPANION_MESSAGE_RECEIVED on the runtime bus when a companion
|
|
297
|
+
// POST /api/sessions/:id/messages with kind='message' arrives.
|
|
298
|
+
//
|
|
299
|
+
// bootstrap.ts patches orchestratorHandleUserInputRef.value after the Orchestrator
|
|
300
|
+
// is constructed. When that ref is set, we delegate to orchestrator.handleUserInput()
|
|
301
|
+
// which (a) adds the user message to the conversation view and (b) fires a real LLM
|
|
302
|
+
// turn whose STREAM_DELTA / TURN_COMPLETED events flow to both TUI and companion SSE.
|
|
303
|
+
//
|
|
304
|
+
// The fallback (ref not yet set) adds the message to the conversation view only —
|
|
305
|
+
// this path is unreachable in practice because the event bus is not connected to
|
|
306
|
+
// any live HTTP traffic until after the orchestrator is wired in bootstrap.ts.
|
|
307
|
+
const orchestratorHandleUserInputRef: { value: ((text: string) => void) | null } = { value: null };
|
|
298
308
|
runtimeUnsubs.push(runtimeBus.on<Extract<SessionEvent, { type: 'COMPANION_MESSAGE_RECEIVED' }>>(
|
|
299
309
|
'COMPANION_MESSAGE_RECEIVED',
|
|
300
310
|
({ payload }) => {
|
|
301
|
-
|
|
302
|
-
|
|
311
|
+
if (orchestratorHandleUserInputRef.value) {
|
|
312
|
+
// Delegate to the orchestrator: adds user message + fires a real LLM turn.
|
|
313
|
+
orchestratorHandleUserInputRef.value(payload.body);
|
|
314
|
+
} else {
|
|
315
|
+
// Fallback: render the user message immediately (orchestrator not yet ready).
|
|
316
|
+
conversation.addUserMessage(payload.body);
|
|
317
|
+
requestRender();
|
|
318
|
+
}
|
|
303
319
|
},
|
|
304
320
|
));
|
|
305
321
|
|
|
@@ -424,6 +440,7 @@ export async function initializeBootstrapCore(
|
|
|
424
440
|
permissionPromptRef,
|
|
425
441
|
systemMessageRouterRef,
|
|
426
442
|
conversationFollowUpRef,
|
|
443
|
+
orchestratorHandleUserInputRef,
|
|
427
444
|
requestRender,
|
|
428
445
|
setRenderRequest: (fn) => {
|
|
429
446
|
renderRequestRef.value = fn;
|
package/src/runtime/bootstrap.ts
CHANGED
|
@@ -155,6 +155,7 @@ export async function bootstrapRuntime(
|
|
|
155
155
|
permissionPromptRef,
|
|
156
156
|
systemMessageRouterRef,
|
|
157
157
|
conversationFollowUpRef,
|
|
158
|
+
orchestratorHandleUserInputRef,
|
|
158
159
|
requestRender,
|
|
159
160
|
setRenderRequest,
|
|
160
161
|
runtimeSessionIdRef,
|
|
@@ -199,6 +200,12 @@ export async function bootstrapRuntime(
|
|
|
199
200
|
},
|
|
200
201
|
});
|
|
201
202
|
conversationFollowUpRef.value = (item) => orchestrator.enqueueConversationFollowUp(item);
|
|
203
|
+
// Wire orchestratorHandleUserInputRef so COMPANION_MESSAGE_RECEIVED fires a real LLM turn.
|
|
204
|
+
orchestratorHandleUserInputRef.value = (text: string) => {
|
|
205
|
+
orchestrator.handleUserInput(text).catch((err: unknown) => {
|
|
206
|
+
logger.debug('companion handleUserInput safety catch', { error: String(err) });
|
|
207
|
+
});
|
|
208
|
+
};
|
|
202
209
|
orchestrator.setCoreServices({
|
|
203
210
|
configManager,
|
|
204
211
|
providerRegistry,
|
package/src/version.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { join } from 'node:path';
|
|
|
6
6
|
// The prebuild script updates the fallback value before compilation.
|
|
7
7
|
// Uses import.meta.dir (Bun) to locate package.json relative to this file,
|
|
8
8
|
// which is correct regardless of the process working directory.
|
|
9
|
-
let _version = '0.19.
|
|
9
|
+
let _version = '0.19.10';
|
|
10
10
|
try {
|
|
11
11
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8'));
|
|
12
12
|
_version = pkg.version ?? _version;
|