diff --git a/examples/@memclaw/bin-darwin-arm64/package.json b/examples/@memclaw/bin-darwin-arm64/package.json index a89376b..0131c7e 100644 --- a/examples/@memclaw/bin-darwin-arm64/package.json +++ b/examples/@memclaw/bin-darwin-arm64/package.json @@ -2,6 +2,9 @@ "name": "@memclaw/bin-darwin-arm64", "version": "0.1.0", "description": "MemClaw binaries for macOS Apple Silicon", + "publishConfig": { + "access": "public" + }, "os": [ "darwin" ], diff --git a/examples/@memclaw/bin-win-x64/package.json b/examples/@memclaw/bin-win-x64/package.json index dd80f70..9619c88 100644 --- a/examples/@memclaw/bin-win-x64/package.json +++ b/examples/@memclaw/bin-win-x64/package.json @@ -2,6 +2,9 @@ "name": "@memclaw/bin-win-x64", "version": "0.1.0", "description": "MemClaw binaries for Windows x64", + "publishConfig": { + "access": "public" + }, "os": [ "win32" ], diff --git a/examples/memclaw/.gitignore b/examples/@memclaw/plugin/.gitignore similarity index 100% rename from examples/memclaw/.gitignore rename to examples/@memclaw/plugin/.gitignore diff --git a/examples/memclaw/README.md b/examples/@memclaw/plugin/README.md similarity index 92% rename from examples/memclaw/README.md rename to examples/@memclaw/plugin/README.md index 48fbb3a..2032cc7 100644 --- a/examples/memclaw/README.md +++ b/examples/@memclaw/plugin/README.md @@ -59,7 +59,7 @@ OpenClaw + MemClaw Plugin ### Install Plugin ```bash -openclaw plugins install memclaw +openclaw plugins install @memclaw/plugin ``` ### Local Development Installation @@ -69,30 +69,44 @@ For developers who want to use a local version of memclaw or develop the plugin: ```bash # Clone the repository git clone https://github.com/sopaco/cortex-mem.git -cd cortex-mem/examples/memclaw +cd cortex-mem/examples/@memclaw/plugin # Install dependencies bun install # Build the plugin bun run build +``` + +**Option A: Use plugins.load.paths** + +```json +{ + "plugins": { + "load": { + "paths": ["/path/to/cortex-mem/examples/@memclaw/plugin"] + }, + "entries": { + "memclaw": { "enabled": true } + } + } +} +``` + +**Option B: Symlink to extensions directory** -# Create a symlink to the plugin directory -# This makes OpenClaw use your local version -mkdir -p ~/.openclaw/plugins -ln -sf "$(pwd)" ~/.openclaw/plugins/memclaw +```bash +mkdir -p ~/.openclaw/extensions +ln -sf "$(pwd)" ~/.openclaw/extensions/memclaw ``` -Then configure in `openclaw.json` with the local plugin path: +Then enable in `openclaw.json`: ```json { "plugins": { "entries": { - "memclaw": { - "enabled": true, - "path": "./plugins/memclaw" - } + "memclaw": { "enabled": true } } } } diff --git a/examples/memclaw/README_zh.md b/examples/@memclaw/plugin/README_zh.md similarity index 100% rename from examples/memclaw/README_zh.md rename to examples/@memclaw/plugin/README_zh.md diff --git a/examples/@memclaw/plugin/dist/index.d.ts b/examples/@memclaw/plugin/dist/index.d.ts new file mode 100644 index 0000000..dc93e87 --- /dev/null +++ b/examples/@memclaw/plugin/dist/index.d.ts @@ -0,0 +1,100 @@ +/** + * MemClaw - Layered Semantic Memory for OpenClaw + * + * Provides: + * - L0/L1/L2 tiered memory retrieval + * - Automatic service startup (Qdrant + cortex-mem-service) + * - Migration from OpenClaw native memory + * + * Installation: + * openclaw plugins install memclaw + * + * Configuration (in openclaw.json): + * { + * "plugins": { + * "entries": { + * "memclaw": { + * "enabled": true, + * "config": { + * "serviceUrl": "http://127.0.0.1:8085", + * "tenantId": "tenant_claw", + * "autoStartServices": true + * } + * } + * } + * } + * } + */ +export type { CortexMemClient } from './src/client.js'; +export type { MemClawConfig } from './src/config.js'; +interface PluginLogger { + debug?: (msg: string, ...args: unknown[]) => void; + info: (msg: string, ...args: unknown[]) => void; + warn: (msg: string, ...args: unknown[]) => void; + error: (msg: string, ...args: unknown[]) => void; +} +interface ToolDefinition { + name: string; + description: string; + parameters: object; + execute: (_id: string, params: Record) => Promise; + optional?: boolean; +} +interface PluginAPI { + pluginConfig?: Record; + registerTool(tool: ToolDefinition, opts?: { + optional?: boolean; + }): void; + registerService(service: { + id: string; + start: () => Promise; + stop: () => Promise; + }): void; + logger: PluginLogger; +} +export default function memclawPlugin(api: PluginAPI): { + id: string; + name: string; + version: string; +}; +export declare const plugin: { + id: string; + name: string; + version: string; + configSchema: { + type: string; + properties: { + serviceUrl: { + type: string; + default: string; + }; + defaultSessionId: { + type: string; + default: string; + }; + searchLimit: { + type: string; + default: number; + }; + minScore: { + type: string; + default: number; + }; + tenantId: { + type: string; + default: string; + }; + autoStartServices: { + type: string; + default: boolean; + }; + }; + required: never[]; + }; + register(api: PluginAPI): { + id: string; + name: string; + version: string; + }; +}; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/index.d.ts.map b/examples/@memclaw/plugin/dist/index.d.ts.map new file mode 100644 index 0000000..b78986e --- /dev/null +++ b/examples/@memclaw/plugin/dist/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD,UAAU,YAAY;IACrB,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClD,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAChD,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAChD,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACjD;AAED,UAAU,cAAc;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,SAAS;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACxE,eAAe,CAAC,OAAO,EAAE;QACxB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1B,GAAG,IAAI,CAAC;IACT,MAAM,EAAE,YAAY,CAAC;CACrB;AAGD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,GAAG,EAAE,SAAS;;;;EAEnD;AAGD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAgBJ,SAAS;;;;;CAGvB,CAAC"} \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/index.js b/examples/@memclaw/plugin/dist/index.js new file mode 100644 index 0000000..646bd54 --- /dev/null +++ b/examples/@memclaw/plugin/dist/index.js @@ -0,0 +1,58 @@ +'use strict'; +/** + * MemClaw - Layered Semantic Memory for OpenClaw + * + * Provides: + * - L0/L1/L2 tiered memory retrieval + * - Automatic service startup (Qdrant + cortex-mem-service) + * - Migration from OpenClaw native memory + * + * Installation: + * openclaw plugins install memclaw + * + * Configuration (in openclaw.json): + * { + * "plugins": { + * "entries": { + * "memclaw": { + * "enabled": true, + * "config": { + * "serviceUrl": "http://127.0.0.1:8085", + * "tenantId": "tenant_claw", + * "autoStartServices": true + * } + * } + * } + * } + * } + */ +Object.defineProperty(exports, '__esModule', { value: true }); +exports.plugin = void 0; +exports.default = memclawPlugin; +const plugin_impl_js_1 = require('./plugin-impl.js'); +// Default export - main plugin function +function memclawPlugin(api) { + return (0, plugin_impl_js_1.createPlugin)(api); +} +// Named export - object style registration +exports.plugin = { + id: 'memclaw', + name: 'MemClaw', + version: '0.9.6', + configSchema: { + type: 'object', + properties: { + serviceUrl: { type: 'string', default: 'http://localhost:8085' }, + defaultSessionId: { type: 'string', default: 'default' }, + searchLimit: { type: 'integer', default: 10 }, + minScore: { type: 'number', default: 0.6 }, + tenantId: { type: 'string', default: 'tenant_claw' }, + autoStartServices: { type: 'boolean', default: true } + }, + required: [] + }, + register(api) { + return (0, plugin_impl_js_1.createPlugin)(api); + } +}; +//# sourceMappingURL=index.js.map diff --git a/examples/@memclaw/plugin/dist/index.js.map b/examples/@memclaw/plugin/dist/index.js.map new file mode 100644 index 0000000..9c4ed82 --- /dev/null +++ b/examples/@memclaw/plugin/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;;;AAoCH,gCAEC;AApCD,qDAAgD;AAiChD,wCAAwC;AACxC,SAAwB,aAAa,CAAC,GAAc;IACnD,OAAO,IAAA,6BAAY,EAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,2CAA2C;AAC9B,QAAA,MAAM,GAAG;IACrB,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,OAAO;IAChB,YAAY,EAAE;QACb,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACX,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,uBAAuB,EAAE;YAChE,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE;YACxD,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7C,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE;YAC1C,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE;YACpD,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;SACrD;QACD,QAAQ,EAAE,EAAE;KACZ;IACD,QAAQ,CAAC,GAAc;QACtB,OAAO,IAAA,6BAAY,EAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;CACD,CAAC"} \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/plugin-impl.d.ts b/examples/@memclaw/plugin/dist/plugin-impl.d.ts new file mode 100644 index 0000000..1fabc32 --- /dev/null +++ b/examples/@memclaw/plugin/dist/plugin-impl.d.ts @@ -0,0 +1,40 @@ +/** + * MemClaw Plugin Implementation + * + * Provides layered semantic memory for OpenClaw with: + * - Automatic service startup + * - Memory tools (search, recall, add, list, close) + * - Migration from OpenClaw native memory + */ +interface PluginLogger { + debug?: (msg: string, ...args: unknown[]) => void; + info: (msg: string, ...args: unknown[]) => void; + warn: (msg: string, ...args: unknown[]) => void; + error: (msg: string, ...args: unknown[]) => void; +} +interface ToolDefinition { + name: string; + description: string; + parameters: object; + execute: (_id: string, params: Record) => Promise; + optional?: boolean; +} +interface PluginAPI { + pluginConfig?: Record; + registerTool(tool: ToolDefinition, opts?: { + optional?: boolean; + }): void; + registerService(service: { + id: string; + start: () => Promise; + stop: () => Promise; + }): void; + logger: PluginLogger; +} +export declare function createPlugin(api: PluginAPI): { + id: string; + name: string; + version: string; +}; +export {}; +//# sourceMappingURL=plugin-impl.d.ts.map \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/plugin-impl.d.ts.map b/examples/@memclaw/plugin/dist/plugin-impl.d.ts.map new file mode 100644 index 0000000..ab0f929 --- /dev/null +++ b/examples/@memclaw/plugin/dist/plugin-impl.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"plugin-impl.d.ts","sourceRoot":"","sources":["../plugin-impl.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA8BH,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClD,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAChD,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAChD,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CAClD;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,SAAS;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACxE,eAAe,CAAC,OAAO,EAAE;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KAC3B,GAAG,IAAI,CAAC;IACT,MAAM,EAAE,YAAY,CAAC;CACtB;AAuJD,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS;;;;EAiW1C"} \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/plugin-impl.js b/examples/@memclaw/plugin/dist/plugin-impl.js new file mode 100644 index 0000000..af27bf2 --- /dev/null +++ b/examples/@memclaw/plugin/dist/plugin-impl.js @@ -0,0 +1,445 @@ +"use strict"; +/** + * MemClaw Plugin Implementation + * + * Provides layered semantic memory for OpenClaw with: + * - Automatic service startup + * - Memory tools (search, recall, add, list, close) + * - Migration from OpenClaw native memory + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createPlugin = createPlugin; +const client_js_1 = require("./src/client.js"); +const config_js_1 = require("./src/config.js"); +const binaries_js_1 = require("./src/binaries.js"); +const migrate_js_1 = require("./src/migrate.js"); +// Tool schemas +const toolSchemas = { + cortex_search: { + name: "cortex_search", + description: `Layered semantic search across memory using L0/L1/L2 tiered retrieval. +Returns relevant memories ranked by relevance score. + +Use this tool when you need to: +- Find past conversations or decisions +- Search for specific information across all sessions +- Discover related memories by semantic similarity`, + inputSchema: { + type: "object", + properties: { + query: { + type: "string", + description: "The search query - can be natural language or keywords", + }, + scope: { + type: "string", + description: "Optional session/thread ID to limit search scope", + }, + limit: { + type: "integer", + description: "Maximum number of results to return (default: 10)", + default: 10, + }, + min_score: { + type: "number", + description: "Minimum relevance score threshold (0-1, default: 0.6)", + default: 0.6, + }, + }, + required: ["query"], + }, + }, + cortex_recall: { + name: "cortex_recall", + description: `Recall memories using L0/L1/L2 tiered retrieval. + +The search engine internally performs tiered retrieval: +- L0 (Abstract): Quick filtering by summary +- L1 (Overview): Context refinement +- L2 (Full): Precise matching with full content + +Returns results with snippet (summary) and content (if available). + +Use this when you need memories with more context than a simple search.`, + inputSchema: { + type: "object", + properties: { + query: { + type: "string", + description: "The search query", + }, + scope: { + type: "string", + description: "Optional session/thread ID to limit search scope", + }, + limit: { + type: "integer", + description: "Maximum number of results (default: 10)", + default: 10, + }, + }, + required: ["query"], + }, + }, + cortex_add_memory: { + name: "cortex_add_memory", + description: `Add a message to memory for a specific session. +This stores the message and automatically triggers: +- Vector embedding for semantic search +- L0/L1 layer generation (async) + +Use this to persist important information that should be searchable later.`, + inputSchema: { + type: "object", + properties: { + content: { + type: "string", + description: "The content to store in memory", + }, + role: { + type: "string", + enum: ["user", "assistant", "system"], + description: "Role of the message sender (default: user)", + default: "user", + }, + session_id: { + type: "string", + description: "Session/thread ID (uses default if not specified)", + }, + }, + required: ["content"], + }, + }, + cortex_list_sessions: { + name: "cortex_list_sessions", + description: `List all memory sessions with their status. +Shows session IDs, message counts, and creation/update times.`, + inputSchema: { + type: "object", + properties: {}, + }, + }, + cortex_close_session: { + name: "cortex_close_session", + description: `Close a memory session and trigger full memory extraction. + +This triggers the complete memory processing pipeline: +1. Extracts structured memories (user preferences, entities, decisions) +2. Generates complete L0/L1 layer summaries +3. Indexes all extracted memories into the vector database + +Note: This is a potentially long-running operation (may take 30-60s).`, + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "Session/thread ID to close (uses default if not specified)", + }, + }, + }, + }, + cortex_migrate: { + name: "cortex_migrate", + description: `Migrate memories from OpenClaw's native memory system to MemClaw. + +This will: +1. Find your OpenClaw memory files (memory/*.md and MEMORY.md) +2. Convert them to MemClaw's L2 format +3. Generate L0/L1 layers and vector index + +Use this once during initial setup to preserve your existing memories.`, + inputSchema: { + type: "object", + properties: {}, + }, + }, +}; +function createPlugin(api) { + const config = (api.pluginConfig ?? {}); + const serviceUrl = config.serviceUrl ?? "http://localhost:8085"; + const defaultSessionId = config.defaultSessionId ?? "default"; + const searchLimit = config.searchLimit ?? 10; + const minScore = config.minScore ?? 0.6; + const tenantId = config.tenantId ?? "tenant_claw"; + const autoStartServices = config.autoStartServices ?? true; + const client = new client_js_1.CortexMemClient(serviceUrl); + let servicesStarted = false; + const log = (msg) => api.logger.info(`[memclaw] ${msg}`); + log("Initializing MemClaw plugin..."); + // Ensure config file exists + const { created, path: configPath } = (0, config_js_1.ensureConfigExists)(); + if (created) { + log(`Created configuration file: ${configPath}`); + log("Opening configuration file for editing..."); + (0, config_js_1.openConfigFile)(configPath).catch((err) => { + api.logger.warn(`Could not open config file: ${err}`); + api.logger.warn(`Please manually edit: ${configPath}`); + }); + api.logger.info(` +╔══════════════════════════════════════════════════════════╗ +║ MemClaw First Run ║ +║ ║ +║ A configuration file has been created: ║ +║ ${configPath.padEnd(52)}║ +║ ║ +║ Please fill in the required fields: ║ +║ - llm.api_key (your LLM API key) ║ +║ - embedding.api_key (your embedding API key) ║ +║ ║ +║ Save the file and restart OpenClaw to apply changes. ║ +╚══════════════════════════════════════════════════════════╝ + `); + } + // Register service lifecycle + api.registerService({ + id: "memclaw", + start: async () => { + // Skip service startup if config was just created (first run) + // User needs to fill in API keys first + if (created) { + log("First run detected. Please complete configuration and restart OpenClaw."); + return; + } + if (!autoStartServices) { + log("Auto-start disabled, skipping service startup"); + return; + } + // Check if binaries are available + const hasQdrant = (0, binaries_js_1.isBinaryAvailable)("qdrant"); + const hasService = (0, binaries_js_1.isBinaryAvailable)("cortex-mem-service"); + if (!hasQdrant || !hasService) { + log("Some binaries are missing. Services may need manual setup."); + log(`Run 'memclaw setup' or check the admin skill for installation instructions.`); + } + // Validate config + const parsedConfig = (0, config_js_1.parseConfig)(configPath); + const validation = (0, config_js_1.validateConfig)(parsedConfig); + if (!validation.valid) { + api.logger.warn(`Configuration incomplete: ${validation.errors.join(", ")}`); + api.logger.warn(`Please edit: ${configPath}`); + return; + } + // Start services + try { + log("Starting services..."); + await (0, binaries_js_1.ensureAllServices)(log); + servicesStarted = true; + // Switch tenant + await client.switchTenant(tenantId); + log(`Switched to tenant: ${tenantId}`); + log("MemClaw services started successfully"); + } + catch (err) { + api.logger.error(`Failed to start services: ${err}`); + api.logger.warn("Memory features may not work correctly"); + } + }, + stop: async () => { + log("Stopping MemClaw..."); + servicesStarted = false; + }, + }); + // Helper to check if services are ready + const ensureServicesReady = async () => { + if (!servicesStarted) { + const status = await (0, binaries_js_1.checkServiceStatus)(); + if (!status.cortexMemService) { + throw new Error("cortex-mem-service is not running. Please start the service first."); + } + } + }; + // Register tools + // cortex_search + api.registerTool({ + name: toolSchemas.cortex_search.name, + description: toolSchemas.cortex_search.description, + parameters: toolSchemas.cortex_search.inputSchema, + execute: async (_id, params) => { + const input = params; + try { + await ensureServicesReady(); + const results = await client.search({ + query: input.query, + thread: input.scope, + limit: input.limit ?? searchLimit, + min_score: input.min_score ?? minScore, + }); + const formatted = results + .map((r, i) => `${i + 1}. [Score: ${r.score.toFixed(2)}] ${r.snippet}\n URI: ${r.uri}`) + .join("\n\n"); + return { + content: `Found ${results.length} results for "${input.query}":\n\n${formatted}`, + results: results.map((r) => ({ + uri: r.uri, + score: r.score, + snippet: r.snippet, + })), + total: results.length, + }; + } + catch (error) { + const message = error instanceof Error ? error.message : String(error); + api.logger.error(`cortex_search failed: ${message}`); + return { error: `Search failed: ${message}` }; + } + }, + }); + // cortex_recall + api.registerTool({ + name: toolSchemas.cortex_recall.name, + description: toolSchemas.cortex_recall.description, + parameters: toolSchemas.cortex_recall.inputSchema, + execute: async (_id, params) => { + const input = params; + try { + await ensureServicesReady(); + const results = await client.recall(input.query, input.scope, input.limit ?? 10); + const formatted = results + .map((r, i) => { + let content = `${i + 1}. [Score: ${r.score.toFixed(2)}] URI: ${r.uri}\n`; + content += ` Snippet: ${r.snippet}\n`; + if (r.content) { + const preview = r.content.length > 300 ? r.content.substring(0, 300) + "..." : r.content; + content += ` Content: ${preview}\n`; + } + return content; + }) + .join("\n"); + return { + content: `Recalled ${results.length} memories:\n\n${formatted}`, + results, + total: results.length, + }; + } + catch (error) { + const message = error instanceof Error ? error.message : String(error); + api.logger.error(`cortex_recall failed: ${message}`); + return { error: `Recall failed: ${message}` }; + } + }, + }); + // cortex_add_memory + api.registerTool({ + name: toolSchemas.cortex_add_memory.name, + description: toolSchemas.cortex_add_memory.description, + parameters: toolSchemas.cortex_add_memory.inputSchema, + execute: async (_id, params) => { + const input = params; + try { + await ensureServicesReady(); + const sessionId = input.session_id ?? defaultSessionId; + const result = await client.addMessage(sessionId, { + role: (input.role ?? "user"), + content: input.content, + }); + return { + content: `Memory stored successfully in session "${sessionId}".\nResult: ${result}`, + success: true, + message_uri: result, + }; + } + catch (error) { + const message = error instanceof Error ? error.message : String(error); + api.logger.error(`cortex_add_memory failed: ${message}`); + return { error: `Failed to add memory: ${message}` }; + } + }, + }); + // cortex_list_sessions + api.registerTool({ + name: toolSchemas.cortex_list_sessions.name, + description: toolSchemas.cortex_list_sessions.description, + parameters: toolSchemas.cortex_list_sessions.inputSchema, + execute: async (_id, _params) => { + try { + await ensureServicesReady(); + const sessions = await client.listSessions(); + if (sessions.length === 0) { + return { content: "No sessions found." }; + } + const formatted = sessions + .map((s, i) => { + const created = new Date(s.created_at).toLocaleDateString(); + return `${i + 1}. ${s.thread_id} (${s.status}, ${s.message_count} messages, created ${created})`; + }) + .join("\n"); + return { + content: `Found ${sessions.length} sessions:\n\n${formatted}`, + sessions: sessions.map((s) => ({ + thread_id: s.thread_id, + status: s.status, + message_count: s.message_count, + created_at: s.created_at, + })), + }; + } + catch (error) { + const message = error instanceof Error ? error.message : String(error); + api.logger.error(`cortex_list_sessions failed: ${message}`); + return { error: `Failed to list sessions: ${message}` }; + } + }, + }); + // cortex_close_session + api.registerTool({ + name: toolSchemas.cortex_close_session.name, + description: toolSchemas.cortex_close_session.description, + parameters: toolSchemas.cortex_close_session.inputSchema, + execute: async (_id, params) => { + const input = params; + try { + await ensureServicesReady(); + const sessionId = input.session_id ?? defaultSessionId; + const result = await client.closeSession(sessionId); + return { + content: `Session "${sessionId}" closed successfully.\nStatus: ${result.status}, Messages: ${result.message_count}\n\nMemory extraction pipeline triggered.`, + success: true, + session: { + thread_id: result.thread_id, + status: result.status, + message_count: result.message_count, + }, + }; + } + catch (error) { + const message = error instanceof Error ? error.message : String(error); + api.logger.error(`cortex_close_session failed: ${message}`); + return { error: `Failed to close session: ${message}` }; + } + }, + }); + // cortex_migrate + api.registerTool({ + name: toolSchemas.cortex_migrate.name, + description: toolSchemas.cortex_migrate.description, + parameters: toolSchemas.cortex_migrate.inputSchema, + execute: async (_id, _params) => { + try { + // Check if migration is possible + const { possible, reason } = (0, migrate_js_1.canMigrate)(); + if (!possible) { + return { content: `Migration not possible: ${reason}` }; + } + // Run migration + const result = await (0, migrate_js_1.migrateFromOpenClaw)((msg) => api.logger.info(`[migrate] ${msg}`)); + return { + content: `Migration completed!\n- Daily logs migrated: ${result.dailyLogsMigrated}\n- MEMORY.md migrated: ${result.memoryMdMigrated}\n- Sessions created: ${result.sessionsCreated.length}\n${result.errors.length > 0 ? `- Errors: ${result.errors.length}` : ""}`, + result, + }; + } + catch (error) { + const message = error instanceof Error ? error.message : String(error); + api.logger.error(`cortex_migrate failed: ${message}`); + return { error: `Migration failed: ${message}` }; + } + }, + }); + log("MemClaw plugin initialized"); + return { + id: "memclaw", + name: "MemClaw", + version: "0.1.0", + }; +} +//# sourceMappingURL=plugin-impl.js.map \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/plugin-impl.js.map b/examples/@memclaw/plugin/dist/plugin-impl.js.map new file mode 100644 index 0000000..365e820 --- /dev/null +++ b/examples/@memclaw/plugin/dist/plugin-impl.js.map @@ -0,0 +1 @@ +{"version":3,"file":"plugin-impl.js","sourceRoot":"","sources":["../plugin-impl.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/binaries.d.ts b/examples/@memclaw/plugin/dist/src/binaries.d.ts new file mode 100644 index 0000000..9a40686 --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/binaries.d.ts @@ -0,0 +1,29 @@ +/** + * Binary management for MemClaw + * + * Binaries are bundled in platform-specific npm packages: + * - @memclaw/bin-darwin-arm64 (macOS Apple Silicon) + * - @memclaw/bin-win-x64 (Windows x64) + * + * The correct package is installed automatically via optionalDependencies. + */ +type SupportedPlatform = "darwin-arm64" | "win-x64"; +export declare function getPlatform(): SupportedPlatform | null; +export declare function isPlatformSupported(): boolean; +export declare function getUnsupportedPlatformMessage(): string; +export declare function getBinaryPath(binary: string): string | null; +export declare function isBinaryAvailable(binary: string): boolean; +export declare function isPlatformPackageInstalled(): boolean; +export declare function getInstallInstructions(): string; +export interface ServiceStatus { + qdrant: boolean; + cortexMemService: boolean; +} +export declare function checkServiceStatus(): Promise; +export declare function startQdrant(log?: (msg: string) => void): Promise; +export declare function startCortexMemService(log?: (msg: string) => void): Promise; +export declare function stopAllServices(): void; +export declare function ensureAllServices(log?: (msg: string) => void): Promise; +export declare function getCliPath(): string | null; +export {}; +//# sourceMappingURL=binaries.d.ts.map \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/binaries.d.ts.map b/examples/@memclaw/plugin/dist/src/binaries.d.ts.map new file mode 100644 index 0000000..4d02861 --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/binaries.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"binaries.d.ts","sourceRoot":"","sources":["../../src/binaries.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,KAAK,iBAAiB,GAAG,cAAc,GAAG,SAAS,CAAC;AAGpD,wBAAgB,WAAW,IAAI,iBAAiB,GAAG,IAAI,CAWtD;AAGD,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAGD,wBAAgB,6BAA6B,IAAI,MAAM,CAWtD;AA0BD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe3D;AAGD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD;AAGD,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAGD,wBAAgB,sBAAsB,IAAI,MAAM,CAgB/C;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC,CAKjE;AA2BD,wBAAsB,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D5E;AAED,wBAAsB,qBAAqB,CACzC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC1B,OAAO,CAAC,IAAI,CAAC,CAgDf;AAED,wBAAgB,eAAe,IAAI,IAAI,CAUtC;AAED,wBAAsB,iBAAiB,CACrC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC1B,OAAO,CAAC,aAAa,CAAC,CAwBxB;AAGD,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAE1C"} \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/binaries.js b/examples/@memclaw/plugin/dist/src/binaries.js new file mode 100644 index 0000000..84b71da --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/binaries.js @@ -0,0 +1,292 @@ +"use strict"; +/** + * Binary management for MemClaw + * + * Binaries are bundled in platform-specific npm packages: + * - @memclaw/bin-darwin-arm64 (macOS Apple Silicon) + * - @memclaw/bin-win-x64 (Windows x64) + * + * The correct package is installed automatically via optionalDependencies. + */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getPlatform = getPlatform; +exports.isPlatformSupported = isPlatformSupported; +exports.getUnsupportedPlatformMessage = getUnsupportedPlatformMessage; +exports.getBinaryPath = getBinaryPath; +exports.isBinaryAvailable = isBinaryAvailable; +exports.isPlatformPackageInstalled = isPlatformPackageInstalled; +exports.getInstallInstructions = getInstallInstructions; +exports.checkServiceStatus = checkServiceStatus; +exports.startQdrant = startQdrant; +exports.startCortexMemService = startCortexMemService; +exports.stopAllServices = stopAllServices; +exports.ensureAllServices = ensureAllServices; +exports.getCliPath = getCliPath; +const fs = __importStar(require("fs")); +const path = __importStar(require("path")); +const child_process_1 = require("child_process"); +const config_js_1 = require("./config.js"); +// Platform detection +function getPlatform() { + const platform = process.platform; + const arch = process.arch; + if (platform === "darwin" && arch === "arm64") { + return "darwin-arm64"; + } + else if (platform === "win32" && arch === "x64") { + return "win-x64"; + } + return null; +} +// Check if current platform is supported +function isPlatformSupported() { + return getPlatform() !== null; +} +// Get unsupported platform message +function getUnsupportedPlatformMessage() { + const platform = process.platform; + const arch = process.arch; + return ` +MemClaw is only supported on: + - macOS Apple Silicon (darwin-arm64) + - Windows x64 (win-x64) + +Current platform: ${platform}-${arch} is not supported. +`; +} +// Get binary name with platform extension +function getBinaryFileName(binary) { + return process.platform === "win32" ? `${binary}.exe` : binary; +} +// Get the path to the platform-specific npm package +function getPlatformPackagePath() { + const platform = getPlatform(); + if (!platform) { + return null; + } + const packageName = `@memclaw/bin-${platform}`; + try { + // Try to resolve the package path + const packageJsonPath = require.resolve(`${packageName}/package.json`); + return path.dirname(packageJsonPath); + } + catch { + return null; + } +} +// Get binary path from npm package +function getBinaryPath(binary) { + const packagePath = getPlatformPackagePath(); + if (!packagePath) { + return null; + } + const binaryFileName = getBinaryFileName(binary); + const binaryPath = path.join(packagePath, "bin", binaryFileName); + if (fs.existsSync(binaryPath)) { + return binaryPath; + } + return null; +} +// Check if binary is available +function isBinaryAvailable(binary) { + return getBinaryPath(binary) !== null; +} +// Check if platform package is installed +function isPlatformPackageInstalled() { + return getPlatformPackagePath() !== null; +} +// Get installation instructions for missing platform package +function getInstallInstructions() { + const platform = getPlatform(); + if (!platform) { + return getUnsupportedPlatformMessage(); + } + const packageName = `@memclaw/bin-${platform}`; + return ` +Platform binaries not found for ${platform}. + +Try running: npm install ${packageName} + +Or reinstall memclaw: npm install memclaw +`; +} +async function checkServiceStatus() { + const qdrant = await isPortOpen(6333); + const cortexMemService = await isPortOpen(8085); + return { qdrant, cortexMemService }; +} +async function isPortOpen(port) { + try { + const response = await fetch(`http://127.0.0.1:${port}/health`, { + method: "GET", + signal: AbortSignal.timeout(2000), + }); + return response.ok; + } + catch { + // Try alternate endpoints for Qdrant + try { + if (port === 6333 || port === 6334) { + const response = await fetch(`http://127.0.0.1:${port}`, { + method: "GET", + signal: AbortSignal.timeout(2000), + }); + return response.ok; + } + } + catch { } + return false; + } +} +// Running processes +const runningProcesses = new Map(); +async function startQdrant(log) { + const status = await checkServiceStatus(); + if (status.qdrant) { + log?.("Qdrant is already running"); + return; + } + const binaryPath = getBinaryPath("qdrant"); + if (!binaryPath) { + throw new Error(`Qdrant binary not found. ${getInstallInstructions()}`); + } + const dataDir = (0, config_js_1.getDataDir)(); + const storagePath = path.join(dataDir, "qdrant-storage"); + if (!fs.existsSync(storagePath)) { + fs.mkdirSync(storagePath, { recursive: true }); + } + log?.(`Starting Qdrant with storage at ${storagePath}...`); + const proc = (0, child_process_1.spawn)(binaryPath, [ + "--storage-path", + storagePath, + "--http-port", + "6333", + "--grpc-port", + "6334", + ], { + stdio: ["ignore", "pipe", "pipe"], + detached: true, + }); + proc.on("error", (err) => { + log?.(`Qdrant error: ${err.message}`); + }); + proc.unref(); + runningProcesses.set("qdrant", proc); + // Wait for Qdrant to start + let retries = 30; + while (retries > 0) { + const status = await checkServiceStatus(); + if (status.qdrant) { + log?.("Qdrant started successfully"); + return; + } + await new Promise((resolve) => setTimeout(resolve, 500)); + retries--; + } + throw new Error("Qdrant failed to start within 15 seconds"); +} +async function startCortexMemService(log) { + const status = await checkServiceStatus(); + if (status.cortexMemService) { + log?.("cortex-mem-service is already running"); + return; + } + const binaryPath = getBinaryPath("cortex-mem-service"); + if (!binaryPath) { + throw new Error(`cortex-mem-service binary not found. ${getInstallInstructions()}`); + } + const dataDir = (0, config_js_1.getDataDir)(); + log?.(`Starting cortex-mem-service with data-dir ${dataDir}...`); + // cortex-mem-service automatically reads config.toml from --data-dir + const proc = (0, child_process_1.spawn)(binaryPath, ["--data-dir", dataDir], { + stdio: ["ignore", "pipe", "pipe"], + detached: true, + }); + proc.on("error", (err) => { + log?.(`cortex-mem-service error: ${err.message}`); + }); + proc.unref(); + runningProcesses.set("cortex-mem-service", proc); + // Wait for service to start + let retries = 30; + while (retries > 0) { + const status = await checkServiceStatus(); + if (status.cortexMemService) { + log?.("cortex-mem-service started successfully"); + return; + } + await new Promise((resolve) => setTimeout(resolve, 500)); + retries--; + } + throw new Error("cortex-mem-service failed to start within 15 seconds"); +} +function stopAllServices() { + for (const [name, proc] of runningProcesses) { + try { + proc.kill(); + console.log(`Stopped ${name}`); + } + catch (err) { + console.error(`Failed to stop ${name}:`, err); + } + } + runningProcesses.clear(); +} +async function ensureAllServices(log) { + // Check if platform is supported + if (!isPlatformSupported()) { + log?.(getUnsupportedPlatformMessage()); + return { qdrant: false, cortexMemService: false }; + } + // Check if platform package is installed + if (!isPlatformPackageInstalled()) { + log?.(`Warning: Platform binaries not installed. ${getInstallInstructions()}`); + return { qdrant: false, cortexMemService: false }; + } + const status = await checkServiceStatus(); + if (!status.qdrant) { + await startQdrant(log); + } + if (!status.cortexMemService) { + await startCortexMemService(log); + } + return checkServiceStatus(); +} +// Get CLI binary path for external commands (like migration) +function getCliPath() { + return getBinaryPath("cortex-mem-cli"); +} +//# sourceMappingURL=binaries.js.map \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/binaries.js.map b/examples/@memclaw/plugin/dist/src/binaries.js.map new file mode 100644 index 0000000..c583661 --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/binaries.js.map @@ -0,0 +1 @@ +{"version":3,"file":"binaries.js","sourceRoot":"","sources":["../../src/binaries.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcH,kCAWC;AAGD,kDAEC;AAGD,sEAWC;AA0BD,sCAeC;AAGD,8CAEC;AAGD,gEAEC;AAGD,wDAgBC;AAOD,gDAKC;AA2BD,kCA2DC;AAED,sDAkDC;AAED,0CAUC;AAED,8CA0BC;AAGD,gCAEC;AAnTD,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAoD;AACpD,2CAAyC;AAQzC,qBAAqB;AACrB,SAAgB,WAAW;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1B,IAAI,QAAQ,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9C,OAAO,cAAc,CAAC;IACxB,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAClD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yCAAyC;AACzC,SAAgB,mBAAmB;IACjC,OAAO,WAAW,EAAE,KAAK,IAAI,CAAC;AAChC,CAAC;AAED,mCAAmC;AACnC,SAAgB,6BAA6B;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1B,OAAO;;;;;oBAKW,QAAQ,IAAI,IAAI;CACnC,CAAC;AACF,CAAC;AAED,0CAA0C;AAC1C,SAAS,iBAAiB,CAAC,MAAkB;IAC3C,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AACjE,CAAC;AAED,oDAAoD;AACpD,SAAS,sBAAsB;IAC7B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,gBAAgB,QAAQ,EAAE,CAAC;IAE/C,IAAI,CAAC;QACH,kCAAkC;QAClC,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,WAAW,eAAe,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,SAAgB,aAAa,CAAC,MAAc;IAC1C,MAAM,WAAW,GAAG,sBAAsB,EAAE,CAAC;IAE7C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAoB,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAEjE,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+BAA+B;AAC/B,SAAgB,iBAAiB,CAAC,MAAc;IAC9C,OAAO,aAAa,CAAC,MAAoB,CAAC,KAAK,IAAI,CAAC;AACtD,CAAC;AAED,yCAAyC;AACzC,SAAgB,0BAA0B;IACxC,OAAO,sBAAsB,EAAE,KAAK,IAAI,CAAC;AAC3C,CAAC;AAED,6DAA6D;AAC7D,SAAgB,sBAAsB;IACpC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,6BAA6B,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,WAAW,GAAG,gBAAgB,QAAQ,EAAE,CAAC;IAE/C,OAAO;kCACyB,QAAQ;;2BAEf,WAAW;;;CAGrC,CAAC;AACF,CAAC;AAOM,KAAK,UAAU,kBAAkB;IACtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IAEhD,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,SAAS,EAAE;YAC9D,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;QACrC,IAAI,CAAC;YACH,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,EAAE,EAAE;oBACvD,MAAM,EAAE,KAAK;oBACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;iBAClC,CAAC,CAAC;gBACH,OAAO,QAAQ,CAAC,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,oBAAoB;AACpB,MAAM,gBAAgB,GAA8B,IAAI,GAAG,EAAE,CAAC;AAEvD,KAAK,UAAU,WAAW,CAAC,GAA2B;IAC3D,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,GAAG,EAAE,CAAC,2BAA2B,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,4BAA4B,sBAAsB,EAAE,EAAE,CACvD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,sBAAU,GAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAEzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,GAAG,EAAE,CAAC,mCAAmC,WAAW,KAAK,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG,IAAA,qBAAK,EAChB,UAAU,EACV;QACE,gBAAgB;QAChB,WAAW;QACX,aAAa;QACb,MAAM;QACN,aAAa;QACb,MAAM;KACP,EACD;QACE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,QAAQ,EAAE,IAAI;KACf,CACF,CAAC;IAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACvB,GAAG,EAAE,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAErC,2BAA2B;IAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,OAAO,OAAO,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,GAAG,EAAE,CAAC,6BAA6B,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC9D,CAAC;AAEM,KAAK,UAAU,qBAAqB,CACzC,GAA2B;IAE3B,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC1C,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,GAAG,EAAE,CAAC,uCAAuC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,wCAAwC,sBAAsB,EAAE,EAAE,CACnE,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,sBAAU,GAAE,CAAC;IAE7B,GAAG,EAAE,CAAC,6CAA6C,OAAO,KAAK,CAAC,CAAC;IAEjE,qEAAqE;IACrE,MAAM,IAAI,GAAG,IAAA,qBAAK,EAChB,UAAU,EACV,CAAC,YAAY,EAAE,OAAO,CAAC,EACvB;QACE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,QAAQ,EAAE,IAAI;KACf,CACF,CAAC;IAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACvB,GAAG,EAAE,CAAC,6BAA6B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,gBAAgB,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;IAEjD,4BAA4B;IAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,OAAO,OAAO,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC5B,GAAG,EAAE,CAAC,yCAAyC,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;AAC1E,CAAC;AAED,SAAgB,eAAe;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,gBAAgB,CAAC,KAAK,EAAE,CAAC;AAC3B,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,GAA2B;IAE3B,iCAAiC;IACjC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;QAC3B,GAAG,EAAE,CAAC,6BAA6B,EAAE,CAAC,CAAC;QACvC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC;QAClC,GAAG,EAAE,CAAC,6CAA6C,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAC/E,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAE1C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,kBAAkB,EAAE,CAAC;AAC9B,CAAC;AAED,6DAA6D;AAC7D,SAAgB,UAAU;IACxB,OAAO,aAAa,CAAC,gBAAgB,CAAC,CAAC;AACzC,CAAC"} \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/client.d.ts b/examples/@memclaw/plugin/dist/src/client.d.ts new file mode 100644 index 0000000..79f5397 --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/client.d.ts @@ -0,0 +1,88 @@ +/** + * Cortex Memory API Client + * + * HTTP client for cortex-mem-service REST API + */ +export interface SearchRequest { + query: string; + thread?: string; + limit?: number; + min_score?: number; +} +export interface SearchResult { + uri: string; + score: number; + snippet: string; + content?: string; + source: string; +} +export interface SessionResponse { + thread_id: string; + status: string; + message_count: number; + created_at: string; + updated_at: string; +} +export interface CreateSessionRequest { + thread_id?: string; + title?: string; + user_id?: string; + agent_id?: string; +} +export interface AddMessageRequest { + role: "user" | "assistant" | "system"; + content: string; +} +/** + * Cortex Memory API Client + */ +export declare class CortexMemClient { + private baseUrl; + constructor(baseUrl?: string); + /** + * Layered semantic search (L0 -> L1 -> L2 tiered retrieval) + */ + search(request: SearchRequest): Promise; + /** + * Quick search returning only L0 abstracts + */ + find(query: string, scope?: string, limit?: number): Promise; + /** + * Layered recall - uses L0/L1/L2 tiered search internally + * + * The search engine performs tiered retrieval (L0→L1→L2) internally, + * but returns unified results with snippet and content. + * + * @param query - Search query + * @param scope - Optional session/thread scope + * @param limit - Maximum results + */ + recall(query: string, scope?: string, limit?: number): Promise; + /** + * List all sessions + */ + listSessions(): Promise; + /** + * Create a new session + */ + createSession(request?: CreateSessionRequest): Promise; + /** + * Add a message to a session + */ + addMessage(threadId: string, message: AddMessageRequest): Promise; + /** + * Close a session + */ + closeSession(threadId: string): Promise; + /** + * Switch tenant + */ + switchTenant(tenantId: string): Promise; + /** + * Health check + */ + healthCheck(): Promise; + private get; + private post; +} +//# sourceMappingURL=client.d.ts.map \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/client.d.ts.map b/examples/@memclaw/plugin/dist/src/client.d.ts.map new file mode 100644 index 0000000..67d831f --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/client.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAgC;IAIrD;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAK7D;;OAEG;IACG,IAAI,CACR,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC;IAS1B;;;;;;;;;OASG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC;IAS1B;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAKhD;;OAEG;IACG,aAAa,CACjB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,eAAe,CAAC;IAQ3B;;OAEG;IACG,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,MAAM,CAAC;IAQlB;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQ9D;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;YAUvB,GAAG;YAYH,IAAI;CAoBnB"} \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/client.js b/examples/@memclaw/plugin/dist/src/client.js new file mode 100644 index 0000000..6cbdccf --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/client.js @@ -0,0 +1,131 @@ +"use strict"; +/** + * Cortex Memory API Client + * + * HTTP client for cortex-mem-service REST API + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CortexMemClient = void 0; +/** + * Cortex Memory API Client + */ +class CortexMemClient { + baseUrl; + constructor(baseUrl = "http://localhost:8085") { + this.baseUrl = baseUrl.replace(/\/$/, ""); + } + /** + * Layered semantic search (L0 -> L1 -> L2 tiered retrieval) + */ + async search(request) { + const response = await this.post("/api/v2/search", request); + return response; + } + /** + * Quick search returning only L0 abstracts + */ + async find(query, scope, limit = 5) { + return this.search({ + query, + thread: scope, + limit, + min_score: 0.5, + }); + } + /** + * Layered recall - uses L0/L1/L2 tiered search internally + * + * The search engine performs tiered retrieval (L0→L1→L2) internally, + * but returns unified results with snippet and content. + * + * @param query - Search query + * @param scope - Optional session/thread scope + * @param limit - Maximum results + */ + async recall(query, scope, limit = 10) { + return this.search({ + query, + thread: scope, + limit, + min_score: 0.5, + }); + } + /** + * List all sessions + */ + async listSessions() { + const response = await this.get("/api/v2/sessions"); + return response; + } + /** + * Create a new session + */ + async createSession(request = {}) { + const response = await this.post("/api/v2/sessions", request); + return response; + } + /** + * Add a message to a session + */ + async addMessage(threadId, message) { + const response = await this.post(`/api/v2/sessions/${threadId}/messages`, message); + return response; + } + /** + * Close a session + */ + async closeSession(threadId) { + const response = await this.post(`/api/v2/sessions/${threadId}/close`, {}); + return response; + } + /** + * Switch tenant + */ + async switchTenant(tenantId) { + await this.post("/api/v2/tenants/switch", { tenant_id: tenantId }); + } + /** + * Health check + */ + async healthCheck() { + try { + const response = await fetch(`${this.baseUrl}/health`); + return response.ok; + } + catch { + return false; + } + } + // Private helpers + async get(path) { + const response = await fetch(`${this.baseUrl}${path}`); + if (!response.ok) { + throw new Error(`API error: ${response.status} ${response.statusText}`); + } + const data = (await response.json()); + if (!data.success) { + throw new Error(data.error || "API request failed"); + } + return data.data; + } + async post(path, body) { + const response = await fetch(`${this.baseUrl}${path}`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(body), + }); + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`API error: ${response.status} ${response.statusText} - ${errorText}`); + } + const data = (await response.json()); + if (!data.success) { + throw new Error(data.error || "API request failed"); + } + return data.data; + } +} +exports.CortexMemClient = CortexMemClient; +//# sourceMappingURL=client.js.map \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/client.js.map b/examples/@memclaw/plugin/dist/src/client.js.map new file mode 100644 index 0000000..f370917 --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/client.js.map @@ -0,0 +1 @@ +{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/config.d.ts b/examples/@memclaw/plugin/dist/src/config.d.ts new file mode 100644 index 0000000..b3c382c --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/config.d.ts @@ -0,0 +1,53 @@ +/** + * Configuration management for MemClaw + * + * Handles platform-specific config paths, config file generation, + * and auto-opening config files for user editing. + */ +export declare function getDataDir(): string; +export declare function getConfigPath(): string; +export interface MemClawConfig { + qdrant: { + url: string; + collection_name: string; + timeout_secs: number; + }; + llm: { + api_base_url: string; + api_key: string; + model_efficient: string; + temperature: number; + max_tokens: number; + }; + embedding: { + api_base_url: string; + api_key: string; + model_name: string; + batch_size: number; + timeout_secs: number; + }; + server: { + host: string; + port: number; + }; + logging: { + enabled: boolean; + log_directory: string; + level: string; + }; + cortex: { + enable_intent_analysis: boolean; + }; +} +export declare function generateConfigTemplate(): string; +export declare function ensureConfigExists(): { + created: boolean; + path: string; +}; +export declare function openConfigFile(configPath: string): Promise; +export declare function parseConfig(configPath: string): MemClawConfig; +export declare function validateConfig(config: MemClawConfig): { + valid: boolean; + errors: string[]; +}; +//# sourceMappingURL=config.d.ts.map \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/config.d.ts.map b/examples/@memclaw/plugin/dist/src/config.d.ts.map new file mode 100644 index 0000000..ad9ee8e --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/config.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,wBAAgB,UAAU,IAAI,MAAM,CAkBnC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,GAAG,EAAE;QACH,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,EAAE;QACT,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE;QACN,sBAAsB,EAAE,OAAO,CAAC;KACjC,CAAC;CACH;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CA2C/C;AAED,wBAAgB,kBAAkB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAevE;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBhE;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAkF7D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG;IACrD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAoBA"} \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/config.js b/examples/@memclaw/plugin/dist/src/config.js new file mode 100644 index 0000000..6c6211f --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/config.js @@ -0,0 +1,247 @@ +"use strict"; +/** + * Configuration management for MemClaw + * + * Handles platform-specific config paths, config file generation, + * and auto-opening config files for user editing. + */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getDataDir = getDataDir; +exports.getConfigPath = getConfigPath; +exports.generateConfigTemplate = generateConfigTemplate; +exports.ensureConfigExists = ensureConfigExists; +exports.openConfigFile = openConfigFile; +exports.parseConfig = parseConfig; +exports.validateConfig = validateConfig; +const fs = __importStar(require("fs")); +const path = __importStar(require("path")); +const os = __importStar(require("os")); +const child_process_1 = require("child_process"); +// Platform-specific paths +function getDataDir() { + const platform = process.platform; + if (platform === "win32") { + return path.join(process.env.LOCALAPPDATA || path.join(os.homedir(), "AppData", "Local"), "memclaw"); + } + else if (platform === "darwin") { + return path.join(os.homedir(), "Library", "Application Support", "memclaw"); + } + else { + return path.join(os.homedir(), ".local", "share", "memclaw"); + } +} +function getConfigPath() { + return path.join(getDataDir(), "config.toml"); +} +function generateConfigTemplate() { + return `# MemClaw Configuration +# +# This file was auto-generated. Please fill in the required values below. +# All sections are required - missing sections will cause config to be ignored. + +# Qdrant Vector Database Configuration +[qdrant] +url = "http://localhost:6334" +collection_name = "memclaw" +timeout_secs = 30 + +# LLM Configuration [REQUIRED for memory processing] +[llm] +api_base_url = "https://api.openai.com/v1" +api_key = "" +model_efficient = "gpt-5-mini" +temperature = 0.1 +max_tokens = 4096 + +# Embedding Configuration [REQUIRED for vector search] +[embedding] +api_base_url = "https://api.openai.com/v1" +api_key = "" +model_name = "text-embedding-3-small" +batch_size = 10 +timeout_secs = 30 + +# Service Configuration +[server] +host = "localhost" +port = 8085 + +# Logging Configuration +[logging] +enabled = false +log_directory = "logs" +level = "info" + +# Cortex Memory Settings +[cortex] +enable_intent_analysis = false +`; +} +function ensureConfigExists() { + const dataDir = getDataDir(); + const configPath = getConfigPath(); + if (!fs.existsSync(dataDir)) { + fs.mkdirSync(dataDir, { recursive: true }); + } + if (!fs.existsSync(configPath)) { + const template = generateConfigTemplate(); + fs.writeFileSync(configPath, template, "utf-8"); + return { created: true, path: configPath }; + } + return { created: false, path: configPath }; +} +function openConfigFile(configPath) { + return new Promise((resolve, reject) => { + const platform = process.platform; + let command; + let args = []; + if (platform === "win32") { + command = "cmd"; + args = ["/c", "start", '""', configPath]; + } + else if (platform === "darwin") { + command = "open"; + args = [configPath]; + } + else { + command = "xdg-open"; + args = [configPath]; + } + const proc = (0, child_process_1.spawn)(command, args, { detached: true, stdio: "ignore" }); + proc.on("error", (err) => { + reject(err); + }); + proc.unref(); + resolve(); + }); +} +function parseConfig(configPath) { + const content = fs.readFileSync(configPath, "utf-8"); + const config = {}; + let currentSection = ""; + for (const line of content.split("\n")) { + const trimmed = line.trim(); + // Skip comments and empty lines + if (trimmed.startsWith("#") || trimmed === "") + continue; + // Section header + const sectionMatch = trimmed.match(/^\[(\w+)\]$/); + if (sectionMatch) { + currentSection = sectionMatch[1]; + config[currentSection] = {}; + continue; + } + // Key-value pair + const kvMatch = trimmed.match(/^(\w+)\s*=\s*"([^"]*)"(?:\s*$|\s*#)/) || + trimmed.match(/^(\w+)\s*=\s*(\d+(?:\.\d+)?)(?:\s*$|\s*#)/) || + trimmed.match(/^(\w+)\s*=\s*(true|false)(?:\s*$|\s*#)/); + if (kvMatch && currentSection) { + const key = kvMatch[1]; + let value = kvMatch[2]; + // Convert to appropriate type + if (value === "true") + value = true; + else if (value === "false") + value = false; + else if (/^\d+$/.test(value)) + value = parseInt(value, 10); + else if (/^\d+\.\d+$/.test(value)) + value = parseFloat(value); + config[currentSection] = config[currentSection] || {}; + config[currentSection][key] = value; + } + } + // Apply defaults + return { + qdrant: { + url: "http://localhost:6334", + collection_name: "memclaw", + timeout_secs: 30, + ...(config.qdrant || {}), + }, + llm: { + api_base_url: "https://api.openai.com/v1", + api_key: "", + model_efficient: "gpt-5-mini", + temperature: 0.1, + max_tokens: 4096, + ...(config.llm || {}), + }, + embedding: { + api_base_url: "https://api.openai.com/v1", + api_key: "", + model_name: "text-embedding-3-small", + batch_size: 10, + timeout_secs: 30, + ...(config.embedding || {}), + }, + server: { + host: "localhost", + port: 8085, + ...(config.server || {}), + }, + logging: { + enabled: false, + log_directory: "logs", + level: "info", + ...(config.logging || {}), + }, + cortex: { + enable_intent_analysis: false, + ...(config.cortex || {}), + }, + }; +} +function validateConfig(config) { + const errors = []; + if (!config.llm.api_key || config.llm.api_key === "") { + errors.push("llm.api_key is required"); + } + if (!config.embedding.api_key || config.embedding.api_key === "") { + // Allow using llm.api_key for embedding if not specified + if (config.llm.api_key && config.llm.api_key !== "") { + config.embedding.api_key = config.llm.api_key; + } + else { + errors.push("embedding.api_key is required"); + } + } + return { + valid: errors.length === 0, + errors, + }; +} +//# sourceMappingURL=config.js.map \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/config.js.map b/examples/@memclaw/plugin/dist/src/config.js.map new file mode 100644 index 0000000..7877982 --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/config.js.map @@ -0,0 +1 @@ +{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/migrate.d.ts b/examples/@memclaw/plugin/dist/src/migrate.d.ts new file mode 100644 index 0000000..c4acd1f --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/migrate.d.ts @@ -0,0 +1,26 @@ +/** + * Migration script for OpenClaw native memory to MemClaw + * + * Migrates: + * - memory/YYYY-MM-DD.md → session timeline files + * - MEMORY.md → users/{tenant}/preferences.md + */ +interface MigrationResult { + dailyLogsMigrated: number; + memoryMdMigrated: boolean; + sessionsCreated: string[]; + errors: string[]; +} +/** + * Main migration function + */ +export declare function migrateFromOpenClaw(log?: (msg: string) => void): Promise; +/** + * Check if migration is possible + */ +export declare function canMigrate(): { + possible: boolean; + reason: string; +}; +export {}; +//# sourceMappingURL=migrate.d.ts.map \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/migrate.d.ts.map b/examples/@memclaw/plugin/dist/src/migrate.d.ts.map new file mode 100644 index 0000000..98f4f7d --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/migrate.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,UAAU,eAAe;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAgPD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC1B,OAAO,CAAC,eAAe,CAAC,CA8C1B;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAelE"} \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/migrate.js b/examples/@memclaw/plugin/dist/src/migrate.js new file mode 100644 index 0000000..6bc23e9 --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/migrate.js @@ -0,0 +1,287 @@ +"use strict"; +/** + * Migration script for OpenClaw native memory to MemClaw + * + * Migrates: + * - memory/YYYY-MM-DD.md → session timeline files + * - MEMORY.md → users/{tenant}/preferences.md + */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.migrateFromOpenClaw = migrateFromOpenClaw; +exports.canMigrate = canMigrate; +const fs = __importStar(require("fs")); +const path = __importStar(require("path")); +const os = __importStar(require("os")); +const child_process_1 = require("child_process"); +const util_1 = require("util"); +const glob_1 = require("glob"); +const config_js_1 = require("./config.js"); +const binaries_js_1 = require("./binaries.js"); +const execAsync = (0, util_1.promisify)(child_process_1.exec); +// Migration configuration +const MIGRATION_TENANT = 'tenant_claw'; +const DEFAULT_ROLE = 'user'; +/** + * Detect OpenClaw workspace directory + */ +function findOpenClawWorkspace() { + const homeDir = os.homedir(); + const workspacePath = path.join(homeDir, '.openclaw', 'workspace'); + if (fs.existsSync(workspacePath)) { + return workspacePath; + } + return null; +} +/** + * Split content into paragraphs (not just lines) + */ +function splitIntoParagraphs(content) { + return content + .split(/\n\s*\n/) + .map(p => p.trim()) + .filter(p => p.length > 0 && !p.startsWith('#')); // Skip headers +} +/** + * Generate L2 content for a single paragraph + */ +function generateL2Content(paragraph, sessionId, date, index) { + // Generate a deterministic timestamp based on index + const hour = String(index % 24).padStart(2, '0'); + const minute = String((index * 7) % 60).padStart(2, '0'); + const second = String((index * 13) % 60).padStart(2, '0'); + const timestamp = `${date}T${hour}:${minute}:${second}Z`; + const msgId = `${date.replace(/-/g, '')}_${String(index).padStart(4, '0')}`; + return `--- +id: "${msgId}" +role: "${DEFAULT_ROLE}" +timestamp: "${timestamp}" +thread_id: "${sessionId}" +--- +${paragraph}`; +} +/** + * Migrate daily logs from OpenClaw native memory to MemClaw + */ +async function migrateDailyLogs(ocWorkspace, dataDir, log) { + const memoryDir = path.join(ocWorkspace, 'memory'); + const count = 0; + const sessions = []; + const errors = []; + if (!fs.existsSync(memoryDir)) { + log?.('No memory directory found in OpenClaw workspace'); + return { count: 0, sessions: [], errors: [] }; + } + // Find all daily log files + const dailyLogPattern = path.join(memoryDir, '*.md').replace(/\\/g, '/'); + const files = await (0, glob_1.glob)(dailyLogPattern); + const dailyLogs = files.filter(f => { + const basename = path.basename(f); + return /^\d{4}-\d{2}-\d{2}\.md$/.test(basename); + }); + log?.(`Found ${dailyLogs.length} daily log files to migrate`); + for (const logPath of dailyLogs) { + try { + const date = path.basename(logPath, '.md'); // 2026-03-13 + const [year, month, day] = date.split('-'); + const sessionId = `migrated-oc-${date}`; + const timelineDir = path.join(dataDir, 'sessions', MIGRATION_TENANT, sessionId, 'timeline', year, month, day); + // Create directory + fs.mkdirSync(timelineDir, { recursive: true }); + // Read and split content + const content = fs.readFileSync(logPath, 'utf-8'); + const paragraphs = splitIntoParagraphs(content); + // Write each paragraph as L2 file + for (let i = 0; i < paragraphs.length; i++) { + const para = paragraphs[i]; + const hour = String(i % 24).padStart(2, '0'); + const minute = String((i * 7) % 60).padStart(2, '0'); + const second = String((i * 13) % 60).padStart(2, '0'); + const msgId = `${date.replace(/-/g, '')}_${String(i).padStart(4, '0')}`; + const l2Content = generateL2Content(para, sessionId, date, i); + const filename = `${hour}_${minute}_${second}_${msgId}.md`; + fs.writeFileSync(path.join(timelineDir, filename), l2Content, 'utf-8'); + } + sessions.push(sessionId); + log?.(`Migrated ${date}: ${paragraphs.length} messages`); + } + catch (err) { + const errorMsg = `Failed to migrate ${logPath}: ${err}`; + errors.push(errorMsg); + log?.(`Error: ${errorMsg}`); + } + } + return { + count: dailyLogs.length, + sessions, + errors, + }; +} +/** + * Migrate MEMORY.md to user preferences + */ +async function migrateMemoryMd(ocWorkspace, dataDir, log) { + const memoryMdPath = path.join(ocWorkspace, 'MEMORY.md'); + if (!fs.existsSync(memoryMdPath)) { + log?.('No MEMORY.md found'); + return { migrated: false }; + } + try { + const userDir = path.join(dataDir, 'users', MIGRATION_TENANT); + fs.mkdirSync(userDir, { recursive: true }); + const content = fs.readFileSync(memoryMdPath, 'utf-8'); + const targetPath = path.join(userDir, 'preferences.md'); + // Add header to indicate migration source + const migratedContent = ` +${content}`; + fs.writeFileSync(targetPath, migratedContent, 'utf-8'); + log?.('Migrated MEMORY.md to user preferences'); + return { migrated: true }; + } + catch (err) { + const error = `Failed to migrate MEMORY.md: ${err}`; + log?.(`Error: ${error}`); + return { migrated: false, error }; + } +} +/** + * Generate L0/L1 layers using cortex-mem-cli + */ +async function generateLayers(configPath, tenant, log) { + log?.('Generating L0/L1 layers...'); + const cliPath = (0, binaries_js_1.getCliPath)(); + if (!cliPath) { + log?.('cortex-mem-cli not found, skipping layer generation'); + return; + } + try { + const { stdout, stderr } = await execAsync(`"${cliPath}" --config "${configPath}" --tenant ${tenant} layers ensure-all`, { timeout: 300000 } // 5 minutes + ); + if (stdout) + log?.(stdout); + if (stderr) + log?.(stderr); + log?.('Layer generation completed'); + } + catch (err) { + log?.(`Layer generation warning: ${err}`); + // Don't throw - this is not critical for migration + } +} +/** + * Generate vector index using cortex-mem-cli + */ +async function generateVectorIndex(configPath, tenant, log) { + log?.('Generating vector index...'); + const cliPath = (0, binaries_js_1.getCliPath)(); + if (!cliPath) { + log?.('cortex-mem-cli not found, skipping vector index generation'); + return; + } + try { + const { stdout, stderr } = await execAsync(`"${cliPath}" --config "${configPath}" --tenant ${tenant} vector reindex`, { timeout: 600000 } // 10 minutes + ); + if (stdout) + log?.(stdout); + if (stderr) + log?.(stderr); + log?.('Vector index generation completed'); + } + catch (err) { + log?.(`Vector index warning: ${err}`); + // Don't throw - this is not critical for migration + } +} +/** + * Main migration function + */ +async function migrateFromOpenClaw(log) { + const result = { + dailyLogsMigrated: 0, + memoryMdMigrated: false, + sessionsCreated: [], + errors: [], + }; + log?.('Starting OpenClaw memory migration...'); + // Find OpenClaw workspace + const ocWorkspace = findOpenClawWorkspace(); + if (!ocWorkspace) { + const error = 'OpenClaw workspace not found at ~/.openclaw/workspace'; + result.errors.push(error); + log?.(error); + return result; + } + log?.(`Found OpenClaw workspace: ${ocWorkspace}`); + const dataDir = (0, config_js_1.getDataDir)(); + const configPath = (0, config_js_1.getConfigPath)(); + // Migrate daily logs + const dailyResult = await migrateDailyLogs(ocWorkspace, dataDir, log); + result.dailyLogsMigrated = dailyResult.count; + result.sessionsCreated = dailyResult.sessions; + result.errors.push(...dailyResult.errors); + // Migrate MEMORY.md + const memoryMdResult = await migrateMemoryMd(ocWorkspace, dataDir, log); + result.memoryMdMigrated = memoryMdResult.migrated; + if (memoryMdResult.error) { + result.errors.push(memoryMdResult.error); + } + // Generate layers and index + if (result.dailyLogsMigrated > 0 || result.memoryMdMigrated) { + await generateLayers(configPath, MIGRATION_TENANT, log); + await generateVectorIndex(configPath, MIGRATION_TENANT, log); + } + log?.(`Migration completed: ${result.dailyLogsMigrated} daily logs, MEMORY.md: ${result.memoryMdMigrated}`); + return result; +} +/** + * Check if migration is possible + */ +function canMigrate() { + const ocWorkspace = findOpenClawWorkspace(); + if (!ocWorkspace) { + return { possible: false, reason: 'OpenClaw workspace not found' }; + } + const memoryDir = path.join(ocWorkspace, 'memory'); + const memoryMd = path.join(ocWorkspace, 'MEMORY.md'); + if (!fs.existsSync(memoryDir) && !fs.existsSync(memoryMd)) { + return { possible: false, reason: 'No memory files found in OpenClaw workspace' }; + } + return { possible: true, reason: 'OpenClaw memory found and ready for migration' }; +} +//# sourceMappingURL=migrate.js.map \ No newline at end of file diff --git a/examples/@memclaw/plugin/dist/src/migrate.js.map b/examples/@memclaw/plugin/dist/src/migrate.js.map new file mode 100644 index 0000000..eb4c58f --- /dev/null +++ b/examples/@memclaw/plugin/dist/src/migrate.js.map @@ -0,0 +1 @@ +{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/migrate.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/@memclaw/plugin/index.ts b/examples/@memclaw/plugin/index.ts new file mode 100644 index 0000000..ffe2c33 --- /dev/null +++ b/examples/@memclaw/plugin/index.ts @@ -0,0 +1,87 @@ +/** + * MemClaw - Layered Semantic Memory for OpenClaw + * + * Provides: + * - L0/L1/L2 tiered memory retrieval + * - Automatic service startup (Qdrant + cortex-mem-service) + * - Migration from OpenClaw native memory + * + * Installation: + * openclaw plugins install memclaw + * + * Configuration (in openclaw.json): + * { + * "plugins": { + * "entries": { + * "memclaw": { + * "enabled": true, + * "config": { + * "serviceUrl": "http://127.0.0.1:8085", + * "tenantId": "tenant_claw", + * "autoStartServices": true + * } + * } + * } + * } + * } + */ + +import { createPlugin } from './plugin-impl.js'; + +// Re-export types +export type { CortexMemClient } from './src/client.js'; +export type { MemClawConfig } from './src/config.js'; + +// OpenClaw Plugin API types +interface PluginLogger { + debug?: (msg: string, ...args: unknown[]) => void; + info: (msg: string, ...args: unknown[]) => void; + warn: (msg: string, ...args: unknown[]) => void; + error: (msg: string, ...args: unknown[]) => void; +} + +interface ToolDefinition { + name: string; + description: string; + parameters: object; + execute: (_id: string, params: Record) => Promise; + optional?: boolean; +} + +interface PluginAPI { + pluginConfig?: Record; + registerTool(tool: ToolDefinition, opts?: { optional?: boolean }): void; + registerService(service: { + id: string; + start: () => Promise; + stop: () => Promise; + }): void; + logger: PluginLogger; +} + +// Default export - main plugin function +export default function memclawPlugin(api: PluginAPI) { + return createPlugin(api); +} + +// Named export - object style registration +export const plugin = { + id: 'memclaw', + name: 'MemClaw', + version: '0.9.6', + configSchema: { + type: 'object', + properties: { + serviceUrl: { type: 'string', default: 'http://localhost:8085' }, + defaultSessionId: { type: 'string', default: 'default' }, + searchLimit: { type: 'integer', default: 10 }, + minScore: { type: 'number', default: 0.6 }, + tenantId: { type: 'string', default: 'tenant_claw' }, + autoStartServices: { type: 'boolean', default: true } + }, + required: [] + }, + register(api: PluginAPI) { + return createPlugin(api); + } +}; diff --git a/examples/@memclaw/plugin/openclaw.plugin.json b/examples/@memclaw/plugin/openclaw.plugin.json new file mode 100644 index 0000000..aa50803 --- /dev/null +++ b/examples/@memclaw/plugin/openclaw.plugin.json @@ -0,0 +1,72 @@ +{ + "id": "memclaw", + "name": "MemClaw", + "version": "0.9.6", + "description": "Layered semantic memory for OpenClaw with L0/L1/L2 tiered retrieval, easy setup, and migration from native memory", + "kind": "memory", + "skills": ["skill"], + "configSchema": { + "type": "object", + "properties": { + "serviceUrl": { + "type": "string", + "description": "Cortex Memory service URL", + "default": "http://127.0.0.1:8085" + }, + "defaultSessionId": { + "type": "string", + "description": "Default session ID for memory operations", + "default": "default" + }, + "searchLimit": { + "type": "integer", + "description": "Default number of search results", + "default": 10, + "minimum": 1, + "maximum": 50 + }, + "minScore": { + "type": "number", + "description": "Minimum relevance score for search results", + "default": 0.6, + "minimum": 0, + "maximum": 1 + }, + "tenantId": { + "type": "string", + "description": "Tenant ID for data isolation", + "default": "tenant_claw" + }, + "autoStartServices": { + "type": "boolean", + "description": "Automatically start Qdrant and cortex-mem-service if not running", + "default": true + }, + "qdrantPort": { + "type": "integer", + "description": "Qdrant port (default: 6333 for HTTP, 6334 for gRPC)", + "default": 6334 + }, + "servicePort": { + "type": "integer", + "description": "cortex-mem-service port", + "default": 8085 + } + }, + "required": [] + }, + "uiHints": { + "serviceUrl": { + "label": "Service URL", + "description": "The HTTP endpoint of your cortex-mem-service instance" + }, + "tenantId": { + "label": "Tenant ID", + "description": "Tenant identifier for data isolation" + }, + "autoStartServices": { + "label": "Auto-start Services", + "description": "Automatically start Qdrant and cortex-mem-service when plugin loads" + } + } +} diff --git a/examples/memclaw/package.json b/examples/@memclaw/plugin/package.json similarity index 73% rename from examples/memclaw/package.json rename to examples/@memclaw/plugin/package.json index d297f76..c76d3ac 100644 --- a/examples/memclaw/package.json +++ b/examples/@memclaw/plugin/package.json @@ -1,7 +1,10 @@ { - "name": "memclaw", - "version": "0.9.0", - "description": "MemClaw - The Cortex Memory' plugin for OpenClaw. Layered semantic memory for OpenClaw with easy setup and migration", + "name": "@memclaw/plugin", + "version": "0.9.6", + "description": "MemClaw - The Cortex Memory plugin for OpenClaw. Layered semantic memory for OpenClaw with easy setup and migration", + "publishConfig": { + "access": "public" + }, "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { @@ -39,7 +42,7 @@ "@memclaw/bin-win-x64": "0.1.0" }, "engines": { - "node": ">=22.0.0" + "node": ">=20.0.0" }, "files": [ "dist/", diff --git a/examples/memclaw/plugin-impl.ts b/examples/@memclaw/plugin/plugin-impl.ts similarity index 100% rename from examples/memclaw/plugin-impl.ts rename to examples/@memclaw/plugin/plugin-impl.ts diff --git a/examples/memclaw/skill/SKILL.md b/examples/@memclaw/plugin/skill/SKILL.md similarity index 64% rename from examples/memclaw/skill/SKILL.md rename to examples/@memclaw/plugin/skill/SKILL.md index f9182a3..920b884 100644 --- a/examples/memclaw/skill/SKILL.md +++ b/examples/@memclaw/plugin/skill/SKILL.md @@ -21,7 +21,37 @@ MemClaw provides **three-layer semantic memory** with tiered retrieval: The search engine queries all three layers internally and returns unified results with `snippet` and `content`. -## Quick Decision Flow +## Pre-Use Requirements + +**IMPORTANT**: Before using MemClaw for the first time, you MUST ensure: + +1. **Qdrant** is running on port 6333/6334 +2. **cortex-mem-service** is running on port 8085 with `--data-dir` +3. **LLM/Embedding API** is configured in `config.toml` + +## First-Time Setup (Agent Action Required) + +When MemClaw is used for the first time, **YOU MUST**: + +1. **Ask the user for LLM/Embedding configuration**: + - `llm.api_base_url` — LLM API endpoint (e.g., OpenAI-compatible provider) + - `llm.api_key` — LLM API key + - `embedding.api_base_url` — Embedding API endpoint + - `embedding.api_key` — Embedding API key + +2. **Write the configuration file** to the platform-specific data directory: + + | Platform | config.toml Path | + |----------|------------------| + | macOS | `~/Library/Application Support/memclaw/config.toml` | + | Windows | `%LOCALAPPDATA%\memclaw\config.toml` | + | Linux | `~/.local/share/memclaw/config.toml` | + +3. **Use the full configuration template** from `references/setup.md` + +> **See `references/setup.md`** for the complete configuration file template and service setup details. + +## Decision Flow 1. **Need to find something** → `cortex_search` 2. **Need more context** → `cortex_recall` @@ -64,11 +94,14 @@ The search engine queries all three layers internally and returns unified result | Services won't start | Check ports 6333, 6334, 8085; verify `api_key` in config.toml | | Search returns no results | Run `cortex_list_sessions` to verify; lower `min_score` threshold | | Migration fails | Ensure OpenClaw workspace at `~/.openclaw/workspace` | +| cortex-mem-service fails | Ensure `--data-dir` is set and `config.toml` exists in that directory | +| LLM/Embedding errors | Verify `llm.api_key` and `embedding.api_key` are configured in `config.toml` | +| Platform not supported | MemClaw supports macOS Apple Silicon and Windows x64 only | ## References For detailed information, see: -- **`references/setup.md`** — Installation and configuration guide +- **`references/setup.md`** — Installation, service setup, and configuration guide - **`references/tools.md`** — Detailed tool parameters and examples -- **`references/maintenance.md`** — CLI commands for data maintenance and optimization \ No newline at end of file +- **`references/maintenance.md`** — CLI commands for data maintenance and optimization diff --git a/examples/memclaw/skill/references/maintenance.md b/examples/@memclaw/plugin/skill/references/maintenance.md similarity index 100% rename from examples/memclaw/skill/references/maintenance.md rename to examples/@memclaw/plugin/skill/references/maintenance.md diff --git a/examples/@memclaw/plugin/skill/references/setup.md b/examples/@memclaw/plugin/skill/references/setup.md new file mode 100644 index 0000000..f45ab9c --- /dev/null +++ b/examples/@memclaw/plugin/skill/references/setup.md @@ -0,0 +1,255 @@ +# Setup Guide + +Installation and configuration guide for MemClaw. + +## Supported Platforms + +| Platform | npm Package | +|----------|-------------| +| macOS Apple Silicon | `@memclaw/bin-darwin-arm64` | +| Windows x64 | `@memclaw/bin-win-x64` | + +> **Note**: MemClaw is only supported on the platforms listed above. + +## Requirements + +| Requirement | Details | +|-------------|---------| +| **Node.js** | ≥ 20.0.0 | +| **OpenClaw** | Installed and configured | +| **Qdrant** | Vector database (port 6333/6334) | +| **cortex-mem-service** | Memory service (port 8085) | + +## Binary Installation + +MemClaw binaries (Qdrant, cortex-mem-service, cortex-mem-cli) are distributed via platform-specific npm packages: + +- `@memclaw/bin-darwin-arm64` — macOS Apple Silicon +- `@memclaw/bin-win-x64` — Windows x64 + +These packages are installed automatically as optional dependencies when installing `@memclaw/plugin`. + +### Manual Binary Installation + +If binaries are not installed, run: + +``` +npm install @memclaw/bin-darwin-arm64 +or +bun install @memclaw/bin-darwin-arm64 +``` + +or (for Windows): + +``` +npm install @memclaw/bin-win-x64 +or +bun install @memclaw/bin-win-x64 +``` + +## First-Time Setup Checklist + +**Before using MemClaw, complete these steps:** + +### Step 1: Verify Platform Support + +Ensure you are on a supported platform (macOS Apple Silicon or Windows x86/x64). + +### Step 2: Create Data Directory + +Create the data directory if it does not exist: + +| Platform | Command | +|----------|---------| +| macOS | `mkdir -p ~/Library/Application\ Support/memclaw` | +| Windows | `mkdir %LOCALAPPDATA%\memclaw` | +| Linux | `mkdir -p ~/.local/share/memclaw` | + +### Step 3: Ask User for Configuration + +**Agent MUST ask the user for the following information:** + +1. **LLM Configuration**: + - API endpoint URL (OpenAI-compatible) + - API key + +2. **Embedding Configuration**: + - API endpoint URL (OpenAI-compatible) + - API key + - Model name (default: `text-embedding-3-small`) + +### Step 4: Write Configuration File + +Write `config.toml` to the data directory with all required sections: + +| Platform | config.toml Path | +|----------|------------------| +| macOS | `~/Library/Application Support/memclaw/config.toml` | +| Windows | `%LOCALAPPDATA%\memclaw\config.toml` | +| Linux | `~/.local/share/memclaw/config.toml` | + +**Full configuration template:** + +```toml +# Qdrant Vector Database Configuration +[qdrant] +url = "http://localhost:6334" +collection_name = "memclaw" +timeout_secs = 30 + +# LLM Configuration [REQUIRED] +[llm] +api_base_url = "https://your-llm-provider.com/v1" +api_key = "your-api-key-here" +model_efficient = "gpt-5-mini" +temperature = 0.1 +max_tokens = 4096 + +# Embedding Configuration [REQUIRED] +[embedding] +api_base_url = "https://your-embedding-provider.com/v1" +api_key = "your-api-key-here" +model_name = "text-embedding-3-small" +batch_size = 10 +timeout_secs = 30 + +# Service Configuration +[server] +host = "localhost" +port = 8085 + +# Logging Configuration +[logging] +enabled = false +log_directory = "logs" +level = "info" + +# Cortex Memory Settings +[cortex] +enable_intent_analysis = false +``` + +> **CRITICAL**: All sections are required. If any section is missing, cortex-mem-service will silently fall back to environment variables and the configuration will be ignored. + +### Step 5: Verify Services + +Check that Qdrant and cortex-mem-service are accessible: + +| Service | Port | Health Check | +|---------|------|--------------| +| Qdrant | 6333 (HTTP), 6334 (gRPC) | HTTP GET to `http://localhost:6333` should return Qdrant version info | +| cortex-mem-service | 8085 | HTTP GET to `http://localhost:8085/health` should return `{"status":"ok"}` | + +### Step 6: Start Services (if not running) + +**Starting Qdrant:** + +If `autoStartServices` is `true` in plugin config, MemClaw will start Qdrant automatically. + +To start manually, run the Qdrant binary from the platform package with: +- `--storage-path` pointing to a storage directory +- `--http-port 6333` +- `--grpc-port 6334` + +**Starting cortex-mem-service:** + +**CRITICAL**: cortex-mem-service MUST be started with `--data-dir` flag pointing to the directory containing `config.toml`. + +Arguments: +- `--data-dir ` — Path to data directory containing `config.toml` (**REQUIRED**) + +Example: +``` +cortex-mem-service --data-dir ~/Library/Application\ Support/memclaw +``` + +Or on Windows: +``` +cortex-mem-service --data-dir %LOCALAPPDATA%\memclaw +``` + +## Plugin Configuration + +Edit your `openclaw.json`: + +```json +{ + "plugins": { + "entries": { + "memclaw": { + "enabled": true, + "config": { + "serviceUrl": "http://localhost:8085", + "tenantId": "tenant_claw", + "autoStartServices": true + } + } + } + }, + "agents": { + "defaults": { + "memorySearch": { "enabled": false } + } + } +} +``` + +> **Important**: Set `memorySearch.enabled: false` to disable OpenClaw's built-in memory search and use MemClaw instead. + +### Configuration Options + +| Option | Type | Default | Description | +|--------|------|---------|-------------| +| `serviceUrl` | string | `http://localhost:8085` | Cortex Memory service URL | +| `tenantId` | string | `tenant_claw` | Tenant ID for data isolation | +| `autoStartServices` | boolean | `true` | Auto-start Qdrant and cortex-mem-service | +| `defaultSessionId` | string | `default` | Default session for memory operations | +| `searchLimit` | number | `10` | Default number of search results | +| `minScore` | number | `0.6` | Minimum relevance score (0-1) | + +## Troubleshooting + +### Platform Not Supported + +If you see "Platform not supported" error: +- Verify you are on macOS Apple Silicon or Windows x64 +- Check that the correct `@memclaw/bin-*` package is installed + +### Binaries Not Found + +If binaries are missing: +1. Verify `@memclaw/bin-*` package is in `node_modules` +2. Try npm/bun reinstalling: `npm install @memclaw/bin-darwin-arm64` (or `bin-win-x64`) + +### cortex-mem-service Won't Start + +1. Verify `--data-dir` flag is provided +2. Verify `config.toml` exists in the data directory +3. Verify required fields in `config.toml`: + - `llm.api_key` is non-empty + - `embedding.api_key` is non-empty + +Default data directories: +| Platform | Path | +|----------|------| +| macOS | `~/Library/Application Support/memclaw` | +| Windows | `%LOCALAPPDATA%\memclaw` | +| Linux | `~/.local/share/memclaw` | + +### Services Not Accessible + +1. Verify ports 6333, 6334, 8085 are not in use by other applications +2. Verify firewall allows connections on these ports +3. Check service logs for error messages + +### Configuration File Issues + +1. Ensure `config.toml` uses valid TOML syntax +2. Verify file encoding is UTF-8 +3. On Windows, use double backslashes in paths: `C:\\Users\\...` + +### API Key Issues + +1. Verify API key is valid and has sufficient credits +2. Verify `api_base_url` is correct for your provider +3. Verify network connectivity to the API endpoint diff --git a/examples/memclaw/skill/references/tools.md b/examples/@memclaw/plugin/skill/references/tools.md similarity index 100% rename from examples/memclaw/skill/references/tools.md rename to examples/@memclaw/plugin/skill/references/tools.md diff --git a/examples/memclaw/src/binaries.ts b/examples/@memclaw/plugin/src/binaries.ts similarity index 97% rename from examples/memclaw/src/binaries.ts rename to examples/@memclaw/plugin/src/binaries.ts index 084bcda..2a63265 100644 --- a/examples/memclaw/src/binaries.ts +++ b/examples/@memclaw/plugin/src/binaries.ts @@ -11,7 +11,7 @@ import * as fs from "fs"; import * as path from "path"; import { spawn, ChildProcess } from "child_process"; -import { getDataDir, getConfigPath } from "./config.js"; +import { getDataDir } from "./config.js"; // Binary names type type BinaryName = "qdrant" | "cortex-mem-service" | "cortex-mem-cli"; @@ -236,14 +236,14 @@ export async function startCortexMemService( ); } - const configPath = getConfigPath(); const dataDir = getDataDir(); - log?.(`Starting cortex-mem-service with config ${configPath}...`); + log?.(`Starting cortex-mem-service with data-dir ${dataDir}...`); + // cortex-mem-service automatically reads config.toml from --data-dir const proc = spawn( binaryPath, - ["--config", configPath, "--data-dir", dataDir], + ["--data-dir", dataDir], { stdio: ["ignore", "pipe", "pipe"], detached: true, diff --git a/examples/memclaw/src/client.ts b/examples/@memclaw/plugin/src/client.ts similarity index 100% rename from examples/memclaw/src/client.ts rename to examples/@memclaw/plugin/src/client.ts diff --git a/examples/memclaw/src/config.ts b/examples/@memclaw/plugin/src/config.ts similarity index 83% rename from examples/memclaw/src/config.ts rename to examples/@memclaw/plugin/src/config.ts index f74eff8..caf15c7 100644 --- a/examples/memclaw/src/config.ts +++ b/examples/@memclaw/plugin/src/config.ts @@ -11,21 +11,6 @@ import * as os from "os"; import { spawn } from "child_process"; // Platform-specific paths -export function getConfigDir(): string { - const platform = process.platform; - - if (platform === "win32") { - return path.join( - process.env.APPDATA || path.join(os.homedir(), "AppData", "Roaming"), - "memclaw", - ); - } else if (platform === "darwin") { - return path.join(os.homedir(), "Library", "Application Support", "memclaw"); - } else { - return path.join(os.homedir(), ".config", "memclaw"); - } -} - export function getDataDir(): string { const platform = process.platform; @@ -33,7 +18,6 @@ export function getDataDir(): string { return path.join( process.env.LOCALAPPDATA || path.join(os.homedir(), "AppData", "Local"), "memclaw", - "data", ); } else if (platform === "darwin") { return path.join( @@ -41,15 +25,14 @@ export function getDataDir(): string { "Library", "Application Support", "memclaw", - "data", ); } else { - return path.join(os.homedir(), ".local", "share", "memclaw", "data"); + return path.join(os.homedir(), ".local", "share", "memclaw"); } } export function getConfigPath(): string { - return path.join(getConfigDir(), "config.toml"); + return path.join(getDataDir(), "config.toml"); } export interface MemClawConfig { @@ -76,19 +59,21 @@ export interface MemClawConfig { host: string; port: number; }; + logging: { + enabled: boolean; + log_directory: string; + level: string; + }; cortex: { - data_dir: string; enable_intent_analysis: boolean; }; } export function generateConfigTemplate(): string { - const dataDir = getDataDir().replace(/\\/g, "/"); - return `# MemClaw Configuration # # This file was auto-generated. Please fill in the required values below. -# Required fields are marked with [REQUIRED] +# All sections are required - missing sections will cause config to be ignored. # Qdrant Vector Database Configuration [qdrant] @@ -98,20 +83,15 @@ timeout_secs = 30 # LLM Configuration [REQUIRED for memory processing] [llm] -# Your LLM API endpoint (OpenAI-compatible) api_base_url = "https://api.openai.com/v1" -# Your API key [REQUIRED] api_key = "" -# Model for memory extraction and layer generation -model_efficient = "gpt-4o-mini" +model_efficient = "gpt-5-mini" temperature = 0.1 max_tokens = 4096 # Embedding Configuration [REQUIRED for vector search] [embedding] -# Your embedding API endpoint (OpenAI-compatible) api_base_url = "https://api.openai.com/v1" -# Your API key [REQUIRED - can be same as llm.api_key] api_key = "" model_name = "text-embedding-3-small" batch_size = 10 @@ -122,19 +102,24 @@ timeout_secs = 30 host = "localhost" port = 8085 +# Logging Configuration +[logging] +enabled = false +log_directory = "logs" +level = "info" + # Cortex Memory Settings [cortex] -data_dir = "${dataDir}" enable_intent_analysis = false `; } export function ensureConfigExists(): { created: boolean; path: string } { - const configDir = getConfigDir(); + const dataDir = getDataDir(); const configPath = getConfigPath(); - if (!fs.existsSync(configDir)) { - fs.mkdirSync(configDir, { recursive: true }); + if (!fs.existsSync(dataDir)) { + fs.mkdirSync(dataDir, { recursive: true }); } if (!fs.existsSync(configPath)) { @@ -214,7 +199,6 @@ export function parseConfig(configPath: string): MemClawConfig { } // Apply defaults - const dataDir = getDataDir(); return { qdrant: { @@ -244,8 +228,13 @@ export function parseConfig(configPath: string): MemClawConfig { port: 8085, ...(config.server || {}), }, + logging: { + enabled: false, + log_directory: "logs", + level: "info", + ...(config.logging || {}), + }, cortex: { - data_dir: dataDir, enable_intent_analysis: false, ...(config.cortex || {}), }, diff --git a/examples/memclaw/src/migrate.ts b/examples/@memclaw/plugin/src/migrate.ts similarity index 100% rename from examples/memclaw/src/migrate.ts rename to examples/@memclaw/plugin/src/migrate.ts diff --git a/examples/memclaw/tsconfig.json b/examples/@memclaw/plugin/tsconfig.json similarity index 100% rename from examples/memclaw/tsconfig.json rename to examples/@memclaw/plugin/tsconfig.json diff --git a/examples/cortex-mem-tars/config.example.toml b/examples/cortex-mem-tars/config.example.toml index ff640d6..bbadfda 100644 --- a/examples/cortex-mem-tars/config.example.toml +++ b/examples/cortex-mem-tars/config.example.toml @@ -55,6 +55,7 @@ cors_origins = ["*"] # # 留空或注释此行将使用默认值(应用数据目录) # data_dir = "/path/to/custom/cortex/data" +enable_intent_analysis = false # 日志配置 [logging] diff --git a/examples/memclaw/index.ts b/examples/memclaw/index.ts deleted file mode 100644 index 127a229..0000000 --- a/examples/memclaw/index.ts +++ /dev/null @@ -1,87 +0,0 @@ -/** - * MemClaw - Layered Semantic Memory for OpenClaw - * - * Provides: - * - L0/L1/L2 tiered memory retrieval - * - Automatic service startup (Qdrant + cortex-mem-service) - * - Migration from OpenClaw native memory - * - * Installation: - * openclaw plugins install memclaw - * - * Configuration (in openclaw.json): - * { - * "plugins": { - * "entries": { - * "memclaw": { - * "enabled": true, - * "config": { - * "serviceUrl": "http://127.0.0.1:8085", - * "tenantId": "tenant_claw", - * "autoStartServices": true - * } - * } - * } - * } - * } - */ - -import { createPlugin } from "./plugin-impl.js"; - -// Re-export types -export type { CortexMemClient } from "./src/client.js"; -export type { MemClawConfig } from "./src/config.js"; - -// OpenClaw Plugin API types -interface PluginLogger { - debug?: (msg: string, ...args: unknown[]) => void; - info: (msg: string, ...args: unknown[]) => void; - warn: (msg: string, ...args: unknown[]) => void; - error: (msg: string, ...args: unknown[]) => void; -} - -interface ToolDefinition { - name: string; - description: string; - parameters: object; - execute: (_id: string, params: Record) => Promise; - optional?: boolean; -} - -interface PluginAPI { - pluginConfig?: Record; - registerTool(tool: ToolDefinition, opts?: { optional?: boolean }): void; - registerService(service: { - id: string; - start: () => Promise; - stop: () => Promise; - }): void; - logger: PluginLogger; -} - -// Default export - main plugin function -export default function memclawPlugin(api: PluginAPI) { - return createPlugin(api); -} - -// Named export - object style registration -export const plugin = { - id: "memclaw", - name: "MemClaw", - version: "0.9.0", - configSchema: { - type: "object", - properties: { - serviceUrl: { type: "string", default: "http://localhost:8085" }, - defaultSessionId: { type: "string", default: "default" }, - searchLimit: { type: "integer", default: 10 }, - minScore: { type: "number", default: 0.6 }, - tenantId: { type: "string", default: "tenant_claw" }, - autoStartServices: { type: "boolean", default: true }, - }, - required: [], - }, - register(api: PluginAPI) { - return createPlugin(api); - }, -}; diff --git a/examples/memclaw/openclaw.plugin.json b/examples/memclaw/openclaw.plugin.json deleted file mode 100644 index a3d654c..0000000 --- a/examples/memclaw/openclaw.plugin.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "id": "memclaw", - "name": "MemClaw", - "version": "0.1.0", - "description": "Layered semantic memory for OpenClaw with L0/L1/L2 tiered retrieval, easy setup, and migration from native memory", - "kind": "memory", - "skills": ["skill"], - "configSchema": { - "type": "object", - "properties": { - "serviceUrl": { - "type": "string", - "description": "Cortex Memory service URL", - "default": "http://127.0.0.1:8085" - }, - "defaultSessionId": { - "type": "string", - "description": "Default session ID for memory operations", - "default": "default" - }, - "searchLimit": { - "type": "integer", - "description": "Default number of search results", - "default": 10, - "minimum": 1, - "maximum": 50 - }, - "minScore": { - "type": "number", - "description": "Minimum relevance score for search results", - "default": 0.6, - "minimum": 0, - "maximum": 1 - }, - "tenantId": { - "type": "string", - "description": "Tenant ID for data isolation", - "default": "tenant_claw" - }, - "autoStartServices": { - "type": "boolean", - "description": "Automatically start Qdrant and cortex-mem-service if not running", - "default": true - }, - "qdrantPort": { - "type": "integer", - "description": "Qdrant port (default: 6333 for HTTP, 6334 for gRPC)", - "default": 6334 - }, - "servicePort": { - "type": "integer", - "description": "cortex-mem-service port", - "default": 8085 - } - }, - "required": [] - }, - "uiHints": { - "serviceUrl": { - "label": "Service URL", - "description": "The HTTP endpoint of your cortex-mem-service instance" - }, - "tenantId": { - "label": "Tenant ID", - "description": "Tenant identifier for data isolation" - }, - "autoStartServices": { - "label": "Auto-start Services", - "description": "Automatically start Qdrant and cortex-mem-service when plugin loads" - } - } -} diff --git a/examples/memclaw/skill/references/setup.md b/examples/memclaw/skill/references/setup.md deleted file mode 100644 index c1f3ecc..0000000 --- a/examples/memclaw/skill/references/setup.md +++ /dev/null @@ -1,150 +0,0 @@ -# Setup Guide - -Installation and configuration guide for MemClaw. - -## Requirements - -| Requirement | Details | -|-------------|---------| -| **Platforms** | Windows x86, macOS Apple Silicon | -| **Node.js** | ≥ 22.0.0 | -| **OpenClaw** | Installed and configured | - -## Installation - -### Method 1: Install from ClawHub - -```bash -openclaw plugins install memclaw -``` - -### Method 2: Local Development Installation - -For developers using a local version or developing the plugin: - -```bash -# Clone the repository -git clone https://github.com/sopaco/cortex-mem.git -cd cortex-mem/examples/memclaw - -# Install dependencies -bun install - -# Build the plugin -bun run build - -# Create symlink to plugin directory -mkdir -p ~/.openclaw/plugins -ln -sf "$(pwd)" ~/.openclaw/plugins/memclaw -``` - -Configure in `openclaw.json` with local path: - -```json -{ - "plugins": { - "entries": { - "memclaw": { - "enabled": true, - "path": "./plugins/memclaw" - } - } - } -} -``` - -After code changes, rebuild with `bun run build` and restart OpenClaw. - -## OpenClaw Configuration - -Edit your `openclaw.json`: - -```json -{ - "plugins": { - "entries": { - "memclaw": { - "enabled": true, - "config": { - "serviceUrl": "http://127.0.0.1:8085", - "tenantId": "tenant_claw", - "autoStartServices": true - } - } - } - }, - "agents": { - "defaults": { - "memorySearch": { "enabled": false } - } - } -} -``` - -> **Important**: Set `memorySearch.enabled: false` to disable OpenClaw's built-in memory search and use MemClaw instead. - -## LLM Configuration - -On first run, MemClaw creates a configuration file: - -| Platform | Path | -|----------|------| -| Windows | `%APPDATA%\memclaw\config.toml` | -| macOS | `~/Library/Application Support/memclaw/config.toml` | - -Edit the configuration file and fill in required fields: - -```toml -# LLM Configuration [REQUIRED for memory processing] -[llm] -# Your LLM API endpoint (OpenAI-compatible) -api_base_url = "https://api.openai.com/v1" -# Your API key [REQUIRED] -api_key = "sk-xxx" -# Model for memory extraction and layer generation -model_efficient = "gpt-4o-mini" -temperature = 0.1 -max_tokens = 4096 - -# Embedding Configuration [REQUIRED for vector search] -[embedding] -# Your embedding API endpoint (OpenAI-compatible) -api_base_url = "https://api.openai.com/v1" -# Your API key [REQUIRED - can be same as llm.api_key] -api_key = "sk-xxx" -model_name = "text-embedding-3-small" -batch_size = 10 -``` - -Then restart OpenClaw. - -## Configuration Options - -| Option | Type | Default | Description | -|--------|------|---------|-------------| -| `serviceUrl` | string | `http://127.0.0.1:8085` | Cortex Memory service URL | -| `tenantId` | string | `tenant_claw` | Tenant ID for data isolation | -| `autoStartServices` | boolean | `true` | Auto-start Qdrant and service | -| `defaultSessionId` | string | `default` | Default session for memory operations | -| `searchLimit` | number | `10` | Default number of search results | -| `minScore` | number | `0.6` | Minimum relevance score (0-1) | - -## Troubleshooting - -### Services Won't Start - -1. Check that ports 6333, 6334, 8085 are available -2. Verify `api_key` fields are filled in config.toml -3. Run `openclaw skills` to check plugin status - -### Configuration File Not Created - -1. Ensure OpenClaw has write permissions to the config directory -2. Check OpenClaw logs for error messages -3. Manually create the directory and restart OpenClaw - -### API Key Issues - -1. Verify your API key is valid and has sufficient credits -2. Ensure `api_base_url` is correct for your provider -3. Check network connectivity to the API endpoint