@poprobertdaniel/openclaw-memory 0.1.0 → 0.1.2
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-NHFPLDZK.js → chunk-5SZWJKD5.js} +3 -3
- package/dist/{chunk-CRPEAZ44.cjs → chunk-HPGHPKK3.cjs} +3 -2
- package/dist/chunk-HPGHPKK3.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-VXULEX3A.cjs → chunk-L2KRIMDA.cjs} +9 -9
- package/dist/{chunk-VXULEX3A.cjs.map → chunk-L2KRIMDA.cjs.map} +1 -1
- package/dist/{chunk-ZY2C2CJQ.cjs → chunk-LA5OP5VI.cjs} +2 -2
- package/dist/{chunk-ZY2C2CJQ.cjs.map → chunk-LA5OP5VI.cjs.map} +1 -1
- package/dist/{chunk-NMUPGLJW.cjs → chunk-MQEBVCH5.cjs} +25 -19
- package/dist/chunk-MQEBVCH5.cjs.map +1 -0
- package/dist/{chunk-JSQBXYDM.js → chunk-RZPYOMPO.js} +3 -2
- package/dist/chunk-RZPYOMPO.js.map +1 -0
- package/dist/{chunk-RFLG2CCR.js → chunk-VB5GGBGB.js} +14 -8
- package/dist/chunk-VB5GGBGB.js.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.d.cts +14 -2
- package/dist/index.d.ts +14 -2
- package/dist/index.js +4 -4
- package/dist/memory-service-4ZPYUN4L.js +9 -0
- package/dist/memory-service-LURM3FBB.cjs +9 -0
- package/dist/{memory-service-6WDMF6KX.cjs.map → memory-service-LURM3FBB.cjs.map} +1 -1
- package/dist/{server-BTbRv-yX.d.ts → server-D-3OqU-T.d.cts} +12 -0
- package/dist/{server-BTbRv-yX.d.cts → server-D-3OqU-T.d.ts} +12 -0
- package/dist/server.cjs +4 -4
- package/dist/server.d.cts +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +3 -3
- package/package.json +5 -5
- 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/memory-service-6WDMF6KX.cjs +0 -9
- package/dist/memory-service-GKEG6J2D.js +0 -9
- /package/dist/{chunk-NHFPLDZK.js.map → chunk-5SZWJKD5.js.map} +0 -0
- /package/dist/{memory-service-GKEG6J2D.js.map → memory-service-4ZPYUN4L.js.map} +0 -0
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/cli/utils.ts","../../src/cli/commands/start.ts","../../src/cli/commands/stop.ts","../../src/cli/commands/status.ts","../../src/cli/commands/store.ts","../../src/cli/commands/search.ts","../../src/cli/commands/migrate.ts","../../src/cli/commands/infra.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { startCommand } from \"./commands/start.js\";\nimport { stopCommand } from \"./commands/stop.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { storeCommand } from \"./commands/store.js\";\nimport { searchCommand } from \"./commands/search.js\";\nimport { migrateCommand } from \"./commands/migrate.js\";\nimport { infraCommand } from \"./commands/infra.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"openclaw-memory\")\n .description(\"Triple-layer memory system for AI agents — SQLite + Qdrant + Postgres/AGE\")\n .version(\"0.1.0\");\n\n// Register commands\nprogram.addCommand(initCommand());\nprogram.addCommand(startCommand());\nprogram.addCommand(stopCommand());\nprogram.addCommand(statusCommand());\nprogram.addCommand(storeCommand());\nprogram.addCommand(searchCommand());\nprogram.addCommand(migrateCommand());\nprogram.addCommand(infraCommand());\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { header, success, info, warn, error as logError } from \"../utils.js\";\nimport { getDataDir, getDefaultSqlitePath } from \"../../config/index.js\";\n\nexport function initCommand(): Command {\n return new Command(\"init\")\n .description(\"Interactive setup wizard\")\n .option(\"--tier <tier>\", \"Tier: lite, standard, or full\")\n .option(\"--non-interactive\", \"Skip prompts, use defaults + flags\")\n .action(async (opts) => {\n header(\"Setup Wizard\");\n\n // For non-interactive mode, generate config from flags/defaults\n const tier = opts.tier || \"lite\";\n const dataDir = getDataDir();\n const sqlitePath = getDefaultSqlitePath();\n\n // Ensure data directory exists\n fs.mkdirSync(dataDir, { recursive: true });\n info(`Data directory: ${dataDir}`);\n\n // Auto-detect available services\n let qdrantAvailable = false;\n let ageAvailable = false;\n\n if (tier !== \"lite\") {\n info(\"Checking Qdrant connectivity...\");\n try {\n const res = await fetch(\"http://localhost:6333/collections\", {\n signal: AbortSignal.timeout(2000),\n });\n qdrantAvailable = res.ok;\n } catch { /* not available */ }\n\n if (qdrantAvailable) {\n success(\"Qdrant is reachable at http://localhost:6333\");\n } else {\n warn(\"Qdrant not reachable at http://localhost:6333\");\n }\n }\n\n if (tier === \"full\") {\n info(\"Checking PostgreSQL/AGE connectivity...\");\n try {\n // Simple TCP check\n const net = await import(\"node:net\");\n ageAvailable = await new Promise<boolean>((resolve) => {\n const socket = new net.Socket();\n socket.setTimeout(2000);\n socket.connect(5432, \"localhost\", () => {\n socket.destroy();\n resolve(true);\n });\n socket.on(\"error\", () => resolve(false));\n socket.on(\"timeout\", () => { socket.destroy(); resolve(false); });\n });\n } catch { /* not available */ }\n\n if (ageAvailable) {\n success(\"PostgreSQL is reachable at localhost:5432\");\n } else {\n warn(\"PostgreSQL not reachable at localhost:5432\");\n }\n }\n\n // Determine effective tier\n let effectiveTier = tier;\n if (tier === \"full\" && !ageAvailable) {\n effectiveTier = qdrantAvailable ? \"standard\" : \"lite\";\n warn(`Downgrading to ${effectiveTier} tier (missing dependencies)`);\n } else if (tier === \"standard\" && !qdrantAvailable) {\n effectiveTier = \"lite\";\n warn(\"Downgrading to lite tier (Qdrant not available)\");\n }\n\n // Generate config file\n const configContent = generateConfig(effectiveTier, sqlitePath);\n const configPath = path.join(process.cwd(), \"openclaw-memory.config.ts\");\n\n fs.writeFileSync(configPath, configContent, \"utf-8\");\n success(`Config written to ${configPath}`);\n\n // Generate .env.example\n const envExample = generateEnvExample(effectiveTier);\n const envPath = path.join(process.cwd(), \".env.example\");\n fs.writeFileSync(envPath, envExample, \"utf-8\");\n success(`Environment template written to ${envPath}`);\n\n console.log();\n info(\"Next steps:\");\n console.log(\" openclaw-memory start # Start the server\");\n console.log(\" openclaw-memory status # Check all layers\");\n console.log();\n });\n}\n\nfunction generateConfig(tier: string, sqlitePath: string): string {\n const lines = [\n `import { defineConfig } from 'openclaw-memory';`,\n ``,\n `export default defineConfig({`,\n ` tier: '${tier}',`,\n ` port: 7777,`,\n ` auth: {`,\n ` token: process.env.MEMORY_AUTH_TOKEN || 'change-me',`,\n ` },`,\n ` sqlite: {`,\n ` path: '${sqlitePath}',`,\n ` },`,\n ];\n\n if (tier === \"standard\" || tier === \"full\") {\n lines.push(` qdrant: {`);\n lines.push(` url: process.env.QDRANT_URL || 'http://localhost:6333',`);\n lines.push(` collection: 'openclaw_memories',`);\n lines.push(` },`);\n lines.push(` embedding: {`);\n lines.push(` apiKey: process.env.OPENAI_API_KEY || '',`);\n lines.push(` model: 'text-embedding-3-small',`);\n lines.push(` dimensions: 1536,`);\n lines.push(` },`);\n lines.push(` extraction: {`);\n lines.push(` apiKey: process.env.OPENAI_API_KEY || '',`);\n lines.push(` model: 'gpt-4o-mini',`);\n lines.push(` enabled: true,`);\n lines.push(` },`);\n }\n\n if (tier === \"full\") {\n lines.push(` age: {`);\n lines.push(` host: process.env.PGHOST || 'localhost',`);\n lines.push(` port: parseInt(process.env.PGPORT || '5432', 10),`);\n lines.push(` user: process.env.PGUSER || 'openclaw',`);\n lines.push(` password: process.env.PGPASSWORD || '',`);\n lines.push(` database: process.env.PGDATABASE || 'agent_memory',`);\n lines.push(` graph: 'agent_memory',`);\n lines.push(` },`);\n }\n\n lines.push(`});`);\n lines.push(``);\n\n return lines.join(\"\\n\");\n}\n\nfunction generateEnvExample(tier: string): string {\n const lines = [\n `# openclaw-memory environment variables`,\n ``,\n `# Server`,\n `# OPENCLAW_MEMORY_PORT=7777`,\n `# OPENCLAW_MEMORY_HOST=0.0.0.0`,\n ``,\n `# Authentication`,\n `MEMORY_AUTH_TOKEN=change-me-to-a-secure-token`,\n ``,\n `# SQLite (always required)`,\n `# SQLITE_PATH=~/.openclaw-memory/memory.sqlite`,\n ``,\n ];\n\n if (tier === \"standard\" || tier === \"full\") {\n lines.push(`# Qdrant (Standard/Full tier)`);\n lines.push(`QDRANT_URL=http://localhost:6333`);\n lines.push(``);\n lines.push(`# Embedding provider`);\n lines.push(`OPENAI_API_KEY=sk-your-key-here`);\n lines.push(`# EMBEDDING_MODEL=text-embedding-3-small`);\n lines.push(`# EMBEDDING_BASE_URL=https://api.openai.com/v1`);\n lines.push(``);\n lines.push(`# Entity extraction`);\n lines.push(`# EXTRACTION_MODEL=gpt-4o-mini`);\n lines.push(``);\n }\n\n if (tier === \"full\") {\n lines.push(`# PostgreSQL + Apache AGE (Full tier)`);\n lines.push(`PGHOST=localhost`);\n lines.push(`PGPORT=5432`);\n lines.push(`PGUSER=openclaw`);\n lines.push(`PGPASSWORD=your-password`);\n lines.push(`PGDATABASE=agent_memory`);\n lines.push(`# AGE_GRAPH=agent_memory`);\n lines.push(``);\n }\n\n return lines.join(\"\\n\");\n}\n","import pc from \"picocolors\";\nimport fs from \"node:fs\";\nimport { getPidFilePath } from \"../config/index.js\";\n\n// ── CLI Utilities ───────────────────────────────────────────────────────\n\nexport function log(msg: string): void {\n console.log(msg);\n}\n\nexport function info(msg: string): void {\n console.log(pc.blue(\"ℹ\") + \" \" + msg);\n}\n\nexport function success(msg: string): void {\n console.log(pc.green(\"✓\") + \" \" + msg);\n}\n\nexport function warn(msg: string): void {\n console.log(pc.yellow(\"⚠\") + \" \" + msg);\n}\n\nexport function error(msg: string): void {\n console.error(pc.red(\"✗\") + \" \" + msg);\n}\n\nexport function header(title: string): void {\n console.log();\n console.log(pc.bold(` 🧠 OpenClaw Memory — ${title}`));\n console.log();\n}\n\nexport function bullet(label: string, value: string, status?: \"ok\" | \"error\" | \"disabled\" | \"degraded\"): void {\n const dot = status === \"ok\" ? pc.green(\"●\")\n : status === \"error\" ? pc.red(\"●\")\n : status === \"degraded\" ? pc.yellow(\"●\")\n : status === \"disabled\" ? pc.dim(\"○\")\n : \" \";\n console.log(` ${dot} ${pc.bold(label)} ${value}`);\n}\n\n// ── Server Detection ────────────────────────────────────────────────────\n\nexport function getServerPid(): number | null {\n const pidPath = getPidFilePath();\n if (!fs.existsSync(pidPath)) return null;\n\n try {\n const pid = parseInt(fs.readFileSync(pidPath, \"utf-8\").trim(), 10);\n if (isNaN(pid)) return null;\n\n // Check if process is alive\n try {\n process.kill(pid, 0);\n return pid;\n } catch {\n // Process not running, clean up stale PID file\n fs.unlinkSync(pidPath);\n return null;\n }\n } catch {\n return null;\n }\n}\n\nexport async function isServerRunning(baseUrl: string = \"http://localhost:7777\"): Promise<boolean> {\n try {\n const res = await fetch(`${baseUrl}/api/health`, {\n signal: AbortSignal.timeout(2000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport function getBaseUrl(port?: number): string {\n return `http://localhost:${port || 7777}`;\n}\n\n// ── HTTP Client ─────────────────────────────────────────────────────────\n\nexport async function apiGet(baseUrl: string, path: string, token?: string): Promise<unknown> {\n const headers: Record<string, string> = {};\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await fetch(`${baseUrl}${path}`, { headers });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`HTTP ${res.status}: ${text}`);\n }\n return res.json();\n}\n\nexport async function apiPost(baseUrl: string, path: string, body: unknown, token?: string): Promise<unknown> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await fetch(`${baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`HTTP ${res.status}: ${text}`);\n }\n return res.json();\n}\n\nexport async function apiDelete(baseUrl: string, path: string, token?: string): Promise<unknown> {\n const headers: Record<string, string> = {};\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await fetch(`${baseUrl}${path}`, {\n method: \"DELETE\",\n headers,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`HTTP ${res.status}: ${text}`);\n }\n return res.json();\n}\n\n// ── Output Formatting ───────────────────────────────────────────────────\n\nexport function output(data: unknown, format: \"json\" | \"text\" = \"json\"): void {\n if (format === \"text\") {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(JSON.stringify(data));\n }\n}\n\n// ── Stdin Reading ───────────────────────────────────────────────────────\n\nexport async function readStdin(): Promise<string> {\n if (process.stdin.isTTY) return \"\";\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf-8\").trim();\n}\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { header, success, info, error as logError } from \"../utils.js\";\nimport { getPidFilePath, getDataDir } from \"../../config/index.js\";\n\nexport function startCommand(): Command {\n return new Command(\"start\")\n .description(\"Start the HTTP server\")\n .option(\"-p, --port <port>\", \"Server port\")\n .option(\"--bg\", \"Run in background (daemon mode)\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (opts) => {\n if (opts.bg) {\n await startBackground(opts);\n } else {\n await startForeground(opts);\n }\n });\n}\n\nasync function startForeground(opts: { port?: string; config?: string }): Promise<void> {\n // Set port if specified\n if (opts.port) {\n process.env.OPENCLAW_MEMORY_PORT = opts.port;\n process.env.PORT = opts.port;\n }\n\n // Import and run server directly\n const { createServer } = await import(\"../../server.js\");\n const { app, config } = await createServer(opts.config);\n\n const port = opts.port ? parseInt(opts.port, 10) : config.port;\n app.listen(port);\n\n console.log(`[server] Listening on http://0.0.0.0:${port}`);\n\n // Write PID file for status/stop commands\n const dataDir = getDataDir();\n fs.mkdirSync(dataDir, { recursive: true });\n fs.writeFileSync(getPidFilePath(), String(process.pid), \"utf-8\");\n\n const cleanup = () => {\n try { fs.unlinkSync(getPidFilePath()); } catch {}\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n}\n\nasync function startBackground(opts: { port?: string; config?: string }): Promise<void> {\n header(\"Starting Server (background)\");\n\n const dataDir = getDataDir();\n fs.mkdirSync(dataDir, { recursive: true });\n\n // Build the command to run\n const args = [\"run\", \"src/server.ts\"];\n const env = { ...process.env };\n\n if (opts.port) {\n env.OPENCLAW_MEMORY_PORT = opts.port;\n env.PORT = opts.port;\n }\n\n // Detect runtime\n const runtime = typeof Bun !== \"undefined\" ? \"bun\" : \"node\";\n const execPath = runtime === \"bun\" ? \"bun\" : process.execPath;\n const execArgs = runtime === \"bun\" ? args : [\"--import\", \"tsx\", ...args];\n\n const child = spawn(execPath, execArgs, {\n env,\n detached: true,\n stdio: \"ignore\",\n cwd: process.cwd(),\n });\n\n child.unref();\n\n if (child.pid) {\n fs.writeFileSync(getPidFilePath(), String(child.pid), \"utf-8\");\n success(`Server started in background (PID: ${child.pid})`);\n info(`PID file: ${getPidFilePath()}`);\n info(`Stop with: openclaw-memory stop`);\n } else {\n logError(\"Failed to start server\");\n process.exit(1);\n }\n}\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport { header, success, warn, error as logError } from \"../utils.js\";\nimport { getPidFilePath } from \"../../config/index.js\";\n\nexport function stopCommand(): Command {\n return new Command(\"stop\")\n .description(\"Stop the running server\")\n .action(async () => {\n header(\"Stopping Server\");\n\n const pidPath = getPidFilePath();\n if (!fs.existsSync(pidPath)) {\n warn(\"No PID file found — server may not be running\");\n return;\n }\n\n const pidStr = fs.readFileSync(pidPath, \"utf-8\").trim();\n const pid = parseInt(pidStr, 10);\n\n if (isNaN(pid)) {\n logError(`Invalid PID in ${pidPath}: ${pidStr}`);\n return;\n }\n\n try {\n // Send SIGTERM for graceful shutdown\n process.kill(pid, \"SIGTERM\");\n success(`Sent SIGTERM to PID ${pid}`);\n\n // Wait up to 3 seconds for graceful shutdown\n let alive = true;\n for (let i = 0; i < 30; i++) {\n await new Promise((r) => setTimeout(r, 100));\n try {\n process.kill(pid, 0);\n } catch {\n alive = false;\n break;\n }\n }\n\n if (alive) {\n warn(\"Process still running after 3s, sending SIGKILL...\");\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {}\n }\n\n success(\"Server stopped\");\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ESRCH\") {\n warn(`Process ${pid} not found — may have already stopped`);\n } else {\n logError(`Failed to stop process ${pid}: ${err}`);\n }\n }\n\n // Clean up PID file\n try {\n fs.unlinkSync(pidPath);\n } catch {}\n });\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { header, bullet, info, getServerPid, isServerRunning, getBaseUrl, apiGet } from \"../utils.js\";\nimport { loadConfig } from \"../../config/index.js\";\n\nexport function statusCommand(): Command {\n return new Command(\"status\")\n .description(\"Show server and layer health status\")\n .option(\"-p, --port <port>\", \"Server port to check\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (opts) => {\n header(\"Status\");\n\n let config;\n try {\n config = await loadConfig(opts.config);\n } catch {\n config = null;\n }\n\n const port = opts.port ? parseInt(opts.port, 10) : config?.port || 7777;\n const baseUrl = getBaseUrl(port);\n const pid = getServerPid();\n const running = await isServerRunning(baseUrl);\n\n // Server status\n if (running && pid) {\n bullet(\"Server\", `Running (PID ${pid}, port ${port})`, \"ok\");\n } else if (running) {\n bullet(\"Server\", `Running (port ${port})`, \"ok\");\n } else if (pid) {\n bullet(\"Server\", `PID file exists (${pid}) but not responding`, \"error\");\n } else {\n bullet(\"Server\", \"Not running\", \"disabled\");\n }\n\n if (config) {\n bullet(\"Tier\", config.tier, undefined);\n }\n\n console.log();\n\n // If server is running, get health from API\n if (running) {\n try {\n const health = await apiGet(baseUrl, \"/api/health\", config?.auth?.token) as Record<string, unknown>;\n\n info(\"Layers:\");\n const sqliteStatus = health.sqlite === \"ok\" ? \"ok\" as const : \"error\" as const;\n bullet(\"L1 SQLite\", String(health.sqlite), sqliteStatus);\n\n if (health.qdrant !== \"disabled\") {\n const qdrantStatus = health.qdrant === \"ok\" ? \"ok\" as const : \"error\" as const;\n bullet(\"L2 Qdrant\", String(health.qdrant), qdrantStatus);\n } else {\n bullet(\"L2 Qdrant\", \"disabled\", \"disabled\");\n }\n\n if (health.age !== \"disabled\") {\n const ageStatus = health.age === \"ok\" ? \"ok\" as const : \"error\" as const;\n bullet(\"L3 AGE\", String(health.age), ageStatus);\n } else {\n bullet(\"L3 AGE\", \"disabled\", \"disabled\");\n }\n\n if (health.uptime !== undefined) {\n const uptime = formatUptime(Number(health.uptime));\n console.log();\n info(`Uptime: ${uptime}`);\n }\n } catch (error) {\n info(\"Could not fetch health status from server\");\n }\n } else {\n // Server not running — try direct layer checks\n if (config) {\n info(\"Server not running. Checking layers directly...\");\n console.log();\n\n // SQLite — always available\n bullet(\"L1 SQLite\", config.sqlite.path, \"ok\");\n\n // Qdrant\n if (config.qdrant) {\n try {\n const res = await fetch(`${config.qdrant.url}/collections`, {\n signal: AbortSignal.timeout(2000),\n });\n bullet(\"L2 Qdrant\", config.qdrant.url, res.ok ? \"ok\" : \"error\");\n } catch {\n bullet(\"L2 Qdrant\", `${config.qdrant.url} (unreachable)`, \"error\");\n }\n } else {\n bullet(\"L2 Qdrant\", \"not configured\", \"disabled\");\n }\n\n // AGE\n if (config.age) {\n try {\n const net = await import(\"node:net\");\n const reachable = await new Promise<boolean>((resolve) => {\n const socket = new net.Socket();\n socket.setTimeout(2000);\n socket.connect(config!.age!.port, config!.age!.host, () => {\n socket.destroy();\n resolve(true);\n });\n socket.on(\"error\", () => resolve(false));\n socket.on(\"timeout\", () => { socket.destroy(); resolve(false); });\n });\n bullet(\"L3 AGE\", `${config.age.host}:${config.age.port}`, reachable ? \"ok\" : \"error\");\n } catch {\n bullet(\"L3 AGE\", \"unreachable\", \"error\");\n }\n } else {\n bullet(\"L3 AGE\", \"not configured\", \"disabled\");\n }\n }\n }\n\n console.log();\n });\n}\n\nfunction formatUptime(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = seconds % 60;\n if (h > 0) return `${h}h ${m}m`;\n if (m > 0) return `${m}m ${s}s`;\n return `${s}s`;\n}\n","import { Command } from \"commander\";\nimport { output, readStdin, apiPost, isServerRunning, getBaseUrl } from \"../utils.js\";\nimport { loadConfig } from \"../../config/index.js\";\n\nexport function storeCommand(): Command {\n return new Command(\"store\")\n .description(\"Store a new memory\")\n .argument(\"[content]\", \"Memory content (or pipe via stdin)\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .requiredOption(\"--scope <scope>\", \"Memory scope (user, agent, global, project, session)\")\n .option(\"--subject <id>\", \"Subject ID\")\n .option(\"--tags <tags>\", \"Comma-separated tags\")\n .option(\"--source <source>\", \"Memory source\", \"explicit\")\n .option(\"--no-extract\", \"Skip entity extraction\")\n .option(\"--format <fmt>\", \"Output format (json, text)\", \"json\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (contentArg, opts) => {\n const content = contentArg || await readStdin();\n if (!content) {\n console.error(\"Error: content is required (pass as argument or pipe via stdin)\");\n process.exit(1);\n }\n\n const config = await loadConfig(opts.config);\n const baseUrl = getBaseUrl(config.port);\n const serverUp = await isServerRunning(baseUrl);\n\n const body = {\n agent_id: opts.agent,\n scope: opts.scope,\n subject_id: opts.subject || null,\n content,\n tags: opts.tags ? opts.tags.split(\",\").map((t: string) => t.trim()) : [],\n source: opts.source,\n extract_entities: opts.extract !== false,\n };\n\n if (serverUp) {\n // Use HTTP API\n const result = await apiPost(baseUrl, \"/api/memories\", body, config.auth.token);\n output(result, opts.format);\n } else {\n // Direct mode — instantiate MemoryService in-process\n const { MemoryService } = await import(\"../../core/memory-service.js\");\n const service = new MemoryService();\n await service.init();\n\n try {\n const result = await service.store({\n agentId: opts.agent,\n scope: opts.scope,\n subjectId: opts.subject || null,\n content,\n tags: body.tags,\n source: opts.source,\n extractEntities: opts.extract !== false,\n });\n output(result, opts.format);\n } finally {\n await service.close();\n }\n }\n });\n}\n","import { Command } from \"commander\";\nimport { output, apiPost, isServerRunning, getBaseUrl } from \"../utils.js\";\nimport { loadConfig } from \"../../config/index.js\";\n\nexport function searchCommand(): Command {\n const cmd = new Command(\"search\")\n .description(\"Search memories\");\n\n // Default search (smart auto-select)\n cmd\n .argument(\"<query>\", \"Search query\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--limit <n>\", \"Max results\", \"10\")\n .option(\"--strategy <s>\", \"Search strategy (auto, semantic, fulltext, graph, all)\", \"auto\")\n .option(\"--scopes <scopes>\", \"Comma-separated scopes\")\n .option(\"--subject <id>\", \"Subject ID filter\")\n .option(\"--cross-agent\", \"Search across all agents\")\n .option(\"--no-graph\", \"Exclude graph results\")\n .option(\"--recall\", \"Format output for LLM context injection\")\n .option(\"--format <fmt>\", \"Output format (json, text)\", \"json\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (query, opts) => {\n const config = await loadConfig(opts.config);\n const baseUrl = getBaseUrl(config.port);\n const serverUp = await isServerRunning(baseUrl);\n\n const body = {\n agent_id: opts.agent,\n query,\n limit: parseInt(opts.limit, 10),\n strategy: opts.strategy,\n scopes: opts.scopes ? opts.scopes.split(\",\") : undefined,\n subject_id: opts.subject || null,\n cross_agent: opts.crossAgent || false,\n include_graph: opts.graph !== false,\n };\n\n let result: unknown;\n if (serverUp) {\n result = await apiPost(baseUrl, \"/api/search\", body, config.auth.token);\n } else {\n const { MemoryService } = await import(\"../../core/memory-service.js\");\n const service = new MemoryService();\n await service.init();\n try {\n result = await service.search({\n agentId: opts.agent,\n query,\n limit: parseInt(opts.limit, 10),\n strategy: opts.strategy,\n scopes: opts.scopes ? opts.scopes.split(\",\") : undefined,\n subjectId: opts.subject || null,\n crossAgent: opts.crossAgent || false,\n includeGraph: opts.graph !== false,\n });\n } finally {\n await service.close();\n }\n }\n\n // Recall mode — format for LLM\n if (opts.recall) {\n const data = result as { results?: Array<{ memory: { content: string; scope: string; created_at: string } }> };\n if (data.results && data.results.length > 0) {\n console.log(\"## Relevant Memories\");\n for (const r of data.results) {\n const date = new Date(r.memory.created_at).toLocaleDateString();\n console.log(`- ${r.memory.content} (${r.memory.scope}, ${date})`);\n }\n } else {\n console.log(\"No relevant memories found.\");\n }\n } else {\n output(result, opts.format);\n }\n });\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport { output, apiPost, isServerRunning, getBaseUrl, success, info, header } from \"../utils.js\";\nimport { loadConfig } from \"../../config/index.js\";\n\nexport function migrateCommand(): Command {\n return new Command(\"migrate\")\n .description(\"Import memories from markdown files\")\n .requiredOption(\"--paths <paths>\", \"Comma-separated file paths\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--dry-run\", \"Preview without writing\")\n .option(\"--format <fmt>\", \"Output format (json, text)\", \"json\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (opts) => {\n const config = await loadConfig(opts.config);\n const baseUrl = getBaseUrl(config.port);\n const serverUp = await isServerRunning(baseUrl);\n\n const paths = opts.paths.split(\",\").map((p: string) => p.trim());\n\n if (opts.dryRun) {\n header(\"Migration (dry run)\");\n }\n\n const body = {\n markdown_paths: paths,\n agent_id: opts.agent,\n dry_run: opts.dryRun || false,\n };\n\n let result: unknown;\n if (serverUp) {\n result = await apiPost(baseUrl, \"/api/admin/migrate-markdown\", body, config.auth.token);\n } else {\n // Direct mode\n const { MemoryService } = await import(\"../../core/memory-service.js\");\n const service = new MemoryService();\n await service.init();\n try {\n const migrated = await service.migrateMarkdown(paths, opts.agent);\n result = migrated;\n } finally {\n await service.close();\n }\n }\n\n if (opts.format === \"text\") {\n const data = result as { migrated?: number; skipped?: number; errors?: string[] };\n if (data.migrated !== undefined) {\n success(`Migrated ${data.migrated} memories`);\n }\n if (data.skipped) {\n info(`Skipped ${data.skipped} sections`);\n }\n if (data.errors && data.errors.length > 0) {\n for (const err of data.errors) {\n console.error(` ✗ ${err}`);\n }\n }\n } else {\n output(result, opts.format);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { execSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { header, success, info, warn, error as logError } from \"../utils.js\";\nimport { getDataDir, loadConfig } from \"../../config/index.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport function infraCommand(): Command {\n const infra = new Command(\"infra\")\n .description(\"Manage Docker infrastructure\");\n\n infra\n .command(\"up\")\n .description(\"Start Docker containers for the configured tier\")\n .option(\"--tier <tier>\", \"Override tier (standard, full)\")\n .action(async (opts) => {\n header(\"Infrastructure Up\");\n\n let tier = opts.tier;\n if (!tier) {\n try {\n const config = await loadConfig();\n tier = config.tier;\n } catch {\n tier = \"standard\";\n }\n }\n\n if (tier === \"lite\") {\n info(\"Lite tier uses only SQLite — no Docker infrastructure needed.\");\n return;\n }\n\n const templateFile = tier === \"full\" ? \"full.yml\" : \"standard.yml\";\n const templatePath = findTemplate(templateFile);\n\n if (!templatePath) {\n logError(`Template not found: ${templateFile}`);\n logError(\"Expected in ./docker/ or ./templates/ directory\");\n process.exit(1);\n }\n\n const dataDir = getDataDir();\n fs.mkdirSync(dataDir, { recursive: true });\n\n const targetPath = path.join(dataDir, \"docker-compose.yml\");\n fs.copyFileSync(templatePath, targetPath);\n info(`Using template: ${templatePath}`);\n\n try {\n execSync(`docker compose -f ${targetPath} up -d`, {\n stdio: \"inherit\",\n cwd: dataDir,\n });\n success(\"Docker containers started\");\n } catch (error) {\n logError(\"Failed to start Docker containers\");\n logError(\"Make sure Docker is installed and running\");\n process.exit(1);\n }\n });\n\n infra\n .command(\"down\")\n .description(\"Stop Docker containers\")\n .action(async () => {\n header(\"Infrastructure Down\");\n\n const dataDir = getDataDir();\n const composePath = path.join(dataDir, \"docker-compose.yml\");\n\n if (!fs.existsSync(composePath)) {\n warn(\"No docker-compose.yml found in data directory\");\n return;\n }\n\n try {\n execSync(`docker compose -f ${composePath} down`, {\n stdio: \"inherit\",\n cwd: dataDir,\n });\n success(\"Docker containers stopped\");\n } catch (error) {\n logError(\"Failed to stop Docker containers\");\n process.exit(1);\n }\n });\n\n infra\n .command(\"status\")\n .description(\"Show Docker container status\")\n .action(async () => {\n header(\"Infrastructure Status\");\n\n const dataDir = getDataDir();\n const composePath = path.join(dataDir, \"docker-compose.yml\");\n\n if (!fs.existsSync(composePath)) {\n info(\"No docker-compose.yml found — infrastructure not set up\");\n info(\"Run: openclaw-memory infra up\");\n return;\n }\n\n try {\n execSync(`docker compose -f ${composePath} ps`, {\n stdio: \"inherit\",\n cwd: dataDir,\n });\n } catch {\n logError(\"Failed to get container status\");\n }\n });\n\n return infra;\n}\n\nfunction findTemplate(filename: string): string | null {\n const searchPaths = [\n path.join(process.cwd(), \"docker\", filename),\n path.join(process.cwd(), \"templates\", filename),\n // Look in the package's installed location\n path.join(__dirname, \"../../docker\", filename),\n path.join(__dirname, \"../../templates\", filename),\n ];\n\n for (const p of searchPaths) {\n if (fs.existsSync(p)) return p;\n }\n\n return null;\n}\n"],"mappings":"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","names":["Command","fs","path","fs","Command","fs","Command","fs","Command","fs","Command","fs","Command","Command","error","Command","Command","Command","Command","Command","Command","Command","fs","path","path","Command","fs","error","Command"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/cli/utils.ts","../../src/cli/commands/start.ts","../../src/cli/commands/stop.ts","../../src/cli/commands/status.ts","../../src/cli/commands/store.ts","../../src/cli/commands/search.ts","../../src/cli/commands/migrate.ts","../../src/cli/commands/infra.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { startCommand } from \"./commands/start.js\";\nimport { stopCommand } from \"./commands/stop.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { storeCommand } from \"./commands/store.js\";\nimport { searchCommand } from \"./commands/search.js\";\nimport { migrateCommand } from \"./commands/migrate.js\";\nimport { infraCommand } from \"./commands/infra.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"openclaw-memory\")\n .description(\"Triple-layer memory system for AI agents — SQLite + Qdrant + Postgres/AGE\")\n .version(\"0.1.0\");\n\n// Register commands\nprogram.addCommand(initCommand());\nprogram.addCommand(startCommand());\nprogram.addCommand(stopCommand());\nprogram.addCommand(statusCommand());\nprogram.addCommand(storeCommand());\nprogram.addCommand(searchCommand());\nprogram.addCommand(migrateCommand());\nprogram.addCommand(infraCommand());\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { header, success, info, warn, error as logError } from \"../utils.js\";\nimport { getDataDir, getDefaultSqlitePath } from \"../../config/index.js\";\n\nexport function initCommand(): Command {\n return new Command(\"init\")\n .description(\"Interactive setup wizard\")\n .option(\"--tier <tier>\", \"Tier: lite, standard, or full\")\n .option(\"--non-interactive\", \"Skip prompts, use defaults + flags\")\n .action(async (opts) => {\n header(\"Setup Wizard\");\n\n // For non-interactive mode, generate config from flags/defaults\n const tier = opts.tier || \"lite\";\n const dataDir = getDataDir();\n const sqlitePath = getDefaultSqlitePath();\n\n // Ensure data directory exists\n fs.mkdirSync(dataDir, { recursive: true });\n info(`Data directory: ${dataDir}`);\n\n // Auto-detect available services\n let qdrantAvailable = false;\n let ageAvailable = false;\n\n if (tier !== \"lite\") {\n info(\"Checking Qdrant connectivity...\");\n try {\n const res = await fetch(\"http://localhost:6333/collections\", {\n signal: AbortSignal.timeout(2000),\n });\n qdrantAvailable = res.ok;\n } catch { /* not available */ }\n\n if (qdrantAvailable) {\n success(\"Qdrant is reachable at http://localhost:6333\");\n } else {\n warn(\"Qdrant not reachable at http://localhost:6333\");\n }\n }\n\n if (tier === \"full\") {\n info(\"Checking PostgreSQL/AGE connectivity...\");\n try {\n // Simple TCP check\n const net = await import(\"node:net\");\n ageAvailable = await new Promise<boolean>((resolve) => {\n const socket = new net.Socket();\n socket.setTimeout(2000);\n socket.connect(5432, \"localhost\", () => {\n socket.destroy();\n resolve(true);\n });\n socket.on(\"error\", () => resolve(false));\n socket.on(\"timeout\", () => { socket.destroy(); resolve(false); });\n });\n } catch { /* not available */ }\n\n if (ageAvailable) {\n success(\"PostgreSQL is reachable at localhost:5432\");\n } else {\n warn(\"PostgreSQL not reachable at localhost:5432\");\n }\n }\n\n // Determine effective tier\n let effectiveTier = tier;\n if (tier === \"full\" && !ageAvailable) {\n effectiveTier = qdrantAvailable ? \"standard\" : \"lite\";\n warn(`Downgrading to ${effectiveTier} tier (missing dependencies)`);\n } else if (tier === \"standard\" && !qdrantAvailable) {\n effectiveTier = \"lite\";\n warn(\"Downgrading to lite tier (Qdrant not available)\");\n }\n\n // Generate config file\n const configContent = generateConfig(effectiveTier, sqlitePath);\n const configPath = path.join(process.cwd(), \"openclaw-memory.config.ts\");\n\n fs.writeFileSync(configPath, configContent, \"utf-8\");\n success(`Config written to ${configPath}`);\n\n // Generate .env.example\n const envExample = generateEnvExample(effectiveTier);\n const envPath = path.join(process.cwd(), \".env.example\");\n fs.writeFileSync(envPath, envExample, \"utf-8\");\n success(`Environment template written to ${envPath}`);\n\n console.log();\n info(\"Next steps:\");\n console.log(\" openclaw-memory start # Start the server\");\n console.log(\" openclaw-memory status # Check all layers\");\n console.log();\n });\n}\n\nfunction generateConfig(tier: string, sqlitePath: string): string {\n const lines = [\n `import { defineConfig } from '@poprobertdaniel/openclaw-memory';`,\n ``,\n `export default defineConfig({`,\n ` tier: '${tier}',`,\n ` port: 7777,`,\n ` auth: {`,\n ` token: process.env.MEMORY_AUTH_TOKEN || 'change-me',`,\n ` },`,\n ` sqlite: {`,\n ` path: '${sqlitePath}',`,\n ` },`,\n ];\n\n if (tier === \"standard\" || tier === \"full\") {\n lines.push(` qdrant: {`);\n lines.push(` url: process.env.QDRANT_URL || 'http://localhost:6333',`);\n lines.push(` collection: 'openclaw_memories',`);\n lines.push(` },`);\n lines.push(` embedding: {`);\n lines.push(` apiKey: process.env.OPENAI_API_KEY || '',`);\n lines.push(` model: 'text-embedding-3-small',`);\n lines.push(` dimensions: 1536,`);\n lines.push(` },`);\n lines.push(` extraction: {`);\n lines.push(` apiKey: process.env.OPENAI_API_KEY || '',`);\n lines.push(` model: 'gpt-5-nano',`);\n lines.push(` enabled: true,`);\n lines.push(` },`);\n }\n\n if (tier === \"full\") {\n lines.push(` age: {`);\n lines.push(` host: process.env.PGHOST || 'localhost',`);\n lines.push(` port: parseInt(process.env.PGPORT || '5432', 10),`);\n lines.push(` user: process.env.PGUSER || 'openclaw',`);\n lines.push(` password: process.env.PGPASSWORD || '',`);\n lines.push(` database: process.env.PGDATABASE || 'agent_memory',`);\n lines.push(` graph: 'agent_memory',`);\n lines.push(` },`);\n }\n\n lines.push(`});`);\n lines.push(``);\n\n return lines.join(\"\\n\");\n}\n\nfunction generateEnvExample(tier: string): string {\n const lines = [\n `# openclaw-memory environment variables`,\n ``,\n `# Server`,\n `# OPENCLAW_MEMORY_PORT=7777`,\n `# OPENCLAW_MEMORY_HOST=0.0.0.0`,\n ``,\n `# Authentication`,\n `MEMORY_AUTH_TOKEN=change-me-to-a-secure-token`,\n ``,\n `# SQLite (always required)`,\n `# SQLITE_PATH=~/.openclaw-memory/memory.sqlite`,\n ``,\n ];\n\n if (tier === \"standard\" || tier === \"full\") {\n lines.push(`# Qdrant (Standard/Full tier)`);\n lines.push(`QDRANT_URL=http://localhost:6333`);\n lines.push(``);\n lines.push(`# Embedding provider`);\n lines.push(`OPENAI_API_KEY=sk-your-key-here`);\n lines.push(`# EMBEDDING_MODEL=text-embedding-3-small`);\n lines.push(`# EMBEDDING_BASE_URL=https://api.openai.com/v1`);\n lines.push(``);\n lines.push(`# Entity extraction`);\n lines.push(`# EXTRACTION_MODEL=gpt-5-nano`);\n lines.push(``);\n }\n\n if (tier === \"full\") {\n lines.push(`# PostgreSQL + Apache AGE (Full tier)`);\n lines.push(`PGHOST=localhost`);\n lines.push(`PGPORT=5432`);\n lines.push(`PGUSER=openclaw`);\n lines.push(`PGPASSWORD=your-password`);\n lines.push(`PGDATABASE=agent_memory`);\n lines.push(`# AGE_GRAPH=agent_memory`);\n lines.push(``);\n }\n\n return lines.join(\"\\n\");\n}\n","import pc from \"picocolors\";\nimport fs from \"node:fs\";\nimport { getPidFilePath } from \"../config/index.js\";\n\n// ── CLI Utilities ───────────────────────────────────────────────────────\n\nexport function log(msg: string): void {\n console.log(msg);\n}\n\nexport function info(msg: string): void {\n console.log(pc.blue(\"ℹ\") + \" \" + msg);\n}\n\nexport function success(msg: string): void {\n console.log(pc.green(\"✓\") + \" \" + msg);\n}\n\nexport function warn(msg: string): void {\n console.log(pc.yellow(\"⚠\") + \" \" + msg);\n}\n\nexport function error(msg: string): void {\n console.error(pc.red(\"✗\") + \" \" + msg);\n}\n\nexport function header(title: string): void {\n console.log();\n console.log(pc.bold(` 🧠 OpenClaw Memory — ${title}`));\n console.log();\n}\n\nexport function bullet(label: string, value: string, status?: \"ok\" | \"error\" | \"disabled\" | \"degraded\"): void {\n const dot = status === \"ok\" ? pc.green(\"●\")\n : status === \"error\" ? pc.red(\"●\")\n : status === \"degraded\" ? pc.yellow(\"●\")\n : status === \"disabled\" ? pc.dim(\"○\")\n : \" \";\n console.log(` ${dot} ${pc.bold(label)} ${value}`);\n}\n\n// ── Server Detection ────────────────────────────────────────────────────\n\nexport function getServerPid(): number | null {\n const pidPath = getPidFilePath();\n if (!fs.existsSync(pidPath)) return null;\n\n try {\n const pid = parseInt(fs.readFileSync(pidPath, \"utf-8\").trim(), 10);\n if (isNaN(pid)) return null;\n\n // Check if process is alive\n try {\n process.kill(pid, 0);\n return pid;\n } catch {\n // Process not running, clean up stale PID file\n fs.unlinkSync(pidPath);\n return null;\n }\n } catch {\n return null;\n }\n}\n\nexport async function isServerRunning(baseUrl: string = \"http://localhost:7777\"): Promise<boolean> {\n try {\n const res = await fetch(`${baseUrl}/api/health`, {\n signal: AbortSignal.timeout(2000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport function getBaseUrl(port?: number): string {\n return `http://localhost:${port || 7777}`;\n}\n\n// ── HTTP Client ─────────────────────────────────────────────────────────\n\nexport async function apiGet(baseUrl: string, path: string, token?: string): Promise<unknown> {\n const headers: Record<string, string> = {};\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await fetch(`${baseUrl}${path}`, { headers });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`HTTP ${res.status}: ${text}`);\n }\n return res.json();\n}\n\nexport async function apiPost(baseUrl: string, path: string, body: unknown, token?: string): Promise<unknown> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await fetch(`${baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`HTTP ${res.status}: ${text}`);\n }\n return res.json();\n}\n\nexport async function apiDelete(baseUrl: string, path: string, token?: string): Promise<unknown> {\n const headers: Record<string, string> = {};\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await fetch(`${baseUrl}${path}`, {\n method: \"DELETE\",\n headers,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`HTTP ${res.status}: ${text}`);\n }\n return res.json();\n}\n\n// ── Output Formatting ───────────────────────────────────────────────────\n\nexport function output(data: unknown, format: \"json\" | \"text\" = \"json\"): void {\n if (format === \"text\") {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(JSON.stringify(data));\n }\n}\n\n// ── Stdin Reading ───────────────────────────────────────────────────────\n\nexport async function readStdin(): Promise<string> {\n if (process.stdin.isTTY) return \"\";\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf-8\").trim();\n}\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { header, success, info, error as logError } from \"../utils.js\";\nimport { getPidFilePath, getDataDir } from \"../../config/index.js\";\n\nexport function startCommand(): Command {\n return new Command(\"start\")\n .description(\"Start the HTTP server\")\n .option(\"-p, --port <port>\", \"Server port\")\n .option(\"--bg\", \"Run in background (daemon mode)\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (opts) => {\n if (opts.bg) {\n await startBackground(opts);\n } else {\n await startForeground(opts);\n }\n });\n}\n\nasync function startForeground(opts: { port?: string; config?: string }): Promise<void> {\n // Set port if specified\n if (opts.port) {\n process.env.OPENCLAW_MEMORY_PORT = opts.port;\n process.env.PORT = opts.port;\n }\n\n // Import and run server directly\n const { createServer } = await import(\"../../server.js\");\n const { app, config } = await createServer(opts.config);\n\n const port = opts.port ? parseInt(opts.port, 10) : config.port;\n app.listen(port);\n\n console.log(`[server] Listening on http://0.0.0.0:${port}`);\n\n // Write PID file for status/stop commands\n const dataDir = getDataDir();\n fs.mkdirSync(dataDir, { recursive: true });\n fs.writeFileSync(getPidFilePath(), String(process.pid), \"utf-8\");\n\n const cleanup = () => {\n try { fs.unlinkSync(getPidFilePath()); } catch {}\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n}\n\nasync function startBackground(opts: { port?: string; config?: string }): Promise<void> {\n header(\"Starting Server (background)\");\n\n const dataDir = getDataDir();\n fs.mkdirSync(dataDir, { recursive: true });\n\n // Build the command to run\n const args = [\"run\", \"src/server.ts\"];\n const env = { ...process.env };\n\n if (opts.port) {\n env.OPENCLAW_MEMORY_PORT = opts.port;\n env.PORT = opts.port;\n }\n\n // Detect runtime\n const runtime = typeof Bun !== \"undefined\" ? \"bun\" : \"node\";\n const execPath = runtime === \"bun\" ? \"bun\" : process.execPath;\n const execArgs = runtime === \"bun\" ? args : [\"--import\", \"tsx\", ...args];\n\n const child = spawn(execPath, execArgs, {\n env,\n detached: true,\n stdio: \"ignore\",\n cwd: process.cwd(),\n });\n\n child.unref();\n\n if (child.pid) {\n fs.writeFileSync(getPidFilePath(), String(child.pid), \"utf-8\");\n success(`Server started in background (PID: ${child.pid})`);\n info(`PID file: ${getPidFilePath()}`);\n info(`Stop with: openclaw-memory stop`);\n } else {\n logError(\"Failed to start server\");\n process.exit(1);\n }\n}\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport { header, success, warn, error as logError } from \"../utils.js\";\nimport { getPidFilePath } from \"../../config/index.js\";\n\nexport function stopCommand(): Command {\n return new Command(\"stop\")\n .description(\"Stop the running server\")\n .action(async () => {\n header(\"Stopping Server\");\n\n const pidPath = getPidFilePath();\n if (!fs.existsSync(pidPath)) {\n warn(\"No PID file found — server may not be running\");\n return;\n }\n\n const pidStr = fs.readFileSync(pidPath, \"utf-8\").trim();\n const pid = parseInt(pidStr, 10);\n\n if (isNaN(pid)) {\n logError(`Invalid PID in ${pidPath}: ${pidStr}`);\n return;\n }\n\n try {\n // Send SIGTERM for graceful shutdown\n process.kill(pid, \"SIGTERM\");\n success(`Sent SIGTERM to PID ${pid}`);\n\n // Wait up to 3 seconds for graceful shutdown\n let alive = true;\n for (let i = 0; i < 30; i++) {\n await new Promise((r) => setTimeout(r, 100));\n try {\n process.kill(pid, 0);\n } catch {\n alive = false;\n break;\n }\n }\n\n if (alive) {\n warn(\"Process still running after 3s, sending SIGKILL...\");\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {}\n }\n\n success(\"Server stopped\");\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ESRCH\") {\n warn(`Process ${pid} not found — may have already stopped`);\n } else {\n logError(`Failed to stop process ${pid}: ${err}`);\n }\n }\n\n // Clean up PID file\n try {\n fs.unlinkSync(pidPath);\n } catch {}\n });\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { header, bullet, info, getServerPid, isServerRunning, getBaseUrl, apiGet } from \"../utils.js\";\nimport { loadConfig } from \"../../config/index.js\";\n\nexport function statusCommand(): Command {\n return new Command(\"status\")\n .description(\"Show server and layer health status\")\n .option(\"-p, --port <port>\", \"Server port to check\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (opts) => {\n header(\"Status\");\n\n let config;\n try {\n config = await loadConfig(opts.config);\n } catch {\n config = null;\n }\n\n const port = opts.port ? parseInt(opts.port, 10) : config?.port || 7777;\n const baseUrl = getBaseUrl(port);\n const pid = getServerPid();\n const running = await isServerRunning(baseUrl);\n\n // Server status\n if (running && pid) {\n bullet(\"Server\", `Running (PID ${pid}, port ${port})`, \"ok\");\n } else if (running) {\n bullet(\"Server\", `Running (port ${port})`, \"ok\");\n } else if (pid) {\n bullet(\"Server\", `PID file exists (${pid}) but not responding`, \"error\");\n } else {\n bullet(\"Server\", \"Not running\", \"disabled\");\n }\n\n if (config) {\n bullet(\"Tier\", config.tier, undefined);\n }\n\n console.log();\n\n // If server is running, get health from API\n if (running) {\n try {\n const health = await apiGet(baseUrl, \"/api/health\", config?.auth?.token) as Record<string, unknown>;\n\n info(\"Layers:\");\n const sqliteStatus = health.sqlite === \"ok\" ? \"ok\" as const : \"error\" as const;\n bullet(\"L1 SQLite\", String(health.sqlite), sqliteStatus);\n\n if (health.qdrant !== \"disabled\") {\n const qdrantStatus = health.qdrant === \"ok\" ? \"ok\" as const : \"error\" as const;\n bullet(\"L2 Qdrant\", String(health.qdrant), qdrantStatus);\n } else {\n bullet(\"L2 Qdrant\", \"disabled\", \"disabled\");\n }\n\n if (health.age !== \"disabled\") {\n const ageStatus = health.age === \"ok\" ? \"ok\" as const : \"error\" as const;\n bullet(\"L3 AGE\", String(health.age), ageStatus);\n } else {\n bullet(\"L3 AGE\", \"disabled\", \"disabled\");\n }\n\n if (health.uptime !== undefined) {\n const uptime = formatUptime(Number(health.uptime));\n console.log();\n info(`Uptime: ${uptime}`);\n }\n } catch (error) {\n info(\"Could not fetch health status from server\");\n }\n } else {\n // Server not running — try direct layer checks\n if (config) {\n info(\"Server not running. Checking layers directly...\");\n console.log();\n\n // SQLite — always available\n bullet(\"L1 SQLite\", config.sqlite.path, \"ok\");\n\n // Qdrant\n if (config.qdrant) {\n try {\n const res = await fetch(`${config.qdrant.url}/collections`, {\n signal: AbortSignal.timeout(2000),\n });\n bullet(\"L2 Qdrant\", config.qdrant.url, res.ok ? \"ok\" : \"error\");\n } catch {\n bullet(\"L2 Qdrant\", `${config.qdrant.url} (unreachable)`, \"error\");\n }\n } else {\n bullet(\"L2 Qdrant\", \"not configured\", \"disabled\");\n }\n\n // AGE\n if (config.age) {\n try {\n const net = await import(\"node:net\");\n const reachable = await new Promise<boolean>((resolve) => {\n const socket = new net.Socket();\n socket.setTimeout(2000);\n socket.connect(config!.age!.port, config!.age!.host, () => {\n socket.destroy();\n resolve(true);\n });\n socket.on(\"error\", () => resolve(false));\n socket.on(\"timeout\", () => { socket.destroy(); resolve(false); });\n });\n bullet(\"L3 AGE\", `${config.age.host}:${config.age.port}`, reachable ? \"ok\" : \"error\");\n } catch {\n bullet(\"L3 AGE\", \"unreachable\", \"error\");\n }\n } else {\n bullet(\"L3 AGE\", \"not configured\", \"disabled\");\n }\n }\n }\n\n console.log();\n });\n}\n\nfunction formatUptime(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = seconds % 60;\n if (h > 0) return `${h}h ${m}m`;\n if (m > 0) return `${m}m ${s}s`;\n return `${s}s`;\n}\n","import { Command } from \"commander\";\nimport { output, readStdin, apiPost, isServerRunning, getBaseUrl } from \"../utils.js\";\nimport { loadConfig } from \"../../config/index.js\";\n\nexport function storeCommand(): Command {\n return new Command(\"store\")\n .description(\"Store a new memory\")\n .argument(\"[content]\", \"Memory content (or pipe via stdin)\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .requiredOption(\"--scope <scope>\", \"Memory scope (user, agent, global, project, session)\")\n .option(\"--subject <id>\", \"Subject ID\")\n .option(\"--tags <tags>\", \"Comma-separated tags\")\n .option(\"--source <source>\", \"Memory source\", \"explicit\")\n .option(\"--no-extract\", \"Skip entity extraction\")\n .option(\"--format <fmt>\", \"Output format (json, text)\", \"json\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (contentArg, opts) => {\n const content = contentArg || await readStdin();\n if (!content) {\n console.error(\"Error: content is required (pass as argument or pipe via stdin)\");\n process.exit(1);\n }\n\n const config = await loadConfig(opts.config);\n const baseUrl = getBaseUrl(config.port);\n const serverUp = await isServerRunning(baseUrl);\n\n const body = {\n agent_id: opts.agent,\n scope: opts.scope,\n subject_id: opts.subject || null,\n content,\n tags: opts.tags ? opts.tags.split(\",\").map((t: string) => t.trim()) : [],\n source: opts.source,\n extract_entities: opts.extract !== false,\n };\n\n if (serverUp) {\n // Use HTTP API\n const result = await apiPost(baseUrl, \"/api/memories\", body, config.auth.token);\n output(result, opts.format);\n } else {\n // Direct mode — instantiate MemoryService in-process\n const { MemoryService } = await import(\"../../core/memory-service.js\");\n const service = new MemoryService();\n await service.init();\n\n try {\n const result = await service.store({\n agentId: opts.agent,\n scope: opts.scope,\n subjectId: opts.subject || null,\n content,\n tags: body.tags,\n source: opts.source,\n extractEntities: opts.extract !== false,\n });\n output(result, opts.format);\n } finally {\n await service.close();\n }\n }\n });\n}\n","import { Command } from \"commander\";\nimport { output, apiPost, isServerRunning, getBaseUrl } from \"../utils.js\";\nimport { loadConfig } from \"../../config/index.js\";\n\nexport function searchCommand(): Command {\n const cmd = new Command(\"search\")\n .description(\"Search memories\");\n\n // Default search (smart auto-select)\n cmd\n .argument(\"<query>\", \"Search query\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--limit <n>\", \"Max results\", \"10\")\n .option(\"--strategy <s>\", \"Search strategy (auto, semantic, fulltext, graph, all)\", \"auto\")\n .option(\"--scopes <scopes>\", \"Comma-separated scopes\")\n .option(\"--subject <id>\", \"Subject ID filter\")\n .option(\"--cross-agent\", \"Search across all agents\")\n .option(\"--no-graph\", \"Exclude graph results\")\n .option(\"--recall\", \"Format output for LLM context injection\")\n .option(\"--format <fmt>\", \"Output format (json, text)\", \"json\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (query, opts) => {\n const config = await loadConfig(opts.config);\n const baseUrl = getBaseUrl(config.port);\n const serverUp = await isServerRunning(baseUrl);\n\n const body = {\n agent_id: opts.agent,\n query,\n limit: parseInt(opts.limit, 10),\n strategy: opts.strategy,\n scopes: opts.scopes ? opts.scopes.split(\",\") : undefined,\n subject_id: opts.subject || null,\n cross_agent: opts.crossAgent || false,\n include_graph: opts.graph !== false,\n };\n\n let result: unknown;\n if (serverUp) {\n result = await apiPost(baseUrl, \"/api/search\", body, config.auth.token);\n } else {\n const { MemoryService } = await import(\"../../core/memory-service.js\");\n const service = new MemoryService();\n await service.init();\n try {\n result = await service.search({\n agentId: opts.agent,\n query,\n limit: parseInt(opts.limit, 10),\n strategy: opts.strategy,\n scopes: opts.scopes ? opts.scopes.split(\",\") : undefined,\n subjectId: opts.subject || null,\n crossAgent: opts.crossAgent || false,\n includeGraph: opts.graph !== false,\n });\n } finally {\n await service.close();\n }\n }\n\n // Recall mode — format for LLM\n if (opts.recall) {\n const data = result as { results?: Array<{ memory: { content: string; scope: string; created_at: string } }> };\n if (data.results && data.results.length > 0) {\n console.log(\"## Relevant Memories\");\n for (const r of data.results) {\n const date = new Date(r.memory.created_at).toLocaleDateString();\n console.log(`- ${r.memory.content} (${r.memory.scope}, ${date})`);\n }\n } else {\n console.log(\"No relevant memories found.\");\n }\n } else {\n output(result, opts.format);\n }\n });\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport { output, apiPost, isServerRunning, getBaseUrl, success, info, header } from \"../utils.js\";\nimport { loadConfig } from \"../../config/index.js\";\n\nexport function migrateCommand(): Command {\n return new Command(\"migrate\")\n .description(\"Import memories from markdown files\")\n .requiredOption(\"--paths <paths>\", \"Comma-separated file paths\")\n .requiredOption(\"--agent <id>\", \"Agent ID\")\n .option(\"--dry-run\", \"Preview without writing\")\n .option(\"--format <fmt>\", \"Output format (json, text)\", \"json\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (opts) => {\n const config = await loadConfig(opts.config);\n const baseUrl = getBaseUrl(config.port);\n const serverUp = await isServerRunning(baseUrl);\n\n const paths = opts.paths.split(\",\").map((p: string) => p.trim());\n\n if (opts.dryRun) {\n header(\"Migration (dry run)\");\n }\n\n const body = {\n markdown_paths: paths,\n agent_id: opts.agent,\n dry_run: opts.dryRun || false,\n };\n\n let result: unknown;\n if (serverUp) {\n result = await apiPost(baseUrl, \"/api/admin/migrate-markdown\", body, config.auth.token);\n } else {\n // Direct mode\n const { MemoryService } = await import(\"../../core/memory-service.js\");\n const service = new MemoryService();\n await service.init();\n try {\n const migrated = await service.migrateMarkdown(paths, opts.agent);\n result = migrated;\n } finally {\n await service.close();\n }\n }\n\n if (opts.format === \"text\") {\n const data = result as { migrated?: number; skipped?: number; errors?: string[] };\n if (data.migrated !== undefined) {\n success(`Migrated ${data.migrated} memories`);\n }\n if (data.skipped) {\n info(`Skipped ${data.skipped} sections`);\n }\n if (data.errors && data.errors.length > 0) {\n for (const err of data.errors) {\n console.error(` ✗ ${err}`);\n }\n }\n } else {\n output(result, opts.format);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { execSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { header, success, info, warn, error as logError } from \"../utils.js\";\nimport { getDataDir, loadConfig } from \"../../config/index.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport function infraCommand(): Command {\n const infra = new Command(\"infra\")\n .description(\"Manage Docker infrastructure\");\n\n infra\n .command(\"up\")\n .description(\"Start Docker containers for the configured tier\")\n .option(\"--tier <tier>\", \"Override tier (standard, full)\")\n .action(async (opts) => {\n header(\"Infrastructure Up\");\n\n let tier = opts.tier;\n if (!tier) {\n try {\n const config = await loadConfig();\n tier = config.tier;\n } catch {\n tier = \"standard\";\n }\n }\n\n if (tier === \"lite\") {\n info(\"Lite tier uses only SQLite — no Docker infrastructure needed.\");\n return;\n }\n\n const templateFile = tier === \"full\" ? \"full.yml\" : \"standard.yml\";\n const templatePath = findTemplate(templateFile);\n\n if (!templatePath) {\n logError(`Template not found: ${templateFile}`);\n logError(\"Expected in ./docker/ or ./templates/ directory\");\n process.exit(1);\n }\n\n const dataDir = getDataDir();\n fs.mkdirSync(dataDir, { recursive: true });\n\n const targetPath = path.join(dataDir, \"docker-compose.yml\");\n fs.copyFileSync(templatePath, targetPath);\n info(`Using template: ${templatePath}`);\n\n try {\n execSync(`docker compose -f ${targetPath} up -d`, {\n stdio: \"inherit\",\n cwd: dataDir,\n });\n success(\"Docker containers started\");\n } catch (error) {\n logError(\"Failed to start Docker containers\");\n logError(\"Make sure Docker is installed and running\");\n process.exit(1);\n }\n });\n\n infra\n .command(\"down\")\n .description(\"Stop Docker containers\")\n .action(async () => {\n header(\"Infrastructure Down\");\n\n const dataDir = getDataDir();\n const composePath = path.join(dataDir, \"docker-compose.yml\");\n\n if (!fs.existsSync(composePath)) {\n warn(\"No docker-compose.yml found in data directory\");\n return;\n }\n\n try {\n execSync(`docker compose -f ${composePath} down`, {\n stdio: \"inherit\",\n cwd: dataDir,\n });\n success(\"Docker containers stopped\");\n } catch (error) {\n logError(\"Failed to stop Docker containers\");\n process.exit(1);\n }\n });\n\n infra\n .command(\"status\")\n .description(\"Show Docker container status\")\n .action(async () => {\n header(\"Infrastructure Status\");\n\n const dataDir = getDataDir();\n const composePath = path.join(dataDir, \"docker-compose.yml\");\n\n if (!fs.existsSync(composePath)) {\n info(\"No docker-compose.yml found — infrastructure not set up\");\n info(\"Run: openclaw-memory infra up\");\n return;\n }\n\n try {\n execSync(`docker compose -f ${composePath} ps`, {\n stdio: \"inherit\",\n cwd: dataDir,\n });\n } catch {\n logError(\"Failed to get container status\");\n }\n });\n\n return infra;\n}\n\nfunction findTemplate(filename: string): string | null {\n const searchPaths = [\n path.join(process.cwd(), \"docker\", filename),\n path.join(process.cwd(), \"templates\", filename),\n // Look in the package's installed location\n path.join(__dirname, \"../../docker\", filename),\n path.join(__dirname, \"../../templates\", filename),\n ];\n\n for (const p of searchPaths) {\n if (fs.existsSync(p)) return p;\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;;AAEA,SAAS,WAAAA,gBAAe;;;ACFxB,SAAS,eAAe;AACxB,OAAOC,SAAQ;AACf,OAAO,UAAU;;;ACFjB,OAAO,QAAQ;AACf,OAAO,QAAQ;AASR,SAAS,KAAK,KAAmB;AACtC,UAAQ,IAAI,GAAG,KAAK,QAAG,IAAI,MAAM,GAAG;AACtC;AAEO,SAAS,QAAQ,KAAmB;AACzC,UAAQ,IAAI,GAAG,MAAM,QAAG,IAAI,MAAM,GAAG;AACvC;AAEO,SAAS,KAAK,KAAmB;AACtC,UAAQ,IAAI,GAAG,OAAO,QAAG,IAAI,MAAM,GAAG;AACxC;AAEO,SAAS,MAAM,KAAmB;AACvC,UAAQ,MAAM,GAAG,IAAI,QAAG,IAAI,MAAM,GAAG;AACvC;AAEO,SAAS,OAAO,OAAqB;AAC1C,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,KAAK,sCAA0B,KAAK,EAAE,CAAC;AACtD,UAAQ,IAAI;AACd;AAEO,SAAS,OAAO,OAAe,OAAe,QAAyD;AAC5G,QAAM,MAAM,WAAW,OAAO,GAAG,MAAM,QAAG,IACtC,WAAW,UAAU,GAAG,IAAI,QAAG,IAC/B,WAAW,aAAa,GAAG,OAAO,QAAG,IACrC,WAAW,aAAa,GAAG,IAAI,QAAG,IAClC;AACJ,UAAQ,IAAI,KAAK,GAAG,IAAI,GAAG,KAAK,KAAK,CAAC,KAAK,KAAK,EAAE;AACpD;AAIO,SAAS,eAA8B;AAC5C,QAAM,UAAU,eAAe;AAC/B,MAAI,CAAC,GAAG,WAAW,OAAO,EAAG,QAAO;AAEpC,MAAI;AACF,UAAM,MAAM,SAAS,GAAG,aAAa,SAAS,OAAO,EAAE,KAAK,GAAG,EAAE;AACjE,QAAI,MAAM,GAAG,EAAG,QAAO;AAGvB,QAAI;AACF,cAAQ,KAAK,KAAK,CAAC;AACnB,aAAO;AAAA,IACT,QAAQ;AAEN,SAAG,WAAW,OAAO;AACrB,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,gBAAgB,UAAkB,yBAA2C;AACjG,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,OAAO,eAAe;AAAA,MAC/C,QAAQ,YAAY,QAAQ,GAAI;AAAA,IAClC,CAAC;AACD,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,MAAuB;AAChD,SAAO,oBAAoB,QAAQ,IAAI;AACzC;AAIA,eAAsB,OAAO,SAAiBC,OAAc,OAAkC;AAC5F,QAAM,UAAkC,CAAC;AACzC,MAAI,MAAO,SAAQ,gBAAgB,UAAU,KAAK;AAElD,QAAM,MAAM,MAAM,MAAM,GAAG,OAAO,GAAGA,KAAI,IAAI,EAAE,QAAQ,CAAC;AACxD,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,IAAI,MAAM,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;AAAA,EAC/C;AACA,SAAO,IAAI,KAAK;AAClB;AAEA,eAAsB,QAAQ,SAAiBA,OAAc,MAAe,OAAkC;AAC5G,QAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,MAAI,MAAO,SAAQ,gBAAgB,UAAU,KAAK;AAElD,QAAM,MAAM,MAAM,MAAM,GAAG,OAAO,GAAGA,KAAI,IAAI;AAAA,IAC3C,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AACD,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,IAAI,MAAM,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;AAAA,EAC/C;AACA,SAAO,IAAI,KAAK;AAClB;AAmBO,SAAS,OAAO,MAAe,SAA0B,QAAc;AAC5E,MAAI,WAAW,QAAQ;AACrB,YAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,EAC3C,OAAO;AACL,YAAQ,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA,EAClC;AACF;AAIA,eAAsB,YAA6B;AACjD,MAAI,QAAQ,MAAM,MAAO,QAAO;AAChC,QAAM,SAAmB,CAAC;AAC1B,mBAAiB,SAAS,QAAQ,OAAO;AACvC,WAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,EAChC;AACA,SAAO,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO,EAAE,KAAK;AACtD;;;AD1IO,SAAS,cAAuB;AACrC,SAAO,IAAI,QAAQ,MAAM,EACtB,YAAY,0BAA0B,EACtC,OAAO,iBAAiB,+BAA+B,EACvD,OAAO,qBAAqB,oCAAoC,EAChE,OAAO,OAAO,SAAS;AACtB,WAAO,cAAc;AAGrB,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAM,UAAU,WAAW;AAC3B,UAAM,aAAa,qBAAqB;AAGxC,IAAAC,IAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACzC,SAAK,mBAAmB,OAAO,EAAE;AAGjC,QAAI,kBAAkB;AACtB,QAAI,eAAe;AAEnB,QAAI,SAAS,QAAQ;AACnB,WAAK,iCAAiC;AACtC,UAAI;AACF,cAAM,MAAM,MAAM,MAAM,qCAAqC;AAAA,UAC3D,QAAQ,YAAY,QAAQ,GAAI;AAAA,QAClC,CAAC;AACD,0BAAkB,IAAI;AAAA,MACxB,QAAQ;AAAA,MAAsB;AAE9B,UAAI,iBAAiB;AACnB,gBAAQ,8CAA8C;AAAA,MACxD,OAAO;AACL,aAAK,+CAA+C;AAAA,MACtD;AAAA,IACF;AAEA,QAAI,SAAS,QAAQ;AACnB,WAAK,yCAAyC;AAC9C,UAAI;AAEF,cAAM,MAAM,MAAM,OAAO,KAAU;AACnC,uBAAe,MAAM,IAAI,QAAiB,CAAC,YAAY;AACrD,gBAAM,SAAS,IAAI,IAAI,OAAO;AAC9B,iBAAO,WAAW,GAAI;AACtB,iBAAO,QAAQ,MAAM,aAAa,MAAM;AACtC,mBAAO,QAAQ;AACf,oBAAQ,IAAI;AAAA,UACd,CAAC;AACD,iBAAO,GAAG,SAAS,MAAM,QAAQ,KAAK,CAAC;AACvC,iBAAO,GAAG,WAAW,MAAM;AAAE,mBAAO,QAAQ;AAAG,oBAAQ,KAAK;AAAA,UAAG,CAAC;AAAA,QAClE,CAAC;AAAA,MACH,QAAQ;AAAA,MAAsB;AAE9B,UAAI,cAAc;AAChB,gBAAQ,2CAA2C;AAAA,MACrD,OAAO;AACL,aAAK,4CAA4C;AAAA,MACnD;AAAA,IACF;AAGA,QAAI,gBAAgB;AACpB,QAAI,SAAS,UAAU,CAAC,cAAc;AACpC,sBAAgB,kBAAkB,aAAa;AAC/C,WAAK,kBAAkB,aAAa,8BAA8B;AAAA,IACpE,WAAW,SAAS,cAAc,CAAC,iBAAiB;AAClD,sBAAgB;AAChB,WAAK,iDAAiD;AAAA,IACxD;AAGA,UAAM,gBAAgB,eAAe,eAAe,UAAU;AAC9D,UAAM,aAAa,KAAK,KAAK,QAAQ,IAAI,GAAG,2BAA2B;AAEvE,IAAAA,IAAG,cAAc,YAAY,eAAe,OAAO;AACnD,YAAQ,qBAAqB,UAAU,EAAE;AAGzC,UAAM,aAAa,mBAAmB,aAAa;AACnD,UAAM,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG,cAAc;AACvD,IAAAA,IAAG,cAAc,SAAS,YAAY,OAAO;AAC7C,YAAQ,mCAAmC,OAAO,EAAE;AAEpD,YAAQ,IAAI;AACZ,SAAK,aAAa;AAClB,YAAQ,IAAI,gDAAgD;AAC5D,YAAQ,IAAI,gDAAgD;AAC5D,YAAQ,IAAI;AAAA,EACd,CAAC;AACL;AAEA,SAAS,eAAe,MAAc,YAA4B;AAChE,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,IAAI;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,SAAS,cAAc,SAAS,QAAQ;AAC1C,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,6DAA6D;AACxE,UAAM,KAAK,sCAAsC;AACjD,UAAM,KAAK,MAAM;AACjB,UAAM,KAAK,gBAAgB;AAC3B,UAAM,KAAK,+CAA+C;AAC1D,UAAM,KAAK,sCAAsC;AACjD,UAAM,KAAK,uBAAuB;AAClC,UAAM,KAAK,MAAM;AACjB,UAAM,KAAK,iBAAiB;AAC5B,UAAM,KAAK,+CAA+C;AAC1D,UAAM,KAAK,0BAA0B;AACrC,UAAM,KAAK,oBAAoB;AAC/B,UAAM,KAAK,MAAM;AAAA,EACnB;AAEA,MAAI,SAAS,QAAQ;AACnB,UAAM,KAAK,UAAU;AACrB,UAAM,KAAK,8CAA8C;AACzD,UAAM,KAAK,uDAAuD;AAClE,UAAM,KAAK,6CAA6C;AACxD,UAAM,KAAK,6CAA6C;AACxD,UAAM,KAAK,yDAAyD;AACpE,UAAM,KAAK,4BAA4B;AACvC,UAAM,KAAK,MAAM;AAAA,EACnB;AAEA,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AAEb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,mBAAmB,MAAsB;AAChD,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,SAAS,cAAc,SAAS,QAAQ;AAC1C,UAAM,KAAK,+BAA+B;AAC1C,UAAM,KAAK,kCAAkC;AAC7C,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,sBAAsB;AACjC,UAAM,KAAK,iCAAiC;AAC5C,UAAM,KAAK,0CAA0C;AACrD,UAAM,KAAK,gDAAgD;AAC3D,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,qBAAqB;AAChC,UAAM,KAAK,+BAA+B;AAC1C,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,SAAS,QAAQ;AACnB,UAAM,KAAK,uCAAuC;AAClD,UAAM,KAAK,kBAAkB;AAC7B,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,iBAAiB;AAC5B,UAAM,KAAK,0BAA0B;AACrC,UAAM,KAAK,yBAAyB;AACpC,UAAM,KAAK,0BAA0B;AACrC,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AE7LA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,SAAQ;AACf,SAAS,aAAa;AAIf,SAAS,eAAwB;AACtC,SAAO,IAAIC,SAAQ,OAAO,EACvB,YAAY,uBAAuB,EACnC,OAAO,qBAAqB,aAAa,EACzC,OAAO,QAAQ,iCAAiC,EAChD,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,OAAO,SAAS;AACtB,QAAI,KAAK,IAAI;AACX,YAAM,gBAAgB,IAAI;AAAA,IAC5B,OAAO;AACL,YAAM,gBAAgB,IAAI;AAAA,IAC5B;AAAA,EACF,CAAC;AACL;AAEA,eAAe,gBAAgB,MAAyD;AAEtF,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,uBAAuB,KAAK;AACxC,YAAQ,IAAI,OAAO,KAAK;AAAA,EAC1B;AAGA,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,cAAiB;AACvD,QAAM,EAAE,KAAK,OAAO,IAAI,MAAM,aAAa,KAAK,MAAM;AAEtD,QAAM,OAAO,KAAK,OAAO,SAAS,KAAK,MAAM,EAAE,IAAI,OAAO;AAC1D,MAAI,OAAO,IAAI;AAEf,UAAQ,IAAI,wCAAwC,IAAI,EAAE;AAG1D,QAAM,UAAU,WAAW;AAC3B,EAAAC,IAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACzC,EAAAA,IAAG,cAAc,eAAe,GAAG,OAAO,QAAQ,GAAG,GAAG,OAAO;AAE/D,QAAM,UAAU,MAAM;AACpB,QAAI;AAAE,MAAAA,IAAG,WAAW,eAAe,CAAC;AAAA,IAAG,QAAQ;AAAA,IAAC;AAChD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,UAAU,OAAO;AAC5B,UAAQ,GAAG,WAAW,OAAO;AAC/B;AAEA,eAAe,gBAAgB,MAAyD;AACtF,SAAO,8BAA8B;AAErC,QAAM,UAAU,WAAW;AAC3B,EAAAA,IAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAGzC,QAAM,OAAO,CAAC,OAAO,eAAe;AACpC,QAAM,MAAM,EAAE,GAAG,QAAQ,IAAI;AAE7B,MAAI,KAAK,MAAM;AACb,QAAI,uBAAuB,KAAK;AAChC,QAAI,OAAO,KAAK;AAAA,EAClB;AAGA,QAAM,UAAU,OAAO,QAAQ,cAAc,QAAQ;AACrD,QAAM,WAAW,YAAY,QAAQ,QAAQ,QAAQ;AACrD,QAAM,WAAW,YAAY,QAAQ,OAAO,CAAC,YAAY,OAAO,GAAG,IAAI;AAEvE,QAAM,QAAQ,MAAM,UAAU,UAAU;AAAA,IACtC;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK,QAAQ,IAAI;AAAA,EACnB,CAAC;AAED,QAAM,MAAM;AAEZ,MAAI,MAAM,KAAK;AACb,IAAAA,IAAG,cAAc,eAAe,GAAG,OAAO,MAAM,GAAG,GAAG,OAAO;AAC7D,YAAQ,sCAAsC,MAAM,GAAG,GAAG;AAC1D,SAAK,aAAa,eAAe,CAAC,EAAE;AACpC,SAAK,iCAAiC;AAAA,EACxC,OAAO;AACL,UAAS,wBAAwB;AACjC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACzFA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,SAAQ;AAIR,SAAS,cAAuB;AACrC,SAAO,IAAIC,SAAQ,MAAM,EACtB,YAAY,yBAAyB,EACrC,OAAO,YAAY;AAClB,WAAO,iBAAiB;AAExB,UAAM,UAAU,eAAe;AAC/B,QAAI,CAACC,IAAG,WAAW,OAAO,GAAG;AAC3B,WAAK,oDAA+C;AACpD;AAAA,IACF;AAEA,UAAM,SAASA,IAAG,aAAa,SAAS,OAAO,EAAE,KAAK;AACtD,UAAM,MAAM,SAAS,QAAQ,EAAE;AAE/B,QAAI,MAAM,GAAG,GAAG;AACd,YAAS,kBAAkB,OAAO,KAAK,MAAM,EAAE;AAC/C;AAAA,IACF;AAEA,QAAI;AAEF,cAAQ,KAAK,KAAK,SAAS;AAC3B,cAAQ,uBAAuB,GAAG,EAAE;AAGpC,UAAI,QAAQ;AACZ,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC3C,YAAI;AACF,kBAAQ,KAAK,KAAK,CAAC;AAAA,QACrB,QAAQ;AACN,kBAAQ;AACR;AAAA,QACF;AAAA,MACF;AAEA,UAAI,OAAO;AACT,aAAK,oDAAoD;AACzD,YAAI;AACF,kBAAQ,KAAK,KAAK,SAAS;AAAA,QAC7B,QAAQ;AAAA,QAAC;AAAA,MACX;AAEA,cAAQ,gBAAgB;AAAA,IAC1B,SAAS,KAAc;AACrB,UAAK,IAA8B,SAAS,SAAS;AACnD,aAAK,WAAW,GAAG,4CAAuC;AAAA,MAC5D,OAAO;AACL,cAAS,0BAA0B,GAAG,KAAK,GAAG,EAAE;AAAA,MAClD;AAAA,IACF;AAGA,QAAI;AACF,MAAAA,IAAG,WAAW,OAAO;AAAA,IACvB,QAAQ;AAAA,IAAC;AAAA,EACX,CAAC;AACL;;;AC/DA,SAAS,WAAAC,gBAAe;AAKjB,SAAS,gBAAyB;AACvC,SAAO,IAAIC,SAAQ,QAAQ,EACxB,YAAY,qCAAqC,EACjD,OAAO,qBAAqB,sBAAsB,EAClD,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,OAAO,SAAS;AACtB,WAAO,QAAQ;AAEf,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,WAAW,KAAK,MAAM;AAAA,IACvC,QAAQ;AACN,eAAS;AAAA,IACX;AAEA,UAAM,OAAO,KAAK,OAAO,SAAS,KAAK,MAAM,EAAE,IAAI,QAAQ,QAAQ;AACnE,UAAM,UAAU,WAAW,IAAI;AAC/B,UAAM,MAAM,aAAa;AACzB,UAAM,UAAU,MAAM,gBAAgB,OAAO;AAG7C,QAAI,WAAW,KAAK;AAClB,aAAO,UAAU,gBAAgB,GAAG,UAAU,IAAI,KAAK,IAAI;AAAA,IAC7D,WAAW,SAAS;AAClB,aAAO,UAAU,iBAAiB,IAAI,KAAK,IAAI;AAAA,IACjD,WAAW,KAAK;AACd,aAAO,UAAU,oBAAoB,GAAG,wBAAwB,OAAO;AAAA,IACzE,OAAO;AACL,aAAO,UAAU,eAAe,UAAU;AAAA,IAC5C;AAEA,QAAI,QAAQ;AACV,aAAO,QAAQ,OAAO,MAAM,MAAS;AAAA,IACvC;AAEA,YAAQ,IAAI;AAGZ,QAAI,SAAS;AACX,UAAI;AACF,cAAM,SAAS,MAAM,OAAO,SAAS,eAAe,QAAQ,MAAM,KAAK;AAEvE,aAAK,SAAS;AACd,cAAM,eAAe,OAAO,WAAW,OAAO,OAAgB;AAC9D,eAAO,aAAa,OAAO,OAAO,MAAM,GAAG,YAAY;AAEvD,YAAI,OAAO,WAAW,YAAY;AAChC,gBAAM,eAAe,OAAO,WAAW,OAAO,OAAgB;AAC9D,iBAAO,aAAa,OAAO,OAAO,MAAM,GAAG,YAAY;AAAA,QACzD,OAAO;AACL,iBAAO,aAAa,YAAY,UAAU;AAAA,QAC5C;AAEA,YAAI,OAAO,QAAQ,YAAY;AAC7B,gBAAM,YAAY,OAAO,QAAQ,OAAO,OAAgB;AACxD,iBAAO,UAAU,OAAO,OAAO,GAAG,GAAG,SAAS;AAAA,QAChD,OAAO;AACL,iBAAO,UAAU,YAAY,UAAU;AAAA,QACzC;AAEA,YAAI,OAAO,WAAW,QAAW;AAC/B,gBAAM,SAAS,aAAa,OAAO,OAAO,MAAM,CAAC;AACjD,kBAAQ,IAAI;AACZ,eAAK,WAAW,MAAM,EAAE;AAAA,QAC1B;AAAA,MACF,SAASC,QAAO;AACd,aAAK,2CAA2C;AAAA,MAClD;AAAA,IACF,OAAO;AAEL,UAAI,QAAQ;AACV,aAAK,iDAAiD;AACtD,gBAAQ,IAAI;AAGZ,eAAO,aAAa,OAAO,OAAO,MAAM,IAAI;AAG5C,YAAI,OAAO,QAAQ;AACjB,cAAI;AACF,kBAAM,MAAM,MAAM,MAAM,GAAG,OAAO,OAAO,GAAG,gBAAgB;AAAA,cAC1D,QAAQ,YAAY,QAAQ,GAAI;AAAA,YAClC,CAAC;AACD,mBAAO,aAAa,OAAO,OAAO,KAAK,IAAI,KAAK,OAAO,OAAO;AAAA,UAChE,QAAQ;AACN,mBAAO,aAAa,GAAG,OAAO,OAAO,GAAG,kBAAkB,OAAO;AAAA,UACnE;AAAA,QACF,OAAO;AACL,iBAAO,aAAa,kBAAkB,UAAU;AAAA,QAClD;AAGA,YAAI,OAAO,KAAK;AACd,cAAI;AACF,kBAAM,MAAM,MAAM,OAAO,KAAU;AACnC,kBAAM,YAAY,MAAM,IAAI,QAAiB,CAAC,YAAY;AACxD,oBAAM,SAAS,IAAI,IAAI,OAAO;AAC9B,qBAAO,WAAW,GAAI;AACtB,qBAAO,QAAQ,OAAQ,IAAK,MAAM,OAAQ,IAAK,MAAM,MAAM;AACzD,uBAAO,QAAQ;AACf,wBAAQ,IAAI;AAAA,cACd,CAAC;AACD,qBAAO,GAAG,SAAS,MAAM,QAAQ,KAAK,CAAC;AACvC,qBAAO,GAAG,WAAW,MAAM;AAAE,uBAAO,QAAQ;AAAG,wBAAQ,KAAK;AAAA,cAAG,CAAC;AAAA,YAClE,CAAC;AACD,mBAAO,UAAU,GAAG,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,YAAY,OAAO,OAAO;AAAA,UACtF,QAAQ;AACN,mBAAO,UAAU,eAAe,OAAO;AAAA,UACzC;AAAA,QACF,OAAO;AACL,iBAAO,UAAU,kBAAkB,UAAU;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI;AAAA,EACd,CAAC;AACL;AAEA,SAAS,aAAa,SAAyB;AAC7C,QAAM,IAAI,KAAK,MAAM,UAAU,IAAI;AACnC,QAAM,IAAI,KAAK,MAAO,UAAU,OAAQ,EAAE;AAC1C,QAAM,IAAI,UAAU;AACpB,MAAI,IAAI,EAAG,QAAO,GAAG,CAAC,KAAK,CAAC;AAC5B,MAAI,IAAI,EAAG,QAAO,GAAG,CAAC,KAAK,CAAC;AAC5B,SAAO,GAAG,CAAC;AACb;;;ACnIA,SAAS,WAAAC,gBAAe;AAIjB,SAAS,eAAwB;AACtC,SAAO,IAAIC,SAAQ,OAAO,EACvB,YAAY,oBAAoB,EAChC,SAAS,aAAa,oCAAoC,EAC1D,eAAe,gBAAgB,UAAU,EACzC,eAAe,mBAAmB,sDAAsD,EACxF,OAAO,kBAAkB,YAAY,EACrC,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,qBAAqB,iBAAiB,UAAU,EACvD,OAAO,gBAAgB,wBAAwB,EAC/C,OAAO,kBAAkB,8BAA8B,MAAM,EAC7D,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,OAAO,YAAY,SAAS;AAClC,UAAM,UAAU,cAAc,MAAM,UAAU;AAC9C,QAAI,CAAC,SAAS;AACZ,cAAQ,MAAM,iEAAiE;AAC/E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,MAAM,WAAW,KAAK,MAAM;AAC3C,UAAM,UAAU,WAAW,OAAO,IAAI;AACtC,UAAM,WAAW,MAAM,gBAAgB,OAAO;AAE9C,UAAM,OAAO;AAAA,MACX,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,YAAY,KAAK,WAAW;AAAA,MAC5B;AAAA,MACA,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,IAAI,CAAC;AAAA,MACvE,QAAQ,KAAK;AAAA,MACb,kBAAkB,KAAK,YAAY;AAAA,IACrC;AAEA,QAAI,UAAU;AAEZ,YAAM,SAAS,MAAM,QAAQ,SAAS,iBAAiB,MAAM,OAAO,KAAK,KAAK;AAC9E,aAAO,QAAQ,KAAK,MAAM;AAAA,IAC5B,OAAO;AAEL,YAAM,EAAE,cAAc,IAAI,MAAM,OAAO,+BAA8B;AACrE,YAAM,UAAU,IAAI,cAAc;AAClC,YAAM,QAAQ,KAAK;AAEnB,UAAI;AACF,cAAM,SAAS,MAAM,QAAQ,MAAM;AAAA,UACjC,SAAS,KAAK;AAAA,UACd,OAAO,KAAK;AAAA,UACZ,WAAW,KAAK,WAAW;AAAA,UAC3B;AAAA,UACA,MAAM,KAAK;AAAA,UACX,QAAQ,KAAK;AAAA,UACb,iBAAiB,KAAK,YAAY;AAAA,QACpC,CAAC;AACD,eAAO,QAAQ,KAAK,MAAM;AAAA,MAC5B,UAAE;AACA,cAAM,QAAQ,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAC;AACL;;;AC/DA,SAAS,WAAAC,gBAAe;AAIjB,SAAS,gBAAyB;AACvC,QAAM,MAAM,IAAIC,SAAQ,QAAQ,EAC7B,YAAY,iBAAiB;AAGhC,MACG,SAAS,WAAW,cAAc,EAClC,eAAe,gBAAgB,UAAU,EACzC,OAAO,eAAe,eAAe,IAAI,EACzC,OAAO,kBAAkB,0DAA0D,MAAM,EACzF,OAAO,qBAAqB,wBAAwB,EACpD,OAAO,kBAAkB,mBAAmB,EAC5C,OAAO,iBAAiB,0BAA0B,EAClD,OAAO,cAAc,uBAAuB,EAC5C,OAAO,YAAY,yCAAyC,EAC5D,OAAO,kBAAkB,8BAA8B,MAAM,EAC7D,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,OAAO,OAAO,SAAS;AAC7B,UAAM,SAAS,MAAM,WAAW,KAAK,MAAM;AAC3C,UAAM,UAAU,WAAW,OAAO,IAAI;AACtC,UAAM,WAAW,MAAM,gBAAgB,OAAO;AAE9C,UAAM,OAAO;AAAA,MACX,UAAU,KAAK;AAAA,MACf;AAAA,MACA,OAAO,SAAS,KAAK,OAAO,EAAE;AAAA,MAC9B,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI;AAAA,MAC/C,YAAY,KAAK,WAAW;AAAA,MAC5B,aAAa,KAAK,cAAc;AAAA,MAChC,eAAe,KAAK,UAAU;AAAA,IAChC;AAEA,QAAI;AACJ,QAAI,UAAU;AACZ,eAAS,MAAM,QAAQ,SAAS,eAAe,MAAM,OAAO,KAAK,KAAK;AAAA,IACxE,OAAO;AACL,YAAM,EAAE,cAAc,IAAI,MAAM,OAAO,+BAA8B;AACrE,YAAM,UAAU,IAAI,cAAc;AAClC,YAAM,QAAQ,KAAK;AACnB,UAAI;AACF,iBAAS,MAAM,QAAQ,OAAO;AAAA,UAC5B,SAAS,KAAK;AAAA,UACd;AAAA,UACA,OAAO,SAAS,KAAK,OAAO,EAAE;AAAA,UAC9B,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI;AAAA,UAC/C,WAAW,KAAK,WAAW;AAAA,UAC3B,YAAY,KAAK,cAAc;AAAA,UAC/B,cAAc,KAAK,UAAU;AAAA,QAC/B,CAAC;AAAA,MACH,UAAE;AACA,cAAM,QAAQ,MAAM;AAAA,MACtB;AAAA,IACF;AAGA,QAAI,KAAK,QAAQ;AACf,YAAM,OAAO;AACb,UAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;AAC3C,gBAAQ,IAAI,sBAAsB;AAClC,mBAAW,KAAK,KAAK,SAAS;AAC5B,gBAAM,OAAO,IAAI,KAAK,EAAE,OAAO,UAAU,EAAE,mBAAmB;AAC9D,kBAAQ,IAAI,KAAK,EAAE,OAAO,OAAO,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,GAAG;AAAA,QAClE;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,6BAA6B;AAAA,MAC3C;AAAA,IACF,OAAO;AACL,aAAO,QAAQ,KAAK,MAAM;AAAA,IAC5B;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AC9EA,SAAS,WAAAC,gBAAe;AAIjB,SAAS,iBAA0B;AACxC,SAAO,IAAIC,SAAQ,SAAS,EACzB,YAAY,qCAAqC,EACjD,eAAe,mBAAmB,4BAA4B,EAC9D,eAAe,gBAAgB,UAAU,EACzC,OAAO,aAAa,yBAAyB,EAC7C,OAAO,kBAAkB,8BAA8B,MAAM,EAC7D,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,OAAO,SAAS;AACtB,UAAM,SAAS,MAAM,WAAW,KAAK,MAAM;AAC3C,UAAM,UAAU,WAAW,OAAO,IAAI;AACtC,UAAM,WAAW,MAAM,gBAAgB,OAAO;AAE9C,UAAM,QAAQ,KAAK,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAE/D,QAAI,KAAK,QAAQ;AACf,aAAO,qBAAqB;AAAA,IAC9B;AAEA,UAAM,OAAO;AAAA,MACX,gBAAgB;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,SAAS,KAAK,UAAU;AAAA,IAC1B;AAEA,QAAI;AACJ,QAAI,UAAU;AACZ,eAAS,MAAM,QAAQ,SAAS,+BAA+B,MAAM,OAAO,KAAK,KAAK;AAAA,IACxF,OAAO;AAEL,YAAM,EAAE,cAAc,IAAI,MAAM,OAAO,+BAA8B;AACrE,YAAM,UAAU,IAAI,cAAc;AAClC,YAAM,QAAQ,KAAK;AACnB,UAAI;AACF,cAAM,WAAW,MAAM,QAAQ,gBAAgB,OAAO,KAAK,KAAK;AAChE,iBAAS;AAAA,MACX,UAAE;AACA,cAAM,QAAQ,MAAM;AAAA,MACtB;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,QAAQ;AAC1B,YAAM,OAAO;AACb,UAAI,KAAK,aAAa,QAAW;AAC/B,gBAAQ,YAAY,KAAK,QAAQ,WAAW;AAAA,MAC9C;AACA,UAAI,KAAK,SAAS;AAChB,aAAK,WAAW,KAAK,OAAO,WAAW;AAAA,MACzC;AACA,UAAI,KAAK,UAAU,KAAK,OAAO,SAAS,GAAG;AACzC,mBAAW,OAAO,KAAK,QAAQ;AAC7B,kBAAQ,MAAM,YAAO,GAAG,EAAE;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ,KAAK,MAAM;AAAA,IAC5B;AAAA,EACF,CAAC;AACL;;;AC9DA,SAAS,WAAAC,gBAAe;AACxB,SAAS,gBAAgB;AACzB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,qBAAqB;AAI9B,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAYC,MAAK,QAAQ,UAAU;AAElC,SAAS,eAAwB;AACtC,QAAM,QAAQ,IAAIC,SAAQ,OAAO,EAC9B,YAAY,8BAA8B;AAE7C,QACG,QAAQ,IAAI,EACZ,YAAY,iDAAiD,EAC7D,OAAO,iBAAiB,gCAAgC,EACxD,OAAO,OAAO,SAAS;AACtB,WAAO,mBAAmB;AAE1B,QAAI,OAAO,KAAK;AAChB,QAAI,CAAC,MAAM;AACT,UAAI;AACF,cAAM,SAAS,MAAM,WAAW;AAChC,eAAO,OAAO;AAAA,MAChB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,SAAS,QAAQ;AACnB,WAAK,oEAA+D;AACpE;AAAA,IACF;AAEA,UAAM,eAAe,SAAS,SAAS,aAAa;AACpD,UAAM,eAAe,aAAa,YAAY;AAE9C,QAAI,CAAC,cAAc;AACjB,YAAS,uBAAuB,YAAY,EAAE;AAC9C,YAAS,iDAAiD;AAC1D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAU,WAAW;AAC3B,IAAAC,IAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAEzC,UAAM,aAAaF,MAAK,KAAK,SAAS,oBAAoB;AAC1D,IAAAE,IAAG,aAAa,cAAc,UAAU;AACxC,SAAK,mBAAmB,YAAY,EAAE;AAEtC,QAAI;AACF,eAAS,qBAAqB,UAAU,UAAU;AAAA,QAChD,OAAO;AAAA,QACP,KAAK;AAAA,MACP,CAAC;AACD,cAAQ,2BAA2B;AAAA,IACrC,SAASC,QAAO;AACd,YAAS,mCAAmC;AAC5C,YAAS,2CAA2C;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC,OAAO,YAAY;AAClB,WAAO,qBAAqB;AAE5B,UAAM,UAAU,WAAW;AAC3B,UAAM,cAAcH,MAAK,KAAK,SAAS,oBAAoB;AAE3D,QAAI,CAACE,IAAG,WAAW,WAAW,GAAG;AAC/B,WAAK,+CAA+C;AACpD;AAAA,IACF;AAEA,QAAI;AACF,eAAS,qBAAqB,WAAW,SAAS;AAAA,QAChD,OAAO;AAAA,QACP,KAAK;AAAA,MACP,CAAC;AACD,cAAQ,2BAA2B;AAAA,IACrC,SAASC,QAAO;AACd,YAAS,kCAAkC;AAC3C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C,OAAO,YAAY;AAClB,WAAO,uBAAuB;AAE9B,UAAM,UAAU,WAAW;AAC3B,UAAM,cAAcH,MAAK,KAAK,SAAS,oBAAoB;AAE3D,QAAI,CAACE,IAAG,WAAW,WAAW,GAAG;AAC/B,WAAK,8DAAyD;AAC9D,WAAK,+BAA+B;AACpC;AAAA,IACF;AAEA,QAAI;AACF,eAAS,qBAAqB,WAAW,OAAO;AAAA,QAC9C,OAAO;AAAA,QACP,KAAK;AAAA,MACP,CAAC;AAAA,IACH,QAAQ;AACN,YAAS,gCAAgC;AAAA,IAC3C;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,SAAS,aAAa,UAAiC;AACrD,QAAM,cAAc;AAAA,IAClBF,MAAK,KAAK,QAAQ,IAAI,GAAG,UAAU,QAAQ;AAAA,IAC3CA,MAAK,KAAK,QAAQ,IAAI,GAAG,aAAa,QAAQ;AAAA;AAAA,IAE9CA,MAAK,KAAK,WAAW,gBAAgB,QAAQ;AAAA,IAC7CA,MAAK,KAAK,WAAW,mBAAmB,QAAQ;AAAA,EAClD;AAEA,aAAW,KAAK,aAAa;AAC3B,QAAIE,IAAG,WAAW,CAAC,EAAG,QAAO;AAAA,EAC/B;AAEA,SAAO;AACT;;;AT1HA,IAAM,UAAU,IAAIE,SAAQ;AAE5B,QACG,KAAK,iBAAiB,EACtB,YAAY,gFAA2E,EACvF,QAAQ,OAAO;AAGlB,QAAQ,WAAW,YAAY,CAAC;AAChC,QAAQ,WAAW,aAAa,CAAC;AACjC,QAAQ,WAAW,YAAY,CAAC;AAChC,QAAQ,WAAW,cAAc,CAAC;AAClC,QAAQ,WAAW,aAAa,CAAC;AACjC,QAAQ,WAAW,cAAc,CAAC;AAClC,QAAQ,WAAW,eAAe,CAAC;AACnC,QAAQ,WAAW,aAAa,CAAC;AAEjC,QAAQ,MAAM;","names":["Command","fs","path","fs","Command","fs","Command","fs","Command","fs","Command","fs","Command","Command","error","Command","Command","Command","Command","Command","Command","Command","fs","path","path","Command","fs","error","Command"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkMQEBVCH5cjs = require('./chunk-MQEBVCH5.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
8
|
-
require('./chunk-
|
|
7
|
+
var _chunkL2KRIMDAcjs = require('./chunk-L2KRIMDA.cjs');
|
|
8
|
+
require('./chunk-HPGHPKK3.cjs');
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
var
|
|
13
|
+
var _chunkLA5OP5VIcjs = require('./chunk-LA5OP5VI.cjs');
|
|
14
14
|
|
|
15
15
|
// src/core/types.ts
|
|
16
16
|
var TIER_CAPABILITIES = {
|
|
@@ -44,5 +44,5 @@ var TIER_CAPABILITIES = {
|
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
|
|
47
|
-
exports.MemoryService =
|
|
47
|
+
exports.MemoryService = _chunkL2KRIMDAcjs.MemoryService; exports.TIER_CAPABILITIES = TIER_CAPABILITIES; exports.configSummary = _chunkLA5OP5VIcjs.configSummary; exports.createApp = _chunkMQEBVCH5cjs.createApp; exports.createServer = _chunkMQEBVCH5cjs.createServer; exports.defineConfig = _chunkLA5OP5VIcjs.defineConfig; exports.loadConfig = _chunkLA5OP5VIcjs.loadConfig;
|
|
48
48
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { R as ResolvedConfig, C as Config, S as StoreParams, a as StoreResult, M as Memory, U as UpdateParams, L as ListParams, b as SearchParams, c as SearchResponse, d as ConversationLogEntry, e as SummarizeResponse, H as HealthResponse, T as Tier, f as StorageOrchestrator, g as CreateMemoryResponse, E as ExtractionResult, h as SyncQueueItem } from './server-
|
|
2
|
-
export { i as CreateMemoryRequest, j as EntityType, k as ExtractedEntity, l as ExtractedRelationship, m as ListMemoriesQuery, n as MemoryScope, o as MemorySource, p as MigrateMarkdownRequest, q as RelationshipType, r as ScoredMemory, s as SearchRequest, t as SummarizeRequest, u as SyncStatus, v as TIER_CAPABILITIES, w as TierCapabilities, x as UpdateMemoryRequest, y as createServer } from './server-
|
|
1
|
+
import { R as ResolvedConfig, C as Config, S as StoreParams, a as StoreResult, M as Memory, U as UpdateParams, L as ListParams, b as SearchParams, c as SearchResponse, d as ConversationLogEntry, e as SummarizeResponse, H as HealthResponse, T as Tier, f as StorageOrchestrator, g as CreateMemoryResponse, E as ExtractionResult, h as SyncQueueItem } from './server-D-3OqU-T.cjs';
|
|
2
|
+
export { i as CreateMemoryRequest, j as EntityType, k as ExtractedEntity, l as ExtractedRelationship, m as ListMemoriesQuery, n as MemoryScope, o as MemorySource, p as MigrateMarkdownRequest, q as RelationshipType, r as ScoredMemory, s as SearchRequest, t as SummarizeRequest, u as SyncStatus, v as TIER_CAPABILITIES, w as TierCapabilities, x as UpdateMemoryRequest, y as createServer } from './server-D-3OqU-T.cjs';
|
|
3
3
|
import { Elysia } from 'elysia';
|
|
4
4
|
|
|
5
5
|
declare function loadConfig(configPath?: string): Promise<ResolvedConfig>;
|
|
@@ -649,6 +649,18 @@ declare function createApp(orchestrator: StorageOrchestrator, config: ResolvedCo
|
|
|
649
649
|
};
|
|
650
650
|
};
|
|
651
651
|
};
|
|
652
|
+
} & {
|
|
653
|
+
health: {
|
|
654
|
+
get: {
|
|
655
|
+
body: unknown;
|
|
656
|
+
params: {};
|
|
657
|
+
query: unknown;
|
|
658
|
+
headers: unknown;
|
|
659
|
+
response: {
|
|
660
|
+
200: HealthResponse;
|
|
661
|
+
};
|
|
662
|
+
};
|
|
663
|
+
};
|
|
652
664
|
} & {
|
|
653
665
|
api: {
|
|
654
666
|
sync: {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { R as ResolvedConfig, C as Config, S as StoreParams, a as StoreResult, M as Memory, U as UpdateParams, L as ListParams, b as SearchParams, c as SearchResponse, d as ConversationLogEntry, e as SummarizeResponse, H as HealthResponse, T as Tier, f as StorageOrchestrator, g as CreateMemoryResponse, E as ExtractionResult, h as SyncQueueItem } from './server-
|
|
2
|
-
export { i as CreateMemoryRequest, j as EntityType, k as ExtractedEntity, l as ExtractedRelationship, m as ListMemoriesQuery, n as MemoryScope, o as MemorySource, p as MigrateMarkdownRequest, q as RelationshipType, r as ScoredMemory, s as SearchRequest, t as SummarizeRequest, u as SyncStatus, v as TIER_CAPABILITIES, w as TierCapabilities, x as UpdateMemoryRequest, y as createServer } from './server-
|
|
1
|
+
import { R as ResolvedConfig, C as Config, S as StoreParams, a as StoreResult, M as Memory, U as UpdateParams, L as ListParams, b as SearchParams, c as SearchResponse, d as ConversationLogEntry, e as SummarizeResponse, H as HealthResponse, T as Tier, f as StorageOrchestrator, g as CreateMemoryResponse, E as ExtractionResult, h as SyncQueueItem } from './server-D-3OqU-T.js';
|
|
2
|
+
export { i as CreateMemoryRequest, j as EntityType, k as ExtractedEntity, l as ExtractedRelationship, m as ListMemoriesQuery, n as MemoryScope, o as MemorySource, p as MigrateMarkdownRequest, q as RelationshipType, r as ScoredMemory, s as SearchRequest, t as SummarizeRequest, u as SyncStatus, v as TIER_CAPABILITIES, w as TierCapabilities, x as UpdateMemoryRequest, y as createServer } from './server-D-3OqU-T.js';
|
|
3
3
|
import { Elysia } from 'elysia';
|
|
4
4
|
|
|
5
5
|
declare function loadConfig(configPath?: string): Promise<ResolvedConfig>;
|
|
@@ -649,6 +649,18 @@ declare function createApp(orchestrator: StorageOrchestrator, config: ResolvedCo
|
|
|
649
649
|
};
|
|
650
650
|
};
|
|
651
651
|
};
|
|
652
|
+
} & {
|
|
653
|
+
health: {
|
|
654
|
+
get: {
|
|
655
|
+
body: unknown;
|
|
656
|
+
params: {};
|
|
657
|
+
query: unknown;
|
|
658
|
+
headers: unknown;
|
|
659
|
+
response: {
|
|
660
|
+
200: HealthResponse;
|
|
661
|
+
};
|
|
662
|
+
};
|
|
663
|
+
};
|
|
652
664
|
} & {
|
|
653
665
|
api: {
|
|
654
666
|
sync: {
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createApp,
|
|
3
3
|
createServer
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-VB5GGBGB.js";
|
|
5
5
|
import {
|
|
6
6
|
MemoryService
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-5SZWJKD5.js";
|
|
8
|
+
import "./chunk-RZPYOMPO.js";
|
|
9
9
|
import {
|
|
10
10
|
configSummary,
|
|
11
11
|
defineConfig,
|
|
12
12
|
loadConfig
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-ITGUJZUL.js";
|
|
14
14
|
|
|
15
15
|
// src/core/types.ts
|
|
16
16
|
var TIER_CAPABILITIES = {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunkL2KRIMDAcjs = require('./chunk-L2KRIMDA.cjs');
|
|
4
|
+
require('./chunk-HPGHPKK3.cjs');
|
|
5
|
+
require('./chunk-LA5OP5VI.cjs');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
exports.MemoryService = _chunkL2KRIMDAcjs.MemoryService;
|
|
9
|
+
//# sourceMappingURL=memory-service-LURM3FBB.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/robertpop/work/personal/openclaw-memory/dist/memory-service-
|
|
1
|
+
{"version":3,"sources":["/Users/robertpop/work/personal/openclaw-memory/dist/memory-service-LURM3FBB.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-LURM3FBB.cjs"}
|
|
@@ -1055,6 +1055,18 @@ declare function createServer(configPath?: string): Promise<{
|
|
|
1055
1055
|
};
|
|
1056
1056
|
};
|
|
1057
1057
|
};
|
|
1058
|
+
} & {
|
|
1059
|
+
health: {
|
|
1060
|
+
get: {
|
|
1061
|
+
body: unknown;
|
|
1062
|
+
params: {};
|
|
1063
|
+
query: unknown;
|
|
1064
|
+
headers: unknown;
|
|
1065
|
+
response: {
|
|
1066
|
+
200: HealthResponse;
|
|
1067
|
+
};
|
|
1068
|
+
};
|
|
1069
|
+
};
|
|
1058
1070
|
} & {
|
|
1059
1071
|
api: {
|
|
1060
1072
|
sync: {
|
|
@@ -1055,6 +1055,18 @@ declare function createServer(configPath?: string): Promise<{
|
|
|
1055
1055
|
};
|
|
1056
1056
|
};
|
|
1057
1057
|
};
|
|
1058
|
+
} & {
|
|
1059
|
+
health: {
|
|
1060
|
+
get: {
|
|
1061
|
+
body: unknown;
|
|
1062
|
+
params: {};
|
|
1063
|
+
query: unknown;
|
|
1064
|
+
headers: unknown;
|
|
1065
|
+
response: {
|
|
1066
|
+
200: HealthResponse;
|
|
1067
|
+
};
|
|
1068
|
+
};
|
|
1069
|
+
};
|
|
1058
1070
|
} & {
|
|
1059
1071
|
api: {
|
|
1060
1072
|
sync: {
|
package/dist/server.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
5
|
-
require('./chunk-
|
|
3
|
+
var _chunkMQEBVCH5cjs = require('./chunk-MQEBVCH5.cjs');
|
|
4
|
+
require('./chunk-HPGHPKK3.cjs');
|
|
5
|
+
require('./chunk-LA5OP5VI.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
exports.createServer =
|
|
8
|
+
exports.createServer = _chunkMQEBVCH5cjs.createServer;
|
|
9
9
|
//# sourceMappingURL=server.cjs.map
|
package/dist/server.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import 'elysia';
|
|
2
|
-
export { y as createServer } from './server-
|
|
2
|
+
export { y as createServer } from './server-D-3OqU-T.cjs';
|
package/dist/server.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import 'elysia';
|
|
2
|
-
export { y as createServer } from './server-
|
|
2
|
+
export { y as createServer } from './server-D-3OqU-T.js';
|
package/dist/server.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
"version": "0.1.
|
|
2
|
+
"name": "@poprobertdaniel/openclaw-memory",
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Triple-layer memory system for AI agents — SQLite + Qdrant + Postgres/AGE",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -66,11 +66,11 @@
|
|
|
66
66
|
"license": "MIT",
|
|
67
67
|
"repository": {
|
|
68
68
|
"type": "git",
|
|
69
|
-
"url": "https://github.com/
|
|
69
|
+
"url": "https://github.com/robipop22/openclaw-memory"
|
|
70
70
|
},
|
|
71
|
-
"homepage": "https://github.com/
|
|
71
|
+
"homepage": "https://github.com/robipop22/openclaw-memory#readme",
|
|
72
72
|
"bugs": {
|
|
73
|
-
"url": "https://github.com/
|
|
73
|
+
"url": "https://github.com/robipop22/openclaw-memory/issues"
|
|
74
74
|
},
|
|
75
75
|
"engines": {
|
|
76
76
|
"node": ">=20.0.0"
|
package/templates/.env.example
CHANGED
|
@@ -28,7 +28,7 @@ MEMORY_AUTH_TOKEN=change-me-to-a-secure-token
|
|
|
28
28
|
# EMBEDDING_MODEL=openai/text-embedding-3-small
|
|
29
29
|
|
|
30
30
|
# Entity extraction LLM
|
|
31
|
-
# EXTRACTION_MODEL=gpt-
|
|
31
|
+
# EXTRACTION_MODEL=gpt-5-nano
|
|
32
32
|
# EXTRACTION_BASE_URL=https://api.openai.com/v1
|
|
33
33
|
|
|
34
34
|
# ── Full tier ────────────────────────────────────────────────────────────
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineConfig } from 'openclaw-memory';
|
|
1
|
+
import { defineConfig } from '@poprobertdaniel/openclaw-memory';
|
|
2
2
|
|
|
3
3
|
export default defineConfig({
|
|
4
4
|
// Tier: 'lite' (SQLite only), 'standard' (+Qdrant), 'full' (+Qdrant+AGE)
|
|
@@ -32,7 +32,7 @@ export default defineConfig({
|
|
|
32
32
|
// },
|
|
33
33
|
// extraction: {
|
|
34
34
|
// apiKey: process.env.OPENAI_API_KEY || '',
|
|
35
|
-
// model: 'gpt-
|
|
35
|
+
// model: 'gpt-5-nano',
|
|
36
36
|
// enabled: true,
|
|
37
37
|
// },
|
|
38
38
|
|