@poprobertdaniel/openclaw-memory 0.1.1 → 0.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.
- package/README.md +22 -10
- package/dist/{chunk-RFLG2CCR.js → chunk-7DNVIKQ3.js} +100 -10
- package/dist/chunk-7DNVIKQ3.js.map +1 -0
- package/dist/{chunk-JSQBXYDM.js → chunk-BTR4T5L3.js} +157 -26
- package/dist/chunk-BTR4T5L3.js.map +1 -0
- package/dist/{chunk-VXULEX3A.cjs → chunk-CSGZH2SG.cjs} +9 -9
- package/dist/chunk-CSGZH2SG.cjs.map +1 -0
- package/dist/{chunk-JNWCMHOB.js → chunk-ITGUJZUL.js} +2 -2
- package/dist/{chunk-JNWCMHOB.js.map → chunk-ITGUJZUL.js.map} +1 -1
- package/dist/{chunk-NHFPLDZK.js → chunk-J2C5USXH.js} +3 -3
- package/dist/{chunk-CRPEAZ44.cjs → chunk-JYQB2DOK.cjs} +161 -30
- package/dist/chunk-JYQB2DOK.cjs.map +1 -0
- package/dist/{chunk-ZY2C2CJQ.cjs → chunk-LA5OP5VI.cjs} +2 -2
- package/dist/chunk-LA5OP5VI.cjs.map +1 -0
- package/dist/{chunk-NMUPGLJW.cjs → chunk-NYZMAY73.cjs} +110 -20
- package/dist/chunk-NYZMAY73.cjs.map +1 -0
- package/dist/cli/index.cjs +25 -25
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +7 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +5 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +64 -2
- package/dist/index.d.ts +64 -2
- package/dist/index.js +4 -4
- package/dist/memory-service-B2BAEKR2.cjs +9 -0
- package/dist/memory-service-B2BAEKR2.cjs.map +1 -0
- package/dist/memory-service-ZTLGPIUH.js +9 -0
- package/dist/{server-BTbRv-yX.d.ts → server-CtNlCow7.d.cts} +62 -0
- package/dist/{server-BTbRv-yX.d.cts → server-CtNlCow7.d.ts} +62 -0
- package/dist/server.cjs +4 -4
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +3 -3
- package/package.json +2 -2
- package/templates/.env.example +1 -1
- package/templates/openclaw-memory.config.ts +2 -2
- package/dist/chunk-CRPEAZ44.cjs.map +0 -1
- package/dist/chunk-JSQBXYDM.js.map +0 -1
- package/dist/chunk-NMUPGLJW.cjs.map +0 -1
- package/dist/chunk-RFLG2CCR.js.map +0 -1
- package/dist/chunk-VXULEX3A.cjs.map +0 -1
- package/dist/chunk-ZY2C2CJQ.cjs.map +0 -1
- package/dist/memory-service-6WDMF6KX.cjs +0 -9
- package/dist/memory-service-6WDMF6KX.cjs.map +0 -1
- package/dist/memory-service-GKEG6J2D.js +0 -9
- /package/dist/{chunk-NHFPLDZK.js.map → chunk-J2C5USXH.js.map} +0 -0
- /package/dist/{memory-service-GKEG6J2D.js.map → memory-service-ZTLGPIUH.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/robertpop/work/personal/openclaw-memory/dist/chunk-NMUPGLJW.cjs","../src/server.ts","../src/api/router.ts","../src/api/memories.ts","../src/api/search.ts","../src/api/conversations.ts","../src/api/entities.ts","../src/api/admin.ts"],"names":["Elysia","t","path"],"mappings":"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","file":"/Users/robertpop/work/personal/openclaw-memory/dist/chunk-NMUPGLJW.cjs","sourcesContent":[null,"import { fileURLToPath } from \"node:url\";\nimport { resolve } from \"node:path\";\nimport { loadConfig, configSummary } from \"./config/index.js\";\nimport { StorageOrchestrator } from \"./storage/orchestrator.js\";\nimport { createApp } from \"./api/router.js\";\n\n// ── Server Entry Point ──────────────────────────────────────────────────\n\nexport async function createServer(configPath?: string) {\n const config = await loadConfig(configPath);\n const orchestrator = new StorageOrchestrator(config);\n await orchestrator.init();\n\n const app = createApp(orchestrator, config);\n\n return { app, orchestrator, config };\n}\n\n// ── Main ────────────────────────────────────────────────────────────────\n\nasync function main() {\n console.log(\"┌──────────────────────────────────────────┐\");\n console.log(\"│ openclaw-memory service v0.1.0 │\");\n console.log(\"│ Triple-Layer Memory System │\");\n console.log(\"└──────────────────────────────────────────┘\");\n\n const { app, orchestrator, config } = await createServer();\n\n console.log(\"[config]\");\n console.log(configSummary(config).split(\"\\n\").map((l) => ` ${l}`).join(\"\\n\"));\n\n app.listen(config.port);\n console.log(`[server] Listening on http://${config.host}:${config.port}`);\n console.log(`[server] Health check: http://localhost:${config.port}/api/health`);\n\n const shutdown = async () => {\n console.log(\"\\n[server] Shutting down...\");\n await orchestrator.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\n// Run if executed directly (works in both Bun and Node ESM)\nfunction isMainModule(): boolean {\n try {\n // Bun runtime\n if (typeof globalThis.Bun !== \"undefined\") {\n const bun = globalThis.Bun as { main?: string };\n return bun.main === fileURLToPath(import.meta.url);\n }\n // Node.js\n if (process.argv[1]) {\n return resolve(process.argv[1]) === resolve(fileURLToPath(import.meta.url));\n }\n return false;\n } catch {\n return false;\n }\n}\n\nif (isMainModule()) {\n main().catch((error) => {\n console.error(\"[fatal]\", error);\n process.exit(1);\n });\n}\n","import { Elysia } from \"elysia\";\nimport { cors } from \"@elysiajs/cors\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport type { StorageOrchestrator } from \"../storage/orchestrator.js\";\nimport { AuthError, MemoryError, NotFoundError, ValidationError } from \"../core/errors.js\";\nimport { memoriesRoutes } from \"./memories.js\";\nimport { searchRoutes } from \"./search.js\";\nimport { conversationRoutes } from \"./conversations.js\";\nimport { entityRoutes } from \"./entities.js\";\nimport { adminRoutes } from \"./admin.js\";\n\n// ── App Router ──────────────────────────────────────────────────────────\n\nexport function createApp(orchestrator: StorageOrchestrator, config: ResolvedConfig) {\n const app = new Elysia()\n .use(cors())\n\n // ── Auth Middleware ────────────────────────────────────────────────\n .derive(({ headers, set, path }) => {\n // Skip auth for health check\n if (path === \"/api/health\") return {};\n\n // Skip auth if disabled\n if (!config.auth.enabled || !config.auth.token) return {};\n\n const authHeader = headers.authorization;\n if (!authHeader || !authHeader.startsWith(\"Bearer \")) {\n set.status = 401;\n throw new AuthError(\"Missing or invalid Authorization header\");\n }\n\n const token = authHeader.slice(7);\n if (token !== config.auth.token) {\n set.status = 403;\n throw new AuthError(\"Invalid token\");\n }\n\n return {};\n })\n\n // ── Error Handler ─────────────────────────────────────────────────\n .onError(({ code, error, set }) => {\n // Handle AuthError\n if (error instanceof AuthError) {\n const status = error.message.includes(\"Invalid token\") ? 403 : 401;\n set.status = status;\n return { error: error.message, code: error.code };\n }\n\n // Handle other custom errors\n if (error instanceof NotFoundError) {\n set.status = 404;\n return { error: error.message, code: error.code };\n }\n\n if (error instanceof ValidationError) {\n set.status = 400;\n return { error: error.message, code: error.code, details: error.details };\n }\n\n if (error instanceof MemoryError) {\n set.status = 500;\n return { error: error.message, code: error.code };\n }\n\n // Elysia validation errors\n if (code === \"VALIDATION\") {\n const msg = error && \"message\" in error ? (error as Error).message : String(error);\n set.status = 400;\n return { error: \"Validation error\", details: msg };\n }\n\n // Unknown errors\n const msg = error instanceof Error ? error.stack || error.message : String(error);\n console.error(`[api] Unhandled error: ${msg}`);\n set.status = 500;\n return { error: \"Internal server error\" };\n })\n\n // ── Mount Routes ──────────────────────────────────────────────────\n .use(memoriesRoutes(orchestrator))\n .use(searchRoutes(orchestrator))\n .use(conversationRoutes(orchestrator, config))\n .use(entityRoutes(orchestrator))\n .use(adminRoutes(orchestrator));\n\n return app;\n}\n","import { Elysia, t } from \"elysia\";\nimport type { StorageOrchestrator } from \"../storage/orchestrator.js\";\nimport type { CreateMemoryRequest, UpdateMemoryRequest, MemoryScope, MemorySource } from \"../core/types.js\";\n\n// ── Memory CRUD Routes ──────────────────────────────────────────────────\n\nexport function memoriesRoutes(orchestrator: StorageOrchestrator) {\n return new Elysia({ prefix: \"/api/memories\" })\n // POST /api/memories — Create a new memory\n .post(\n \"/\",\n async ({ body, set }) => {\n try {\n const result = await orchestrator.createMemory(body as CreateMemoryRequest);\n set.status = 201;\n return result;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to create memory\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.String(),\n scope: t.Union([\n t.Literal(\"user\"),\n t.Literal(\"agent\"),\n t.Literal(\"global\"),\n t.Literal(\"project\"),\n t.Literal(\"session\"),\n ]),\n subject_id: t.Optional(t.Nullable(t.String())),\n content: t.String(),\n tags: t.Optional(t.Array(t.String())),\n source: t.Optional(\n t.Union([\n t.Literal(\"explicit\"),\n t.Literal(\"derived\"),\n t.Literal(\"observation\"),\n t.Literal(\"conversation_summary\"),\n t.Literal(\"entity_extraction\"),\n t.Literal(\"daily_digest\"),\n t.Literal(\"migration\"),\n ])\n ),\n created_by: t.Optional(t.Nullable(t.String())),\n extract_entities: t.Optional(t.Boolean()),\n expires_at: t.Optional(t.Nullable(t.String())),\n }),\n }\n )\n\n // GET /api/memories/:id — Get a memory by ID\n .get(\"/:id\", ({ params, set }) => {\n const memory = orchestrator.sqlite.getMemory(params.id);\n if (!memory) {\n set.status = 404;\n return { error: \"Memory not found\" };\n }\n return memory;\n })\n\n // PUT /api/memories/:id — Update a memory\n .put(\n \"/:id\",\n async ({ params, body, set }) => {\n try {\n const result = await orchestrator.updateMemory(\n params.id,\n body as UpdateMemoryRequest\n );\n if (!result) {\n set.status = 404;\n return { error: \"Memory not found\" };\n }\n return result;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to update memory\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n content: t.Optional(t.String()),\n tags: t.Optional(t.Array(t.String())),\n scope: t.Optional(\n t.Union([\n t.Literal(\"user\"),\n t.Literal(\"agent\"),\n t.Literal(\"global\"),\n t.Literal(\"project\"),\n t.Literal(\"session\"),\n ])\n ),\n subject_id: t.Optional(t.Nullable(t.String())),\n expires_at: t.Optional(t.Nullable(t.String())),\n extract_entities: t.Optional(t.Boolean()),\n }),\n }\n )\n\n // DELETE /api/memories/:id — Delete a memory\n .delete(\"/:id\", async ({ params, set }) => {\n try {\n const deleted = await orchestrator.deleteMemory(params.id);\n if (!deleted) {\n set.status = 404;\n return { error: \"Memory not found\" };\n }\n return { deleted: true, id: params.id };\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to delete memory\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n })\n\n // GET /api/memories — List memories with filters\n .get(\"/\", ({ query }) => {\n const memories = orchestrator.sqlite.listMemories({\n agent_id: query.agent_id as string | undefined,\n scope: query.scope as MemoryScope | undefined,\n subject_id: query.subject_id as string | undefined,\n source: query.source as MemorySource | undefined,\n tags: query.tags as string | undefined,\n limit: query.limit ? parseInt(String(query.limit), 10) : undefined,\n offset: query.offset ? parseInt(String(query.offset), 10) : undefined,\n order: (query.order as \"asc\" | \"desc\") || \"desc\",\n });\n return { memories, count: memories.length };\n });\n}\n","import { Elysia, t } from \"elysia\";\nimport { SearchEngine } from \"../search/engine.js\";\nimport type { StorageOrchestrator } from \"../storage/orchestrator.js\";\nimport type { SearchRequest } from \"../core/types.js\";\n\n// ── Search Routes ───────────────────────────────────────────────────────\n\nexport function searchRoutes(orchestrator: StorageOrchestrator) {\n const searchEngine = new SearchEngine(orchestrator);\n\n return new Elysia({ prefix: \"/api/search\" })\n // POST /api/search — Smart search (auto-selects layers)\n .post(\n \"/\",\n async ({ body, set }) => {\n try {\n const req = body as SearchRequest;\n if (!req.agent_id) req.cross_agent = true;\n return await searchEngine.search(req);\n } catch (error) {\n set.status = 500;\n return {\n error: \"Search failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.Optional(t.String()),\n query: t.String(),\n scopes: t.Optional(\n t.Array(\n t.Union([\n t.Literal(\"user\"),\n t.Literal(\"agent\"),\n t.Literal(\"global\"),\n t.Literal(\"project\"),\n t.Literal(\"session\"),\n ])\n )\n ),\n subject_id: t.Optional(t.Nullable(t.String())),\n limit: t.Optional(t.Number()),\n include_graph: t.Optional(t.Boolean()),\n cross_agent: t.Optional(t.Boolean()),\n strategy: t.Optional(\n t.Union([\n t.Literal(\"auto\"),\n t.Literal(\"semantic\"),\n t.Literal(\"fulltext\"),\n t.Literal(\"graph\"),\n t.Literal(\"all\"),\n ])\n ),\n }),\n }\n )\n\n // POST /api/search/semantic — Force Qdrant semantic search\n .post(\n \"/semantic\",\n async ({ body, set }) => {\n try {\n return await searchEngine.search({\n ...(body as SearchRequest),\n strategy: \"semantic\",\n });\n } catch (error) {\n set.status = 500;\n return {\n error: \"Semantic search failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.Optional(t.String()),\n query: t.String(),\n scopes: t.Optional(\n t.Array(\n t.Union([\n t.Literal(\"user\"),\n t.Literal(\"agent\"),\n t.Literal(\"global\"),\n t.Literal(\"project\"),\n t.Literal(\"session\"),\n ])\n )\n ),\n subject_id: t.Optional(t.Nullable(t.String())),\n limit: t.Optional(t.Number()),\n cross_agent: t.Optional(t.Boolean()),\n }),\n }\n )\n\n // POST /api/search/graph — Force AGE graph traversal\n .post(\n \"/graph\",\n async ({ body, set }) => {\n try {\n return await searchEngine.search({\n ...(body as SearchRequest),\n strategy: \"graph\",\n include_graph: true,\n });\n } catch (error) {\n set.status = 500;\n return {\n error: \"Graph search failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.Optional(t.String()),\n query: t.String(),\n scopes: t.Optional(\n t.Array(\n t.Union([\n t.Literal(\"user\"),\n t.Literal(\"agent\"),\n t.Literal(\"global\"),\n t.Literal(\"project\"),\n t.Literal(\"session\"),\n ])\n )\n ),\n subject_id: t.Optional(t.Nullable(t.String())),\n limit: t.Optional(t.Number()),\n }),\n }\n )\n\n // POST /api/search/fulltext — Force SQLite FTS search\n .post(\n \"/fulltext\",\n async ({ body, set }) => {\n try {\n return await searchEngine.search({\n ...(body as SearchRequest),\n strategy: \"fulltext\",\n include_graph: false,\n });\n } catch (error) {\n set.status = 500;\n return {\n error: \"Fulltext search failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.Optional(t.String()),\n query: t.String(),\n scopes: t.Optional(t.Array(t.String())),\n subject_id: t.Optional(t.Nullable(t.String())),\n limit: t.Optional(t.Number()),\n }),\n }\n );\n}\n","import { Elysia, t } from \"elysia\";\nimport type { StorageOrchestrator } from \"../storage/orchestrator.js\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport { ConversationSummarizer } from \"../extraction/summarizer.js\";\nimport type { ConversationLogEntry, CreateMemoryRequest, SummarizeResponse } from \"../core/types.js\";\n\n// ── Conversation Routes ─────────────────────────────────────────────────\n\nexport function conversationRoutes(\n orchestrator: StorageOrchestrator,\n config: ResolvedConfig\n) {\n // Summarizer is only available if extraction config is present\n const summarizer = config.extraction\n ? new ConversationSummarizer({\n apiKey: config.extraction.apiKey,\n baseUrl: config.extraction.baseUrl,\n model: config.extraction.model,\n })\n : null;\n\n return new Elysia({ prefix: \"/api/conversations\" })\n // POST /api/conversations/log — Append conversation entry\n .post(\n \"/log\",\n ({ body, set }) => {\n try {\n orchestrator.sqlite.appendConversationLog(body as ConversationLogEntry);\n set.status = 201;\n return { ok: true };\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to append conversation log\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.String(),\n session_id: t.String(),\n user_id: t.String(),\n channel: t.String(),\n role: t.Union([\n t.Literal(\"user\"),\n t.Literal(\"assistant\"),\n t.Literal(\"system\"),\n ]),\n content: t.String(),\n timestamp: t.String(),\n }),\n }\n )\n\n // POST /api/conversations/summarize — Summarize a session\n .post(\n \"/summarize\",\n async ({ body, set }) => {\n if (!summarizer) {\n set.status = 501;\n return { error: \"Summarization not available — extraction config required\" };\n }\n\n try {\n const { agent_id, session_id, user_id, channel, messages } = body;\n\n const summary = await summarizer.summarize(messages);\n if (!summary) {\n set.status = 422;\n return { error: \"Failed to generate summary\" };\n }\n\n const memoryReq: CreateMemoryRequest = {\n agent_id,\n scope: \"session\",\n subject_id: user_id,\n content: summary,\n tags: [\"conversation_summary\", channel, `session:${session_id}`],\n source: \"conversation_summary\",\n created_by: agent_id,\n extract_entities: true,\n };\n\n const result = await orchestrator.createMemory(memoryReq);\n\n const response: SummarizeResponse = {\n memory_id: result.id,\n summary,\n entities_extracted: result.entities,\n relationships_created: 0,\n };\n\n set.status = 201;\n return response;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Summarization failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.String(),\n session_id: t.String(),\n user_id: t.String(),\n channel: t.String(),\n messages: t.Array(\n t.Object({\n role: t.Union([\n t.Literal(\"user\"),\n t.Literal(\"assistant\"),\n t.Literal(\"system\"),\n ]),\n content: t.String(),\n timestamp: t.String(),\n })\n ),\n reason: t.Optional(t.String()),\n }),\n }\n );\n}\n","import { Elysia, t } from \"elysia\";\nimport type { StorageOrchestrator } from \"../storage/orchestrator.js\";\n\n// ── Entity Routes ───────────────────────────────────────────────────────\n\nexport function entityRoutes(orchestrator: StorageOrchestrator) {\n return new Elysia({ prefix: \"/api/entities\" })\n // GET /api/entities/:type — List entities by type\n .get(\"/:type\", async ({ params, query, set }) => {\n if (!orchestrator.age) {\n set.status = 501;\n return { error: \"Graph layer not available — requires Full tier\" };\n }\n\n try {\n const entities = await orchestrator.age.listEntities(\n params.type,\n query.agent_id as string | undefined,\n query.limit ? parseInt(String(query.limit), 10) : 50\n );\n return { entities, count: entities.length };\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to list entities\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n })\n\n // GET /api/entities/:type/:id — Get entity with relationships\n .get(\"/:type/:id\", async ({ params, set }) => {\n if (!orchestrator.age) {\n set.status = 501;\n return { error: \"Graph layer not available — requires Full tier\" };\n }\n\n try {\n const result = await orchestrator.age.getEntityWithRelationships(\n params.type,\n params.id\n );\n if (!result.entity) {\n set.status = 404;\n return { error: \"Entity not found\" };\n }\n return result;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to get entity\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n })\n\n // GET /api/entities/:type/:id/related — Get related entities\n .get(\"/:type/:id/related\", async ({ params, query, set }) => {\n if (!orchestrator.age) {\n set.status = 501;\n return { error: \"Graph layer not available — requires Full tier\" };\n }\n\n try {\n const depth = query.depth ? parseInt(String(query.depth), 10) : 2;\n const related = await orchestrator.age.getRelatedEntities(\n params.id,\n depth\n );\n return { related, count: related.length };\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to get related entities\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n })\n\n // POST /api/entities/extract — Manually trigger entity extraction\n .post(\n \"/extract\",\n async ({ body, set }) => {\n if (!orchestrator.entityExtractor) {\n set.status = 501;\n return { error: \"Entity extraction not available — requires extraction config\" };\n }\n\n try {\n const result = await orchestrator.entityExtractor.extract(body.text);\n return result;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Entity extraction failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n text: t.String(),\n }),\n }\n );\n}\n","import { Elysia, t } from \"elysia\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { StorageOrchestrator } from \"../storage/orchestrator.js\";\nimport type { CreateMemoryRequest, MigrateMarkdownRequest } from \"../core/types.js\";\n\n// ── Admin Routes ────────────────────────────────────────────────────────\n\nexport function adminRoutes(orchestrator: StorageOrchestrator) {\n return new Elysia()\n // GET /api/health — Health check\n .get(\"/api/health\", async () => {\n return await orchestrator.healthCheck();\n })\n\n // POST /api/sync/retry — Retry failed L2/L3 syncs\n .post(\"/api/sync/retry\", async ({ set }) => {\n try {\n const result = await orchestrator.retrySyncQueue();\n return result;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Sync retry failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n })\n\n // GET /api/sync/queue — View pending sync queue\n .get(\"/api/sync/queue\", () => {\n const items = orchestrator.sqlite.getSyncQueue(100);\n return { items, count: items.length };\n })\n\n // POST /api/admin/migrate-markdown — Migrate markdown files\n .post(\n \"/api/admin/migrate-markdown\",\n async ({ body, set }) => {\n try {\n const results = await migrateMarkdownFiles(orchestrator, body);\n return results;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Migration failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n markdown_paths: t.Array(t.String()),\n agent_id: t.String(),\n dry_run: t.Optional(t.Boolean()),\n }),\n }\n )\n\n // POST /api/admin/daily-digest — Trigger daily digest\n .post(\"/api/admin/daily-digest\", async ({ set }) => {\n set.status = 501;\n return { error: \"Not yet implemented\" };\n });\n}\n\n// ── Markdown Migration ──────────────────────────────────────────────────\n\nasync function migrateMarkdownFiles(\n orchestrator: StorageOrchestrator,\n request: MigrateMarkdownRequest\n): Promise<{\n migrated: number;\n skipped: number;\n errors: string[];\n memories: Array<{ id: string; content_preview: string }>;\n}> {\n const { markdown_paths, agent_id, dry_run } = request;\n let migrated = 0;\n let skipped = 0;\n const errors: string[] = [];\n const memories: Array<{ id: string; content_preview: string }> = [];\n\n for (const filePath of markdown_paths) {\n try {\n if (!fs.existsSync(filePath)) {\n errors.push(`File not found: ${filePath}`);\n skipped++;\n continue;\n }\n\n const content = fs.readFileSync(filePath, \"utf-8\");\n const fileName = path.basename(filePath, \".md\");\n const sections = parseMarkdownSections(content);\n\n for (const section of sections) {\n if (section.content.trim().length < 10) {\n skipped++;\n continue;\n }\n\n if (dry_run) {\n memories.push({\n id: \"(dry-run)\",\n content_preview: section.content.slice(0, 100),\n });\n migrated++;\n continue;\n }\n\n const scope = inferScope(section.heading, fileName);\n const source = inferSource(fileName);\n const tags = inferTags(section.heading, fileName);\n\n const req: CreateMemoryRequest = {\n agent_id,\n scope,\n subject_id: null,\n content: section.content.trim(),\n tags,\n source: source || \"migration\",\n created_by: \"migration\",\n extract_entities: true,\n };\n\n try {\n const result = await orchestrator.createMemory(req);\n memories.push({\n id: result.id,\n content_preview: section.content.slice(0, 100),\n });\n migrated++;\n } catch (error) {\n errors.push(\n `Failed to migrate section \"${section.heading}\": ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n } catch (error) {\n errors.push(\n `Failed to process ${filePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n return { migrated, skipped, errors, memories };\n}\n\n// ── Markdown Parsing Helpers ────────────────────────────────────────────\n\ninterface MarkdownSection {\n heading: string;\n content: string;\n level: number;\n}\n\nfunction parseMarkdownSections(markdown: string): MarkdownSection[] {\n const lines = markdown.split(\"\\n\");\n const sections: MarkdownSection[] = [];\n let currentHeading = \"root\";\n let currentLevel = 0;\n let currentContent: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,3})\\s+(.+)/);\n if (headingMatch) {\n if (currentContent.length > 0) {\n sections.push({\n heading: currentHeading,\n content: currentContent.join(\"\\n\").trim(),\n level: currentLevel,\n });\n }\n currentHeading = headingMatch[2].trim();\n currentLevel = headingMatch[1].length;\n currentContent = [];\n } else {\n currentContent.push(line);\n }\n }\n\n if (currentContent.length > 0) {\n sections.push({\n heading: currentHeading,\n content: currentContent.join(\"\\n\").trim(),\n level: currentLevel,\n });\n }\n\n return sections;\n}\n\nfunction inferScope(heading: string, fileName: string): CreateMemoryRequest[\"scope\"] {\n const h = heading.toLowerCase();\n const f = fileName.toLowerCase();\n\n if (h.includes(\"about\") || h.includes(\"personal\")) return \"user\";\n if (h.includes(\"project\")) return \"project\";\n if (h.includes(\"agent\")) return \"agent\";\n if (h.includes(\"session\") || f.match(/^\\d{4}-\\d{2}-\\d{2}/)) return \"session\";\n return \"global\";\n}\n\nfunction inferSource(fileName: string): CreateMemoryRequest[\"source\"] | null {\n if (fileName.match(/^\\d{4}-\\d{2}-\\d{2}/)) return \"daily_digest\";\n return \"migration\";\n}\n\nfunction inferTags(heading: string, fileName: string): string[] {\n const tags: string[] = [\"migration\"];\n if (fileName.match(/^\\d{4}-\\d{2}-\\d{2}/)) {\n tags.push(\"daily\", fileName);\n }\n if (heading !== \"root\") {\n tags.push(heading.toLowerCase().replace(/[^a-z0-9]+/g, \"-\"));\n }\n return tags;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server.ts","../src/api/router.ts","../src/api/memories.ts","../src/api/search.ts","../src/api/conversations.ts","../src/api/entities.ts","../src/api/admin.ts"],"sourcesContent":["import { fileURLToPath } from \"node:url\";\nimport { resolve } from \"node:path\";\nimport { loadConfig, configSummary } from \"./config/index.js\";\nimport { StorageOrchestrator } from \"./storage/orchestrator.js\";\nimport { createApp } from \"./api/router.js\";\n\n// ── Server Entry Point ──────────────────────────────────────────────────\n\nexport async function createServer(configPath?: string) {\n const config = await loadConfig(configPath);\n const orchestrator = new StorageOrchestrator(config);\n await orchestrator.init();\n\n const app = createApp(orchestrator, config);\n\n return { app, orchestrator, config };\n}\n\n// ── Main ────────────────────────────────────────────────────────────────\n\nasync function main() {\n console.log(\"┌──────────────────────────────────────────┐\");\n console.log(\"│ openclaw-memory service v0.1.0 │\");\n console.log(\"│ Triple-Layer Memory System │\");\n console.log(\"└──────────────────────────────────────────┘\");\n\n const { app, orchestrator, config } = await createServer();\n\n console.log(\"[config]\");\n console.log(configSummary(config).split(\"\\n\").map((l) => ` ${l}`).join(\"\\n\"));\n\n app.listen(config.port);\n console.log(`[server] Listening on http://${config.host}:${config.port}`);\n console.log(`[server] Health check: http://localhost:${config.port}/api/health`);\n\n const shutdown = async () => {\n console.log(\"\\n[server] Shutting down...\");\n await orchestrator.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\n// Run if executed directly (works in both Bun and Node ESM)\nfunction isMainModule(): boolean {\n try {\n // Bun runtime\n if (typeof globalThis.Bun !== \"undefined\") {\n const bun = globalThis.Bun as { main?: string };\n return bun.main === fileURLToPath(import.meta.url);\n }\n // Node.js\n if (process.argv[1]) {\n return resolve(process.argv[1]) === resolve(fileURLToPath(import.meta.url));\n }\n return false;\n } catch {\n return false;\n }\n}\n\nif (isMainModule()) {\n main().catch((error) => {\n console.error(\"[fatal]\", error);\n process.exit(1);\n });\n}\n","import { Elysia } from \"elysia\";\nimport { cors } from \"@elysiajs/cors\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport type { StorageOrchestrator } from \"../storage/orchestrator.js\";\nimport { AuthError, MemoryError, NotFoundError, ValidationError } from \"../core/errors.js\";\nimport { memoriesRoutes } from \"./memories.js\";\nimport { searchRoutes } from \"./search.js\";\nimport { conversationRoutes } from \"./conversations.js\";\nimport { entityRoutes } from \"./entities.js\";\nimport { adminRoutes } from \"./admin.js\";\n\n// ── App Router ──────────────────────────────────────────────────────────\n\nexport function createApp(orchestrator: StorageOrchestrator, config: ResolvedConfig) {\n const app = new Elysia()\n .use(cors())\n\n // ── Auth Middleware ────────────────────────────────────────────────\n .derive(({ headers, set, path }) => {\n // Skip auth for health check\n if (path === \"/api/health\") return {};\n\n // Skip auth if disabled\n if (!config.auth.enabled || !config.auth.token) return {};\n\n const authHeader = headers.authorization;\n if (!authHeader || !authHeader.startsWith(\"Bearer \")) {\n set.status = 401;\n throw new AuthError(\"Missing or invalid Authorization header\");\n }\n\n const token = authHeader.slice(7);\n if (token !== config.auth.token) {\n set.status = 403;\n throw new AuthError(\"Invalid token\");\n }\n\n return {};\n })\n\n // ── Error Handler ─────────────────────────────────────────────────\n .onError(({ code, error, set }) => {\n // Handle AuthError\n if (error instanceof AuthError) {\n const status = error.message.includes(\"Invalid token\") ? 403 : 401;\n set.status = status;\n return { error: error.message, code: error.code };\n }\n\n // Handle other custom errors\n if (error instanceof NotFoundError) {\n set.status = 404;\n return { error: error.message, code: error.code };\n }\n\n if (error instanceof ValidationError) {\n set.status = 400;\n return { error: error.message, code: error.code, details: error.details };\n }\n\n if (error instanceof MemoryError) {\n set.status = 500;\n return { error: error.message, code: error.code };\n }\n\n // Elysia validation errors\n if (code === \"VALIDATION\") {\n const msg = error && \"message\" in error ? (error as Error).message : String(error);\n set.status = 400;\n return { error: \"Validation error\", details: msg };\n }\n\n // Unknown errors\n const msg = error instanceof Error ? error.stack || error.message : String(error);\n console.error(`[api] Unhandled error: ${msg}`);\n set.status = 500;\n return { error: \"Internal server error\" };\n })\n\n // ── Mount Routes ──────────────────────────────────────────────────\n .use(memoriesRoutes(orchestrator))\n .use(searchRoutes(orchestrator))\n .use(conversationRoutes(orchestrator, config))\n .use(entityRoutes(orchestrator))\n .use(adminRoutes(orchestrator));\n\n return app;\n}\n","import { Elysia, t } from \"elysia\";\nimport type { StorageOrchestrator } from \"../storage/orchestrator.js\";\nimport type { CreateMemoryRequest, UpdateMemoryRequest, MemoryScope, MemorySource } from \"../core/types.js\";\n\n// ── Memory CRUD Routes ──────────────────────────────────────────────────\n\nexport function memoriesRoutes(orchestrator: StorageOrchestrator) {\n return new Elysia({ prefix: \"/api/memories\" })\n // POST /api/memories — Create a new memory\n .post(\n \"/\",\n async ({ body, set }) => {\n try {\n const result = await orchestrator.createMemory(body as CreateMemoryRequest);\n set.status = 201;\n return result;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to create memory\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.String(),\n scope: t.Union([\n t.Literal(\"user\"),\n t.Literal(\"agent\"),\n t.Literal(\"global\"),\n t.Literal(\"project\"),\n t.Literal(\"session\"),\n ]),\n subject_id: t.Optional(t.Nullable(t.String())),\n content: t.String(),\n tags: t.Optional(t.Array(t.String())),\n source: t.Optional(\n t.Union([\n t.Literal(\"explicit\"),\n t.Literal(\"derived\"),\n t.Literal(\"observation\"),\n t.Literal(\"conversation_summary\"),\n t.Literal(\"entity_extraction\"),\n t.Literal(\"daily_digest\"),\n t.Literal(\"migration\"),\n ])\n ),\n created_by: t.Optional(t.Nullable(t.String())),\n extract_entities: t.Optional(t.Boolean()),\n expires_at: t.Optional(t.Nullable(t.String())),\n }),\n }\n )\n\n // GET /api/memories/:id — Get a memory by ID\n .get(\"/:id\", ({ params, set }) => {\n const memory = orchestrator.sqlite.getMemory(params.id);\n if (!memory) {\n set.status = 404;\n return { error: \"Memory not found\" };\n }\n return memory;\n })\n\n // PUT /api/memories/:id — Update a memory\n .put(\n \"/:id\",\n async ({ params, body, set }) => {\n try {\n const result = await orchestrator.updateMemory(\n params.id,\n body as UpdateMemoryRequest\n );\n if (!result) {\n set.status = 404;\n return { error: \"Memory not found\" };\n }\n return result;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to update memory\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n content: t.Optional(t.String()),\n tags: t.Optional(t.Array(t.String())),\n scope: t.Optional(\n t.Union([\n t.Literal(\"user\"),\n t.Literal(\"agent\"),\n t.Literal(\"global\"),\n t.Literal(\"project\"),\n t.Literal(\"session\"),\n ])\n ),\n subject_id: t.Optional(t.Nullable(t.String())),\n expires_at: t.Optional(t.Nullable(t.String())),\n extract_entities: t.Optional(t.Boolean()),\n }),\n }\n )\n\n // DELETE /api/memories/:id — Delete a memory\n .delete(\"/:id\", async ({ params, set }) => {\n try {\n const deleted = await orchestrator.deleteMemory(params.id);\n if (!deleted) {\n set.status = 404;\n return { error: \"Memory not found\" };\n }\n return { deleted: true, id: params.id };\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to delete memory\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n })\n\n // GET /api/memories — List memories with filters\n .get(\"/\", ({ query }) => {\n const memories = orchestrator.sqlite.listMemories({\n agent_id: query.agent_id as string | undefined,\n scope: query.scope as MemoryScope | undefined,\n subject_id: query.subject_id as string | undefined,\n source: query.source as MemorySource | undefined,\n tags: query.tags as string | undefined,\n limit: query.limit ? parseInt(String(query.limit), 10) : undefined,\n offset: query.offset ? parseInt(String(query.offset), 10) : undefined,\n order: (query.order as \"asc\" | \"desc\") || \"desc\",\n });\n return { memories, count: memories.length };\n });\n}\n","import { Elysia, t } from \"elysia\";\nimport { SearchEngine } from \"../search/engine.js\";\nimport type { StorageOrchestrator } from \"../storage/orchestrator.js\";\nimport type { SearchRequest } from \"../core/types.js\";\n\n// ── Search Routes ───────────────────────────────────────────────────────\n\nexport function searchRoutes(orchestrator: StorageOrchestrator) {\n const searchEngine = new SearchEngine(orchestrator);\n\n return new Elysia({ prefix: \"/api/search\" })\n // POST /api/search — Smart search (auto-selects layers)\n .post(\n \"/\",\n async ({ body, set }) => {\n try {\n const req = body as SearchRequest;\n if (!req.agent_id) req.cross_agent = true;\n return await searchEngine.search(req);\n } catch (error) {\n set.status = 500;\n return {\n error: \"Search failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.Optional(t.String()),\n query: t.String(),\n scopes: t.Optional(\n t.Array(\n t.Union([\n t.Literal(\"user\"),\n t.Literal(\"agent\"),\n t.Literal(\"global\"),\n t.Literal(\"project\"),\n t.Literal(\"session\"),\n ])\n )\n ),\n subject_id: t.Optional(t.Nullable(t.String())),\n limit: t.Optional(t.Number()),\n include_graph: t.Optional(t.Boolean()),\n cross_agent: t.Optional(t.Boolean()),\n strategy: t.Optional(\n t.Union([\n t.Literal(\"auto\"),\n t.Literal(\"semantic\"),\n t.Literal(\"fulltext\"),\n t.Literal(\"graph\"),\n t.Literal(\"all\"),\n ])\n ),\n }),\n }\n )\n\n // POST /api/search/semantic — Force Qdrant semantic search\n .post(\n \"/semantic\",\n async ({ body, set }) => {\n try {\n return await searchEngine.search({\n ...(body as SearchRequest),\n strategy: \"semantic\",\n });\n } catch (error) {\n set.status = 500;\n return {\n error: \"Semantic search failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.Optional(t.String()),\n query: t.String(),\n scopes: t.Optional(\n t.Array(\n t.Union([\n t.Literal(\"user\"),\n t.Literal(\"agent\"),\n t.Literal(\"global\"),\n t.Literal(\"project\"),\n t.Literal(\"session\"),\n ])\n )\n ),\n subject_id: t.Optional(t.Nullable(t.String())),\n limit: t.Optional(t.Number()),\n cross_agent: t.Optional(t.Boolean()),\n }),\n }\n )\n\n // POST /api/search/graph — Force AGE graph traversal\n .post(\n \"/graph\",\n async ({ body, set }) => {\n try {\n return await searchEngine.search({\n ...(body as SearchRequest),\n strategy: \"graph\",\n include_graph: true,\n });\n } catch (error) {\n set.status = 500;\n return {\n error: \"Graph search failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.Optional(t.String()),\n query: t.String(),\n scopes: t.Optional(\n t.Array(\n t.Union([\n t.Literal(\"user\"),\n t.Literal(\"agent\"),\n t.Literal(\"global\"),\n t.Literal(\"project\"),\n t.Literal(\"session\"),\n ])\n )\n ),\n subject_id: t.Optional(t.Nullable(t.String())),\n limit: t.Optional(t.Number()),\n }),\n }\n )\n\n // POST /api/search/fulltext — Force SQLite FTS search\n .post(\n \"/fulltext\",\n async ({ body, set }) => {\n try {\n return await searchEngine.search({\n ...(body as SearchRequest),\n strategy: \"fulltext\",\n include_graph: false,\n });\n } catch (error) {\n set.status = 500;\n return {\n error: \"Fulltext search failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.Optional(t.String()),\n query: t.String(),\n scopes: t.Optional(t.Array(t.String())),\n subject_id: t.Optional(t.Nullable(t.String())),\n limit: t.Optional(t.Number()),\n }),\n }\n );\n}\n","import { Elysia, t } from \"elysia\";\nimport type { StorageOrchestrator } from \"../storage/orchestrator.js\";\nimport type { ResolvedConfig } from \"../config/index.js\";\nimport { ConversationSummarizer } from \"../extraction/summarizer.js\";\nimport type { ConversationLogEntry, CreateMemoryRequest, SummarizeResponse } from \"../core/types.js\";\n\n// ── Conversation Routes ─────────────────────────────────────────────────\n\nexport function conversationRoutes(\n orchestrator: StorageOrchestrator,\n config: ResolvedConfig\n) {\n // Summarizer is only available if extraction config is present\n const summarizer = config.extraction\n ? new ConversationSummarizer({\n apiKey: config.extraction.apiKey,\n baseUrl: config.extraction.baseUrl,\n model: config.extraction.model,\n })\n : null;\n\n return new Elysia({ prefix: \"/api/conversations\" })\n // POST /api/conversations/log — Append conversation entry\n .post(\n \"/log\",\n ({ body, set }) => {\n try {\n orchestrator.sqlite.appendConversationLog(body as ConversationLogEntry);\n set.status = 201;\n return { ok: true };\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to append conversation log\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.String(),\n session_id: t.String(),\n user_id: t.String(),\n channel: t.String(),\n role: t.Union([\n t.Literal(\"user\"),\n t.Literal(\"assistant\"),\n t.Literal(\"system\"),\n ]),\n content: t.String(),\n timestamp: t.String(),\n }),\n }\n )\n\n // POST /api/conversations/summarize — Summarize a session\n .post(\n \"/summarize\",\n async ({ body, set }) => {\n if (!summarizer) {\n set.status = 501;\n return { error: \"Summarization not available — extraction config required\" };\n }\n\n try {\n const { agent_id, session_id, user_id, channel, messages } = body;\n\n const summary = await summarizer.summarize(messages);\n if (!summary) {\n set.status = 422;\n return { error: \"Failed to generate summary\" };\n }\n\n const memoryReq: CreateMemoryRequest = {\n agent_id,\n scope: \"session\",\n subject_id: user_id,\n content: summary,\n tags: [\"conversation_summary\", channel, `session:${session_id}`],\n source: \"conversation_summary\",\n created_by: agent_id,\n extract_entities: true,\n };\n\n const result = await orchestrator.createMemory(memoryReq);\n\n const response: SummarizeResponse = {\n memory_id: result.id,\n summary,\n entities_extracted: result.entities,\n relationships_created: 0,\n };\n\n set.status = 201;\n return response;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Summarization failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n agent_id: t.String(),\n session_id: t.String(),\n user_id: t.String(),\n channel: t.String(),\n messages: t.Array(\n t.Object({\n role: t.Union([\n t.Literal(\"user\"),\n t.Literal(\"assistant\"),\n t.Literal(\"system\"),\n ]),\n content: t.String(),\n timestamp: t.String(),\n })\n ),\n reason: t.Optional(t.String()),\n }),\n }\n );\n}\n","import { Elysia, t } from \"elysia\";\nimport type { StorageOrchestrator } from \"../storage/orchestrator.js\";\n\n// ── Entity Routes ───────────────────────────────────────────────────────\n\nexport function entityRoutes(orchestrator: StorageOrchestrator) {\n return new Elysia({ prefix: \"/api/entities\" })\n // GET /api/entities/:type — List entities by type\n .get(\"/:type\", async ({ params, query, set }) => {\n if (!orchestrator.age) {\n set.status = 501;\n return { error: \"Graph layer not available — requires Full tier\" };\n }\n\n try {\n const entities = await orchestrator.age.listEntities(\n params.type,\n query.agent_id as string | undefined,\n query.limit ? parseInt(String(query.limit), 10) : 50\n );\n return { entities, count: entities.length };\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to list entities\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n })\n\n // GET /api/entities/:type/:id — Get entity with relationships\n .get(\"/:type/:id\", async ({ params, set }) => {\n if (!orchestrator.age) {\n set.status = 501;\n return { error: \"Graph layer not available — requires Full tier\" };\n }\n\n try {\n const result = await orchestrator.age.getEntityWithRelationships(\n params.type,\n params.id\n );\n if (!result.entity) {\n set.status = 404;\n return { error: \"Entity not found\" };\n }\n return result;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to get entity\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n })\n\n // GET /api/entities/:type/:id/related — Get related entities\n .get(\"/:type/:id/related\", async ({ params, query, set }) => {\n if (!orchestrator.age) {\n set.status = 501;\n return { error: \"Graph layer not available — requires Full tier\" };\n }\n\n try {\n const depth = query.depth ? parseInt(String(query.depth), 10) : 2;\n const related = await orchestrator.age.getRelatedEntities(\n params.id,\n depth\n );\n return { related, count: related.length };\n } catch (error) {\n set.status = 500;\n return {\n error: \"Failed to get related entities\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n })\n\n // POST /api/entities/extract — Manually trigger entity extraction\n .post(\n \"/extract\",\n async ({ body, set }) => {\n if (!orchestrator.entityExtractor) {\n set.status = 501;\n return { error: \"Entity extraction not available — requires extraction config\" };\n }\n\n try {\n const result = await orchestrator.entityExtractor.extract(body.text);\n return result;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Entity extraction failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n text: t.String(),\n }),\n }\n );\n}\n","import { Elysia, t } from \"elysia\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { StorageOrchestrator } from \"../storage/orchestrator.js\";\nimport type { CreateMemoryRequest, MigrateMarkdownRequest } from \"../core/types.js\";\n\n// ── Admin Routes ────────────────────────────────────────────────────────\n\nexport function adminRoutes(orchestrator: StorageOrchestrator) {\n return new Elysia()\n // GET /api/health — Health check\n .get(\"/api/health\", async () => {\n return await orchestrator.healthCheck();\n })\n\n // POST /api/sync/retry — Retry failed L2/L3 syncs\n .post(\"/api/sync/retry\", async ({ set }) => {\n try {\n const result = await orchestrator.retrySyncQueue();\n return result;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Sync retry failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n })\n\n // GET /api/sync/queue — View pending sync queue\n .get(\"/api/sync/queue\", () => {\n const items = orchestrator.sqlite.getSyncQueue(100);\n return { items, count: items.length };\n })\n\n // POST /api/admin/migrate-markdown — Migrate markdown files\n .post(\n \"/api/admin/migrate-markdown\",\n async ({ body, set }) => {\n try {\n const results = await migrateMarkdownFiles(orchestrator, body);\n return results;\n } catch (error) {\n set.status = 500;\n return {\n error: \"Migration failed\",\n details: error instanceof Error ? error.message : String(error),\n };\n }\n },\n {\n body: t.Object({\n markdown_paths: t.Array(t.String()),\n agent_id: t.String(),\n dry_run: t.Optional(t.Boolean()),\n }),\n }\n )\n\n // POST /api/admin/daily-digest — Trigger daily digest\n .post(\"/api/admin/daily-digest\", async ({ set }) => {\n set.status = 501;\n return { error: \"Not yet implemented\" };\n });\n}\n\n// ── Markdown Migration ──────────────────────────────────────────────────\n\nasync function migrateMarkdownFiles(\n orchestrator: StorageOrchestrator,\n request: MigrateMarkdownRequest\n): Promise<{\n migrated: number;\n skipped: number;\n errors: string[];\n memories: Array<{ id: string; content_preview: string }>;\n}> {\n const { markdown_paths, agent_id, dry_run } = request;\n let migrated = 0;\n let skipped = 0;\n const errors: string[] = [];\n const memories: Array<{ id: string; content_preview: string }> = [];\n\n for (const filePath of markdown_paths) {\n try {\n if (!fs.existsSync(filePath)) {\n errors.push(`File not found: ${filePath}`);\n skipped++;\n continue;\n }\n\n const content = fs.readFileSync(filePath, \"utf-8\");\n const fileName = path.basename(filePath, \".md\");\n const sections = parseMarkdownSections(content);\n\n for (const section of sections) {\n if (section.content.trim().length < 10) {\n skipped++;\n continue;\n }\n\n if (dry_run) {\n memories.push({\n id: \"(dry-run)\",\n content_preview: section.content.slice(0, 100),\n });\n migrated++;\n continue;\n }\n\n const scope = inferScope(section.heading, fileName);\n const source = inferSource(fileName);\n const tags = inferTags(section.heading, fileName);\n\n const req: CreateMemoryRequest = {\n agent_id,\n scope,\n subject_id: null,\n content: section.content.trim(),\n tags,\n source: source || \"migration\",\n created_by: \"migration\",\n extract_entities: true,\n };\n\n try {\n const result = await orchestrator.createMemory(req);\n memories.push({\n id: result.id,\n content_preview: section.content.slice(0, 100),\n });\n migrated++;\n } catch (error) {\n errors.push(\n `Failed to migrate section \"${section.heading}\": ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n } catch (error) {\n errors.push(\n `Failed to process ${filePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n return { migrated, skipped, errors, memories };\n}\n\n// ── Markdown Parsing Helpers ────────────────────────────────────────────\n\ninterface MarkdownSection {\n heading: string;\n content: string;\n level: number;\n}\n\nfunction parseMarkdownSections(markdown: string): MarkdownSection[] {\n const lines = markdown.split(\"\\n\");\n const sections: MarkdownSection[] = [];\n let currentHeading = \"root\";\n let currentLevel = 0;\n let currentContent: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,3})\\s+(.+)/);\n if (headingMatch) {\n if (currentContent.length > 0) {\n sections.push({\n heading: currentHeading,\n content: currentContent.join(\"\\n\").trim(),\n level: currentLevel,\n });\n }\n currentHeading = headingMatch[2].trim();\n currentLevel = headingMatch[1].length;\n currentContent = [];\n } else {\n currentContent.push(line);\n }\n }\n\n if (currentContent.length > 0) {\n sections.push({\n heading: currentHeading,\n content: currentContent.join(\"\\n\").trim(),\n level: currentLevel,\n });\n }\n\n return sections;\n}\n\nfunction inferScope(heading: string, fileName: string): CreateMemoryRequest[\"scope\"] {\n const h = heading.toLowerCase();\n const f = fileName.toLowerCase();\n\n if (h.includes(\"about\") || h.includes(\"personal\")) return \"user\";\n if (h.includes(\"project\")) return \"project\";\n if (h.includes(\"agent\")) return \"agent\";\n if (h.includes(\"session\") || f.match(/^\\d{4}-\\d{2}-\\d{2}/)) return \"session\";\n return \"global\";\n}\n\nfunction inferSource(fileName: string): CreateMemoryRequest[\"source\"] | null {\n if (fileName.match(/^\\d{4}-\\d{2}-\\d{2}/)) return \"daily_digest\";\n return \"migration\";\n}\n\nfunction inferTags(heading: string, fileName: string): string[] {\n const tags: string[] = [\"migration\"];\n if (fileName.match(/^\\d{4}-\\d{2}-\\d{2}/)) {\n tags.push(\"daily\", fileName);\n }\n if (heading !== \"root\") {\n tags.push(heading.toLowerCase().replace(/[^a-z0-9]+/g, \"-\"));\n }\n return tags;\n}\n"],"mappings":"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","names":["Elysia","Elysia","t","Elysia","t","Elysia","t","Elysia","t","Elysia","t","Elysia","t","Elysia","path","msg"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/robertpop/work/personal/openclaw-memory/dist/chunk-VXULEX3A.cjs","../src/core/memory-service.ts"],"names":[],"mappings":"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","file":"/Users/robertpop/work/personal/openclaw-memory/dist/chunk-VXULEX3A.cjs","sourcesContent":[null,"import { loadConfig, type Config, type ResolvedConfig } from \"../config/index.js\";\nimport { StorageOrchestrator } from \"../storage/orchestrator.js\";\nimport { SearchEngine } from \"../search/engine.js\";\nimport type {\n Tier,\n Memory,\n StoreParams,\n StoreResult,\n SearchParams,\n UpdateParams,\n ListParams,\n SearchResponse,\n HealthResponse,\n ConversationLogEntry,\n SummarizeResponse,\n CreateMemoryRequest,\n} from \"./types.js\";\nimport { ConversationSummarizer } from \"../extraction/summarizer.js\";\n\n// ── MemoryService — Programmatic API ────────────────────────────────────\n\nexport class MemoryService {\n private orchestrator!: StorageOrchestrator;\n private searchEngine!: SearchEngine;\n private summarizer: ConversationSummarizer | null = null;\n private config!: ResolvedConfig;\n private initialized = false;\n\n private pendingConfig: Config | string | undefined;\n\n constructor(config?: Config | string) {\n this.pendingConfig = config;\n }\n\n async init(): Promise<void> {\n if (this.initialized) return;\n\n // Resolve config\n if (typeof this.pendingConfig === \"string\") {\n this.config = await loadConfig(this.pendingConfig);\n } else if (this.pendingConfig) {\n this.config = await loadConfig();\n // Override with passed config (simplified — in production you'd deep merge)\n if (this.pendingConfig.tier) this.config.tier = this.pendingConfig.tier;\n if (this.pendingConfig.port) this.config.port = this.pendingConfig.port;\n } else {\n this.config = await loadConfig();\n }\n\n // Initialize orchestrator\n this.orchestrator = new StorageOrchestrator(this.config);\n await this.orchestrator.init();\n\n // Initialize search engine\n this.searchEngine = new SearchEngine(this.orchestrator);\n\n // Initialize summarizer if extraction config available\n if (this.config.extraction) {\n this.summarizer = new ConversationSummarizer({\n apiKey: this.config.extraction.apiKey,\n baseUrl: this.config.extraction.baseUrl,\n model: this.config.extraction.model,\n });\n }\n\n this.initialized = true;\n }\n\n async close(): Promise<void> {\n if (!this.initialized) return;\n await this.orchestrator.close();\n this.initialized = false;\n }\n\n // ── Memory CRUD ─────────────────────────────────────────────────────\n\n async store(params: StoreParams): Promise<StoreResult> {\n this.ensureInit();\n const result = await this.orchestrator.createMemory({\n agent_id: params.agentId,\n scope: params.scope,\n subject_id: params.subjectId ?? null,\n content: params.content,\n tags: params.tags,\n source: params.source,\n created_by: params.createdBy ?? null,\n extract_entities: params.extractEntities,\n expires_at: params.expiresAt ?? null,\n });\n\n return {\n id: result.id,\n agentId: result.agent_id,\n scope: result.scope,\n content: result.content,\n entities: result.entities,\n createdAt: result.created_at,\n syncStatus: result.sync_status,\n };\n }\n\n async get(id: string): Promise<Memory | null> {\n this.ensureInit();\n return this.orchestrator.sqlite.getMemory(id);\n }\n\n async update(id: string, params: UpdateParams): Promise<Memory | null> {\n this.ensureInit();\n const result = await this.orchestrator.updateMemory(id, {\n content: params.content,\n tags: params.tags,\n scope: params.scope,\n subject_id: params.subjectId,\n expires_at: params.expiresAt,\n extract_entities: params.extractEntities,\n });\n if (!result) return null;\n return this.orchestrator.sqlite.getMemory(id);\n }\n\n async delete(id: string): Promise<boolean> {\n this.ensureInit();\n return this.orchestrator.deleteMemory(id);\n }\n\n async list(params?: ListParams): Promise<Memory[]> {\n this.ensureInit();\n return this.orchestrator.sqlite.listMemories({\n agent_id: params?.agentId,\n scope: params?.scope,\n subject_id: params?.subjectId,\n source: params?.source,\n tags: params?.tags,\n limit: params?.limit,\n offset: params?.offset,\n order: params?.order,\n });\n }\n\n // ── Search ──────────────────────────────────────────────────────────\n\n async search(params: SearchParams): Promise<SearchResponse> {\n this.ensureInit();\n return this.searchEngine.search({\n agent_id: params.agentId,\n query: params.query,\n scopes: params.scopes,\n subject_id: params.subjectId,\n limit: params.limit,\n include_graph: params.includeGraph,\n cross_agent: params.crossAgent,\n strategy: params.strategy,\n });\n }\n\n async searchSemantic(params: SearchParams): Promise<SearchResponse> {\n return this.search({ ...params, strategy: \"semantic\" });\n }\n\n async searchFulltext(params: SearchParams): Promise<SearchResponse> {\n return this.search({ ...params, strategy: \"fulltext\" });\n }\n\n async searchGraph(params: SearchParams): Promise<SearchResponse> {\n return this.search({ ...params, strategy: \"graph\" });\n }\n\n // ── Conversations ───────────────────────────────────────────────────\n\n async logConversation(entry: ConversationLogEntry): Promise<void> {\n this.ensureInit();\n this.orchestrator.sqlite.appendConversationLog(entry);\n }\n\n async summarizeConversation(params: {\n agentId: string;\n sessionId: string;\n userId: string;\n channel: string;\n messages: Array<{ role: \"user\" | \"assistant\" | \"system\"; content: string; timestamp: string }>;\n }): Promise<SummarizeResponse | null> {\n this.ensureInit();\n\n if (!this.summarizer) return null;\n\n const summary = await this.summarizer.summarize(params.messages);\n if (!summary) return null;\n\n const result = await this.orchestrator.createMemory({\n agent_id: params.agentId,\n scope: \"session\",\n subject_id: params.userId,\n content: summary,\n tags: [\"conversation_summary\", params.channel, `session:${params.sessionId}`],\n source: \"conversation_summary\",\n created_by: params.agentId,\n extract_entities: true,\n });\n\n return {\n memory_id: result.id,\n summary,\n entities_extracted: result.entities,\n relationships_created: 0,\n };\n }\n\n // ── Entities ────────────────────────────────────────────────────────\n\n async getEntity(type: string, id: string): Promise<Record<string, unknown> | null> {\n this.ensureInit();\n if (!this.orchestrator.age) return null;\n const result = await this.orchestrator.age.getEntityWithRelationships(type, id);\n return result.entity;\n }\n\n async listEntities(type?: string): Promise<Array<Record<string, unknown>>> {\n this.ensureInit();\n if (!this.orchestrator.age) return [];\n return this.orchestrator.age.listEntities(type);\n }\n\n async getRelatedEntities(entityId: string, depth?: number): Promise<Array<Record<string, unknown>>> {\n this.ensureInit();\n if (!this.orchestrator.age) return [];\n const results = await this.orchestrator.age.getRelatedEntities(entityId, depth);\n return results.map((r) => r.entity);\n }\n\n // ── Admin ───────────────────────────────────────────────────────────\n\n async health(): Promise<HealthResponse> {\n this.ensureInit();\n return this.orchestrator.healthCheck();\n }\n\n async retrySyncQueue(): Promise<{ processed: number; succeeded: number; failed: number }> {\n this.ensureInit();\n return this.orchestrator.retrySyncQueue();\n }\n\n async migrateMarkdown(paths: string[], agentId: string): Promise<{\n migrated: number;\n errors: string[];\n }> {\n this.ensureInit();\n // Use the admin migration logic through the orchestrator directly\n const fs = await import(\"node:fs\");\n const pathLib = await import(\"node:path\");\n let migrated = 0;\n const errors: string[] = [];\n\n for (const filePath of paths) {\n try {\n if (!fs.existsSync(filePath)) {\n errors.push(`File not found: ${filePath}`);\n continue;\n }\n const content = fs.readFileSync(filePath, \"utf-8\");\n const req: CreateMemoryRequest = {\n agent_id: agentId,\n scope: \"global\",\n content: content.trim(),\n source: \"migration\",\n created_by: \"migration\",\n extract_entities: true,\n };\n await this.orchestrator.createMemory(req);\n migrated++;\n } catch (error) {\n errors.push(`${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return { migrated, errors };\n }\n\n // ── Config ──────────────────────────────────────────────────────────\n\n get tier(): Tier {\n return this.config.tier;\n }\n\n get resolvedConfig(): ResolvedConfig {\n return this.config;\n }\n\n // ── Internal: expose orchestrator for server mode ───────────────────\n\n getOrchestrator(): StorageOrchestrator {\n this.ensureInit();\n return this.orchestrator;\n }\n\n // ── Helpers ─────────────────────────────────────────────────────────\n\n private ensureInit(): void {\n if (!this.initialized) {\n throw new Error(\"MemoryService not initialized. Call .init() first.\");\n }\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/robertpop/work/personal/openclaw-memory/dist/chunk-ZY2C2CJQ.cjs","../src/config/index.ts","../src/core/errors.ts","../src/config/defaults.ts"],"names":[],"mappings":"AAAA;ACAA,wEAAiB;AACjB,gEAAe;AACf,gEAAe;ADEf;AACA;AEHO,IAAM,YAAA,EAAN,MAAA,QAA0B,MAAM;AAAA,EACrC,WAAA,CAAY,OAAA,EAAiC,IAAA,EAAc;AACzD,IAAA,KAAA,CAAM,OAAO,CAAA;AAD8B,IAAA,IAAA,CAAA,KAAA,EAAA,IAAA;AAE3C,IAAA,IAAA,CAAK,KAAA,EAAO,aAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,YAAA,EAAN,MAAA,QAA0B,YAAY;AAAA,EAC3C,WAAA,CAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAA,EAAS,cAAc,CAAA;AAC7B,IAAA,IAAA,CAAK,KAAA,EAAO,aAAA;AAAA,EACd;AACF,CAAA;AASO,IAAM,gBAAA,EAAN,MAAA,QAA8B,YAAY;AAAA,EAC/C,WAAA,CAAY,OAAA,EAAiC,OAAA,EAAmB;AAC9D,IAAA,KAAA,CAAM,OAAA,EAAS,kBAAkB,CAAA;AADU,IAAA,IAAA,CAAA,QAAA,EAAA,OAAA;AAE3C,IAAA,IAAA,CAAK,KAAA,EAAO,iBAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,cAAA,EAAN,MAAA,QAA4B,YAAY;AAAA,EAC7C,WAAA,CAAY,QAAA,EAAkB,EAAA,EAAY;AACxC,IAAA,KAAA,CAAM,CAAA,EAAA;AACD,IAAA;AACP,EAAA;AACF;AAEa;AACX,EAAA;AACQ,IAAA;AACD,IAAA;AACP,EAAA;AACF;AFJW;AACA;AGrCE;AACL,EAAA;AACA,EAAA;AACE,EAAA;AACA,IAAA;AACR,EAAA;AACQ,EAAA;AACN,IAAA;AACF,EAAA;AACK,EAAA;AACG,IAAA;AACC,IAAA;AACT,EAAA;AACA,EAAA;AACS,IAAA;AACP,IAAA;AACF,EAAA;AACA,EAAA;AACS,IAAA;AACP,IAAA;AACF,EAAA;AACM,EAAA;AACJ,IAAA;AACF,EAAA;AACF;AHuCW;AACA;ACtDF;AACD,EAAA;AACG,IAAA;AACT,EAAA;AACO,EAAA;AACT;AAIgB;AACP,EAAA;AACT;AAEgB;AACP,EAAA;AACT;AAEgB;AACP,EAAA;AACT;AAIS;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACP,EAAA;AACF;AAEA;AACQ,EAAA;AAEN,EAAA;AACS,IAAA;AACD,MAAA;AACF,QAAA;AACA,QAAA;AACF,MAAA;AAEI,MAAA;AACF,QAAA;AACA,QAAA;AACF,MAAA;AAEA,MAAA;AACF,IAAA;AACF,EAAA;AAEO,EAAA;AACT;AAIS;AACD,EAAA;AAGF,EAAA;AACI,IAAA;AACC,IAAA;AACL,MAAA;AACA,MAAA;AACE,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACE,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACM,EAAA;AAER,EAAA;AAEM,EAAA;AAGA,EAAA;AACF,EAAA;AACK,IAAA;AACT,EAAA;AAGM,EAAA;AACI,EAAA;AAEJ,EAAA;AACI,EAAA;AAGJ,EAAA;AACF,EAAA;AACK,IAAA;AACT,EAAA;AAGM,EAAA;AACF,EAAA;AACK,IAAA;AACT,EAAA;AAGM,EAAA;AACF,EAAA;AACK,IAAA;AACA,MAAA;AACL,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAGM,EAAA;AACF,EAAA;AACK,IAAA;AACL,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAGM,EAAA;AACF,EAAA;AACK,IAAA;AACL,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAGM,EAAA;AACF,EAAA;AACK,IAAA;AACL,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEO,EAAA;AACT;AAIS;AACH,EAAA;AACA,EAAA;AACA,EAAA;AACG,EAAA;AACT;AAIA;AAEQ,EAAA;AAGA,EAAA;AAGA,EAAA;AACD,IAAA;AACA,IAAA;AAAA;AAEG,IAAA;AACN,IAAA;AACF,EAAA;AAEI,EAAA;AACK,IAAA;AACT,EAAA;AACI,EAAA;AACK,IAAA;AACT,EAAA;AACI,EAAA;AACK,IAAA;AACT,EAAA;AACI,EAAA;AACK,IAAA;AACT,EAAA;AAGM,EAAA;AAGA,EAAA;AAGF,EAAA;AACA,EAAA;AACF,IAAA;AACO,MAAA;AACL,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEI,EAAA;AACA,EAAA;AACG,IAAA;AACH,MAAA;AACF,IAAA;AACM,IAAA;AACJ,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEI,EAAA;AACA,EAAA;AACF,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEI,EAAA;AACA,EAAA;AACF,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEO,EAAA;AACL,IAAA;AACM,IAAA;AACA,IAAA;AACA,IAAA;AACJ,MAAA;AACA,MAAA;AACF,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACF;AAIgB;AACP,EAAA;AACT;AAIgB;AACR,EAAA;AACJ,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AAEI,EAAA;AACI,IAAA;AACR,EAAA;AACI,EAAA;AACI,IAAA;AACR,EAAA;AACI,EAAA;AACI,IAAA;AACR,EAAA;AACI,EAAA;AACI,IAAA;AACR,EAAA;AAEO,EAAA;AACT;ADZW;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/robertpop/work/personal/openclaw-memory/dist/chunk-ZY2C2CJQ.cjs","sourcesContent":[null,"import path from \"node:path\";\nimport os from \"node:os\";\nimport fs from \"node:fs\";\nimport type { Tier } from \"../core/types.js\";\nimport { ConfigError } from \"../core/errors.js\";\nimport { DEFAULTS } from \"./defaults.js\";\nimport type { Config, ResolvedConfig, QdrantConfig, AgeConfig, EmbeddingConfig, ExtractionConfig } from \"./schema.js\";\n\nexport type { Config, ResolvedConfig } from \"./schema.js\";\n\n// ── Helper: expand ~ to home dir ────────────────────────────────────────\n\nfunction expandHome(p: string): string {\n if (p.startsWith(\"~/\") || p === \"~\") {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\n// ── Data Directory ──────────────────────────────────────────────────────\n\nexport function getDataDir(): string {\n return process.env.OPENCLAW_MEMORY_DATA_DIR || path.join(os.homedir(), \".openclaw-memory\");\n}\n\nexport function getDefaultSqlitePath(): string {\n return path.join(getDataDir(), \"memory.sqlite\");\n}\n\nexport function getPidFilePath(): string {\n return path.join(getDataDir(), \"server.pid\");\n}\n\n// ── Config File Discovery ───────────────────────────────────────────────\n\nfunction getConfigSearchPaths(cwd: string): string[] {\n return [\n path.join(cwd, \"openclaw-memory.config.ts\"),\n path.join(cwd, \"openclaw-memory.config.js\"),\n path.join(cwd, \"openclaw-memory.config.json\"),\n path.join(getDataDir(), \"config.ts\"),\n path.join(getDataDir(), \"config.json\"),\n ];\n}\n\nasync function loadConfigFile(configPath?: string): Promise<Config | null> {\n const searchPaths = configPath ? [configPath] : getConfigSearchPaths(process.cwd());\n\n for (const p of searchPaths) {\n if (fs.existsSync(p)) {\n if (p.endsWith(\".json\")) {\n const content = fs.readFileSync(p, \"utf-8\");\n return JSON.parse(content) as Config;\n }\n // For .ts and .js files, try dynamic import\n try {\n const mod = await import(p);\n return (mod.default || mod) as Config;\n } catch {\n // Can't import .ts outside of Bun — skip\n }\n }\n }\n\n return null;\n}\n\n// ── Environment Variable Loading ────────────────────────────────────────\n\nfunction loadFromEnv(): Partial<Config> {\n const config: Partial<Config> = {};\n\n // Load .env file if dotenv is available\n try {\n const dotenvPath = path.join(process.cwd(), \".env\");\n if (fs.existsSync(dotenvPath)) {\n const envContent = fs.readFileSync(dotenvPath, \"utf-8\");\n for (const line of envContent.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const key = trimmed.slice(0, eqIdx).trim();\n const value = trimmed.slice(eqIdx + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n }\n } catch {\n // No .env file — that's fine\n }\n\n const env = process.env;\n\n // Tier\n const tier = env.OPENCLAW_MEMORY_TIER || env.MEMORY_TIER;\n if (tier && [\"lite\", \"standard\", \"full\"].includes(tier)) {\n config.tier = tier as Tier;\n }\n\n // Port/Host\n const port = env.OPENCLAW_MEMORY_PORT || env.PORT;\n if (port) config.port = parseInt(port, 10);\n\n const host = env.OPENCLAW_MEMORY_HOST;\n if (host) config.host = host;\n\n // Auth\n const authToken = env.OPENCLAW_MEMORY_AUTH__TOKEN || env.AUTH_TOKEN || env.MEMORY_TOKEN;\n if (authToken) {\n config.auth = { token: authToken, enabled: true };\n }\n\n // SQLite\n const sqlitePath = env.OPENCLAW_MEMORY_SQLITE__PATH || env.SQLITE_PATH;\n if (sqlitePath) {\n config.sqlite = { path: sqlitePath };\n }\n\n // Qdrant\n const qdrantUrl = env.OPENCLAW_MEMORY_QDRANT__URL || env.QDRANT_URL;\n if (qdrantUrl) {\n config.qdrant = {\n url: qdrantUrl,\n collection: env.OPENCLAW_MEMORY_QDRANT__COLLECTION || env.QDRANT_COLLECTION || DEFAULTS.qdrant.collection,\n apiKey: env.OPENCLAW_MEMORY_QDRANT__API_KEY,\n };\n }\n\n // AGE\n const ageHost = env.OPENCLAW_MEMORY_AGE__HOST || env.PGHOST;\n if (ageHost) {\n config.age = {\n host: ageHost,\n port: parseInt(env.OPENCLAW_MEMORY_AGE__PORT || env.PGPORT || String(DEFAULTS.age.port), 10),\n user: env.OPENCLAW_MEMORY_AGE__USER || env.PGUSER || \"\",\n password: env.OPENCLAW_MEMORY_AGE__PASSWORD || env.PGPASSWORD || \"\",\n database: env.OPENCLAW_MEMORY_AGE__DATABASE || env.PGDATABASE || \"\",\n graph: env.OPENCLAW_MEMORY_AGE__GRAPH || env.AGE_GRAPH || DEFAULTS.age.graph,\n };\n }\n\n // Embedding\n const embeddingApiKey = env.OPENCLAW_MEMORY_EMBEDDING__API_KEY || env.OPENROUTER_API_KEY || env.OPENAI_API_KEY;\n if (embeddingApiKey) {\n config.embedding = {\n apiKey: embeddingApiKey,\n baseUrl: env.OPENCLAW_MEMORY_EMBEDDING__BASE_URL || env.EMBEDDING_BASE_URL,\n model: env.OPENCLAW_MEMORY_EMBEDDING__MODEL || env.EMBEDDING_MODEL || DEFAULTS.embedding.model,\n dimensions: parseInt(env.OPENCLAW_MEMORY_EMBEDDING__DIMENSIONS || String(DEFAULTS.embedding.dimensions), 10),\n };\n }\n\n // Extraction\n const extractionApiKey = env.OPENCLAW_MEMORY_EXTRACTION__API_KEY || env.OPENROUTER_API_KEY || env.OPENAI_API_KEY;\n if (extractionApiKey) {\n config.extraction = {\n apiKey: extractionApiKey,\n baseUrl: env.OPENCLAW_MEMORY_EXTRACTION__BASE_URL || env.EXTRACTION_BASE_URL,\n model: env.OPENCLAW_MEMORY_EXTRACTION__MODEL || env.EXTRACTION_MODEL || DEFAULTS.extraction.model,\n enabled: env.OPENCLAW_MEMORY_EXTRACTION__ENABLED !== \"false\",\n };\n }\n\n return config;\n}\n\n// ── Tier Inference ──────────────────────────────────────────────────────\n\nfunction inferTier(config: Partial<Config>): Tier {\n if (config.tier) return config.tier;\n if (config.qdrant && config.age) return \"full\";\n if (config.qdrant) return \"standard\";\n return \"lite\";\n}\n\n// ── Config Resolution ───────────────────────────────────────────────────\n\nexport async function loadConfig(configPath?: string): Promise<ResolvedConfig> {\n // 1. Load from file\n const fileConfig = await loadConfigFile(configPath);\n\n // 2. Load from env\n const envConfig = loadFromEnv();\n\n // 3. Merge: file < env (env wins)\n const merged: Partial<Config> = {\n ...fileConfig,\n ...envConfig,\n // Deep merge nested objects\n auth: { ...fileConfig?.auth, ...envConfig.auth },\n sqlite: { ...fileConfig?.sqlite, ...envConfig.sqlite },\n };\n\n if (envConfig.qdrant || fileConfig?.qdrant) {\n merged.qdrant = { ...fileConfig?.qdrant, ...envConfig.qdrant } as Config[\"qdrant\"];\n }\n if (envConfig.age || fileConfig?.age) {\n merged.age = { ...fileConfig?.age, ...envConfig.age } as Config[\"age\"];\n }\n if (envConfig.embedding || fileConfig?.embedding) {\n merged.embedding = { ...fileConfig?.embedding, ...envConfig.embedding } as Config[\"embedding\"];\n }\n if (envConfig.extraction || fileConfig?.extraction) {\n merged.extraction = { ...fileConfig?.extraction, ...envConfig.extraction } as Config[\"extraction\"];\n }\n\n // 4. Infer tier\n const tier = inferTier(merged);\n\n // 5. Resolve defaults\n const sqlitePath = expandHome(merged.sqlite?.path || DEFAULTS.sqlite.path);\n\n // 6. Resolve optional layers based on tier\n let qdrant: QdrantConfig | null = null;\n if (tier !== \"lite\" && merged.qdrant?.url) {\n qdrant = {\n url: merged.qdrant.url,\n collection: merged.qdrant.collection || DEFAULTS.qdrant.collection,\n apiKey: merged.qdrant.apiKey,\n };\n }\n\n let age: AgeConfig | null = null;\n if (tier === \"full\" && merged.age?.host) {\n if (!merged.age.user || !merged.age.password || !merged.age.database) {\n throw new ConfigError(\"Full tier requires age.user, age.password, and age.database\");\n }\n age = {\n host: merged.age.host,\n port: merged.age.port || DEFAULTS.age.port,\n user: merged.age.user,\n password: merged.age.password,\n database: merged.age.database,\n graph: merged.age.graph || DEFAULTS.age.graph,\n };\n }\n\n let embedding: EmbeddingConfig | null = null;\n if (tier !== \"lite\" && merged.embedding?.apiKey) {\n embedding = {\n apiKey: merged.embedding.apiKey,\n baseUrl: merged.embedding.baseUrl,\n model: merged.embedding.model || DEFAULTS.embedding.model,\n dimensions: merged.embedding.dimensions || DEFAULTS.embedding.dimensions,\n };\n }\n\n let extraction: ExtractionConfig | null = null;\n if (tier !== \"lite\" && merged.extraction?.apiKey) {\n extraction = {\n apiKey: merged.extraction.apiKey,\n baseUrl: merged.extraction.baseUrl,\n model: merged.extraction.model || DEFAULTS.extraction.model,\n enabled: merged.extraction.enabled ?? DEFAULTS.extraction.enabled,\n };\n }\n\n return {\n tier,\n port: merged.port || DEFAULTS.port,\n host: merged.host || DEFAULTS.host,\n auth: {\n token: merged.auth?.token,\n enabled: merged.auth?.enabled ?? DEFAULTS.auth.enabled,\n },\n sqlite: { path: sqlitePath },\n qdrant,\n age,\n embedding,\n extraction,\n agents: merged.agents || fileConfig?.agents || [],\n };\n}\n\n// ── defineConfig helper for config files ────────────────────────────────\n\nexport function defineConfig(config: Config): Config {\n return config;\n}\n\n// ── Config summary (redacted) for logging ───────────────────────────────\n\nexport function configSummary(config: ResolvedConfig): string {\n const lines: string[] = [\n `Tier: ${config.tier}`,\n `Port: ${config.port}`,\n `Host: ${config.host}`,\n `SQLite: ${config.sqlite.path}`,\n `Auth: ${config.auth.enabled ? \"enabled\" : \"disabled\"}`,\n ];\n\n if (config.qdrant) {\n lines.push(`Qdrant: ${config.qdrant.url} (collection: ${config.qdrant.collection})`);\n }\n if (config.age) {\n lines.push(`AGE: ${config.age.host}:${config.age.port}/${config.age.database}`);\n }\n if (config.embedding) {\n lines.push(`Embedding: ${config.embedding.model}${config.embedding.baseUrl ? ` via ${config.embedding.baseUrl}` : \"\"}`);\n }\n if (config.extraction) {\n lines.push(`Extraction: ${config.extraction.model}${config.extraction.enabled ? \"\" : \" (disabled)\"}`);\n }\n\n return lines.join(\"\\n\");\n}\n","// ── Custom Error Classes ────────────────────────────────────────────────\n\nexport class MemoryError extends Error {\n constructor(message: string, public readonly code: string) {\n super(message);\n this.name = \"MemoryError\";\n }\n}\n\nexport class ConfigError extends MemoryError {\n constructor(message: string) {\n super(message, \"CONFIG_ERROR\");\n this.name = \"ConfigError\";\n }\n}\n\nexport class StorageError extends MemoryError {\n constructor(message: string, public readonly layer: \"sqlite\" | \"qdrant\" | \"age\") {\n super(message, \"STORAGE_ERROR\");\n this.name = \"StorageError\";\n }\n}\n\nexport class ValidationError extends MemoryError {\n constructor(message: string, public readonly details?: unknown) {\n super(message, \"VALIDATION_ERROR\");\n this.name = \"ValidationError\";\n }\n}\n\nexport class NotFoundError extends MemoryError {\n constructor(resource: string, id: string) {\n super(`${resource} not found: ${id}`, \"NOT_FOUND\");\n this.name = \"NotFoundError\";\n }\n}\n\nexport class AuthError extends MemoryError {\n constructor(message: string = \"Unauthorized\") {\n super(message, \"AUTH_ERROR\");\n this.name = \"AuthError\";\n }\n}\n","// ── Default Configuration Values ────────────────────────────────────────\n\nexport const DEFAULTS = {\n port: 7777,\n host: \"0.0.0.0\",\n sqlite: {\n path: \"~/.openclaw-memory/memory.sqlite\",\n },\n qdrant: {\n collection: \"openclaw_memories\",\n },\n age: {\n port: 5432,\n graph: \"agent_memory\",\n },\n embedding: {\n model: \"text-embedding-3-small\",\n dimensions: 1536,\n },\n extraction: {\n model: \"gpt-4o-mini\",\n enabled: true,\n },\n auth: {\n enabled: true,\n },\n} as const;\n"]}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
-
|
|
3
|
-
var _chunkVXULEX3Acjs = require('./chunk-VXULEX3A.cjs');
|
|
4
|
-
require('./chunk-CRPEAZ44.cjs');
|
|
5
|
-
require('./chunk-ZY2C2CJQ.cjs');
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
exports.MemoryService = _chunkVXULEX3Acjs.MemoryService;
|
|
9
|
-
//# sourceMappingURL=memory-service-6WDMF6KX.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/robertpop/work/personal/openclaw-memory/dist/memory-service-6WDMF6KX.cjs"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,wDAAC","file":"/Users/robertpop/work/personal/openclaw-memory/dist/memory-service-6WDMF6KX.cjs"}
|
|
File without changes
|
|
File without changes
|