@pellux/goodvibes-tui 1.19.0 → 1.19.1

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,11 @@ All notable changes to GoodVibes TUI.
4
4
 
5
5
  ---
6
6
 
7
+ ## [1.19.1] — 2026-07-16
8
+
9
+ ### Changes
10
+ - 7e97ce37 deps: adopt SDK 1.10.1 and consume the exported voice-setup composer
11
+
7
12
  ## [1.19.0] — 2026-07-16
8
13
 
9
14
  ### Changes
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.19.0-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
5
+ [![Version](https://img.shields.io/badge/version-1.19.1-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": "1.10.0"
6
+ "version": "1.10.1"
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": "1.19.0",
3
+ "version": "1.19.1",
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",
@@ -104,8 +104,8 @@
104
104
  "@anthropic-ai/vertex-sdk": "^0.16.0",
105
105
  "@ast-grep/napi": "^0.42.0",
106
106
  "@aws/bedrock-token-generator": "^1.1.0",
107
- "@pellux/goodvibes-sdk": "1.10.0",
108
- "@pellux/goodvibes-terminal-shell": "1.10.0",
107
+ "@pellux/goodvibes-sdk": "1.10.1",
108
+ "@pellux/goodvibes-terminal-shell": "1.10.1",
109
109
  "bash-language-server": "^5.6.0",
110
110
  "fuse.js": "^7.1.0",
111
111
  "graphql": "^16.13.2",
@@ -131,10 +131,10 @@
131
131
  "typescript": "^5.9.3"
132
132
  },
133
133
  "optionalDependencies": {
134
- "@pellux/goodvibes-tui-linux-x64": "1.19.0",
135
- "@pellux/goodvibes-tui-linux-arm64": "1.19.0",
136
- "@pellux/goodvibes-tui-darwin-x64": "1.19.0",
137
- "@pellux/goodvibes-tui-darwin-arm64": "1.19.0"
134
+ "@pellux/goodvibes-tui-linux-x64": "1.19.1",
135
+ "@pellux/goodvibes-tui-linux-arm64": "1.19.1",
136
+ "@pellux/goodvibes-tui-darwin-x64": "1.19.1",
137
+ "@pellux/goodvibes-tui-darwin-arm64": "1.19.1"
138
138
  },
139
139
  "trustedDependencies": [],
140
140
  "overrides": {
@@ -1,32 +1,33 @@
1
1
  // ---------------------------------------------------------------------------
2
2
  // voice-setup-services.ts — managed local-voice provisioning composition (TUI wiring)
3
3
  //
4
- // Backs the daemon's voice.local.status / voice.local.install verbs. Extracted
5
- // into its own module rather than built inline in services.ts, which sits at
6
- // the architecture check's 800-line cap (scripts/check-architecture.ts) — new
7
- // service construction gets its own module and a single wiring call there.
4
+ // Backs the daemon's voice.local.status / voice.local.install verbs. The
5
+ // provisioning policy — a single-flight one-act install that provisions the
6
+ // piper engine + a default voice (and whisper STT where a bundle is published),
7
+ // live install-progress folded onto status(), ownership-aware preconfigure of
8
+ // the voice.local.* keys (values THIS installer previously wrote update to the
9
+ // new managed paths; genuinely user-set values still win; a user-cleared
10
+ // installer value stays cleared), a no-network status() read, and critical-tier
11
+ // admission gating — lives in the SDK's createVoiceSetupService. Earlier the
12
+ // composer was not exported, so the TUI rebuilt it from the voice primitives;
13
+ // SDK 1.10.1 exports it through ./platform/runtime/voice-setup, so this module
14
+ // is now a thin adapter that maps the TUI's injected seams (configManager,
15
+ // shellPaths, voiceProviders) onto the SDK service's flat deps.
8
16
  //
9
- // Mirrors the SDK's own createRuntimeServices voiceSetup: a single-flight
10
- // one-act install that provisions the piper engine + a default voice (and
11
- // whisper STT where a bundle is published) and pre-configures the voice.local.*
12
- // keys with ownership awareness (values THIS installer previously wrote update
13
- // to the new managed paths; genuinely user-set values still win; a user-cleared
14
- // installer value stays cleared). status() is a no-network read.
17
+ // Extracted into its own module rather than built inline in services.ts, which
18
+ // sits at the architecture check's 800-line cap (scripts/check-architecture.ts)
19
+ // — new service construction gets its own module and a single wiring call there.
15
20
  // ---------------------------------------------------------------------------
16
21
 
17
22
  import {
18
- createVoiceInstallProgressTracker,
19
- localVoiceRuntimeStatus,
20
- preconfigureLocalVoiceKeys,
21
- provisionLocalVoiceRuntime,
22
- readVoiceInstallStamp,
23
- writeVoiceInstallStamp,
24
- type VoiceProviderRegistry,
25
- } from '@pellux/goodvibes-sdk/platform/voice';
26
- import { singleFlight } from '@pellux/goodvibes-sdk/platform/utils';
23
+ createVoiceSetupService,
24
+ type VoiceSetupService,
25
+ } from '@pellux/goodvibes-sdk/platform/runtime/voice-setup';
26
+ import type { VoiceProviderRegistry } from '@pellux/goodvibes-sdk/platform/voice';
27
27
  import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
28
28
  import type { ShellPathService } from '@/runtime/index.ts';
29
- import type { VoiceLocalInstallResult } from '../core/voice-provision-status.ts';
29
+
30
+ export type { VoiceSetupService };
30
31
 
31
32
  export interface VoiceSetupServicesDeps {
32
33
  readonly configManager: ConfigManager;
@@ -36,69 +37,16 @@ export interface VoiceSetupServicesDeps {
36
37
  readonly admitExpensiveWork: (label: string) => { allowed: boolean; reason?: string | undefined };
37
38
  }
38
39
 
39
- /** The narrow provisioning slice the voice.local.* gateway verbs consume. */
40
- export interface VoiceSetupService {
41
- status(): unknown;
42
- install(): Promise<VoiceLocalInstallResult>;
43
- }
44
-
45
40
  /** Compose the managed-voice single-flight install + no-network status read. */
46
41
  export function wireVoiceSetup(deps: VoiceSetupServicesDeps): { voiceSetup: VoiceSetupService } {
47
42
  const { configManager, voiceProviders } = deps;
48
- const managedVoiceRoot = deps.shellPaths.resolveUserPath('voice');
49
- // Live install progress: the install verb is plain request/response, so during
50
- // a multi-hundred-MB provision a surface would otherwise only see busy→receipt.
51
- // The tracker folds the provisioner's onProgress stream into a poll-able
52
- // snapshot that status() carries as `installInProgress` WHILE (and only while)
53
- // an install runs — surfaces poll status during install (mirrors the SDK).
54
- const progress = createVoiceInstallProgressTracker();
55
- // Single-flight: concurrent installs join the in-progress promise instead of
56
- // starting parallel multi-hundred-MB downloads.
57
- const runVoiceInstall = singleFlight(async () => {
58
- progress.begin();
59
- try {
60
- const provision = await provisionLocalVoiceRuntime({ managedRoot: managedVoiceRoot, onProgress: (p) => progress.onProgress(p) });
61
- let configured: { set: { key: string; value: string }[]; skipped: { key: string; reason: string }[] } = { set: [], skipped: [] };
62
- if (provision.tts.state === 'provisioned' && provision.tts.binaryPath && provision.tts.modelPath) {
63
- const stamp = readVoiceInstallStamp(managedVoiceRoot);
64
- const receipt = preconfigureLocalVoiceKeys({
65
- getConfig: (k) => String(configManager.get(k as Parameters<typeof configManager.get>[0]) ?? ''),
66
- setConfig: (k, v) => configManager.setDynamic(k as Parameters<typeof configManager.setDynamic>[0], v),
67
- ttsEngine: provision.tts.engine,
68
- ttsBinary: provision.tts.binaryPath,
69
- ttsModelPath: provision.tts.modelPath,
70
- ...(provision.stt.state === 'provisioned' && provision.stt.binaryPath && provision.stt.modelPath
71
- ? { sttEngine: provision.stt.engine, sttBinary: provision.stt.binaryPath, sttModelPath: provision.stt.modelPath }
72
- : {}),
73
- priorInstallWrites: stamp?.configWrites,
74
- });
75
- configured = { set: [...receipt.set], skipped: [...receipt.skipped] };
76
- if (stamp) {
77
- writeVoiceInstallStamp(managedVoiceRoot, { ...stamp, configWrites: { ...stamp.configWrites, ...receipt.installWrites } });
78
- }
79
- // A successful (re-)install clears any tripped local-engine breaker.
80
- voiceProviders.get('local')?.resetEngineFailureState?.();
81
- }
82
- return { provisioned: provision.tts.state === 'provisioned', platform: provision.platform, tts: provision.tts, stt: provision.stt, components: provision.components, configured };
83
- } finally {
84
- progress.end();
85
- }
43
+ const voiceSetup = createVoiceSetupService({
44
+ managedVoiceRoot: deps.shellPaths.resolveUserPath('voice'),
45
+ getConfig: (key) => String(configManager.get(key as Parameters<typeof configManager.get>[0]) ?? ''),
46
+ setConfig: (key, value) => configManager.setDynamic(key as Parameters<typeof configManager.setDynamic>[0], value),
47
+ // A successful (re-)install clears any tripped local-engine breaker.
48
+ resetLocalEngineFailureState: () => voiceProviders.get('local')?.resetEngineFailureState?.(),
49
+ admitExpensiveWork: deps.admitExpensiveWork,
86
50
  });
87
- const voiceSetup: VoiceSetupService = {
88
- status: () => {
89
- const base = localVoiceRuntimeStatus({ managedRoot: managedVoiceRoot });
90
- const snapshot = progress.snapshot();
91
- // Carry live per-component progress ONLY while an install is active.
92
- return snapshot ? { ...base, installInProgress: snapshot } : base;
93
- },
94
- install: async () => {
95
- // Critical-tier admission: refuse honestly instead of piling onto pressure.
96
- const admission = deps.admitExpensiveWork('voice runtime install');
97
- if (!admission.allowed) {
98
- throw new Error(admission.reason ?? 'voice runtime install refused: daemon is under critical memory pressure.');
99
- }
100
- return runVoiceInstall();
101
- },
102
- };
103
51
  return { voiceSetup };
104
52
  }
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 = '1.19.0';
9
+ let _version = '1.19.1';
10
10
  try {
11
11
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8'));
12
12
  // Only trust a version read from OUR OWN package.json. A Bun single-file