@daniel156161/prism 0.2.98 → 0.2.100

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.
@@ -4,6 +4,7 @@ import { isVersionRequest, resolvePiCliPath, stripPiNativeFlag } from "./pi-env.
4
4
  import { rainbowPrismVersion } from "./pi-branding.js";
5
5
  import { createPiEnv } from "./pi-package.js";
6
6
  import { prismBuiltinExtensionArgs } from "./pi-extensions.js";
7
+ import { isPiPackageOrConfigCommand } from "./pi-package-command.js";
7
8
  import { extractPrismAuthProfileArg } from "./prism-auth.js";
8
9
  export async function runPiNative(args, cwd = process.cwd()) {
9
10
  const authProfileArg = extractPrismAuthProfileArg(args);
@@ -17,7 +18,7 @@ export async function runPiNative(args, cwd = process.cwd()) {
17
18
  importAllSessionsToDb(env.PRISM_CODING_AGENT_DIR);
18
19
  }
19
20
  const cli = resolvePiCliPath(cwd, env);
20
- const extensionArgs = prismBuiltinExtensionArgs(piArgs, env);
21
+ const extensionArgs = isPiPackageOrConfigCommand(piArgs) ? [] : prismBuiltinExtensionArgs(piArgs, env);
21
22
  await new Promise((resolve, reject) => {
22
23
  const child = spawn(process.execPath, [cli, ...extensionArgs, ...piArgs], {
23
24
  cwd,
@@ -1 +1 @@
1
- {"version":3,"file":"pi-native.js","sourceRoot":"","sources":["../../src/pi/pi-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAE5D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACnE,MAAM,cAAc,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAA;IACvD,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;IACrD,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,mBAAmB,EAAE,IAAI,CAAC,CAAA;QAClD,OAAM;IACR,CAAC;IAED,MAAM,GAAG,GAAG,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,kBAAkB,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACnI,IAAI,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QACxF,qBAAqB,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;IACnD,CAAC;IACD,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACtC,MAAM,aAAa,GAAG,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAE5D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,CAAC,EAAE;YACxE,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,GAAG;SACJ,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACzB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAChC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;gBACjC,OAAM;YACR,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAA;YAC5B,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"pi-native.js","sourceRoot":"","sources":["../../src/pi/pi-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAE5D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACnE,MAAM,cAAc,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAA;IACvD,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;IACrD,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,mBAAmB,EAAE,IAAI,CAAC,CAAA;QAClD,OAAM;IACR,CAAC;IAED,MAAM,GAAG,GAAG,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,kBAAkB,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACnI,IAAI,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QACxF,qBAAqB,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;IACnD,CAAC;IACD,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACtC,MAAM,aAAa,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAEtG,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,CAAC,EAAE;YACxE,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,GAAG;SACJ,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACzB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAChC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;gBACjC,OAAM;YACR,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAA;YAC5B,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function isPiPackageOrConfigCommand(args: readonly string[]): boolean;
@@ -0,0 +1,6 @@
1
+ const PI_PACKAGE_COMMANDS = new Set(["install", "remove", "uninstall", "update", "list", "config"]);
2
+ export function isPiPackageOrConfigCommand(args) {
3
+ const command = args[0];
4
+ return command !== undefined && PI_PACKAGE_COMMANDS.has(command);
5
+ }
6
+ //# sourceMappingURL=pi-package-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-package-command.js","sourceRoot":"","sources":["../../src/pi/pi-package-command.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;AAEnG,MAAM,UAAU,0BAA0B,CAAC,IAAuB;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACvB,OAAO,OAAO,KAAK,SAAS,IAAI,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AAClE,CAAC"}
@@ -679,7 +679,7 @@ export class InteractiveMode {
679
679
  await this.themeController.applyFromSettings();
680
680
  // Add header with keybindings from config (unless silenced)
681
681
  if (this.options.verbose || !this.settingsManager.getQuietStartup()) {
682
- const logo = "▲ \u001b[38;5;196mp\u001b[38;5;202mr\u001b[38;5;226mi\u001b[38;5;46ms\u001b[38;5;51mm\u001b[0m v0.2.98";
682
+ const logo = "▲ \u001b[38;5;196mp\u001b[38;5;202mr\u001b[38;5;226mi\u001b[38;5;46ms\u001b[38;5;51mm\u001b[0m v0.2.100";
683
683
  // Build startup instructions using keybinding hint helpers
684
684
  const hint = (keybinding, description) => keyHint(keybinding, description);
685
685
  const expandedInstructions = [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daniel156161/prism",
3
- "version": "0.2.98",
3
+ "version": "0.2.100",
4
4
  "description": "Prism-branded wrapper around pi that stores config in ~/.prism",
5
5
  "license": "MIT",
6
6
  "author": "Daniel Dolezal",
@@ -37,11 +37,11 @@
37
37
  "dependencies": {
38
38
  "@earendil-works/pi-ai": "^0.84.2",
39
39
  "@earendil-works/pi-coding-agent": "^0.84.2",
40
- "@juicesharp/rpiv-todo": "^2.6.2",
41
- "@juicesharp/rpiv-voice": "^2.6.2",
42
- "@juicesharp/rpiv-i18n": "^2.6.2",
43
- "pi-mcp-adapter": "^2.26.1",
44
- "typebox": "^1.3.15"
40
+ "@juicesharp/rpiv-i18n": "^2.7.0",
41
+ "@juicesharp/rpiv-todo": "^2.7.0",
42
+ "@juicesharp/rpiv-voice": "^2.7.0",
43
+ "pi-mcp-adapter": "^2.27.0",
44
+ "typebox": "^1.3.16"
45
45
  },
46
46
  "bundledDependencies": [
47
47
  "@earendil-works/pi-coding-agent"
@@ -1,3 +0,0 @@
1
- type ExtensionAPI = any;
2
- export default function voiceCommandExtension(pi: ExtensionAPI): void;
3
- export {};
@@ -1,44 +0,0 @@
1
- import { LocalVoiceRuntime, parseVoiceMode, voiceStatus } from "../core/voice-runtime.js";
2
- export default function voiceCommandExtension(pi) {
3
- let runtime;
4
- let mode = "off";
5
- function ensureRuntime(ctx) {
6
- runtime ??= new LocalVoiceRuntime({
7
- sendUserMessage: (message) => pi.sendUserMessage(message),
8
- notify: (message, level) => ctx?.ui?.notify?.(message, level),
9
- setStatus: (value) => ctx?.ui?.setStatus?.("voice", value),
10
- });
11
- return runtime;
12
- }
13
- pi.registerCommand("voice", {
14
- description: "Local voice mode: /voice on | output | input | off",
15
- handler: async (args, ctx) => {
16
- const next = parseVoiceMode(args);
17
- if (!next) {
18
- ctx.ui.notify(`Voice mode: ${mode}. Use /voice on, /voice output, /voice input, or /voice off.`, "info");
19
- return;
20
- }
21
- mode = next;
22
- const voice = ensureRuntime(ctx);
23
- voice.setMode(mode);
24
- ctx.ui.setStatus("voice", voiceStatus(mode));
25
- if (mode === "output" || mode === "on") {
26
- const ok = await voice.ensureVoicebox();
27
- if (voice.isVoiceboxEnabled() && !ok) {
28
- ctx.ui.notify("Voicebox is not reachable and could not be started. Check voicebox settings/PRISM_VOICEBOX_URL.", "warning");
29
- }
30
- }
31
- ctx.ui.notify(mode === "off" ? "Voice off" : `Voice ${mode}`, "info");
32
- },
33
- });
34
- pi.on("session_start", (_event, ctx) => {
35
- if (mode !== "off")
36
- ensureRuntime(ctx).setMode(mode);
37
- });
38
- pi.on("message_end", async (event, ctx) => {
39
- if (mode === "on" || mode === "output")
40
- await ensureRuntime(ctx).speakAssistantMessage(event.message);
41
- });
42
- pi.on?.("session_shutdown", () => runtime?.shutdown());
43
- }
44
- //# sourceMappingURL=voice-command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"voice-command.js","sourceRoot":"","sources":["../../../src/prism-extensions/commands/voice-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAkB,MAAM,0BAA0B,CAAA;AAIzG,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,EAAgB;IAC5D,IAAI,OAAsC,CAAA;IAC1C,IAAI,IAAI,GAAc,KAAK,CAAA;IAE3B,SAAS,aAAa,CAAC,GAAQ;QAC7B,OAAO,KAAK,IAAI,iBAAiB,CAAC;YAChC,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC;YACzD,MAAM,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;YAC7D,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;SAC3D,CAAC,CAAA;QACF,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE;QAC1B,WAAW,EAAE,oDAAoD;QACjE,OAAO,EAAE,KAAK,EAAE,IAAY,EAAE,GAAQ,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;YACjC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,IAAI,8DAA8D,EAAE,MAAM,CAAC,CAAA;gBACxG,OAAM;YACR,CAAC;YACD,IAAI,GAAG,IAAI,CAAA;YACX,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;YAChC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACnB,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;YAC5C,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvC,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE,CAAA;gBACvC,IAAI,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;oBACrC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iGAAiG,EAAE,SAAS,CAAC,CAAA;gBAC7H,CAAC;YACH,CAAC;YACD,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,MAAM,CAAC,CAAA;QACvE,CAAC;KACF,CAAC,CAAA;IAEF,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,MAAW,EAAE,GAAQ,EAAE,EAAE;QAC/C,IAAI,IAAI,KAAK,KAAK;YAAE,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,KAAU,EAAE,GAAQ,EAAE,EAAE;QAClD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ;YAAE,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACvG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;AACxD,CAAC"}
@@ -1,57 +0,0 @@
1
- import { spawn, spawnSync } from "node:child_process";
2
- export type VoiceMode = "off" | "on" | "input" | "output";
3
- export interface VoiceConfig {
4
- wakeWord: string;
5
- sttCommand?: string;
6
- whisperModel?: string;
7
- ttsCommand?: string;
8
- piperModel?: string;
9
- audioPlayer?: string;
10
- loopCooldownMs: number;
11
- }
12
- export interface VoiceRuntimeOptions {
13
- env?: NodeJS.ProcessEnv;
14
- sendUserMessage: (message: string) => void | Promise<void>;
15
- notify?: (message: string, level?: string) => void;
16
- setStatus?: (value: string | undefined) => void;
17
- spawnProcess?: typeof spawn;
18
- spawnSyncProcess?: typeof spawnSync;
19
- }
20
- export declare function parseVoiceMode(input: string): VoiceMode | undefined;
21
- export declare function voiceStatus(mode: VoiceMode): string | undefined;
22
- export declare function resolveVoiceConfig(env?: NodeJS.ProcessEnv): VoiceConfig;
23
- export declare function stripWakeWord(transcript: string, wakeWord: string): string | undefined;
24
- export declare function normalizeVoiceText(text: string): string;
25
- export declare function shouldIgnoreTranscript(transcript: string, state: {
26
- isSpeaking: boolean;
27
- lastSpokenText?: string;
28
- lastSpokenAt?: number;
29
- }, now?: number, cooldownMs?: number): boolean;
30
- export declare function messageToSpeechText(message: any, maxChars?: number): string;
31
- export declare class LocalVoiceRuntime {
32
- private readonly options;
33
- private mode;
34
- private sttProcess?;
35
- private isSpeaking;
36
- private lastSpokenText;
37
- private lastSpokenAt;
38
- private readonly env;
39
- private readonly spawnProcess;
40
- private readonly spawnSyncProcess;
41
- constructor(options: VoiceRuntimeOptions);
42
- getMode(): VoiceMode;
43
- setMode(mode: VoiceMode): void;
44
- shutdown(): void;
45
- speakAssistantMessage(message: any): Promise<void>;
46
- isVoiceboxEnabled(): boolean;
47
- checkVoicebox(): Promise<boolean>;
48
- ensureVoicebox(): Promise<boolean>;
49
- stopVoicebox(): Promise<boolean>;
50
- handleTranscript(rawTranscript: string): void;
51
- private startInput;
52
- private stopInput;
53
- private speak;
54
- private streamVoiceboxToPlayer;
55
- private runShell;
56
- private runCommand;
57
- }
@@ -1,313 +0,0 @@
1
- import * as fs from "node:fs";
2
- import * as os from "node:os";
3
- import * as path from "node:path";
4
- import { spawn, spawnSync } from "node:child_process";
5
- import { readSettings } from "./shared-config.js";
6
- import { ensureVoiceboxServiceRunning, stopVoiceboxService } from "./voicebox-service.js";
7
- import { isVoiceboxBackend, resolveVoiceboxConfig, streamSpeechWithVoicebox } from "./voicebox-client.js";
8
- export function parseVoiceMode(input) {
9
- const value = String(input || "").trim().toLowerCase();
10
- if (!value || value === "status")
11
- return undefined;
12
- if (["on", "full", "both", "all"].includes(value))
13
- return "on";
14
- if (["off", "disable", "disabled", "stop"].includes(value))
15
- return "off";
16
- if (["input", "in", "listen", "mic"].includes(value))
17
- return "input";
18
- if (["output", "out", "speak", "tts"].includes(value))
19
- return "output";
20
- return undefined;
21
- }
22
- export function voiceStatus(mode) {
23
- if (mode === "off")
24
- return undefined;
25
- if (mode === "on")
26
- return "🎙 voice:in+out";
27
- return mode === "input" ? "🎙 voice:in" : "🔊 voice:out";
28
- }
29
- function nonEmpty(value) {
30
- return typeof value === "string" && value.trim() ? value.trim() : undefined;
31
- }
32
- export function resolveVoiceConfig(env = process.env) {
33
- const settings = readSettings(undefined, env)?.voice ?? {};
34
- return {
35
- wakeWord: nonEmpty(env.PRISM_VOICE_WAKE_WORD) ?? nonEmpty(settings.wakeWord) ?? "prism",
36
- sttCommand: nonEmpty(env.PRISM_VOICE_STT_COMMAND) ?? nonEmpty(settings.sttCommand),
37
- whisperModel: nonEmpty(env.PRISM_VOICE_WHISPER_MODEL) ?? nonEmpty(settings.whisperModel),
38
- ttsCommand: nonEmpty(env.PRISM_VOICE_TTS_COMMAND) ?? nonEmpty(settings.ttsCommand),
39
- piperModel: nonEmpty(env.PRISM_VOICE_PIPER_MODEL) ?? nonEmpty(settings.piperModel),
40
- audioPlayer: nonEmpty(env.PRISM_VOICE_AUDIO_PLAYER) ?? nonEmpty(settings.audioPlayer),
41
- loopCooldownMs: Math.max(0, Number(env.PRISM_VOICE_LOOP_COOLDOWN_MS ?? settings.loopCooldownMs ?? 1500) || 1500),
42
- };
43
- }
44
- export function stripWakeWord(transcript, wakeWord) {
45
- const text = transcript.replace(/\s+/g, " ").trim();
46
- if (!text)
47
- return undefined;
48
- const escaped = wakeWord.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
49
- const match = text.match(new RegExp(`(?:^|\\b)(?:hey\\s+|ok\\s+|okay\\s+)?${escaped}\\b[:,;\\-]?\\s*(.*)$`, "iu"));
50
- const command = match?.[1]?.trim();
51
- return command || undefined;
52
- }
53
- export function normalizeVoiceText(text) {
54
- return text.toLowerCase().replace(/[^\p{L}\p{N}]+/gu, " ").replace(/\s+/g, " ").trim();
55
- }
56
- export function shouldIgnoreTranscript(transcript, state, now = Date.now(), cooldownMs = 1500) {
57
- if (state.isSpeaking)
58
- return true;
59
- if (state.lastSpokenAt && now - state.lastSpokenAt < cooldownMs)
60
- return true;
61
- const heard = normalizeVoiceText(transcript);
62
- const spoken = normalizeVoiceText(state.lastSpokenText ?? "");
63
- if (!heard || !spoken)
64
- return false;
65
- return heard.length >= 12 && (spoken.includes(heard) || heard.includes(spoken.slice(0, Math.min(spoken.length, 160))));
66
- }
67
- function isThinkingTextBlock(block) {
68
- if (!block || typeof block !== "object")
69
- return false;
70
- const marker = String(block.type ?? block.kind ?? block.name ?? block.category ?? block.role ?? "").toLowerCase();
71
- if (/thinking|reasoning|scratchpad|analysis/.test(marker))
72
- return true;
73
- if (block.thinking || block.reasoning || block.isThinking || block.isReasoning)
74
- return true;
75
- const metadata = block.metadata ?? block.providerMetadata ?? block.experimental_providerMetadata;
76
- if (metadata && typeof metadata === "object") {
77
- const metadataMarker = JSON.stringify(metadata).toLowerCase();
78
- if (/thinking|reasoning|scratchpad|analysis/.test(metadataMarker))
79
- return true;
80
- }
81
- return false;
82
- }
83
- function stripThinkingText(text) {
84
- return text
85
- .replace(/<\s*(think|thinking|reasoning|analysis|scratchpad)\b[^>]*>[\s\S]*?<\s*\/\s*\1\s*>/giu, " ")
86
- .replace(/^\s*(?:#{1,6}\s*)?(?:thinking|reasoning|analysis|scratchpad|internal notes?)\s*:?\s*$/gimu, " ");
87
- }
88
- export function messageToSpeechText(message, maxChars = 4000) {
89
- if (!message || message.role !== "assistant" || message.stopReason === "error")
90
- return "";
91
- const content = message.content;
92
- if (Array.isArray(content) && content.some((block) => block?.type === "toolCall" || block?.type === "tool-call" || block?.toolCallId || block?.name && block?.arguments))
93
- return "";
94
- const text = Array.isArray(content)
95
- ? content.filter((block) => block?.type === "text" && typeof block.text === "string" && !isThinkingTextBlock(block)).map((block) => block.text).join("\n")
96
- : typeof content === "string" ? content : "";
97
- return stripThinkingText(text)
98
- .replace(/```[\s\S]*?```/g, "Code block omitted.")
99
- .replace(/`([^`]+)`/g, "$1")
100
- .replace(/\s+/g, " ")
101
- .trim()
102
- .slice(0, maxChars);
103
- }
104
- function commandExists(command, spawnSyncProcess) {
105
- return spawnSyncProcess("sh", ["-lc", `command -v ${JSON.stringify(command)} >/dev/null 2>&1`], { stdio: "ignore" }).status === 0;
106
- }
107
- function defaultSttCommand(config) {
108
- if (!config.whisperModel)
109
- return undefined;
110
- return `whisper-stream -m ${JSON.stringify(config.whisperModel)} --step 3000 --length 5000 --keep 500 -t 4`;
111
- }
112
- function chooseAudioPlayer(config, spawnSyncProcess) {
113
- if (config.audioPlayer)
114
- return config.audioPlayer;
115
- for (const candidate of ["paplay", "aplay", "ffplay"]) {
116
- if (commandExists(candidate, spawnSyncProcess))
117
- return candidate === "ffplay" ? "ffplay -nodisp -autoexit" : candidate;
118
- }
119
- return undefined;
120
- }
121
- export class LocalVoiceRuntime {
122
- options;
123
- mode = "off";
124
- sttProcess;
125
- isSpeaking = false;
126
- lastSpokenText = "";
127
- lastSpokenAt = 0;
128
- env;
129
- spawnProcess;
130
- spawnSyncProcess;
131
- constructor(options) {
132
- this.options = options;
133
- this.env = options.env ?? process.env;
134
- this.spawnProcess = options.spawnProcess ?? spawn;
135
- this.spawnSyncProcess = options.spawnSyncProcess ?? spawnSync;
136
- }
137
- getMode() { return this.mode; }
138
- setMode(mode) {
139
- this.mode = mode;
140
- this.options.setStatus?.(voiceStatus(mode));
141
- if (mode === "on" || mode === "input")
142
- this.startInput();
143
- else {
144
- this.stopInput();
145
- if (mode === "off")
146
- void this.stopVoicebox();
147
- }
148
- }
149
- shutdown() {
150
- this.stopInput();
151
- void this.stopVoicebox();
152
- this.options.setStatus?.(undefined);
153
- }
154
- async speakAssistantMessage(message) {
155
- if (this.mode !== "on" && this.mode !== "output")
156
- return;
157
- const text = messageToSpeechText(message);
158
- if (!text)
159
- return;
160
- await this.speak(text);
161
- }
162
- isVoiceboxEnabled() {
163
- return isVoiceboxBackend(this.env);
164
- }
165
- async checkVoicebox() {
166
- if (!this.isVoiceboxEnabled())
167
- return false;
168
- const { checkVoiceboxHealth } = await import("./voicebox-client.js");
169
- return checkVoiceboxHealth(resolveVoiceboxConfig(this.env));
170
- }
171
- async ensureVoicebox() {
172
- if (!this.isVoiceboxEnabled())
173
- return false;
174
- return ensureVoiceboxServiceRunning(this.env, this.spawnSyncProcess, this.options.notify);
175
- }
176
- async stopVoicebox() {
177
- if (!this.isVoiceboxEnabled())
178
- return false;
179
- return stopVoiceboxService(this.env, this.spawnSyncProcess);
180
- }
181
- handleTranscript(rawTranscript) {
182
- if (this.mode !== "on" && this.mode !== "input")
183
- return;
184
- const config = resolveVoiceConfig(this.env);
185
- if (shouldIgnoreTranscript(rawTranscript, { isSpeaking: this.isSpeaking, lastSpokenText: this.lastSpokenText, lastSpokenAt: this.lastSpokenAt }, Date.now(), config.loopCooldownMs))
186
- return;
187
- const command = stripWakeWord(rawTranscript, config.wakeWord);
188
- if (!command)
189
- return;
190
- void this.options.sendUserMessage(command);
191
- }
192
- startInput() {
193
- if (this.sttProcess)
194
- return;
195
- const config = resolveVoiceConfig(this.env);
196
- const command = config.sttCommand ?? defaultSttCommand(config);
197
- if (!command) {
198
- this.options.notify?.("Voice input needs PRISM_VOICE_STT_COMMAND or PRISM_VOICE_WHISPER_MODEL (whisper.cpp whisper-stream).", "warning");
199
- return;
200
- }
201
- const child = this.spawnProcess(command, { shell: true, stdio: ["ignore", "pipe", "pipe"], env: this.env });
202
- this.sttProcess = child;
203
- child.stdout?.setEncoding("utf-8");
204
- child.stdout?.on("data", (chunk) => {
205
- for (const line of String(chunk).split(/\r?\n/))
206
- this.handleTranscript(line);
207
- });
208
- child.stderr?.setEncoding("utf-8");
209
- child.stderr?.on("data", (chunk) => {
210
- const line = String(chunk).split(/\r?\n/).find((value) => value.trim());
211
- if (line && /error|failed|no such|cannot/i.test(line))
212
- this.options.notify?.(`Voice input: ${line.trim()}`, "warning");
213
- });
214
- child.on("exit", () => {
215
- if (this.sttProcess === child)
216
- this.sttProcess = undefined;
217
- if (this.mode === "on" || this.mode === "input")
218
- this.options.notify?.("Voice input stopped.", "warning");
219
- });
220
- this.options.notify?.(`Voice input listening for wake word “${config.wakeWord}”.`, "info");
221
- }
222
- stopInput() {
223
- const child = this.sttProcess;
224
- this.sttProcess = undefined;
225
- if (!child || child.killed)
226
- return;
227
- child.kill("SIGTERM");
228
- setTimeout(() => { if (!child.killed)
229
- child.kill("SIGKILL"); }, 1000).unref?.();
230
- }
231
- async speak(text) {
232
- const config = resolveVoiceConfig(this.env);
233
- const command = config.ttsCommand;
234
- this.isSpeaking = true;
235
- this.lastSpokenText = text;
236
- try {
237
- if (isVoiceboxBackend(this.env)) {
238
- const ok = await this.ensureVoicebox();
239
- if (!ok) {
240
- this.options.notify?.("Voicebox is not reachable and could not be started.", "warning");
241
- return;
242
- }
243
- const player = chooseAudioPlayer(config, this.spawnSyncProcess);
244
- if (!player) {
245
- this.options.notify?.("Voicebox output needs an audio player: paplay, aplay, ffplay, or PRISM_VOICE_AUDIO_PLAYER.", "warning");
246
- return;
247
- }
248
- await this.streamVoiceboxToPlayer(text, player);
249
- return;
250
- }
251
- if (command) {
252
- await this.runShell(command, text);
253
- return;
254
- }
255
- if (!config.piperModel) {
256
- this.options.notify?.("Voice output needs PRISM_VOICE_TTS_COMMAND or PRISM_VOICE_PIPER_MODEL (Piper TTS).", "warning");
257
- return;
258
- }
259
- const player = chooseAudioPlayer(config, this.spawnSyncProcess);
260
- if (!player) {
261
- this.options.notify?.("Voice output needs an audio player: paplay, aplay, ffplay, or PRISM_VOICE_AUDIO_PLAYER.", "warning");
262
- return;
263
- }
264
- const wav = path.join(os.tmpdir(), `prism-voice-${process.pid}-${Date.now()}.wav`);
265
- await this.runCommand("piper", ["--model", config.piperModel, "--output_file", wav], text);
266
- await this.runShell(`${player} ${JSON.stringify(wav)}`, "");
267
- fs.rmSync(wav, { force: true });
268
- }
269
- finally {
270
- this.lastSpokenAt = Date.now();
271
- this.isSpeaking = false;
272
- }
273
- }
274
- streamVoiceboxToPlayer(text, player) {
275
- return new Promise((resolve) => {
276
- const child = this.spawnProcess(player, { shell: true, stdio: ["pipe", "ignore", "pipe"], env: this.env });
277
- let settled = false;
278
- const finish = () => {
279
- if (settled)
280
- return;
281
- settled = true;
282
- resolve();
283
- };
284
- child.on("exit", finish);
285
- child.on("error", finish);
286
- streamSpeechWithVoicebox(text, (chunk) => {
287
- if (!child.stdin?.writable)
288
- return;
289
- child.stdin.write(Buffer.from(chunk));
290
- }, resolveVoiceboxConfig(this.env)).then(() => child.stdin?.end()).catch(() => {
291
- child.stdin?.destroy();
292
- finish();
293
- });
294
- });
295
- }
296
- runShell(command, input) {
297
- return new Promise((resolve) => {
298
- const child = this.spawnProcess(command, { shell: true, stdio: ["pipe", "ignore", "pipe"], env: this.env });
299
- child.stdin?.end(input);
300
- child.on("exit", () => resolve());
301
- child.on("error", () => resolve());
302
- });
303
- }
304
- runCommand(command, args, input) {
305
- return new Promise((resolve) => {
306
- const child = this.spawnProcess(command, args, { stdio: ["pipe", "ignore", "pipe"], env: this.env });
307
- child.stdin?.end(input);
308
- child.on("exit", () => resolve());
309
- child.on("error", () => resolve());
310
- });
311
- }
312
- }
313
- //# sourceMappingURL=voice-runtime.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"voice-runtime.js","sourceRoot":"","sources":["../../../src/prism-extensions/core/voice-runtime.ts"],"names":[],"mappings":"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"}
@@ -1,32 +0,0 @@
1
- export interface VoiceboxConfig {
2
- baseUrl: string;
3
- profile?: string;
4
- language: string;
5
- engine?: string;
6
- personality?: boolean;
7
- clientId: string;
8
- timeoutMs: number;
9
- generationTimeoutMs: number;
10
- }
11
- export interface VoiceboxGenerationStatus {
12
- id: string;
13
- status: string;
14
- duration?: number;
15
- error?: string | null;
16
- source?: string;
17
- }
18
- export declare function normalizeVoiceboxBaseUrl(value: string): string;
19
- export declare function resolveVoiceboxConfig(env?: NodeJS.ProcessEnv): VoiceboxConfig;
20
- export declare function resolveVoiceBackend(env?: NodeJS.ProcessEnv): string | undefined;
21
- export declare function isVoiceboxBackend(env?: NodeJS.ProcessEnv): boolean;
22
- export declare function checkVoiceboxHealth(config?: VoiceboxConfig): Promise<boolean>;
23
- export declare function speakWithVoicebox(text: string, config?: VoiceboxConfig): Promise<any>;
24
- export declare function waitForVoiceboxGeneration(id: string, config?: VoiceboxConfig): Promise<VoiceboxGenerationStatus>;
25
- export declare function downloadVoiceboxAudio(id: string, config?: VoiceboxConfig): Promise<Buffer>;
26
- export declare function synthesizeSpeechWithVoicebox(text: string, config?: VoiceboxConfig): Promise<Buffer>;
27
- export declare function streamSpeechWithVoicebox(text: string, onChunk: (chunk: Uint8Array) => void | Promise<void>, config?: VoiceboxConfig): Promise<void>;
28
- export declare function transcribeWithVoicebox(audio: Blob | Buffer | Uint8Array, options?: {
29
- fileName?: string;
30
- language?: string;
31
- model?: string;
32
- }, config?: VoiceboxConfig): Promise<string>;