@sumicom/quicksave 0.8.14 → 0.8.15

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 (87) hide show
  1. package/dist/ai/cardBuilder.d.ts +21 -2
  2. package/dist/ai/cardBuilder.d.ts.map +1 -1
  3. package/dist/ai/cardBuilder.js +100 -6
  4. package/dist/ai/cardBuilder.js.map +1 -1
  5. package/dist/ai/claudeCliProvider.d.ts +25 -2
  6. package/dist/ai/claudeCliProvider.d.ts.map +1 -1
  7. package/dist/ai/claudeCliProvider.js +76 -19
  8. package/dist/ai/claudeCliProvider.js.map +1 -1
  9. package/dist/ai/codexAppServer/cardAdapter.d.ts.map +1 -1
  10. package/dist/ai/codexAppServer/cardAdapter.js +87 -7
  11. package/dist/ai/codexAppServer/cardAdapter.js.map +1 -1
  12. package/dist/ai/codexAppServer/provider.d.ts +3 -0
  13. package/dist/ai/codexAppServer/provider.d.ts.map +1 -1
  14. package/dist/ai/codexAppServer/provider.js +15 -4
  15. package/dist/ai/codexAppServer/provider.js.map +1 -1
  16. package/dist/ai/codexMcpProvider.d.ts.map +1 -1
  17. package/dist/ai/codexMcpProvider.js +6 -0
  18. package/dist/ai/codexMcpProvider.js.map +1 -1
  19. package/dist/ai/provider.d.ts +3 -0
  20. package/dist/ai/provider.d.ts.map +1 -1
  21. package/dist/ai/provider.js.map +1 -1
  22. package/dist/ai/queuedUserPrompts.d.ts +6 -0
  23. package/dist/ai/queuedUserPrompts.d.ts.map +1 -1
  24. package/dist/ai/queuedUserPrompts.js +9 -0
  25. package/dist/ai/queuedUserPrompts.js.map +1 -1
  26. package/dist/ai/realtimeTranscription.d.ts +2 -0
  27. package/dist/ai/realtimeTranscription.d.ts.map +1 -1
  28. package/dist/ai/realtimeTranscription.js +14 -0
  29. package/dist/ai/realtimeTranscription.js.map +1 -1
  30. package/dist/ai/sessionManager.d.ts +12 -0
  31. package/dist/ai/sessionManager.d.ts.map +1 -1
  32. package/dist/ai/sessionManager.js +73 -12
  33. package/dist/ai/sessionManager.js.map +1 -1
  34. package/dist/ai/voiceIntermediary/historyStore.d.ts +54 -0
  35. package/dist/ai/voiceIntermediary/historyStore.d.ts.map +1 -0
  36. package/dist/ai/voiceIntermediary/historyStore.js +159 -0
  37. package/dist/ai/voiceIntermediary/historyStore.js.map +1 -0
  38. package/dist/ai/voiceIntermediary/index.d.ts +13 -0
  39. package/dist/ai/voiceIntermediary/index.d.ts.map +1 -0
  40. package/dist/ai/voiceIntermediary/index.js +13 -0
  41. package/dist/ai/voiceIntermediary/index.js.map +1 -0
  42. package/dist/ai/voiceIntermediary/llm.d.ts +52 -0
  43. package/dist/ai/voiceIntermediary/llm.d.ts.map +1 -0
  44. package/dist/ai/voiceIntermediary/llm.js +63 -0
  45. package/dist/ai/voiceIntermediary/llm.js.map +1 -0
  46. package/dist/ai/voiceIntermediary/manager.d.ts +58 -0
  47. package/dist/ai/voiceIntermediary/manager.d.ts.map +1 -0
  48. package/dist/ai/voiceIntermediary/manager.js +134 -0
  49. package/dist/ai/voiceIntermediary/manager.js.map +1 -0
  50. package/dist/ai/voiceIntermediary/memory.d.ts +22 -0
  51. package/dist/ai/voiceIntermediary/memory.d.ts.map +1 -0
  52. package/dist/ai/voiceIntermediary/memory.js +109 -0
  53. package/dist/ai/voiceIntermediary/memory.js.map +1 -0
  54. package/dist/ai/voiceIntermediary/session.d.ts +81 -0
  55. package/dist/ai/voiceIntermediary/session.d.ts.map +1 -0
  56. package/dist/ai/voiceIntermediary/session.js +567 -0
  57. package/dist/ai/voiceIntermediary/session.js.map +1 -0
  58. package/dist/ai/voiceIntermediary/tools.d.ts +58 -0
  59. package/dist/ai/voiceIntermediary/tools.d.ts.map +1 -0
  60. package/dist/ai/voiceIntermediary/tools.js +277 -0
  61. package/dist/ai/voiceIntermediary/tools.js.map +1 -0
  62. package/dist/ai/voiceIntermediary/tts.d.ts +28 -0
  63. package/dist/ai/voiceIntermediary/tts.d.ts.map +1 -0
  64. package/dist/ai/voiceIntermediary/tts.js +66 -0
  65. package/dist/ai/voiceIntermediary/tts.js.map +1 -0
  66. package/dist/ai/voiceLog.d.ts +18 -0
  67. package/dist/ai/voiceLog.d.ts.map +1 -0
  68. package/dist/ai/voiceLog.js +74 -0
  69. package/dist/ai/voiceLog.js.map +1 -0
  70. package/dist/ai/voiceStream.d.ts +5 -0
  71. package/dist/ai/voiceStream.d.ts.map +1 -1
  72. package/dist/ai/voiceStream.js +29 -5
  73. package/dist/ai/voiceStream.js.map +1 -1
  74. package/dist/handlers/legacyBusAdapter.d.ts.map +1 -1
  75. package/dist/handlers/legacyBusAdapter.js +8 -0
  76. package/dist/handlers/legacyBusAdapter.js.map +1 -1
  77. package/dist/handlers/messageHandler.d.ts +14 -0
  78. package/dist/handlers/messageHandler.d.ts.map +1 -1
  79. package/dist/handlers/messageHandler.js +150 -1
  80. package/dist/handlers/messageHandler.js.map +1 -1
  81. package/dist/index.js +2 -2
  82. package/dist/service/ipcClient.js +1 -1
  83. package/dist/service/run.d.ts.map +1 -1
  84. package/dist/service/run.js +14 -1
  85. package/dist/service/run.js.map +1 -1
  86. package/dist/service/types.js +1 -1
  87. package/package.json +3 -3
@@ -0,0 +1,277 @@
1
+ // SPDX-FileCopyrightText: 2026 King Young Technology
2
+ // SPDX-License-Identifier: MIT
3
+ import { appendMemory } from './memory.js';
4
+ import { formatVoiceHistoryEvent } from './historyStore.js';
5
+ export const VOICE_AGENT_TOOLS = [
6
+ {
7
+ type: 'function',
8
+ function: {
9
+ name: 'send_to_coding_agent',
10
+ description: 'Internally dispatch implementation work. To the user, present this as your own action ("I will handle it", "I am checking"), not as asking another agent. Use for "do X", redirection, and answering open questions. Set interrupt=true ONLY when the user wants to stop the current work and change course now ("no, stop and do X instead"); otherwise the prompt queues politely.',
11
+ parameters: {
12
+ type: 'object',
13
+ properties: {
14
+ prompt: { type: 'string', description: 'The internal implementation instruction, in the project/user language.' },
15
+ interrupt: { type: 'boolean', description: 'Interrupt the in-flight turn before sending. Default false.' },
16
+ },
17
+ required: ['prompt'],
18
+ },
19
+ },
20
+ },
21
+ {
22
+ type: 'function',
23
+ function: {
24
+ name: 'stop_coding_agent',
25
+ description: 'Interrupt the current implementation turn without sending a new prompt. Use when the user just says "stop" / "halt"; tell the user you stopped the current work.',
26
+ parameters: { type: 'object', properties: {} },
27
+ },
28
+ },
29
+ {
30
+ type: 'function',
31
+ function: {
32
+ name: 'respond_to_permission',
33
+ description: 'Relay the user\'s spoken decision to a PENDING permission prompt. NEVER decide on your own: first speak what the tool wants and ask the user, then call this with their explicit allow/deny. Get request_id from get_status. Irreversible actions (push, delete, deploy, send) require a clear spoken yes.',
34
+ parameters: {
35
+ type: 'object',
36
+ properties: {
37
+ request_id: { type: 'string', description: 'The pending request id from get_status.' },
38
+ decision: { type: 'string', enum: ['allow', 'deny'], description: 'The user\'s explicit decision.' },
39
+ reason: { type: 'string', description: 'Optional note to attach (e.g. why denied).' },
40
+ },
41
+ required: ['request_id', 'decision'],
42
+ },
43
+ },
44
+ },
45
+ {
46
+ type: 'function',
47
+ function: {
48
+ name: 'set_permission_mode',
49
+ description: 'Change implementation autonomy. Confirm verbally with the user before widening autonomy. Modes: default, acceptEdits, bypassPermissions, plan, auto (Claude); read-only, default, auto-review, full-access (Codex).',
50
+ parameters: {
51
+ type: 'object',
52
+ properties: {
53
+ mode: { type: 'string', description: 'The permission/autonomy mode to switch to.' },
54
+ },
55
+ required: ['mode'],
56
+ },
57
+ },
58
+ },
59
+ {
60
+ type: 'function',
61
+ function: {
62
+ name: 'get_status',
63
+ description: 'Glance at current work: is it running, is a permission prompt pending (with its request_id and tool), what autonomy mode. Cheap — prefer this over read_cards when the user asks what is happening. Summarize as your own status update.',
64
+ parameters: { type: 'object', properties: {} },
65
+ },
66
+ },
67
+ {
68
+ type: 'function',
69
+ function: {
70
+ name: 'read_cards',
71
+ description: 'Read or search the recent implementation transcript (messages, tool calls + results, errors). Pass query to filter. Use to interpret what happened and answer detailed questions. Summarize as your own status update — do NOT read it back verbatim and do NOT say you are reading another agent.',
72
+ parameters: {
73
+ type: 'object',
74
+ properties: {
75
+ query: { type: 'string', description: 'Optional case-insensitive substring filter.' },
76
+ limit: { type: 'number', description: 'How many recent cards to scan (1-50, default 20).' },
77
+ },
78
+ },
79
+ },
80
+ },
81
+ {
82
+ type: 'function',
83
+ function: {
84
+ name: 'remember',
85
+ description: 'Persist a durable fact to the workspace memory so future voice sessions know it. Use when the user states a standing preference, a boundary/decision, or a project fact ("always run lint", "never push to main without asking", "tests are pnpm test").',
86
+ parameters: {
87
+ type: 'object',
88
+ properties: {
89
+ note: { type: 'string', description: 'The fact to remember, phrased concisely.' },
90
+ section: { type: 'string', enum: ['preference', 'decision', 'fact', 'note'], description: 'Which section it belongs in.' },
91
+ },
92
+ required: ['note'],
93
+ },
94
+ },
95
+ },
96
+ {
97
+ type: 'function',
98
+ function: {
99
+ name: 'read_voice_history',
100
+ description: 'Search or browse this voice agent\'s own persisted JSONL history, including messages before compaction. Use when the user asks what they told you earlier, why you made a voice-agent decision, or when active context lacks older voice conversation details. Summarize; do not read raw history aloud.',
101
+ parameters: {
102
+ type: 'object',
103
+ properties: {
104
+ query: { type: 'string', description: 'Optional case-insensitive search text.' },
105
+ limit: { type: 'number', description: 'How many recent matching history events to read (1-100, default 20).' },
106
+ before_seq: { type: 'number', description: 'Only read events before this sequence number.' },
107
+ include_runtime_events: { type: 'boolean', description: 'Include runtime/log events. Default false.' },
108
+ },
109
+ },
110
+ },
111
+ },
112
+ ];
113
+ const MAX_CARD_CONTENT = 220;
114
+ function truncate(text, max) {
115
+ const t = text.replace(/\s+/g, ' ').trim();
116
+ return t.length > max ? `${t.slice(0, max)}…` : t;
117
+ }
118
+ function briefInput(input) {
119
+ try {
120
+ const s = JSON.stringify(input);
121
+ return truncate(s, 120);
122
+ }
123
+ catch {
124
+ return '';
125
+ }
126
+ }
127
+ /** One compact line per card for the brain to reason over (not for TTS). */
128
+ export function formatCardForBrain(card) {
129
+ switch (card.type) {
130
+ case 'user':
131
+ return `[你] ${truncate(card.text, MAX_CARD_CONTENT)}`;
132
+ case 'assistant_text':
133
+ return `[Claude] ${truncate(card.text, MAX_CARD_CONTENT)}`;
134
+ case 'thinking':
135
+ return `[思考] ${truncate(card.text, 120)}`;
136
+ case 'tool_call': {
137
+ const head = `[工具] ${card.toolName}(${briefInput(card.toolInput)})`;
138
+ if (!card.result)
139
+ return `${head} …進行中`;
140
+ const tag = card.result.isError ? '錯誤: ' : '→ ';
141
+ return `${head} ${tag}${truncate(card.result.content, MAX_CARD_CONTENT)}`;
142
+ }
143
+ case 'subagent':
144
+ return `[子代理${card.subagentType ? ' ' + card.subagentType : ''}] ${truncate(card.description, 120)} — ${card.status}${card.summary ? ': ' + truncate(card.summary, 160) : ''}`;
145
+ case 'system':
146
+ return `[系統${card.subtype ? '/' + card.subtype : ''}] ${truncate(card.text, MAX_CARD_CONTENT)}`;
147
+ case 'generated_image':
148
+ return `[圖片] ${truncate(card.prompt, 120)} (${card.status})`;
149
+ case 'artifact':
150
+ return `[文件] ${truncate(card.artifact?.title ?? '', 120)}`;
151
+ case 'recovery_suggested':
152
+ return `[復原建議] ${truncate(card.reason, 160)}`;
153
+ default:
154
+ return '';
155
+ }
156
+ }
157
+ /**
158
+ * Execute one tool call and return the string result fed back to the model.
159
+ * Never throws on expected failures (returns an explanatory string) so the loop
160
+ * keeps going; only programmer errors propagate.
161
+ */
162
+ export async function executeTool(name, args, ctx) {
163
+ const { sessionId, cwd, bridge, emitAction } = ctx;
164
+ switch (name) {
165
+ case 'send_to_coding_agent': {
166
+ const prompt = String(args.prompt ?? '').trim();
167
+ if (!prompt)
168
+ return 'error: empty prompt';
169
+ const interrupt = !!args.interrupt;
170
+ const ok = bridge.sendUserMessageToSession(sessionId, prompt, { interrupt });
171
+ if (!ok)
172
+ return 'error: the coding session is not running';
173
+ emitAction(interrupt ? `改做:${truncate(prompt, 60)}` : `開始處理:${truncate(prompt, 60)}`);
174
+ return interrupt ? 'interrupted and sent' : 'sent (will run on the next turn boundary)';
175
+ }
176
+ case 'stop_coding_agent': {
177
+ const ok = await bridge.interruptSession(sessionId);
178
+ if (ok)
179
+ emitAction('已停止目前工作');
180
+ return ok ? 'stopped the current turn' : 'nothing was running to stop';
181
+ }
182
+ case 'respond_to_permission': {
183
+ const requestId = String(args.request_id ?? '').trim();
184
+ const decision = args.decision === 'deny' ? 'deny' : args.decision === 'allow' ? 'allow' : null;
185
+ if (!requestId || !decision)
186
+ return 'error: request_id and decision (allow|deny) are required';
187
+ const pending = bridge
188
+ .getPendingInputRequests()
189
+ .find((r) => r.requestId === requestId && r.sessionId === sessionId);
190
+ if (!pending)
191
+ return `error: no pending permission request with id ${requestId} for this session`;
192
+ const payload = {
193
+ sessionId,
194
+ requestId,
195
+ action: decision,
196
+ response: typeof args.reason === 'string' ? args.reason : undefined,
197
+ };
198
+ const ok = bridge.resolveUserInput(payload);
199
+ if (ok)
200
+ emitAction(`${decision === 'allow' ? '核准' : '拒絕'}權限:${pending.toolName ?? pending.title}`);
201
+ return ok ? `relayed ${decision} for ${pending.toolName ?? 'request'}` : 'error: failed to relay the decision';
202
+ }
203
+ case 'set_permission_mode': {
204
+ const mode = String(args.mode ?? '').trim();
205
+ if (!mode)
206
+ return 'error: mode is required';
207
+ const ok = await bridge.setPermissionLevel(sessionId, mode);
208
+ if (ok)
209
+ emitAction(`權限模式 → ${mode}`);
210
+ return ok ? `permission mode set to ${mode}` : `error: "${mode}" was rejected for this agent`;
211
+ }
212
+ case 'get_status': {
213
+ const active = bridge.getActiveSessions().find((s) => s.sessionId === sessionId);
214
+ const pending = bridge
215
+ .getPendingInputRequests()
216
+ .filter((r) => r.sessionId === sessionId)
217
+ .map((r) => ({
218
+ request_id: r.requestId,
219
+ tool: r.toolName ?? r.title,
220
+ wants: r.toolInput ? briefInput(r.toolInput) : undefined,
221
+ }));
222
+ return JSON.stringify({
223
+ running: active ? bridge.isStreaming(sessionId) : false,
224
+ attached: !!active,
225
+ permission_mode: bridge.getPermissionLevel(sessionId),
226
+ pending_permissions: pending,
227
+ });
228
+ }
229
+ case 'read_cards': {
230
+ const limit = Math.min(50, Math.max(1, Number(args.limit) || 20));
231
+ const query = typeof args.query === 'string' ? args.query.toLowerCase().trim() : '';
232
+ let resp;
233
+ try {
234
+ resp = await bridge.getCards(sessionId, cwd, 0, limit);
235
+ }
236
+ catch (err) {
237
+ return `error reading cards: ${err.message}`;
238
+ }
239
+ let lines = resp.cards.map(formatCardForBrain).filter(Boolean);
240
+ if (ctx.liveContext?.trim()) {
241
+ lines.push(...ctx.liveContext.split('\n').map((l) => l.trim()).filter(Boolean));
242
+ }
243
+ if (query)
244
+ lines = lines.filter((l) => l.toLowerCase().includes(query));
245
+ if (lines.length === 0)
246
+ return query ? `no cards matched "${query}"` : 'no transcript yet';
247
+ return lines.join('\n');
248
+ }
249
+ case 'remember': {
250
+ const note = String(args.note ?? '').trim();
251
+ if (!note)
252
+ return 'error: note is required';
253
+ const section = ['preference', 'decision', 'fact', 'note'].includes(args.section)
254
+ ? args.section
255
+ : 'note';
256
+ await appendMemory(cwd, note, section);
257
+ emitAction(`記住:${truncate(note, 60)}`);
258
+ return 'remembered';
259
+ }
260
+ case 'read_voice_history': {
261
+ if (!ctx.readVoiceHistory)
262
+ return 'error: voice history is unavailable';
263
+ const events = await ctx.readVoiceHistory({
264
+ query: typeof args.query === 'string' ? args.query : undefined,
265
+ limit: Math.min(100, Math.max(1, Number(args.limit) || 20)),
266
+ beforeSeq: Number.isFinite(Number(args.before_seq)) ? Number(args.before_seq) : undefined,
267
+ includeRuntimeEvents: args.include_runtime_events === true,
268
+ });
269
+ if (events.length === 0)
270
+ return 'no voice history matched';
271
+ return events.map(formatVoiceHistoryEvent).join('\n');
272
+ }
273
+ default:
274
+ return `error: unknown tool ${name}`;
275
+ }
276
+ }
277
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/ai/voiceIntermediary/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * OpenAI-compatible text-to-speech for the voice intermediary. POSTs to
3
+ * `{baseUrl}/audio/speech` and returns raw audio bytes. The daemon synthesizes
4
+ * (keeping the API key server-side) and hands the PWA an id to fetch on demand.
5
+ */
6
+ import type { VoiceConfig } from '@sumicom/quicksave-shared';
7
+ import type { FetchLike } from './llm.js';
8
+ export interface SynthesizedSpeech {
9
+ audio: Buffer;
10
+ mimeType: string;
11
+ requestId?: string;
12
+ }
13
+ export declare class VoiceTtsError extends Error {
14
+ readonly cause?: unknown | undefined;
15
+ readonly status?: number | undefined;
16
+ readonly requestId?: string | undefined;
17
+ constructor(message: string, cause?: unknown | undefined, status?: number | undefined, requestId?: string | undefined);
18
+ }
19
+ /**
20
+ * Synthesize `text` to speech. Returns null (silent) when no `ttsModel` is
21
+ * configured — the agent still works, just text-only. Throws on transport /
22
+ * server errors so the session can surface them.
23
+ */
24
+ export declare function synthesizeSpeech(config: VoiceConfig, text: string, opts?: {
25
+ signal?: AbortSignal;
26
+ fetchImpl?: FetchLike;
27
+ }): Promise<SynthesizedSpeech | null>;
28
+ //# sourceMappingURL=tts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tts.d.ts","sourceRoot":"","sources":["../../../src/ai/voiceIntermediary/tts.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAc,SAAQ,KAAK;IAGpC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM;gBAH3B,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,OAAO,YAAA,EACf,MAAM,CAAC,EAAE,MAAM,YAAA,EACf,SAAS,CAAC,EAAE,MAAM,YAAA;CAK9B;AAYD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE,GACrD,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAyCnC"}
@@ -0,0 +1,66 @@
1
+ // SPDX-FileCopyrightText: 2026 King Young Technology
2
+ // SPDX-License-Identifier: MIT
3
+ import { randomUUID } from 'crypto';
4
+ export class VoiceTtsError extends Error {
5
+ cause;
6
+ status;
7
+ requestId;
8
+ constructor(message, cause, status, requestId) {
9
+ super(message);
10
+ this.cause = cause;
11
+ this.status = status;
12
+ this.requestId = requestId;
13
+ this.name = 'VoiceTtsError';
14
+ }
15
+ }
16
+ function apiUrl(baseUrl, path) {
17
+ return `${baseUrl.trim().replace(/\/+$/, '')}${path}`;
18
+ }
19
+ function authHeaders(config) {
20
+ const headers = { 'Content-Type': 'application/json' };
21
+ if (config.apiKey.trim())
22
+ headers.Authorization = `Bearer ${config.apiKey.trim()}`;
23
+ return headers;
24
+ }
25
+ /**
26
+ * Synthesize `text` to speech. Returns null (silent) when no `ttsModel` is
27
+ * configured — the agent still works, just text-only. Throws on transport /
28
+ * server errors so the session can surface them.
29
+ */
30
+ export async function synthesizeSpeech(config, text, opts) {
31
+ const model = config.ttsModel?.trim();
32
+ if (!model || !text.trim())
33
+ return null;
34
+ const doFetch = opts?.fetchImpl ?? fetch;
35
+ let res;
36
+ const clientRequestId = `quicksave-tts-${randomUUID()}`;
37
+ const instructions = config.ttsInstructions?.trim();
38
+ try {
39
+ res = await doFetch(apiUrl(config.baseUrl, '/audio/speech'), {
40
+ method: 'POST',
41
+ headers: {
42
+ ...authHeaders(config),
43
+ 'X-Client-Request-Id': clientRequestId,
44
+ },
45
+ body: JSON.stringify({
46
+ model,
47
+ voice: config.ttsVoice?.trim() || 'alloy',
48
+ input: text,
49
+ response_format: 'mp3',
50
+ ...(instructions ? { instructions } : {}),
51
+ }),
52
+ signal: opts?.signal,
53
+ });
54
+ }
55
+ catch (err) {
56
+ throw new VoiceTtsError('Could not reach the speech endpoint.', err);
57
+ }
58
+ const requestId = res.headers.get('x-request-id') ?? clientRequestId;
59
+ if (!res.ok) {
60
+ const detail = await res.text().catch(() => '');
61
+ throw new VoiceTtsError(`Speech synthesis failed (${res.status})${detail ? `: ${detail.slice(0, 200)}` : ''}`, undefined, res.status, requestId);
62
+ }
63
+ const audio = Buffer.from(await res.arrayBuffer());
64
+ return { audio, mimeType: res.headers.get('content-type') ?? 'audio/mpeg', requestId };
65
+ }
66
+ //# sourceMappingURL=tts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tts.js","sourceRoot":"","sources":["../../../src/ai/voiceIntermediary/tts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ type VoiceLogLevel = 'debug' | 'info' | 'warn' | 'error';
2
+ export interface VoiceLogEntry {
3
+ sessionId?: string;
4
+ event: string;
5
+ level?: VoiceLogLevel;
6
+ phase?: string;
7
+ turnId?: string;
8
+ data?: Record<string, unknown>;
9
+ }
10
+ declare function enabled(): boolean;
11
+ export declare class VoiceEventLogger {
12
+ private readonly isEnabled;
13
+ constructor(isEnabled?: typeof enabled);
14
+ log(entry: VoiceLogEntry): void;
15
+ }
16
+ export declare const voiceEventLogger: VoiceEventLogger;
17
+ export {};
18
+ //# sourceMappingURL=voiceLog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voiceLog.d.ts","sourceRoot":"","sources":["../../src/ai/voiceLog.ts"],"names":[],"mappings":"AAOA,KAAK,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAID,iBAAS,OAAO,IAAI,OAAO,CAK1B;AA8BD,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,iBAAU;IAEhD,GAAG,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;CAmBhC;AAED,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
@@ -0,0 +1,74 @@
1
+ // SPDX-FileCopyrightText: 2026 King Young Technology
2
+ // SPDX-License-Identifier: MIT
3
+ import { appendFile, mkdir } from 'fs/promises';
4
+ import { join } from 'path';
5
+ import { getLogsDir } from '../service/singleton.js';
6
+ import { isDebugEnabled } from '../service/types.js';
7
+ const MAX_TEXT_CHARS = Number(process.env.QUICKSAVE_VOICE_LOG_MAX_TEXT_CHARS ?? 2048);
8
+ function enabled() {
9
+ const env = process.env.QUICKSAVE_VOICE_LOG?.trim();
10
+ if (env === '1')
11
+ return true;
12
+ if (env === '0')
13
+ return false;
14
+ return isDebugEnabled() && process.env.NODE_ENV !== 'test';
15
+ }
16
+ function shortSessionId(sessionId) {
17
+ if (!sessionId)
18
+ return 'unknown';
19
+ return sessionId.length > 12 ? sessionId.slice(0, 12) : sessionId;
20
+ }
21
+ function dayStamp(date = new Date()) {
22
+ return date.toISOString().slice(0, 10);
23
+ }
24
+ function sanitize(value) {
25
+ if (typeof value === 'string') {
26
+ if (value.length <= MAX_TEXT_CHARS)
27
+ return value;
28
+ return `${value.slice(0, MAX_TEXT_CHARS)}…`;
29
+ }
30
+ if (Array.isArray(value))
31
+ return value.map(sanitize);
32
+ if (!value || typeof value !== 'object')
33
+ return value;
34
+ const out = {};
35
+ for (const [key, raw] of Object.entries(value)) {
36
+ if (/apiKey|authorization|token|secret|audioBase64|audio/i.test(key)) {
37
+ if (/audioBytes|audioId/i.test(key))
38
+ out[key] = sanitize(raw);
39
+ else
40
+ out[key] = '[redacted]';
41
+ continue;
42
+ }
43
+ out[key] = sanitize(raw);
44
+ }
45
+ return out;
46
+ }
47
+ export class VoiceEventLogger {
48
+ isEnabled;
49
+ constructor(isEnabled = enabled) {
50
+ this.isEnabled = isEnabled;
51
+ }
52
+ log(entry) {
53
+ if (!this.isEnabled())
54
+ return;
55
+ const line = JSON.stringify({
56
+ v: 1,
57
+ ts: new Date().toISOString(),
58
+ source: 'voice',
59
+ level: entry.level ?? 'info',
60
+ sessionId: entry.sessionId,
61
+ event: entry.event,
62
+ phase: entry.phase,
63
+ turnId: entry.turnId,
64
+ data: sanitize(entry.data ?? {}),
65
+ });
66
+ const dir = join(getLogsDir(), 'voice', dayStamp());
67
+ const file = join(dir, `${shortSessionId(entry.sessionId)}.jsonl`);
68
+ void mkdir(dir, { recursive: true })
69
+ .then(() => appendFile(file, `${line}\n`, 'utf8'))
70
+ .catch(() => undefined);
71
+ }
72
+ }
73
+ export const voiceEventLogger = new VoiceEventLogger();
74
+ //# sourceMappingURL=voiceLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voiceLog.js","sourceRoot":"","sources":["../../src/ai/voiceLog.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,11 @@ export interface VoiceBus {
19
19
  onCommand<Req = unknown, Res = unknown>(verb: string, handler: (payload: Req, ctx: {
20
20
  peer: string;
21
21
  }) => Promise<Res> | Res): void;
22
+ /** Register a subscribable push path. REQUIRED before `publish` to it can
23
+ * reach anyone — the server rejects subscriptions to unregistered patterns. */
24
+ onSubscribe(pattern: string, handler: {
25
+ snapshot: (ctx: unknown) => unknown;
26
+ }): void;
22
27
  publish<T>(path: string, data: T): void;
23
28
  }
24
29
  /** Classification of an inbound DataChannel message. */
@@ -1 +1 @@
1
- {"version":3,"file":"voiceStream.d.ts","sourceRoot":"","sources":["../../src/ai/voiceStream.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAEV,cAAc,EAEd,8BAA8B,EAE9B,0BAA0B,EAE3B,MAAM,2BAA2B,CAAC;AAGnC,gFAAgF;AAChF,MAAM,WAAW,QAAQ;IACvB,SAAS,CAAC,GAAG,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,EACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GACnE,IAAI,CAAC;IACR,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;CACzC;AAED,wDAAwD;AACxD,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvB;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAiBjE;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAEjG;AA8CD;;;GAGG;AACH,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;gBAEzB,GAAG,EAAE,QAAQ;IAE1C,4EAA4E;IACtE,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC,mEAAmE;IAC7D,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,8BAA8B,CAAC;IA8B3F,iDAAiD;IAC3C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAY9F,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,QAAQ;IAYhB,0CAA0C;IAC1C,QAAQ,IAAI,IAAI;CAGjB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,kBAAkB,CAajE"}
1
+ {"version":3,"file":"voiceStream.d.ts","sourceRoot":"","sources":["../../src/ai/voiceStream.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAEV,cAAc,EAEd,8BAA8B,EAE9B,0BAA0B,EAE3B,MAAM,2BAA2B,CAAC;AAInC,gFAAgF;AAChF,MAAM,WAAW,QAAQ;IACvB,SAAS,CAAC,GAAG,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,EACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GACnE,IAAI,CAAC;IACR;oFACgF;IAChF,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACrF,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;CACzC;AAED,wDAAwD;AACxD,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvB;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAiBjE;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAEjG;AA8CD;;;GAGG;AACH,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;gBAEzB,GAAG,EAAE,QAAQ;IAE1C,4EAA4E;IACtE,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC,mEAAmE;IAC7D,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,8BAA8B,CAAC;IA8B3F,iDAAiD;IAC3C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAY9F,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,QAAQ;IAYhB,0CAA0C;IAC1C,QAAQ,IAAI,IAAI;CAGjB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,kBAAkB,CAoBjE"}
@@ -1,4 +1,5 @@
1
1
  import { RealtimeTranscriber } from './realtimeTranscription.js';
2
+ import { voiceEventLogger } from './voiceLog.js';
2
3
  /**
3
4
  * Decide whether a DataChannel frame is binary audio or a JSON control
4
5
  * message. Extracted (and pure) so it can be unit-tested without WebRTC.
@@ -129,7 +130,7 @@ export class VoiceStreamManager {
129
130
  return;
130
131
  const msg = inbound.msg;
131
132
  if (msg.t === 'start') {
132
- this.startUtterance(peer, msg.config, msg.sampleRate, sendDc);
133
+ this.startUtterance(sessionId, peer, msg.config, msg.sampleRate, sendDc);
133
134
  }
134
135
  else if (msg.t === 'stop') {
135
136
  peer.transcriber?.commit();
@@ -137,12 +138,29 @@ export class VoiceStreamManager {
137
138
  };
138
139
  channel.onclose = () => this.teardown(sessionId);
139
140
  }
140
- startUtterance(peer, config, sampleRate, sendDc) {
141
+ startUtterance(sessionId, peer, config, sampleRate, sendDc) {
141
142
  peer.transcriber?.close();
142
143
  peer.transcriber = new RealtimeTranscriber(config, sampleRate, {
143
- onPartial: (text) => sendDc({ t: 'transcript', final: false, text }),
144
- onFinal: (text) => sendDc({ t: 'transcript', final: true, text }),
145
- onError: (message) => sendDc({ t: 'error', message }),
144
+ onSpeechStarted: () => {
145
+ voiceEventLogger.log({ sessionId, event: 'vad.speech_started', phase: 'vad' });
146
+ sendDc({ t: 'speech', active: true });
147
+ },
148
+ onSpeechStopped: () => {
149
+ voiceEventLogger.log({ sessionId, event: 'vad.speech_stopped', phase: 'vad' });
150
+ sendDc({ t: 'speech', active: false });
151
+ },
152
+ onPartial: (text) => {
153
+ voiceEventLogger.log({ sessionId, event: 'asr.partial', phase: 'asr', data: { textChars: text.length } });
154
+ sendDc({ t: 'transcript', final: false, text });
155
+ },
156
+ onFinal: (text) => {
157
+ voiceEventLogger.log({ sessionId, event: 'asr.final_fragment', phase: 'asr', data: { text, textChars: text.length } });
158
+ sendDc({ t: 'transcript', final: true, text });
159
+ },
160
+ onError: (message) => {
161
+ voiceEventLogger.log({ sessionId, event: 'asr.error', phase: 'asr', level: 'error', data: { message } });
162
+ sendDc({ t: 'error', message });
163
+ },
146
164
  });
147
165
  peer.transcriber.start();
148
166
  }
@@ -172,6 +190,12 @@ export class VoiceStreamManager {
172
190
  */
173
191
  export function wireVoiceStream(bus) {
174
192
  const manager = new VoiceStreamManager(bus);
193
+ // The agent trickles its ICE candidates to the PWA on this path. It MUST be
194
+ // registered like any subscribable path — otherwise the server rejects the
195
+ // PWA's `sub` with `sub-error` and `publish()` reaches zero peers, so the
196
+ // agent's candidates never arrive and P2P always times out (remote
197
+ // candidates = 0). Push-only, so the snapshot is null.
198
+ bus.onSubscribe('/voice/rtc/:sessionId', { snapshot: () => null });
175
199
  bus.onCommand('voice:rtc-connect', (payload) => manager.connect(payload.sessionId, payload.sdp));
176
200
  bus.onCommand('voice:rtc-ice', (payload) => manager.addIce(payload.sessionId, payload.candidate));
177
201
  return manager;
@@ -1 +1 @@
1
- {"version":3,"file":"voiceStream.js","sourceRoot":"","sources":["../../src/ai/voiceStream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"voiceStream.js","sourceRoot":"","sources":["../../src/ai/voiceStream.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"legacyBusAdapter.d.ts","sourceRoot":"","sources":["../../src/handlers/legacyBusAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,EA6FzC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,cAAc,EACvB,KAAK,GAAE,SAAS,WAAW,EAAqB,GAC/C,IAAI,CA4BN"}
1
+ {"version":3,"file":"legacyBusAdapter.d.ts","sourceRoot":"","sources":["../../src/handlers/legacyBusAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,EAqGzC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,cAAc,EACvB,KAAK,GAAE,SAAS,WAAW,EAAqB,GAC/C,IAAI,CA4BN"}