diff --git a/README.md b/README.md index 0d3b333..f894c0b 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@ -# Supermemory Plugin for Clawdbot +# Supermemory Plugin for OpenClaw (previously Clawdbot) Announcement-3 (2) -Long-term memory for Clawdbot. Automatically remembers conversations, recalls relevant context, and builds a persistent user profile — all powered by [Supermemory](https://supermemory.ai) cloud. No local infrastructure required. +Long-term memory for OpenClaw. Automatically remembers conversations, recalls relevant context, and builds a persistent user profile — all powered by [Supermemory](https://supermemory.ai) cloud. No local infrastructure required. ## Install ```bash -clawdbot plugins install @supermemoryai/clawdbot-supermemory +openclaw plugins install @supermemory/openclaw-supermemory ``` -Restart Clawdbot after installing. +Restart OpenClaw after installing. ## Configuration @@ -21,19 +21,19 @@ The only required value is your Supermemory API key. Get one at [console.superme Set it as an environment variable: ```bash -export SUPERMEMORY_CLAWDBOT_API_KEY="sm_..." +export SUPERMEMORY_OPENCLAW_API_KEY="sm_..." ``` -Or configure it directly in `clawdbot.json`: +Or configure it directly in `openclaw.json`: ```json5 { "plugins": { "entries": { - "clawdbot-supermemory": { + "openclaw-supermemory": { "enabled": true, "config": { - "apiKey": "${SUPERMEMORY_CLAWDBOT_API_KEY}" + "apiKey": "${SUPERMEMORY_OPENCLAW_API_KEY}" } } } @@ -45,7 +45,7 @@ Or configure it directly in `clawdbot.json`: | Key | Type | Default | Description | |-----|------|---------|-------------| -| `containerTag` | `string` | `clawdbot_{hostname}` | Memory namespace. All channels share this tag. | +| `containerTag` | `string` | `openclaw_{hostname}` | Memory namespace. All channels share this tag. | | `autoRecall` | `boolean` | `true` | Inject relevant memories before every AI turn. | | `autoCapture` | `boolean` | `true` | Automatically store conversation content after every turn. | | `maxRecallResults` | `number` | `10` | Max memories injected into context per turn. | @@ -83,7 +83,7 @@ The AI can use these tools autonomously during conversations: ## CLI Commands ```bash -clawdbot supermemory search # Search memories -clawdbot supermemory profile # View user profile -clawdbot supermemory wipe # Delete all memories (destructive, requires confirmation) +openclaw supermemory search # Search memories +openclaw supermemory profile # View user profile +openclaw supermemory wipe # Delete all memories (destructive, requires confirmation) ``` diff --git a/bun.lock b/bun.lock index adb504f..c01b0c4 100644 --- a/bun.lock +++ b/bun.lock @@ -12,7 +12,7 @@ "typescript": "^5.9.3", }, "peerDependencies": { - "clawdbot": ">=2026.1.24", + "openclaw": ">=2026.1.29", }, }, }, @@ -617,8 +617,6 @@ "ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], - "clawdbot": ["clawdbot@2026.1.24", "", { "dependencies": { "@agentclientprotocol/sdk": "0.13.1", "@aws-sdk/client-bedrock": "^3.975.0", "@buape/carbon": "0.14.0", "@clack/prompts": "^0.11.0", "@grammyjs/runner": "^2.0.3", "@grammyjs/transformer-throttler": "^1.2.1", "@homebridge/ciao": "^1.3.4", "@line/bot-sdk": "^10.6.0", "@lydell/node-pty": "1.2.0-beta.3", "@mariozechner/pi-agent-core": "0.49.3", "@mariozechner/pi-ai": "0.49.3", "@mariozechner/pi-coding-agent": "0.49.3", "@mariozechner/pi-tui": "0.49.3", "@mozilla/readability": "^0.6.0", "@sinclair/typebox": "0.34.47", "@slack/bolt": "^4.6.0", "@slack/web-api": "^7.13.0", "@whiskeysockets/baileys": "7.0.0-rc.9", "ajv": "^8.17.1", "body-parser": "^2.2.2", "chalk": "^5.6.2", "chokidar": "^5.0.0", "chromium-bidi": "13.0.1", "cli-highlight": "^2.1.11", "commander": "^14.0.2", "croner": "^9.1.0", "detect-libc": "^2.1.2", "discord-api-types": "^0.38.37", "dotenv": "^17.2.3", "express": "^5.2.1", "file-type": "^21.3.0", "grammy": "^1.39.3", "hono": "4.11.4", "jiti": "^2.6.1", "json5": "^2.2.3", "jszip": "^3.10.1", "linkedom": "^0.18.12", "long": "5.3.2", "markdown-it": "^14.1.0", "node-edge-tts": "^1.2.9", "osc-progress": "^0.3.0", "pdfjs-dist": "^5.4.530", "playwright-core": "1.58.0", "proper-lockfile": "^4.1.2", "qrcode-terminal": "^0.12.0", "sharp": "^0.34.5", "sqlite-vec": "0.1.7-alpha.2", "tar": "7.5.4", "tslog": "^4.10.2", "undici": "^7.19.0", "ws": "^8.19.0", "yaml": "^2.8.2", "zod": "^4.3.6" }, "optionalDependencies": { "@napi-rs/canvas": "^0.1.88", "node-llama-cpp": "3.15.0" }, "bin": { "clawdbot": "dist/entry.js" } }, "sha512-foszbNXzk743kQBx2Nfc2KNlStZyBAVAYLQJ+KaONh009r8oB1a74kQ8wTnKX+SDNaQ9MvaE9tOisVUi+H3F+Q=="], - "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], "cli-highlight": ["cli-highlight@2.1.11", "", { "dependencies": { "chalk": "^4.0.0", "highlight.js": "^10.7.1", "mz": "^2.4.0", "parse5": "^5.1.1", "parse5-htmlparser2-tree-adapter": "^6.0.0", "yargs": "^16.0.0" }, "bin": { "highlight": "bin/highlight" } }, "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg=="], @@ -985,6 +983,8 @@ "openai": ["openai@6.10.0", "", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-ITxOGo7rO3XRMiKA5l7tQ43iNNu+iXGFAcf2t+aWVzzqRaS0i7m1K2BhxNdaveB+5eENhO0VY1FkiZzhBk4v3A=="], + "openclaw": ["openclaw@2026.1.29", "", { "dependencies": { "@agentclientprotocol/sdk": "0.13.1", "@aws-sdk/client-bedrock": "^3.975.0", "@buape/carbon": "0.14.0", "@clack/prompts": "^0.11.0", "@grammyjs/runner": "^2.0.3", "@grammyjs/transformer-throttler": "^1.2.1", "@homebridge/ciao": "^1.3.4", "@line/bot-sdk": "^10.6.0", "@lydell/node-pty": "1.2.0-beta.3", "@mariozechner/pi-agent-core": "0.49.3", "@mariozechner/pi-ai": "0.49.3", "@mariozechner/pi-coding-agent": "0.49.3", "@mariozechner/pi-tui": "0.49.3", "@mozilla/readability": "^0.6.0", "@sinclair/typebox": "0.34.47", "@slack/bolt": "^4.6.0", "@slack/web-api": "^7.13.0", "@whiskeysockets/baileys": "7.0.0-rc.9", "ajv": "^8.17.1", "body-parser": "^2.2.2", "chalk": "^5.6.2", "chokidar": "^5.0.0", "chromium-bidi": "13.0.1", "cli-highlight": "^2.1.11", "commander": "^14.0.2", "croner": "^9.1.0", "detect-libc": "^2.1.2", "discord-api-types": "^0.38.37", "dotenv": "^17.2.3", "express": "^5.2.1", "file-type": "^21.3.0", "grammy": "^1.39.3", "hono": "4.11.4", "jiti": "^2.6.1", "json5": "^2.2.3", "jszip": "^3.10.1", "linkedom": "^0.18.12", "long": "5.3.2", "markdown-it": "^14.1.0", "node-edge-tts": "^1.2.9", "osc-progress": "^0.3.0", "pdfjs-dist": "^5.4.530", "playwright-core": "1.58.0", "proper-lockfile": "^4.1.2", "qrcode-terminal": "^0.12.0", "sharp": "^0.34.5", "sqlite-vec": "0.1.7-alpha.2", "tar": "7.5.4", "tslog": "^4.10.2", "undici": "^7.19.0", "ws": "^8.19.0", "yaml": "^2.8.2", "zod": "^4.3.6" }, "optionalDependencies": { "@napi-rs/canvas": "^0.1.88", "node-llama-cpp": "3.15.0" }, "bin": { "openclaw": "openclaw.mjs" } }, "sha512-CVUOAH83BCrlnD56I1JahGVpg0mjp4fjJPdJg9q6Pijn/YdOopsfdInDqSeIEZwGtu/+0w69/uJccY23C9I+vg=="], + "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="], "osc-progress": ["osc-progress@0.3.0", "", {}, "sha512-4/8JfsetakdeEa4vAYV45FW20aY+B/+K8NEXp5Eiar3wR8726whgHrbSg5Ar/ZY1FLJ/AGtUqV7W2IVF+Gvp9A=="], diff --git a/commands/cli.ts b/commands/cli.ts index 17f22f5..09df7d7 100644 --- a/commands/cli.ts +++ b/commands/cli.ts @@ -1,15 +1,15 @@ -import type { ClawdbotPluginApi } from "clawdbot/plugin-sdk" +import type { OpenClawPluginApi } from "openclaw/plugin-sdk" import type { SupermemoryClient } from "../client.ts" import type { SupermemoryConfig } from "../config.ts" import { log } from "../logger.ts" export function registerCli( - api: ClawdbotPluginApi, + api: OpenClawPluginApi, client: SupermemoryClient, _cfg: SupermemoryConfig, ): void { api.registerCli( - // biome-ignore lint/suspicious/noExplicitAny: clawdbot SDK does not ship types + // biome-ignore lint/suspicious/noExplicitAny: openclaw SDK does not ship types ({ program }: { program: any }) => { const cmd = program .command("supermemory") diff --git a/commands/slash.ts b/commands/slash.ts index 1a7c416..f9dc795 100644 --- a/commands/slash.ts +++ b/commands/slash.ts @@ -1,11 +1,11 @@ -import type { ClawdbotPluginApi } from "clawdbot/plugin-sdk" +import type { OpenClawPluginApi } from "openclaw/plugin-sdk" import type { SupermemoryClient } from "../client.ts" import type { SupermemoryConfig } from "../config.ts" import { log } from "../logger.ts" import { buildDocumentId, detectCategory } from "../memory.ts" export function registerCommands( - api: ClawdbotPluginApi, + api: OpenClawPluginApi, client: SupermemoryClient, _cfg: SupermemoryConfig, getSessionKey: () => string | undefined, @@ -28,7 +28,7 @@ export function registerCommands( const sk = getSessionKey() await client.addMemory( text, - { type: category, source: "clawdbot_command" }, + { type: category, source: "openclaw_command" }, sk ? buildDocumentId(sk) : undefined, ) diff --git a/config.ts b/config.ts index dea6cc1..a687aa4 100644 --- a/config.ts +++ b/config.ts @@ -53,7 +53,7 @@ function sanitizeTag(raw: string): string { } function defaultContainerTag(): string { - return sanitizeTag(`clawdbot_${hostname()}`) + return sanitizeTag(`openclaw_${hostname()}`) } export function parseConfig(raw: unknown): SupermemoryConfig { @@ -69,11 +69,11 @@ export function parseConfig(raw: unknown): SupermemoryConfig { const apiKey = typeof cfg.apiKey === "string" && cfg.apiKey.length > 0 ? resolveEnvVars(cfg.apiKey) - : process.env.SUPERMEMORY_CLAWDBOT_API_KEY + : process.env.SUPERMEMORY_OPENCLAW_API_KEY if (!apiKey) { throw new Error( - "supermemory: apiKey is required (set in plugin config or SUPERMEMORY_CLAWDBOT_API_KEY env var)", + "supermemory: apiKey is required (set in plugin config or SUPERMEMORY_OPENCLAW_API_KEY env var)", ) } diff --git a/hooks/capture.ts b/hooks/capture.ts index d13df06..befbae2 100644 --- a/hooks/capture.ts +++ b/hooks/capture.ts @@ -89,7 +89,7 @@ export function buildCaptureHandler( try { await client.addMemory( content, - { source: "clawdbot", timestamp: new Date().toISOString() }, + { source: "openclaw", timestamp: new Date().toISOString() }, customId, ) } catch (err) { diff --git a/index.ts b/index.ts index 68b9852..4b261b3 100644 --- a/index.ts +++ b/index.ts @@ -1,4 +1,4 @@ -import type { ClawdbotPluginApi } from "clawdbot/plugin-sdk" +import type { OpenClawPluginApi } from "openclaw/plugin-sdk" import { SupermemoryClient } from "./client.ts" import { registerCli } from "./commands/cli.ts" import { registerCommands } from "./commands/slash.ts" @@ -12,13 +12,13 @@ import { registerSearchTool } from "./tools/search.ts" import { registerStoreTool } from "./tools/store.ts" export default { - id: "clawdbot-supermemory", + id: "openclaw-supermemory", name: "Supermemory", - description: "Clawdbot powered by Supermemory plugin", + description: "OpenClaw powered by Supermemory plugin", kind: "memory" as const, configSchema: supermemoryConfigSchema, - register(api: ClawdbotPluginApi) { + register(api: OpenClawPluginApi) { const cfg = parseConfig(api.pluginConfig) initLogger(api.logger, cfg.debug) @@ -52,7 +52,7 @@ export default { registerCli(api, client, cfg) api.registerService({ - id: "clawdbot-supermemory", + id: "openclaw-supermemory", start: () => { api.logger.info("supermemory: connected") }, diff --git a/clawdbot.plugin.json b/openclaw.plugin.json similarity index 91% rename from clawdbot.plugin.json rename to openclaw.plugin.json index 344a7d8..1ce5a54 100644 --- a/clawdbot.plugin.json +++ b/openclaw.plugin.json @@ -1,17 +1,17 @@ { - "id": "clawdbot-supermemory", + "id": "openclaw-supermemory", "kind": "memory", "uiHints": { "apiKey": { "label": "Supermemory API Key", "sensitive": true, "placeholder": "sm_...", - "help": "Your API key from console.supermemory.ai (or use ${SUPERMEMORY_CLAWDBOT_API_KEY})" + "help": "Your API key from console.supermemory.ai (or use ${SUPERMEMORY_OPENCLAW_API_KEY})" }, "containerTag": { "label": "Container Tag", - "placeholder": "clawdbot_myhostname", - "help": "Memory namespace. Default: clawdbot_{hostname}. All channels share this.", + "placeholder": "openclaw_myhostname", + "help": "Memory namespace. Default: openclaw_{hostname}. All channels share this.", "advanced": true }, "autoRecall": { diff --git a/package.json b/package.json index c995f31..962e7c8 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "@supermemory/clawdbot-supermemory", - "version": "1.0.0", + "name": "@supermemory/openclaw-supermemory", + "version": "1.0.1", "type": "module", - "description": "Clawdbot Supermemory memory plugin", + "description": "OpenClaw Supermemory memory plugin", "license": "MIT", "dependencies": { "supermemory": "^4.0.0", @@ -15,9 +15,9 @@ "build:lib": "esbuild lib/validate.ts --bundle --minify --format=esm --platform=node --target=es2022 --external:node:crypto --outfile=lib/validate.js" }, "peerDependencies": { - "clawdbot": ">=2026.1.24" + "openclaw": ">=2026.1.29" }, - "clawdbot": { + "openclaw": { "extensions": [ "./index.ts" ] diff --git a/tools/forget.ts b/tools/forget.ts index 7836da6..342838b 100644 --- a/tools/forget.ts +++ b/tools/forget.ts @@ -1,11 +1,11 @@ import { Type } from "@sinclair/typebox" -import type { ClawdbotPluginApi } from "clawdbot/plugin-sdk" +import type { OpenClawPluginApi } from "openclaw/plugin-sdk" import type { SupermemoryClient } from "../client.ts" import type { SupermemoryConfig } from "../config.ts" import { log } from "../logger.ts" export function registerForgetTool( - api: ClawdbotPluginApi, + api: OpenClawPluginApi, client: SupermemoryClient, _cfg: SupermemoryConfig, ): void { diff --git a/tools/profile.ts b/tools/profile.ts index 90e2de6..d3d626c 100644 --- a/tools/profile.ts +++ b/tools/profile.ts @@ -1,11 +1,11 @@ import { Type } from "@sinclair/typebox" -import type { ClawdbotPluginApi } from "clawdbot/plugin-sdk" +import type { OpenClawPluginApi } from "openclaw/plugin-sdk" import type { SupermemoryClient } from "../client.ts" import type { SupermemoryConfig } from "../config.ts" import { log } from "../logger.ts" export function registerProfileTool( - api: ClawdbotPluginApi, + api: OpenClawPluginApi, client: SupermemoryClient, _cfg: SupermemoryConfig, ): void { diff --git a/tools/search.ts b/tools/search.ts index 2e06b23..41b326e 100644 --- a/tools/search.ts +++ b/tools/search.ts @@ -1,11 +1,11 @@ import { Type } from "@sinclair/typebox" -import type { ClawdbotPluginApi } from "clawdbot/plugin-sdk" +import type { OpenClawPluginApi } from "openclaw/plugin-sdk" import type { SupermemoryClient } from "../client.ts" import type { SupermemoryConfig } from "../config.ts" import { log } from "../logger.ts" export function registerSearchTool( - api: ClawdbotPluginApi, + api: OpenClawPluginApi, client: SupermemoryClient, _cfg: SupermemoryConfig, ): void { diff --git a/tools/store.ts b/tools/store.ts index b7b44f3..4ca2aa4 100644 --- a/tools/store.ts +++ b/tools/store.ts @@ -1,6 +1,6 @@ import { Type } from "@sinclair/typebox" -import type { ClawdbotPluginApi } from "clawdbot/plugin-sdk" -import { stringEnum } from "clawdbot/plugin-sdk" +import type { OpenClawPluginApi } from "openclaw/plugin-sdk" +import { stringEnum } from "openclaw/plugin-sdk" import type { SupermemoryClient } from "../client.ts" import type { SupermemoryConfig } from "../config.ts" import { log } from "../logger.ts" @@ -11,7 +11,7 @@ import { } from "../memory.ts" export function registerStoreTool( - api: ClawdbotPluginApi, + api: OpenClawPluginApi, client: SupermemoryClient, _cfg: SupermemoryConfig, getSessionKey: () => string | undefined, @@ -37,7 +37,7 @@ export function registerStoreTool( await client.addMemory( params.text, - { type: category, source: "clawdbot_tool" }, + { type: category, source: "openclaw_tool" }, customId, ) diff --git a/types/clawdbot.d.ts b/types/openclaw.d.ts similarity index 56% rename from types/clawdbot.d.ts rename to types/openclaw.d.ts index 2f6e899..b90713c 100644 --- a/types/clawdbot.d.ts +++ b/types/openclaw.d.ts @@ -1,5 +1,5 @@ -declare module "clawdbot/plugin-sdk" { - export interface ClawdbotPluginApi { +declare module "openclaw/plugin-sdk" { + export interface OpenClawPluginApi { pluginConfig: unknown logger: { info: (msg: string) => void @@ -7,18 +7,18 @@ declare module "clawdbot/plugin-sdk" { error: (msg: string, ...args: unknown[]) => void debug: (msg: string) => void } - // biome-ignore lint/suspicious/noExplicitAny: clawdbot SDK does not ship types + // biome-ignore lint/suspicious/noExplicitAny: openclaw SDK does not ship types registerTool(tool: any, options: any): void - // biome-ignore lint/suspicious/noExplicitAny: clawdbot SDK does not ship types + // biome-ignore lint/suspicious/noExplicitAny: openclaw SDK does not ship types registerCommand(command: any): void - // biome-ignore lint/suspicious/noExplicitAny: clawdbot SDK does not ship types + // biome-ignore lint/suspicious/noExplicitAny: openclaw SDK does not ship types registerCli(handler: any, options?: any): void - // biome-ignore lint/suspicious/noExplicitAny: clawdbot SDK does not ship types + // biome-ignore lint/suspicious/noExplicitAny: openclaw SDK does not ship types registerService(service: any): void - // biome-ignore lint/suspicious/noExplicitAny: clawdbot SDK does not ship types + // biome-ignore lint/suspicious/noExplicitAny: openclaw SDK does not ship types on(event: string, handler: (...args: any[]) => any): void } - // biome-ignore lint/suspicious/noExplicitAny: clawdbot SDK does not ship types + // biome-ignore lint/suspicious/noExplicitAny: openclaw SDK does not ship types export function stringEnum(values: readonly string[]): any }