@defai.digital/ax-cli 1.2.3 → 2.0.2

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 (96) hide show
  1. package/README.md +13 -0
  2. package/config/messages.yaml +0 -1
  3. package/config/prompts.yaml +1 -6
  4. package/dist/agent/context-manager.d.ts +9 -8
  5. package/dist/agent/context-manager.js +25 -15
  6. package/dist/agent/context-manager.js.map +1 -1
  7. package/dist/agent/{grok-agent.d.ts → llm-agent.d.ts} +48 -8
  8. package/dist/agent/{grok-agent.js → llm-agent.js} +265 -192
  9. package/dist/agent/llm-agent.js.map +1 -0
  10. package/dist/commands/mcp.js +1 -1
  11. package/dist/commands/mcp.js.map +1 -1
  12. package/dist/commands/setup.d.ts +5 -0
  13. package/dist/commands/setup.js +106 -0
  14. package/dist/commands/setup.js.map +1 -0
  15. package/dist/hooks/use-input-handler.d.ts +3 -3
  16. package/dist/hooks/use-input-handler.js +2 -2
  17. package/dist/hooks/use-input-handler.js.map +1 -1
  18. package/dist/index.js +15 -12
  19. package/dist/index.js.map +1 -1
  20. package/dist/{grok → llm}/client.d.ts +11 -11
  21. package/dist/{grok → llm}/client.js +6 -6
  22. package/dist/llm/client.js.map +1 -0
  23. package/dist/llm/tools.d.ts +8 -0
  24. package/dist/{grok → llm}/tools.js +2 -33
  25. package/dist/llm/tools.js.map +1 -0
  26. package/dist/{grok → llm}/types.d.ts +3 -3
  27. package/dist/llm/types.js.map +1 -0
  28. package/dist/schemas/api-schemas.d.ts +9 -9
  29. package/dist/schemas/api-schemas.js +13 -13
  30. package/dist/schemas/api-schemas.js.map +1 -1
  31. package/dist/tools/bash.js +25 -15
  32. package/dist/tools/bash.js.map +1 -1
  33. package/dist/tools/index.d.ts +0 -1
  34. package/dist/tools/index.js +0 -1
  35. package/dist/tools/index.js.map +1 -1
  36. package/dist/tools/search.d.ts +2 -2
  37. package/dist/tools/search.js +21 -13
  38. package/dist/tools/search.js.map +1 -1
  39. package/dist/tools/text-editor.js +85 -59
  40. package/dist/tools/text-editor.js.map +1 -1
  41. package/dist/tools/todo-tool.js +14 -0
  42. package/dist/tools/todo-tool.js.map +1 -1
  43. package/dist/ui/app.js +1 -1
  44. package/dist/ui/app.js.map +1 -1
  45. package/dist/ui/components/api-key-input.d.ts +2 -2
  46. package/dist/ui/components/api-key-input.js +2 -2
  47. package/dist/ui/components/api-key-input.js.map +1 -1
  48. package/dist/ui/components/chat-history.d.ts +1 -1
  49. package/dist/ui/components/chat-interface.d.ts +2 -2
  50. package/dist/ui/components/chat-interface.js +1 -1
  51. package/dist/ui/components/chat-interface.js.map +1 -1
  52. package/dist/ui/components/mcp-status.js +1 -1
  53. package/dist/ui/components/mcp-status.js.map +1 -1
  54. package/dist/ui/components/model-selection.js +1 -1
  55. package/dist/ui/components/model-selection.js.map +1 -1
  56. package/dist/utils/confirmation-service.d.ts +8 -0
  57. package/dist/utils/confirmation-service.js +26 -0
  58. package/dist/utils/confirmation-service.js.map +1 -1
  59. package/dist/utils/path-validator.d.ts +36 -0
  60. package/dist/utils/path-validator.js +61 -0
  61. package/dist/utils/path-validator.js.map +1 -1
  62. package/dist/utils/prompt-builder.d.ts +0 -1
  63. package/dist/utils/prompt-builder.js +1 -1
  64. package/dist/utils/prompt-builder.js.map +1 -1
  65. package/dist/utils/settings-manager.js +1 -1
  66. package/dist/utils/settings-manager.js.map +1 -1
  67. package/dist/utils/tool-helpers.d.ts +25 -0
  68. package/dist/utils/tool-helpers.js +53 -0
  69. package/dist/utils/tool-helpers.js.map +1 -0
  70. package/package.json +13 -4
  71. package/automatosx.config.json +0 -333
  72. package/dist/agent/grok-agent.js.map +0 -1
  73. package/dist/grok/client.js.map +0 -1
  74. package/dist/grok/tools.d.ts +0 -8
  75. package/dist/grok/tools.js.map +0 -1
  76. package/dist/grok/types.js.map +0 -1
  77. package/dist/tools/morph-editor.d.ts +0 -36
  78. package/dist/tools/morph-editor.js +0 -308
  79. package/dist/tools/morph-editor.js.map +0 -1
  80. package/packages/schemas/dist/index.d.ts +0 -14
  81. package/packages/schemas/dist/index.d.ts.map +0 -1
  82. package/packages/schemas/dist/index.js +0 -19
  83. package/packages/schemas/dist/index.js.map +0 -1
  84. package/packages/schemas/dist/public/core/brand-types.d.ts +0 -308
  85. package/packages/schemas/dist/public/core/brand-types.d.ts.map +0 -1
  86. package/packages/schemas/dist/public/core/brand-types.js +0 -243
  87. package/packages/schemas/dist/public/core/brand-types.js.map +0 -1
  88. package/packages/schemas/dist/public/core/enums.d.ts +0 -227
  89. package/packages/schemas/dist/public/core/enums.d.ts.map +0 -1
  90. package/packages/schemas/dist/public/core/enums.js +0 -222
  91. package/packages/schemas/dist/public/core/enums.js.map +0 -1
  92. package/packages/schemas/dist/public/core/id-types.d.ts +0 -286
  93. package/packages/schemas/dist/public/core/id-types.d.ts.map +0 -1
  94. package/packages/schemas/dist/public/core/id-types.js +0 -136
  95. package/packages/schemas/dist/public/core/id-types.js.map +0 -1
  96. /package/dist/{grok → llm}/types.js +0 -0
@@ -1,17 +1,16 @@
1
- import { GrokClient } from "../grok/client.js";
2
- import { getAllGrokTools, getMCPManager, initializeMCPServers, } from "../grok/tools.js";
1
+ import { LLMClient } from "../llm/client.js";
2
+ import { getAllGrokTools, getMCPManager, initializeMCPServers, } from "../llm/tools.js";
3
3
  import { loadMCPConfig } from "../mcp/config.js";
4
- import { TextEditorTool, MorphEditorTool, BashTool, TodoTool, SearchTool, } from "../tools/index.js";
4
+ import { TextEditorTool, BashTool, TodoTool, SearchTool, } from "../tools/index.js";
5
5
  import { EventEmitter } from "events";
6
6
  import { createTokenCounter } from "../utils/token-counter.js";
7
7
  import { loadCustomInstructions } from "../utils/custom-instructions.js";
8
8
  import { getSettingsManager } from "../utils/settings-manager.js";
9
9
  import { ContextManager } from "./context-manager.js";
10
10
  import { buildSystemPrompt } from "../utils/prompt-builder.js";
11
- export class GrokAgent extends EventEmitter {
12
- grokClient;
11
+ export class LLMAgent extends EventEmitter {
12
+ llmClient;
13
13
  textEditor;
14
- morphEditor;
15
14
  bash;
16
15
  todoTool;
17
16
  search;
@@ -27,9 +26,8 @@ export class GrokAgent extends EventEmitter {
27
26
  const savedModel = manager.getCurrentModel();
28
27
  const modelToUse = model || savedModel || "grok-code-fast-1";
29
28
  this.maxToolRounds = maxToolRounds || 400;
30
- this.grokClient = new GrokClient(apiKey, modelToUse, baseURL);
29
+ this.llmClient = new LLMClient(apiKey, modelToUse, baseURL);
31
30
  this.textEditor = new TextEditorTool();
32
- this.morphEditor = process.env.MORPH_API_KEY ? new MorphEditorTool() : null;
33
31
  this.bash = new BashTool();
34
32
  this.todoTool = new TodoTool();
35
33
  this.search = new SearchTool();
@@ -40,7 +38,6 @@ export class GrokAgent extends EventEmitter {
40
38
  // Build system prompt from YAML configuration
41
39
  const customInstructions = loadCustomInstructions();
42
40
  const systemPrompt = buildSystemPrompt({
43
- hasMorphEditor: !!this.morphEditor,
44
41
  customInstructions: customInstructions || undefined,
45
42
  });
46
43
  // Initialize with system message
@@ -67,7 +64,7 @@ export class GrokAgent extends EventEmitter {
67
64
  });
68
65
  }
69
66
  isGrokModel() {
70
- const currentModel = this.grokClient.getCurrentModel();
67
+ const currentModel = this.llmClient.getCurrentModel();
71
68
  return currentModel.toLowerCase().includes("grok");
72
69
  }
73
70
  // Heuristic: enable web search only when likely needed
@@ -113,7 +110,7 @@ export class GrokAgent extends EventEmitter {
113
110
  let toolRounds = 0;
114
111
  try {
115
112
  const tools = await getAllGrokTools();
116
- let currentResponse = await this.grokClient.chat(this.messages, tools, {
113
+ let currentResponse = await this.llmClient.chat(this.messages, tools, {
117
114
  searchOptions: this.isGrokModel() && this.shouldUseSearchFor(message)
118
115
  ? { search_parameters: { mode: "auto" } }
119
116
  : { search_parameters: { mode: "off" } }
@@ -122,7 +119,7 @@ export class GrokAgent extends EventEmitter {
122
119
  while (toolRounds < maxToolRounds) {
123
120
  const assistantMessage = currentResponse.choices[0]?.message;
124
121
  if (!assistantMessage) {
125
- throw new Error("No response from Grok");
122
+ throw new Error("No response from AI");
126
123
  }
127
124
  // Handle tool calls
128
125
  if (assistantMessage.tool_calls &&
@@ -186,7 +183,7 @@ export class GrokAgent extends EventEmitter {
186
183
  });
187
184
  }
188
185
  // Get next response - this might contain more tool calls
189
- currentResponse = await this.grokClient.chat(this.messages, tools, {
186
+ currentResponse = await this.llmClient.chat(this.messages, tools, {
190
187
  searchOptions: this.isGrokModel() && this.shouldUseSearchFor(message)
191
188
  ? { search_parameters: { mode: "auto" } }
192
189
  : { search_parameters: { mode: "off" } }
@@ -249,6 +246,9 @@ export class GrokAgent extends EventEmitter {
249
246
  else if (Array.isArray(acc[key]) && Array.isArray(value)) {
250
247
  const accArray = acc[key];
251
248
  for (let i = 0; i < value.length; i++) {
249
+ // Validate that value[i] exists before processing
250
+ if (value[i] === undefined || value[i] === null)
251
+ continue;
252
252
  if (!accArray[i])
253
253
  accArray[i] = {};
254
254
  accArray[i] = reduce(accArray[i], value[i]);
@@ -266,9 +266,11 @@ export class GrokAgent extends EventEmitter {
266
266
  }
267
267
  return reduce(previous, item.choices[0].delta);
268
268
  }
269
- async *processUserMessageStream(message) {
270
- // Create new abort controller for this request
271
- this.abortController = new AbortController();
269
+ /**
270
+ * Prepare user message and apply context management
271
+ * Returns the calculated input tokens
272
+ */
273
+ prepareUserMessageForStreaming(message) {
272
274
  // Add user message to conversation
273
275
  const userEntry = {
274
276
  type: "user",
@@ -282,12 +284,12 @@ export class GrokAgent extends EventEmitter {
282
284
  this.messages = this.contextManager.pruneMessages(this.messages, this.tokenCounter);
283
285
  }
284
286
  // Calculate input tokens
285
- let inputTokens = this.tokenCounter.countMessageTokens(this.messages);
286
- yield {
287
- type: "token_count",
288
- tokenCount: inputTokens,
289
- };
290
- // Check for context warnings
287
+ return this.tokenCounter.countMessageTokens(this.messages);
288
+ }
289
+ /**
290
+ * Yield context warnings if needed
291
+ */
292
+ async *yieldContextWarnings() {
291
293
  const stats = this.contextManager.getStats(this.messages, this.tokenCounter);
292
294
  if (stats.shouldPrune || stats.isNearLimit) {
293
295
  const warning = this.contextManager.createWarningMessage(stats);
@@ -296,173 +298,231 @@ export class GrokAgent extends EventEmitter {
296
298
  content: `\n${warning}\n\n`,
297
299
  };
298
300
  }
299
- const maxToolRounds = this.maxToolRounds; // Prevent infinite loops
301
+ }
302
+ /**
303
+ * Check if operation was cancelled
304
+ */
305
+ isCancelled() {
306
+ return this.abortController?.signal.aborted ?? false;
307
+ }
308
+ /**
309
+ * Yield cancellation message
310
+ */
311
+ async *yieldCancellation() {
312
+ yield {
313
+ type: "content",
314
+ content: "\n\n[Operation cancelled by user]",
315
+ };
316
+ yield { type: "done" };
317
+ }
318
+ /**
319
+ * Load tools with error handling
320
+ * Returns tools array, logs error if loading fails
321
+ */
322
+ async loadToolsSafely() {
323
+ try {
324
+ return await getAllGrokTools();
325
+ }
326
+ catch (error) {
327
+ // Log error but don't throw - continue with empty tools
328
+ console.warn(`⚠️ Error loading tools: ${error.message}`);
329
+ return [];
330
+ }
331
+ }
332
+ /**
333
+ * Process streaming chunks and accumulate message
334
+ */
335
+ async *processStreamingChunks(stream, inputTokens, lastTokenUpdate, totalOutputTokens) {
336
+ let accumulatedMessage = {};
337
+ let accumulatedContent = "";
338
+ let toolCallsYielded = false;
339
+ for await (const chunk of stream) {
340
+ // Check for cancellation in the streaming loop
341
+ if (this.isCancelled()) {
342
+ yield* this.yieldCancellation();
343
+ // Return empty state after cancellation to avoid processing partial results
344
+ return { accumulated: {}, content: "", yielded: false };
345
+ }
346
+ if (!chunk.choices?.[0])
347
+ continue;
348
+ // Accumulate the message using reducer
349
+ accumulatedMessage = this.messageReducer(accumulatedMessage, chunk);
350
+ // Check for tool calls - yield when we have complete tool calls with function names
351
+ if (!toolCallsYielded && accumulatedMessage.tool_calls?.length > 0) {
352
+ const hasCompleteTool = accumulatedMessage.tool_calls.some((tc) => tc.function?.name);
353
+ if (hasCompleteTool) {
354
+ yield {
355
+ type: "tool_calls",
356
+ toolCalls: accumulatedMessage.tool_calls,
357
+ };
358
+ toolCallsYielded = true;
359
+ }
360
+ }
361
+ // Stream reasoning content (GLM-4.6 thinking mode)
362
+ if (chunk.choices[0].delta?.reasoning_content) {
363
+ yield {
364
+ type: "reasoning",
365
+ reasoningContent: chunk.choices[0].delta.reasoning_content,
366
+ };
367
+ }
368
+ // Stream content as it comes
369
+ if (chunk.choices[0].delta?.content) {
370
+ accumulatedContent += chunk.choices[0].delta.content;
371
+ // Update token count in real-time
372
+ const currentOutputTokens = this.tokenCounter.estimateStreamingTokens(accumulatedContent) +
373
+ (accumulatedMessage.tool_calls
374
+ ? this.tokenCounter.countTokens(JSON.stringify(accumulatedMessage.tool_calls))
375
+ : 0);
376
+ totalOutputTokens.value = currentOutputTokens;
377
+ yield {
378
+ type: "content",
379
+ content: chunk.choices[0].delta.content,
380
+ };
381
+ // Emit token count update (throttled to 250ms)
382
+ const now = Date.now();
383
+ if (now - lastTokenUpdate.value > 250) {
384
+ lastTokenUpdate.value = now;
385
+ yield {
386
+ type: "token_count",
387
+ tokenCount: inputTokens + totalOutputTokens.value,
388
+ };
389
+ }
390
+ }
391
+ }
392
+ return { accumulated: accumulatedMessage, content: accumulatedContent, yielded: toolCallsYielded };
393
+ }
394
+ /**
395
+ * Add assistant message to history and conversation
396
+ */
397
+ addAssistantMessage(accumulatedMessage) {
398
+ const assistantEntry = {
399
+ type: "assistant",
400
+ content: accumulatedMessage.content || "Using tools to help you...",
401
+ timestamp: new Date(),
402
+ toolCalls: accumulatedMessage.tool_calls || undefined,
403
+ };
404
+ this.chatHistory.push(assistantEntry);
405
+ this.messages.push({
406
+ role: "assistant",
407
+ content: accumulatedMessage.content || "",
408
+ tool_calls: accumulatedMessage.tool_calls,
409
+ });
410
+ }
411
+ /**
412
+ * Execute tool calls and yield results
413
+ */
414
+ async *executeToolCalls(toolCalls, toolCallsYielded, inputTokens, totalOutputTokens) {
415
+ // Only yield tool_calls if we haven't already yielded them during streaming
416
+ if (!toolCallsYielded) {
417
+ yield {
418
+ type: "tool_calls",
419
+ toolCalls,
420
+ };
421
+ }
422
+ // Execute tools
423
+ for (const toolCall of toolCalls) {
424
+ // Check for cancellation before executing each tool
425
+ if (this.isCancelled()) {
426
+ yield* this.yieldCancellation();
427
+ return;
428
+ }
429
+ const result = await this.executeTool(toolCall);
430
+ const toolResultEntry = {
431
+ type: "tool_result",
432
+ content: result.success
433
+ ? result.output || "Success"
434
+ : result.error || "Error occurred",
435
+ timestamp: new Date(),
436
+ toolCall: toolCall,
437
+ toolResult: result,
438
+ };
439
+ this.chatHistory.push(toolResultEntry);
440
+ yield {
441
+ type: "tool_result",
442
+ toolCall,
443
+ toolResult: result,
444
+ };
445
+ // Add tool result with proper format (needed for AI context)
446
+ this.messages.push({
447
+ role: "tool",
448
+ content: result.success
449
+ ? result.output || "Success"
450
+ : result.error || "Error",
451
+ tool_call_id: toolCall.id,
452
+ });
453
+ }
454
+ // Update token count after processing all tool calls
455
+ inputTokens.value = this.tokenCounter.countMessageTokens(this.messages);
456
+ yield {
457
+ type: "token_count",
458
+ tokenCount: inputTokens.value + totalOutputTokens.value,
459
+ };
460
+ }
461
+ async *processUserMessageStream(message) {
462
+ // Create new abort controller for this request
463
+ this.abortController = new AbortController();
464
+ // Prepare user message and get input tokens
465
+ const inputTokensRef = { value: this.prepareUserMessageForStreaming(message) };
466
+ yield {
467
+ type: "token_count",
468
+ tokenCount: inputTokensRef.value,
469
+ };
470
+ // Yield context warnings if needed
471
+ yield* this.yieldContextWarnings();
472
+ const maxToolRounds = this.maxToolRounds;
300
473
  let toolRounds = 0;
301
- let totalOutputTokens = 0;
302
- let lastTokenUpdate = 0;
474
+ const totalOutputTokensRef = { value: 0 };
475
+ const lastTokenUpdateRef = { value: 0 };
303
476
  try {
304
477
  // Agent loop - continue until no more tool calls or max rounds reached
305
478
  while (toolRounds < maxToolRounds) {
306
479
  // Check if operation was cancelled
307
- if (this.abortController?.signal.aborted) {
308
- yield {
309
- type: "content",
310
- content: "\n\n[Operation cancelled by user]",
311
- };
312
- yield { type: "done" };
480
+ if (this.isCancelled()) {
481
+ yield* this.yieldCancellation();
313
482
  return;
314
483
  }
315
- // Stream response and accumulate
316
- let tools;
317
- try {
318
- tools = await getAllGrokTools();
319
- }
320
- catch (error) {
484
+ // Load tools safely
485
+ const tools = await this.loadToolsSafely();
486
+ // Yield warning if no tools available
487
+ if (tools.length === 0) {
321
488
  yield {
322
489
  type: "content",
323
- content: `\n⚠️ Error loading tools: ${error.message}\nContinuing with limited functionality...\n\n`
490
+ content: "\n⚠️ No tools available, continuing with limited functionality...\n\n"
324
491
  };
325
- tools = []; // Continue with no tools
326
492
  }
327
- const stream = this.grokClient.chatStream(this.messages, tools, {
493
+ // Create chat stream
494
+ const stream = this.llmClient.chatStream(this.messages, tools, {
328
495
  searchOptions: this.isGrokModel() && this.shouldUseSearchFor(message)
329
496
  ? { search_parameters: { mode: "auto" } }
330
497
  : { search_parameters: { mode: "off" } }
331
498
  });
332
- let accumulatedMessage = {};
333
- let accumulatedContent = "";
334
- let toolCallsYielded = false;
335
- for await (const chunk of stream) {
336
- // Check for cancellation in the streaming loop
337
- if (this.abortController?.signal.aborted) {
338
- yield {
339
- type: "content",
340
- content: "\n\n[Operation cancelled by user]",
341
- };
342
- yield { type: "done" };
343
- return;
499
+ // Process streaming chunks
500
+ const chunkGen = this.processStreamingChunks(stream, inputTokensRef.value, lastTokenUpdateRef, totalOutputTokensRef);
501
+ let streamResult;
502
+ for await (const chunk of chunkGen) {
503
+ if ('accumulated' in chunk) {
504
+ streamResult = chunk;
344
505
  }
345
- if (!chunk.choices?.[0])
346
- continue;
347
- // Accumulate the message using reducer
348
- accumulatedMessage = this.messageReducer(accumulatedMessage, chunk);
349
- // Check for tool calls - yield when we have complete tool calls with function names
350
- if (!toolCallsYielded && accumulatedMessage.tool_calls?.length > 0) {
351
- // Check if we have at least one complete tool call with a function name
352
- const hasCompleteTool = accumulatedMessage.tool_calls.some((tc) => tc.function?.name);
353
- if (hasCompleteTool) {
354
- yield {
355
- type: "tool_calls",
356
- toolCalls: accumulatedMessage.tool_calls,
357
- };
358
- toolCallsYielded = true;
359
- }
360
- }
361
- // Stream reasoning content (GLM-4.6 thinking mode)
362
- if (chunk.choices[0].delta?.reasoning_content) {
363
- yield {
364
- type: "reasoning",
365
- reasoningContent: chunk.choices[0].delta.reasoning_content,
366
- };
367
- }
368
- // Stream content as it comes
369
- if (chunk.choices[0].delta?.content) {
370
- accumulatedContent += chunk.choices[0].delta.content;
371
- // Update token count in real-time including accumulated content and any tool calls
372
- const currentOutputTokens = this.tokenCounter.estimateStreamingTokens(accumulatedContent) +
373
- (accumulatedMessage.tool_calls
374
- ? this.tokenCounter.countTokens(JSON.stringify(accumulatedMessage.tool_calls))
375
- : 0);
376
- totalOutputTokens = currentOutputTokens;
377
- yield {
378
- type: "content",
379
- content: chunk.choices[0].delta.content,
380
- };
381
- // Emit token count update
382
- const now = Date.now();
383
- if (now - lastTokenUpdate > 250) {
384
- lastTokenUpdate = now;
385
- yield {
386
- type: "token_count",
387
- tokenCount: inputTokens + totalOutputTokens,
388
- };
389
- }
506
+ else {
507
+ yield chunk;
390
508
  }
391
509
  }
392
- // Add assistant entry to history
393
- const assistantEntry = {
394
- type: "assistant",
395
- content: accumulatedMessage.content || "Using tools to help you...",
396
- timestamp: new Date(),
397
- toolCalls: accumulatedMessage.tool_calls || undefined,
398
- };
399
- this.chatHistory.push(assistantEntry);
400
- // Add accumulated message to conversation
401
- this.messages.push({
402
- role: "assistant",
403
- content: accumulatedMessage.content || "",
404
- tool_calls: accumulatedMessage.tool_calls,
405
- });
510
+ if (!streamResult)
511
+ continue;
512
+ // Add assistant message to history
513
+ this.addAssistantMessage(streamResult.accumulated);
406
514
  // Handle tool calls if present
407
- if (accumulatedMessage.tool_calls?.length > 0) {
515
+ if (streamResult.accumulated.tool_calls?.length > 0) {
408
516
  toolRounds++;
409
- // Only yield tool_calls if we haven't already yielded them during streaming
410
- if (!toolCallsYielded) {
411
- yield {
412
- type: "tool_calls",
413
- toolCalls: accumulatedMessage.tool_calls,
414
- };
415
- }
416
- // Execute tools
417
- for (const toolCall of accumulatedMessage.tool_calls) {
418
- // Check for cancellation before executing each tool
419
- if (this.abortController?.signal.aborted) {
420
- yield {
421
- type: "content",
422
- content: "\n\n[Operation cancelled by user]",
423
- };
424
- yield { type: "done" };
425
- return;
426
- }
427
- const result = await this.executeTool(toolCall);
428
- const toolResultEntry = {
429
- type: "tool_result",
430
- content: result.success
431
- ? result.output || "Success"
432
- : result.error || "Error occurred",
433
- timestamp: new Date(),
434
- toolCall: toolCall,
435
- toolResult: result,
436
- };
437
- this.chatHistory.push(toolResultEntry);
438
- yield {
439
- type: "tool_result",
440
- toolCall,
441
- toolResult: result,
442
- };
443
- // Add tool result with proper format (needed for AI context)
444
- this.messages.push({
445
- role: "tool",
446
- content: result.success
447
- ? result.output || "Success"
448
- : result.error || "Error",
449
- tool_call_id: toolCall.id,
450
- });
451
- }
452
- // Update token count after processing all tool calls to include tool results
453
- inputTokens = this.tokenCounter.countMessageTokens(this.messages);
454
- // Final token update after tools processed
455
- yield {
456
- type: "token_count",
457
- tokenCount: inputTokens + totalOutputTokens,
458
- };
459
- // Continue the loop to get the next response (which might have more tool calls)
517
+ yield* this.executeToolCalls(streamResult.accumulated.tool_calls, streamResult.yielded, inputTokensRef, totalOutputTokensRef);
518
+ // Continue loop to get next response
460
519
  }
461
520
  else {
462
521
  // No tool calls, we're done
463
522
  break;
464
523
  }
465
524
  }
525
+ // Check if max rounds reached
466
526
  if (toolRounds >= maxToolRounds) {
467
527
  yield {
468
528
  type: "content",
@@ -473,12 +533,8 @@ export class GrokAgent extends EventEmitter {
473
533
  }
474
534
  catch (error) {
475
535
  // Check if this was a cancellation
476
- if (this.abortController?.signal.aborted) {
477
- yield {
478
- type: "content",
479
- content: "\n\n[Operation cancelled by user]",
480
- };
481
- yield { type: "done" };
536
+ if (this.isCancelled()) {
537
+ yield* this.yieldCancellation();
482
538
  return;
483
539
  }
484
540
  const errorEntry = {
@@ -498,16 +554,44 @@ export class GrokAgent extends EventEmitter {
498
554
  this.abortController = null;
499
555
  }
500
556
  }
501
- async executeTool(toolCall) {
557
+ /**
558
+ * Parse and validate tool call arguments
559
+ * @param toolCall The tool call to parse arguments from
560
+ * @param toolType Type of tool (for error messages)
561
+ * @returns Parsed arguments or error result
562
+ */
563
+ parseToolArguments(toolCall, toolType = 'Tool') {
564
+ if (!toolCall.function.arguments || toolCall.function.arguments.trim() === '') {
565
+ return {
566
+ success: false,
567
+ error: `${toolType} ${toolCall.function.name} called with empty arguments`,
568
+ };
569
+ }
502
570
  try {
503
- // Defensive: ensure arguments is a valid JSON string
504
- if (!toolCall.function.arguments || toolCall.function.arguments.trim() === '') {
571
+ const args = JSON.parse(toolCall.function.arguments);
572
+ // Validate that args is an object (not null, array, or primitive)
573
+ if (typeof args !== 'object' || args === null || Array.isArray(args)) {
505
574
  return {
506
575
  success: false,
507
- error: `Tool ${toolCall.function.name} called with empty arguments`,
576
+ error: `${toolType} ${toolCall.function.name} arguments must be a JSON object, got ${Array.isArray(args) ? 'array' : typeof args}`,
508
577
  };
509
578
  }
510
- const args = JSON.parse(toolCall.function.arguments);
579
+ return { success: true, args };
580
+ }
581
+ catch (error) {
582
+ return {
583
+ success: false,
584
+ error: `Failed to parse ${toolType} arguments: ${error instanceof Error ? error.message : 'Invalid JSON'}`,
585
+ };
586
+ }
587
+ }
588
+ async executeTool(toolCall) {
589
+ try {
590
+ const parseResult = this.parseToolArguments(toolCall, 'Tool');
591
+ if (!parseResult.success) {
592
+ return { success: false, error: parseResult.error };
593
+ }
594
+ const args = parseResult.args;
511
595
  switch (toolCall.function.name) {
512
596
  case "view_file":
513
597
  const range = args.start_line && args.end_line
@@ -518,14 +602,6 @@ export class GrokAgent extends EventEmitter {
518
602
  return await this.textEditor.create(args.path, args.content);
519
603
  case "str_replace_editor":
520
604
  return await this.textEditor.strReplace(args.path, args.old_str, args.new_str, args.replace_all);
521
- case "edit_file":
522
- if (!this.morphEditor) {
523
- return {
524
- success: false,
525
- error: "Morph Fast Apply not available. Please set MORPH_API_KEY environment variable to use this feature.",
526
- };
527
- }
528
- return await this.morphEditor.editFile(args.target_file, args.instructions, args.code_edit);
529
605
  case "bash":
530
606
  return await this.bash.execute(args.command);
531
607
  case "create_todo_list":
@@ -564,14 +640,11 @@ export class GrokAgent extends EventEmitter {
564
640
  }
565
641
  async executeMCPTool(toolCall) {
566
642
  try {
567
- // Defensive: ensure arguments is a valid JSON string
568
- if (!toolCall.function.arguments || toolCall.function.arguments.trim() === '') {
569
- return {
570
- success: false,
571
- error: `MCP tool ${toolCall.function.name} called with empty arguments`,
572
- };
643
+ const parseResult = this.parseToolArguments(toolCall, 'MCP tool');
644
+ if (!parseResult.success) {
645
+ return { success: false, error: parseResult.error };
573
646
  }
574
- const args = JSON.parse(toolCall.function.arguments);
647
+ const args = parseResult.args;
575
648
  const mcpManager = getMCPManager();
576
649
  const result = await mcpManager.callTool(toolCall.function.name, args);
577
650
  if (result.isError) {
@@ -618,10 +691,10 @@ export class GrokAgent extends EventEmitter {
618
691
  return await this.bash.execute(command);
619
692
  }
620
693
  getCurrentModel() {
621
- return this.grokClient.getCurrentModel();
694
+ return this.llmClient.getCurrentModel();
622
695
  }
623
696
  setModel(model) {
624
- this.grokClient.setModel(model);
697
+ this.llmClient.setModel(model);
625
698
  // Update token counter for new model
626
699
  this.tokenCounter.dispose();
627
700
  this.tokenCounter = createTokenCounter(model);
@@ -645,4 +718,4 @@ export class GrokAgent extends EventEmitter {
645
718
  }
646
719
  }
647
720
  }
648
- //# sourceMappingURL=grok-agent.js.map
721
+ //# sourceMappingURL=llm-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-agent.js","sourceRoot":"","sources":["../../src/agent/llm-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoC,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EACL,eAAe,EACf,aAAa,EACb,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAgB,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AA2B/D,MAAM,OAAO,QAAS,SAAQ,YAAY;IAChC,SAAS,CAAY;IACrB,UAAU,CAAiB;IAC3B,IAAI,CAAW;IACf,QAAQ,CAAW;IACnB,MAAM,CAAa;IACnB,WAAW,GAAgB,EAAE,CAAC;IAC9B,QAAQ,GAAiB,EAAE,CAAC;IAC5B,YAAY,CAAe;IAC3B,cAAc,CAAiB;IAC/B,eAAe,GAA2B,IAAI,CAAC;IAC/C,aAAa,CAAS;IAE9B,YACE,MAAc,EACd,OAAgB,EAChB,KAAc,EACd,aAAsB;QAEtB,KAAK,EAAE,CAAC;QACR,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,KAAK,IAAI,UAAU,IAAI,kBAAkB,CAAC;QAC7D,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,GAAG,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,GAAG,IAAI,cAAc,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QAEhE,uCAAuC;QACvC,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,8CAA8C;QAC9C,MAAM,kBAAkB,GAAG,sBAAsB,EAAE,CAAC;QACpD,MAAM,YAAY,GAAG,iBAAiB,CAAC;YACrC,kBAAkB,EAAE,kBAAkB,IAAI,SAAS;SACpD,CAAC,CAAC;QAEH,iCAAiC;QACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,GAAG,YAAY,kCAAkC,OAAO,CAAC,GAAG,EAAE,EAAE;SAC1E,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,oDAAoD;QACpD,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAChC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;gBAC/B,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,MAAM,oBAAoB,EAAE,CAAC;gBAC/B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACpD,CAAC;QACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,yCAAyC;YACzC,OAAO,CAAC,IAAI,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW;QACjB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QACtD,OAAO,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,uDAAuD;IAC/C,kBAAkB,CAAC,OAAe;QACxC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG;YACf,OAAO;YACP,QAAQ;YACR,MAAM;YACN,UAAU;YACV,UAAU;YACV,SAAS;YACT,KAAK;YACL,QAAQ;YACR,OAAO;YACP,SAAS;YACT,OAAO;YACP,eAAe;YACf,OAAO;YACP,WAAW;YACX,eAAe;YACf,WAAW;YACX,OAAO;SACR,CAAC;QACF,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACrD,yDAAyD;QACzD,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe;QACtC,mCAAmC;QACnC,MAAM,SAAS,GAAc;YAC3B,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvD,MAAM,UAAU,GAAgB,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,yBAAyB;QACnE,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;YACtC,IAAI,eAAe,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAC7C,IAAI,CAAC,QAAQ,EACb,KAAK,EACL;gBACE,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;oBACnE,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;oBACzC,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;aAC3C,CACF,CAAC;YAEF,uEAAuE;YACvE,OAAO,UAAU,GAAG,aAAa,EAAE,CAAC;gBAClC,MAAM,gBAAgB,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;gBAE7D,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACzC,CAAC;gBAED,oBAAoB;gBACpB,IACE,gBAAgB,CAAC,UAAU;oBAC3B,gBAAgB,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EACtC,CAAC;oBACD,UAAU,EAAE,CAAC;oBAEb,wCAAwC;oBACxC,MAAM,cAAc,GAAc;wBAChC,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,gBAAgB,CAAC,OAAO,IAAI,4BAA4B;wBACjE,SAAS,EAAE,IAAI,IAAI,EAAE;wBACrB,SAAS,EAAE,gBAAgB,CAAC,UAAU;qBACvC,CAAC;oBACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBACtC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAEhC,wCAAwC;oBACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACjB,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,gBAAgB,CAAC,OAAO,IAAI,EAAE;wBACvC,UAAU,EAAE,gBAAgB,CAAC,UAAU;qBACjC,CAAC,CAAC;oBAEV,oEAAoE;oBACpE,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;wBAC/C,MAAM,aAAa,GAAc;4BAC/B,IAAI,EAAE,WAAW;4BACjB,OAAO,EAAE,cAAc;4BACvB,SAAS,EAAE,IAAI,IAAI,EAAE;4BACrB,QAAQ,EAAE,QAAQ;yBACnB,CAAC;wBACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;wBACrC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBACjC,CAAC,CAAC,CAAC;oBAEH,4CAA4C;oBAC5C,KAAK,MAAM,QAAQ,IAAI,gBAAgB,CAAC,UAAU,EAAE,CAAC;wBACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;wBAEhD,sDAAsD;wBACtD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAC3C,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE,CACnE,CAAC;wBAEF,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;4BACtB,MAAM,YAAY,GAAc;gCAC9B,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;gCAC/B,IAAI,EAAE,aAAa;gCACnB,OAAO,EAAE,MAAM,CAAC,OAAO;oCACrB,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS;oCAC5B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,gBAAgB;gCACpC,UAAU,EAAE,MAAM;6BACnB,CAAC;4BACF,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;4BAE5C,6CAA6C;4BAC7C,MAAM,aAAa,GAAG,UAAU,CAAC,SAAS,CACxC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,WAAW;gCAC1B,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE,CACrC,CAAC;4BACF,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;gCACzB,UAAU,CAAC,aAAa,CAAC,GAAG,YAAY,CAAC;4BAC3C,CAAC;wBACH,CAAC;wBAED,yEAAyE;wBACzE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;4BACjB,IAAI,EAAE,MAAM;4BACZ,OAAO,EAAE,MAAM,CAAC,OAAO;gCACrB,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS;gCAC5B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO;4BAC3B,YAAY,EAAE,QAAQ,CAAC,EAAE;yBAC1B,CAAC,CAAC;oBACL,CAAC;oBAED,yDAAyD;oBACzD,eAAe,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACzC,IAAI,CAAC,QAAQ,EACb,KAAK,EACL;wBACE,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;4BACnE,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;4BACzC,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;qBAC3C,CACF,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,yCAAyC;oBACzC,MAAM,UAAU,GAAc;wBAC5B,IAAI,EAAE,WAAW;wBACjB,OAAO,EACL,gBAAgB,CAAC,OAAO;4BACxB,qDAAqD;wBACvD,SAAS,EAAE,IAAI,IAAI,EAAE;qBACtB,CAAC;oBACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACjB,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,gBAAgB,CAAC,OAAO,IAAI,EAAE;qBACxC,CAAC,CAAC;oBACH,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAC5B,MAAM,CAAC,gBAAgB;gBACzB,CAAC;YACH,CAAC;YAED,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;gBAChC,MAAM,YAAY,GAAc;oBAC9B,IAAI,EAAE,WAAW;oBACjB,OAAO,EACL,4EAA4E;oBAC9E,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAC;gBACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACpC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;YAED,OAAO,UAAU,CAAC;QACpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,UAAU,GAAc;gBAC5B,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,kCAAkC,KAAK,CAAC,OAAO,EAAE;gBAC1D,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,QAAa,EAAE,IAAS;QAC7C,MAAM,MAAM,GAAG,CAAC,GAAQ,EAAE,KAAU,EAAE,EAAE;YACtC,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;YACjB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;oBAChD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;oBACjB,4CAA4C;oBAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;wBAC5B,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC3B,OAAO,GAAG,CAAC,KAAK,CAAC;wBACnB,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACpE,GAAG,CAAC,GAAG,CAAY,IAAI,KAAK,CAAC;gBAChC,CAAC;qBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC3D,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAU,CAAC;oBACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACtC,kDAAkD;wBAClD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;4BAAE,SAAS;wBAC1D,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;4BAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;wBACnC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC9C,CAAC;gBACH,CAAC;qBAAM,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACrE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QAEF,gDAAgD;QAChD,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YAC3E,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACK,8BAA8B,CAAC,OAAe;QACpD,mCAAmC;QACnC,MAAM,SAAS,GAAc;YAC3B,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvD,iDAAiD;QACjD,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACtF,CAAC;QAED,yBAAyB;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAe,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,CAAC,oBAAoB;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7E,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChE,MAAM;gBACJ,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,KAAK,OAAO,MAAM;aAC5B,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW;QACjB,OAAO,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;IACvD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,CAAC,iBAAiB;QAC9B,MAAM;YACJ,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,mCAAmC;SAC7C,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,OAAO,MAAM,eAAe,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,wDAAwD;YACxD,OAAO,CAAC,IAAI,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,CAAC,sBAAsB,CACnC,MAA0B,EAC1B,WAAmB,EACnB,eAAkC,EAClC,iBAAoC;QAEpC,IAAI,kBAAkB,GAAQ,EAAE,CAAC;QACjC,IAAI,kBAAkB,GAAG,EAAE,CAAC;QAC5B,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAE7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,+CAA+C;YAC/C,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAChC,4EAA4E;gBAC5E,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC1D,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAAE,SAAS;YAElC,uCAAuC;YACvC,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;YAEpE,oFAAoF;YACpF,IAAI,CAAC,gBAAgB,IAAI,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnE,MAAM,eAAe,GAAG,kBAAkB,CAAC,UAAU,CAAC,IAAI,CACxD,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAC/B,CAAC;gBACF,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM;wBACJ,IAAI,EAAE,YAAY;wBAClB,SAAS,EAAE,kBAAkB,CAAC,UAAU;qBACzC,CAAC;oBACF,gBAAgB,GAAG,IAAI,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,mDAAmD;YACnD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC;gBAC9C,MAAM;oBACJ,IAAI,EAAE,WAAW;oBACjB,gBAAgB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB;iBAC3D,CAAC;YACJ,CAAC;YAED,6BAA6B;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;gBACpC,kBAAkB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;gBAErD,kCAAkC;gBAClC,MAAM,mBAAmB,GACvB,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,kBAAkB,CAAC;oBAC7D,CAAC,kBAAkB,CAAC,UAAU;wBAC5B,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;wBAC9E,CAAC,CAAC,CAAC,CAAC,CAAC;gBACT,iBAAiB,CAAC,KAAK,GAAG,mBAAmB,CAAC;gBAE9C,MAAM;oBACJ,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;iBACxC,CAAC;gBAEF,+CAA+C;gBAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,IAAI,GAAG,GAAG,eAAe,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;oBACtC,eAAe,CAAC,KAAK,GAAG,GAAG,CAAC;oBAC5B,MAAM;wBACJ,IAAI,EAAE,aAAa;wBACnB,UAAU,EAAE,WAAW,GAAG,iBAAiB,CAAC,KAAK;qBAClD,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IACrG,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,kBAAuB;QACjD,MAAM,cAAc,GAAc;YAChC,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,kBAAkB,CAAC,OAAO,IAAI,4BAA4B;YACnE,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,SAAS,EAAE,kBAAkB,CAAC,UAAU,IAAI,SAAS;SACtD,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,kBAAkB,CAAC,OAAO,IAAI,EAAE;YACzC,UAAU,EAAE,kBAAkB,CAAC,UAAU;SACnC,CAAC,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,CAAC,gBAAgB,CAC7B,SAAwB,EACxB,gBAAyB,EACzB,WAA8B,EAC9B,iBAAoC;QAEpC,4EAA4E;QAC5E,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM;gBACJ,IAAI,EAAE,YAAY;gBAClB,SAAS;aACV,CAAC;QACJ,CAAC;QAED,gBAAgB;QAChB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,oDAAoD;YACpD,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAEhD,MAAM,eAAe,GAAc;gBACjC,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACrB,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS;oBAC5B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,gBAAgB;gBACpC,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,MAAM;aACnB,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAEvC,MAAM;gBACJ,IAAI,EAAE,aAAa;gBACnB,QAAQ;gBACR,UAAU,EAAE,MAAM;aACnB,CAAC;YAEF,6DAA6D;YAC7D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,MAAM,CAAC,OAAO;oBACrB,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS;oBAC5B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO;gBAC3B,YAAY,EAAE,QAAQ,CAAC,EAAE;aAC1B,CAAC,CAAC;QACL,CAAC;QAED,qDAAqD;QACrD,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAe,CAAC,CAAC;QAC/E,MAAM;YACJ,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,WAAW,CAAC,KAAK,GAAG,iBAAiB,CAAC,KAAK;SACxD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,CAAC,wBAAwB,CAC7B,OAAe;QAEf,+CAA+C;QAC/C,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAE7C,4CAA4C;QAC5C,MAAM,cAAc,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,8BAA8B,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/E,MAAM;YACJ,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,cAAc,CAAC,KAAK;SACjC,CAAC;QAEF,mCAAmC;QACnC,KAAK,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAEnC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,oBAAoB,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC1C,MAAM,kBAAkB,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAExC,IAAI,CAAC;YACH,uEAAuE;YACvE,OAAO,UAAU,GAAG,aAAa,EAAE,CAAC;gBAClC,mCAAmC;gBACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACvB,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAChC,OAAO;gBACT,CAAC;gBAED,oBAAoB;gBACpB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;gBAE3C,sCAAsC;gBACtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,MAAM;wBACJ,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,uEAAuE;qBACjF,CAAC;gBACJ,CAAC;gBAED,qBAAqB;gBACrB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CACtC,IAAI,CAAC,QAAQ,EACb,KAAK,EACL;oBACE,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;wBACnE,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;wBACzC,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;iBAC3C,CACF,CAAC;gBAEF,2BAA2B;gBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAC1C,MAAM,EACN,cAAc,CAAC,KAAK,EACpB,kBAAkB,EAClB,oBAAoB,CACrB,CAAC;gBAEF,IAAI,YAAiF,CAAC;gBACtF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;oBACnC,IAAI,aAAa,IAAI,KAAK,EAAE,CAAC;wBAC3B,YAAY,GAAG,KAAK,CAAC;oBACvB,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,YAAY;oBAAE,SAAS;gBAE5B,mCAAmC;gBACnC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;gBAEnD,+BAA+B;gBAC/B,IAAI,YAAY,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpD,UAAU,EAAE,CAAC;oBACb,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAC1B,YAAY,CAAC,WAAW,CAAC,UAAU,EACnC,YAAY,CAAC,OAAO,EACpB,cAAc,EACd,oBAAoB,CACrB,CAAC;oBACF,qCAAqC;gBACvC,CAAC;qBAAM,CAAC;oBACN,4BAA4B;oBAC5B,MAAM;gBACR,CAAC;YACH,CAAC;YAED,8BAA8B;YAC9B,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;gBAChC,MAAM;oBACJ,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,gFAAgF;iBAC1F,CAAC;YACJ,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,mCAAmC;YACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,MAAM,UAAU,GAAc;gBAC5B,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,kCAAkC,KAAK,CAAC,OAAO,EAAE;gBAC1D,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClC,MAAM;gBACJ,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,UAAU,CAAC,OAAO;aAC5B,CAAC;YACF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,4BAA4B;YAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,kBAAkB,CACxB,QAAqB,EACrB,WAAmB,MAAM;QAEzB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9E,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,8BAA8B;aAC3E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAErD,kEAAkE;YAClE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,yCAAyC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE;iBACnI,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,mBAAmB,QAAQ,eAAe,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE;aAC3G,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,QAAqB;QAC7C,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC9D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;YACtD,CAAC;YAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;YAE9B,QAAQ,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC/B,KAAK,WAAW;oBACd,MAAM,KAAK,GACT,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ;wBAC9B,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;wBAClC,CAAC,CAAC,SAAS,CAAC;oBAChB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAEtD,KAAK,aAAa;oBAChB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAE/D,KAAK,oBAAoB;oBACvB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CACrC,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,WAAW,CACjB,CAAC;gBAEJ,KAAK,MAAM;oBACT,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAE/C,KAAK,kBAAkB;oBACrB,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAExD,KAAK,kBAAkB;oBACrB,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAE1D,KAAK,QAAQ;oBACX,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE;wBAC1C,UAAU,EAAE,IAAI,CAAC,WAAW;wBAC5B,cAAc,EAAE,IAAI,CAAC,eAAe;wBACpC,cAAc,EAAE,IAAI,CAAC,eAAe;wBACpC,aAAa,EAAE,IAAI,CAAC,cAAc;wBAClC,SAAS,EAAE,IAAI,CAAC,UAAU;wBAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,UAAU,EAAE,IAAI,CAAC,WAAW;wBAC5B,SAAS,EAAE,IAAI,CAAC,UAAU;wBAC1B,aAAa,EAAE,IAAI,CAAC,cAAc;qBACnC,CAAC,CAAC;gBAEL;oBACE,+BAA+B;oBAC/B,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC/C,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;oBAC7C,CAAC;oBAED,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,iBAAiB,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;qBACjD,CAAC;YACN,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,yBAAyB,KAAK,CAAC,OAAO,EAAE;aAChD,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,QAAqB;QAChD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAClE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;YACtD,CAAC;YAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;YAC9B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;YAEnC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAEvE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,gDAAgD;gBAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;oBAC1D,CAAC,CAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,IAAI,IAAI,gBAAgB;oBACtD,CAAC,CAAC,gBAAgB,CAAC;gBACrB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,QAAQ;iBAChB,CAAC;YACJ,CAAC;YAED,8BAA8B;YAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO;iBAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC,IAAI,CAAC;gBACnB,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACpC,OAAO,aAAa,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC;gBACxD,CAAC;gBACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM,IAAI,SAAS;aAC5B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,6BAA6B,KAAK,CAAC,OAAO,EAAE;aACpD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe;QACtC,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;IAC1C,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,qCAAqC;QACrC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,qBAAqB;QACnB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;CACF"}