@pellux/goodvibes-tui 1.9.1 → 1.10.0
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 +36 -5
- package/README.md +1 -1
- package/docs/foundation-artifacts/knowledge-graphql.graphql +5 -0
- package/docs/foundation-artifacts/knowledge-store.sql +33 -0
- package/docs/foundation-artifacts/operator-contract.json +4026 -1376
- package/package.json +2 -2
- package/src/audio/player.ts +91 -5
- package/src/audio/spoken-turn-wiring.ts +10 -2
- package/src/cli/management-utils.ts +4 -0
- package/src/config/credential-availability.ts +1 -1
- package/src/config/index.ts +1 -1
- package/src/core/turn-cancellation.ts +1 -1
- package/src/daemon/cli.ts +4 -4
- package/src/daemon/service-commands.ts +8 -8
- package/src/export/cost-utils.ts +9 -1
- package/src/input/command-registry.ts +16 -5
- package/src/input/commands/config.ts +1 -1
- package/src/input/commands/control-room-runtime.ts +12 -5
- package/src/input/commands/incident-runtime.ts +2 -2
- package/src/input/commands/memory.ts +12 -12
- package/src/input/commands/planning-runtime.ts +1 -1
- package/src/input/commands/recall-bundle.ts +8 -8
- package/src/input/commands/recall-capture.ts +3 -3
- package/src/input/commands/recall-query.ts +41 -15
- package/src/input/commands/recall-review.ts +12 -12
- package/src/input/commands/session-content.ts +1 -1
- package/src/input/feed-context-factory.ts +1 -1
- package/src/input/handler-content-actions.ts +2 -2
- package/src/input/handler-feed-routes.ts +2 -2
- package/src/input/handler-feed.ts +1 -1
- package/src/input/handler-onboarding-daemon-adopt.ts +3 -3
- package/src/input/handler-picker-routes.ts +2 -2
- package/src/input/handler-shortcuts.ts +1 -1
- package/src/input/model-picker.ts +2 -2
- package/src/input/onboarding/onboarding-wizard-apply.ts +3 -3
- package/src/input/onboarding/onboarding-wizard-network-adopt.ts +3 -3
- package/src/input/onboarding/onboarding-wizard-steps.ts +1 -1
- package/src/input/session-picker-modal.ts +1 -1
- package/src/input/settings-modal-data.ts +56 -2
- package/src/main.ts +8 -6
- package/src/panels/base-panel.ts +1 -1
- package/src/panels/builtin/operations.ts +4 -4
- package/src/panels/builtin/shared.ts +4 -4
- package/src/panels/cost-tracker-panel.ts +2 -2
- package/src/panels/fleet-panel-format.ts +1 -1
- package/src/panels/fleet-panel.ts +15 -15
- package/src/panels/fleet-read-model.ts +11 -11
- package/src/panels/fleet-steer.ts +2 -2
- package/src/panels/fleet-stop.ts +2 -2
- package/src/panels/fleet-tabs.ts +4 -4
- package/src/panels/fleet-transcript.ts +5 -5
- package/src/panels/modals/memory-modal.ts +77 -16
- package/src/panels/types.ts +1 -1
- package/src/renderer/compaction-quality.ts +1 -1
- package/src/renderer/fleet-tab-strip.ts +2 -2
- package/src/renderer/footer-tips.ts +1 -1
- package/src/renderer/model-workspace.ts +1 -1
- package/src/renderer/session-picker-modal.ts +4 -4
- package/src/renderer/shell-surface.ts +1 -1
- package/src/renderer/status-glyphs.ts +3 -3
- package/src/renderer/terminal-bg-probe.ts +1 -1
- package/src/renderer/theme.ts +2 -2
- package/src/renderer/turn-injection.ts +3 -3
- package/src/renderer/ui-factory.ts +7 -7
- package/src/renderer/ui-primitives.ts +3 -3
- package/src/runtime/bootstrap-command-context.ts +4 -0
- package/src/runtime/bootstrap-command-parts.ts +4 -1
- package/src/runtime/bootstrap-core.ts +3 -3
- package/src/runtime/bootstrap-hook-bridge.ts +2 -2
- package/src/runtime/bootstrap-shell.ts +18 -7
- package/src/runtime/bootstrap.ts +22 -22
- package/src/runtime/code-index-services.ts +2 -2
- package/src/runtime/index.ts +11 -3
- package/src/runtime/legacy-daemon-migration.ts +9 -9
- package/src/runtime/memory-fold.ts +1 -1
- package/src/runtime/memory-spine-transport.ts +289 -0
- package/src/runtime/onboarding/snapshot.ts +3 -3
- package/src/runtime/onboarding/types.ts +2 -2
- package/src/runtime/operator-token-cleanup.ts +2 -2
- package/src/runtime/orchestrator-core-services.ts +29 -4
- package/src/runtime/process-lifecycle.ts +19 -5
- package/src/runtime/services.ts +27 -28
- package/src/runtime/session-inbound-inputs.ts +1 -1
- package/src/runtime/session-spine-transport.ts +2 -2
- package/src/runtime/ui-services.ts +1 -1
- package/src/runtime/workstream-services.ts +1 -1
- package/src/runtime/wrfc-persistence.ts +2 -2
- package/src/shell/ui-openers.ts +2 -2
- package/src/version.ts +1 -1
- package/src/audio/spoken-turn-controller.ts +0 -243
- package/src/audio/text-chunker.ts +0 -110
package/CHANGELOG.md
CHANGED
|
@@ -4,15 +4,46 @@ All notable changes to GoodVibes TUI.
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [1.10.0] — 2026-07-06
|
|
8
|
+
|
|
9
|
+
Adopts `@pellux/goodvibes-sdk` 1.3.0. The through-line is the shared engines the SDK now owns: the terminal no longer keeps its own copy of the text-to-speech pipeline or its own path to the memory store — it consumes the one the SDK ships, so the terminal, the desktop app, and the agent all speak the same way, resolve the same voice, and reach memory the same way. Ships against `@pellux/goodvibes-sdk` 1.3.0.
|
|
10
|
+
|
|
11
|
+
### Shared text-to-speech engine, now sourced from the SDK
|
|
12
|
+
- The TUI's local spoken-turn controller and sentence chunker were replaced by the SDK's shared voice engine (sentence chunking, request merging with bounded concurrency, retry-with-honest-skip, and drain-vs-interrupt semantics). Behavior is unchanged from what shipped in 1.9.2, but the pipeline is now the single copy shared with the agent and a future browser build rather than a hand-maintained terminal fork. The existing mpv/ffplay subprocess player stays exactly as it was, now plugged in as the engine's audio sink.
|
|
13
|
+
|
|
14
|
+
### Voice-provider request handling
|
|
15
|
+
- Spoken output no longer bursts past the voice provider's concurrent-request allowance. A streaming answer used to fire one synthesis request per sentence, all at once, so a simple multi-sentence reply could hit `HTTP 429 concurrent_limit_exceeded` and lose spoken playback for the whole turn. Requests now queue and merge into a single request whenever a pipeline slot is free (bounded at two: the one playing plus one prefetch, merged text capped at 1,500 characters split on a word boundary), and a transient 429 / rate-limit / 5xx / network drop backs off and retries on an abortable timer instead of killing the turn. Time-to-first-audio is unchanged — the first safe boundary still flushes early.
|
|
16
|
+
|
|
17
|
+
### Memory over the daemon spine, with honest degrade
|
|
18
|
+
- When the TUI adopts an external daemon, memory now reads and writes over the daemon's memory spine instead of opening the local store file, so it can no longer read a divergent local copy. The Memory modal, `/recall`'s browse/link/queue/export/import, and the per-turn passive knowledge injection all route through the spine's wire transport when a compatible daemon is adopted, and revert to local access honestly when the daemon is lost or runs embedded in-process.
|
|
19
|
+
- A newer TUI against an older daemon that does not serve an extended memory operation now says so plainly. The wire transport disambiguates the two kinds of 404 by response code: a record-missing 404 carries `MEMORY_RECORD_NOT_FOUND` and folds to "not found," while a route-not-found 404 from an older daemon (or a bare legacy 404 with no code) is treated as "this daemon does not serve this operation" and surfaces a stated reason through `/recall`'s existing degraded-path message — never a silent "record gone." The TUI now imports the SDK's canonical classifier for this rather than carrying its own inlined copy.
|
|
20
|
+
|
|
21
|
+
### One voice across every surface
|
|
22
|
+
- The text-to-speech voice settings (`tts.*`) resolve through the SDK's shared, surface-independent config tier, so a voice chosen in the terminal, the desktop app, or the agent is the voice every surface uses. A surface that has never set a shared voice keeps its local setting, so existing setups are unchanged; a shared value simply wins once one is set.
|
|
23
|
+
|
|
24
|
+
### Budget alert visible in /config
|
|
25
|
+
- The session cost-budget threshold (`behavior.budgetAlertUsd`, set via the Cost panel's `b` key or `/cost budget <usd>`) is now a visible entry in `/config`'s Behavior settings, next to the existing `notifyOnBudgetBreach` gate. The value always persisted correctly on disk; it simply had no honest way to be inspected because it was never registered in the schema-driven settings surface. It now shows the real current threshold, following the same synthetic-entry pattern already used for `behavior.notifyAfterSeconds` and `tts.speed`.
|
|
26
|
+
|
|
27
|
+
## [1.9.2] — 2026-07-06
|
|
28
|
+
|
|
29
|
+
Patch release fixing text-to-speech playback so spoken responses play start-to-finish without losing audio at either end.
|
|
30
|
+
|
|
31
|
+
### Text-to-speech playback fixes
|
|
32
|
+
- The beginning of spoken output is no longer clipped: playback now waits for the audio player to actually be ready before sending it audio, and the player's read-ahead buffering was restored so the opening of a response survives normal startup delay.
|
|
33
|
+
- The end of spoken output is no longer cut off: audio now drains fully once a response finishes speaking naturally. When you quit while audio is still playing, the final bit of audio gets a bounded two-second window to finish before shutdown continues. Deliberate interrupts (stopping speech, starting a new response, Ctrl+C) still cut instantly as before. A spurious error message that could appear when stopping playback has also been removed.
|
|
34
|
+
|
|
35
|
+
### Other
|
|
36
|
+
- Documentation and code comments were cleaned up for clarity; no behavior changes.
|
|
37
|
+
|
|
7
38
|
## [1.9.1] — 2026-07-06
|
|
8
39
|
|
|
9
|
-
Follow-up patch that completes the
|
|
40
|
+
Follow-up patch that completes the client-side credential-status adoption for the TUI. The 1.9.0 release pinned SDK 1.0.0 and unified memory but left the client-side credential-status read for a follow-up; this release lands it. Ships against @pellux/goodvibes-sdk 1.0.0.
|
|
10
41
|
|
|
11
|
-
### Credential-status read as a daemon client
|
|
42
|
+
### Credential-status read as a daemon client
|
|
12
43
|
- When the TUI acts as a client of an adopted external daemon (`HostServiceStatus` mode `external`), provider/model/secret STATUS is read from that daemon's `credentials.get` wire method instead of the TUI's own surfaceRoot store. The read carries only status metadata (key / configured / usable / source / secure) — never a secret value, mirroring the SDK's status-only wire contract. The env-only API-key posture and all secret value-reads that provider auth needs stay local and are untouched; only STATUS reads use the daemon path.
|
|
13
44
|
- Honest degraded state, mirroring goodvibes-webui v1.0.1 `deriveCredentialAvailability` exactly: a 503 `CREDENTIAL_STORE_UNAVAILABLE` (matched by machine code), a `METHOD_NOT_FOUND` from an older daemon, or any transport failure resolves to a reason-carrying `available: false` — never a fabricated "configured", never a stale confident value. The TUI-hosted daemon continues to serve `credentials.get` automatically from its existing secrets manager (SDK auto-wiring), so no serve-side change was needed.
|
|
14
45
|
|
|
15
|
-
### Memory unification follow-up
|
|
46
|
+
### Memory unification follow-up
|
|
16
47
|
- The legacy per-project TUI memory store now actually folds into the home-scoped canonical store once at boot, after the canonical store initializes — making good on the behavior 1.9.0 described. The fold is id-keyed and idempotent (a re-run imports nothing new and never deletes the legacy file) and is strictly non-fatal: a fold error degrades to a warning and the canonical store serves on. The home-scoped store deliberately does not re-root with the working directory; only the code index and project index do.
|
|
17
48
|
|
|
18
49
|
## [1.7.0] — 2026-07-04
|
|
@@ -77,7 +108,7 @@ The evolution release: six batched development cycles (internal 1.2.0–1.6.0, w
|
|
|
77
108
|
|
|
78
109
|
## [1.1.0] — 2026-07-03
|
|
79
110
|
|
|
80
|
-
|
|
111
|
+
The first cycle of the post-1.0 evolution effort: trust repairs. Every change closes a defect found by live dogfooding v1.0.0 where the product reported something other than the truth. Ships against @pellux/goodvibes-sdk 0.36.0 (same effort, SDK side).
|
|
81
112
|
|
|
82
113
|
### Fixed
|
|
83
114
|
- Failing commands are visible again: the SDK masked every command-level failure as "Error: Unknown error", so a red test suite was literally invisible to the model — it would honestly conclude "no failure observed" while your tests were failing. Exit code, stdout, and stderr now reach the model byte-faithfully, and long-output truncation keeps the tail (where test runners print failures) instead of the head. Verified live: the model reads a sabotaged test's actual assertion diff and fixes the right side.
|
|
@@ -101,7 +132,7 @@ Wave 0 of the post-1.0 evolution effort: trust repairs. Every change closes a de
|
|
|
101
132
|
### Internal
|
|
102
133
|
- SDK dependency 0.35.0 → 0.36.0; foundation artifacts regenerated (new event contract entries).
|
|
103
134
|
- Local-SDK overlay dev tooling (`scripts/sdk-dev.ts link|status|restore`) with release-blocking gates in release.ts and publish-check so a local SDK can never ship.
|
|
104
|
-
-
|
|
135
|
+
- Verified three ways: full gate block, a 3-lens adversarial code review, and a live tmux scenario replay of the five previously-failing dogfood scenarios (all PASS).
|
|
105
136
|
|
|
106
137
|
## [1.0.0] — 2026-07-03
|
|
107
138
|
|
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
|
|
|
@@ -206,6 +206,11 @@ type KnowledgePacket {
|
|
|
206
206
|
strategy: String!
|
|
207
207
|
budgetLimit: Int!
|
|
208
208
|
estimatedTokens: Int!
|
|
209
|
+
truncated: Boolean!
|
|
210
|
+
totalCandidates: Int!
|
|
211
|
+
droppedCount: Int!
|
|
212
|
+
droppedForBudget: Int!
|
|
213
|
+
budgetExhausted: Boolean!
|
|
209
214
|
items: [KnowledgePacketItem!]!
|
|
210
215
|
}
|
|
211
216
|
|
|
@@ -208,3 +208,36 @@ CREATE TABLE IF NOT EXISTS knowledge_schedules (
|
|
|
208
208
|
);
|
|
209
209
|
|
|
210
210
|
CREATE INDEX IF NOT EXISTS idx_knowledge_schedules_job_id ON knowledge_schedules(job_id);
|
|
211
|
+
|
|
212
|
+
CREATE TABLE IF NOT EXISTS knowledge_node_revisions (
|
|
213
|
+
id TEXT PRIMARY KEY,
|
|
214
|
+
node_id TEXT NOT NULL,
|
|
215
|
+
revision INTEGER NOT NULL,
|
|
216
|
+
change_kind TEXT NOT NULL,
|
|
217
|
+
changed_fields TEXT NOT NULL DEFAULT '[]',
|
|
218
|
+
kind TEXT NOT NULL,
|
|
219
|
+
slug TEXT NOT NULL,
|
|
220
|
+
title TEXT NOT NULL,
|
|
221
|
+
summary TEXT,
|
|
222
|
+
aliases TEXT NOT NULL DEFAULT '[]',
|
|
223
|
+
status TEXT NOT NULL,
|
|
224
|
+
confidence INTEGER NOT NULL,
|
|
225
|
+
source_id TEXT,
|
|
226
|
+
metadata TEXT NOT NULL DEFAULT '{}',
|
|
227
|
+
node_created_at INTEGER NOT NULL,
|
|
228
|
+
node_updated_at INTEGER NOT NULL,
|
|
229
|
+
recorded_at INTEGER NOT NULL
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_knowledge_node_revisions_unique ON knowledge_node_revisions(node_id, revision);
|
|
233
|
+
|
|
234
|
+
CREATE INDEX IF NOT EXISTS idx_knowledge_node_revisions_node ON knowledge_node_revisions(node_id);
|
|
235
|
+
|
|
236
|
+
CREATE TABLE IF NOT EXISTS knowledge_semantic_enrichment_state (
|
|
237
|
+
source_id TEXT PRIMARY KEY,
|
|
238
|
+
text_hash TEXT,
|
|
239
|
+
enriched_at INTEGER,
|
|
240
|
+
metadata TEXT NOT NULL DEFAULT '{}',
|
|
241
|
+
created_at INTEGER NOT NULL,
|
|
242
|
+
updated_at INTEGER NOT NULL
|
|
243
|
+
);
|