sensorium-mcp 2.15.2 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/config.d.ts.map +1 -1
  2. package/dist/config.js +2 -0
  3. package/dist/config.js.map +1 -1
  4. package/dist/http-server.d.ts +16 -0
  5. package/dist/http-server.d.ts.map +1 -0
  6. package/dist/http-server.js +248 -0
  7. package/dist/http-server.js.map +1 -0
  8. package/dist/index.js +133 -1985
  9. package/dist/index.js.map +1 -1
  10. package/dist/response-builders.d.ts +34 -0
  11. package/dist/response-builders.d.ts.map +1 -0
  12. package/dist/response-builders.js +114 -0
  13. package/dist/response-builders.js.map +1 -0
  14. package/dist/stdio-server.d.ts +8 -0
  15. package/dist/stdio-server.d.ts.map +1 -0
  16. package/dist/stdio-server.js +23 -0
  17. package/dist/stdio-server.js.map +1 -0
  18. package/dist/tools/memory-tools.d.ts +36 -0
  19. package/dist/tools/memory-tools.d.ts.map +1 -0
  20. package/dist/tools/memory-tools.js +352 -0
  21. package/dist/tools/memory-tools.js.map +1 -0
  22. package/dist/tools/session-tools.d.ts +46 -0
  23. package/dist/tools/session-tools.d.ts.map +1 -0
  24. package/dist/tools/session-tools.js +255 -0
  25. package/dist/tools/session-tools.js.map +1 -0
  26. package/dist/tools/start-session-tool.d.ts +43 -0
  27. package/dist/tools/start-session-tool.d.ts.map +1 -0
  28. package/dist/tools/start-session-tool.js +188 -0
  29. package/dist/tools/start-session-tool.js.map +1 -0
  30. package/dist/tools/utility-tools.d.ts +34 -0
  31. package/dist/tools/utility-tools.d.ts.map +1 -0
  32. package/dist/tools/utility-tools.js +256 -0
  33. package/dist/tools/utility-tools.js.map +1 -0
  34. package/dist/tools/wait-tool.d.ts +69 -0
  35. package/dist/tools/wait-tool.d.ts.map +1 -0
  36. package/dist/tools/wait-tool.js +702 -0
  37. package/dist/tools/wait-tool.js.map +1 -0
  38. package/dist/types.d.ts +3 -0
  39. package/dist/types.d.ts.map +1 -1
  40. package/package.json +1 -1
@@ -0,0 +1,352 @@
1
+ /**
2
+ * Memory tool handlers extracted from index.ts.
3
+ *
4
+ * All memory_* tools are dispatched through `handleMemoryTool`.
5
+ */
6
+ import { assembleBootstrap, forgetMemory, getMemoryStatus, getNotesWithoutEmbeddings, getRecentEpisodes, getTopicIndex, runIntelligentConsolidation, saveNoteEmbedding, saveProcedure, saveSemanticNote, searchByEmbedding, searchProcedures, searchSemanticNotes, supersedeNote, updateProcedure, updateSemanticNote, } from "../memory.js";
7
+ import { generateEmbedding } from "../openai.js";
8
+ import { errorMessage } from "../utils.js";
9
+ // ---------------------------------------------------------------------------
10
+ // Helpers
11
+ // ---------------------------------------------------------------------------
12
+ /**
13
+ * Backfill embeddings for any semantic notes that don't have them yet.
14
+ * Used after consolidation to ensure all notes are searchable by embedding.
15
+ */
16
+ export async function backfillEmbeddings(db) {
17
+ const apiKey = process.env.OPENAI_API_KEY;
18
+ if (!apiKey)
19
+ return;
20
+ const missing = getNotesWithoutEmbeddings(db);
21
+ for (const { noteId, content } of missing) {
22
+ try {
23
+ const emb = await generateEmbedding(content, apiKey);
24
+ saveNoteEmbedding(db, noteId, emb);
25
+ process.stderr.write(`[memory] Embedded ${noteId}\n`);
26
+ }
27
+ catch (err) {
28
+ process.stderr.write(`[memory] Embedding failed for ${noteId}: ${err instanceof Error ? err.message : String(err)}\n`);
29
+ }
30
+ }
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // Main dispatcher
34
+ // ---------------------------------------------------------------------------
35
+ export async function handleMemoryTool(name, args, ctx) {
36
+ const { resolveThreadId, getShortReminder, getMemoryDb, errorResult } = ctx;
37
+ switch (name) {
38
+ // ── memory_bootstrap ──────────────────────────────────────────────────
39
+ case "memory_bootstrap": {
40
+ const threadId = resolveThreadId(args);
41
+ if (threadId === undefined) {
42
+ return errorResult("Error: No active thread. Call start_session first." + getShortReminder(undefined));
43
+ }
44
+ try {
45
+ const db = getMemoryDb();
46
+ const briefing = assembleBootstrap(db, threadId);
47
+ return {
48
+ content: [{ type: "text", text: `## Memory Briefing\n\n${briefing}` + getShortReminder(threadId) }],
49
+ };
50
+ }
51
+ catch (err) {
52
+ return errorResult(`Memory bootstrap error: ${errorMessage(err)}` + getShortReminder(threadId));
53
+ }
54
+ }
55
+ // ── memory_search ─────────────────────────────────────────────────────
56
+ case "memory_search": {
57
+ const threadId = resolveThreadId(args);
58
+ const query = String(args.query ?? "");
59
+ if (!query) {
60
+ return errorResult("Error: query is required." + getShortReminder(threadId));
61
+ }
62
+ try {
63
+ const db = getMemoryDb();
64
+ const layers = Array.isArray(args.layers) ? args.layers.map(String) : typeof args.layers === 'string' ? [args.layers] : ["episodic", "semantic", "procedural"];
65
+ const types = Array.isArray(args.types) ? args.types.map(String) : typeof args.types === 'string' ? [args.types] : undefined;
66
+ const results = [];
67
+ if (layers.includes("semantic")) {
68
+ // Try embedding-based search first, fall back to keyword search
69
+ const apiKey = process.env.OPENAI_API_KEY;
70
+ let embeddingSearchDone = false;
71
+ if (apiKey) {
72
+ try {
73
+ const queryEmb = await generateEmbedding(query, apiKey);
74
+ const embNotes = searchByEmbedding(db, queryEmb, { maxResults: 10, minSimilarity: 0.25 });
75
+ if (embNotes.length > 0) {
76
+ results.push("### Semantic Memory (embedding search)");
77
+ for (const n of embNotes) {
78
+ results.push(`- **[${n.type}]** ${n.content} _(conf: ${n.confidence}, sim: ${n.similarity.toFixed(2)}, id: ${n.noteId})_`);
79
+ }
80
+ embeddingSearchDone = true;
81
+ }
82
+ }
83
+ catch (embErr) {
84
+ process.stderr.write(`[memory] Embedding search failed in memory_search, falling back to keyword: ${embErr instanceof Error ? embErr.message : String(embErr)}\n`);
85
+ }
86
+ }
87
+ if (!embeddingSearchDone) {
88
+ const notes = searchSemanticNotes(db, query, { types, maxResults: 10 });
89
+ if (notes.length > 0) {
90
+ results.push("### Semantic Memory");
91
+ for (const n of notes) {
92
+ results.push(`- **[${n.type}]** ${n.content} _(conf: ${n.confidence}, id: ${n.noteId})_`);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ if (layers.includes("procedural")) {
98
+ const procs = searchProcedures(db, query, 5);
99
+ if (procs.length > 0) {
100
+ results.push("### Procedural Memory");
101
+ for (const p of procs) {
102
+ results.push(`- **${p.name}** (${p.type}): ${p.description} _(success: ${Math.round(p.successRate * 100)}%, id: ${p.procedureId})_`);
103
+ }
104
+ }
105
+ }
106
+ if (layers.includes("episodic") && threadId !== undefined) {
107
+ const episodes = getRecentEpisodes(db, threadId, 10);
108
+ const filtered = episodes.filter(ep => {
109
+ const content = JSON.stringify(ep.content).toLowerCase();
110
+ return query.toLowerCase().split(/\s+/).some(word => content.includes(word));
111
+ });
112
+ if (filtered.length > 0) {
113
+ results.push("### Episodic Memory");
114
+ for (const ep of filtered.slice(0, 5)) {
115
+ const summary = typeof ep.content === "object" && ep.content !== null
116
+ ? ep.content.text ?? JSON.stringify(ep.content).slice(0, 200)
117
+ : String(ep.content).slice(0, 200);
118
+ results.push(`- [${ep.modality}] ${summary} _(${ep.timestamp}, id: ${ep.episodeId})_`);
119
+ }
120
+ }
121
+ }
122
+ const text = results.length > 0
123
+ ? results.join("\n")
124
+ : `No memories found for "${query}".`;
125
+ return { content: [{ type: "text", text: text + getShortReminder(threadId) }] };
126
+ }
127
+ catch (err) {
128
+ return errorResult(`Memory search error: ${errorMessage(err)}` + getShortReminder(threadId));
129
+ }
130
+ }
131
+ // ── memory_save ───────────────────────────────────────────────────────
132
+ case "memory_save": {
133
+ const threadId = resolveThreadId(args);
134
+ const VALID_TYPES = ["fact", "preference", "pattern", "entity", "relationship"];
135
+ const noteType = String(args.type ?? "fact");
136
+ if (!VALID_TYPES.includes(noteType)) {
137
+ return errorResult(`Invalid type "${noteType}". Must be one of: ${VALID_TYPES.join(", ")}`);
138
+ }
139
+ try {
140
+ const db = getMemoryDb();
141
+ const content = String(args.content ?? "").trim();
142
+ if (!content) {
143
+ return errorResult("Error: 'content' is required and cannot be empty.");
144
+ }
145
+ const noteId = saveSemanticNote(db, {
146
+ type: noteType,
147
+ content,
148
+ keywords: Array.isArray(args.keywords) ? args.keywords.map(String) : typeof args.keywords === 'string' ? [args.keywords] : [],
149
+ confidence: typeof args.confidence === "number" ? args.confidence : 0.8,
150
+ priority: typeof args.priority === "number" ? args.priority : 0,
151
+ threadId: threadId ?? null,
152
+ });
153
+ // Fire-and-forget embedding generation
154
+ const apiKey = process.env.OPENAI_API_KEY;
155
+ if (apiKey) {
156
+ void generateEmbedding(content, apiKey).then(emb => {
157
+ saveNoteEmbedding(getMemoryDb(), noteId, emb);
158
+ }).catch(err => {
159
+ process.stderr.write(`[memory] Embedding failed for ${noteId}: ${err instanceof Error ? err.message : String(err)}\n`);
160
+ });
161
+ }
162
+ return {
163
+ content: [{ type: "text", text: `Saved semantic note: ${noteId}` + getShortReminder(threadId) }],
164
+ };
165
+ }
166
+ catch (err) {
167
+ return errorResult(`Memory save error: ${errorMessage(err)}` + getShortReminder(threadId));
168
+ }
169
+ }
170
+ // ── memory_save_procedure ─────────────────────────────────────────────
171
+ case "memory_save_procedure": {
172
+ const threadId = resolveThreadId(args);
173
+ try {
174
+ const db = getMemoryDb();
175
+ const existingId = args.procedureId;
176
+ if (existingId) {
177
+ updateProcedure(db, existingId, {
178
+ description: args.description,
179
+ steps: Array.isArray(args.steps) ? args.steps.map(String) : typeof args.steps === 'string' ? [args.steps] : undefined,
180
+ triggerConditions: Array.isArray(args.triggerConditions) ? args.triggerConditions.map(String) : typeof args.triggerConditions === 'string' ? [args.triggerConditions] : undefined,
181
+ });
182
+ return {
183
+ content: [{ type: "text", text: `Updated procedure: ${existingId}` + getShortReminder(threadId) }],
184
+ };
185
+ }
186
+ const VALID_PROC_TYPES = ["workflow", "habit", "tool_pattern", "template"];
187
+ const procType = String(args.type ?? "workflow");
188
+ if (!VALID_PROC_TYPES.includes(procType)) {
189
+ return errorResult(`Invalid procedure type "${procType}". Must be one of: ${VALID_PROC_TYPES.join(", ")}`);
190
+ }
191
+ const procId = saveProcedure(db, {
192
+ name: String(args.name ?? ""),
193
+ type: procType,
194
+ description: String(args.description ?? ""),
195
+ steps: Array.isArray(args.steps) ? args.steps.map(String) : typeof args.steps === 'string' ? [args.steps] : undefined,
196
+ triggerConditions: Array.isArray(args.triggerConditions) ? args.triggerConditions.map(String) : typeof args.triggerConditions === 'string' ? [args.triggerConditions] : undefined,
197
+ });
198
+ return {
199
+ content: [{ type: "text", text: `Saved procedure: ${procId}` + getShortReminder(threadId) }],
200
+ };
201
+ }
202
+ catch (err) {
203
+ return errorResult(`Procedure save error: ${errorMessage(err)}` + getShortReminder(threadId));
204
+ }
205
+ }
206
+ // ── memory_update ─────────────────────────────────────────────────────
207
+ case "memory_update": {
208
+ const threadId = resolveThreadId(args);
209
+ try {
210
+ const db = getMemoryDb();
211
+ const memId = String(args.memoryId ?? "");
212
+ const action = String(args.action ?? "update");
213
+ const reason = String(args.reason ?? "");
214
+ if (action === "supersede" && memId.startsWith("sn_")) {
215
+ const origRow = db.prepare("SELECT type, keywords FROM semantic_notes WHERE note_id = ?").get(memId);
216
+ if (!origRow) {
217
+ return errorResult(`Note ${memId} not found — cannot supersede a non-existent note.`);
218
+ }
219
+ const newContent = String(args.newContent ?? "");
220
+ if (!newContent.trim())
221
+ return errorResult("Error: 'newContent' is required when superseding a note. The original note would be destroyed with no replacement.");
222
+ const newId = supersedeNote(db, memId, {
223
+ type: origRow.type,
224
+ content: newContent,
225
+ keywords: origRow.keywords ? JSON.parse(origRow.keywords) : [],
226
+ confidence: typeof args.newConfidence === "number" ? args.newConfidence : 0.8,
227
+ priority: typeof args.newPriority === "number" ? args.newPriority : undefined,
228
+ });
229
+ return {
230
+ content: [{ type: "text", text: `Superseded ${memId} → ${newId} (reason: ${reason})` + getShortReminder(threadId) }],
231
+ };
232
+ }
233
+ if (memId.startsWith("sn_")) {
234
+ const updates = {};
235
+ if (args.newContent)
236
+ updates.content = String(args.newContent);
237
+ if (typeof args.newConfidence === "number")
238
+ updates.confidence = args.newConfidence;
239
+ if (typeof args.newPriority === "number")
240
+ updates.priority = args.newPriority;
241
+ updateSemanticNote(db, memId, updates);
242
+ return {
243
+ content: [{ type: "text", text: `Updated note ${memId} (reason: ${reason})` + getShortReminder(threadId) }],
244
+ };
245
+ }
246
+ if (memId.startsWith("pr_")) {
247
+ const updates = {};
248
+ if (args.newContent)
249
+ updates.description = String(args.newContent);
250
+ if (typeof args.newConfidence === "number")
251
+ updates.confidence = args.newConfidence;
252
+ updateProcedure(db, memId, updates);
253
+ return {
254
+ content: [{ type: "text", text: `Updated procedure ${memId} (reason: ${reason})` + getShortReminder(threadId) }],
255
+ };
256
+ }
257
+ return errorResult(`Unknown memory ID format: ${memId}` + getShortReminder(threadId));
258
+ }
259
+ catch (err) {
260
+ return errorResult(`Memory update error: ${errorMessage(err)}` + getShortReminder(threadId));
261
+ }
262
+ }
263
+ // ── memory_consolidate ────────────────────────────────────────────────
264
+ case "memory_consolidate": {
265
+ const threadId = resolveThreadId(args);
266
+ if (threadId === undefined) {
267
+ return errorResult("Error: No active thread." + getShortReminder(undefined));
268
+ }
269
+ try {
270
+ const db = getMemoryDb();
271
+ const report = await runIntelligentConsolidation(db, threadId);
272
+ ctx.onConsolidation?.(); // Prevent redundant auto-consolidation
273
+ if (report.episodesProcessed === 0) {
274
+ return {
275
+ content: [{ type: "text", text: "No unconsolidated episodes. Memory is up to date." + getShortReminder(threadId) }],
276
+ };
277
+ }
278
+ const reportLines = [
279
+ "## Consolidation Report",
280
+ `- Episodes processed: ${report.episodesProcessed}`,
281
+ `- Notes created: ${report.notesCreated}`,
282
+ `- Duration: ${report.durationMs}ms`,
283
+ ];
284
+ if (report.details.length > 0) {
285
+ reportLines.push("", "### Extracted Knowledge");
286
+ for (const d of report.details) {
287
+ reportLines.push(`- ${d}`);
288
+ }
289
+ }
290
+ return { content: [{ type: "text", text: reportLines.join("\n") + getShortReminder(threadId) }] };
291
+ }
292
+ catch (err) {
293
+ return errorResult(`Consolidation error: ${errorMessage(err)}` + getShortReminder(threadId));
294
+ }
295
+ }
296
+ // ── memory_status ─────────────────────────────────────────────────────
297
+ case "memory_status": {
298
+ const threadId = resolveThreadId(args);
299
+ if (threadId === undefined) {
300
+ return errorResult("Error: No active thread." + getShortReminder(undefined));
301
+ }
302
+ try {
303
+ const db = getMemoryDb();
304
+ const status = getMemoryStatus(db, threadId);
305
+ const topics = getTopicIndex(db);
306
+ const lines = [
307
+ "## Memory Status",
308
+ `- Episodes: ${status.totalEpisodes} (${status.unconsolidatedEpisodes} unconsolidated)`,
309
+ `- Semantic notes: ${status.totalSemanticNotes}`,
310
+ `- Procedures: ${status.totalProcedures}`,
311
+ `- Voice signatures: ${status.totalVoiceSignatures}`,
312
+ `- Last consolidation: ${status.lastConsolidation ?? "never"}`,
313
+ `- DB size: ${(status.dbSizeBytes / 1024).toFixed(1)} KB`,
314
+ ];
315
+ if (topics.length > 0) {
316
+ lines.push("", "**Topics:**");
317
+ for (const t of topics.slice(0, 15)) {
318
+ lines.push(`- ${t.topic} (${t.semanticCount} notes, ${t.proceduralCount} procs, conf: ${t.avgConfidence.toFixed(2)})`);
319
+ }
320
+ }
321
+ return { content: [{ type: "text", text: lines.join("\n") + getShortReminder(threadId) }] };
322
+ }
323
+ catch (err) {
324
+ return errorResult(`Memory status error: ${errorMessage(err)}` + getShortReminder(threadId));
325
+ }
326
+ }
327
+ // ── memory_forget ─────────────────────────────────────────────────────
328
+ case "memory_forget": {
329
+ const threadId = resolveThreadId(args);
330
+ try {
331
+ const db = getMemoryDb();
332
+ const memId = String(args.memoryId ?? "");
333
+ const reason = String(args.reason ?? "");
334
+ const result = forgetMemory(db, memId, reason);
335
+ if (!result.deleted) {
336
+ return {
337
+ content: [{ type: "text", text: `Memory ${memId} not found (layer: ${result.layer}). Nothing was deleted.` + getShortReminder(threadId) }],
338
+ };
339
+ }
340
+ return {
341
+ content: [{ type: "text", text: `Forgot ${result.layer} memory ${memId} (reason: ${reason})` + getShortReminder(threadId) }],
342
+ };
343
+ }
344
+ catch (err) {
345
+ return errorResult(`Memory forget error: ${errorMessage(err)}` + getShortReminder(threadId));
346
+ }
347
+ }
348
+ default:
349
+ return errorResult(`Unknown memory tool: ${name}`);
350
+ }
351
+ }
352
+ //# sourceMappingURL=memory-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-tools.js","sourceRoot":"","sources":["../../src/tools/memory-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Session tool handlers extracted from index.ts.
3
+ *
4
+ * Handles: report_progress, hibernate
5
+ */
6
+ import type { TelegramClient } from "../telegram.js";
7
+ import type { peekThreadMessages } from "../dispatcher.js";
8
+ import type { checkMaintenanceFlag } from "../config.js";
9
+ import type { checkDueTasks } from "../scheduler.js";
10
+ /** Closure-bound helpers passed by the caller (index.ts createMcpServer). */
11
+ export interface SessionToolContext {
12
+ resolveThreadId: (args: Record<string, unknown>) => number | undefined;
13
+ getReminders: (threadId: number | undefined, driveActive: boolean) => string;
14
+ getShortReminder: (threadId: number | undefined) => string;
15
+ errorResult: (msg: string) => {
16
+ content: Array<{
17
+ type: string;
18
+ text: string;
19
+ }>;
20
+ isError: true;
21
+ };
22
+ telegram: TelegramClient;
23
+ telegramChatId: string;
24
+ peekThreadMessages: typeof peekThreadMessages;
25
+ checkMaintenanceFlag: typeof checkMaintenanceFlag;
26
+ checkDueTasks: typeof checkDueTasks;
27
+ generateDmnReflection: (threadId: number) => string;
28
+ lastOperatorMessageAt: number;
29
+ previewedUpdateIds: Set<number>;
30
+ addPreviewedId: (id: number) => void;
31
+ }
32
+ type ToolResult = {
33
+ content: Array<{
34
+ type: string;
35
+ text: string;
36
+ }>;
37
+ isError?: boolean;
38
+ };
39
+ interface Extra {
40
+ sendNotification?: Function;
41
+ signal: AbortSignal;
42
+ requestId?: string | number;
43
+ }
44
+ export declare function handleSessionTool(name: string, args: Record<string, unknown>, ctx: SessionToolContext, extra: Extra): Promise<ToolResult>;
45
+ export {};
46
+ //# sourceMappingURL=session-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-tools.d.ts","sourceRoot":"","sources":["../../src/tools/session-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAOrD,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,OAAO,KAAK,MAAM,CAAC;IAC7E,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC;IAC3D,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,OAAO,EAAE,IAAI,CAAA;KAAE,CAAC;IAChG,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAClD,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACpD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,KAAK,UAAU,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAExF,UAAU,KAAK;IACb,gBAAgB,CAAC,EAAE,QAAQ,CAAC;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAMD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,kBAAkB,EACvB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,UAAU,CAAC,CASrB"}