@pellux/goodvibes-tui 0.19.15 → 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,53 @@ 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
+
39
+ ## [0.19.16] - 2026-04-20
40
+
41
+ ### Changed
42
+ - Upgraded `@pellux/goodvibes-sdk` to 0.21.27. Picks up three F-closures (all internal to the SDK; TUI requires zero active wiring):
43
+ 1. **F7 closed** — OTLP POST receivers implemented at `/api/v1/telemetry/otlp/v1/{logs,traces,metrics}`. JSON-only (`application/json`); protobuf returns 415. `ingestSink` wired to `TelemetryApiService` in daemon router (not null). Ingested records enter the ring buffer (~500 events) with `source: 'otlp-ingest'` and are observable on `GET /api/v1/telemetry/events`. Note: prior "by design" framing for this failure was incorrect — it was a missing implementation.
44
+ 2. **F5b closed** — SDK runtime sqlite-vec resolver (`resolveSqliteVecPath()` in `memory-vector-store.js`) now detects the bundled-executable case (`import.meta.url.includes('$bunfs')`) and resolves the addon from `dirname(process.execPath)/lib/sqlite-vec-<os>-<arch>/vec0.<suffix>`. Completes the full chain with F5a (build-side `.so` copy to `dist/lib/`, landed TUI 0.19.12). Smoke-confirmed: `GET /api/memory/vector` returns 200.
45
+ 3. **F-PROV-009 closed** — `secretsResolutionSkipped: true` now actually emitted on `GET /api/providers` when `secretsManager` is null, plumbed end-to-end in 0.21.27. Prior 0.21.25 claim of this fix was incomplete.
46
+ - TUI version bumped to 0.19.16.
47
+ - Regenerated `docs/foundation-artifacts/operator-contract.json` — now includes `telemetry.otlp.logs`, `telemetry.otlp.metrics`, `telemetry.otlp.traces` method entries reflecting SDK 0.21.27 OTLP ingest surface.
48
+
49
+ ### Fixed
50
+ - `src/test/daemon/telemetry-routes.test.ts`: added `ingestSink: null` to both `createDaemonTelemetryRouteHandlers` invocations to satisfy the new required-but-nullable `TelemetryRouteContext.ingestSink` field introduced in SDK 0.21.27.
51
+
52
+ ---
53
+
7
54
  ## [0.19.15] - 2026-04-20
8
55
 
9
56
  ### Fixed
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.19.15-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
5
+ [![Version](https://img.shields.io/badge/version-0.19.19-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.21.26"
6
+ "version": "0.21.35"
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.19.15",
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.26",
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.output === 'string' && record.output.trim()) {
81
- const compact = record.output.replace(/\s+/g, ' ').trim();
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.error === 'string' && record.error.trim()) {
85
- return record.error;
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();
@@ -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.15';
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;