@pellux/goodvibes-tui 1.19.0 → 1.19.2
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 +20 -0
- package/README.md +1 -1
- package/docs/README.md +68 -0
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +15 -14
- package/src/runtime/voice-setup-services.ts +28 -80
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,26 @@ All notable changes to GoodVibes TUI.
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [1.19.2] - 2026-07-17
|
|
8
|
+
|
|
9
|
+
### Changes
|
|
10
|
+
|
|
11
|
+
- deps: adopt published SDK 1.11.1 + toolchain 1.11.1 from the registry (1.11.1 ships the toolchain dispatcher bin that fixes consumer release verification)
|
|
12
|
+
- f095f361 deps: adopt published SDK 1.11.0 + toolchain 1.11.0 from the registry
|
|
13
|
+
- f2b67cfd ci: caller jobs must grant the permissions their called reusable workflows request
|
|
14
|
+
- 831a7d97 release: smoke matrix legs carry their own binary per the updated contract
|
|
15
|
+
- 353774ad cicd: pin newline-separated glob inputs in the shape suite + setup train note
|
|
16
|
+
- 683c3398 release: restore the per-release notes override via gh-release notes-file
|
|
17
|
+
- 526d2dae cicd: rewire workflows onto the shared composite + reusable workflows
|
|
18
|
+
- 4ad63923 cicd: swap release/build/gate scripts to thin toolchain invocations
|
|
19
|
+
- 224f9b4b cicd: add toolchain.config.json contract + platform optional-deps sync
|
|
20
|
+
- 1484f09a build: dev-link @pellux/goodvibes-toolchain from SDK 20093d41 tarball
|
|
21
|
+
|
|
22
|
+
## [1.19.1] — 2026-07-16
|
|
23
|
+
|
|
24
|
+
### Changes
|
|
25
|
+
- 7e97ce37 deps: adopt SDK 1.10.1 and consume the exported voice-setup composer
|
|
26
|
+
|
|
7
27
|
## [1.19.0] — 2026-07-16
|
|
8
28
|
|
|
9
29
|
### Changes
|
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/docs/README.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Documentation
|
|
2
|
+
|
|
3
|
+
This directory contains the current product documentation for `goodvibes-tui`.
|
|
4
|
+
|
|
5
|
+
## Guides
|
|
6
|
+
|
|
7
|
+
- [Getting started](getting-started.md)
|
|
8
|
+
Installation, first-run setup, provider configuration, common paths, and basic run/build flows.
|
|
9
|
+
|
|
10
|
+
- [Configuration reference](configuration.md)
|
|
11
|
+
TUI-owned settings namespaces you add by hand to settings.json: checkpoint root guard, the scriptable statusline, session behavior, and launch-time self-update.
|
|
12
|
+
|
|
13
|
+
- [Deployment and services](deployment-and-services.md)
|
|
14
|
+
TUI-only mode, compiled binary behavior, in-process daemon/listener hosting, source-run daemon mode, inbound TLS, outbound trust configuration, and control-plane entrypoints.
|
|
15
|
+
|
|
16
|
+
- [Remote access: a home server setup](remote-access.md)
|
|
17
|
+
Step-by-step continuity setup: daemon on an always-on box, webui from any browser, TUI over SSH, Tailscale for reachability and TLS, validated by `goodvibes doctor`.
|
|
18
|
+
|
|
19
|
+
- [Providers and routing](providers-and-routing.md)
|
|
20
|
+
Native providers, compatible/gateway providers, local discovery, synthetic failover, search providers, voice providers, and media providers.
|
|
21
|
+
|
|
22
|
+
- [Voice and live TTS](voice-and-live-tts.md)
|
|
23
|
+
Live `/tts` playback, TTS provider/voice configuration, local player requirements, and streaming voice API behavior.
|
|
24
|
+
|
|
25
|
+
- [Cloudflare batch and control plane](cloudflare-batch.md)
|
|
26
|
+
Optional Workers/Queues batch setup, bootstrap-token flow, daemon routes, onboarding fields, and `/cloudflare` commands.
|
|
27
|
+
|
|
28
|
+
- [Home Assistant surface](homeassistant-surface.md)
|
|
29
|
+
Home Assistant companion setup, daemon callbacks, webhook security, and onboarding/settings fields.
|
|
30
|
+
|
|
31
|
+
- [Knowledge, artifacts, and multimodal](knowledge-artifacts-and-multimodal.md)
|
|
32
|
+
Session memory, durable memory, structured knowledge, connectors, extractors, embeddings, artifacts, and multimodal analysis.
|
|
33
|
+
|
|
34
|
+
- [Project planning](project-planning.md)
|
|
35
|
+
TUI-owned conversational planning loop, passive SDK planning artifacts, project-scoped knowledge spaces, readiness evaluation, and the Planning panel.
|
|
36
|
+
|
|
37
|
+
- [Channels, remote runtime, and API](channels-remote-and-api.md)
|
|
38
|
+
Omnichannel surfaces, reply routing, remote peers, node-host contracts, and the daemon/control-plane HTTP + streaming surfaces.
|
|
39
|
+
|
|
40
|
+
- [Session durability](session-durability.md)
|
|
41
|
+
Two-layer durability: post-turn snapshots plus periodic recovery files, and the fsync-per-record transcript journal replayed at every resume seam.
|
|
42
|
+
|
|
43
|
+
- [Share command](share-command.md)
|
|
44
|
+
`/share` session export to HTML/JSON/Markdown with redaction, upload, clipboard, and open options.
|
|
45
|
+
|
|
46
|
+
- [CLI flags](cli-flags.md)
|
|
47
|
+
Global flags reference: session lifecycle (`--continue`, `--resume`, `--fork`), confirmation bypass (`-y`/`--non-interactive`), output format consolidation, `--host` alias, and all other startup flags.
|
|
48
|
+
|
|
49
|
+
- [Tools and commands](tools-and-commands.md)
|
|
50
|
+
Built-in tool families, slash-command families, and the operator/workflow surfaces that tie them together.
|
|
51
|
+
|
|
52
|
+
- [QEMU sandbox bootstrapping](qemu-sandbox.md)
|
|
53
|
+
Host prerequisites, generated QEMU setup bundle files, Debian cloud-image bootstrapping, guest runtime installs, validation, and troubleshooting.
|
|
54
|
+
|
|
55
|
+
- [Release and publishing](release-and-publishing.md)
|
|
56
|
+
Release validation, GitHub CD, compiled binary releases, npm distribution, and the GitHub Packages mirror.
|
|
57
|
+
|
|
58
|
+
- [Local verification](verification/local-verification.md)
|
|
59
|
+
Inventory coverage, GoodVibes home audits, compiled CLI probes, authenticated daemon probes, and release-oriented local gates.
|
|
60
|
+
|
|
61
|
+
- [Panel authoring](panel-authoring.md)
|
|
62
|
+
Class hierarchy, canonical example, palette convention, rendering utilities, input handling, performance instrumentation, and contract test registration for contributors building new TUI panels.
|
|
63
|
+
|
|
64
|
+
- [Changelog](../CHANGELOG.md)
|
|
65
|
+
Current release history. Older per-version release-note files remain under `docs/releases/` for historical releases, but `CHANGELOG.md` is the canonical current stream.
|
|
66
|
+
|
|
67
|
+
- [Foundation artifacts](foundation-artifacts/README.md)
|
|
68
|
+
Checked-in operator and peer contract manifests plus canonical knowledge GraphQL and SQL artifacts for release-gate and SDK extraction work.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-tui",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.2",
|
|
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",
|
|
@@ -33,12 +33,12 @@
|
|
|
33
33
|
"build:linux-arm64": "bun build src/main.ts --compile --target=bun-linux-arm64 --outfile dist/goodvibes-linux-arm64",
|
|
34
34
|
"build:macos-x64": "bun build src/main.ts --compile --target=bun-darwin-x64 --outfile dist/goodvibes-macos-x64",
|
|
35
35
|
"build:macos-arm64": "bun build src/main.ts --compile --target=bun-darwin-arm64 --outfile dist/goodvibes-macos-arm64",
|
|
36
|
-
"build:daemon:linux-x64": "
|
|
37
|
-
"build:daemon:linux-arm64": "
|
|
38
|
-
"build:daemon:macos-x64": "
|
|
39
|
-
"build:daemon:macos-arm64": "
|
|
36
|
+
"build:daemon:linux-x64": "goodvibes-build-binaries --target daemon-linux-x64",
|
|
37
|
+
"build:daemon:linux-arm64": "goodvibes-build-binaries --target daemon-linux-arm64",
|
|
38
|
+
"build:daemon:macos-x64": "goodvibes-build-binaries --target daemon-macos-x64",
|
|
39
|
+
"build:daemon:macos-arm64": "goodvibes-build-binaries --target daemon-macos-arm64",
|
|
40
40
|
"smoke:daemon": "bun run scripts/post-build-smoke.ts",
|
|
41
|
-
"smoke:tui": "
|
|
41
|
+
"smoke:tui": "goodvibes-post-build-smoke",
|
|
42
42
|
"build:windows": "bun build src/main.ts --compile --target=bun-windows-x64 --outfile dist/goodvibes-windows.exe",
|
|
43
43
|
"build:all-shell": "bun run build:linux-x64 && bun run build:linux-arm64 && bun run build:macos-x64 && bun run build:macos-arm64 && bun run build:windows",
|
|
44
44
|
"test": "bun run scripts/run-tests.ts",
|
|
@@ -57,8 +57,8 @@
|
|
|
57
57
|
"publish:dry-run:github": "GOODVIBES_PUBLIC_PACKAGE_NAME=@mgd34msu/goodvibes-tui GOODVIBES_PUBLISH_REGISTRY=https://npm.pkg.github.com bun run scripts/publish-package.ts --dry-run",
|
|
58
58
|
"publish:check": "bun run scripts/publish-check.ts",
|
|
59
59
|
"package:install-check": "bun run scripts/package-install-check.ts",
|
|
60
|
-
"build:prod": "
|
|
61
|
-
"build:all": "
|
|
60
|
+
"build:prod": "goodvibes-build-binaries",
|
|
61
|
+
"build:all": "goodvibes-build-binaries --all",
|
|
62
62
|
"perf:check": "bun run scripts/perf-check.ts",
|
|
63
63
|
"perf:baseline": "GOODVIBES_PERF_SAVE_BASELINE=1 bun run scripts/perf-check.ts",
|
|
64
64
|
"architecture:check": "bun run scripts/check-architecture.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.
|
|
108
|
-
"@pellux/goodvibes-terminal-shell": "1.
|
|
107
|
+
"@pellux/goodvibes-sdk": "1.11.1",
|
|
108
|
+
"@pellux/goodvibes-terminal-shell": "1.11.1",
|
|
109
109
|
"bash-language-server": "^5.6.0",
|
|
110
110
|
"fuse.js": "^7.1.0",
|
|
111
111
|
"graphql": "^16.13.2",
|
|
@@ -127,14 +127,15 @@
|
|
|
127
127
|
"zustand": "^5.0.12"
|
|
128
128
|
},
|
|
129
129
|
"devDependencies": {
|
|
130
|
+
"@pellux/goodvibes-toolchain": "1.11.1",
|
|
130
131
|
"@types/bun": "^1.3.10",
|
|
131
132
|
"typescript": "^5.9.3"
|
|
132
133
|
},
|
|
133
134
|
"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.
|
|
135
|
+
"@pellux/goodvibes-tui-linux-x64": "1.19.2",
|
|
136
|
+
"@pellux/goodvibes-tui-linux-arm64": "1.19.2",
|
|
137
|
+
"@pellux/goodvibes-tui-darwin-x64": "1.19.2",
|
|
138
|
+
"@pellux/goodvibes-tui-darwin-arm64": "1.19.2"
|
|
138
139
|
},
|
|
139
140
|
"trustedDependencies": [],
|
|
140
141
|
"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.2';
|
|
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
|