zilmate 1.0.1 → 1.3.0

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 (77) hide show
  1. package/.env.example +15 -0
  2. package/README.md +100 -1
  3. package/dist/agents/manager.d.ts +133 -0
  4. package/dist/agents/manager.d.ts.map +1 -1
  5. package/dist/agents/manager.js +23 -0
  6. package/dist/agents/manager.js.map +1 -1
  7. package/dist/cli/camera.d.ts +6 -0
  8. package/dist/cli/camera.d.ts.map +1 -0
  9. package/dist/cli/camera.js +27 -0
  10. package/dist/cli/camera.js.map +1 -0
  11. package/dist/cli/doctor.d.ts +4 -0
  12. package/dist/cli/doctor.d.ts.map +1 -1
  13. package/dist/cli/doctor.js +12 -1
  14. package/dist/cli/doctor.js.map +1 -1
  15. package/dist/cli/health.js +2 -0
  16. package/dist/cli/health.js.map +1 -1
  17. package/dist/cli/interactive.d.ts.map +1 -1
  18. package/dist/cli/interactive.js +42 -5
  19. package/dist/cli/interactive.js.map +1 -1
  20. package/dist/cli/menu.d.ts +1 -0
  21. package/dist/cli/menu.d.ts.map +1 -1
  22. package/dist/cli/menu.js +68 -0
  23. package/dist/cli/menu.js.map +1 -1
  24. package/dist/cli/setup.d.ts +12 -0
  25. package/dist/cli/setup.d.ts.map +1 -1
  26. package/dist/cli/setup.js +316 -15
  27. package/dist/cli/setup.js.map +1 -1
  28. package/dist/cli/update.d.ts +8 -0
  29. package/dist/cli/update.d.ts.map +1 -0
  30. package/dist/cli/update.js +94 -0
  31. package/dist/cli/update.js.map +1 -0
  32. package/dist/cli/voice.d.ts +8 -0
  33. package/dist/cli/voice.d.ts.map +1 -0
  34. package/dist/cli/voice.js +189 -0
  35. package/dist/cli/voice.js.map +1 -0
  36. package/dist/cli/welcome.d.ts.map +1 -1
  37. package/dist/cli/welcome.js +19 -0
  38. package/dist/cli/welcome.js.map +1 -1
  39. package/dist/config/env.d.ts +13 -0
  40. package/dist/config/env.d.ts.map +1 -1
  41. package/dist/config/env.js +20 -0
  42. package/dist/config/env.js.map +1 -1
  43. package/dist/config/models.d.ts +1 -0
  44. package/dist/config/models.d.ts.map +1 -1
  45. package/dist/config/models.js +1 -0
  46. package/dist/config/models.js.map +1 -1
  47. package/dist/index.js +259 -4
  48. package/dist/index.js.map +1 -1
  49. package/dist/server.d.ts +4 -0
  50. package/dist/server.d.ts.map +1 -1
  51. package/dist/server.js +12 -0
  52. package/dist/server.js.map +1 -1
  53. package/dist/tools/desktop.tool.d.ts +58 -0
  54. package/dist/tools/desktop.tool.d.ts.map +1 -0
  55. package/dist/tools/desktop.tool.js +433 -0
  56. package/dist/tools/desktop.tool.js.map +1 -0
  57. package/dist/tools/filesystem.tool.d.ts +93 -0
  58. package/dist/tools/filesystem.tool.d.ts.map +1 -0
  59. package/dist/tools/filesystem.tool.js +303 -0
  60. package/dist/tools/filesystem.tool.js.map +1 -0
  61. package/dist/voice/cascade.d.ts +15 -0
  62. package/dist/voice/cascade.d.ts.map +1 -0
  63. package/dist/voice/cascade.js +306 -0
  64. package/dist/voice/cascade.js.map +1 -0
  65. package/dist/voice/deepgram.d.ts +22 -0
  66. package/dist/voice/deepgram.d.ts.map +1 -0
  67. package/dist/voice/deepgram.js +257 -0
  68. package/dist/voice/deepgram.js.map +1 -0
  69. package/dist/voice/terminal.d.ts +27 -0
  70. package/dist/voice/terminal.d.ts.map +1 -0
  71. package/dist/voice/terminal.js +448 -0
  72. package/dist/voice/terminal.js.map +1 -0
  73. package/dist/voice/types.d.ts +45 -0
  74. package/dist/voice/types.d.ts.map +1 -0
  75. package/dist/voice/types.js +2 -0
  76. package/dist/voice/types.js.map +1 -0
  77. package/package.json +4 -1
@@ -0,0 +1,448 @@
1
+ import { execFile, spawn } from 'node:child_process';
2
+ import { once } from 'node:events';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { randomUUID } from 'node:crypto';
6
+ import { writeFile, rm } from 'node:fs/promises';
7
+ import { promisify } from 'node:util';
8
+ import { stdin as input } from 'node:process';
9
+ import { env } from '../config/env.js';
10
+ import { speakWithDeepgram, startCascadedVoiceSession } from './cascade.js';
11
+ const execFileAsync = promisify(execFile);
12
+ async function commandExists(command) {
13
+ const probe = process.platform === 'win32' ? 'where.exe' : 'which';
14
+ try {
15
+ await execFileAsync(probe, [command], { windowsHide: true, timeout: 5000 });
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ function voiceInputDevice() {
23
+ return process.env.ZILMATE_VOICE_INPUT_DEVICE || '';
24
+ }
25
+ function parseWindowsAudioDevices(output) {
26
+ const names = new Set();
27
+ for (const line of output.split(/\r?\n/)) {
28
+ if (/Alternative name/i.test(line))
29
+ continue;
30
+ const match = /"([^"]+)"\s+\(audio\)/i.exec(line);
31
+ if (match?.[1])
32
+ names.add(match[1]);
33
+ }
34
+ return [...names].map((name) => ({ name, input: `audio=${name}` }));
35
+ }
36
+ function parseMacAudioDevices(output) {
37
+ const audioSection = output.split('AVFoundation audio devices:')[1] || output;
38
+ return [...audioSection.matchAll(/\[(\d+)\]\s+(.+)/g)]
39
+ .map((match) => ({ name: match[2].trim(), input: `:${match[1]}` }))
40
+ .filter((device) => !/AVFoundation video devices/i.test(device.name));
41
+ }
42
+ export async function listTerminalVoiceInputDevices() {
43
+ if (!(await commandExists('ffmpeg')))
44
+ return [];
45
+ try {
46
+ if (process.platform === 'win32') {
47
+ const result = await execFileAsync('ffmpeg', ['-hide_banner', '-list_devices', 'true', '-f', 'dshow', '-i', 'dummy'], { timeout: 15_000, maxBuffer: 2_000_000 });
48
+ return parseWindowsAudioDevices(`${result.stdout}\n${result.stderr}`);
49
+ }
50
+ if (process.platform === 'darwin') {
51
+ const result = await execFileAsync('ffmpeg', ['-hide_banner', '-f', 'avfoundation', '-list_devices', 'true', '-i', ''], { timeout: 15_000, maxBuffer: 2_000_000 });
52
+ return parseMacAudioDevices(`${result.stdout}\n${result.stderr}`);
53
+ }
54
+ return [{ name: 'Default PulseAudio input', input: 'default' }];
55
+ }
56
+ catch (error) {
57
+ const output = error && typeof error === 'object'
58
+ ? `${'stdout' in error ? String(error.stdout || '') : ''}\n${'stderr' in error ? String(error.stderr || '') : ''}`
59
+ : '';
60
+ if (process.platform === 'win32') {
61
+ return parseWindowsAudioDevices(output);
62
+ }
63
+ if (process.platform === 'darwin') {
64
+ return parseMacAudioDevices(output);
65
+ }
66
+ return [{ name: 'Default PulseAudio input', input: 'default' }];
67
+ }
68
+ }
69
+ function micArgs(device) {
70
+ const common = ['-hide_banner', '-loglevel', 'error'];
71
+ if (process.platform === 'win32') {
72
+ return [
73
+ ...common,
74
+ '-f',
75
+ 'dshow',
76
+ '-i',
77
+ device,
78
+ '-ac',
79
+ '1',
80
+ '-ar',
81
+ '16000',
82
+ '-f',
83
+ 's16le',
84
+ 'pipe:1',
85
+ ];
86
+ }
87
+ if (process.platform === 'darwin') {
88
+ return [
89
+ ...common,
90
+ '-f',
91
+ 'avfoundation',
92
+ '-i',
93
+ device,
94
+ '-ac',
95
+ '1',
96
+ '-ar',
97
+ '16000',
98
+ '-f',
99
+ 's16le',
100
+ 'pipe:1',
101
+ ];
102
+ }
103
+ return [
104
+ ...common,
105
+ '-f',
106
+ 'pulse',
107
+ '-i',
108
+ device,
109
+ '-ac',
110
+ '1',
111
+ '-ar',
112
+ '16000',
113
+ '-f',
114
+ 's16le',
115
+ 'pipe:1',
116
+ ];
117
+ }
118
+ async function resolveMicInput() {
119
+ const configured = voiceInputDevice();
120
+ if (configured)
121
+ return configured;
122
+ if (process.platform === 'win32') {
123
+ const [firstDevice] = await listTerminalVoiceInputDevices();
124
+ if (!firstDevice) {
125
+ throw new Error('No Windows microphone device was detected. Run `zilmate voice devices`, check Windows microphone privacy settings, or set ZILMATE_VOICE_INPUT_DEVICE.');
126
+ }
127
+ return firstDevice.input;
128
+ }
129
+ if (process.platform === 'darwin')
130
+ return ':0';
131
+ return 'default';
132
+ }
133
+ function playbackArgs() {
134
+ return [
135
+ '-hide_banner',
136
+ '-loglevel',
137
+ 'error',
138
+ '-nodisp',
139
+ '-autoexit',
140
+ '-i',
141
+ '-',
142
+ ];
143
+ }
144
+ function wavHeader(dataBytes, sampleRate = 24000, channels = 1) {
145
+ const header = Buffer.alloc(44);
146
+ const byteRate = sampleRate * channels * 2;
147
+ const blockAlign = channels * 2;
148
+ header.write('RIFF', 0);
149
+ header.writeUInt32LE(36 + dataBytes, 4);
150
+ header.write('WAVE', 8);
151
+ header.write('fmt ', 12);
152
+ header.writeUInt32LE(16, 16);
153
+ header.writeUInt16LE(1, 20);
154
+ header.writeUInt16LE(channels, 22);
155
+ header.writeUInt32LE(sampleRate, 24);
156
+ header.writeUInt32LE(byteRate, 28);
157
+ header.writeUInt16LE(blockAlign, 32);
158
+ header.writeUInt16LE(16, 34);
159
+ header.write('data', 36);
160
+ header.writeUInt32LE(dataBytes, 40);
161
+ return header;
162
+ }
163
+ function wavFromPcm(pcm, sampleRate = 24000, channels = 1) {
164
+ return Buffer.concat([wavHeader(pcm.byteLength, sampleRate, channels), pcm]);
165
+ }
166
+ function streamingWavHeader(sampleRate = 24000, channels = 1) {
167
+ return wavHeader(0xffffffff - 36, sampleRate, channels);
168
+ }
169
+ async function playPcmWithFfplay(pcm, onEvent) {
170
+ if (pcm.byteLength === 0)
171
+ return;
172
+ const file = join(tmpdir(), `zilmate-voice-${randomUUID()}.wav`);
173
+ await writeFile(file, wavFromPcm(pcm));
174
+ const player = spawn('ffplay', ['-hide_banner', '-loglevel', 'error', '-nodisp', '-autoexit', file], { windowsHide: true });
175
+ let stderr = '';
176
+ player.stderr.setEncoding('utf8');
177
+ player.stderr.on('data', (chunk) => {
178
+ stderr += chunk;
179
+ });
180
+ try {
181
+ await waitForChildClose(player);
182
+ if (player.exitCode && player.exitCode !== 0) {
183
+ onEvent?.({
184
+ type: 'error',
185
+ message: `Audio playback failed: ${stderr || `ffplay exited with code ${player.exitCode}`}`,
186
+ timestamp: new Date().toISOString(),
187
+ });
188
+ }
189
+ }
190
+ finally {
191
+ await rm(file, { force: true });
192
+ }
193
+ }
194
+ function playbackMode() {
195
+ return env.zilmateVoicePlaybackMode === 'wav' ? 'wav' : 'stream';
196
+ }
197
+ function createStreamingPlayer(onEvent) {
198
+ const player = spawn('ffplay', playbackArgs(), { windowsHide: true });
199
+ let stderr = '';
200
+ let bytes = 0;
201
+ let started = false;
202
+ player.stderr.setEncoding('utf8');
203
+ player.stderr.on('data', (chunk) => {
204
+ stderr += chunk;
205
+ });
206
+ player.on('error', (error) => {
207
+ onEvent?.({
208
+ type: 'error',
209
+ message: `Audio playback failed to start: ${error instanceof Error ? error.message : String(error)}`,
210
+ timestamp: new Date().toISOString(),
211
+ });
212
+ });
213
+ return {
214
+ write: (chunk) => {
215
+ if (player.stdin.destroyed)
216
+ return;
217
+ if (!started) {
218
+ player.stdin.write(streamingWavHeader());
219
+ started = true;
220
+ }
221
+ bytes += chunk.byteLength;
222
+ player.stdin.write(chunk);
223
+ },
224
+ finish: async () => {
225
+ if (!player.stdin.destroyed)
226
+ player.stdin.end();
227
+ await waitForChildClose(player);
228
+ if (player.exitCode && player.exitCode !== 0) {
229
+ onEvent?.({
230
+ type: 'error',
231
+ message: `Audio playback failed: ${stderr || `ffplay exited with code ${player.exitCode}`}`,
232
+ timestamp: new Date().toISOString(),
233
+ });
234
+ }
235
+ return bytes;
236
+ },
237
+ };
238
+ }
239
+ async function* childStdout(child, signal) {
240
+ let stderr = '';
241
+ child.stderr.setEncoding('utf8');
242
+ child.stderr.on('data', (chunk) => {
243
+ stderr += chunk;
244
+ });
245
+ const onAbort = () => {
246
+ if (!child.killed)
247
+ child.kill('SIGTERM');
248
+ };
249
+ signal.addEventListener('abort', onAbort, { once: true });
250
+ try {
251
+ for await (const chunk of child.stdout) {
252
+ if (signal.aborted)
253
+ break;
254
+ yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
255
+ }
256
+ }
257
+ finally {
258
+ signal.removeEventListener('abort', onAbort);
259
+ if (!child.killed)
260
+ child.kill('SIGTERM');
261
+ const [code] = await once(child, 'close');
262
+ if (!signal.aborted && code !== 0) {
263
+ throw new Error(stderr || `ffmpeg microphone capture exited with code ${code}`);
264
+ }
265
+ }
266
+ }
267
+ async function waitForChildClose(child) {
268
+ if (child.exitCode !== null || child.signalCode !== null || child.killed)
269
+ return;
270
+ await once(child, 'close');
271
+ }
272
+ export async function checkTerminalVoiceRuntime() {
273
+ const checks = [];
274
+ const hasFfmpeg = await commandExists('ffmpeg');
275
+ const hasFfplay = await commandExists('ffplay');
276
+ checks.push({
277
+ name: 'ffmpeg',
278
+ ok: hasFfmpeg,
279
+ detail: hasFfmpeg ? 'ffmpeg is available for microphone capture' : 'Install ffmpeg for terminal microphone capture',
280
+ });
281
+ checks.push({
282
+ name: 'ffplay',
283
+ ok: hasFfplay,
284
+ detail: hasFfplay ? 'ffplay is available for spoken replies' : 'Install ffplay or a full ffmpeg build for spoken replies',
285
+ });
286
+ checks.push({
287
+ name: 'Mic input',
288
+ ok: true,
289
+ detail: voiceInputDevice() || (process.platform === 'win32' ? 'auto-detect first microphone' : process.platform === 'darwin' ? ':0' : 'default'),
290
+ });
291
+ return checks;
292
+ }
293
+ export async function startTerminalVoiceSession(options) {
294
+ const runtime = await checkTerminalVoiceRuntime();
295
+ const missing = runtime.filter((check) => !check.ok);
296
+ if (missing.length > 0) {
297
+ throw new Error(`${missing.map((check) => `${check.name}: ${check.detail}`).join('; ')}. Run \`zilmate voice doctor\`.`);
298
+ }
299
+ const controller = new AbortController();
300
+ const micInput = await resolveMicInput();
301
+ options.onEvent?.({
302
+ type: 'status',
303
+ label: 'Microphone selected',
304
+ detail: micInput,
305
+ timestamp: new Date().toISOString(),
306
+ });
307
+ const mic = spawn('ffmpeg', micArgs(micInput), { windowsHide: true });
308
+ let micStderr = '';
309
+ mic.stderr.setEncoding('utf8');
310
+ mic.stderr.on('data', (chunk) => {
311
+ micStderr += chunk;
312
+ });
313
+ let playbackBytes = 0;
314
+ let replyAudio = [];
315
+ let playbackQueue = Promise.resolve();
316
+ let streamPlayer;
317
+ const stop = () => {
318
+ controller.abort();
319
+ if (!mic.killed)
320
+ mic.kill('SIGTERM');
321
+ };
322
+ let command;
323
+ const stopOnCommand = (chunk) => {
324
+ const text = String(chunk).trim().toLowerCase();
325
+ if (!text || text === '/voice -q' || text === '/voice off' || text === '/voice stop') {
326
+ stop();
327
+ return;
328
+ }
329
+ if (text === '/talk' || text === '/chat' || text === '/text') {
330
+ command = 'talk';
331
+ options.onCommand?.(command);
332
+ stop();
333
+ return;
334
+ }
335
+ if (text === '/exit' || text === '/quit') {
336
+ command = 'exit';
337
+ options.onCommand?.(command);
338
+ stop();
339
+ return;
340
+ }
341
+ options.onEvent?.({
342
+ type: 'status',
343
+ label: 'Voice command ignored',
344
+ detail: 'Use /talk, /voice -q, or /exit',
345
+ timestamp: new Date().toISOString(),
346
+ });
347
+ };
348
+ options.onStopPrompt?.(stop);
349
+ input.resume();
350
+ input.on('data', stopOnCommand);
351
+ try {
352
+ await startCascadedVoiceSession({
353
+ ...(options.sessionId !== undefined ? { sessionId: options.sessionId } : {}),
354
+ audio: childStdout(mic, controller.signal),
355
+ onEvent: (event) => {
356
+ options.onEvent?.(event);
357
+ if (event.type === 'status' && event.label === 'TTS audio flushed') {
358
+ if (playbackMode() === 'stream') {
359
+ const player = streamPlayer;
360
+ streamPlayer = undefined;
361
+ playbackQueue = playbackQueue.then(async () => {
362
+ await player?.finish();
363
+ }).catch((error) => {
364
+ options.onEvent?.({
365
+ type: 'error',
366
+ message: error instanceof Error ? error.message : String(error),
367
+ timestamp: new Date().toISOString(),
368
+ });
369
+ });
370
+ }
371
+ else {
372
+ const pcm = Buffer.concat(replyAudio);
373
+ replyAudio = [];
374
+ playbackQueue = playbackQueue.then(() => playPcmWithFfplay(pcm, options.onEvent)).catch((error) => {
375
+ options.onEvent?.({
376
+ type: 'error',
377
+ message: error instanceof Error ? error.message : String(error),
378
+ timestamp: new Date().toISOString(),
379
+ });
380
+ });
381
+ }
382
+ }
383
+ },
384
+ onUserTranscript: options.onUserTranscript,
385
+ onAudio: (chunk) => {
386
+ playbackBytes += chunk.byteLength;
387
+ const buffer = Buffer.from(chunk);
388
+ if (playbackMode() === 'stream') {
389
+ streamPlayer ??= createStreamingPlayer(options.onEvent);
390
+ streamPlayer.write(buffer);
391
+ }
392
+ else {
393
+ replyAudio.push(buffer);
394
+ }
395
+ },
396
+ });
397
+ await playbackQueue;
398
+ }
399
+ finally {
400
+ input.off('data', stopOnCommand);
401
+ stop();
402
+ if (mic.exitCode && mic.exitCode !== 0 && micStderr) {
403
+ options.onEvent?.({
404
+ type: 'error',
405
+ message: `Microphone capture failed: ${micStderr}`,
406
+ timestamp: new Date().toISOString(),
407
+ });
408
+ }
409
+ if (playbackBytes === 0) {
410
+ options.onEvent?.({
411
+ type: 'status',
412
+ label: 'No TTS audio received',
413
+ detail: 'Deepgram did not send playable audio bytes before the session ended',
414
+ timestamp: new Date().toISOString(),
415
+ });
416
+ }
417
+ }
418
+ return { command };
419
+ }
420
+ export async function playTerminalSpeech(text, options = {}) {
421
+ const runtime = await checkTerminalVoiceRuntime();
422
+ const missing = runtime.filter((check) => check.name === 'ffplay' && !check.ok);
423
+ if (missing.length > 0) {
424
+ throw new Error(`${missing.map((check) => `${check.name}: ${check.detail}`).join('; ')}. Run \`zilmate voice doctor\`.`);
425
+ }
426
+ let audio = [];
427
+ const streamPlayer = playbackMode() === 'stream' ? createStreamingPlayer(options.onEvent) : undefined;
428
+ const result = await speakWithDeepgram(text, {
429
+ ...(options.onEvent !== undefined ? { onEvent: options.onEvent } : {}),
430
+ onAudio: (chunk) => {
431
+ const buffer = Buffer.from(chunk);
432
+ if (streamPlayer) {
433
+ streamPlayer.write(buffer);
434
+ }
435
+ else {
436
+ audio.push(buffer);
437
+ }
438
+ },
439
+ });
440
+ if (streamPlayer) {
441
+ await streamPlayer.finish();
442
+ }
443
+ else {
444
+ await playPcmWithFfplay(Buffer.concat(audio), options.onEvent);
445
+ }
446
+ return result;
447
+ }
448
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/voice/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAuC,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAG5E,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAa1C,KAAK,UAAU,aAAa,CAAC,OAAe;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAc;IAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7C,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc;IAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAC9E,OAAO,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;SACnD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;SACpE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B;IACjD,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAChD,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YACjK,OAAO,wBAAwB,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YACnK,OAAO,oBAAoB,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAC/C,CAAC,CAAC,GAAG,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAE,KAA8B,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAE,KAA8B,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;YACtK,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,MAAc;IAC7B,MAAM,MAAM,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO;YACL,GAAG,MAAM;YACT,IAAI;YACJ,OAAO;YACP,IAAI;YACJ,MAAM;YACN,KAAK;YACL,GAAG;YACH,KAAK;YACL,OAAO;YACP,IAAI;YACJ,OAAO;YACP,QAAQ;SACT,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO;YACL,GAAG,MAAM;YACT,IAAI;YACJ,cAAc;YACd,IAAI;YACJ,MAAM;YACN,KAAK;YACL,GAAG;YACH,KAAK;YACL,OAAO;YACP,IAAI;YACJ,OAAO;YACP,QAAQ;SACT,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,MAAM;QACT,IAAI;QACJ,OAAO;QACP,IAAI;QACJ,MAAM;QACN,KAAK;QACL,GAAG;QACH,KAAK;QACL,OAAO;QACP,IAAI;QACJ,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,6BAA6B,EAAE,CAAC;QAC5D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uJAAuJ,CAAC,CAAC;QAC3K,CAAC;QACD,OAAO,WAAW,CAAC,KAAK,CAAC;IAC3B,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY;IACnB,OAAO;QACL,cAAc;QACd,WAAW;QACX,OAAO;QACP,SAAS;QACT,WAAW;QACX,IAAI;QACJ,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,SAAiB,EAAE,UAAU,GAAG,KAAK,EAAE,QAAQ,GAAG,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxB,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxB,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzB,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7B,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5B,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzB,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,UAAU,GAAG,KAAK,EAAE,QAAQ,GAAG,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAU,GAAG,KAAK,EAAE,QAAQ,GAAG,CAAC;IAC1D,OAAO,SAAS,CAAC,UAAU,GAAG,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,OAA4C;IACxF,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC;QAAE,OAAO;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,UAAU,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5H,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QACjC,MAAM,IAAI,KAAK,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,0BAA0B,MAAM,IAAI,2BAA2B,MAAM,CAAC,QAAQ,EAAE,EAAE;gBAC3F,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,GAAG,CAAC,wBAAwB,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnE,CAAC;AAED,SAAS,qBAAqB,CAAC,OAA4C;IACzE,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QACjC,MAAM,IAAI,KAAK,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,OAAO,EAAE,CAAC;YACR,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,mCAAmC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YACpG,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE;YACvB,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS;gBAAE,OAAO;YACnC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC;gBACzC,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;YACD,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,EAAE,KAAK,IAAI,EAAE;YACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS;gBAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAChD,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC7C,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,0BAA0B,MAAM,IAAI,2BAA2B,MAAM,CAAC,QAAQ,EAAE,EAAE;oBAC3F,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,WAAW,CAAC,KAAqC,EAAE,MAAmB;IACpF,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAChC,MAAM,IAAI,KAAK,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC;IACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM;YAC1B,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,CAAoB,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,8CAA8C,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,KAAqC;IACpE,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO;IACjF,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,MAAM,MAAM,GAAgC,EAAE,CAAC;IAC/C,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,SAAS;QACb,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC,CAAC,gDAAgD;KACpH,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,SAAS;QACb,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,0DAA0D;KAC1H,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,WAAW;QACjB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;KACjJ,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,OAM/C;IACC,MAAM,OAAO,GAAG,MAAM,yBAAyB,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC3H,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAC;IACzC,OAAO,CAAC,OAAO,EAAE,CAAC;QAChB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,qBAAqB;QAC5B,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAC9B,SAAS,IAAI,KAAK,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,UAAU,GAAa,EAAE,CAAC;IAC9B,IAAI,aAAa,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IACtC,IAAI,YAAkE,CAAC;IAEvE,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,IAAI,OAA2B,CAAC;IAChC,MAAM,aAAa,GAAG,CAAC,KAAsB,EAAE,EAAE;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YACrF,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7D,OAAO,GAAG,MAAM,CAAC;YACjB,OAAO,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACzC,OAAO,GAAG,MAAM,CAAC;YACjB,OAAO,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,OAAO,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,uBAAuB;YAC9B,MAAM,EAAE,gCAAgC;YACxC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;IAC7B,KAAK,CAAC,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,yBAAyB,CAAC;YAC9B,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC;YAC1C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;gBACzB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,mBAAmB,EAAE,CAAC;oBACnE,IAAI,YAAY,EAAE,KAAK,QAAQ,EAAE,CAAC;wBAChC,MAAM,MAAM,GAAG,YAAY,CAAC;wBAC5B,YAAY,GAAG,SAAS,CAAC;wBACzB,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;4BAC5C,MAAM,MAAM,EAAE,MAAM,EAAE,CAAC;wBACzB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;4BACjB,OAAO,CAAC,OAAO,EAAE,CAAC;gCAChB,IAAI,EAAE,OAAO;gCACb,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gCAC/D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;6BACpC,CAAC,CAAC;wBACL,CAAC,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBACtC,UAAU,GAAG,EAAE,CAAC;wBAChB,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;4BAChG,OAAO,CAAC,OAAO,EAAE,CAAC;gCAChB,IAAI,EAAE,OAAO;gCACb,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gCAC/D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;6BACpC,CAAC,CAAC;wBACL,CAAC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YACD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,aAAa,IAAI,KAAK,CAAC,UAAU,CAAC;gBAClC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClC,IAAI,YAAY,EAAE,KAAK,QAAQ,EAAE,CAAC;oBAChC,YAAY,KAAK,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxD,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QACH,MAAM,aAAa,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACjC,IAAI,EAAE,CAAC;QACP,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;YACpD,OAAO,CAAC,OAAO,EAAE,CAAC;gBAChB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,8BAA8B,SAAS,EAAE;gBAClD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,OAAO,EAAE,CAAC;gBAChB,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,uBAAuB;gBAC9B,MAAM,EAAE,qEAAqE;gBAC7E,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,UAEnD,EAAE;IACJ,MAAM,OAAO,GAAG,MAAM,yBAAyB,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC3H,CAAC;IAED,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,MAAM,YAAY,GAAG,YAAY,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtG,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE;QAC3C,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { ProgressEvent } from '../runtime/progress.js';
2
+ export type ZilMateVoiceEvent = {
3
+ type: 'status';
4
+ label: string;
5
+ detail?: string;
6
+ timestamp: string;
7
+ } | {
8
+ type: 'transcript';
9
+ role: 'user' | 'assistant' | 'unknown';
10
+ text: string;
11
+ final?: boolean;
12
+ timestamp: string;
13
+ } | {
14
+ type: 'audio';
15
+ bytes: number;
16
+ timestamp: string;
17
+ } | {
18
+ type: 'error';
19
+ message: string;
20
+ timestamp: string;
21
+ };
22
+ export type ZilMateVoiceConfig = {
23
+ enabled: boolean;
24
+ mode: 'agent';
25
+ listenModel: string;
26
+ listenVersion: string;
27
+ ttsModel: string;
28
+ language: string;
29
+ languageHints: string[];
30
+ bargeIn: boolean;
31
+ configured: boolean;
32
+ };
33
+ export type ZilMateVoiceSessionOptions = {
34
+ sessionId?: string;
35
+ audio?: AsyncIterable<Buffer | Uint8Array>;
36
+ onEvent?: (event: ZilMateVoiceEvent) => void;
37
+ onAudio?: (chunk: Uint8Array) => void;
38
+ onUserTranscript?: (text: string) => Promise<string | void> | string | void;
39
+ onProgress?: (event: ProgressEvent) => void;
40
+ };
41
+ export type ZilMateVoiceSessionResult = {
42
+ sessionId: string;
43
+ events: ZilMateVoiceEvent[];
44
+ };
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/voice/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAChH;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/voice/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zilmate",
3
- "version": "1.0.1",
3
+ "version": "1.3.0",
4
4
  "description": "ZilMate CLI multi-agent assistant for ZiloShift workflows.",
5
5
  "type": "module",
6
6
  "main": "dist/server.js",
@@ -50,15 +50,18 @@
50
50
  "dependencies": {
51
51
  "@composio/core": "^0.10.0",
52
52
  "@composio/vercel": "^0.9.2",
53
+ "@deepgram/sdk": "^4.11.2",
53
54
  "@tavily/core": "^0.7.5",
54
55
  "@upstash/redis": "^1.38.0",
55
56
  "ai": "^6.0.198",
56
57
  "chalk": "^5.6.2",
57
58
  "commander": "^15.0.0",
59
+ "cross-fetch": "^4.1.0",
58
60
  "dotenv": "^17.4.2",
59
61
  "marked": "^15.0.12",
60
62
  "marked-terminal": "^7.3.0",
61
63
  "tsx": "^4.22.4",
64
+ "ws": "^8.21.0",
62
65
  "zod": "^4.4.3"
63
66
  },
64
67
  "devDependencies": {