resolve-solo 0.2.0 → 0.4.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.
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Database module for session persistence
3
+ *
4
+ * Uses SQLite to store:
5
+ * - Investigation sessions
6
+ * - Session timeline items
7
+ * - Session notes
8
+ * - Closed incidents for recall
9
+ */
10
+ import Database from 'better-sqlite3';
11
+ import path from 'node:path';
12
+ import fs from 'node:fs';
13
+ // Use test database path if running tests
14
+ const DB_DIR = process.env.NODE_ENV === 'test'
15
+ ? path.join(process.cwd(), '.resolveai-test')
16
+ : path.join(process.cwd(), '.resolveai');
17
+ const DB_PATH = path.join(DB_DIR, 'memory.sqlite');
18
+ /**
19
+ * Get or create database connection
20
+ */
21
+ export function getDatabase() {
22
+ // Ensure directory exists
23
+ if (!fs.existsSync(DB_DIR)) {
24
+ fs.mkdirSync(DB_DIR, { recursive: true });
25
+ }
26
+ const db = new Database(DB_PATH);
27
+ // Initialize schema if needed
28
+ initializeSchema(db);
29
+ return db;
30
+ }
31
+ /**
32
+ * Initialize database schema
33
+ */
34
+ function initializeSchema(db) {
35
+ // Sessions table
36
+ db.exec(`
37
+ CREATE TABLE IF NOT EXISTS sessions (
38
+ id TEXT PRIMARY KEY,
39
+ query TEXT NOT NULL,
40
+ mode TEXT NOT NULL,
41
+ created_at TEXT NOT NULL,
42
+ closed_at TEXT,
43
+ resolution TEXT,
44
+ time_saved_minutes INTEGER
45
+ )
46
+ `);
47
+ // Session timeline items
48
+ db.exec(`
49
+ CREATE TABLE IF NOT EXISTS session_timeline (
50
+ session_id TEXT NOT NULL,
51
+ item_id TEXT NOT NULL,
52
+ item_index INTEGER NOT NULL,
53
+ item_data TEXT NOT NULL,
54
+ FOREIGN KEY (session_id) REFERENCES sessions(id)
55
+ )
56
+ `);
57
+ // Session notes
58
+ db.exec(`
59
+ CREATE TABLE IF NOT EXISTS session_notes (
60
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
61
+ session_id TEXT NOT NULL,
62
+ timestamp TEXT NOT NULL,
63
+ note TEXT NOT NULL,
64
+ FOREIGN KEY (session_id) REFERENCES sessions(id)
65
+ )
66
+ `);
67
+ // Closed incidents for recall
68
+ db.exec(`
69
+ CREATE TABLE IF NOT EXISTS incidents (
70
+ id TEXT PRIMARY KEY,
71
+ query TEXT NOT NULL,
72
+ resolution TEXT NOT NULL,
73
+ time_saved_minutes INTEGER,
74
+ created_at TEXT NOT NULL,
75
+ closed_at TEXT NOT NULL,
76
+ timeline_summary TEXT
77
+ )
78
+ `);
79
+ }
80
+ /**
81
+ * Save investigation session
82
+ */
83
+ export function saveSession(result) {
84
+ const db = getDatabase();
85
+ // Insert session
86
+ const insertSession = db.prepare(`
87
+ INSERT OR REPLACE INTO sessions (id, query, mode, created_at)
88
+ VALUES (?, ?, ?, ?)
89
+ `);
90
+ insertSession.run(result.sessionId, result.query, result.mode, new Date().toISOString());
91
+ // Insert timeline items
92
+ const insertItem = db.prepare(`
93
+ INSERT OR REPLACE INTO session_timeline (session_id, item_id, item_index, item_data)
94
+ VALUES (?, ?, ?, ?)
95
+ `);
96
+ for (let i = 0; i < result.timeline.length; i++) {
97
+ const item = result.timeline[i];
98
+ insertItem.run(result.sessionId, item.id, i + 1, // 1-indexed for user display
99
+ JSON.stringify(item));
100
+ }
101
+ db.close();
102
+ }
103
+ /**
104
+ * Get active session (most recent unclosed session)
105
+ */
106
+ export function getActiveSession() {
107
+ const db = getDatabase();
108
+ const session = db
109
+ .prepare('SELECT id, query FROM sessions WHERE closed_at IS NULL ORDER BY created_at DESC LIMIT 1')
110
+ .get();
111
+ db.close();
112
+ if (!session)
113
+ return null;
114
+ return { sessionId: session.id, query: session.query };
115
+ }
116
+ /**
117
+ * Get timeline item by index for active session
118
+ */
119
+ export function getTimelineItem(sessionId, itemIndex) {
120
+ const db = getDatabase();
121
+ const row = db
122
+ .prepare('SELECT item_data FROM session_timeline WHERE session_id = ? AND item_index = ?')
123
+ .get(sessionId, itemIndex);
124
+ db.close();
125
+ if (!row)
126
+ return null;
127
+ return JSON.parse(row.item_data);
128
+ }
129
+ /**
130
+ * Add note to session
131
+ */
132
+ export function addNote(sessionId, note) {
133
+ const db = getDatabase();
134
+ db.prepare(`
135
+ INSERT INTO session_notes (session_id, timestamp, note)
136
+ VALUES (?, ?, ?)
137
+ `).run(sessionId, new Date().toISOString(), note);
138
+ db.close();
139
+ }
140
+ /**
141
+ * Get all notes for a session
142
+ */
143
+ export function getNotes(sessionId) {
144
+ const db = getDatabase();
145
+ const notes = db
146
+ .prepare('SELECT timestamp, note FROM session_notes WHERE session_id = ? ORDER BY timestamp')
147
+ .all(sessionId);
148
+ db.close();
149
+ return notes;
150
+ }
151
+ /**
152
+ * Close session and save to incidents
153
+ */
154
+ export function closeSession(sessionId, resolution, timeSavedMinutes) {
155
+ const db = getDatabase();
156
+ // Update session
157
+ db.prepare(`
158
+ UPDATE sessions
159
+ SET closed_at = ?, resolution = ?, time_saved_minutes = ?
160
+ WHERE id = ?
161
+ `).run(new Date().toISOString(), resolution, timeSavedMinutes, sessionId);
162
+ // Copy to incidents table for recall
163
+ const session = db
164
+ .prepare('SELECT query, created_at FROM sessions WHERE id = ?')
165
+ .get(sessionId);
166
+ if (session) {
167
+ // Get timeline summary
168
+ const timeline = db
169
+ .prepare('SELECT item_data FROM session_timeline WHERE session_id = ? ORDER BY item_index')
170
+ .all(sessionId);
171
+ const timelineSummary = timeline
172
+ .slice(0, 5)
173
+ .map((row) => {
174
+ const item = JSON.parse(row.item_data);
175
+ return `${item.signal}: ${item.summary}`;
176
+ })
177
+ .join('; ');
178
+ db.prepare(`
179
+ INSERT INTO incidents (id, query, resolution, time_saved_minutes, created_at, closed_at, timeline_summary)
180
+ VALUES (?, ?, ?, ?, ?, ?, ?)
181
+ `).run(sessionId, session.query, resolution, timeSavedMinutes, session.created_at, new Date().toISOString(), timelineSummary);
182
+ }
183
+ db.close();
184
+ }
185
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Shared command handlers for all modes (CLI, REPL, MCP)
3
+ *
4
+ * Handlers contain business logic only and return structured results.
5
+ * Each mode is responsible for formatting and displaying results appropriately.
6
+ */
7
+ /**
8
+ * Execution context for handlers
9
+ */
10
+ export interface HandlerContext {
11
+ mode: 'cli' | 'repl' | 'mcp';
12
+ sessionId?: string;
13
+ }
14
+ /**
15
+ * Standardized handler result
16
+ */
17
+ export interface HandlerResult {
18
+ success: boolean;
19
+ message: string;
20
+ data?: unknown;
21
+ error?: string;
22
+ }
23
+ /**
24
+ * Handle demo command - automated investigation
25
+ */
26
+ export declare function handleDemo(context: HandlerContext): Promise<HandlerResult>;
27
+ /**
28
+ * Handle investigate command - custom query
29
+ */
30
+ export declare function handleInvestigate(query: string, context: HandlerContext): Promise<HandlerResult>;
31
+ /**
32
+ * Handle show details command
33
+ */
34
+ export declare function handleDetails(itemNumber: number, context: HandlerContext): Promise<HandlerResult>;
35
+ /**
36
+ * Handle note command
37
+ */
38
+ export declare function handleNote(note: string, context: HandlerContext): Promise<HandlerResult>;
39
+ /**
40
+ * Handle close command
41
+ */
42
+ export declare function handleClose(resolution: string, context: HandlerContext): Promise<HandlerResult>;
43
+ /**
44
+ * Handle demo seed command
45
+ */
46
+ export declare function handleDemoSeed(context: HandlerContext): HandlerResult;
47
+ /**
48
+ * Handle demo reset command
49
+ */
50
+ export declare function handleDemoReset(context: HandlerContext): HandlerResult;
51
+ /**
52
+ * Handle setup command - configure Claude Code integration
53
+ */
54
+ export declare function handleSetup(context: HandlerContext): Promise<HandlerResult>;
55
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0BH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAuDhF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAgExB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA+CxB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAsCxB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA0CxB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CA+BrE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CA2BtE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAyCjF"}
@@ -0,0 +1,366 @@
1
+ /**
2
+ * Shared command handlers for all modes (CLI, REPL, MCP)
3
+ *
4
+ * Handlers contain business logic only and return structured results.
5
+ * Each mode is responsible for formatting and displaying results appropriately.
6
+ */
7
+ import { generateDemoData } from './demo-generator.js';
8
+ import { saveDemoData, loadDemoData, deleteDemoData, demoDataExists, } from './storage.js';
9
+ import { buildTimeline, deduplicateTimeline } from './timeline.js';
10
+ import { generateInvestigationPaths, findRecallMatches, detectMissingSignals, generateSuggestions, } from './investigation.js';
11
+ import { saveSession, getActiveSession, getTimelineItem, addNote as dbAddNote, getNotes, closeSession as dbCloseSession, } from './database.js';
12
+ /**
13
+ * Handle demo command - automated investigation
14
+ */
15
+ export async function handleDemo(context) {
16
+ try {
17
+ // Seed data if needed
18
+ if (!demoDataExists()) {
19
+ const dataset = generateDemoData();
20
+ saveDemoData(dataset);
21
+ }
22
+ // Load demo data
23
+ const dataset = loadDemoData();
24
+ if (!dataset) {
25
+ return {
26
+ success: false,
27
+ message: 'Failed to load demo data',
28
+ error: 'Try running demo reset',
29
+ };
30
+ }
31
+ // Run investigation
32
+ const query = 'API Gateway timeout spike';
33
+ const rawTimeline = buildTimeline(dataset, {
34
+ hoursAgo: 48,
35
+ maxItems: 20,
36
+ });
37
+ const timeline = deduplicateTimeline(rawTimeline);
38
+ const paths = generateInvestigationPaths(timeline, dataset);
39
+ const recall = findRecallMatches(query, dataset);
40
+ const missingSignals = detectMissingSignals(timeline);
41
+ const suggestions = generateSuggestions(timeline);
42
+ const result = {
43
+ mode: 'demo',
44
+ sessionId: `demo-${Date.now()}`,
45
+ query,
46
+ timeWindow: 'Last 48 hours',
47
+ timeline,
48
+ paths,
49
+ recall,
50
+ missingSignals,
51
+ suggestions,
52
+ };
53
+ return {
54
+ success: true,
55
+ message: 'Demo investigation complete',
56
+ data: result,
57
+ };
58
+ }
59
+ catch (error) {
60
+ return {
61
+ success: false,
62
+ message: 'Demo failed',
63
+ error: error instanceof Error ? error.message : String(error),
64
+ };
65
+ }
66
+ }
67
+ /**
68
+ * Handle investigate command - custom query
69
+ */
70
+ export async function handleInvestigate(query, context) {
71
+ try {
72
+ // Check for demo data
73
+ if (!demoDataExists()) {
74
+ return {
75
+ success: false,
76
+ message: 'No demo data found',
77
+ error: 'Run demo seed first, or use demo mode',
78
+ };
79
+ }
80
+ // Load demo data
81
+ const dataset = loadDemoData();
82
+ if (!dataset) {
83
+ return {
84
+ success: false,
85
+ message: 'Failed to load demo data',
86
+ error: 'Try running demo reset',
87
+ };
88
+ }
89
+ // Build timeline with query filtering
90
+ const timeline = buildTimeline(dataset, {
91
+ hoursAgo: 48,
92
+ maxItems: 15,
93
+ query,
94
+ });
95
+ const dedupedTimeline = deduplicateTimeline(timeline, { maxPerService: 3 });
96
+ // Generate investigation data
97
+ const paths = generateInvestigationPaths(dedupedTimeline, dataset);
98
+ const recall = findRecallMatches(query, dataset);
99
+ const missingSignals = detectMissingSignals(dedupedTimeline);
100
+ const suggestions = generateSuggestions(dedupedTimeline);
101
+ // Create investigation result
102
+ const result = {
103
+ mode: 'demo',
104
+ sessionId: context.sessionId || `inv-${Date.now()}`,
105
+ query,
106
+ timeWindow: 'Last 48 hours',
107
+ timeline: dedupedTimeline,
108
+ paths,
109
+ recall,
110
+ missingSignals,
111
+ suggestions,
112
+ };
113
+ // Save session to database
114
+ saveSession(result);
115
+ return {
116
+ success: true,
117
+ message: 'Investigation complete',
118
+ data: result,
119
+ };
120
+ }
121
+ catch (error) {
122
+ return {
123
+ success: false,
124
+ message: 'Investigation failed',
125
+ error: error instanceof Error ? error.message : String(error),
126
+ };
127
+ }
128
+ }
129
+ /**
130
+ * Handle show details command
131
+ */
132
+ export async function handleDetails(itemNumber, context) {
133
+ try {
134
+ // Get active session
135
+ const session = getActiveSession();
136
+ if (!session) {
137
+ return {
138
+ success: false,
139
+ message: 'No active investigation session',
140
+ error: 'Run investigate command first',
141
+ };
142
+ }
143
+ // Validate item number
144
+ if (isNaN(itemNumber) || itemNumber < 1) {
145
+ return {
146
+ success: false,
147
+ message: 'Invalid item number',
148
+ error: 'Item number must be a positive integer',
149
+ };
150
+ }
151
+ // Get timeline item
152
+ const item = getTimelineItem(session.sessionId, itemNumber);
153
+ if (!item) {
154
+ return {
155
+ success: false,
156
+ message: `Item ${itemNumber} not found`,
157
+ error: 'Check timeline for available items',
158
+ };
159
+ }
160
+ return {
161
+ success: true,
162
+ message: `Details for item ${itemNumber}`,
163
+ data: {
164
+ itemNumber,
165
+ sessionId: session.sessionId,
166
+ item,
167
+ },
168
+ };
169
+ }
170
+ catch (error) {
171
+ return {
172
+ success: false,
173
+ message: 'Failed to get details',
174
+ error: error instanceof Error ? error.message : String(error),
175
+ };
176
+ }
177
+ }
178
+ /**
179
+ * Handle note command
180
+ */
181
+ export async function handleNote(note, context) {
182
+ try {
183
+ if (!note.trim()) {
184
+ return {
185
+ success: false,
186
+ message: 'Note cannot be empty',
187
+ error: 'Provide note text',
188
+ };
189
+ }
190
+ // Get active session
191
+ const session = getActiveSession();
192
+ if (!session) {
193
+ return {
194
+ success: false,
195
+ message: 'No active investigation session',
196
+ error: 'Run investigate command first',
197
+ };
198
+ }
199
+ // Add note
200
+ dbAddNote(session.sessionId, note);
201
+ return {
202
+ success: true,
203
+ message: 'Note added',
204
+ data: {
205
+ sessionId: session.sessionId,
206
+ note,
207
+ },
208
+ };
209
+ }
210
+ catch (error) {
211
+ return {
212
+ success: false,
213
+ message: 'Failed to add note',
214
+ error: error instanceof Error ? error.message : String(error),
215
+ };
216
+ }
217
+ }
218
+ /**
219
+ * Handle close command
220
+ */
221
+ export async function handleClose(resolution, context) {
222
+ try {
223
+ // Get active session
224
+ const session = getActiveSession();
225
+ if (!session) {
226
+ return {
227
+ success: false,
228
+ message: 'No active investigation session',
229
+ error: 'Run investigate command first',
230
+ };
231
+ }
232
+ const finalResolution = resolution.trim() || 'Investigation closed';
233
+ // Get all notes
234
+ const notes = getNotes(session.sessionId);
235
+ // For now, use a default time saved (15 min)
236
+ // In CLI/REPL modes, this will be prompted interactively
237
+ const timeSaved = 15;
238
+ // Close session
239
+ dbCloseSession(session.sessionId, finalResolution, timeSaved);
240
+ return {
241
+ success: true,
242
+ message: 'Investigation closed',
243
+ data: {
244
+ sessionId: session.sessionId,
245
+ query: session.query,
246
+ resolution: finalResolution,
247
+ notes,
248
+ timeSaved,
249
+ },
250
+ };
251
+ }
252
+ catch (error) {
253
+ return {
254
+ success: false,
255
+ message: 'Failed to close investigation',
256
+ error: error instanceof Error ? error.message : String(error),
257
+ };
258
+ }
259
+ }
260
+ /**
261
+ * Handle demo seed command
262
+ */
263
+ export function handleDemoSeed(context) {
264
+ try {
265
+ const alreadyExists = demoDataExists();
266
+ if (alreadyExists) {
267
+ return {
268
+ success: false,
269
+ message: 'Demo data already exists',
270
+ error: 'Use demo reset to regenerate',
271
+ };
272
+ }
273
+ const dataset = generateDemoData();
274
+ saveDemoData(dataset);
275
+ return {
276
+ success: true,
277
+ message: 'Demo data seeded successfully',
278
+ data: {
279
+ services: dataset.services.length,
280
+ deploys: dataset.deploys.length,
281
+ logs: dataset.logs.length,
282
+ incidents: dataset.incidents.length,
283
+ },
284
+ };
285
+ }
286
+ catch (error) {
287
+ return {
288
+ success: false,
289
+ message: 'Failed to seed demo data',
290
+ error: error instanceof Error ? error.message : String(error),
291
+ };
292
+ }
293
+ }
294
+ /**
295
+ * Handle demo reset command
296
+ */
297
+ export function handleDemoReset(context) {
298
+ try {
299
+ const exists = demoDataExists();
300
+ if (exists) {
301
+ deleteDemoData();
302
+ }
303
+ const dataset = generateDemoData();
304
+ saveDemoData(dataset);
305
+ return {
306
+ success: true,
307
+ message: 'Demo data reset successfully',
308
+ data: {
309
+ services: dataset.services.length,
310
+ deploys: dataset.deploys.length,
311
+ logs: dataset.logs.length,
312
+ incidents: dataset.incidents.length,
313
+ },
314
+ };
315
+ }
316
+ catch (error) {
317
+ return {
318
+ success: false,
319
+ message: 'Failed to reset demo data',
320
+ error: error instanceof Error ? error.message : String(error),
321
+ };
322
+ }
323
+ }
324
+ /**
325
+ * Handle setup command - configure Claude Code integration
326
+ */
327
+ export async function handleSetup(context) {
328
+ try {
329
+ const setup = await import('./setup.js');
330
+ const { setupClaudeIntegration, verifyBinaryAccessible, getManualInstructions } = setup;
331
+ // First verify the binary is accessible
332
+ if (!verifyBinaryAccessible()) {
333
+ return {
334
+ success: false,
335
+ message: 'resolve-solo-mcp binary not found in PATH',
336
+ error: 'Try running: npm install -g resolve-solo',
337
+ };
338
+ }
339
+ // Attempt auto-configuration
340
+ const result = setupClaudeIntegration();
341
+ if (result.success) {
342
+ return {
343
+ success: true,
344
+ message: result.message,
345
+ data: {
346
+ method: result.method,
347
+ configPath: result.configPath,
348
+ },
349
+ };
350
+ }
351
+ // Auto-config failed, return manual instructions
352
+ return {
353
+ success: false,
354
+ message: 'Could not automatically configure Claude Code',
355
+ error: getManualInstructions(),
356
+ };
357
+ }
358
+ catch (error) {
359
+ return {
360
+ success: false,
361
+ message: 'Setup failed',
362
+ error: error instanceof Error ? error.message : String(error),
363
+ };
364
+ }
365
+ }
366
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * MCP Tool Definitions and Execution
3
+ *
4
+ * Defines the tools exposed to Claude Code and routes execution to handlers.
5
+ */
6
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
7
+ import type { HandlerResult } from '../handlers.js';
8
+ /**
9
+ * Register all available MCP tools
10
+ */
11
+ export declare function registerTools(): Tool[];
12
+ /**
13
+ * Execute a tool by name with given arguments
14
+ */
15
+ export declare function executeTool(name: string, args: Record<string, unknown>): Promise<HandlerResult>;
16
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,EAAE,CAmEtC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,aAAa,CAAC,CA6BxB"}