@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.
- package/dist/ai/cardBuilder.d.ts +21 -2
- package/dist/ai/cardBuilder.d.ts.map +1 -1
- package/dist/ai/cardBuilder.js +100 -6
- package/dist/ai/cardBuilder.js.map +1 -1
- package/dist/ai/claudeCliProvider.d.ts +25 -2
- package/dist/ai/claudeCliProvider.d.ts.map +1 -1
- package/dist/ai/claudeCliProvider.js +76 -19
- package/dist/ai/claudeCliProvider.js.map +1 -1
- package/dist/ai/codexAppServer/cardAdapter.d.ts.map +1 -1
- package/dist/ai/codexAppServer/cardAdapter.js +87 -7
- package/dist/ai/codexAppServer/cardAdapter.js.map +1 -1
- package/dist/ai/codexAppServer/provider.d.ts +3 -0
- package/dist/ai/codexAppServer/provider.d.ts.map +1 -1
- package/dist/ai/codexAppServer/provider.js +15 -4
- package/dist/ai/codexAppServer/provider.js.map +1 -1
- package/dist/ai/codexMcpProvider.d.ts.map +1 -1
- package/dist/ai/codexMcpProvider.js +6 -0
- package/dist/ai/codexMcpProvider.js.map +1 -1
- package/dist/ai/provider.d.ts +3 -0
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js.map +1 -1
- package/dist/ai/queuedUserPrompts.d.ts +6 -0
- package/dist/ai/queuedUserPrompts.d.ts.map +1 -1
- package/dist/ai/queuedUserPrompts.js +9 -0
- package/dist/ai/queuedUserPrompts.js.map +1 -1
- package/dist/ai/realtimeTranscription.d.ts +2 -0
- package/dist/ai/realtimeTranscription.d.ts.map +1 -1
- package/dist/ai/realtimeTranscription.js +14 -0
- package/dist/ai/realtimeTranscription.js.map +1 -1
- package/dist/ai/sessionManager.d.ts +12 -0
- package/dist/ai/sessionManager.d.ts.map +1 -1
- package/dist/ai/sessionManager.js +73 -12
- package/dist/ai/sessionManager.js.map +1 -1
- package/dist/ai/voiceIntermediary/historyStore.d.ts +54 -0
- package/dist/ai/voiceIntermediary/historyStore.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/historyStore.js +159 -0
- package/dist/ai/voiceIntermediary/historyStore.js.map +1 -0
- package/dist/ai/voiceIntermediary/index.d.ts +13 -0
- package/dist/ai/voiceIntermediary/index.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/index.js +13 -0
- package/dist/ai/voiceIntermediary/index.js.map +1 -0
- package/dist/ai/voiceIntermediary/llm.d.ts +52 -0
- package/dist/ai/voiceIntermediary/llm.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/llm.js +63 -0
- package/dist/ai/voiceIntermediary/llm.js.map +1 -0
- package/dist/ai/voiceIntermediary/manager.d.ts +58 -0
- package/dist/ai/voiceIntermediary/manager.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/manager.js +134 -0
- package/dist/ai/voiceIntermediary/manager.js.map +1 -0
- package/dist/ai/voiceIntermediary/memory.d.ts +22 -0
- package/dist/ai/voiceIntermediary/memory.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/memory.js +109 -0
- package/dist/ai/voiceIntermediary/memory.js.map +1 -0
- package/dist/ai/voiceIntermediary/session.d.ts +81 -0
- package/dist/ai/voiceIntermediary/session.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/session.js +567 -0
- package/dist/ai/voiceIntermediary/session.js.map +1 -0
- package/dist/ai/voiceIntermediary/tools.d.ts +58 -0
- package/dist/ai/voiceIntermediary/tools.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/tools.js +277 -0
- package/dist/ai/voiceIntermediary/tools.js.map +1 -0
- package/dist/ai/voiceIntermediary/tts.d.ts +28 -0
- package/dist/ai/voiceIntermediary/tts.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/tts.js +66 -0
- package/dist/ai/voiceIntermediary/tts.js.map +1 -0
- package/dist/ai/voiceLog.d.ts +18 -0
- package/dist/ai/voiceLog.d.ts.map +1 -0
- package/dist/ai/voiceLog.js +74 -0
- package/dist/ai/voiceLog.js.map +1 -0
- package/dist/ai/voiceStream.d.ts +5 -0
- package/dist/ai/voiceStream.d.ts.map +1 -1
- package/dist/ai/voiceStream.js +29 -5
- package/dist/ai/voiceStream.js.map +1 -1
- package/dist/handlers/legacyBusAdapter.d.ts.map +1 -1
- package/dist/handlers/legacyBusAdapter.js +8 -0
- package/dist/handlers/legacyBusAdapter.js.map +1 -1
- package/dist/handlers/messageHandler.d.ts +14 -0
- package/dist/handlers/messageHandler.d.ts.map +1 -1
- package/dist/handlers/messageHandler.js +150 -1
- package/dist/handlers/messageHandler.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/service/ipcClient.js +1 -1
- package/dist/service/run.d.ts.map +1 -1
- package/dist/service/run.js +14 -1
- package/dist/service/run.js.map +1 -1
- package/dist/service/types.js +1 -1
- 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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"}
|
package/dist/ai/voiceStream.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/ai/voiceStream.js
CHANGED
|
@@ -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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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":"AA0BA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;
|
|
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,
|
|
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"}
|