@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
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": "1.19.
|
|
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.
|
|
108
|
-
"@pellux/goodvibes-terminal-shell": "1.10.
|
|
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.
|
|
135
|
-
"@pellux/goodvibes-tui-linux-arm64": "1.19.
|
|
136
|
-
"@pellux/goodvibes-tui-darwin-x64": "1.19.
|
|
137
|
-
"@pellux/goodvibes-tui-darwin-arm64": "1.19.
|
|
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.
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
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
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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.
|
|
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
|