@mnemoai/core 1.1.2 → 1.1.3

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 (191) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +321 -0
  3. package/dist/cli.d.ts +0 -1
  4. package/dist/cli.js +0 -1
  5. package/dist/index.d.ts +0 -115
  6. package/dist/index.js +1 -6
  7. package/dist/src/access-tracker.d.ts +0 -1
  8. package/dist/src/access-tracker.js +0 -1
  9. package/dist/src/adapters/chroma.d.ts +0 -1
  10. package/dist/src/adapters/chroma.js +0 -1
  11. package/dist/src/adapters/lancedb.d.ts +0 -1
  12. package/dist/src/adapters/lancedb.js +0 -1
  13. package/dist/src/adapters/pgvector.d.ts +0 -1
  14. package/dist/src/adapters/pgvector.js +0 -1
  15. package/dist/src/adapters/qdrant.d.ts +0 -1
  16. package/dist/src/adapters/qdrant.js +0 -1
  17. package/dist/src/adaptive-retrieval.d.ts +0 -1
  18. package/dist/src/adaptive-retrieval.js +0 -1
  19. package/dist/src/audit-log.d.ts +0 -1
  20. package/dist/src/audit-log.js +0 -1
  21. package/dist/src/chunker.d.ts +0 -1
  22. package/dist/src/chunker.js +0 -1
  23. package/dist/src/config.d.ts +0 -1
  24. package/dist/src/config.js +0 -1
  25. package/dist/src/decay-engine.d.ts +0 -1
  26. package/dist/src/decay-engine.js +0 -1
  27. package/dist/src/embedder.d.ts +0 -1
  28. package/dist/src/embedder.js +0 -1
  29. package/dist/src/extraction-prompts.d.ts +0 -1
  30. package/dist/src/extraction-prompts.js +0 -1
  31. package/dist/src/license.d.ts +0 -1
  32. package/dist/src/license.js +2 -6
  33. package/dist/src/llm-client.d.ts +0 -1
  34. package/dist/src/llm-client.js +0 -1
  35. package/dist/src/logger.d.ts +0 -1
  36. package/dist/src/logger.js +0 -1
  37. package/dist/src/mcp-server.d.ts +0 -1
  38. package/dist/src/mcp-server.js +0 -1
  39. package/dist/src/memory-categories.d.ts +0 -1
  40. package/dist/src/memory-categories.js +0 -1
  41. package/dist/src/memory-upgrader.d.ts +0 -1
  42. package/dist/src/memory-upgrader.js +0 -1
  43. package/dist/src/migrate.d.ts +0 -1
  44. package/dist/src/migrate.js +0 -1
  45. package/dist/src/mnemo.d.ts +7 -1
  46. package/dist/src/mnemo.js +19 -7
  47. package/dist/src/noise-filter.d.ts +0 -1
  48. package/dist/src/noise-filter.js +0 -1
  49. package/dist/src/noise-prototypes.d.ts +0 -1
  50. package/dist/src/noise-prototypes.js +0 -1
  51. package/dist/src/observability.d.ts +0 -1
  52. package/dist/src/observability.js +0 -1
  53. package/dist/src/query-tracker.d.ts +0 -1
  54. package/dist/src/query-tracker.js +0 -1
  55. package/dist/src/reflection-event-store.d.ts +0 -1
  56. package/dist/src/reflection-event-store.js +0 -1
  57. package/dist/src/reflection-item-store.d.ts +0 -1
  58. package/dist/src/reflection-item-store.js +0 -1
  59. package/dist/src/reflection-mapped-metadata.d.ts +0 -1
  60. package/dist/src/reflection-mapped-metadata.js +0 -1
  61. package/dist/src/reflection-metadata.d.ts +0 -1
  62. package/dist/src/reflection-metadata.js +0 -1
  63. package/dist/src/reflection-ranking.d.ts +0 -1
  64. package/dist/src/reflection-ranking.js +0 -1
  65. package/dist/src/reflection-retry.d.ts +0 -1
  66. package/dist/src/reflection-retry.js +0 -1
  67. package/dist/src/reflection-slices.d.ts +0 -1
  68. package/dist/src/reflection-slices.js +0 -1
  69. package/dist/src/reflection-store.d.ts +0 -1
  70. package/dist/src/reflection-store.js +0 -1
  71. package/dist/src/resonance-state.d.ts +0 -1
  72. package/dist/src/resonance-state.js +0 -1
  73. package/dist/src/retriever.d.ts +0 -1
  74. package/dist/src/retriever.js +0 -1
  75. package/dist/src/scopes.d.ts +0 -1
  76. package/dist/src/scopes.js +0 -1
  77. package/dist/src/self-improvement-files.d.ts +0 -1
  78. package/dist/src/self-improvement-files.js +0 -1
  79. package/dist/src/semantic-gate.d.ts +0 -1
  80. package/dist/src/semantic-gate.js +0 -1
  81. package/dist/src/session-recovery.d.ts +0 -1
  82. package/dist/src/session-recovery.js +0 -1
  83. package/dist/src/smart-extractor.d.ts +0 -1
  84. package/dist/src/smart-extractor.js +0 -1
  85. package/dist/src/smart-metadata.d.ts +0 -1
  86. package/dist/src/smart-metadata.js +0 -1
  87. package/dist/src/storage-adapter.d.ts +0 -1
  88. package/dist/src/storage-adapter.js +0 -1
  89. package/dist/src/store.d.ts +0 -1
  90. package/dist/src/store.js +0 -1
  91. package/dist/src/tier-manager.d.ts +0 -1
  92. package/dist/src/tier-manager.js +0 -1
  93. package/dist/src/tools.d.ts +0 -1
  94. package/dist/src/tools.js +0 -1
  95. package/dist/src/wal-recovery.d.ts +0 -1
  96. package/dist/src/wal-recovery.js +0 -1
  97. package/package.json +1 -1
  98. package/dist/cli.d.ts.map +0 -1
  99. package/dist/cli.js.map +0 -7
  100. package/dist/index.d.ts.map +0 -1
  101. package/dist/index.js.map +0 -7
  102. package/dist/src/access-tracker.d.ts.map +0 -1
  103. package/dist/src/access-tracker.js.map +0 -7
  104. package/dist/src/adapters/chroma.d.ts.map +0 -1
  105. package/dist/src/adapters/chroma.js.map +0 -7
  106. package/dist/src/adapters/lancedb.d.ts.map +0 -1
  107. package/dist/src/adapters/lancedb.js.map +0 -7
  108. package/dist/src/adapters/pgvector.d.ts.map +0 -1
  109. package/dist/src/adapters/pgvector.js.map +0 -7
  110. package/dist/src/adapters/qdrant.d.ts.map +0 -1
  111. package/dist/src/adapters/qdrant.js.map +0 -7
  112. package/dist/src/adaptive-retrieval.d.ts.map +0 -1
  113. package/dist/src/adaptive-retrieval.js.map +0 -7
  114. package/dist/src/audit-log.d.ts.map +0 -1
  115. package/dist/src/audit-log.js.map +0 -7
  116. package/dist/src/chunker.d.ts.map +0 -1
  117. package/dist/src/chunker.js.map +0 -7
  118. package/dist/src/config.d.ts.map +0 -1
  119. package/dist/src/config.js.map +0 -7
  120. package/dist/src/decay-engine.d.ts.map +0 -1
  121. package/dist/src/decay-engine.js.map +0 -7
  122. package/dist/src/embedder.d.ts.map +0 -1
  123. package/dist/src/embedder.js.map +0 -7
  124. package/dist/src/extraction-prompts.d.ts.map +0 -1
  125. package/dist/src/extraction-prompts.js.map +0 -7
  126. package/dist/src/license.d.ts.map +0 -1
  127. package/dist/src/license.js.map +0 -7
  128. package/dist/src/llm-client.d.ts.map +0 -1
  129. package/dist/src/llm-client.js.map +0 -7
  130. package/dist/src/logger.d.ts.map +0 -1
  131. package/dist/src/logger.js.map +0 -7
  132. package/dist/src/mcp-server.d.ts.map +0 -1
  133. package/dist/src/mcp-server.js.map +0 -7
  134. package/dist/src/memory-categories.d.ts.map +0 -1
  135. package/dist/src/memory-categories.js.map +0 -7
  136. package/dist/src/memory-upgrader.d.ts.map +0 -1
  137. package/dist/src/memory-upgrader.js.map +0 -7
  138. package/dist/src/migrate.d.ts.map +0 -1
  139. package/dist/src/migrate.js.map +0 -7
  140. package/dist/src/mnemo.d.ts.map +0 -1
  141. package/dist/src/mnemo.js.map +0 -7
  142. package/dist/src/noise-filter.d.ts.map +0 -1
  143. package/dist/src/noise-filter.js.map +0 -7
  144. package/dist/src/noise-prototypes.d.ts.map +0 -1
  145. package/dist/src/noise-prototypes.js.map +0 -7
  146. package/dist/src/observability.d.ts.map +0 -1
  147. package/dist/src/observability.js.map +0 -7
  148. package/dist/src/query-tracker.d.ts.map +0 -1
  149. package/dist/src/query-tracker.js.map +0 -7
  150. package/dist/src/reflection-event-store.d.ts.map +0 -1
  151. package/dist/src/reflection-event-store.js.map +0 -7
  152. package/dist/src/reflection-item-store.d.ts.map +0 -1
  153. package/dist/src/reflection-item-store.js.map +0 -7
  154. package/dist/src/reflection-mapped-metadata.d.ts.map +0 -1
  155. package/dist/src/reflection-mapped-metadata.js.map +0 -7
  156. package/dist/src/reflection-metadata.d.ts.map +0 -1
  157. package/dist/src/reflection-metadata.js.map +0 -7
  158. package/dist/src/reflection-ranking.d.ts.map +0 -1
  159. package/dist/src/reflection-ranking.js.map +0 -7
  160. package/dist/src/reflection-retry.d.ts.map +0 -1
  161. package/dist/src/reflection-retry.js.map +0 -7
  162. package/dist/src/reflection-slices.d.ts.map +0 -1
  163. package/dist/src/reflection-slices.js.map +0 -7
  164. package/dist/src/reflection-store.d.ts.map +0 -1
  165. package/dist/src/reflection-store.js.map +0 -7
  166. package/dist/src/resonance-state.d.ts.map +0 -1
  167. package/dist/src/resonance-state.js.map +0 -7
  168. package/dist/src/retriever.d.ts.map +0 -1
  169. package/dist/src/retriever.js.map +0 -7
  170. package/dist/src/scopes.d.ts.map +0 -1
  171. package/dist/src/scopes.js.map +0 -7
  172. package/dist/src/self-improvement-files.d.ts.map +0 -1
  173. package/dist/src/self-improvement-files.js.map +0 -7
  174. package/dist/src/semantic-gate.d.ts.map +0 -1
  175. package/dist/src/semantic-gate.js.map +0 -7
  176. package/dist/src/session-recovery.d.ts.map +0 -1
  177. package/dist/src/session-recovery.js.map +0 -7
  178. package/dist/src/smart-extractor.d.ts.map +0 -1
  179. package/dist/src/smart-extractor.js.map +0 -7
  180. package/dist/src/smart-metadata.d.ts.map +0 -1
  181. package/dist/src/smart-metadata.js.map +0 -7
  182. package/dist/src/storage-adapter.d.ts.map +0 -1
  183. package/dist/src/storage-adapter.js.map +0 -7
  184. package/dist/src/store.d.ts.map +0 -1
  185. package/dist/src/store.js.map +0 -7
  186. package/dist/src/tier-manager.d.ts.map +0 -1
  187. package/dist/src/tier-manager.js.map +0 -7
  188. package/dist/src/tools.d.ts.map +0 -1
  189. package/dist/src/tools.js.map +0 -7
  190. package/dist/src/wal-recovery.d.ts.map +0 -1
  191. package/dist/src/wal-recovery.js.map +0 -7
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/mcp-server.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\n/**\n * MCP Server for Mnemo\n *\n * Exposes memory tools (search, store, delete, update, list, stats) over\n * stdio JSON-RPC so Claude Code can call them directly without going through\n * the OpenClaw gateway.\n *\n * Usage:\n * node --import jiti/register src/mcp-server.ts\n *\n * Register with Claude Code:\n * claude mcp add memory -s user -- node --import jiti/register \\\n * /path/to/mnemo/src/mcp-server.ts\n */\n\n// Redirect console.log to stderr \u2014 stdout is reserved for JSON-RPC\nconst _origLog = console.log;\nconsole.log = (...args: any[]) => console.error(...args);\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport { join } from \"node:path\";\nimport { mkdir, appendFile } from \"node:fs/promises\";\n\nimport { log } from \"./logger.js\";\nimport { loadConfigFromOpenClaw, getDefaultDbPath } from \"./config.js\";\nimport { MemoryStore, validateStoragePath } from \"./store.js\";\nimport { createEmbedder, getVectorDimensions } from \"./embedder.js\";\nimport { createRetriever, DEFAULT_RETRIEVAL_CONFIG } from \"./retriever.js\";\nimport { createScopeManager } from \"./scopes.js\";\nimport { isNoise } from \"./noise-filter.js\";\nimport { SemanticGate } from \"./semantic-gate.js\";\nimport { recoverPendingWrites } from \"./wal-recovery.js\";\n\n// ============================================================================\n// Initialization\n// ============================================================================\n\nconst config = loadConfigFromOpenClaw();\n\nconst dbPath = config.dbPath || getDefaultDbPath();\ntry {\n validateStoragePath(dbPath);\n} catch (err) {\n log.error(`mnemo mcp: storage path issue \u2014 ${String(err)}`);\n}\n\nconst vectorDim = getVectorDimensions(\n config.embedding.model || \"text-embedding-3-small\",\n config.embedding.dimensions,\n);\n\nconst store = new MemoryStore({ dbPath, vectorDim });\nconst embedder = createEmbedder({\n provider: \"openai-compatible\",\n apiKey: config.embedding.apiKey,\n model: config.embedding.model || \"text-embedding-3-small\",\n baseURL: config.embedding.baseURL,\n dimensions: config.embedding.dimensions,\n taskQuery: config.embedding.taskQuery,\n taskPassage: config.embedding.taskPassage,\n normalized: config.embedding.normalized,\n});\nlog.warn(`[config-debug] config.retrieval keys: ${JSON.stringify(Object.keys(config.retrieval || {}))}`);\nlog.warn(`[config-debug] config.retrieval.rerankApiKey: ${config.retrieval?.rerankApiKey ? 'SET(' + String(config.retrieval.rerankApiKey).substring(0, 8) + ')' : 'EMPTY'}`);\nconst retriever = createRetriever(store, embedder, {\n ...DEFAULT_RETRIEVAL_CONFIG,\n ...config.retrieval,\n});\nconst scopeManager = createScopeManager(config.scopes);\n\n// Inject semantic gate into store\nconst semanticGate = new SemanticGate(embedder);\nstore.setSemanticGate(semanticGate);\n\n// WAL recovery: fire-and-forget on startup\nrecoverPendingWrites().catch((err) => {\n log.error(`mnemo mcp: WAL recovery failed \u2014 ${String(err)}`);\n});\n\n// ============================================================================\n// Markdown Mirror (simplified \u2014 no OpenClaw API dependency)\n// ============================================================================\n\nconst mirrorDir = config.mdMirror?.enabled\n ? (config.mdMirror.dir || join(getDefaultDbPath(), \"..\", \"lancedb-pro-mirror\"))\n : null;\n\nasync function mirrorWrite(\n text: string,\n category: string,\n scope: string,\n timestamp?: number,\n): Promise<void> {\n if (!mirrorDir) return;\n try {\n const ts = new Date(timestamp || Date.now());\n const dateStr = ts.toISOString().split(\"T\")[0];\n const filePath = join(mirrorDir, `${dateStr}.md`);\n const safeText = text.replace(/\\n/g, \" \").slice(0, 500);\n const line = `- ${ts.toISOString()} [${category}:${scope}] source=mcp ${safeText}\\n`;\n await mkdir(mirrorDir, { recursive: true });\n await appendFile(filePath, line, \"utf8\");\n } catch {\n // Fail-open: mirror errors never block tool responses\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction clampInt(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) return min;\n return Math.min(max, Math.max(min, Math.floor(value)));\n}\n\nfunction clamp01(value: number, fallback = 0.7): number {\n if (!Number.isFinite(value)) return fallback;\n return Math.min(1, Math.max(0, value));\n}\n\n// ============================================================================\n// MCP Server\n// ============================================================================\n\nconst server = new McpServer({\n name: \"mnemo\",\n version: \"1.0.0\",\n});\n\n// --- memory_search ---\nserver.tool(\n \"memory_search\",\n \"Search through long-term memories using hybrid retrieval (vector + keyword search). Use when you need context about user preferences, past decisions, or previously discussed topics.\",\n {\n query: z.string().describe(\"Search query for finding relevant memories\"),\n limit: z.number().optional().describe(\"Max results to return (default: 5, max: 20)\"),\n scope: z.string().optional().describe(\"Specific memory scope to search in\"),\n category: z.enum([\"preference\", \"fact\", \"decision\", \"entity\", \"other\"]).optional(),\n },\n async ({ query, limit = 5, scope, category }) => {\n try {\n const safeLimit = clampInt(limit, 1, 20);\n\n let scopeFilter = scopeManager.getAccessibleScopes();\n if (scope) {\n if (scopeManager.isAccessible(scope)) {\n scopeFilter = [scope];\n } else {\n return { content: [{ type: \"text\" as const, text: `Access denied to scope: ${scope}` }] };\n }\n }\n\n const results = await retriever.retrieve({\n query,\n limit: safeLimit,\n scopeFilter,\n category,\n source: \"manual\",\n });\n\n if (results.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No relevant memories found.\" }] };\n }\n\n const text = results\n .map((r, i) => {\n const sources: string[] = [];\n if (r.sources.vector) sources.push(\"vector\");\n if (r.sources.bm25) sources.push(\"BM25\");\n if (r.sources.reranked) sources.push(\"reranked\");\n return `${i + 1}. [${r.entry.id}] [${r.entry.category}:${r.entry.scope}] ${r.entry.text} (${(r.score * 100).toFixed(0)}%${sources.length > 0 ? `, ${sources.join(\"+\")}` : \"\"})`;\n })\n .join(\"\\n\");\n\n return { content: [{ type: \"text\" as const, text: `Found ${results.length} memories:\\n\\n${text}` }] };\n } catch (error) {\n return { content: [{ type: \"text\" as const, text: `Memory search failed: ${error instanceof Error ? error.message : String(error)}` }] };\n }\n },\n);\n\n// --- memory_store ---\nserver.tool(\n \"memory_store\",\n \"Save important information in long-term memory. Use for preferences, facts, decisions, and other notable information.\",\n {\n text: z.string().describe(\"Information to remember\"),\n importance: z.number().optional().describe(\"Importance score 0-1 (default: 0.7)\"),\n category: z.enum([\"preference\", \"fact\", \"decision\", \"entity\", \"other\"]).optional(),\n scope: z.string().optional().describe(\"Memory scope (optional, defaults to global)\"),\n },\n async ({ text, importance = 0.7, category = \"other\", scope }) => {\n try {\n let targetScope = scope || scopeManager.getDefaultScope();\n\n if (!scopeManager.isAccessible(targetScope)) {\n return { content: [{ type: \"text\" as const, text: `Access denied to scope: ${targetScope}` }] };\n }\n\n if (isNoise(text)) {\n return { content: [{ type: \"text\" as const, text: \"Skipped: text detected as noise (greeting, boilerplate, or meta-question)\" }] };\n }\n\n const safeImportance = clamp01(importance, 0.7);\n const vector = await embedder.embedPassage(text);\n\n // Dedup check (fail-open)\n let existing: Awaited<ReturnType<typeof store.vectorSearch>> = [];\n try {\n existing = await store.vectorSearch(vector, 1, 0.1, [targetScope]);\n } catch {\n // Dedup check failed \u2014 continue store\n }\n\n if (existing.length > 0 && existing[0].score > 0.98) {\n return {\n content: [{ type: \"text\" as const, text: `Similar memory already exists: \"${existing[0].entry.text}\"` }],\n };\n }\n\n const entry = await store.store({\n text,\n vector,\n importance: safeImportance,\n category: category as any,\n scope: targetScope,\n });\n\n await mirrorWrite(text, category, targetScope, entry.timestamp);\n\n return {\n content: [{ type: \"text\" as const, text: `Stored: \"${text.slice(0, 100)}${text.length > 100 ? \"...\" : \"\"}\" [id=${entry.id}] in scope '${targetScope}'` }],\n };\n } catch (error) {\n return { content: [{ type: \"text\" as const, text: `Memory storage failed: ${error instanceof Error ? error.message : String(error)}` }] };\n }\n },\n);\n\n// --- memory_delete ---\nserver.tool(\n \"memory_delete\",\n \"Delete a specific memory by ID.\",\n {\n memoryId: z.string().describe(\"Memory ID to delete (full UUID or 8+ char prefix)\"),\n },\n async ({ memoryId }) => {\n try {\n const scopeFilter = scopeManager.getAccessibleScopes();\n const deleted = await store.delete(memoryId, scopeFilter);\n if (deleted) {\n return { content: [{ type: \"text\" as const, text: `Memory ${memoryId} deleted.` }] };\n }\n return { content: [{ type: \"text\" as const, text: `Memory ${memoryId} not found or access denied.` }] };\n } catch (error) {\n return { content: [{ type: \"text\" as const, text: `Memory deletion failed: ${error instanceof Error ? error.message : String(error)}` }] };\n }\n },\n);\n\n// --- memory_update ---\nserver.tool(\n \"memory_update\",\n \"Update an existing memory in-place. Preserves original timestamp.\",\n {\n memoryId: z.string().describe(\"ID of the memory to update (full UUID or 8+ char prefix)\"),\n text: z.string().optional().describe(\"New text content (triggers re-embedding)\"),\n importance: z.number().optional().describe(\"New importance score 0-1\"),\n category: z.enum([\"preference\", \"fact\", \"decision\", \"entity\", \"other\"]).optional(),\n },\n async ({ memoryId, text, importance, category }) => {\n try {\n if (!text && importance === undefined && !category) {\n return { content: [{ type: \"text\" as const, text: \"Nothing to update. Provide at least one of: text, importance, category.\" }] };\n }\n\n const scopeFilter = scopeManager.getAccessibleScopes();\n\n let newVector: number[] | undefined;\n if (text) {\n if (isNoise(text)) {\n return { content: [{ type: \"text\" as const, text: \"Skipped: updated text detected as noise\" }] };\n }\n newVector = await embedder.embedPassage(text);\n }\n\n const updates: Record<string, any> = {};\n if (text) updates.text = text;\n if (newVector) updates.vector = newVector;\n if (importance !== undefined) updates.importance = clamp01(importance, 0.7);\n if (category) updates.category = category;\n\n const updated = await store.update(memoryId, updates, scopeFilter);\n\n if (!updated) {\n return { content: [{ type: \"text\" as const, text: `Memory ${memoryId} not found or access denied.` }] };\n }\n\n return {\n content: [{ type: \"text\" as const, text: `Updated memory ${updated.id.slice(0, 8)}...: \"${updated.text.slice(0, 80)}${updated.text.length > 80 ? \"...\" : \"\"}\"` }],\n };\n } catch (error) {\n return { content: [{ type: \"text\" as const, text: `Memory update failed: ${error instanceof Error ? error.message : String(error)}` }] };\n }\n },\n);\n\n// --- memory_list ---\nserver.tool(\n \"memory_list\",\n \"List recent memories with optional filtering by scope and category.\",\n {\n limit: z.number().optional().describe(\"Max memories to list (default: 10, max: 50)\"),\n offset: z.number().optional().describe(\"Number of memories to skip (default: 0)\"),\n scope: z.string().optional().describe(\"Filter by specific scope\"),\n category: z.enum([\"preference\", \"fact\", \"decision\", \"entity\", \"other\"]).optional(),\n },\n async ({ limit = 10, offset = 0, scope, category }) => {\n try {\n const safeLimit = clampInt(limit, 1, 50);\n const safeOffset = clampInt(offset, 0, 1000);\n\n let scopeFilter = scopeManager.getAccessibleScopes();\n if (scope) {\n if (scopeManager.isAccessible(scope)) {\n scopeFilter = [scope];\n } else {\n return { content: [{ type: \"text\" as const, text: `Access denied to scope: ${scope}` }] };\n }\n }\n\n const entries = await store.list(scopeFilter, category, safeLimit, safeOffset);\n\n if (entries.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No memories found.\" }] };\n }\n\n const text = entries\n .map((entry, i) => {\n const date = new Date(entry.timestamp).toISOString().split(\"T\")[0];\n return `${safeOffset + i + 1}. [${entry.id}] [${entry.category}:${entry.scope}] ${entry.text.slice(0, 100)}${entry.text.length > 100 ? \"...\" : \"\"} (${date})`;\n })\n .join(\"\\n\");\n\n return { content: [{ type: \"text\" as const, text: `Recent memories (showing ${entries.length}):\\n\\n${text}` }] };\n } catch (error) {\n return { content: [{ type: \"text\" as const, text: `Failed to list memories: ${error instanceof Error ? error.message : String(error)}` }] };\n }\n },\n);\n\n// --- memory_stats ---\nserver.tool(\n \"memory_stats\",\n \"Get statistics about memory usage, scopes, and categories.\",\n {\n scope: z.string().optional().describe(\"Specific scope to get stats for\"),\n },\n async ({ scope }) => {\n try {\n let scopeFilter = scopeManager.getAccessibleScopes();\n if (scope) {\n if (scopeManager.isAccessible(scope)) {\n scopeFilter = [scope];\n } else {\n return { content: [{ type: \"text\" as const, text: `Access denied to scope: ${scope}` }] };\n }\n }\n\n const stats = await store.stats(scopeFilter);\n const scopeManagerStats = scopeManager.getStats();\n const retrievalConfig = retriever.getConfig();\n\n const text = [\n `Memory Statistics:`,\n ` Total memories: ${stats.totalCount}`,\n ` Available scopes: ${scopeManagerStats.totalScopes}`,\n ` Retrieval mode: ${retrievalConfig.mode}`,\n ` FTS support: ${store.hasFtsSupport ? \"Yes\" : \"No\"}`,\n ``,\n `Memories by scope:`,\n ...Object.entries(stats.scopeCounts).map(\n ([s, count]) => ` ${s}: ${count}`,\n ),\n ``,\n `Memories by category:`,\n ...Object.entries(stats.categoryCounts).map(\n ([c, count]) => ` ${c}: ${count}`,\n ),\n ].join(\"\\n\");\n\n return { content: [{ type: \"text\" as const, text }] };\n } catch (error) {\n return { content: [{ type: \"text\" as const, text: `Failed to get memory stats: ${error instanceof Error ? error.message : String(error)}` }] };\n }\n },\n);\n\n// ============================================================================\n// Start\n// ============================================================================\n\nasync function main() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n log.error(\"mnemo MCP server started (stdio)\");\n}\n\nmain().catch((err) => {\n log.error(\"Fatal:\", err);\n process.exit(1);\n});\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory-categories.d.ts","sourceRoot":"","sources":["../../src/memory-categories.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,eAAO,MAAM,iBAAiB,gFAOpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,0DAA0D;AAC1D,eAAO,MAAM,uBAAuB,+EAAuC,CAAC;AAE5E,6DAA6D;AAC7D,eAAO,MAAM,0BAA0B,+EAIrC,CAAC;AAEH,uEAAuE;AACvE,eAAO,MAAM,sBAAsB,+EAGjC,CAAC;AAEH,mDAAmD;AACnD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;AAE3D,6DAA6D;AAC7D,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,+BAA+B;AAC/B,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,eAAe,GAAG,YAAY,CAAC;AAErG,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,gDAAgD;AAChD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAMpE"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/memory-categories.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: MIT\n/**\n * Memory Categories \u2014 6-category classification system\n *\n * UserMemory: profile, preferences, entities, events\n * AgentMemory: cases, patterns\n */\n\nexport const MEMORY_CATEGORIES = [\n \"profile\",\n \"preferences\",\n \"entities\",\n \"events\",\n \"cases\",\n \"patterns\",\n] as const;\n\nexport type MemoryCategory = (typeof MEMORY_CATEGORIES)[number];\n\n/** Categories that always merge (skip dedup entirely). */\nexport const ALWAYS_MERGE_CATEGORIES = new Set<MemoryCategory>([\"profile\"]);\n\n/** Categories that support MERGE decision from LLM dedup. */\nexport const MERGE_SUPPORTED_CATEGORIES = new Set<MemoryCategory>([\n \"preferences\",\n \"entities\",\n \"patterns\",\n]);\n\n/** Categories that are append-only (CREATE or SKIP only, no MERGE). */\nexport const APPEND_ONLY_CATEGORIES = new Set<MemoryCategory>([\n \"events\",\n \"cases\",\n]);\n\n/** Memory tier levels for lifecycle management. */\nexport type MemoryTier = \"core\" | \"working\" | \"peripheral\";\n\n/** A candidate memory extracted from conversation by LLM. */\nexport type CandidateMemory = {\n category: MemoryCategory;\n abstract: string; // L0: one-sentence index\n overview: string; // L1: structured markdown summary\n content: string; // L2: full narrative\n};\n\n/** Dedup decision from LLM. */\nexport type DedupDecision = \"create\" | \"merge\" | \"skip\" | \"support\" | \"contextualize\" | \"contradict\";\n\nexport type DedupResult = {\n decision: DedupDecision;\n reason: string;\n matchId?: string; // ID of existing memory to merge with\n contextLabel?: string; // Optional context label for support/contextualize/contradict\n};\n\nexport type ExtractionStats = {\n created: number;\n merged: number;\n skipped: number;\n supported?: number; // context-aware support count\n};\n\n/** Validate and normalize a category string. */\nexport function normalizeCategory(raw: string): MemoryCategory | null {\n const lower = raw.toLowerCase().trim();\n if ((MEMORY_CATEGORIES as readonly string[]).includes(lower)) {\n return lower as MemoryCategory;\n }\n return null;\n}\n"],
5
- "mappings": "AAQO,MAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,MAAM,0BAA0B,oBAAI,IAAoB,CAAC,SAAS,CAAC;AAGnE,MAAM,6BAA6B,oBAAI,IAAoB;AAAA,EAChE;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,MAAM,yBAAyB,oBAAI,IAAoB;AAAA,EAC5D;AAAA,EACA;AACF,CAAC;AA+BM,SAAS,kBAAkB,KAAoC;AACpE,QAAM,QAAQ,IAAI,YAAY,EAAE,KAAK;AACrC,MAAK,kBAAwC,SAAS,KAAK,GAAG;AAC5D,WAAO;AAAA,EACT;AACA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory-upgrader.d.ts","sourceRoot":"","sources":["../../src/memory-upgrader.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAUjD,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,sBAAsB;IACtB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AA8GD,qBAAa,cAAc;IAIvB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO;IALjB,OAAO,CAAC,GAAG,CAAwB;gBAGzB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,SAAS,GAAG,IAAI,EACrB,OAAO,GAAE,cAAmB;IAKtC;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;IAW3C;;OAEG;IACG,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACjD,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC,CAAC;IAeF;;;OAGG;IACG,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAkFnE;;OAEG;YACW,YAAY;CA8E3B;AAMD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,SAAS,GAAG,IAAI,EACrB,OAAO,GAAE,cAAmB,GAC3B,cAAc,CAEhB"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/memory-upgrader.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\n/**\n * Memory Upgrader \u2014 Convert legacy memories to new smart memory format\n *\n * Legacy memories lack L0/L1/L2 metadata, memory_category (6-category),\n * tier, access_count, and confidence fields. This module enriches them\n * to enable unified memory lifecycle management (decay, tier promotion,\n * smart dedup).\n *\n * Pipeline per memory:\n * 1. Detect legacy format (missing `memory_category` in metadata)\n * 2. Reverse-map 5-category \u2192 6-category\n * 3. Generate L0/L1/L2 via LLM (or fallback to simple rules)\n * 4. Write enriched metadata back via store.update()\n */\n\nimport type { MemoryStore, MemoryEntry } from \"./store.js\";\nimport type { LlmClient } from \"./llm-client.js\";\nimport type { MemoryCategory } from \"./memory-categories.js\";\nimport type { MemoryTier } from \"./memory-categories.js\";\nimport { buildSmartMetadata, stringifySmartMetadata } from \"./smart-metadata.js\";\nimport { log } from \"./logger.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UpgradeOptions {\n /** Only report counts without modifying data (default: false) */\n dryRun?: boolean;\n /** Number of memories to process per batch (default: 10) */\n batchSize?: number;\n /** Skip LLM calls; use simple text truncation for L0/L1 (default: false) */\n noLlm?: boolean;\n /** Maximum number of memories to upgrade (default: unlimited) */\n limit?: number;\n /** Scope filter \u2014 only upgrade memories in these scopes */\n scopeFilter?: string[];\n /** Logger function */\n log?: (msg: string) => void;\n}\n\nexport interface UpgradeResult {\n /** Total legacy memories found */\n totalLegacy: number;\n /** Successfully upgraded count */\n upgraded: number;\n /** Skipped (already new format) */\n skipped: number;\n /** Errors encountered */\n errors: string[];\n}\n\ninterface EnrichedMetadata {\n l0_abstract: string;\n l1_overview: string;\n l2_content: string;\n memory_category: MemoryCategory;\n tier: MemoryTier;\n access_count: number;\n confidence: number;\n last_accessed_at: number;\n upgraded_from: string; // original 5-category\n upgraded_at: number; // timestamp of upgrade\n}\n\n// ============================================================================\n// Reverse Category Mapping\n// ============================================================================\n\n/**\n * Reverse-map old 5-category \u2192 new 6-category.\n *\n * Ambiguous case: `fact` maps to both `profile` and `cases`.\n * Without LLM, defaults to `cases` (conservative).\n * With LLM, the enrichment prompt will determine the correct category.\n */\nfunction reverseMapCategory(\n oldCategory: MemoryEntry[\"category\"],\n text: string,\n): MemoryCategory {\n switch (oldCategory) {\n case \"preference\":\n return \"preferences\";\n case \"entity\":\n return \"entities\";\n case \"decision\":\n return \"events\";\n case \"other\":\n return \"patterns\";\n case \"fact\":\n // Heuristic: if text looks like personal identity info, map to profile\n if (\n /\\b(my |i am |i'm |name is |\u53EB\u6211|\u6211\u7684|\u6211\u662F)\\b/i.test(text) &&\n text.length < 200\n ) {\n return \"profile\";\n }\n return \"cases\";\n default:\n return \"patterns\";\n }\n}\n\n// ============================================================================\n// LLM Upgrade Prompt\n// ============================================================================\n\nfunction buildUpgradePrompt(text: string, category: MemoryCategory): string {\n return `You are a memory librarian. Given a raw memory text and its category, produce a structured 3-layer summary.\n\n**Category**: ${category}\n\n**Raw memory text**:\n\"\"\"\n${text.slice(0, 2000)}\n\"\"\"\n\nReturn ONLY valid JSON (no markdown fences):\n{\n \"l0_abstract\": \"One sentence (\u226430 words) summarizing the core fact/preference/event\",\n \"l1_overview\": \"A structured markdown summary (2-5 bullet points)\",\n \"l2_content\": \"The full original text, cleaned up if needed\",\n \"resolved_category\": \"${category}\"\n}\n\nRules:\n- l0_abstract must be a single concise sentence, suitable as a search index key\n- l1_overview should use markdown bullet points to structure the information\n- l2_content should preserve the original meaning; may clean up formatting\n- resolved_category: if the text is clearly about personal identity/profile info (name, age, role, etc.), set to \"profile\"; if it's a reusable problem-solution pair, set to \"cases\"; otherwise keep \"${category}\"\n- Respond in the SAME language as the raw memory text`;\n}\n\n// ============================================================================\n// Simple (No-LLM) Enrichment\n// ============================================================================\n\nfunction simpleEnrich(\n text: string,\n category: MemoryCategory,\n): Pick<EnrichedMetadata, \"l0_abstract\" | \"l1_overview\" | \"l2_content\"> {\n // L0: first sentence or first 80 chars\n const firstSentence = text.match(/^[^.!?\u3002\uFF01\uFF1F\\n]+[.!?\u3002\uFF01\uFF1F]?/)?.[0] || text;\n const l0 = firstSentence.slice(0, 100).trim();\n\n // L1: structured as a single bullet\n const l1 = `- ${l0}`;\n\n // L2: full text\n return {\n l0_abstract: l0,\n l1_overview: l1,\n l2_content: text,\n };\n}\n\n// ============================================================================\n// Memory Upgrader\n// ============================================================================\n\nexport class MemoryUpgrader {\n private log: (msg: string) => void;\n\n constructor(\n private store: MemoryStore,\n private llm: LlmClient | null,\n private options: UpgradeOptions = {},\n ) {\n this.log = options.log ?? ((msg: string) => log.info(msg));\n }\n\n /**\n * Check if a memory entry is in legacy format (needs upgrade).\n * Legacy = no metadata, or metadata lacks `memory_category`.\n */\n isLegacyMemory(entry: MemoryEntry): boolean {\n if (!entry.metadata) return true;\n try {\n const meta = JSON.parse(entry.metadata);\n // If it has memory_category, it was created by SmartExtractor \u2192 new format\n return !meta.memory_category;\n } catch {\n return true;\n }\n }\n\n /**\n * Scan and count legacy memories without modifying them.\n */\n async countLegacy(scopeFilter?: string[]): Promise<{\n total: number;\n legacy: number;\n byCategory: Record<string, number>;\n }> {\n const allMemories = await this.store.list(scopeFilter, undefined, 10000, 0);\n let legacy = 0;\n const byCategory: Record<string, number> = {};\n\n for (const entry of allMemories) {\n if (this.isLegacyMemory(entry)) {\n legacy++;\n byCategory[entry.category] = (byCategory[entry.category] || 0) + 1;\n }\n }\n\n return { total: allMemories.length, legacy, byCategory };\n }\n\n /**\n * Main upgrade entry point.\n * Scans all memories, filters legacy ones, and enriches them.\n */\n async upgrade(options: UpgradeOptions = {}): Promise<UpgradeResult> {\n const batchSize = options.batchSize ?? this.options.batchSize ?? 10;\n const noLlm = options.noLlm ?? this.options.noLlm ?? false;\n const dryRun = options.dryRun ?? this.options.dryRun ?? false;\n const limit = options.limit ?? this.options.limit;\n\n const result: UpgradeResult = {\n totalLegacy: 0,\n upgraded: 0,\n skipped: 0,\n errors: [],\n };\n\n // Load all memories\n this.log(\"memory-upgrader: scanning memories...\");\n const allMemories = await this.store.list(\n options.scopeFilter ?? this.options.scopeFilter,\n undefined,\n 10000,\n 0,\n );\n\n // Filter legacy memories\n const legacyMemories = allMemories.filter((m) => this.isLegacyMemory(m));\n result.totalLegacy = legacyMemories.length;\n result.skipped = allMemories.length - legacyMemories.length;\n\n if (legacyMemories.length === 0) {\n this.log(\"memory-upgrader: no legacy memories found \u2014 all memories are already in new format\");\n return result;\n }\n\n this.log(\n `memory-upgrader: found ${legacyMemories.length} legacy memories out of ${allMemories.length} total`,\n );\n\n if (dryRun) {\n const byCategory: Record<string, number> = {};\n for (const m of legacyMemories) {\n byCategory[m.category] = (byCategory[m.category] || 0) + 1;\n }\n this.log(\n `memory-upgrader: [DRY-RUN] would upgrade ${legacyMemories.length} memories`,\n );\n this.log(`memory-upgrader: [DRY-RUN] breakdown: ${JSON.stringify(byCategory)}`);\n return result;\n }\n\n // Process in batches\n const toProcess = limit\n ? legacyMemories.slice(0, limit)\n : legacyMemories;\n\n for (let i = 0; i < toProcess.length; i += batchSize) {\n const batch = toProcess.slice(i, i + batchSize);\n this.log(\n `memory-upgrader: processing batch ${Math.floor(i / batchSize) + 1}/${Math.ceil(toProcess.length / batchSize)} (${batch.length} memories)`,\n );\n\n for (const entry of batch) {\n try {\n await this.upgradeEntry(entry, noLlm);\n result.upgraded++;\n } catch (err) {\n const errMsg = `Failed to upgrade ${entry.id}: ${String(err)}`;\n result.errors.push(errMsg);\n this.log(`memory-upgrader: ERROR \u2014 ${errMsg}`);\n }\n }\n\n // Progress report\n this.log(\n `memory-upgrader: progress \u2014 ${result.upgraded} upgraded, ${result.errors.length} errors`,\n );\n }\n\n this.log(\n `memory-upgrader: upgrade complete \u2014 ${result.upgraded} upgraded, ${result.skipped} already new, ${result.errors.length} errors`,\n );\n return result;\n }\n\n /**\n * Upgrade a single legacy memory entry.\n */\n private async upgradeEntry(\n entry: MemoryEntry,\n noLlm: boolean,\n ): Promise<void> {\n // Step 1: Reverse-map category\n let newCategory = reverseMapCategory(entry.category, entry.text);\n\n // Step 2: Generate L0/L1/L2\n let enriched: Pick<EnrichedMetadata, \"l0_abstract\" | \"l1_overview\" | \"l2_content\">;\n\n if (!noLlm && this.llm) {\n try {\n const prompt = buildUpgradePrompt(entry.text, newCategory);\n const llmResult = await this.llm.completeJson<{\n l0_abstract: string;\n l1_overview: string;\n l2_content: string;\n resolved_category?: string;\n }>(prompt);\n\n if (!llmResult) {\n throw new Error(\"LLM returned null\");\n }\n\n enriched = {\n l0_abstract: llmResult.l0_abstract || simpleEnrich(entry.text, newCategory).l0_abstract,\n l1_overview: llmResult.l1_overview || simpleEnrich(entry.text, newCategory).l1_overview,\n l2_content: llmResult.l2_content || entry.text,\n };\n\n // LLM may have resolved the ambiguous fact\u2192profile/cases\n if (llmResult.resolved_category) {\n const validCategories = new Set([\n \"profile\", \"preferences\", \"entities\", \"events\", \"cases\", \"patterns\",\n ]);\n if (validCategories.has(llmResult.resolved_category)) {\n newCategory = llmResult.resolved_category as MemoryCategory;\n }\n }\n } catch (err) {\n this.log(\n `memory-upgrader: LLM enrichment failed for ${entry.id}, falling back to simple \u2014 ${String(err)}`,\n );\n enriched = simpleEnrich(entry.text, newCategory);\n }\n } else {\n enriched = simpleEnrich(entry.text, newCategory);\n }\n\n // Step 3: Build enriched metadata\n const existingMeta = entry.metadata ? (() => {\n try { return JSON.parse(entry.metadata!); } catch { return {}; }\n })() : {};\n\n const newMetadata: EnrichedMetadata = {\n ...buildSmartMetadata(\n { ...entry, metadata: JSON.stringify(existingMeta) },\n {\n l0_abstract: enriched.l0_abstract,\n l1_overview: enriched.l1_overview,\n l2_content: enriched.l2_content,\n memory_category: newCategory,\n tier: \"working\" as MemoryTier,\n access_count: 0,\n confidence: 0.7,\n },\n ),\n upgraded_from: entry.category,\n upgraded_at: Date.now(),\n };\n\n // Step 4: Update the memory entry\n await this.store.update(entry.id, {\n // Update text to L0 abstract for better search indexing\n text: enriched.l0_abstract,\n metadata: stringifySmartMetadata(newMetadata),\n });\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createMemoryUpgrader(\n store: MemoryStore,\n llm: LlmClient | null,\n options: UpgradeOptions = {},\n): MemoryUpgrader {\n return new MemoryUpgrader(store, llm, options);\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/migrate.ts"],"names":[],"mappings":"AACA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,YAAY,CAAC;AAkB3D,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAmCD,qBAAa,cAAc;IACb,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,WAAW;IAEtC,OAAO,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;YAsDzD,kBAAkB;YA2BlB,cAAc;YAyBd,cAAc;IA4DtB,oBAAoB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,MAAM,EAAE,OAAO,CAAC;QAChB,WAAW,EAAE,OAAO,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IA2BI,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACpD,KAAK,EAAE,OAAO,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CAwCH;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,cAAc,CAEvE;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAClD,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CAyBD"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/migrate.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: MIT\n/**\n * Migration Utilities\n * Migrates data from old memory-lancedb plugin to memory-lancedb-pro\n */\n\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport type { MemoryStore, MemoryEntry } from \"./store.js\";\nimport { loadLanceDB } from \"./store.js\";\nimport { log } from \"./logger.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface LegacyMemoryEntry {\n id: string;\n text: string;\n vector: number[];\n importance: number;\n category: \"preference\" | \"fact\" | \"decision\" | \"entity\" | \"other\";\n createdAt: number;\n scope?: string;\n}\n\ninterface MigrationResult {\n success: boolean;\n migratedCount: number;\n skippedCount: number;\n errors: string[];\n summary: string;\n}\n\ninterface MigrationOptions {\n sourceDbPath?: string;\n dryRun?: boolean;\n defaultScope?: string;\n skipExisting?: boolean;\n}\n\nfunction normalizeLegacyVector(value: unknown): number[] {\n if (Array.isArray(value)) {\n return value.map((n) => Number(n));\n }\n\n if (\n value &&\n typeof value === \"object\" &&\n Symbol.iterator in (value as Record<PropertyKey, unknown>)\n ) {\n return Array.from(value as Iterable<unknown>, (n) => Number(n));\n }\n\n return [];\n}\n\n// ============================================================================\n// Default Paths\n// ============================================================================\n\nfunction getDefaultLegacyPaths(): string[] {\n const home = homedir();\n return [\n join(home, \".openclaw\", \"memory\", \"lancedb\"),\n join(home, \".claude\", \"memory\", \"lancedb\"),\n // Add more legacy paths as needed\n ];\n}\n\n// ============================================================================\n// Migration Functions\n// ============================================================================\n\nexport class MemoryMigrator {\n constructor(private targetStore: MemoryStore) {}\n\n async migrate(options: MigrationOptions = {}): Promise<MigrationResult> {\n const result: MigrationResult = {\n success: false,\n migratedCount: 0,\n skippedCount: 0,\n errors: [],\n summary: \"\",\n };\n\n try {\n // Find source database\n const sourceDbPath = await this.findSourceDatabase(options.sourceDbPath);\n if (!sourceDbPath) {\n result.errors.push(\"No legacy database found to migrate from\");\n result.summary = \"Migration failed: No source database found\";\n return result;\n }\n\n log.info(`Migrating from: ${sourceDbPath}`);\n\n // Load legacy data\n const legacyEntries = await this.loadLegacyData(sourceDbPath);\n if (legacyEntries.length === 0) {\n result.summary = \"Migration completed: No data to migrate\";\n result.success = true;\n return result;\n }\n\n log.info(`Found ${legacyEntries.length} entries to migrate`);\n\n // Migrate entries\n if (!options.dryRun) {\n const migrationStats = await this.migrateEntries(legacyEntries, options);\n result.migratedCount = migrationStats.migrated;\n result.skippedCount = migrationStats.skipped;\n result.errors.push(...migrationStats.errors);\n } else {\n result.summary = `Dry run: Would migrate ${legacyEntries.length} entries`;\n result.success = true;\n return result;\n }\n\n result.success = result.errors.length === 0;\n result.summary = `Migration ${result.success ? 'completed' : 'completed with errors'}: ` +\n `${result.migratedCount} migrated, ${result.skippedCount} skipped`;\n\n } catch (error) {\n result.errors.push(`Migration failed: ${error instanceof Error ? error.message : String(error)}`);\n result.summary = \"Migration failed due to unexpected error\";\n }\n\n return result;\n }\n\n private async findSourceDatabase(explicitPath?: string): Promise<string | null> {\n if (explicitPath) {\n try {\n await fs.access(explicitPath);\n return explicitPath;\n } catch {\n return null;\n }\n }\n\n // Check default legacy paths\n for (const path of getDefaultLegacyPaths()) {\n try {\n await fs.access(path);\n const files = await fs.readdir(path);\n // Check for LanceDB files\n if (files.some(f => f.endsWith('.lance') || f === 'memories.lance')) {\n return path;\n }\n } catch {\n continue;\n }\n }\n\n return null;\n }\n\n private async loadLegacyData(sourceDbPath: string, limit?: number): Promise<LegacyMemoryEntry[]> {\n const lancedb = await loadLanceDB();\n const db = await lancedb.connect(sourceDbPath);\n\n try {\n const table = await db.openTable(\"memories\");\n let query = table.query();\n if (limit) query = query.limit(limit);\n const entries = await query.toArray();\n\n return entries.map((row): LegacyMemoryEntry => ({\n id: row.id as string,\n text: row.text as string,\n vector: normalizeLegacyVector(row.vector),\n importance: Number(row.importance),\n category: (row.category as LegacyMemoryEntry[\"category\"]) || \"other\",\n createdAt: Number(row.createdAt),\n scope: row.scope as string | undefined,\n }));\n } catch (error) {\n log.warn(`Failed to load legacy data: ${error}`);\n return [];\n }\n }\n\n private async migrateEntries(\n legacyEntries: LegacyMemoryEntry[],\n options: MigrationOptions\n ): Promise<{ migrated: number; skipped: number; errors: string[] }> {\n let migrated = 0;\n let skipped = 0;\n const errors: string[] = [];\n\n const defaultScope = options.defaultScope || \"global\";\n\n for (const legacy of legacyEntries) {\n try {\n // Check if entry already exists (if skipExisting is enabled)\n if (options.skipExisting) {\n if (legacy.id && (await this.targetStore.hasId(legacy.id))) {\n skipped++;\n continue;\n }\n\n const existing = await this.targetStore.vectorSearch(\n legacy.vector, 1, 0.9, [legacy.scope || defaultScope]\n );\n if (existing.length > 0 && existing[0].score > 0.95) {\n skipped++;\n continue;\n }\n }\n\n // Convert legacy entry to new format while preserving legacy identity.\n const newEntry: MemoryEntry = {\n id: legacy.id,\n text: legacy.text,\n vector: legacy.vector,\n category: legacy.category,\n scope: legacy.scope || defaultScope,\n importance: legacy.importance,\n timestamp: Number.isFinite(legacy.createdAt) ? legacy.createdAt : Date.now(),\n metadata: JSON.stringify({\n migratedFrom: \"memory-lancedb\",\n originalId: legacy.id,\n originalCreatedAt: legacy.createdAt,\n }),\n };\n\n await this.targetStore.importEntry(newEntry);\n migrated++;\n\n if (migrated % 100 === 0) {\n log.info(`Migrated ${migrated}/${legacyEntries.length} entries...`);\n }\n\n } catch (error) {\n errors.push(`Failed to migrate entry ${legacy.id}: ${error}`);\n skipped++;\n }\n }\n\n return { migrated, skipped, errors };\n }\n\n async checkMigrationNeeded(sourceDbPath?: string): Promise<{\n needed: boolean;\n sourceFound: boolean;\n sourceDbPath?: string;\n entryCount?: number;\n }> {\n const sourcePath = await this.findSourceDatabase(sourceDbPath);\n\n if (!sourcePath) {\n return {\n needed: false,\n sourceFound: false,\n };\n }\n\n try {\n const entries = await this.loadLegacyData(sourcePath, 1);\n return {\n needed: entries.length > 0,\n sourceFound: true,\n sourceDbPath: sourcePath,\n entryCount: entries.length > 0 ? undefined : 0,\n };\n } catch (error) {\n return {\n needed: false,\n sourceFound: true,\n sourceDbPath: sourcePath,\n };\n }\n }\n\n async verifyMigration(sourceDbPath?: string): Promise<{\n valid: boolean;\n sourceCount: number;\n targetCount: number;\n issues: string[];\n }> {\n const issues: string[] = [];\n\n try {\n const sourcePath = await this.findSourceDatabase(sourceDbPath);\n if (!sourcePath) {\n return {\n valid: false,\n sourceCount: 0,\n targetCount: 0,\n issues: [\"Source database not found\"],\n };\n }\n\n const sourceEntries = await this.loadLegacyData(sourcePath);\n const targetStats = await this.targetStore.stats();\n\n const sourceCount = sourceEntries.length;\n const targetCount = targetStats.totalCount;\n\n if (targetCount < sourceCount) {\n issues.push(`Target has fewer entries (${targetCount}) than source (${sourceCount})`);\n }\n\n return {\n valid: issues.length === 0,\n sourceCount,\n targetCount,\n issues,\n };\n\n } catch (error) {\n return {\n valid: false,\n sourceCount: 0,\n targetCount: 0,\n issues: [`Verification failed: ${error}`],\n };\n }\n }\n}\n\nexport function createMigrator(targetStore: MemoryStore): MemoryMigrator {\n return new MemoryMigrator(targetStore);\n}\n\nexport async function migrateFromLegacy(\n targetStore: MemoryStore,\n options: MigrationOptions = {}\n): Promise<MigrationResult> {\n const migrator = createMigrator(targetStore);\n return migrator.migrate(options);\n}\n\nexport async function checkForLegacyData(): Promise<{\n found: boolean;\n paths: string[];\n totalEntries: number;\n}> {\n const paths: string[] = [];\n let totalEntries = 0;\n\n for (const path of getDefaultLegacyPaths()) {\n try {\n const lancedb = await loadLanceDB();\n const db = await lancedb.connect(path);\n const table = await db.openTable(\"memories\");\n const entries = await table.query().select([\"id\"]).toArray();\n\n if (entries.length > 0) {\n paths.push(path);\n totalEntries += entries.length;\n }\n } catch {\n continue;\n }\n }\n\n return {\n found: paths.length > 0,\n paths,\n totalEntries,\n };\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"mnemo.d.ts","sourceRoot":"","sources":["../../src/mnemo.ts"],"names":[],"mappings":"AACA;;;GAGG;AASH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE;QACT,QAAQ,EAAE,mBAAmB,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE;QACN,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,IAAI,CAAC,EAAE;QACL,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,SAAS,CAAC,EAAE;QACV,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,MAAM,CAAC,EAAE,eAAe,GAAG,aAAa,GAAG,MAAM,CAAC;QAClD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,KAAK,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE5B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC,CAAC;IAEJ,KAAK,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAkE7E"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/mnemo.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: MIT\n/**\n * Mnemo Core \u2014 simplified entry point\n * Usage: const mnemo = await createMnemo(config)\n */\n\nimport { MemoryStore } from \"./store.js\";\nimport { createRetriever, DEFAULT_RETRIEVAL_CONFIG } from \"./retriever.js\";\nimport { Embedder } from \"./embedder.js\";\nimport { createDecayEngine, DEFAULT_DECAY_CONFIG } from \"./decay-engine.js\";\nimport { SmartExtractor } from \"./smart-extractor.js\";\nimport { createLlmClient } from \"./llm-client.js\";\n\nexport interface MnemoConfig {\n embedding: {\n provider: \"openai-compatible\";\n apiKey: string;\n baseURL?: string;\n model?: string;\n dimensions?: number;\n taskQuery?: string;\n taskPassage?: string;\n };\n dbPath: string;\n decay?: {\n recencyHalfLifeDays?: number;\n recencyWeight?: number;\n frequencyWeight?: number;\n intrinsicWeight?: number;\n };\n tier?: {\n coreAccessThreshold?: number;\n coreImportanceThreshold?: number;\n peripheralAgeDays?: number;\n };\n llm?: {\n model?: string;\n baseURL?: string;\n apiKey?: string;\n };\n retrieval?: {\n candidatePoolSize?: number;\n rerank?: \"cross-encoder\" | \"lightweight\" | \"none\";\n rerankApiKey?: string;\n rerankModel?: string;\n rerankEndpoint?: string;\n rerankProvider?: string;\n };\n}\n\nexport interface MnemoInstance {\n store(entry: {\n text: string;\n category?: string;\n importance?: number;\n scope?: string;\n }): Promise<{ id: string }>;\n\n recall(query: string, options?: {\n limit?: number;\n scopeFilter?: string[];\n category?: string;\n }): Promise<Array<{\n text: string;\n score: number;\n category: string;\n importance: number;\n timestamp: number;\n }>>;\n\n stats(): Promise<{ totalEntries: number }>;\n\n close(): Promise<void>;\n}\n\nexport async function createMnemo(config: MnemoConfig): Promise<MnemoInstance> {\n const embedder = new Embedder({\n apiKey: config.embedding.apiKey,\n baseURL: config.embedding.baseURL,\n model: config.embedding.model || \"voyage-3-large\",\n dimensions: config.embedding.dimensions || 1024,\n taskQuery: config.embedding.taskQuery,\n taskPassage: config.embedding.taskPassage,\n });\n\n const store = new MemoryStore({\n dbPath: config.dbPath,\n embedder,\n });\n\n await store.initialize();\n\n const decayEngine = createDecayEngine({\n ...DEFAULT_DECAY_CONFIG,\n ...(config.decay || {}),\n });\n\n const retriever = createRetriever(store, embedder, {\n ...DEFAULT_RETRIEVAL_CONFIG,\n ...(config.retrieval || {}),\n }, { decayEngine });\n\n return {\n async store(entry) {\n const vector = await embedder.embed(entry.text);\n const result = await store.store({\n text: entry.text,\n vector,\n category: entry.category || \"fact\",\n importance: entry.importance ?? 0.7,\n scope: entry.scope || \"global\",\n });\n return { id: result.id };\n },\n\n async recall(query, options = {}) {\n const results = await retriever.retrieve({\n query,\n limit: options.limit ?? 5,\n scopeFilter: options.scopeFilter,\n category: options.category,\n source: \"manual\",\n });\n return results.map(r => ({\n text: r.entry.text,\n score: r.score,\n category: r.entry.category || \"fact\",\n importance: r.entry.importance ?? 0.7,\n timestamp: r.entry.timestamp ?? Date.now(),\n }));\n },\n\n async stats() {\n const count = await store.count();\n return { totalEntries: count };\n },\n\n async close() {\n // LanceDB handles cleanup automatically\n },\n };\n}\n"],
5
- "mappings": "AAMA,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB,gCAAgC;AAC1D,SAAS,gBAAgB;AACzB,SAAS,mBAAmB,4BAA4B;AAkExD,eAAsB,YAAY,QAA6C;AAC7E,QAAM,WAAW,IAAI,SAAS;AAAA,IAC5B,QAAQ,OAAO,UAAU;AAAA,IACzB,SAAS,OAAO,UAAU;AAAA,IAC1B,OAAO,OAAO,UAAU,SAAS;AAAA,IACjC,YAAY,OAAO,UAAU,cAAc;AAAA,IAC3C,WAAW,OAAO,UAAU;AAAA,IAC5B,aAAa,OAAO,UAAU;AAAA,EAChC,CAAC;AAED,QAAM,QAAQ,IAAI,YAAY;AAAA,IAC5B,QAAQ,OAAO;AAAA,IACf;AAAA,EACF,CAAC;AAED,QAAM,MAAM,WAAW;AAEvB,QAAM,cAAc,kBAAkB;AAAA,IACpC,GAAG;AAAA,IACH,GAAI,OAAO,SAAS,CAAC;AAAA,EACvB,CAAC;AAED,QAAM,YAAY,gBAAgB,OAAO,UAAU;AAAA,IACjD,GAAG;AAAA,IACH,GAAI,OAAO,aAAa,CAAC;AAAA,EAC3B,GAAG,EAAE,YAAY,CAAC;AAElB,SAAO;AAAA,IACL,MAAM,MAAM,OAAO;AACjB,YAAM,SAAS,MAAM,SAAS,MAAM,MAAM,IAAI;AAC9C,YAAM,SAAS,MAAM,MAAM,MAAM;AAAA,QAC/B,MAAM,MAAM;AAAA,QACZ;AAAA,QACA,UAAU,MAAM,YAAY;AAAA,QAC5B,YAAY,MAAM,cAAc;AAAA,QAChC,OAAO,MAAM,SAAS;AAAA,MACxB,CAAC;AACD,aAAO,EAAE,IAAI,OAAO,GAAG;AAAA,IACzB;AAAA,IAEA,MAAM,OAAO,OAAO,UAAU,CAAC,GAAG;AAChC,YAAM,UAAU,MAAM,UAAU,SAAS;AAAA,QACvC;AAAA,QACA,OAAO,QAAQ,SAAS;AAAA,QACxB,aAAa,QAAQ;AAAA,QACrB,UAAU,QAAQ;AAAA,QAClB,QAAQ;AAAA,MACV,CAAC;AACD,aAAO,QAAQ,IAAI,QAAM;AAAA,QACvB,MAAM,EAAE,MAAM;AAAA,QACd,OAAO,EAAE;AAAA,QACT,UAAU,EAAE,MAAM,YAAY;AAAA,QAC9B,YAAY,EAAE,MAAM,cAAc;AAAA,QAClC,WAAW,EAAE,MAAM,aAAa,KAAK,IAAI;AAAA,MAC3C,EAAE;AAAA,IACJ;AAAA,IAEA,MAAM,QAAQ;AACZ,YAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,aAAO,EAAE,cAAc,MAAM;AAAA,IAC/B;AAAA,IAEA,MAAM,QAAQ;AAAA,IAEd;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"noise-filter.d.ts","sourceRoot":"","sources":["../../src/noise-filter.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAgDH,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yDAAyD;IACzD,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAQD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAY/E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC5B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,CAAC,EAAE,CAGL"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/noise-filter.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: MIT\n/**\n * Noise Filter\n * Filters out low-quality memories (meta-questions, agent denials, session boilerplate)\n * Inspired by openclaw-plugin-continuity's noise filtering approach.\n */\n\n// Agent-side denial patterns\nconst DENIAL_PATTERNS = [\n /i don'?t have (any )?(information|data|memory|record)/i,\n /i'?m not sure about/i,\n /i don'?t recall/i,\n /i don'?t remember/i,\n /it looks like i don'?t/i,\n /i wasn'?t able to find/i,\n /no (relevant )?memories found/i,\n /i don'?t have access to/i,\n];\n\n// User-side meta-question patterns (about memory itself, not content)\nconst META_QUESTION_PATTERNS = [\n /\\bdo you (remember|recall|know about)\\b/i,\n /\\bcan you (remember|recall)\\b/i,\n /\\bdid i (tell|mention|say|share)\\b/i,\n /\\bhave i (told|mentioned|said)\\b/i,\n /\\bwhat did i (tell|say|mention)\\b/i,\n /\u5982\u679C\u4F60\u77E5\u9053.+\u53EA\u56DE\u590D/i,\n /\u5982\u679C\u4E0D\u77E5\u9053.+\u53EA\u56DE\u590D\\s*none/i,\n /\u53EA\u56DE\u590D\u7CBE\u786E\u4EE3\u53F7/i,\n /\u53EA\u56DE\u590D\\s*none/i,\n // Chinese recall / meta-question patterns\n /\u4F60\u8FD8?\u8BB0\u5F97/,\n /\u8BB0\u4E0D\u8BB0\u5F97/,\n /\u8FD8\u8BB0\u5F97.*\u5417/,\n /\u4F60[\u77E5\u6653]\u9053.+\u5417/,\n /\u6211(?:\u4E4B\u524D|\u4E0A\u6B21|\u4EE5\u524D)(?:\u8BF4|\u63D0|\u8BB2).*(?:\u5417|\u5462|\uFF1F|\\?)/,\n];\n\n// Session boilerplate\nconst BOILERPLATE_PATTERNS = [\n /^(hi|hello|hey|good morning|good evening|greetings)/i,\n /^fresh session/i,\n /^new session/i,\n /^HEARTBEAT/i,\n];\n\n// Extractor artifacts from validation prompts / synthetic summaries\nconst DIAGNOSTIC_ARTIFACT_PATTERNS = [\n /\\bquery\\s*->\\s*(none|no explicit solution|unknown|not found)\\b/i,\n /\\buser asked for\\b.*\\b(none|no explicit solution|unknown|not found)\\b/i,\n /\\bno explicit solution\\b/i,\n];\n\nexport interface NoiseFilterOptions {\n /** Filter agent denial responses (default: true) */\n filterDenials?: boolean;\n /** Filter meta-questions about memory (default: true) */\n filterMetaQuestions?: boolean;\n /** Filter session boilerplate (default: true) */\n filterBoilerplate?: boolean;\n}\n\nconst DEFAULT_OPTIONS: Required<NoiseFilterOptions> = {\n filterDenials: true,\n filterMetaQuestions: true,\n filterBoilerplate: true,\n};\n\n/**\n * Check if a memory text is noise that should be filtered out.\n * Returns true if the text is noise.\n */\nexport function isNoise(text: string, options: NoiseFilterOptions = {}): boolean {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const trimmed = text.trim();\n\n if (trimmed.length < 5) return true;\n\n if (opts.filterDenials && DENIAL_PATTERNS.some(p => p.test(trimmed))) return true;\n if (opts.filterMetaQuestions && META_QUESTION_PATTERNS.some(p => p.test(trimmed))) return true;\n if (opts.filterBoilerplate && BOILERPLATE_PATTERNS.some(p => p.test(trimmed))) return true;\n if (DIAGNOSTIC_ARTIFACT_PATTERNS.some(p => p.test(trimmed))) return true;\n\n return false;\n}\n\n/**\n * Filter an array of items, removing noise entries.\n */\nexport function filterNoise<T>(\n items: T[],\n getText: (item: T) => string,\n options?: NoiseFilterOptions\n): T[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n return items.filter(item => !isNoise(getText(item), opts));\n}\n"],
5
- "mappings": "AAQA,MAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,MAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,MAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,MAAM,+BAA+B;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF;AAWA,MAAM,kBAAgD;AAAA,EACpD,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,mBAAmB;AACrB;AAMO,SAAS,QAAQ,MAAc,UAA8B,CAAC,GAAY;AAC/E,QAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAC9C,QAAM,UAAU,KAAK,KAAK;AAE1B,MAAI,QAAQ,SAAS,EAAG,QAAO;AAE/B,MAAI,KAAK,iBAAiB,gBAAgB,KAAK,OAAK,EAAE,KAAK,OAAO,CAAC,EAAG,QAAO;AAC7E,MAAI,KAAK,uBAAuB,uBAAuB,KAAK,OAAK,EAAE,KAAK,OAAO,CAAC,EAAG,QAAO;AAC1F,MAAI,KAAK,qBAAqB,qBAAqB,KAAK,OAAK,EAAE,KAAK,OAAO,CAAC,EAAG,QAAO;AACtF,MAAI,6BAA6B,KAAK,OAAK,EAAE,KAAK,OAAO,CAAC,EAAG,QAAO;AAEpE,SAAO;AACT;AAKO,SAAS,YACd,OACA,SACA,SACK;AACL,QAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAC9C,SAAO,MAAM,OAAO,UAAQ,CAAC,QAAQ,QAAQ,IAAI,GAAG,IAAI,CAAC;AAC3D;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"noise-prototypes.d.ts","sourceRoot":"","sources":["../../src/noise-prototypes.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAqC9C,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAwB;gBAE5B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;IAI5C,uEAAuE;IACvE,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,uDAAuD;IACvD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;OAGG;IACG,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC7C;;;OAGG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,SAAS,SAAoB,GAAG,OAAO;IAQrE;;;;;OAKG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI;CAmBpC"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/noise-prototypes.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: MIT\n/**\n * Embedding-based Noise Prototype Bank\n *\n * Language-agnostic noise detection: maintains a bank of noise prototype\n * embeddings (recall queries, agent denials, greetings). Input texts are\n * compared via cosine similarity \u2014 no regex maintenance required.\n *\n * The bank starts with ~15 built-in multilingual prototypes and grows\n * automatically when the LLM extraction returns zero memories (feedback loop).\n */\n\nimport type { Embedder } from \"./embedder.js\";\n\n// ============================================================================\n// Built-in noise prototypes (multilingual)\n// ============================================================================\n\nconst BUILTIN_NOISE_TEXTS: readonly string[] = [\n // Recall queries\n \"Do you remember what I told you?\",\n \"Can you recall my preferences?\",\n \"What did I say about that?\",\n \"\u4F60\u8FD8\u8BB0\u5F97\u6211\u559C\u6B22\u4EC0\u4E48\u5417\",\n \"\u4F60\u77E5\u9053\u6211\u4E4B\u524D\u8BF4\u8FC7\u4EC0\u4E48\u5417\",\n \"\u8A18\u5F97\u6211\u4E0A\u6B21\u63D0\u5230\u7684\u55CE\",\n \"\u6211\u4E4B\u524D\u8DDF\u4F60\u8BF4\u8FC7\u5417\",\n // Agent denials\n \"I don't have any information about that\",\n \"I don't recall any previous conversation\",\n \"\u6211\u6CA1\u6709\u76F8\u5173\u7684\u8BB0\u5FC6\",\n // Greetings / boilerplate\n \"Hello, how are you doing today?\",\n \"Hi there, what's up\",\n \"\u65B0\u7684\u4E00\u5929\u5F00\u59CB\u4E86\",\n];\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_THRESHOLD = 0.82;\nconst MAX_LEARNED_PROTOTYPES = 200;\nconst DEDUP_THRESHOLD = 0.95;\n\n// ============================================================================\n// NoisePrototypeBank\n// ============================================================================\n\nexport class NoisePrototypeBank {\n private vectors: number[][] = [];\n private builtinCount = 0;\n private _initialized = false;\n private debugLog: (msg: string) => void;\n\n constructor(debugLog?: (msg: string) => void) {\n this.debugLog = debugLog ?? (() => { });\n }\n\n /** Whether the bank has been initialized with prototype embeddings. */\n get initialized(): boolean {\n return this._initialized;\n }\n\n /** Total number of prototypes (built-in + learned). */\n get size(): number {\n return this.vectors.length;\n }\n\n /**\n * Embed all built-in noise prototypes and cache their vectors.\n * Call once at plugin startup. Safe to call multiple times (no-op after first).\n */\n async init(embedder: Embedder): Promise<void> {\n if (this._initialized) return;\n\n for (const text of BUILTIN_NOISE_TEXTS) {\n try {\n const v = await embedder.embed(text);\n if (v && v.length > 0) this.vectors.push(v);\n } catch {\n // Skip failed embeddings \u2014 bank will work with whatever succeeds\n }\n }\n this.builtinCount = this.vectors.length;\n this._initialized = true;\n\n // Degeneracy check: if all prototype vectors are nearly identical, the\n // embedding model does not produce discriminative outputs (e.g. a\n // deterministic mock that ignores text). In that case the noise bank\n // would flag every input as noise, so we disable ourselves.\n if (this.vectors.length >= 2) {\n const sim = cosine(this.vectors[0], this.vectors[1]);\n if (sim > 0.98) {\n this.debugLog(\n `noise-prototype-bank: degenerate embeddings detected (pairwise cosine=${sim.toFixed(4)}), disabling noise filter`,\n );\n this._initialized = false;\n this.vectors = [];\n return;\n }\n }\n\n this.debugLog(\n `noise-prototype-bank: initialized with ${this.builtinCount} built-in prototypes`,\n );\n }\n\n /**\n * Check if a text vector matches any noise prototype.\n * Returns true if cosine similarity >= threshold with any prototype.\n */\n isNoise(textVector: number[], threshold = DEFAULT_THRESHOLD): boolean {\n if (!this._initialized || this.vectors.length === 0) return false;\n for (const proto of this.vectors) {\n if (cosine(proto, textVector) >= threshold) return true;\n }\n return false;\n }\n\n /**\n * LLM feedback: add a text vector to the learned noise bank.\n * Called when LLM extraction returns zero memories (strong noise signal).\n * Deduplicates against existing prototypes (>= 0.95 similarity = skip).\n * Evicts oldest learned prototype when bank exceeds MAX_LEARNED_PROTOTYPES.\n */\n learn(textVector: number[]): void {\n if (!this._initialized) return;\n\n // Deduplicate: too similar to an existing prototype \u2192 skip\n for (const proto of this.vectors) {\n if (cosine(proto, textVector) >= DEDUP_THRESHOLD) return;\n }\n\n this.vectors.push(textVector);\n\n // Evict oldest learned prototype if over limit (preserve built-in prototypes)\n if (this.vectors.length > this.builtinCount + MAX_LEARNED_PROTOTYPES) {\n this.vectors.splice(this.builtinCount, 1);\n }\n\n this.debugLog(\n `noise-prototype-bank: learned new noise prototype (total: ${this.vectors.length})`,\n );\n }\n}\n\n// ============================================================================\n// Cosine Similarity\n// ============================================================================\n\nfunction cosine(a: number[], b: number[]): number {\n if (a.length !== b.length) return 0;\n let dot = 0;\n let na = 0;\n let nb = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n na += a[i] * a[i];\n nb += b[i] * b[i];\n }\n const denom = Math.sqrt(na) * Math.sqrt(nb);\n return denom === 0 ? 0 : dot / denom;\n}\n"],
5
- "mappings": "AAkBA,MAAM,sBAAyC;AAAA;AAAA,EAE3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACJ;AAMA,MAAM,oBAAoB;AAC1B,MAAM,yBAAyB;AAC/B,MAAM,kBAAkB;AAMjB,MAAM,mBAAmB;AAAA,EACpB,UAAsB,CAAC;AAAA,EACvB,eAAe;AAAA,EACf,eAAe;AAAA,EACf;AAAA,EAER,YAAY,UAAkC;AAC1C,SAAK,WAAW,aAAa,MAAM;AAAA,IAAE;AAAA,EACzC;AAAA;AAAA,EAGA,IAAI,cAAuB;AACvB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,OAAe;AACf,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAK,UAAmC;AAC1C,QAAI,KAAK,aAAc;AAEvB,eAAW,QAAQ,qBAAqB;AACpC,UAAI;AACA,cAAM,IAAI,MAAM,SAAS,MAAM,IAAI;AACnC,YAAI,KAAK,EAAE,SAAS,EAAG,MAAK,QAAQ,KAAK,CAAC;AAAA,MAC9C,QAAQ;AAAA,MAER;AAAA,IACJ;AACA,SAAK,eAAe,KAAK,QAAQ;AACjC,SAAK,eAAe;AAMpB,QAAI,KAAK,QAAQ,UAAU,GAAG;AAC1B,YAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC;AACnD,UAAI,MAAM,MAAM;AACZ,aAAK;AAAA,UACD,yEAAyE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAC3F;AACA,aAAK,eAAe;AACpB,aAAK,UAAU,CAAC;AAChB;AAAA,MACJ;AAAA,IACJ;AAEA,SAAK;AAAA,MACD,0CAA0C,KAAK,YAAY;AAAA,IAC/D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,YAAsB,YAAY,mBAA4B;AAClE,QAAI,CAAC,KAAK,gBAAgB,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC5D,eAAW,SAAS,KAAK,SAAS;AAC9B,UAAI,OAAO,OAAO,UAAU,KAAK,UAAW,QAAO;AAAA,IACvD;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAA4B;AAC9B,QAAI,CAAC,KAAK,aAAc;AAGxB,eAAW,SAAS,KAAK,SAAS;AAC9B,UAAI,OAAO,OAAO,UAAU,KAAK,gBAAiB;AAAA,IACtD;AAEA,SAAK,QAAQ,KAAK,UAAU;AAG5B,QAAI,KAAK,QAAQ,SAAS,KAAK,eAAe,wBAAwB;AAClE,WAAK,QAAQ,OAAO,KAAK,cAAc,CAAC;AAAA,IAC5C;AAEA,SAAK;AAAA,MACD,6DAA6D,KAAK,QAAQ,MAAM;AAAA,IACpF;AAAA,EACJ;AACJ;AAMA,SAAS,OAAO,GAAa,GAAqB;AAC9C,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,MAAI,MAAM;AACV,MAAI,KAAK;AACT,MAAI,KAAK;AACT,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,WAAO,EAAE,CAAC,IAAI,EAAE,CAAC;AACjB,UAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AAChB,UAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,EACpB;AACA,QAAM,QAAQ,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,EAAE;AAC1C,SAAO,UAAU,IAAI,IAAI,MAAM;AACnC;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../src/observability.ts"],"names":[],"mappings":"AACA;;GAEG;AAIH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChD;AAED,wBAAsB,QAAQ,CAAC,UAAU,SAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAgErE"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/observability.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\n/**\n * Observability \u2014 aggregated stats from query-tracking.jsonl\n */\n\nimport { getRecentQueries, type QueryRecord } from \"./query-tracker.js\";\n\nexport interface QueryStats {\n totalQueries: number;\n avgLatencyMs: number;\n resonancePassRate: number;\n avgHitCount: number;\n queryTypeDistribution: Record<string, number>;\n hourlyTrend: { hour: string; count: number }[];\n}\n\nexport async function getStats(maxRecords = 1000): Promise<QueryStats> {\n const records = await getRecentQueries(maxRecords);\n\n if (records.length === 0) {\n return {\n totalQueries: 0,\n avgLatencyMs: 0,\n resonancePassRate: 0,\n avgHitCount: 0,\n queryTypeDistribution: {},\n hourlyTrend: [],\n };\n }\n\n const totalQueries = records.length;\n const avgLatencyMs = Math.round(\n records.reduce((sum, r) => sum + r.latency_ms, 0) / totalQueries\n );\n const resonancePassRate = +(\n records.filter((r) => r.resonancePass).length / totalQueries\n ).toFixed(3);\n const avgHitCount = +(\n records.reduce((sum, r) => sum + r.hitCount, 0) / totalQueries\n ).toFixed(2);\n\n // Query type distribution\n const queryTypeDistribution: Record<string, number> = {};\n for (const r of records) {\n queryTypeDistribution[r.queryType] =\n (queryTypeDistribution[r.queryType] || 0) + 1;\n }\n\n // Hourly trend \u2014 last 24h bucketed by hour\n const now = Date.now();\n const cutoff = now - 24 * 60 * 60 * 1000;\n const hourBuckets = new Map<string, number>();\n\n for (let i = 0; i < 24; i++) {\n const d = new Date(now - i * 60 * 60 * 1000);\n const key = d.toISOString().slice(0, 13); // \"YYYY-MM-DDTHH\"\n hourBuckets.set(key, 0);\n }\n\n for (const r of records) {\n const ts = new Date(r.timestamp).getTime();\n if (ts < cutoff) continue;\n const key = r.timestamp.slice(0, 13);\n if (hourBuckets.has(key)) {\n hourBuckets.set(key, hourBuckets.get(key)! + 1);\n }\n }\n\n const hourlyTrend = Array.from(hourBuckets.entries())\n .map(([hour, count]) => ({ hour, count }))\n .sort((a, b) => a.hour.localeCompare(b.hour));\n\n return {\n totalQueries,\n avgLatencyMs,\n resonancePassRate,\n avgHitCount,\n queryTypeDistribution,\n hourlyTrend,\n };\n}\n"],
5
- "mappings": "AAKA,SAAS,wBAA0C;AAWnD,eAAsB,SAAS,aAAa,KAA2B;AACrE,QAAM,UAAU,MAAM,iBAAiB,UAAU;AAEjD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,MACL,cAAc;AAAA,MACd,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,aAAa;AAAA,MACb,uBAAuB,CAAC;AAAA,MACxB,aAAa,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,eAAe,QAAQ;AAC7B,QAAM,eAAe,KAAK;AAAA,IACxB,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,YAAY,CAAC,IAAI;AAAA,EACtD;AACA,QAAM,oBAAoB,EACxB,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,cAChD,QAAQ,CAAC;AACX,QAAM,cAAc,EAClB,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,UAAU,CAAC,IAAI,cAClD,QAAQ,CAAC;AAGX,QAAM,wBAAgD,CAAC;AACvD,aAAW,KAAK,SAAS;AACvB,0BAAsB,EAAE,SAAS,KAC9B,sBAAsB,EAAE,SAAS,KAAK,KAAK;AAAA,EAChD;AAGA,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,SAAS,MAAM,KAAK,KAAK,KAAK;AACpC,QAAM,cAAc,oBAAI,IAAoB;AAE5C,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,GAAI;AAC3C,UAAM,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACvC,gBAAY,IAAI,KAAK,CAAC;AAAA,EACxB;AAEA,aAAW,KAAK,SAAS;AACvB,UAAM,KAAK,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AACzC,QAAI,KAAK,OAAQ;AACjB,UAAM,MAAM,EAAE,UAAU,MAAM,GAAG,EAAE;AACnC,QAAI,YAAY,IAAI,GAAG,GAAG;AACxB,kBAAY,IAAI,KAAK,YAAY,IAAI,GAAG,IAAK,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,KAAK,YAAY,QAAQ,CAAC,EACjD,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,MAAM,MAAM,EAAE,EACxC,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAE9C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"query-tracker.d.ts","sourceRoot":"","sources":["../../src/query-tracker.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAQH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IAChD,aAAa,EAAE,OAAO,CAAC;CACxB;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAUnD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,GAAE,MAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAS9E"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/query-tracker.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\n/**\n * Query Tracker\n *\n * Lightweight, append-only JSONL tracker for every recall query.\n * Fire-and-forget writes \u2014 never blocks the recall path.\n * Persisted to ~/.openclaw/memory/query-tracking.jsonl.\n */\n\nimport { appendFile, readFile, mkdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, dirname } from \"node:path\";\n\nconst TRACKING_PATH = join(homedir(), \".openclaw\", \"memory\", \"query-tracking.jsonl\");\n\nexport interface QueryRecord {\n timestamp: string;\n query: string;\n source: \"auto\" | \"manual\" | \"cli\";\n hitCount: number;\n topScore: number;\n latency_ms: number;\n queryType: \"single\" | \"multi-hop\" | \"gated-out\";\n resonancePass: boolean;\n}\n\nlet dirEnsured = false;\n\n/**\n * Record a query to the tracking log (fire-and-forget).\n * Errors are silently swallowed to avoid impacting recall latency.\n */\nexport function recordQuery(data: QueryRecord): void {\n const line = JSON.stringify(data) + \"\\n\";\n const doWrite = async () => {\n if (!dirEnsured) {\n await mkdir(dirname(TRACKING_PATH), { recursive: true });\n dirEnsured = true;\n }\n await appendFile(TRACKING_PATH, line, \"utf8\");\n };\n doWrite().catch(() => {});\n}\n\n/**\n * Read the most recent N query records from the tracking log.\n */\nexport async function getRecentQueries(n: number = 100): Promise<QueryRecord[]> {\n try {\n const raw = await readFile(TRACKING_PATH, \"utf8\");\n const lines = raw.trim().split(\"\\n\").filter(Boolean);\n const recent = lines.slice(-n);\n return recent.map((line) => JSON.parse(line) as QueryRecord);\n } catch {\n return [];\n }\n}\n"],
5
- "mappings": "AASA,SAAS,YAAY,UAAU,aAAa;AAC5C,SAAS,eAAe;AACxB,SAAS,MAAM,eAAe;AAE9B,MAAM,gBAAgB,KAAK,QAAQ,GAAG,aAAa,UAAU,sBAAsB;AAanF,IAAI,aAAa;AAMV,SAAS,YAAY,MAAyB;AACnD,QAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AACpC,QAAM,UAAU,YAAY;AAC1B,QAAI,CAAC,YAAY;AACf,YAAM,MAAM,QAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,mBAAa;AAAA,IACf;AACA,UAAM,WAAW,eAAe,MAAM,MAAM;AAAA,EAC9C;AACA,UAAQ,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAC1B;AAKA,eAAsB,iBAAiB,IAAY,KAA6B;AAC9E,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,eAAe,MAAM;AAChD,UAAM,QAAQ,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACnD,UAAM,SAAS,MAAM,MAAM,CAAC,CAAC;AAC7B,WAAO,OAAO,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAgB;AAAA,EAC7D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"reflection-event-store.d.ts","sourceRoot":"","sources":["../../src/reflection-event-store.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,yBAAyB,CAAC;IAChC,iBAAiB,EAAE,CAAC,CAAC;IACrB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,uBAAuB,CAAC;CACnC;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,yBAAyB,EAAE,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAQT;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iCAAiC,GAAG,sBAAsB,CAsC7G"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/reflection-event-store.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\nimport { createHash } from \"node:crypto\";\n\nexport const REFLECTION_SCHEMA_VERSION = 4;\n\nexport type ReflectionErrorSignalLike = {\n signatureHash: string;\n};\n\nexport interface ReflectionEventMetadata {\n type: \"memory-reflection-event\";\n reflectionVersion: 4;\n stage: \"reflect-store\";\n eventId: string;\n sessionKey: string;\n sessionId: string;\n agentId: string;\n command: string;\n storedAt: number;\n usedFallback: boolean;\n errorSignals: string[];\n sourceReflectionPath?: string;\n}\n\nexport interface ReflectionEventPayload {\n kind: \"event\";\n text: string;\n metadata: ReflectionEventMetadata;\n}\n\nexport interface BuildReflectionEventPayloadParams {\n eventId?: string;\n scope: string;\n sessionKey: string;\n sessionId: string;\n agentId: string;\n command: string;\n toolErrorSignals: ReflectionErrorSignalLike[];\n runAt: number;\n usedFallback: boolean;\n sourceReflectionPath?: string;\n}\n\nexport function createReflectionEventId(params: {\n runAt: number;\n sessionKey: string;\n sessionId: string;\n agentId: string;\n command: string;\n}): string {\n const safeRunAt = Number.isFinite(params.runAt) ? Math.max(0, Math.floor(params.runAt)) : Date.now();\n const datePart = new Date(safeRunAt).toISOString().replace(/[-:.TZ]/g, \"\").slice(0, 14);\n const digest = createHash(\"sha1\")\n .update(`${safeRunAt}|${params.sessionKey}|${params.sessionId}|${params.agentId}|${params.command}`)\n .digest(\"hex\")\n .slice(0, 8);\n return `refl-${datePart}-${digest}`;\n}\n\nexport function buildReflectionEventPayload(params: BuildReflectionEventPayloadParams): ReflectionEventPayload {\n const eventId = params.eventId || createReflectionEventId({\n runAt: params.runAt,\n sessionKey: params.sessionKey,\n sessionId: params.sessionId,\n agentId: params.agentId,\n command: params.command,\n });\n\n const metadata: ReflectionEventMetadata = {\n type: \"memory-reflection-event\",\n reflectionVersion: REFLECTION_SCHEMA_VERSION,\n stage: \"reflect-store\",\n eventId,\n sessionKey: params.sessionKey,\n sessionId: params.sessionId,\n agentId: params.agentId,\n command: params.command,\n storedAt: params.runAt,\n usedFallback: params.usedFallback,\n errorSignals: params.toolErrorSignals.map((signal) => signal.signatureHash),\n ...(params.sourceReflectionPath ? { sourceReflectionPath: params.sourceReflectionPath } : {}),\n };\n\n const text = [\n `reflection-event \u00B7 ${params.scope}`,\n `eventId=${eventId}`,\n `session=${params.sessionId}`,\n `agent=${params.agentId}`,\n `command=${params.command}`,\n `usedFallback=${params.usedFallback ? \"true\" : \"false\"}`,\n ].join(\"\\n\");\n\n return {\n kind: \"event\",\n text,\n metadata,\n };\n}\n"],
5
- "mappings": "AACA,SAAS,kBAAkB;AAEpB,MAAM,4BAA4B;AAwClC,SAAS,wBAAwB,QAM7B;AACT,QAAM,YAAY,OAAO,SAAS,OAAO,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI;AACnG,QAAM,WAAW,IAAI,KAAK,SAAS,EAAE,YAAY,EAAE,QAAQ,YAAY,EAAE,EAAE,MAAM,GAAG,EAAE;AACtF,QAAM,SAAS,WAAW,MAAM,EAC7B,OAAO,GAAG,SAAS,IAAI,OAAO,UAAU,IAAI,OAAO,SAAS,IAAI,OAAO,OAAO,IAAI,OAAO,OAAO,EAAE,EAClG,OAAO,KAAK,EACZ,MAAM,GAAG,CAAC;AACb,SAAO,QAAQ,QAAQ,IAAI,MAAM;AACnC;AAEO,SAAS,4BAA4B,QAAmE;AAC7G,QAAM,UAAU,OAAO,WAAW,wBAAwB;AAAA,IACxD,OAAO,OAAO;AAAA,IACd,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,EAClB,CAAC;AAED,QAAM,WAAoC;AAAA,IACxC,MAAM;AAAA,IACN,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP;AAAA,IACA,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,UAAU,OAAO;AAAA,IACjB,cAAc,OAAO;AAAA,IACrB,cAAc,OAAO,iBAAiB,IAAI,CAAC,WAAW,OAAO,aAAa;AAAA,IAC1E,GAAI,OAAO,uBAAuB,EAAE,sBAAsB,OAAO,qBAAqB,IAAI,CAAC;AAAA,EAC7F;AAEA,QAAM,OAAO;AAAA,IACX,yBAAsB,OAAO,KAAK;AAAA,IAClC,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO,SAAS;AAAA,IAC3B,SAAS,OAAO,OAAO;AAAA,IACvB,WAAW,OAAO,OAAO;AAAA,IACzB,gBAAgB,OAAO,eAAe,SAAS,OAAO;AAAA,EACxD,EAAE,KAAK,IAAI;AAEX,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"reflection-item-store.d.ts","sourceRoot":"","sources":["../../src/reflection-item-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,iBAAiB,EAAE,CAAC,CAAC;IACrB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,gBAAgB,GAAG,cAAc,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,sBAAsB,CAAC;CAClC;AAED,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,eAAO,MAAM,wCAAwC,KAAK,CAAC;AAC3D,eAAO,MAAM,4BAA4B,OAAO,CAAC;AACjD,eAAO,MAAM,gCAAgC,MAAM,CAAC;AACpD,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,eAAO,MAAM,sCAAsC,IAAI,CAAC;AACxD,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,kBAAkB,GAAG;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAgBA;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iCAAiC,GAAG,qBAAqB,EAAE,CAgC9G"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/reflection-item-store.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\nimport type { ReflectionSliceItem } from \"./reflection-slices.js\";\n\nexport type ReflectionItemKind = \"invariant\" | \"derived\";\n\nexport interface ReflectionItemMetadata {\n type: \"memory-reflection-item\";\n reflectionVersion: 4;\n stage: \"reflect-store\";\n eventId: string;\n itemKind: ReflectionItemKind;\n section: \"Invariants\" | \"Derived\";\n ordinal: number;\n groupSize: number;\n agentId: string;\n sessionKey: string;\n sessionId: string;\n storedAt: number;\n usedFallback: boolean;\n errorSignals: string[];\n decayModel: \"logistic\";\n decayMidpointDays: number;\n decayK: number;\n baseWeight: number;\n quality: number;\n sourceReflectionPath?: string;\n}\n\nexport interface ReflectionItemPayload {\n kind: \"item-invariant\" | \"item-derived\";\n text: string;\n metadata: ReflectionItemMetadata;\n}\n\nexport interface BuildReflectionItemPayloadsParams {\n items: ReflectionSliceItem[];\n eventId: string;\n agentId: string;\n sessionKey: string;\n sessionId: string;\n runAt: number;\n usedFallback: boolean;\n toolErrorSignals: Array<{ signatureHash: string }>;\n sourceReflectionPath?: string;\n}\n\nexport const REFLECTION_INVARIANT_DECAY_MIDPOINT_DAYS = 45;\nexport const REFLECTION_INVARIANT_DECAY_K = 0.22;\nexport const REFLECTION_INVARIANT_BASE_WEIGHT = 1.1;\nexport const REFLECTION_INVARIANT_QUALITY = 1;\n\nexport const REFLECTION_DERIVED_DECAY_MIDPOINT_DAYS = 7;\nexport const REFLECTION_DERIVED_DECAY_K = 0.65;\nexport const REFLECTION_DERIVED_BASE_WEIGHT = 1;\nexport const REFLECTION_DERIVED_QUALITY = 0.95;\n\nexport function getReflectionItemDecayDefaults(itemKind: ReflectionItemKind): {\n midpointDays: number;\n k: number;\n baseWeight: number;\n quality: number;\n} {\n if (itemKind === \"invariant\") {\n return {\n midpointDays: REFLECTION_INVARIANT_DECAY_MIDPOINT_DAYS,\n k: REFLECTION_INVARIANT_DECAY_K,\n baseWeight: REFLECTION_INVARIANT_BASE_WEIGHT,\n quality: REFLECTION_INVARIANT_QUALITY,\n };\n }\n\n return {\n midpointDays: REFLECTION_DERIVED_DECAY_MIDPOINT_DAYS,\n k: REFLECTION_DERIVED_DECAY_K,\n baseWeight: REFLECTION_DERIVED_BASE_WEIGHT,\n quality: REFLECTION_DERIVED_QUALITY,\n };\n}\n\nexport function buildReflectionItemPayloads(params: BuildReflectionItemPayloadsParams): ReflectionItemPayload[] {\n return params.items.map((item) => {\n const defaults = getReflectionItemDecayDefaults(item.itemKind);\n const metadata: ReflectionItemMetadata = {\n type: \"memory-reflection-item\",\n reflectionVersion: 4,\n stage: \"reflect-store\",\n eventId: params.eventId,\n itemKind: item.itemKind,\n section: item.section,\n ordinal: item.ordinal,\n groupSize: item.groupSize,\n agentId: params.agentId,\n sessionKey: params.sessionKey,\n sessionId: params.sessionId,\n storedAt: params.runAt,\n usedFallback: params.usedFallback,\n errorSignals: params.toolErrorSignals.map((signal) => signal.signatureHash),\n decayModel: \"logistic\",\n decayMidpointDays: defaults.midpointDays,\n decayK: defaults.k,\n baseWeight: defaults.baseWeight,\n quality: defaults.quality,\n ...(params.sourceReflectionPath ? { sourceReflectionPath: params.sourceReflectionPath } : {}),\n };\n\n return {\n kind: item.itemKind === \"invariant\" ? \"item-invariant\" : \"item-derived\",\n text: item.text,\n metadata,\n };\n });\n}\n"],
5
- "mappings": "AA8CO,MAAM,2CAA2C;AACjD,MAAM,+BAA+B;AACrC,MAAM,mCAAmC;AACzC,MAAM,+BAA+B;AAErC,MAAM,yCAAyC;AAC/C,MAAM,6BAA6B;AACnC,MAAM,iCAAiC;AACvC,MAAM,6BAA6B;AAEnC,SAAS,+BAA+B,UAK7C;AACA,MAAI,aAAa,aAAa;AAC5B,WAAO;AAAA,MACL,cAAc;AAAA,MACd,GAAG;AAAA,MACH,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,cAAc;AAAA,IACd,GAAG;AAAA,IACH,YAAY;AAAA,IACZ,SAAS;AAAA,EACX;AACF;AAEO,SAAS,4BAA4B,QAAoE;AAC9G,SAAO,OAAO,MAAM,IAAI,CAAC,SAAS;AAChC,UAAM,WAAW,+BAA+B,KAAK,QAAQ;AAC7D,UAAM,WAAmC;AAAA,MACvC,MAAM;AAAA,MACN,mBAAmB;AAAA,MACnB,OAAO;AAAA,MACP,SAAS,OAAO;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,MAChB,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,MACnB,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB,cAAc,OAAO;AAAA,MACrB,cAAc,OAAO,iBAAiB,IAAI,CAAC,WAAW,OAAO,aAAa;AAAA,MAC1E,YAAY;AAAA,MACZ,mBAAmB,SAAS;AAAA,MAC5B,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS;AAAA,MACrB,SAAS,SAAS;AAAA,MAClB,GAAI,OAAO,uBAAuB,EAAE,sBAAsB,OAAO,qBAAqB,IAAI,CAAC;AAAA,IAC7F;AAEA,WAAO;AAAA,MACL,MAAM,KAAK,aAAa,cAAc,mBAAmB;AAAA,MACzD,MAAM,KAAK;AAAA,MACX;AAAA,IACF;AAAA,EACF,CAAC;AACH;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"reflection-mapped-metadata.d.ts","sourceRoot":"","sources":["../../src/reflection-mapped-metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEzE,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AACxF,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;AAE1E,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,0BAA0B,CAAC;IACjC,iBAAiB,EAAE,CAAC,CAAC;IACrB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,oBAAoB,CAAC;IACjC,cAAc,EAAE,wBAAwB,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,6BAA6B;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AASD,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,oBAAoB,GAAG,6BAA6B,CAE1G;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE;IACpD,UAAU,EAAE,0BAA0B,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,GAAG,wBAAwB,CAyB3B"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/reflection-mapped-metadata.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\nimport type { ReflectionMappedMemoryItem } from \"./reflection-slices.js\";\n\nexport type ReflectionMappedKind = \"user-model\" | \"agent-model\" | \"lesson\" | \"decision\";\nexport type ReflectionMappedCategory = \"preference\" | \"fact\" | \"decision\";\n\nexport interface ReflectionMappedMetadata {\n type: \"memory-reflection-mapped\";\n reflectionVersion: 4;\n stage: \"reflect-store\";\n eventId: string;\n mappedKind: ReflectionMappedKind;\n mappedCategory: ReflectionMappedCategory;\n section: string;\n ordinal: number;\n groupSize: number;\n agentId: string;\n sessionKey: string;\n sessionId: string;\n storedAt: number;\n usedFallback: boolean;\n errorSignals: string[];\n decayModel: \"logistic\";\n decayMidpointDays: number;\n decayK: number;\n baseWeight: number;\n quality: number;\n sourceReflectionPath?: string;\n}\n\nexport interface ReflectionMappedDecayDefaults {\n midpointDays: number;\n k: number;\n baseWeight: number;\n quality: number;\n}\n\nconst REFLECTION_MAPPED_DECAY_DEFAULTS: Record<ReflectionMappedKind, ReflectionMappedDecayDefaults> = {\n decision: { midpointDays: 45, k: 0.25, baseWeight: 1.1, quality: 1 },\n \"user-model\": { midpointDays: 21, k: 0.3, baseWeight: 1, quality: 0.95 },\n \"agent-model\": { midpointDays: 10, k: 0.35, baseWeight: 0.95, quality: 0.93 },\n lesson: { midpointDays: 7, k: 0.45, baseWeight: 0.9, quality: 0.9 },\n};\n\nexport function getReflectionMappedDecayDefaults(kind: ReflectionMappedKind): ReflectionMappedDecayDefaults {\n return REFLECTION_MAPPED_DECAY_DEFAULTS[kind];\n}\n\nexport function buildReflectionMappedMetadata(params: {\n mappedItem: ReflectionMappedMemoryItem;\n eventId: string;\n agentId: string;\n sessionKey: string;\n sessionId: string;\n runAt: number;\n usedFallback: boolean;\n toolErrorSignals: Array<{ signatureHash: string }>;\n sourceReflectionPath?: string;\n}): ReflectionMappedMetadata {\n const defaults = getReflectionMappedDecayDefaults(params.mappedItem.mappedKind);\n return {\n type: \"memory-reflection-mapped\",\n reflectionVersion: 4,\n stage: \"reflect-store\",\n eventId: params.eventId,\n mappedKind: params.mappedItem.mappedKind,\n mappedCategory: params.mappedItem.category,\n section: params.mappedItem.heading,\n ordinal: params.mappedItem.ordinal,\n groupSize: params.mappedItem.groupSize,\n agentId: params.agentId,\n sessionKey: params.sessionKey,\n sessionId: params.sessionId,\n storedAt: params.runAt,\n usedFallback: params.usedFallback,\n errorSignals: params.toolErrorSignals.map((signal) => signal.signatureHash),\n decayModel: \"logistic\",\n decayMidpointDays: defaults.midpointDays,\n decayK: defaults.k,\n baseWeight: defaults.baseWeight,\n quality: defaults.quality,\n ...(params.sourceReflectionPath ? { sourceReflectionPath: params.sourceReflectionPath } : {}),\n };\n}\n"],
5
- "mappings": "AAqCA,MAAM,mCAAgG;AAAA,EACpG,UAAU,EAAE,cAAc,IAAI,GAAG,MAAM,YAAY,KAAK,SAAS,EAAE;AAAA,EACnE,cAAc,EAAE,cAAc,IAAI,GAAG,KAAK,YAAY,GAAG,SAAS,KAAK;AAAA,EACvE,eAAe,EAAE,cAAc,IAAI,GAAG,MAAM,YAAY,MAAM,SAAS,KAAK;AAAA,EAC5E,QAAQ,EAAE,cAAc,GAAG,GAAG,MAAM,YAAY,KAAK,SAAS,IAAI;AACpE;AAEO,SAAS,iCAAiC,MAA2D;AAC1G,SAAO,iCAAiC,IAAI;AAC9C;AAEO,SAAS,8BAA8B,QAUjB;AAC3B,QAAM,WAAW,iCAAiC,OAAO,WAAW,UAAU;AAC9E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,SAAS,OAAO;AAAA,IAChB,YAAY,OAAO,WAAW;AAAA,IAC9B,gBAAgB,OAAO,WAAW;AAAA,IAClC,SAAS,OAAO,WAAW;AAAA,IAC3B,SAAS,OAAO,WAAW;AAAA,IAC3B,WAAW,OAAO,WAAW;AAAA,IAC7B,SAAS,OAAO;AAAA,IAChB,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,cAAc,OAAO;AAAA,IACrB,cAAc,OAAO,iBAAiB,IAAI,CAAC,WAAW,OAAO,aAAa;AAAA,IAC1E,YAAY;AAAA,IACZ,mBAAmB,SAAS;AAAA,IAC5B,QAAQ,SAAS;AAAA,IACjB,YAAY,SAAS;AAAA,IACrB,SAAS,SAAS;AAAA,IAClB,GAAI,OAAO,uBAAuB,EAAE,sBAAsB,OAAO,qBAAqB,IAAI,CAAC;AAAA,EAC7F;AACF;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"reflection-metadata.d.ts","sourceRoot":"","sources":["../../src/reflection-metadata.ts"],"names":[],"mappings":"AACA,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQhG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAMzF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAG3G"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/reflection-metadata.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\nexport function parseReflectionMetadata(metadataRaw: string | undefined): Record<string, unknown> {\n if (!metadataRaw) return {};\n try {\n const parsed = JSON.parse(metadataRaw);\n return parsed && typeof parsed === \"object\" ? parsed as Record<string, unknown> : {};\n } catch {\n return {};\n }\n}\n\nexport function isReflectionEntry(entry: { category: string; metadata?: string }): boolean {\n if (entry.category === \"reflection\") return true;\n const metadata = parseReflectionMetadata(entry.metadata);\n return metadata.type === \"memory-reflection\" ||\n metadata.type === \"memory-reflection-event\" ||\n metadata.type === \"memory-reflection-item\";\n}\n\nexport function getDisplayCategoryTag(entry: { category: string; scope: string; metadata?: string }): string {\n if (!isReflectionEntry(entry)) return `${entry.category}:${entry.scope}`;\n return `reflection:${entry.scope}`;\n}\n"],
5
- "mappings": "AACO,SAAS,wBAAwB,aAA0D;AAChG,MAAI,CAAC,YAAa,QAAO,CAAC;AAC1B,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,WAAW;AACrC,WAAO,UAAU,OAAO,WAAW,WAAW,SAAoC,CAAC;AAAA,EACrF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,kBAAkB,OAAyD;AACzF,MAAI,MAAM,aAAa,aAAc,QAAO;AAC5C,QAAM,WAAW,wBAAwB,MAAM,QAAQ;AACvD,SAAO,SAAS,SAAS,uBACvB,SAAS,SAAS,6BAClB,SAAS,SAAS;AACtB;AAEO,SAAS,sBAAsB,OAAuE;AAC3G,MAAI,CAAC,kBAAkB,KAAK,EAAG,QAAO,GAAG,MAAM,QAAQ,IAAI,MAAM,KAAK;AACtE,SAAO,cAAc,MAAM,KAAK;AAClC;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"reflection-ranking.d.ts","sourceRoot":"","sources":["../../src/reflection-ranking.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAKlG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAM1E;AAED,wBAAgB,qCAAqC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK1E"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/reflection-ranking.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\nexport const REFLECTION_FALLBACK_SCORE_FACTOR = 0.75;\n\nexport interface ReflectionScoreInput {\n ageDays: number;\n midpointDays: number;\n k: number;\n baseWeight: number;\n quality: number;\n usedFallback: boolean;\n}\n\nexport function computeReflectionLogistic(ageDays: number, midpointDays: number, k: number): number {\n const safeAgeDays = Number.isFinite(ageDays) ? Math.max(0, ageDays) : 0;\n const safeMidpointDays = Number.isFinite(midpointDays) && midpointDays > 0 ? midpointDays : 1;\n const safeK = Number.isFinite(k) && k > 0 ? k : 0.1;\n return 1 / (1 + Math.exp(safeK * (safeAgeDays - safeMidpointDays)));\n}\n\nexport function computeReflectionScore(input: ReflectionScoreInput): number {\n const logistic = computeReflectionLogistic(input.ageDays, input.midpointDays, input.k);\n const baseWeight = Number.isFinite(input.baseWeight) && input.baseWeight > 0 ? input.baseWeight : 1;\n const quality = Number.isFinite(input.quality) ? Math.max(0, Math.min(1, input.quality)) : 1;\n const fallbackFactor = input.usedFallback ? REFLECTION_FALLBACK_SCORE_FACTOR : 1;\n return logistic * baseWeight * quality * fallbackFactor;\n}\n\nexport function normalizeReflectionLineForAggregation(line: string): string {\n return String(line)\n .trim()\n .replace(/\\s+/g, \" \")\n .toLowerCase();\n}\n"],
5
- "mappings": "AACO,MAAM,mCAAmC;AAWzC,SAAS,0BAA0B,SAAiB,cAAsB,GAAmB;AAClG,QAAM,cAAc,OAAO,SAAS,OAAO,IAAI,KAAK,IAAI,GAAG,OAAO,IAAI;AACtE,QAAM,mBAAmB,OAAO,SAAS,YAAY,KAAK,eAAe,IAAI,eAAe;AAC5F,QAAM,QAAQ,OAAO,SAAS,CAAC,KAAK,IAAI,IAAI,IAAI;AAChD,SAAO,KAAK,IAAI,KAAK,IAAI,SAAS,cAAc,iBAAiB;AACnE;AAEO,SAAS,uBAAuB,OAAqC;AAC1E,QAAM,WAAW,0BAA0B,MAAM,SAAS,MAAM,cAAc,MAAM,CAAC;AACrF,QAAM,aAAa,OAAO,SAAS,MAAM,UAAU,KAAK,MAAM,aAAa,IAAI,MAAM,aAAa;AAClG,QAAM,UAAU,OAAO,SAAS,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI;AAC3F,QAAM,iBAAiB,MAAM,eAAe,mCAAmC;AAC/E,SAAO,WAAW,aAAa,UAAU;AAC3C;AAEO,SAAS,sCAAsC,MAAsB;AAC1E,SAAO,OAAO,IAAI,EACf,KAAK,EACL,QAAQ,QAAQ,GAAG,EACnB,YAAY;AACjB;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"reflection-retry.d.ts","sourceRoot":"","sources":["../../src/reflection-retry.ts"],"names":[],"mappings":"AACA,KAAK,oBAAoB,GAAG;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EACJ,sBAAsB,GACtB,oBAAoB,GACpB,uBAAuB,GACvB,iBAAiB,GACjB,qBAAqB,GACrB,4BAA4B,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,KAAK,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpC,KAAK,iBAAiB,CAAC,CAAC,IAAI;IAC1B,KAAK,EAAE,YAAY,GAAG,WAAW,CAAC;IAClC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,CAAC;AA6EF,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG1E;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGjE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAmB1F;AAED,wBAAgB,6BAA6B,CAAC,MAAM,GAAE,MAAM,MAAoB,GAAG,MAAM,CAIxF;AAED,wBAAsB,mCAAmC,CAAC,CAAC,EACzD,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC3B,OAAO,CAAC,CAAC,CAAC,CAkCZ"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/reflection-retry.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\ntype RetryClassifierInput = {\n inReflectionScope: boolean;\n retryCount: number;\n usefulOutputChars: number;\n error: unknown;\n};\n\ntype RetryClassifierResult = {\n retryable: boolean;\n reason:\n | \"not_reflection_scope\"\n | \"retry_already_used\"\n | \"useful_output_present\"\n | \"non_retry_error\"\n | \"non_transient_error\"\n | \"transient_upstream_failure\";\n normalizedError: string;\n};\n\ntype RetryState = { count: number };\n\ntype RetryRunnerParams<T> = {\n scope: \"reflection\" | \"distiller\";\n runner: \"embedded\" | \"cli\";\n retryState: RetryState;\n execute: () => Promise<T>;\n onLog?: (level: \"info\" | \"warn\", message: string) => void;\n random?: () => number;\n sleep?: (ms: number) => Promise<void>;\n};\n\nconst REFLECTION_TRANSIENT_PATTERNS: RegExp[] = [\n /unexpected eof/i,\n /\\beconnreset\\b/i,\n /\\beconnaborted\\b/i,\n /\\betimedout\\b/i,\n /\\bepipe\\b/i,\n /connection reset/i,\n /socket hang up/i,\n /socket (?:closed|disconnected)/i,\n /connection (?:closed|aborted|dropped)/i,\n /early close/i,\n /stream (?:ended|closed) unexpectedly/i,\n /temporar(?:y|ily).*unavailable/i,\n /upstream.*unavailable/i,\n /service unavailable/i,\n /bad gateway/i,\n /gateway timeout/i,\n /\\b(?:http|status)\\s*(?:502|503|504)\\b/i,\n /\\btimed out\\b/i,\n /\\btimeout\\b/i,\n /\\bund_err_(?:socket|headers_timeout|body_timeout)\\b/i,\n /network error/i,\n /fetch failed/i,\n];\n\nconst REFLECTION_NON_RETRY_PATTERNS: RegExp[] = [\n /\\b401\\b/i,\n /\\bunauthorized\\b/i,\n /invalid api key/i,\n /invalid[_ -]?token/i,\n /\\bauth(?:entication)?_?unavailable\\b/i,\n /insufficient (?:credit|credits|balance)/i,\n /\\bbilling\\b/i,\n /\\bquota exceeded\\b/i,\n /payment required/i,\n /model .*not found/i,\n /no such model/i,\n /unknown model/i,\n /context length/i,\n /context window/i,\n /request too large/i,\n /payload too large/i,\n /too many tokens/i,\n /token limit/i,\n /prompt too long/i,\n /session expired/i,\n /invalid session/i,\n /refusal/i,\n /content policy/i,\n /safety policy/i,\n /content filter/i,\n /disallowed/i,\n];\n\nconst DEFAULT_SLEEP = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n const msg = `${error.name}: ${error.message}`.trim();\n return msg || \"Error\";\n }\n if (typeof error === \"string\") return error;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n}\n\nfunction clipSingleLine(text: string, maxLen = 260): string {\n const oneLine = text.replace(/\\s+/g, \" \").trim();\n if (oneLine.length <= maxLen) return oneLine;\n return `${oneLine.slice(0, maxLen - 3)}...`;\n}\n\nexport function isTransientReflectionUpstreamError(error: unknown): boolean {\n const msg = toErrorMessage(error);\n return REFLECTION_TRANSIENT_PATTERNS.some((pattern) => pattern.test(msg));\n}\n\nexport function isReflectionNonRetryError(error: unknown): boolean {\n const msg = toErrorMessage(error);\n return REFLECTION_NON_RETRY_PATTERNS.some((pattern) => pattern.test(msg));\n}\n\nexport function classifyReflectionRetry(input: RetryClassifierInput): RetryClassifierResult {\n const normalizedError = clipSingleLine(toErrorMessage(input.error), 260);\n\n if (!input.inReflectionScope) {\n return { retryable: false, reason: \"not_reflection_scope\", normalizedError };\n }\n if (input.retryCount > 0) {\n return { retryable: false, reason: \"retry_already_used\", normalizedError };\n }\n if (input.usefulOutputChars > 0) {\n return { retryable: false, reason: \"useful_output_present\", normalizedError };\n }\n if (isReflectionNonRetryError(input.error)) {\n return { retryable: false, reason: \"non_retry_error\", normalizedError };\n }\n if (isTransientReflectionUpstreamError(input.error)) {\n return { retryable: true, reason: \"transient_upstream_failure\", normalizedError };\n }\n return { retryable: false, reason: \"non_transient_error\", normalizedError };\n}\n\nexport function computeReflectionRetryDelayMs(random: () => number = Math.random): number {\n const raw = random();\n const clamped = Number.isFinite(raw) ? Math.min(1, Math.max(0, raw)) : 0;\n return 1000 + Math.floor(clamped * 2000);\n}\n\nexport async function runWithReflectionTransientRetryOnce<T>(\n params: RetryRunnerParams<T>\n): Promise<T> {\n try {\n return await params.execute();\n } catch (error) {\n const decision = classifyReflectionRetry({\n inReflectionScope: params.scope === \"reflection\" || params.scope === \"distiller\",\n retryCount: params.retryState.count,\n usefulOutputChars: 0,\n error,\n });\n if (!decision.retryable) throw error;\n\n const delayMs = computeReflectionRetryDelayMs(params.random);\n params.retryState.count += 1;\n params.onLog?.(\n \"warn\",\n `memory-${params.scope}: transient upstream failure detected (${params.runner}); ` +\n `retrying once in ${delayMs}ms (${decision.reason}). error=${decision.normalizedError}`\n );\n await (params.sleep ?? DEFAULT_SLEEP)(delayMs);\n\n try {\n const result = await params.execute();\n params.onLog?.(\"info\", `memory-${params.scope}: retry succeeded (${params.runner})`);\n return result;\n } catch (retryError) {\n params.onLog?.(\n \"warn\",\n `memory-${params.scope}: retry exhausted (${params.runner}). ` +\n `error=${clipSingleLine(toErrorMessage(retryError), 260)}`\n );\n throw retryError;\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"reflection-slices.d.ts","sourceRoot":"","sources":["../../src/reflection-slices.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AAExF,MAAM,WAAW,0BAA2B,SAAQ,sBAAsB;IACxE,UAAU,EAAE,oBAAoB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAiBhF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAW/E;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAStE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAItE;AAgBD,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzE;AAED,wBAAgB,6CAA6C,CAAC,cAAc,EAAE,MAAM,GAAG,yBAAyB,EAAE,CA4BjH;AAgCD,wBAAgB,+BAA+B,CAAC,cAAc,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAEhG;AAED,wBAAgB,kCAAkC,CAAC,cAAc,EAAE,MAAM,GAAG,0BAA0B,EAAE,CAiCvG;AAED,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,CA+BhF;AAED,wBAAgB,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAqBzF"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/reflection-slices.ts"],
4
- "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\nexport interface ReflectionSlices {\n invariants: string[];\n derived: string[];\n}\n\nexport interface ReflectionMappedMemory {\n text: string;\n category: \"preference\" | \"fact\" | \"decision\";\n heading: string;\n}\n\nexport type ReflectionMappedKind = \"user-model\" | \"agent-model\" | \"lesson\" | \"decision\";\n\nexport interface ReflectionMappedMemoryItem extends ReflectionMappedMemory {\n mappedKind: ReflectionMappedKind;\n ordinal: number;\n groupSize: number;\n}\n\nexport interface ReflectionSliceItem {\n text: string;\n itemKind: \"invariant\" | \"derived\";\n section: \"Invariants\" | \"Derived\";\n ordinal: number;\n groupSize: number;\n}\n\nexport interface ReflectionGovernanceEntry {\n priority?: string;\n status?: string;\n area?: string;\n summary: string;\n details?: string;\n suggestedAction?: string;\n}\n\nexport function extractSectionMarkdown(markdown: string, heading: string): string {\n const lines = markdown.split(/\\r?\\n/);\n const headingNeedle = `## ${heading}`.toLowerCase();\n let inSection = false;\n const collected: string[] = [];\n for (const raw of lines) {\n const line = raw.trim();\n const lower = line.toLowerCase();\n if (lower.startsWith(\"## \")) {\n if (inSection && lower !== headingNeedle) break;\n inSection = lower === headingNeedle;\n continue;\n }\n if (!inSection) continue;\n collected.push(raw);\n }\n return collected.join(\"\\n\").trim();\n}\n\nexport function parseSectionBullets(markdown: string, heading: string): string[] {\n const lines = extractSectionMarkdown(markdown, heading).split(/\\r?\\n/);\n const collected: string[] = [];\n for (const raw of lines) {\n const line = raw.trim();\n if (line.startsWith(\"- \") || line.startsWith(\"* \")) {\n const normalized = line.slice(2).trim();\n if (normalized) collected.push(normalized);\n }\n }\n return collected;\n}\n\nexport function isPlaceholderReflectionSliceLine(line: string): boolean {\n const normalized = line.replace(/\\*\\*/g, \"\").trim();\n if (!normalized) return true;\n if (/^\\(none( captured)?\\)$/i.test(normalized)) return true;\n if (/^(invariants?|reflections?|derived)[:\uFF1A]$/i.test(normalized)) return true;\n if (/apply this session'?s deltas next run/i.test(normalized)) return true;\n if (/apply this session'?s distilled changes next run/i.test(normalized)) return true;\n if (/investigate why embedded reflection generation failed/i.test(normalized)) return true;\n return false;\n}\n\nexport function normalizeReflectionSliceLine(line: string): string {\n return line\n .replace(/\\*\\*/g, \"\")\n .replace(/^(invariants?|reflections?|derived)[:\uFF1A]\\s*/i, \"\")\n .trim();\n}\n\nexport function sanitizeReflectionSliceLines(lines: string[]): string[] {\n return lines\n .map(normalizeReflectionSliceLine)\n .filter((line) => !isPlaceholderReflectionSliceLine(line));\n}\n\nfunction isInvariantRuleLike(line: string): boolean {\n return /^(always|never|when\\b|if\\b|before\\b|after\\b|prefer\\b|avoid\\b|require\\b|only\\b|do not\\b|must\\b|should\\b)/i.test(line) ||\n /\\b(must|should|never|always|prefer|avoid|required?)\\b/i.test(line);\n}\n\nfunction isDerivedDeltaLike(line: string): boolean {\n return /^(this run|next run|going forward|follow-up|re-check|retest|verify|confirm|avoid repeating|adjust|change|update|retry|keep|watch)\\b/i.test(line) ||\n /\\b(this run|next run|delta|change|adjust|retry|re-check|retest|verify|confirm|avoid repeating|follow-up)\\b/i.test(line);\n}\n\nfunction isOpenLoopAction(line: string): boolean {\n return /^(investigate|verify|confirm|re-check|retest|update|add|remove|fix|avoid|keep|watch|document)\\b/i.test(line);\n}\n\nexport function extractReflectionLessons(reflectionText: string): string[] {\n return sanitizeReflectionSliceLines(parseSectionBullets(reflectionText, \"Lessons & pitfalls (symptom / cause / fix / prevention)\"));\n}\n\nexport function extractReflectionLearningGovernanceCandidates(reflectionText: string): ReflectionGovernanceEntry[] {\n const section = extractSectionMarkdown(reflectionText, \"Learning governance candidates (.learnings / promotion / skill extraction)\");\n if (!section) return [];\n\n const entryBlocks = section\n .split(/(?=^###\\s+Entry\\b)/gim)\n .map((block) => block.trim())\n .filter(Boolean);\n\n const parsed = entryBlocks\n .map(parseReflectionGovernanceEntry)\n .filter((entry): entry is ReflectionGovernanceEntry => entry !== null);\n\n if (parsed.length > 0) return parsed;\n\n const fallbackBullets = sanitizeReflectionSliceLines(\n parseSectionBullets(reflectionText, \"Learning governance candidates (.learnings / promotion / skill extraction)\")\n );\n if (fallbackBullets.length === 0) return [];\n\n return [{\n priority: \"medium\",\n status: \"pending\",\n area: \"config\",\n summary: \"Reflection learning governance candidates\",\n details: fallbackBullets.map((line) => `- ${line}`).join(\"\\n\"),\n suggestedAction: \"Review the governance candidates, promote durable rules to AGENTS.md / SOUL.md / TOOLS.md when stable, and extract a skill if the pattern becomes reusable.\",\n }];\n}\n\nfunction parseReflectionGovernanceEntry(block: string): ReflectionGovernanceEntry | null {\n const body = block.replace(/^###\\s+Entry\\b[^\\n]*\\n?/i, \"\").trim();\n if (!body) return null;\n\n const readField = (label: string): string | undefined => {\n const match = body.match(new RegExp(`^\\\\*\\\\*${label}\\\\*\\\\*:\\\\s*(.+)$`, \"im\"));\n const value = match?.[1]?.trim();\n return value ? value : undefined;\n };\n\n const readSection = (label: string): string | undefined => {\n const escaped = label.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = body.match(new RegExp(`^###\\\\s+${escaped}\\\\s*\\\\n([\\\\s\\\\S]*?)(?=^###\\\\s+|$)`, \"im\"));\n const value = match?.[1]?.trim();\n return value ? value : undefined;\n };\n\n const summary = readSection(\"Summary\");\n if (!summary) return null;\n\n return {\n priority: readField(\"Priority\"),\n status: readField(\"Status\"),\n area: readField(\"Area\"),\n summary,\n details: readSection(\"Details\"),\n suggestedAction: readSection(\"Suggested Action\"),\n };\n}\n\nexport function extractReflectionMappedMemories(reflectionText: string): ReflectionMappedMemory[] {\n return extractReflectionMappedMemoryItems(reflectionText).map(({ text, category, heading }) => ({ text, category, heading }));\n}\n\nexport function extractReflectionMappedMemoryItems(reflectionText: string): ReflectionMappedMemoryItem[] {\n const mappedSections: Array<{\n heading: string;\n category: \"preference\" | \"fact\" | \"decision\";\n mappedKind: ReflectionMappedKind;\n }> = [\n {\n heading: \"User model deltas (about the human)\",\n category: \"preference\",\n mappedKind: \"user-model\",\n },\n {\n heading: \"Agent model deltas (about the assistant/system)\",\n category: \"preference\",\n mappedKind: \"agent-model\",\n },\n {\n heading: \"Lessons & pitfalls (symptom / cause / fix / prevention)\",\n category: \"fact\",\n mappedKind: \"lesson\",\n },\n {\n heading: \"Decisions (durable)\",\n category: \"decision\",\n mappedKind: \"decision\",\n },\n ];\n\n return mappedSections.flatMap(({ heading, category, mappedKind }) => {\n const lines = sanitizeReflectionSliceLines(parseSectionBullets(reflectionText, heading));\n const groupSize = lines.length;\n return lines.map((text, ordinal) => ({ text, category, heading, mappedKind, ordinal, groupSize }));\n });\n}\n\nexport function extractReflectionSlices(reflectionText: string): ReflectionSlices {\n const invariantSection = parseSectionBullets(reflectionText, \"Invariants\");\n const derivedSection = parseSectionBullets(reflectionText, \"Derived\");\n const mergedSection = parseSectionBullets(reflectionText, \"Invariants & Reflections\");\n\n const invariantsPrimary = sanitizeReflectionSliceLines(invariantSection).filter(isInvariantRuleLike);\n const derivedPrimary = sanitizeReflectionSliceLines(derivedSection).filter(isDerivedDeltaLike);\n\n const invariantLinesLegacy = sanitizeReflectionSliceLines(\n mergedSection.filter((line) => /invariant|stable|policy|rule/i.test(line))\n ).filter(isInvariantRuleLike);\n const reflectionLinesLegacy = sanitizeReflectionSliceLines(\n mergedSection.filter((line) => /reflect|inherit|derive|change|apply/i.test(line))\n ).filter(isDerivedDeltaLike);\n const openLoopLines = sanitizeReflectionSliceLines(parseSectionBullets(reflectionText, \"Open loops / next actions\"))\n .filter(isOpenLoopAction)\n .filter(isDerivedDeltaLike);\n const durableDecisionLines = sanitizeReflectionSliceLines(parseSectionBullets(reflectionText, \"Decisions (durable)\"))\n .filter(isInvariantRuleLike);\n\n const invariants = invariantsPrimary.length > 0\n ? invariantsPrimary\n : (invariantLinesLegacy.length > 0 ? invariantLinesLegacy : durableDecisionLines);\n const derived = derivedPrimary.length > 0\n ? derivedPrimary\n : [...reflectionLinesLegacy, ...openLoopLines];\n\n return {\n invariants: invariants.slice(0, 8),\n derived: derived.slice(0, 10),\n };\n}\n\nexport function extractReflectionSliceItems(reflectionText: string): ReflectionSliceItem[] {\n const slices = extractReflectionSlices(reflectionText);\n const invariantGroupSize = slices.invariants.length;\n const derivedGroupSize = slices.derived.length;\n\n const invariantItems = slices.invariants.map((text, ordinal) => ({\n text,\n itemKind: \"invariant\" as const,\n section: \"Invariants\" as const,\n ordinal,\n groupSize: invariantGroupSize,\n }));\n const derivedItems = slices.derived.map((text, ordinal) => ({\n text,\n itemKind: \"derived\" as const,\n section: \"Derived\" as const,\n ordinal,\n groupSize: derivedGroupSize,\n }));\n\n return [...invariantItems, ...derivedItems];\n}\n"],
5
- "mappings": "AAqCO,SAAS,uBAAuB,UAAkB,SAAyB;AAChF,QAAM,QAAQ,SAAS,MAAM,OAAO;AACpC,QAAM,gBAAgB,MAAM,OAAO,GAAG,YAAY;AAClD,MAAI,YAAY;AAChB,QAAM,YAAsB,CAAC;AAC7B,aAAW,OAAO,OAAO;AACvB,UAAM,OAAO,IAAI,KAAK;AACtB,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,MAAM,WAAW,KAAK,GAAG;AAC3B,UAAI,aAAa,UAAU,cAAe;AAC1C,kBAAY,UAAU;AACtB;AAAA,IACF;AACA,QAAI,CAAC,UAAW;AAChB,cAAU,KAAK,GAAG;AAAA,EACpB;AACA,SAAO,UAAU,KAAK,IAAI,EAAE,KAAK;AACnC;AAEO,SAAS,oBAAoB,UAAkB,SAA2B;AAC/E,QAAM,QAAQ,uBAAuB,UAAU,OAAO,EAAE,MAAM,OAAO;AACrE,QAAM,YAAsB,CAAC;AAC7B,aAAW,OAAO,OAAO;AACvB,UAAM,OAAO,IAAI,KAAK;AACtB,QAAI,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,IAAI,GAAG;AAClD,YAAM,aAAa,KAAK,MAAM,CAAC,EAAE,KAAK;AACtC,UAAI,WAAY,WAAU,KAAK,UAAU;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iCAAiC,MAAuB;AACtE,QAAM,aAAa,KAAK,QAAQ,SAAS,EAAE,EAAE,KAAK;AAClD,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI,0BAA0B,KAAK,UAAU,EAAG,QAAO;AACvD,MAAI,4CAA4C,KAAK,UAAU,EAAG,QAAO;AACzE,MAAI,yCAAyC,KAAK,UAAU,EAAG,QAAO;AACtE,MAAI,oDAAoD,KAAK,UAAU,EAAG,QAAO;AACjF,MAAI,yDAAyD,KAAK,UAAU,EAAG,QAAO;AACtF,SAAO;AACT;AAEO,SAAS,6BAA6B,MAAsB;AACjE,SAAO,KACJ,QAAQ,SAAS,EAAE,EACnB,QAAQ,+CAA+C,EAAE,EACzD,KAAK;AACV;AAEO,SAAS,6BAA6B,OAA2B;AACtE,SAAO,MACJ,IAAI,4BAA4B,EAChC,OAAO,CAAC,SAAS,CAAC,iCAAiC,IAAI,CAAC;AAC7D;AAEA,SAAS,oBAAoB,MAAuB;AAClD,SAAO,2GAA2G,KAAK,IAAI,KACzH,yDAAyD,KAAK,IAAI;AACtE;AAEA,SAAS,mBAAmB,MAAuB;AACjD,SAAO,uIAAuI,KAAK,IAAI,KACrJ,8GAA8G,KAAK,IAAI;AAC3H;AAEA,SAAS,iBAAiB,MAAuB;AAC/C,SAAO,mGAAmG,KAAK,IAAI;AACrH;AAEO,SAAS,yBAAyB,gBAAkC;AACzE,SAAO,6BAA6B,oBAAoB,gBAAgB,yDAAyD,CAAC;AACpI;AAEO,SAAS,8CAA8C,gBAAqD;AACjH,QAAM,UAAU,uBAAuB,gBAAgB,4EAA4E;AACnI,MAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,QAAM,cAAc,QACjB,MAAM,uBAAuB,EAC7B,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AAEjB,QAAM,SAAS,YACZ,IAAI,8BAA8B,EAClC,OAAO,CAAC,UAA8C,UAAU,IAAI;AAEvE,MAAI,OAAO,SAAS,EAAG,QAAO;AAE9B,QAAM,kBAAkB;AAAA,IACtB,oBAAoB,gBAAgB,4EAA4E;AAAA,EAClH;AACA,MAAI,gBAAgB,WAAW,EAAG,QAAO,CAAC;AAE1C,SAAO,CAAC;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,gBAAgB,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EAAE,KAAK,IAAI;AAAA,IAC7D,iBAAiB;AAAA,EACnB,CAAC;AACH;AAEA,SAAS,+BAA+B,OAAiD;AACvF,QAAM,OAAO,MAAM,QAAQ,4BAA4B,EAAE,EAAE,KAAK;AAChE,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,YAAY,CAAC,UAAsC;AACvD,UAAM,QAAQ,KAAK,MAAM,IAAI,OAAO,UAAU,KAAK,oBAAoB,IAAI,CAAC;AAC5E,UAAM,QAAQ,QAAQ,CAAC,GAAG,KAAK;AAC/B,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAEA,QAAM,cAAc,CAAC,UAAsC;AACzD,UAAM,UAAU,MAAM,QAAQ,uBAAuB,MAAM;AAC3D,UAAM,QAAQ,KAAK,MAAM,IAAI,OAAO,WAAW,OAAO,qCAAqC,IAAI,CAAC;AAChG,UAAM,QAAQ,QAAQ,CAAC,GAAG,KAAK;AAC/B,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAEA,QAAM,UAAU,YAAY,SAAS;AACrC,MAAI,CAAC,QAAS,QAAO;AAErB,SAAO;AAAA,IACL,UAAU,UAAU,UAAU;AAAA,IAC9B,QAAQ,UAAU,QAAQ;AAAA,IAC1B,MAAM,UAAU,MAAM;AAAA,IACtB;AAAA,IACA,SAAS,YAAY,SAAS;AAAA,IAC9B,iBAAiB,YAAY,kBAAkB;AAAA,EACjD;AACF;AAEO,SAAS,gCAAgC,gBAAkD;AAChG,SAAO,mCAAmC,cAAc,EAAE,IAAI,CAAC,EAAE,MAAM,UAAU,QAAQ,OAAO,EAAE,MAAM,UAAU,QAAQ,EAAE;AAC9H;AAEO,SAAS,mCAAmC,gBAAsD;AACvG,QAAM,iBAID;AAAA,IACH;AAAA,MACE,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO,eAAe,QAAQ,CAAC,EAAE,SAAS,UAAU,WAAW,MAAM;AACnE,UAAM,QAAQ,6BAA6B,oBAAoB,gBAAgB,OAAO,CAAC;AACvF,UAAM,YAAY,MAAM;AACxB,WAAO,MAAM,IAAI,CAAC,MAAM,aAAa,EAAE,MAAM,UAAU,SAAS,YAAY,SAAS,UAAU,EAAE;AAAA,EACnG,CAAC;AACH;AAEO,SAAS,wBAAwB,gBAA0C;AAChF,QAAM,mBAAmB,oBAAoB,gBAAgB,YAAY;AACzE,QAAM,iBAAiB,oBAAoB,gBAAgB,SAAS;AACpE,QAAM,gBAAgB,oBAAoB,gBAAgB,0BAA0B;AAEpF,QAAM,oBAAoB,6BAA6B,gBAAgB,EAAE,OAAO,mBAAmB;AACnG,QAAM,iBAAiB,6BAA6B,cAAc,EAAE,OAAO,kBAAkB;AAE7F,QAAM,uBAAuB;AAAA,IAC3B,cAAc,OAAO,CAAC,SAAS,gCAAgC,KAAK,IAAI,CAAC;AAAA,EAC3E,EAAE,OAAO,mBAAmB;AAC5B,QAAM,wBAAwB;AAAA,IAC5B,cAAc,OAAO,CAAC,SAAS,uCAAuC,KAAK,IAAI,CAAC;AAAA,EAClF,EAAE,OAAO,kBAAkB;AAC3B,QAAM,gBAAgB,6BAA6B,oBAAoB,gBAAgB,2BAA2B,CAAC,EAChH,OAAO,gBAAgB,EACvB,OAAO,kBAAkB;AAC5B,QAAM,uBAAuB,6BAA6B,oBAAoB,gBAAgB,qBAAqB,CAAC,EACjH,OAAO,mBAAmB;AAE7B,QAAM,aAAa,kBAAkB,SAAS,IAC1C,oBACC,qBAAqB,SAAS,IAAI,uBAAuB;AAC9D,QAAM,UAAU,eAAe,SAAS,IACpC,iBACA,CAAC,GAAG,uBAAuB,GAAG,aAAa;AAE/C,SAAO;AAAA,IACL,YAAY,WAAW,MAAM,GAAG,CAAC;AAAA,IACjC,SAAS,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC9B;AACF;AAEO,SAAS,4BAA4B,gBAA+C;AACzF,QAAM,SAAS,wBAAwB,cAAc;AACrD,QAAM,qBAAqB,OAAO,WAAW;AAC7C,QAAM,mBAAmB,OAAO,QAAQ;AAExC,QAAM,iBAAiB,OAAO,WAAW,IAAI,CAAC,MAAM,aAAa;AAAA,IAC/D;AAAA,IACA,UAAU;AAAA,IACV,SAAS;AAAA,IACT;AAAA,IACA,WAAW;AAAA,EACb,EAAE;AACF,QAAM,eAAe,OAAO,QAAQ,IAAI,CAAC,MAAM,aAAa;AAAA,IAC1D;AAAA,IACA,UAAU;AAAA,IACV,SAAS;AAAA,IACT;AAAA,IACA,WAAW;AAAA,EACb,EAAE;AAEF,SAAO,CAAC,GAAG,gBAAgB,GAAG,YAAY;AAC5C;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"reflection-store.d.ts","sourceRoot":"","sources":["../../src/reflection-store.ts"],"names":[],"mappings":"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"}