@voxagent/bridge 0.1.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 (70) hide show
  1. package/README.md +74 -0
  2. package/dist/audio/source.d.ts +23 -0
  3. package/dist/audio/source.d.ts.map +1 -0
  4. package/dist/audio/source.js +69 -0
  5. package/dist/audio/source.js.map +1 -0
  6. package/dist/cli.d.ts +13 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +171 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +62 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +102 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/drivers/claude.d.ts +36 -0
  15. package/dist/drivers/claude.d.ts.map +1 -0
  16. package/dist/drivers/claude.js +445 -0
  17. package/dist/drivers/claude.js.map +1 -0
  18. package/dist/drivers/codex.d.ts +56 -0
  19. package/dist/drivers/codex.d.ts.map +1 -0
  20. package/dist/drivers/codex.js +652 -0
  21. package/dist/drivers/codex.js.map +1 -0
  22. package/dist/drivers/index.d.ts +34 -0
  23. package/dist/drivers/index.d.ts.map +1 -0
  24. package/dist/drivers/index.js +18 -0
  25. package/dist/drivers/index.js.map +1 -0
  26. package/dist/drivers/types.d.ts +81 -0
  27. package/dist/drivers/types.d.ts.map +1 -0
  28. package/dist/drivers/types.js +11 -0
  29. package/dist/drivers/types.js.map +1 -0
  30. package/dist/index.d.ts +6 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +5 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/logging.d.ts +15 -0
  35. package/dist/logging.d.ts.map +1 -0
  36. package/dist/logging.js +36 -0
  37. package/dist/logging.js.map +1 -0
  38. package/dist/pair.d.ts +25 -0
  39. package/dist/pair.d.ts.map +1 -0
  40. package/dist/pair.js +41 -0
  41. package/dist/pair.js.map +1 -0
  42. package/dist/permissions.d.ts +67 -0
  43. package/dist/permissions.d.ts.map +1 -0
  44. package/dist/permissions.js +221 -0
  45. package/dist/permissions.js.map +1 -0
  46. package/dist/protocol.d.ts +181 -0
  47. package/dist/protocol.d.ts.map +1 -0
  48. package/dist/protocol.js +63 -0
  49. package/dist/protocol.js.map +1 -0
  50. package/dist/room.d.ts +52 -0
  51. package/dist/room.d.ts.map +1 -0
  52. package/dist/room.js +401 -0
  53. package/dist/room.js.map +1 -0
  54. package/dist/tts/elevenlabs.d.ts +43 -0
  55. package/dist/tts/elevenlabs.d.ts.map +1 -0
  56. package/dist/tts/elevenlabs.js +268 -0
  57. package/dist/tts/elevenlabs.js.map +1 -0
  58. package/dist/tts/index.d.ts +22 -0
  59. package/dist/tts/index.d.ts.map +1 -0
  60. package/dist/tts/index.js +23 -0
  61. package/dist/tts/index.js.map +1 -0
  62. package/dist/tts/openai.d.ts +35 -0
  63. package/dist/tts/openai.d.ts.map +1 -0
  64. package/dist/tts/openai.js +270 -0
  65. package/dist/tts/openai.js.map +1 -0
  66. package/dist/tts/types.d.ts +28 -0
  67. package/dist/tts/types.d.ts.map +1 -0
  68. package/dist/tts/types.js +5 -0
  69. package/dist/tts/types.js.map +1 -0
  70. package/package.json +68 -0
@@ -0,0 +1,445 @@
1
+ /**
2
+ * @file Claude Code driver — drives `@anthropic-ai/claude-agent-sdk`.
3
+ *
4
+ * Translates the SDK's `SDKMessage` and `SDKStreamEvent` outputs into our
5
+ * normalized `DriverEvent` stream.
6
+ *
7
+ * Streaming details (per SDK reference):
8
+ * - With `includePartialMessages: true`, every Anthropic API event is
9
+ * emitted as a `stream_event` SDKMessage.
10
+ * - Text deltas: `content_block_delta` with `delta.type === 'text_delta'`.
11
+ * - Tool start: `content_block_start` where `content_block.type === 'tool_use'`.
12
+ * - Tool input streaming: `content_block_delta` with `input_json_delta`.
13
+ * - Tool end: `content_block_stop`.
14
+ * - Tool results / progress: surface via `user` messages with tool_result
15
+ * blocks (post-execution); we use these to flag success/error + payload.
16
+ * - Run end: `result` SDKMessage; subtype `success` / `error_*` / `interrupted`.
17
+ */
18
+ import { query } from '@anthropic-ai/claude-agent-sdk';
19
+ import { homedir } from 'node:os';
20
+ import { readdir, readFile, stat } from 'node:fs/promises';
21
+ import { join } from 'node:path';
22
+ import { randomUUID } from 'node:crypto';
23
+ import { log } from '../logging.js';
24
+ const BRIDGE_VERSION = '0.1.0';
25
+ export class ClaudeDriver {
26
+ options;
27
+ backend = 'claude';
28
+ /** Most recent Claude Code session ID, used to keep room context across turns. */
29
+ sessionId = null;
30
+ /** Currently active query handle, used for `interrupt()`. */
31
+ activeQuery = null;
32
+ constructor(options = {}) {
33
+ this.options = options;
34
+ }
35
+ async capabilities(cwd) {
36
+ const [skills, plugins, mcpServers] = await Promise.all([
37
+ this.discoverSkills(cwd),
38
+ this.discoverPlugins(),
39
+ this.discoverMcpServers(),
40
+ ]);
41
+ return {
42
+ backend: 'claude',
43
+ skills,
44
+ plugins,
45
+ mcpServers,
46
+ cwd,
47
+ bridgeVersion: BRIDGE_VERSION,
48
+ };
49
+ }
50
+ async *run(input, signal) {
51
+ const runId = randomUUID();
52
+ const startedAtMs = Date.now();
53
+ yield { type: 'run_start', runId, startedAtMs };
54
+ const openTools = new Map();
55
+ let finalText = '';
56
+ let runEnded = false;
57
+ // Permission strategy:
58
+ // - fullAccess=true → bypassPermissions, no broker is consulted.
59
+ // - fullAccess=false + a resolver → permissionMode 'default' so every
60
+ // tool call routes through canUseTool, where the resolver auto-allows
61
+ // reads + writes inside the workspace and asks the room for the rest.
62
+ // - fullAccess=false without a resolver → fall back to acceptEdits
63
+ // (legacy behavior for callers that haven't wired the broker yet).
64
+ const resolver = this.options.permissionResolver;
65
+ const useBroker = !this.options.fullAccess && Boolean(resolver);
66
+ const queryOptions = {
67
+ includePartialMessages: true,
68
+ cwd: input.cwd,
69
+ permissionMode: this.options.fullAccess
70
+ ? 'bypassPermissions'
71
+ : useBroker
72
+ ? 'default'
73
+ : 'acceptEdits',
74
+ settingSources: ['user', 'project'],
75
+ ...(this.options.model ? { model: this.options.model } : {}),
76
+ ...(this.sessionId ? { resume: this.sessionId } : {}),
77
+ ...(input.systemPromptAddendum
78
+ ? { systemPrompt: { type: 'preset', preset: 'claude_code', append: input.systemPromptAddendum } }
79
+ : {}),
80
+ ...(useBroker && resolver
81
+ ? {
82
+ canUseTool: async (toolName, toolInput) => {
83
+ const result = await resolver.decide({
84
+ runId,
85
+ toolName,
86
+ toolInput,
87
+ });
88
+ if (result.decision === 'allow') {
89
+ return { behavior: 'allow', updatedInput: toolInput };
90
+ }
91
+ return {
92
+ behavior: 'deny',
93
+ message: result.message ?? 'Denied by host.',
94
+ };
95
+ },
96
+ }
97
+ : {}),
98
+ };
99
+ let iter;
100
+ try {
101
+ iter = query({
102
+ prompt: input.prompt,
103
+ options: queryOptions,
104
+ });
105
+ }
106
+ catch (error) {
107
+ yield {
108
+ type: 'run_end',
109
+ runId,
110
+ reason: 'error',
111
+ message: error instanceof Error ? error.message : String(error),
112
+ totalLatencyMs: Date.now() - startedAtMs,
113
+ };
114
+ return;
115
+ }
116
+ this.activeQuery = iter;
117
+ const onAbort = () => {
118
+ iter.interrupt().catch((error) => {
119
+ log.warn('claude_query_interrupt_failed', {
120
+ message: error instanceof Error ? error.message : String(error),
121
+ });
122
+ });
123
+ };
124
+ if (signal.aborted)
125
+ onAbort();
126
+ else
127
+ signal.addEventListener('abort', onAbort, { once: true });
128
+ try {
129
+ for await (const message of iter) {
130
+ if (message.type === 'system' && message.subtype === 'init') {
131
+ this.sessionId = message.session_id ?? this.sessionId;
132
+ continue;
133
+ }
134
+ if (message.type === 'stream_event') {
135
+ const events = handleStreamEvent(message, runId, openTools);
136
+ for (const event of events)
137
+ yield event;
138
+ continue;
139
+ }
140
+ if (message.type === 'assistant') {
141
+ // Bundled assistant message arrives at end of turn even when streaming.
142
+ // Capture final text for the text_done event.
143
+ const text = extractAssistantText(message);
144
+ if (text)
145
+ finalText = text;
146
+ continue;
147
+ }
148
+ if (message.type === 'user') {
149
+ // Tool results arrive as user messages with tool_result blocks.
150
+ const toolResults = extractToolResults(message);
151
+ for (const result of toolResults) {
152
+ // Find an open tool by matching tool_use_id (fallback: most-recent open).
153
+ const matchedKey = findOpenToolKey(openTools, result.toolUseId);
154
+ const open = matchedKey !== null ? openTools.get(matchedKey) : null;
155
+ const latencyMs = open ? Date.now() - open.startedAtMs : undefined;
156
+ yield {
157
+ type: 'tool_use_end',
158
+ runId,
159
+ toolUseId: result.toolUseId,
160
+ status: result.isError ? 'error' : 'success',
161
+ output: result.content,
162
+ ...(latencyMs !== undefined ? { latencyMs } : {}),
163
+ };
164
+ if (matchedKey !== null)
165
+ openTools.delete(matchedKey);
166
+ }
167
+ continue;
168
+ }
169
+ if (message.type === 'result') {
170
+ const reason = undefined;
171
+ let resultReason = 'completed';
172
+ let resultMessage;
173
+ if (message.subtype === 'success') {
174
+ resultReason = 'completed';
175
+ if (message.result)
176
+ finalText = message.result;
177
+ }
178
+ else if (message.subtype === 'error_max_turns') {
179
+ resultReason = 'error';
180
+ resultMessage = 'Max turns reached.';
181
+ }
182
+ else if (message.subtype === 'error_during_execution') {
183
+ resultReason = 'error';
184
+ resultMessage = 'Error during execution.';
185
+ }
186
+ else {
187
+ resultReason = signal.aborted ? 'interrupted' : 'error';
188
+ }
189
+ this.sessionId = message.session_id ?? this.sessionId;
190
+ // Emit text_done before run_end if we have buffered text.
191
+ if (finalText) {
192
+ yield { type: 'text_done', runId, text: finalText };
193
+ }
194
+ yield {
195
+ type: 'run_end',
196
+ runId,
197
+ reason: resultReason,
198
+ ...(resultMessage ? { message: resultMessage } : {}),
199
+ totalLatencyMs: Date.now() - startedAtMs,
200
+ };
201
+ runEnded = true;
202
+ // Avoid unused tag.
203
+ void reason;
204
+ break;
205
+ }
206
+ }
207
+ }
208
+ catch (error) {
209
+ const message = error instanceof Error ? error.message : String(error);
210
+ if (signal.aborted) {
211
+ if (!runEnded) {
212
+ yield {
213
+ type: 'run_end',
214
+ runId,
215
+ reason: 'interrupted',
216
+ totalLatencyMs: Date.now() - startedAtMs,
217
+ };
218
+ }
219
+ }
220
+ else {
221
+ log.error('claude_driver_run_failed', { message });
222
+ if (!runEnded) {
223
+ yield {
224
+ type: 'run_end',
225
+ runId,
226
+ reason: 'error',
227
+ message,
228
+ totalLatencyMs: Date.now() - startedAtMs,
229
+ };
230
+ }
231
+ }
232
+ }
233
+ finally {
234
+ signal.removeEventListener('abort', onAbort);
235
+ this.activeQuery = null;
236
+ }
237
+ if (!runEnded) {
238
+ // Defensive: ensure we always emit run_end even if the SDK exited without `result`.
239
+ if (finalText)
240
+ yield { type: 'text_done', runId, text: finalText };
241
+ yield {
242
+ type: 'run_end',
243
+ runId,
244
+ reason: signal.aborted ? 'interrupted' : 'completed',
245
+ totalLatencyMs: Date.now() - startedAtMs,
246
+ };
247
+ }
248
+ }
249
+ async close() {
250
+ if (this.activeQuery) {
251
+ try {
252
+ await this.activeQuery.interrupt();
253
+ }
254
+ catch {
255
+ // best-effort
256
+ }
257
+ this.activeQuery = null;
258
+ }
259
+ }
260
+ async discoverSkills(cwd) {
261
+ const found = new Set();
262
+ const candidates = [
263
+ join(homedir(), '.claude', 'skills'),
264
+ join(cwd, '.claude', 'skills'),
265
+ ];
266
+ for (const dir of candidates) {
267
+ try {
268
+ const entries = await readdir(dir, { withFileTypes: true });
269
+ for (const entry of entries) {
270
+ if (!entry.isDirectory())
271
+ continue;
272
+ const skillDir = join(dir, entry.name);
273
+ // SKILL.md presence is the marker
274
+ try {
275
+ const skillFile = join(skillDir, 'SKILL.md');
276
+ const stats = await stat(skillFile);
277
+ if (stats.isFile())
278
+ found.add(entry.name);
279
+ }
280
+ catch {
281
+ // skip
282
+ }
283
+ }
284
+ }
285
+ catch {
286
+ // skip missing dir
287
+ }
288
+ }
289
+ return [...found].sort();
290
+ }
291
+ async discoverPlugins() {
292
+ const settingsPath = join(homedir(), '.claude', 'settings.json');
293
+ try {
294
+ const text = await readFile(settingsPath, 'utf-8');
295
+ const parsed = JSON.parse(text);
296
+ if (Array.isArray(parsed.plugins)) {
297
+ return parsed.plugins.filter((value) => typeof value === 'string').sort();
298
+ }
299
+ if (parsed.plugins && typeof parsed.plugins === 'object') {
300
+ return Object.keys(parsed.plugins).sort();
301
+ }
302
+ return [];
303
+ }
304
+ catch {
305
+ return [];
306
+ }
307
+ }
308
+ async discoverMcpServers() {
309
+ const settingsPath = join(homedir(), '.claude', 'settings.json');
310
+ try {
311
+ const text = await readFile(settingsPath, 'utf-8');
312
+ const parsed = JSON.parse(text);
313
+ if (parsed.mcpServers && typeof parsed.mcpServers === 'object') {
314
+ return Object.keys(parsed.mcpServers).sort();
315
+ }
316
+ return [];
317
+ }
318
+ catch {
319
+ return [];
320
+ }
321
+ }
322
+ }
323
+ function extractAssistantText(message) {
324
+ const blocks = message.message?.content;
325
+ if (!Array.isArray(blocks))
326
+ return '';
327
+ return blocks
328
+ .filter((block) => block.type === 'text' && typeof block.text === 'string')
329
+ .map((block) => block.text)
330
+ .join('');
331
+ }
332
+ function extractToolResults(message) {
333
+ const blocks = message.message?.content;
334
+ if (!Array.isArray(blocks))
335
+ return [];
336
+ return blocks
337
+ .filter((block) => block.type === 'tool_result' && typeof block.tool_use_id === 'string')
338
+ .map((block) => ({
339
+ toolUseId: block.tool_use_id,
340
+ isError: block.is_error === true,
341
+ content: block.content,
342
+ }));
343
+ }
344
+ function findOpenToolKey(map, toolUseId) {
345
+ for (const [key, value] of map.entries()) {
346
+ if (value.toolUseId === toolUseId)
347
+ return key;
348
+ }
349
+ return null;
350
+ }
351
+ function handleStreamEvent(message, runId, openTools) {
352
+ const event = message.event;
353
+ if (!event || typeof event !== 'object')
354
+ return [];
355
+ const eventType = event.type;
356
+ if (eventType === 'content_block_start') {
357
+ const index = event.index ?? -1;
358
+ const block = event.content_block;
359
+ if (block && block.type === 'tool_use') {
360
+ const toolUseId = typeof block.id === 'string' && block.id.length > 0 ? block.id : `tool_${runId}_${index}`;
361
+ const name = typeof block.name === 'string' ? block.name : 'unknown';
362
+ const initialInput = block.input;
363
+ const hasInlineInput = initialInput !== undefined &&
364
+ initialInput !== null &&
365
+ !(typeof initialInput === 'object' && Object.keys(initialInput).length === 0);
366
+ const open = {
367
+ toolUseId,
368
+ name,
369
+ inputJsonBuffer: '',
370
+ // Set when we actually emit `tool_use_start` so the latency clock
371
+ // matches the visible "started at" timestamp in the UI. For the
372
+ // streaming-input path we set it later in `content_block_stop`.
373
+ startedAtMs: hasInlineInput ? Date.now() : 0,
374
+ startEmitted: hasInlineInput,
375
+ };
376
+ openTools.set(index, open);
377
+ // Common case: input streams in via input_json_delta — defer the start
378
+ // event until content_block_stop so it carries the parsed input.
379
+ if (!hasInlineInput)
380
+ return [];
381
+ return [
382
+ {
383
+ type: 'tool_use_start',
384
+ runId,
385
+ toolUseId,
386
+ name,
387
+ input: initialInput,
388
+ },
389
+ ];
390
+ }
391
+ return [];
392
+ }
393
+ if (eventType === 'content_block_delta') {
394
+ const index = event.index ?? -1;
395
+ const delta = event.delta;
396
+ if (!delta || typeof delta !== 'object')
397
+ return [];
398
+ if (delta.type === 'text_delta' && typeof delta.text === 'string') {
399
+ return [{ type: 'text_delta', runId, delta: delta.text }];
400
+ }
401
+ if (delta.type === 'thinking_delta' && typeof delta.thinking === 'string') {
402
+ return [{ type: 'thinking_delta', runId, delta: delta.thinking }];
403
+ }
404
+ if (delta.type === 'input_json_delta' && typeof delta.partial_json === 'string') {
405
+ const open = openTools.get(index);
406
+ if (open) {
407
+ open.inputJsonBuffer += delta.partial_json;
408
+ }
409
+ return [];
410
+ }
411
+ return [];
412
+ }
413
+ if (eventType === 'content_block_stop') {
414
+ const index = event.index ?? -1;
415
+ const open = openTools.get(index);
416
+ if (open && !open.startEmitted) {
417
+ // Streaming-input case: now that the content block is closed and we
418
+ // have the full input JSON, emit the deferred `tool_use_start` with
419
+ // the parsed payload so the UI shows the real input on first render.
420
+ let parsedInput = {};
421
+ try {
422
+ parsedInput =
423
+ open.inputJsonBuffer.length > 0 ? JSON.parse(open.inputJsonBuffer) : {};
424
+ }
425
+ catch {
426
+ parsedInput = { _raw: open.inputJsonBuffer };
427
+ }
428
+ open.startEmitted = true;
429
+ // Start the latency clock here — same instant the UI sees the tool begin.
430
+ open.startedAtMs = Date.now();
431
+ return [
432
+ {
433
+ type: 'tool_use_start',
434
+ runId,
435
+ toolUseId: open.toolUseId,
436
+ name: open.name,
437
+ input: parsedInput,
438
+ },
439
+ ];
440
+ }
441
+ return [];
442
+ }
443
+ return [];
444
+ }
445
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/drivers/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @file Codex driver — drives `codex app-server` over line-delimited JSON-RPC 2.0.
3
+ *
4
+ * Why app-server instead of `codex exec --json`:
5
+ * `exec --json` does not support pause/resume approvals — when an action
6
+ * would normally trigger a prompt, exec mode treats it as a hard failure.
7
+ * The app-server transport (`codex app-server`, default stdio) is a proper
8
+ * JSON-RPC 2.0 channel where Codex sends server-initiated approval
9
+ * requests (`item/commandExecution/requestApproval`,
10
+ * `item/fileChange/requestApproval`) that we respond to via the same
11
+ * JSON-RPC envelope. That lets us route approvals through the bridge's
12
+ * PermissionBroker to a meeting-side Allow / Deny modal.
13
+ *
14
+ * Lifecycle:
15
+ * - One long-lived `codex app-server` subprocess per CodexDriver instance.
16
+ * Spawned lazily on the first run() so capabilities() stays cheap.
17
+ * - `initialize` request once, `thread/start` on the first run, then
18
+ * `turn/start` for each subsequent run() call (threadId reused so Codex
19
+ * keeps conversation context across turns).
20
+ * - On run abort: `turn/interrupt` for the active turn.
21
+ * - On close(): SIGTERM the process and reject pending requests.
22
+ *
23
+ * The streaming JSON-RPC types and notification methods are taken from
24
+ * `codex app-server generate-ts` output (see /tmp/codex-protocol).
25
+ */
26
+ import type { CapabilitiesInfo } from '../protocol.js';
27
+ import type { DriverOptions } from './index.js';
28
+ import type { AgentDriver, DriverEvent, DriverRunInput } from './types.js';
29
+ export declare class CodexDriver implements AgentDriver {
30
+ private readonly options;
31
+ readonly backend: "codex";
32
+ private proc;
33
+ private threadId;
34
+ private nextRequestId;
35
+ private pending;
36
+ private activeTurn;
37
+ private rxBuffer;
38
+ private serverStartFailed;
39
+ constructor(options?: DriverOptions);
40
+ capabilities(cwd: string): Promise<CapabilitiesInfo>;
41
+ run(input: DriverRunInput, signal: AbortSignal): AsyncIterable<DriverEvent>;
42
+ close(): Promise<void>;
43
+ private ensureServer;
44
+ private onStdout;
45
+ private dispatch;
46
+ private handleResponse;
47
+ private handleServerRequest;
48
+ private handleApproval;
49
+ private handleNotification;
50
+ private handleItemStarted;
51
+ private handleItemCompleted;
52
+ private sendRequest;
53
+ private sendResponse;
54
+ private discoverMcpServers;
55
+ }
56
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/drivers/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAyJ3E,qBAAa,WAAY,YAAW,WAAW;IAWjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAVpC,QAAQ,CAAC,OAAO,EAAG,OAAO,CAAU;IAEpC,OAAO,CAAC,IAAI,CAA+C;IAC3D,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAA0F;IACzG,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,iBAAiB,CAAS;gBAEL,OAAO,GAAE,aAAkB;IAElD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAYnD,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;IAiJ5E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBd,YAAY;IA+C1B,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,mBAAmB;YAeb,cAAc;IA2B5B,OAAO,CAAC,kBAAkB;IAwG1B,OAAO,CAAC,iBAAiB;IAmDzB,OAAO,CAAC,mBAAmB;IAyE3B,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,YAAY;YAeN,kBAAkB;CAejC"}