@mnemonic-ai/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/chunk-5Z46NSNR.js +228 -0
  2. package/dist/chunk-5Z46NSNR.js.map +1 -0
  3. package/dist/chunk-CZDK53NR.js +24 -0
  4. package/dist/chunk-CZDK53NR.js.map +1 -0
  5. package/dist/chunk-L7SCUMC3.js +53 -0
  6. package/dist/chunk-L7SCUMC3.js.map +1 -0
  7. package/dist/chunk-M3IZJTMM.js +474 -0
  8. package/dist/chunk-M3IZJTMM.js.map +1 -0
  9. package/dist/chunk-NA7L5FQN.js +1581 -0
  10. package/dist/chunk-NA7L5FQN.js.map +1 -0
  11. package/dist/chunk-OEEEWS2M.js +375 -0
  12. package/dist/chunk-OEEEWS2M.js.map +1 -0
  13. package/dist/chunk-YZW6DYUY.js +46 -0
  14. package/dist/chunk-YZW6DYUY.js.map +1 -0
  15. package/dist/cli/main.cjs +1827 -0
  16. package/dist/cli/main.cjs.map +1 -0
  17. package/dist/cli/main.d.cts +1 -0
  18. package/dist/cli/main.d.ts +1 -0
  19. package/dist/cli/main.js +84 -0
  20. package/dist/cli/main.js.map +1 -0
  21. package/dist/client-b2Xhkqdl.d.cts +409 -0
  22. package/dist/client-b2Xhkqdl.d.ts +409 -0
  23. package/dist/index.cjs +2547 -0
  24. package/dist/index.cjs.map +1 -0
  25. package/dist/index.d.cts +309 -0
  26. package/dist/index.d.ts +309 -0
  27. package/dist/index.js +160 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/local-MYLINANE.js +7 -0
  30. package/dist/local-MYLINANE.js.map +1 -0
  31. package/dist/mcp/main.cjs +2775 -0
  32. package/dist/mcp/main.cjs.map +1 -0
  33. package/dist/mcp/main.d.cts +1 -0
  34. package/dist/mcp/main.d.ts +1 -0
  35. package/dist/mcp/main.js +31 -0
  36. package/dist/mcp/main.js.map +1 -0
  37. package/dist/mcp/server.cjs +2765 -0
  38. package/dist/mcp/server.cjs.map +1 -0
  39. package/dist/mcp/server.d.cts +23 -0
  40. package/dist/mcp/server.d.ts +23 -0
  41. package/dist/mcp/server.js +12 -0
  42. package/dist/mcp/server.js.map +1 -0
  43. package/dist/openai-GDIC3YVT.js +7 -0
  44. package/dist/openai-GDIC3YVT.js.map +1 -0
  45. package/dist/postgres-GQ6DZDBW.js +8 -0
  46. package/dist/postgres-GQ6DZDBW.js.map +1 -0
  47. package/package.json +117 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/server.ts"],"sourcesContent":["/**\n * MCP server exposing Mnemonic memory tools.\n * Uses @modelcontextprotocol/sdk.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Mnemonic, _registeredStores } from \"../client.js\";\nimport { SQLiteStore } from \"../stores/sqlite.js\";\nimport { buildEmbedder } from \"../embeddings/factory.js\";\nimport { parseSqlitePath } from \"../core/utils.js\";\nimport type { Memory } from \"../core/memory.js\";\n\nconst MAX_AGENT_CACHE = 256;\nconst AGENT_ID_RE = /^[a-zA-Z0-9_-]{1,128}$/;\n\nfunction validateAgentId(agentId: string): string {\n const trimmed = agentId.trim();\n if (!AGENT_ID_RE.test(trimmed)) {\n throw new Error(\n \"Invalid agent_id: must be 1-128 alphanumeric/underscore/hyphen characters\",\n );\n }\n return trimmed;\n}\n\nexport function serializeMemory(\n memory: Memory,\n callerAgentId?: string,\n): Record<string, unknown> {\n return {\n id: memory.id,\n content: memory.content,\n tier: memory.tierName,\n source: memory.source,\n actor: memory.actor,\n session_id: memory.sessionId,\n created_at: memory.createdAt.toISOString(),\n last_accessed_at: memory.lastAccessedAt.toISOString(),\n access_count: memory.accessCount,\n importance: Math.round(memory.importance * 10000) / 10000,\n superseded_by: memory.supersededBy,\n contradicted_by: memory.contradictedBy,\n has_embedding: memory.embedding != null,\n metadata: memory.metadata,\n linked_ids: memory.linkedIds,\n token_estimate: memory.tokenEstimate,\n owned_by_caller:\n callerAgentId != null ? memory.agentId === callerAgentId : false,\n shared: memory.shared,\n };\n}\n\n/** Resolve a store URI + embedder env vars into Mnemonic constructor args. */\nasync function buildFromUri(uri: string) {\n const embedder = await buildEmbedder();\n const dim = embedder?.dimension ?? 1536;\n\n if (uri.startsWith(\"sqlite:\")) {\n return { store: new SQLiteStore(parseSqlitePath(uri)), embedder };\n }\n\n if (uri.startsWith(\"postgres://\") || uri.startsWith(\"postgresql://\")) {\n const { PostgresStore } = await import(\"../stores/postgres.js\");\n return { store: new PostgresStore({ dsn: uri, embeddingDim: dim }), embedder };\n }\n\n // Check the store registry for other schemes (e.g. neo4j from platform).\n for (const [scheme, factory] of _registeredStores()) {\n if (uri.startsWith(`${scheme}://`) || uri.startsWith(`${scheme}+`)) {\n const result = factory(uri, dim);\n const store = result instanceof Promise ? await result : result;\n return { store, embedder };\n }\n }\n\n throw new Error(\n `Unsupported store URI: '${uri}'. ` +\n \"Use sqlite:///path, postgres[ql]://..., or register a custom store.\",\n );\n}\n\nexport interface McpServerOptions {\n /** Pre-configured Mnemonic client (for testing). */\n mnemonic?: Mnemonic;\n}\n\n/**\n * Create the MCP server with 10 memory tools.\n * Returns a `Server` instance from `@modelcontextprotocol/sdk`.\n */\nexport async function createServer(options?: McpServerOptions) {\n let mcpSdk: any;\n try {\n // McpServer moved to /server/mcp.js in SDK v1.x\n const mcpPath = \"@modelcontextprotocol/sdk/server/mcp.js\";\n mcpSdk = await import(mcpPath);\n } catch {\n throw new Error(\n \"MCP server requires '@modelcontextprotocol/sdk'. \" +\n \"Install it with: npm install @modelcontextprotocol/sdk\",\n );\n }\n\n const { McpServer } = mcpSdk;\n let z: any;\n try {\n const zodPath = \"zod\";\n const zod: any = await import(zodPath);\n z = zod.z ?? zod.default?.z;\n } catch {\n throw new Error(\n \"MCP server requires 'zod'. Install it with: npm install zod\",\n );\n }\n\n let baseClient: Mnemonic;\n if (options?.mnemonic) {\n baseClient = options.mnemonic;\n try {\n baseClient.agentId;\n } catch {\n await baseClient.init();\n }\n } else {\n const storeUri = process.env[\"MNEMONIC_STORE_URI\"] ?? \"sqlite:///mnemonic.db\";\n const agentId = process.env[\"MNEMONIC_AGENT_ID\"] || undefined;\n const { store, embedder } = await buildFromUri(storeUri);\n baseClient = new Mnemonic({ store, embedder, agentId });\n await baseClient.init();\n }\n\n const agentCache = new Map<string, Mnemonic>(); // LRU via delete+re-insert\n\n async function getAgent(agentId?: string): Promise<Mnemonic> {\n if (!agentId) return baseClient;\n agentId = validateAgentId(agentId);\n\n const cached = agentCache.get(agentId);\n if (cached) {\n // Move to end of Map iteration order (most-recently-used)\n agentCache.delete(agentId);\n agentCache.set(agentId, cached);\n return cached;\n }\n\n // Evict least-recently-used if at capacity\n if (agentCache.size >= MAX_AGENT_CACHE) {\n const lru = agentCache.keys().next().value!;\n agentCache.delete(lru);\n }\n\n const agent = new Mnemonic({\n store: baseClient.store,\n embedder: baseClient.embedder,\n config: baseClient.config,\n agentId,\n });\n await agent.init({ skipStoreInit: true });\n agentCache.set(agentId, agent);\n return agent;\n }\n\n function jsonResponse(data: unknown) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n };\n }\n\n function errorResponse(err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n let hint = \"\";\n if (message.includes(\"not found\")) hint = \" Use memory_search to find valid IDs.\";\n else if (message.includes(\"not the owner\") || message.includes(\"permission\")) hint = \" Only the owning agent can modify this memory.\";\n else if (message.includes(\"at least one filter\")) hint = \" Provide older_than, tier, or below_importance.\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({ error: message + hint }, null, 2),\n },\n ],\n isError: true,\n };\n }\n\n const server = new McpServer({\n name: \"mnemonic\",\n version: \"0.1.0\",\n });\n\n server.tool(\n \"memory_store\",\n {\n description: \"Save information to long-term memory. Call proactively when the user shares preferences, identity facts, decisions, corrections, or notable events — also when they correct prior knowledge or express a strong preference. Auto-classifies into tiers, scores importance, links to related memories, and detects supersession.\",\n annotations: { readOnlyHint: false, idempotentHint: false },\n },\n {\n content: z.string().describe(\"Clear standalone statement to remember, e.g. 'User prefers Kubernetes over ECS' or 'Project uses Next.js 14 with App Router'\"),\n source: z.string().default(\"conversation\").describe(\"Where this came from. Use lowercase_snake values. Common: 'conversation', 'observation', 'document', 'tool_output', 'system'. Custom sources welcome: 'slack', 'email', 'jira', 'meeting_notes', etc.\"),\n actor: z.string().default(\"user\").describe(\"Who produced this. Common: 'user', 'assistant', 'system'. Can also be a specific name or agent ID.\"),\n tier: z.enum([\"identity\", \"procedural\", \"structural\", \"episodic\", \"transient\"]).optional().describe(\"Override auto-classification. Usually omit — the classifier handles it.\"),\n session_id: z.string().optional().describe(\"Group memories by conversation or task\"),\n metadata: z.record(z.unknown()).optional().describe(\"Key-value pairs, e.g. {project: 'api', priority: 'high'}\"),\n agent_id: z.string().optional().describe(\"Target agent's memory space. Omit for default.\"),\n shared: z.boolean().optional().describe(\"Make visible to all agents. Default: false.\"),\n },\n async (params: any) => {\n try {\n const agent = await getAgent(params.agent_id);\n const memory = await agent.add(params.content, {\n source: params.source,\n actor: params.actor,\n tier: params.tier,\n sessionId: params.session_id,\n metadata: params.metadata,\n shared: params.shared,\n });\n return jsonResponse(serializeMemory(memory, agent.agentId));\n } catch (err: unknown) {\n return errorResponse(err);\n }\n },\n );\n\n server.tool(\n \"memory_recall\",\n {\n description: \"Retrieve relevant memories as formatted text, ranked by relevance and importance within a token budget. Call at the start of every conversation to load context. Also call when the topic shifts or when you need to verify what you already know. Returns a ready-to-use text block. Prefer over memory_search unless you need structured data or memory IDs.\",\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n {\n query: z.string().describe(\"What you need to know, e.g. 'deployment preferences' or 'user's tech stack'\"),\n max_tokens: z.number().int().min(100).max(16000).optional().describe(\"Token budget for returned context. Default: 2000.\"),\n min_relevance: z.number().min(0).max(1).optional().describe(\"Minimum relevance score (0.0-1.0) for a memory to be included. Filters out low-relevance noise.\"),\n header: z.string().optional().describe(\"Header prepended to context, e.g. '## Relevant Memory'\"),\n agent_id: z.string().optional().describe(\"Target agent's memory space. Omit for default.\"),\n },\n async (params: any) => {\n try {\n const agent = await getAgent(params.agent_id);\n const context = await agent.recall(params.query, {\n maxTokens: params.max_tokens,\n minRelevance: params.min_relevance,\n header: params.header,\n });\n return { content: [{ type: \"text\" as const, text: context }] };\n } catch (err: unknown) {\n return errorResponse(err);\n }\n },\n );\n\n server.tool(\n \"memory_search\",\n {\n description: \"Search memories and return structured JSON with full metadata (id, tier, importance, timestamps, linked_ids). Use instead of memory_recall when you need memory IDs for share/unshare/forget, or need to inspect importance scores and graph links.\",\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n {\n query: z.string().describe(\"What to search for, e.g. 'infrastructure decisions' or 'recent debugging sessions'\"),\n max_tokens: z.number().int().min(100).max(16000).optional().describe(\"Token budget for candidate selection. Default: 2000.\"),\n min_relevance: z.number().min(0).max(1).optional().describe(\"Minimum relevance score (0.0-1.0) for a memory to be included. Filters out low-relevance noise.\"),\n agent_id: z.string().optional().describe(\"Target agent's memory space. Omit for default.\"),\n },\n async (params: any) => {\n try {\n const agent = await getAgent(params.agent_id);\n const memories = await agent.recallMemories(params.query, {\n maxTokens: params.max_tokens,\n minRelevance: params.min_relevance,\n });\n return jsonResponse(memories.map((m) => serializeMemory(m, agent.agentId)));\n } catch (err: unknown) {\n return errorResponse(err);\n }\n },\n );\n\n server.tool(\n \"memory_forget\",\n {\n description: \"Delete memories matching filters. Memories naturally fade via decay — only explicitly delete when content is wrong, sensitive, or the user requests removal. At least one filter is required.\",\n annotations: { destructiveHint: true, idempotentHint: false },\n },\n {\n older_than: z.string().optional().describe(\"Delete older than duration: '30d', '24h', '2w', '90m', '120s'\"),\n tier: z.enum([\"identity\", \"procedural\", \"structural\", \"episodic\", \"transient\"]).optional().describe(\"Only delete memories in this tier\"),\n below_importance: z.number().min(0).max(1).optional().describe(\"Delete below this importance score (0.0–1.0)\"),\n agent_id: z.string().optional().describe(\"Target agent's memory space. Omit for default.\"),\n },\n async (params: any) => {\n try {\n const agent = await getAgent(params.agent_id);\n const deleted = await agent.forget({\n olderThan: params.older_than,\n tier: params.tier,\n belowImportance: params.below_importance,\n });\n return jsonResponse({ deleted });\n } catch (err: unknown) {\n return errorResponse(err);\n }\n },\n );\n\n server.tool(\n \"memory_consolidate\",\n {\n description: \"Merge similar episodic memories into structural summaries. Originals are kept but deprioritised — they fade naturally via decay while the summary takes over in recall. Run after storing 10+ memories in a session, or when memory_stats shows many episodic memories.\",\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },\n },\n { agent_id: z.string().optional().describe(\"Target agent. Omit for default.\") },\n async (params: any) => {\n try {\n const agent = await getAgent(params.agent_id);\n return jsonResponse({ consolidated_groups: await agent.consolidate() });\n } catch (err: unknown) {\n return errorResponse(err);\n }\n },\n );\n\n server.tool(\n \"memory_promote\",\n {\n description: \"Promote frequently accessed memories to higher tiers and demote inactive ones. Tiers affect recall ranking and decay rate. Run at the end of sessions to update tier rankings based on access patterns.\",\n annotations: { readOnlyHint: false, idempotentHint: false },\n },\n { agent_id: z.string().optional().describe(\"Target agent. Omit for default.\") },\n async (params: any) => {\n try {\n const agent = await getAgent(params.agent_id);\n return jsonResponse({ tier_changes: await agent.promote() });\n } catch (err: unknown) {\n return errorResponse(err);\n }\n },\n );\n\n server.tool(\n \"memory_relink\",\n {\n description: \"Re-run the linker across all memories to retroactively detect supersession and contradiction edges. Use after upgrading or when existing memories lack relationship metadata.\",\n annotations: { readOnlyHint: false, idempotentHint: true },\n },\n { agent_id: z.string().optional().describe(\"Target agent. Omit for default.\") },\n async (params: any) => {\n try {\n const agent = await getAgent(params.agent_id);\n return jsonResponse({ new_edges: await agent.relink() });\n } catch (err: unknown) {\n return errorResponse(err);\n }\n },\n );\n\n server.tool(\n \"memory_stats\",\n {\n description: \"Get memory health: total count, tier breakdown, token usage. Call when the user asks 'what do you remember?' or to decide if consolidation or pruning is needed.\",\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n { agent_id: z.string().optional().describe(\"Target agent. Omit for default.\") },\n async (params: any) => {\n try {\n const agent = await getAgent(params.agent_id);\n return jsonResponse(await agent.stats());\n } catch (err: unknown) {\n return errorResponse(err);\n }\n },\n );\n\n server.tool(\n \"memory_share\",\n {\n description: \"Make a memory visible to all agents. Only the owning agent can share. Use memory_search first to get the memory ID.\",\n annotations: { readOnlyHint: false, idempotentHint: true },\n },\n {\n memory_id: z.string().describe(\"Memory ID from memory_search results\"),\n agent_id: z.string().optional().describe(\"Owning agent. Omit for default.\"),\n },\n async (params: any) => {\n try {\n const agent = await getAgent(params.agent_id);\n const memory = await agent.share(params.memory_id);\n return jsonResponse(serializeMemory(memory, agent.agentId));\n } catch (err: unknown) {\n return errorResponse(err);\n }\n },\n );\n\n server.tool(\n \"memory_unshare\",\n {\n description: \"Make a shared memory private again. Only the owning agent can unshare. Use memory_search first to get the memory ID.\",\n annotations: { readOnlyHint: false, idempotentHint: true },\n },\n {\n memory_id: z.string().describe(\"Memory ID from memory_search results\"),\n agent_id: z.string().optional().describe(\"Owning agent. Omit for default.\"),\n },\n async (params: any) => {\n try {\n const agent = await getAgent(params.agent_id);\n const memory = await agent.unshare(params.memory_id);\n return jsonResponse(serializeMemory(memory, agent.agentId));\n } catch (err: unknown) {\n return errorResponse(err);\n }\n },\n );\n\n return { server, baseClient, agentCache };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,46 @@
1
+ // src/embeddings/openai.ts
2
+ var MODEL_DIMENSIONS = {
3
+ "text-embedding-3-small": 1536,
4
+ "text-embedding-3-large": 3072,
5
+ "text-embedding-ada-002": 1536
6
+ };
7
+ var OpenAIEmbedder = class {
8
+ _model;
9
+ _apiKey;
10
+ _client = null;
11
+ constructor(options) {
12
+ this._model = options?.model ?? "text-embedding-3-small";
13
+ this._apiKey = options?.apiKey;
14
+ }
15
+ get dimension() {
16
+ return MODEL_DIMENSIONS[this._model] ?? 1536;
17
+ }
18
+ async getClient() {
19
+ if (!this._client) {
20
+ const mod = await Function('return import("openai")')();
21
+ this._client = new mod.default({ apiKey: this._apiKey });
22
+ }
23
+ return this._client;
24
+ }
25
+ async embed(text) {
26
+ const client = await this.getClient();
27
+ const response = await client.embeddings.create({
28
+ model: this._model,
29
+ input: text
30
+ });
31
+ return response.data[0].embedding;
32
+ }
33
+ async embedBatch(texts) {
34
+ const client = await this.getClient();
35
+ const response = await client.embeddings.create({
36
+ model: this._model,
37
+ input: texts
38
+ });
39
+ return response.data.sort((a, b) => a.index - b.index).map((d) => d.embedding);
40
+ }
41
+ };
42
+
43
+ export {
44
+ OpenAIEmbedder
45
+ };
46
+ //# sourceMappingURL=chunk-YZW6DYUY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/embeddings/openai.ts"],"sourcesContent":["/**\n * OpenAI embedding provider.\n *\n * Requires the `openai` package as a peer dependency.\n */\n\nimport type { BaseEmbedder } from \"./base.js\";\n\nconst MODEL_DIMENSIONS: Record<string, number> = {\n \"text-embedding-3-small\": 1536,\n \"text-embedding-3-large\": 3072,\n \"text-embedding-ada-002\": 1536,\n};\n\ninterface EmbeddingResponse {\n data: Array<{ embedding: number[]; index: number }>;\n}\n\ninterface EmbeddingClient {\n embeddings: {\n create: (opts: { model: string; input: string | string[] }) => Promise<EmbeddingResponse>;\n };\n}\n\nexport class OpenAIEmbedder implements BaseEmbedder {\n private _model: string;\n private _apiKey: string | undefined;\n private _client: EmbeddingClient | null = null;\n\n constructor(options?: { model?: string; apiKey?: string }) {\n this._model = options?.model ?? \"text-embedding-3-small\";\n this._apiKey = options?.apiKey;\n }\n\n get dimension(): number {\n return MODEL_DIMENSIONS[this._model] ?? 1536;\n }\n\n private async getClient(): Promise<EmbeddingClient> {\n if (!this._client) {\n // Dynamic import so the openai package is only loaded when used.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = await (Function('return import(\"openai\")')() as Promise<{ default: new (opts: { apiKey?: string }) => EmbeddingClient }>);\n this._client = new mod.default({ apiKey: this._apiKey });\n }\n return this._client;\n }\n\n async embed(text: string): Promise<number[]> {\n const client = await this.getClient();\n const response = await client.embeddings.create({\n model: this._model,\n input: text,\n });\n return response.data[0].embedding;\n }\n\n async embedBatch(texts: string[]): Promise<number[][]> {\n const client = await this.getClient();\n const response = await client.embeddings.create({\n model: this._model,\n input: texts,\n });\n return response.data\n .sort((a, b) => a.index - b.index)\n .map((d) => d.embedding);\n }\n}\n"],"mappings":";AAQA,IAAM,mBAA2C;AAAA,EAC/C,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,0BAA0B;AAC5B;AAYO,IAAM,iBAAN,MAA6C;AAAA,EAC1C;AAAA,EACA;AAAA,EACA,UAAkC;AAAA,EAE1C,YAAY,SAA+C;AACzD,SAAK,SAAS,SAAS,SAAS;AAChC,SAAK,UAAU,SAAS;AAAA,EAC1B;AAAA,EAEA,IAAI,YAAoB;AACtB,WAAO,iBAAiB,KAAK,MAAM,KAAK;AAAA,EAC1C;AAAA,EAEA,MAAc,YAAsC;AAClD,QAAI,CAAC,KAAK,SAAS;AAGjB,YAAM,MAAM,MAAO,SAAS,yBAAyB,EAAE;AACvD,WAAK,UAAU,IAAI,IAAI,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAAA,IACzD;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,MAAM,MAAiC;AAC3C,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,WAAW,MAAM,OAAO,WAAW,OAAO;AAAA,MAC9C,OAAO,KAAK;AAAA,MACZ,OAAO;AAAA,IACT,CAAC;AACD,WAAO,SAAS,KAAK,CAAC,EAAE;AAAA,EAC1B;AAAA,EAEA,MAAM,WAAW,OAAsC;AACrD,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,WAAW,MAAM,OAAO,WAAW,OAAO;AAAA,MAC9C,OAAO,KAAK;AAAA,MACZ,OAAO;AAAA,IACT,CAAC;AACD,WAAO,SAAS,KACb,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,EAC3B;AACF;","names":[]}