@pellux/goodvibes-tui 1.9.2 → 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.
Files changed (32) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +1 -1
  3. package/docs/foundation-artifacts/knowledge-graphql.graphql +5 -0
  4. package/docs/foundation-artifacts/knowledge-store.sql +33 -0
  5. package/docs/foundation-artifacts/operator-contract.json +4026 -1376
  6. package/package.json +2 -2
  7. package/src/audio/spoken-turn-wiring.ts +7 -2
  8. package/src/cli/management-utils.ts +4 -0
  9. package/src/export/cost-utils.ts +9 -1
  10. package/src/input/command-registry.ts +11 -0
  11. package/src/input/commands/control-room-runtime.ts +12 -5
  12. package/src/input/commands/incident-runtime.ts +2 -2
  13. package/src/input/commands/memory.ts +11 -11
  14. package/src/input/commands/recall-bundle.ts +8 -8
  15. package/src/input/commands/recall-capture.ts +3 -3
  16. package/src/input/commands/recall-query.ts +41 -15
  17. package/src/input/commands/recall-review.ts +10 -10
  18. package/src/input/settings-modal-data.ts +54 -0
  19. package/src/main.ts +3 -2
  20. package/src/panels/builtin/shared.ts +3 -3
  21. package/src/panels/cost-tracker-panel.ts +2 -2
  22. package/src/panels/modals/memory-modal.ts +77 -16
  23. package/src/runtime/bootstrap-command-context.ts +4 -0
  24. package/src/runtime/bootstrap-command-parts.ts +4 -1
  25. package/src/runtime/bootstrap-shell.ts +15 -4
  26. package/src/runtime/bootstrap.ts +18 -18
  27. package/src/runtime/memory-spine-transport.ts +289 -0
  28. package/src/runtime/orchestrator-core-services.ts +27 -2
  29. package/src/runtime/services.ts +13 -14
  30. package/src/version.ts +1 -1
  31. package/src/audio/spoken-turn-controller.ts +0 -271
  32. package/src/audio/text-chunker.ts +0 -110
package/CHANGELOG.md CHANGED
@@ -4,6 +4,26 @@ 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
+
7
27
  ## [1.9.2] — 2026-07-06
8
28
 
9
29
  Patch release fixing text-to-speech playback so spoken responses play start-to-finish without losing audio at either end.
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-1.9.2-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
5
+ [![Version](https://img.shields.io/badge/version-1.10.0-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
 
@@ -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
+ );