@gracefultools/astrid-sdk 0.6.1 → 0.7.1

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.
@@ -0,0 +1,509 @@
1
+ "use strict";
2
+ /**
3
+ * Terminal Gemini Executor
4
+ *
5
+ * Executes tasks using Gemini API with local tool execution.
6
+ * This enables running tasks assigned to gemini@astrid.cc in terminal mode.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.terminalGeminiExecutor = exports.TerminalGeminiExecutor = void 0;
43
+ const fs = __importStar(require("fs/promises"));
44
+ const path = __importStar(require("path"));
45
+ const child_process_1 = require("child_process");
46
+ const glob_1 = require("glob");
47
+ const terminal_base_js_1 = require("./terminal-base.js");
48
+ const agent_config_js_1 = require("../utils/agent-config.js");
49
+ // ============================================================================
50
+ // TOOL DEFINITIONS (same as gemini.ts)
51
+ // ============================================================================
52
+ const TOOL_DECLARATIONS = [
53
+ {
54
+ name: 'read_file',
55
+ description: 'Read the contents of a file',
56
+ parameters: {
57
+ type: 'object',
58
+ properties: {
59
+ file_path: { type: 'string', description: 'Path to the file' }
60
+ },
61
+ required: ['file_path']
62
+ }
63
+ },
64
+ {
65
+ name: 'write_file',
66
+ description: 'Write content to a file (creates or overwrites)',
67
+ parameters: {
68
+ type: 'object',
69
+ properties: {
70
+ file_path: { type: 'string', description: 'Path to the file' },
71
+ content: { type: 'string', description: 'Content to write' }
72
+ },
73
+ required: ['file_path', 'content']
74
+ }
75
+ },
76
+ {
77
+ name: 'edit_file',
78
+ description: 'Edit a file by replacing old_string with new_string',
79
+ parameters: {
80
+ type: 'object',
81
+ properties: {
82
+ file_path: { type: 'string', description: 'Path to the file' },
83
+ old_string: { type: 'string', description: 'String to find' },
84
+ new_string: { type: 'string', description: 'Replacement string' }
85
+ },
86
+ required: ['file_path', 'old_string', 'new_string']
87
+ }
88
+ },
89
+ {
90
+ name: 'run_bash',
91
+ description: 'Run a bash command',
92
+ parameters: {
93
+ type: 'object',
94
+ properties: {
95
+ command: { type: 'string', description: 'The bash command' }
96
+ },
97
+ required: ['command']
98
+ }
99
+ },
100
+ {
101
+ name: 'glob_files',
102
+ description: 'Find files matching a glob pattern',
103
+ parameters: {
104
+ type: 'object',
105
+ properties: {
106
+ pattern: { type: 'string', description: 'Glob pattern' }
107
+ },
108
+ required: ['pattern']
109
+ }
110
+ },
111
+ {
112
+ name: 'grep_search',
113
+ description: 'Search for a pattern in files',
114
+ parameters: {
115
+ type: 'object',
116
+ properties: {
117
+ pattern: { type: 'string', description: 'Search pattern' },
118
+ file_pattern: { type: 'string', description: 'Optional glob pattern' }
119
+ },
120
+ required: ['pattern']
121
+ }
122
+ },
123
+ {
124
+ name: 'task_complete',
125
+ description: 'Signal task completion',
126
+ parameters: {
127
+ type: 'object',
128
+ properties: {
129
+ summary: { type: 'string', description: 'Summary of what was done' },
130
+ commit_message: { type: 'string', description: 'Git commit message' },
131
+ pr_title: { type: 'string', description: 'PR title' },
132
+ pr_description: { type: 'string', description: 'PR description' }
133
+ },
134
+ required: ['summary']
135
+ }
136
+ }
137
+ ];
138
+ // Dangerous commands that should be blocked
139
+ const DANGEROUS_COMMANDS = ['rm -rf /', 'sudo', '> /dev/', 'mkfs', 'dd if='];
140
+ async function executeTool(name, args, repoPath) {
141
+ try {
142
+ switch (name) {
143
+ case 'read_file': {
144
+ const filePath = path.join(repoPath, args.file_path);
145
+ const content = await fs.readFile(filePath, 'utf-8');
146
+ return { success: true, result: content };
147
+ }
148
+ case 'write_file': {
149
+ const filePath = path.join(repoPath, args.file_path);
150
+ const content = args.content;
151
+ let action = 'create';
152
+ try {
153
+ await fs.access(filePath);
154
+ action = 'modify';
155
+ }
156
+ catch {
157
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
158
+ }
159
+ await fs.writeFile(filePath, content, 'utf-8');
160
+ return {
161
+ success: true,
162
+ result: `File ${action === 'create' ? 'created' : 'updated'}: ${args.file_path}`,
163
+ fileChange: { path: args.file_path, content, action }
164
+ };
165
+ }
166
+ case 'edit_file': {
167
+ const filePath = path.join(repoPath, args.file_path);
168
+ const oldContent = await fs.readFile(filePath, 'utf-8');
169
+ const oldString = args.old_string;
170
+ const newString = args.new_string;
171
+ if (!oldContent.includes(oldString)) {
172
+ return { success: false, result: `Error: Could not find string in file` };
173
+ }
174
+ const newContent = oldContent.replace(oldString, newString);
175
+ await fs.writeFile(filePath, newContent, 'utf-8');
176
+ return {
177
+ success: true,
178
+ result: `File edited: ${args.file_path}`,
179
+ fileChange: { path: args.file_path, content: newContent, action: 'modify' }
180
+ };
181
+ }
182
+ case 'run_bash': {
183
+ const command = args.command;
184
+ if (DANGEROUS_COMMANDS.some(d => command.includes(d))) {
185
+ return { success: false, result: 'Error: Command blocked by safety policy' };
186
+ }
187
+ try {
188
+ const output = (0, child_process_1.execSync)(command, {
189
+ cwd: repoPath,
190
+ encoding: 'utf-8',
191
+ timeout: 120000, // 2 minute timeout
192
+ maxBuffer: 1024 * 1024
193
+ });
194
+ return { success: true, result: output || '(no output)' };
195
+ }
196
+ catch (error) {
197
+ const err = error;
198
+ return { success: false, result: `Error: ${err.stderr || err.message}` };
199
+ }
200
+ }
201
+ case 'glob_files': {
202
+ const pattern = args.pattern;
203
+ const files = await (0, glob_1.glob)(pattern, { cwd: repoPath, nodir: true });
204
+ return { success: true, result: files.slice(0, 100).join('\n') || '(no matches)' };
205
+ }
206
+ case 'grep_search': {
207
+ const pattern = args.pattern;
208
+ const filePattern = args.file_pattern || '.';
209
+ try {
210
+ const output = (0, child_process_1.execSync)(`grep -rn "${pattern.replace(/"/g, '\\"')}" ${filePattern} | head -50`, { cwd: repoPath, encoding: 'utf-8', timeout: 30000 });
211
+ return { success: true, result: output || '(no matches)' };
212
+ }
213
+ catch {
214
+ return { success: true, result: '(no matches)' };
215
+ }
216
+ }
217
+ case 'task_complete':
218
+ return { success: true, result: 'Task marked complete' };
219
+ default:
220
+ return { success: false, result: `Unknown tool: ${name}` };
221
+ }
222
+ }
223
+ catch (error) {
224
+ return { success: false, result: `Error: ${error instanceof Error ? error.message : String(error)}` };
225
+ }
226
+ }
227
+ async function callGemini(contents, systemInstruction, apiKey, model) {
228
+ const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`;
229
+ const response = await fetch(url, {
230
+ method: 'POST',
231
+ headers: { 'Content-Type': 'application/json' },
232
+ body: JSON.stringify({
233
+ systemInstruction: { parts: [{ text: systemInstruction }] },
234
+ contents,
235
+ tools: [{ functionDeclarations: TOOL_DECLARATIONS }],
236
+ toolConfig: {
237
+ functionCallingConfig: {
238
+ mode: 'AUTO'
239
+ }
240
+ },
241
+ generationConfig: { maxOutputTokens: 8192, temperature: 0.2 }
242
+ })
243
+ });
244
+ if (!response.ok) {
245
+ const error = await response.text();
246
+ throw new Error(`Gemini API error: ${error}`);
247
+ }
248
+ return response.json();
249
+ }
250
+ // ============================================================================
251
+ // TERMINAL GEMINI EXECUTOR
252
+ // ============================================================================
253
+ class TerminalGeminiExecutor {
254
+ apiKey;
255
+ model;
256
+ maxTurns;
257
+ timeout;
258
+ constructor(options = {}) {
259
+ this.apiKey = options.apiKey || process.env.GEMINI_API_KEY || '';
260
+ this.model = options.model || process.env.GEMINI_MODEL || agent_config_js_1.DEFAULT_MODELS.gemini;
261
+ this.maxTurns = options.maxTurns || parseInt(process.env.GEMINI_MAX_TURNS || '50', 10);
262
+ this.timeout = options.timeout || parseInt(process.env.GEMINI_TIMEOUT || '900000', 10); // 15 min default
263
+ }
264
+ /**
265
+ * Check if Gemini API key is configured
266
+ */
267
+ async checkAvailable() {
268
+ return !!this.apiKey;
269
+ }
270
+ /**
271
+ * Read project context files
272
+ */
273
+ async readProjectContext(projectPath) {
274
+ const MAX_CONTEXT_CHARS = 8000;
275
+ const contextFiles = ['ASTRID.md', 'GEMINI.md', 'README.md'];
276
+ let context = '';
277
+ for (const file of contextFiles) {
278
+ try {
279
+ const filePath = path.join(projectPath, file);
280
+ let content = await fs.readFile(filePath, 'utf-8');
281
+ if (content.length > MAX_CONTEXT_CHARS) {
282
+ content = content.slice(0, MAX_CONTEXT_CHARS) + '\n\n[... truncated ...]';
283
+ }
284
+ context += `\n\n## Project Instructions (from ${file})\n\n${content}`;
285
+ break; // Only use the first found file
286
+ }
287
+ catch {
288
+ // File doesn't exist, try next
289
+ }
290
+ }
291
+ return context;
292
+ }
293
+ /**
294
+ * Build system prompt for the task
295
+ */
296
+ async buildSystemPrompt(session) {
297
+ const projectContext = await this.readProjectContext(session.projectPath || process.cwd());
298
+ return `You are an expert software engineer working on a coding task.
299
+ You have access to tools for reading, writing, and editing files, running bash commands, and searching the codebase.
300
+
301
+ ${projectContext}
302
+
303
+ ## Your Task
304
+ ${session.title}
305
+ ${session.description ? `\nDetails: ${session.description}` : ''}
306
+
307
+ ## Workflow
308
+
309
+ 1. **Understand** the task by reading relevant files
310
+ 2. **Plan** your approach - identify which files need changes
311
+ 3. **Implement** the changes using the available tools
312
+ 4. **Test** your changes by running build/tests: \`npm run predeploy\` or similar
313
+ 5. **Create PR** using \`gh pr create\` command
314
+ 6. **Complete** the task by calling task_complete with a summary
315
+
316
+ ## Rules
317
+
318
+ - Make ONLY the requested changes - don't over-engineer
319
+ - Follow existing code patterns and style
320
+ - Test your changes before completing
321
+ - Write clear commit messages
322
+ - Always create a PR unless explicitly told not to
323
+
324
+ CRITICAL: You must use ACTUAL FUNCTION CALLS, not text descriptions.
325
+ Do NOT write text saying "I will call X" - actually invoke the function.
326
+
327
+ Begin by reading the relevant files to understand the current state.`;
328
+ }
329
+ /**
330
+ * Start a new session to process a task
331
+ */
332
+ async startSession(session, prompt, context, onProgress) {
333
+ const projectPath = session.projectPath || process.cwd();
334
+ const systemPrompt = await this.buildSystemPrompt(session);
335
+ const userPrompt = prompt || (0, terminal_base_js_1.buildDefaultPrompt)(session, context);
336
+ const commentHistory = (0, terminal_base_js_1.formatCommentHistory)(context?.comments);
337
+ console.log(`🚀 Starting Gemini terminal session for task: ${session.title}`);
338
+ console.log(`📁 Working directory: ${projectPath}`);
339
+ console.log(`🤖 Model: ${this.model}`);
340
+ const contents = [
341
+ {
342
+ role: 'user',
343
+ parts: [{ text: commentHistory ? `${commentHistory}\n\n---\n\n${userPrompt}` : userPrompt }]
344
+ }
345
+ ];
346
+ const modifiedFiles = [];
347
+ let stdout = '';
348
+ let prUrl;
349
+ let completeSummary;
350
+ const startTime = Date.now();
351
+ try {
352
+ for (let turn = 0; turn < this.maxTurns; turn++) {
353
+ // Check timeout
354
+ if (Date.now() - startTime > this.timeout) {
355
+ stdout += '\n\n[Execution timed out]';
356
+ break;
357
+ }
358
+ onProgress?.(`Turn ${turn + 1}/${this.maxTurns}...`);
359
+ const response = await callGemini(contents, systemPrompt, this.apiKey, this.model);
360
+ const candidate = response.candidates[0];
361
+ if (!candidate) {
362
+ stdout += '\n\n[No response from Gemini]';
363
+ break;
364
+ }
365
+ // Add model response to history
366
+ contents.push({ role: 'model', parts: candidate.content.parts });
367
+ // Handle text responses
368
+ const textPart = candidate.content.parts.find(p => p.text);
369
+ if (textPart?.text) {
370
+ stdout += `\n\n${textPart.text}`;
371
+ console.log(`📝 Assistant: ${textPart.text.slice(0, 200)}...`);
372
+ }
373
+ // Handle function calls
374
+ const functionCalls = candidate.content.parts.filter(p => p.functionCall);
375
+ if (functionCalls.length > 0) {
376
+ const functionResponses = [];
377
+ for (const part of functionCalls) {
378
+ if (!part.functionCall)
379
+ continue;
380
+ const { name, args } = part.functionCall;
381
+ onProgress?.(`Using tool: ${name}`);
382
+ console.log(`🔧 Tool: ${name}`);
383
+ // Check for task_complete
384
+ if (name === 'task_complete') {
385
+ completeSummary = args.summary;
386
+ stdout += `\n\n[Task Complete]\nSummary: ${completeSummary}`;
387
+ // Capture git changes
388
+ const changes = await (0, terminal_base_js_1.captureGitChanges)(projectPath);
389
+ prUrl = (0, terminal_base_js_1.extractPrUrl)(stdout);
390
+ return {
391
+ exitCode: 0,
392
+ stdout,
393
+ stderr: '',
394
+ modifiedFiles: changes.files.length > 0 ? changes.files : modifiedFiles,
395
+ gitDiff: changes.diff,
396
+ prUrl,
397
+ };
398
+ }
399
+ // Execute tool
400
+ const result = await executeTool(name, args, projectPath);
401
+ stdout += `\n\n[${name}]: ${result.result.slice(0, 500)}${result.result.length > 500 ? '...' : ''}`;
402
+ // Track modified files
403
+ if (result.fileChange) {
404
+ if (!modifiedFiles.includes(result.fileChange.path)) {
405
+ modifiedFiles.push(result.fileChange.path);
406
+ }
407
+ }
408
+ // Add function response
409
+ functionResponses.push({
410
+ functionResponse: { name, response: { result: result.result.slice(0, 10000) } }
411
+ });
412
+ }
413
+ // Add all function responses in a single user message
414
+ contents.push({ role: 'user', parts: functionResponses });
415
+ continue;
416
+ }
417
+ // Check for stop condition
418
+ if (candidate.finishReason === 'STOP') {
419
+ // Check if we should prompt for completion
420
+ if (!completeSummary) {
421
+ contents.push({
422
+ role: 'user',
423
+ parts: [{ text: 'Please call task_complete to finalize your work, or continue if there is more to do.' }]
424
+ });
425
+ }
426
+ else {
427
+ break;
428
+ }
429
+ }
430
+ }
431
+ // Capture final git changes
432
+ const changes = await (0, terminal_base_js_1.captureGitChanges)(projectPath);
433
+ prUrl = (0, terminal_base_js_1.extractPrUrl)(stdout);
434
+ return {
435
+ exitCode: 0,
436
+ stdout,
437
+ stderr: '',
438
+ modifiedFiles: changes.files.length > 0 ? changes.files : modifiedFiles,
439
+ gitDiff: changes.diff,
440
+ prUrl,
441
+ };
442
+ }
443
+ catch (error) {
444
+ const errorMsg = error instanceof Error ? error.message : String(error);
445
+ console.error(`❌ Gemini terminal execution error:`, errorMsg);
446
+ return {
447
+ exitCode: 1,
448
+ stdout,
449
+ stderr: errorMsg,
450
+ modifiedFiles,
451
+ };
452
+ }
453
+ }
454
+ /**
455
+ * Resume a session with new input
456
+ * Note: Gemini doesn't have native session management, so we rebuild context
457
+ */
458
+ async resumeSession(session, input, context, onProgress) {
459
+ console.log(`🔄 Resuming Gemini session (rebuilding context)`);
460
+ // For Gemini, resuming means starting a new conversation with the follow-up
461
+ const fullPrompt = (0, terminal_base_js_1.formatCommentHistory)(context?.comments) +
462
+ `\n\n---\n\n## Follow-up Request\n\n${input}`;
463
+ return this.startSession(session, fullPrompt, context, onProgress);
464
+ }
465
+ /**
466
+ * Parse output to extract key information
467
+ */
468
+ parseOutput(output) {
469
+ const result = {};
470
+ const lines = output.split('\n');
471
+ const files = [];
472
+ for (const line of lines) {
473
+ // Extract modified/created files
474
+ const fileMatch = line.match(/(?:modified|created|edited|wrote):\s*[`'"]*([^`'"]+)[`'"]*/i);
475
+ if (fileMatch) {
476
+ files.push(fileMatch[1].trim());
477
+ }
478
+ // Extract PR URL
479
+ const prMatch = line.match(/(https:\/\/github\.com\/[\w-]+\/[\w-]+\/pull\/\d+)/i);
480
+ if (prMatch) {
481
+ result.prUrl = prMatch[1];
482
+ }
483
+ // Extract error messages
484
+ if (line.toLowerCase().includes('error:') || line.toLowerCase().includes('failed:')) {
485
+ result.error = line.trim();
486
+ }
487
+ }
488
+ if (files.length > 0) {
489
+ result.files = [...new Set(files)];
490
+ }
491
+ // Try to extract summary (look for task_complete summary)
492
+ const summaryMatch = output.match(/\[Task Complete\]\s*Summary:\s*([^\n]+)/i);
493
+ if (summaryMatch) {
494
+ result.summary = summaryMatch[1].trim();
495
+ }
496
+ else {
497
+ // Fallback: last substantial paragraph
498
+ const paragraphs = output.split(/\n\n+/).filter(p => p.trim().length > 50);
499
+ if (paragraphs.length > 0) {
500
+ result.summary = paragraphs[paragraphs.length - 1].trim().slice(0, 500);
501
+ }
502
+ }
503
+ return result;
504
+ }
505
+ }
506
+ exports.TerminalGeminiExecutor = TerminalGeminiExecutor;
507
+ // Export singleton for convenience
508
+ exports.terminalGeminiExecutor = new TerminalGeminiExecutor();
509
+ //# sourceMappingURL=terminal-gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-gemini.js","sourceRoot":"","sources":["../../src/executors/terminal-gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Terminal OpenAI Executor
3
+ *
4
+ * Executes tasks using OpenAI API with local tool execution.
5
+ * This enables running tasks assigned to openai@astrid.cc in terminal mode.
6
+ */
7
+ import type { Session } from '../server/session-manager.js';
8
+ import type { TerminalExecutor, TerminalExecutionResult, TerminalTaskContext, TerminalProgressCallback, ParsedOutput } from './terminal-base.js';
9
+ export interface TerminalOpenAIOptions {
10
+ apiKey?: string;
11
+ model?: string;
12
+ maxTurns?: number;
13
+ timeout?: number;
14
+ }
15
+ export declare class TerminalOpenAIExecutor implements TerminalExecutor {
16
+ private apiKey;
17
+ private model;
18
+ private maxTurns;
19
+ private timeout;
20
+ constructor(options?: TerminalOpenAIOptions);
21
+ /**
22
+ * Check if OpenAI API key is configured
23
+ */
24
+ checkAvailable(): Promise<boolean>;
25
+ /**
26
+ * Read project context files
27
+ */
28
+ private readProjectContext;
29
+ /**
30
+ * Build system prompt for the task
31
+ */
32
+ private buildSystemPrompt;
33
+ /**
34
+ * Start a new session to process a task
35
+ */
36
+ startSession(session: Session, prompt?: string, context?: TerminalTaskContext, onProgress?: TerminalProgressCallback): Promise<TerminalExecutionResult>;
37
+ /**
38
+ * Resume a session with new input
39
+ * Note: OpenAI doesn't have native session management, so we rebuild context
40
+ */
41
+ resumeSession(session: Session, input: string, context?: TerminalTaskContext, onProgress?: TerminalProgressCallback): Promise<TerminalExecutionResult>;
42
+ /**
43
+ * Parse output to extract key information
44
+ */
45
+ parseOutput(output: string): ParsedOutput;
46
+ }
47
+ export declare const terminalOpenAIExecutor: TerminalOpenAIExecutor;
48
+ //# sourceMappingURL=terminal-openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-openai.d.ts","sourceRoot":"","sources":["../../src/executors/terminal-openai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,YAAY,EACb,MAAM,oBAAoB,CAAA;AAa3B,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AA4SD,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,OAAO,CAAQ;gBAEX,OAAO,GAAE,qBAA0B;IAO/C;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxC;;OAEG;YACW,kBAAkB;IAwBhC;;OAEG;YACW,iBAAiB;IAgC/B;;OAEG;IACG,YAAY,CAChB,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,mBAAmB,EAC7B,UAAU,CAAC,EAAE,wBAAwB,GACpC,OAAO,CAAC,uBAAuB,CAAC;IAwInC;;;OAGG;IACG,aAAa,CACjB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,mBAAmB,EAC7B,UAAU,CAAC,EAAE,wBAAwB,GACpC,OAAO,CAAC,uBAAuB,CAAC;IAUnC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;CA0C1C;AAGD,eAAO,MAAM,sBAAsB,wBAA+B,CAAA"}