@pellux/goodvibes-tui 0.19.16 → 0.19.19
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
CHANGED
|
@@ -4,6 +4,38 @@ All notable changes to GoodVibes TUI.
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [0.19.19] — 2026-04-21
|
|
8
|
+
|
|
9
|
+
### Changes
|
|
10
|
+
- 476d9d7 docs: add UAT validation reports for runs 3 (0.19.12) and 4 (0.19.14)
|
|
11
|
+
- 77f155d release: TUI 0.19.18 — SDK 0.21.35 (PERF-08 SSE backpressure + OBS-05/14 closeout)
|
|
12
|
+
- e213c30 fix: regen operator-contract artifact + plugin-system microtask flush
|
|
13
|
+
- 27632c3 fix(tests): migrate remaining reverted test files for OBS-14 microtask dispatch
|
|
14
|
+
- bfe0e62 release: TUI 0.19.17 — SDK 0.21.33 bump + OBS-14 microtask test migration
|
|
15
|
+
|
|
16
|
+
## [0.19.18] - 2026-04-21
|
|
17
|
+
|
|
18
|
+
SDK 0.21.27 → 0.21.35 upgrade. Captures all OBS-05, OBS-06, OBS-14, F3, QA-14, and PERF-08 consumer-side migrations; no 0.19.17 was ever published (tests failed in CI) — this release closes out all of that work.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
- Upgraded `@pellux/goodvibes-sdk` from 0.21.27 to 0.21.35. Wave 4 closeout + Wave 5 + PERF-08 SSE backpressure rebuild.
|
|
22
|
+
- `src/runtime/bootstrap.ts`: `getOrCreateCompanionToken('tui')` call migrated to the F3 signature `getOrCreateCompanionToken('tui', { daemonHomeDir })` with `daemonHomeDir` resolved from `services.homeDirectory`.
|
|
23
|
+
- `src/panels/tool-inspector-panel.ts`:
|
|
24
|
+
- TOOL_SUCCEEDED / TOOL_FAILED handlers simplified after OBS-05. Post-0.21.31 the `.result` field on these events is a `ToolResultSummary` (`{ kind, byteSize, preview? }`), not the raw tool result, so the prior `_policyAudit` extraction is no longer reachable from this event path. Dead lookup removed with an inline note pointing future readers at the approval broker / tool result store as the new channel for policy audit metadata.
|
|
25
|
+
- `summarizeResult()` rewritten to read `preview` (string) with a `${kind} (${byteSize}B)` fallback. Previously read `.output` / `.error` from the raw result shape, which silently returned `undefined` for every post-OBS-05 event. Detail line "Summary" now renders correctly in the Tool Inspector again.
|
|
26
|
+
- `docs/foundation-artifacts/operator-contract.json`: regenerated via `bun run foundation:artifacts` (SDK 0.21.35 bumped the embedded `product.version` string).
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
- **OBS-14 test migration** across 17 test files. SDK 0.21.32+ `RuntimeEventBus.emit(...)` dispatches listeners via `queueMicrotask`. Tests that emitted a bus event and asserted synchronously on subscriber-populated state now drain queued microtasks first. Injected a local `flushMicrotasks = async () => { await Promise.resolve(); await Promise.resolve(); await Promise.resolve(); }` helper in each affected file; converted sync test callbacks to `async () => {}` where needed, and inserted `await flushMicrotasks();` after bus-emitting calls before each dependent assertion. Wrapper emission helpers (`emitTurn`, `emitTask`, `emitAgentCompleted`, `emitAgentFailed`, `emitToolRuntimeEvent`) promoted to `async function(): Promise<void>` in test files that needed them; all callers awaited. Files touched: `src/test/core/event-replay.test.ts`, `streaming.test.ts`, `qol-features.test.ts`, `tool-result-reconciliation.test.ts`, `src/test/daemon/telemetry-routes.test.ts`, `src/test/agents/wrfc-controller.test.ts`, `src/test/integration/tool-execution.test.ts`, `src/test/plugins/plugin-system.test.ts`, `src/test/panels/workspace-migration.test.ts`, `src/test/panels/provider-health-panel.test.ts`, `src/test/runtime/ops/playbook-runtime-context.test.ts`, `src/test/runtime/forensics/forensics.test.ts`, `src/test/runtime/operator-client.test.ts`, `src/test/runtime/telemetry-api.test.ts`, `src/test/release-gates/policy-and-budget-evidence-gate.test.ts`, `src/test/release-gates/runtime-certification-gate.test.ts`, `src/test/runtime/emit-enforcement.test.ts`.
|
|
30
|
+
- **OBS-05 tool result fixture** in `src/test/integration/tool-execution.test.ts`: TOOL_SUCCEEDED fixture constructs a `ToolResultSummary` shape (`{ kind: 'json', byteSize, preview }`) rather than the raw tool result.
|
|
31
|
+
- **OBS-06 redaction import path** in `src/test/export/session-export.test.ts`: `redactSensitiveData` now imported from `@pellux/goodvibes-sdk/platform/utils/redaction`.
|
|
32
|
+
- **PERF-08 SSE backpressure** (via SDK): `src/test/control-plane/gateway-stream.test.ts` "replays recent events with ids and resumes after Last-Event-ID" now passes against SDK 0.21.35. Test additions: `flushMicrotasks` drains between `publishEvent`/`createEventStream`/`reader.read()` to let async dispatch settle; test timeout raised to 15s for headroom (completes in ~65ms with the SDK fix).
|
|
33
|
+
|
|
34
|
+
### Notes
|
|
35
|
+
- No 0.19.17 entry — 0.19.17 was committed and pushed but its Release CI never produced an npm artifact (tests failed on the microtask-dispatch regressions before the SDK 0.21.35 backpressure fix landed). 0.19.18 subsumes all of that work in a single ship.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
7
39
|
## [0.19.16] - 2026-04-20
|
|
8
40
|
|
|
9
41
|
### 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.19",
|
|
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",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"@anthropic-ai/vertex-sdk": "^0.16.0",
|
|
91
91
|
"@ast-grep/napi": "^0.42.0",
|
|
92
92
|
"@aws/bedrock-token-generator": "^1.1.0",
|
|
93
|
-
"@pellux/goodvibes-sdk": "0.21.
|
|
93
|
+
"@pellux/goodvibes-sdk": "0.21.35",
|
|
94
94
|
"bash-language-server": "^5.6.0",
|
|
95
95
|
"fuse.js": "^7.1.0",
|
|
96
96
|
"graphql": "^16.13.2",
|
|
@@ -75,14 +75,16 @@ function truncateJson(val: unknown, maxLen = 120): string {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
function summarizeResult(result: unknown): string | undefined {
|
|
78
|
+
// SDK OBS-05 (0.21.31+): TOOL_SUCCEEDED/TOOL_FAILED.result is a ToolResultSummary
|
|
79
|
+
// { kind: 'text' | 'json' | 'binary' | 'error' | 'empty'; byteSize: number; preview?: string }.
|
|
78
80
|
if (!result || typeof result !== 'object') return undefined;
|
|
79
81
|
const record = result as Record<string, unknown>;
|
|
80
|
-
if (typeof record.
|
|
81
|
-
const compact = record.
|
|
82
|
+
if (typeof record.preview === 'string' && record.preview.trim()) {
|
|
83
|
+
const compact = record.preview.replace(/\s+/g, ' ').trim();
|
|
82
84
|
return compact.length > 72 ? `${compact.slice(0, 69)}\u2026` : compact;
|
|
83
85
|
}
|
|
84
|
-
if (typeof record.
|
|
85
|
-
return record.
|
|
86
|
+
if (typeof record.kind === 'string' && typeof record.byteSize === 'number') {
|
|
87
|
+
return `${record.kind} (${record.byteSize}B)`;
|
|
86
88
|
}
|
|
87
89
|
return undefined;
|
|
88
90
|
}
|
|
@@ -382,17 +384,16 @@ export class ToolInspectorPanel extends BasePanel {
|
|
|
382
384
|
this.markDirty();
|
|
383
385
|
}));
|
|
384
386
|
|
|
387
|
+
// NOTE: After SDK OBS-05 (0.21.31), TOOL_SUCCEEDED/TOOL_FAILED.result is a ToolResultSummary
|
|
388
|
+
// ({ kind, byteSize, preview? }) rather than the raw ToolResult object. The previous
|
|
389
|
+
// `_policyAudit` extraction is no longer reachable via this event — policy audit metadata
|
|
390
|
+
// must be sourced from a different channel (approval broker / tool result store) if the
|
|
391
|
+
// Tool Inspector is to display it in future.
|
|
385
392
|
this.unsubs.push(this.toolEvents.on('TOOL_SUCCEEDED', (data) => {
|
|
386
393
|
const rec = this.records.findLast(r => r.callId === data.callId);
|
|
387
394
|
if (rec) {
|
|
388
395
|
rec.endMs = Date.now();
|
|
389
396
|
rec.result = data.result;
|
|
390
|
-
if (data.result && typeof data.result === 'object') {
|
|
391
|
-
const audit = (data.result as { _policyAudit?: { actionTaken?: string; spillBackend?: string; policyId?: string } })._policyAudit;
|
|
392
|
-
rec.policyAction = audit?.actionTaken;
|
|
393
|
-
rec.spillBackend = audit?.spillBackend;
|
|
394
|
-
rec.outputClass = audit?.policyId ?? rec.outputClass;
|
|
395
|
-
}
|
|
396
397
|
rec.resultSummary = summarizeResult(data.result);
|
|
397
398
|
}
|
|
398
399
|
this.markDirty();
|
|
@@ -404,12 +405,6 @@ export class ToolInspectorPanel extends BasePanel {
|
|
|
404
405
|
rec.endMs = Date.now();
|
|
405
406
|
rec.result = data.result;
|
|
406
407
|
rec.error = data.error;
|
|
407
|
-
if (data.result && typeof data.result === 'object') {
|
|
408
|
-
const audit = (data.result as { _policyAudit?: { actionTaken?: string; spillBackend?: string; policyId?: string } })._policyAudit;
|
|
409
|
-
rec.policyAction = audit?.actionTaken;
|
|
410
|
-
rec.spillBackend = audit?.spillBackend;
|
|
411
|
-
rec.outputClass = audit?.policyId ?? rec.outputClass;
|
|
412
|
-
}
|
|
413
408
|
rec.resultSummary = summarizeResult(data.result) ?? data.error;
|
|
414
409
|
}
|
|
415
410
|
this.markDirty();
|
package/src/runtime/bootstrap.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* - main.ts: terminal setup, render loop, stdin/stdout handlers
|
|
10
10
|
* - lifecycle.ts: save/shutdown helpers
|
|
11
11
|
*/
|
|
12
|
+
import { join } from 'node:path';
|
|
12
13
|
import { Orchestrator } from '../core/orchestrator.ts';
|
|
13
14
|
import { AcpManager } from '@pellux/goodvibes-sdk/platform/acp/manager';
|
|
14
15
|
import { getTierPromptSupplement, getTierForContextWindow } from '@pellux/goodvibes-sdk/platform/providers/tier-prompts';
|
|
@@ -330,7 +331,7 @@ export async function bootstrapRuntime(
|
|
|
330
331
|
// Register the persistent companion-pairing token as the daemon's shared
|
|
331
332
|
// bearer, so tokens scanned from the /qrcode panel's QR actually
|
|
332
333
|
// authenticate against the embedded daemon this surface starts.
|
|
333
|
-
const companionTokenRecord = getOrCreateCompanionToken('tui');
|
|
334
|
+
const companionTokenRecord = getOrCreateCompanionToken('tui', { daemonHomeDir: join(services.homeDirectory, '.goodvibes', 'daemon') });
|
|
334
335
|
externalServicesPromise = startExternalServices(
|
|
335
336
|
configManager,
|
|
336
337
|
runtimeBus,
|
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.19';
|
|
10
10
|
try {
|
|
11
11
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8'));
|
|
12
12
|
_version = pkg.version ?? _version;
|