{"id":"37639304-9afe-4c8b-b009-cad3a1f92e34","entityType":"agent","slug":"clawhub-thedotmack-claude-mem","name":"Official Claude-Mem OpenClaw Memory Plugin","canonicalUrl":"https://www.xpersona.co/agent/clawhub-thedotmack-claude-mem","canonicalPath":"/agent/clawhub-thedotmack-claude-mem","generatedAt":"2026-10-10T08:44:56.095Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T02:29:11.812Z","emptyReason":null},"description":"Enables persistent agent memory with a live-updating MEMORY.md file and optional real-time observation feed streaming via OpenClaw.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.8K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s174ny4bp9ytckfs8hpf0ybpbd885eq7:claude-mem","sourceUrl":"https://clawhub.ai/thedotmack/claude-mem","homepage":"https://clawhub.ai/thedotmack/skills/claude-mem","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/thedotmack/claude-mem","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/thedotmack/skills/claude-mem","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":65,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Official Claude-Mem OpenClaw Memory Plugin technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T02:29:11.812Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T02:29:11.812Z","emptyReason":null},"stars":null,"forks":null,"downloads":1771,"packageName":null,"latestVersion":"1.0.1","tractionLabel":"1.8K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T02:29:11.812Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T02:29:11.812Z","lastCrawledAt":"2026-10-10T02:29:11.812Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T02:29:11.812Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.1","createdAt":"2026-02-21T19:25:02.574Z","changelog":"claude-mem v1.0.1 changelog: - Initial public release of the claude-mem OpenClaw plugin and worker service. - Added full setup documentation and quick install script. - Included end-to-end tests, install scripts, and TypeScript sources for plugin logic. - Sample skills added: do-plan and make-plan, each with their own setup guides. - Provided automated and manual setup options for persistent agent memory with memory file sync and observation feed.","fileCount":15,"zipByteSize":59639},{"version":"1.0.0","createdAt":"2026-02-21T19:12:34.213Z","changelog":"Claude-Mem OpenClaw Plugin v1.0.0 — Initial public release - Adds persistent agent memory for OpenClaw via the claude-mem plugin and worker service. - Automatic install/upgrade script for fast, interactive setup. - Manual setup instructions for advanced users or troubleshooting. - MEMORY.md file auto-syncs agent observation timeline in real time. - Optional observation feed streams live memory updates to messaging channels (Telegram, Discord, Slack). - Detailed configuration steps and verification guides included.","fileCount":2,"zipByteSize":5673}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s174ny4bp9ytckfs8hpf0ybpbd885eq7:claude-mem","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s174ny4bp9ytckfs8hpf0ybpbd885eq7:claude-mem` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/thedotmack/claude-mem before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-thedotmack-claude-mem/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-thedotmack-claude-mem/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-thedotmack-claude-mem/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-thedotmack-claude-mem/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-thedotmack-claude-mem/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-thedotmack-claude-mem/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T08:44:56.094Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-thedotmack-claude-mem/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-thedotmack-claude-mem/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-thedotmack-claude-mem/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-thedotmack-claude-mem/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T02:29:11.812Z","emptyReason":null},"readme":"Skill: Official Claude-Mem OpenClaw Memory Plugin\n\nOwner: thedotmack\n\nSummary: Enables persistent agent memory with a live-updating MEMORY.md file and optional real-time observation feed streaming via OpenClaw.\n\nTags: latest:1.0.1\n\nVersion history:\n\nv1.0.1 | 2026-02-21T19:25:02.574Z | user\n\nclaude-mem v1.0.1 changelog:\n\n- Initial public release of the claude-mem OpenClaw plugin and worker service.\n- Added full setup documentation and quick install script.\n- Included end-to-end tests, install scripts, and TypeScript sources for plugin logic.\n- Sample skills added: do-plan and make-plan, each with their own setup guides.\n- Provided automated and manual setup options for persistent agent memory with memory file sync and observation feed.\n\nv1.0.0 | 2026-02-21T19:12:34.213Z | user\n\nClaude-Mem OpenClaw Plugin v1.0.0 — Initial public release\n\n- Adds persistent agent memory for OpenClaw via the claude-mem plugin and worker service.\n- Automatic install/upgrade script for fast, interactive setup.\n- Manual setup instructions for advanced users or troubleshooting.\n- MEMORY.md file auto-syncs agent observation timeline in real time.\n- Optional observation feed streams live memory updates to messaging channels (Telegram, Discord, Slack).\n- Detailed configuration steps and verification guides included.\n\nArchive index:\n\nArchive v1.0.1: 15 files, 59639 bytes\n\nFiles: e2e-verify.sh (7043b), install.sh (61731b), openclaw.plugin.json (3243b), package.json (373b), SKILL.md (15404b), skills/do-plan/SKILL.md (2054b), skills/make-plan/SKILL.md (2824b), src/index.test.ts (35484b), src/index.ts (35110b), test-e2e.sh (1494b), test-install.sh (70405b), test-sse-consumer.js (3123b), TESTING.md (6675b), tsconfig.json (544b), _meta.json (129b)\n\nFile v1.0.1:SKILL.md\n\n# Claude-Mem OpenClaw Plugin — Setup Guide\n\nThis guide walks through setting up the claude-mem plugin on an OpenClaw gateway. By the end, your agents will have persistent memory across sessions, a live-updating MEMORY.md in their workspace, and optionally a real-time observation feed streaming to a messaging channel.\n\n## Quick Install (Recommended)\n\nRun this one-liner to install everything automatically:\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash\n```\n\nThe installer handles dependency checks (Bun, uv), plugin installation, memory slot configuration, AI provider setup, worker startup, and optional observation feed configuration — all interactively.\n\n### Install with options\n\nPre-select your AI provider and API key to skip interactive prompts:\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --provider=gemini --api-key=YOUR_KEY\n```\n\nFor fully unattended installation (defaults to Claude Max Plan, skips observation feed):\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --non-interactive\n```\n\nTo upgrade an existing installation (preserves settings, updates plugin):\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --upgrade\n```\n\nAfter installation, skip to [Step 4: Restart the Gateway and Verify](#step-4-restart-the-gateway-and-verify) to confirm everything is working.\n\n---\n\n## Manual Setup\n\nThe steps below are for manual installation if you prefer not to use the automated installer, or need to troubleshoot individual steps.\n\n### Step 1: Clone the Claude-Mem Repo\n\nFirst, clone the claude-mem repository to a location accessible by your OpenClaw gateway. This gives you the worker service source and the plugin code.\n\n```bash\ncd /opt  # or wherever you want to keep it\ngit clone https://github.com/thedotmack/claude-mem.git\ncd claude-mem\nnpm install\nnpm run build\n```\n\nYou'll need **bun** installed for the worker service. If you don't have it:\n\n```bash\ncurl -fsSL https://bun.sh/install | bash\n```\n\n### Step 2: Get the Worker Running\n\nThe claude-mem worker is an HTTP service on port 37777. It stores observations, generates summaries, and serves the context timeline. The plugin talks to it over HTTP — it doesn't matter where the worker is running, just that it's reachable on localhost:37777.\n\n#### Check if it's already running\n\nIf this machine also runs Claude Code with claude-mem installed, the worker may already be running:\n\n```bash\ncurl http://localhost:37777/api/health\n```\n\n**Got `{\"status\":\"ok\"}`?** The worker is already running. Skip to Step 3.\n\n**Got connection refused or no response?** The worker isn't running. Continue below.\n\n#### If Claude Code has claude-mem installed\n\nIf claude-mem is installed as a Claude Code plugin (at `~/.claude/plugins/marketplaces/thedotmack/`), start the worker from that installation:\n\n```bash\ncd ~/.claude/plugins/marketplaces/thedotmack\nnpm run worker:restart\n```\n\nVerify:\n```bash\ncurl http://localhost:37777/api/health\n```\n\n**Got `{\"status\":\"ok\"}`?** You're set. Skip to Step 3.\n\n**Still not working?** Check `npm run worker:status` for error details, or check that bun is installed and on your PATH.\n\n#### If there's no Claude Code installation\n\nRun the worker from the cloned repo:\n\n```bash\ncd /opt/claude-mem  # wherever you cloned it\nnpm run worker:start\n```\n\nVerify:\n```bash\ncurl http://localhost:37777/api/health\n```\n\n**Got `{\"status\":\"ok\"}`?** You're set. Move to Step 3.\n\n**Still not working?** Debug steps:\n- Check that bun is installed: `bun --version`\n- Check the worker status: `npm run worker:status`\n- Check if something else is using port 37777: `lsof -i :37777`\n- Check logs: `npm run worker:logs` (if available)\n- Try running it directly to see errors: `bun plugin/scripts/worker-service.cjs start`\n\n### Step 3: Add the Plugin to Your Gateway\n\nAdd the `claude-mem` plugin to your OpenClaw gateway configuration:\n\n```json\n{\n  \"plugins\": {\n    \"claude-mem\": {\n      \"enabled\": true,\n      \"config\": {\n        \"project\": \"my-project\",\n        \"syncMemoryFile\": true,\n        \"workerPort\": 37777\n      }\n    }\n  }\n}\n```\n\n#### Config fields explained\n\n- **`project`** (string, default: `\"openclaw\"`) — The project name that scopes all observations in the memory database. Use a unique name per gateway/use-case so observations don't mix. For example, if this gateway runs a coding bot, use `\"coding-bot\"`.\n\n- **`syncMemoryFile`** (boolean, default: `true`) — When enabled, the plugin writes a `MEMORY.md` file to each agent's workspace directory. This file contains the full timeline of observations and summaries from previous sessions, and it updates on every tool use so agents always have fresh context. Set to `false` only if you don't want the plugin writing files to agent workspaces.\n\n- **`workerPort`** (number, default: `37777`) — The port where the claude-mem worker service is listening. Only change this if you configured the worker to use a different port.\n\n---\n\n## Step 4: Restart the Gateway and Verify\n\nRestart your OpenClaw gateway so it picks up the new plugin configuration. After restart, check the gateway logs for:\n\n```\n[claude-mem] OpenClaw plugin loaded — v1.0.0 (worker: 127.0.0.1:37777)\n```\n\nIf you see this, the plugin is loaded. You can also verify by running `/claude_mem_status` in any OpenClaw chat:\n\n```\nClaude-Mem Worker Status\nStatus: ok\nPort: 37777\nActive sessions: 0\nObservation feed: disconnected\n```\n\nThe observation feed shows `disconnected` because we haven't configured it yet. That's next.\n\n## Step 5: Verify Observations Are Being Recorded\n\nHave an agent do some work. The plugin automatically records observations through these OpenClaw events:\n\n1. **`before_agent_start`** — Initializes a claude-mem session when the agent starts, syncs MEMORY.md to the workspace\n2. **`tool_result_persist`** — Records each tool use (Read, Write, Bash, etc.) as an observation, re-syncs MEMORY.md\n3. **`agent_end`** — Summarizes the session and marks it complete\n\nAll of this happens automatically. No additional configuration needed.\n\nTo verify it's working, check the agent's workspace directory for a `MEMORY.md` file after the agent runs. It should contain a formatted timeline of observations.\n\nYou can also check the worker's viewer UI at http://localhost:37777 to see observations appearing in real time.\n\n## Step 6: Set Up the Observation Feed (Streaming to a Channel)\n\nThe observation feed connects to the claude-mem worker's SSE (Server-Sent Events) stream and forwards every new observation to a messaging channel in real time. Your agents learn things, and you see them learning in your Telegram/Discord/Slack/etc.\n\n### What you'll see\n\nEvery time claude-mem creates a new observation from your agent's tool usage, a message like this appears in your channel:\n\n```\n🧠 Claude-Mem Observation\n**Implemented retry logic for API client**\nAdded exponential backoff with configurable max retries to handle transient failures\n```\n\n### Pick your channel\n\nYou need two things:\n- **Channel type** — Must match a channel plugin already running on your OpenClaw gateway\n- **Target ID** — The chat/channel/user ID where messages go\n\n#### Telegram\n\nChannel type: `telegram`\n\nTo find your chat ID:\n1. Message @userinfobot on Telegram — https://t.me/userinfobot\n2. It replies with your numeric chat ID (e.g., `123456789`)\n3. For group chats, the ID is negative (e.g., `-1001234567890`)\n\n```json\n\"observationFeed\": {\n  \"enabled\": true,\n  \"channel\": \"telegram\",\n  \"to\": \"123456789\"\n}\n```\n\n#### Discord\n\nChannel type: `discord`\n\nTo find your channel ID:\n1. Enable Developer Mode in Discord: Settings → Advanced → Developer Mode\n2. Right-click the target channel → Copy Channel ID\n\n```json\n\"observationFeed\": {\n  \"enabled\": true,\n  \"channel\": \"discord\",\n  \"to\": \"1234567890123456789\"\n}\n```\n\n#### Slack\n\nChannel type: `slack`\n\nTo find your channel ID (not the channel name):\n1. Open the channel in Slack\n2. Click the channel name at the top\n3. Scroll to the bottom of the channel details — the ID looks like `C01ABC2DEFG`\n\n```json\n\"observationFeed\": {\n  \"enabled\": true,\n  \"channel\": \"slack\",\n  \"to\": \"C01ABC2DEFG\"\n}\n```\n\n#### Signal\n\nChannel type: `signal`\n\nUse the phone number or group ID configured in your OpenClaw gateway's Signal plugin.\n\n```json\n\"observationFeed\": {\n  \"enabled\": true,\n  \"channel\": \"signal\",\n  \"to\": \"+1234567890\"\n}\n```\n\n#### WhatsApp\n\nChannel type: `whatsapp`\n\nUse the phone number or group JID configured in your OpenClaw gateway's WhatsApp plugin.\n\n```json\n\"observationFeed\": {\n  \"enabled\": true,\n  \"channel\": \"whatsapp\",\n  \"to\": \"+1234567890\"\n}\n```\n\n#### LINE\n\nChannel type: `line`\n\nUse the user ID or group ID from the LINE Developer Console.\n\n```json\n\"observationFeed\": {\n  \"enabled\": true,\n  \"channel\": \"line\",\n  \"to\": \"U1234567890abcdef\"\n}\n```\n\n### Add it to your config\n\nYour complete plugin config should now look like this (using Telegram as an example):\n\n```json\n{\n  \"plugins\": {\n    \"claude-mem\": {\n      \"enabled\": true,\n      \"config\": {\n        \"project\": \"my-project\",\n        \"syncMemoryFile\": true,\n        \"workerPort\": 37777,\n        \"observationFeed\": {\n          \"enabled\": true,\n          \"channel\": \"telegram\",\n          \"to\": \"123456789\"\n        }\n      }\n    }\n  }\n}\n```\n\n### Restart and verify\n\nRestart the gateway. Check the logs for these three lines in order:\n\n```\n[claude-mem] Observation feed starting — channel: telegram, target: 123456789\n[claude-mem] Connecting to SSE stream at http://localhost:37777/stream\n[claude-mem] Connected to SSE stream\n```\n\nThen run `/claude_mem_feed` in any OpenClaw chat:\n\n```\nClaude-Mem Observation Feed\nEnabled: yes\nChannel: telegram\nTarget: 123456789\nConnection: connected\n```\n\nIf `Connection` shows `connected`, you're done. Have an agent do some work and watch observations stream to your channel.\n\n## Commands Reference\n\nThe plugin registers two commands:\n\n### /claude_mem_status\n\nReports worker health and current session state.\n\n```\n/claude_mem_status\n```\n\nOutput:\n```\nClaude-Mem Worker Status\nStatus: ok\nPort: 37777\nActive sessions: 2\nObservation feed: connected\n```\n\n### /claude_mem_feed\n\nShows observation feed status. Accepts optional `on`/`off` argument.\n\n```\n/claude_mem_feed          — show status\n/claude_mem_feed on       — request enable (update config to persist)\n/claude_mem_feed off      — request disable (update config to persist)\n```\n\n## How It All Works\n\n```\nOpenClaw Gateway\n  │\n  ├── before_agent_start ──→ Sync MEMORY.md + Init session\n  ├── tool_result_persist ──→ Record observation + Re-sync MEMORY.md\n  ├── agent_end ────────────→ Summarize + Complete session\n  └── gateway_start ────────→ Reset session tracking\n                    │\n                    ▼\n         Claude-Mem Worker (localhost:37777)\n           ├── POST /api/sessions/init\n           ├── POST /api/sessions/observations\n           ├── POST /api/sessions/summarize\n           ├── POST /api/sessions/complete\n           ├── GET  /api/context/inject ──→ MEMORY.md content\n           └── GET  /stream ─────────────→ SSE → Messaging channels\n```\n\n### MEMORY.md live sync\n\nThe plugin writes `MEMORY.md` to each agent's workspace with the full observation timeline. It updates:\n- On every `before_agent_start` — agent gets fresh context before starting\n- On every `tool_result_persist` — context stays current as the agent works\n\nUpdates are fire-and-forget (non-blocking). The agent is never held up waiting for MEMORY.md to write.\n\n### Observation recording\n\nEvery tool use (Read, Write, Bash, etc.) is sent to the claude-mem worker as an observation. The worker's AI agent processes it into a structured observation with title, subtitle, facts, concepts, and narrative. Tools prefixed with `memory_` are skipped to avoid recursive recording.\n\n### Session lifecycle\n\n- **`before_agent_start`** — Creates a session in the worker, syncs MEMORY.md. Short prompts (under 10 chars) skip session init but still sync.\n- **`tool_result_persist`** — Records observation (fire-and-forget), re-syncs MEMORY.md (fire-and-forget). Tool responses are truncated to 1000 characters.\n- **`agent_end`** — Sends the last assistant message for summarization, then completes the session. Both fire-and-forget.\n- **`gateway_start`** — Clears all session tracking (session IDs, workspace mappings) so agents start fresh.\n\n### Observation feed\n\nA background service connects to the worker's SSE stream and forwards `new_observation` events to a configured messaging channel. The connection auto-reconnects with exponential backoff (1s → 30s max).\n\n## Troubleshooting\n\n| Problem | What to check |\n|---------|---------------|\n| Worker health check fails | Is bun installed? (`bun --version`). Is something else on port 37777? (`lsof -i :37777`). Try running directly: `bun plugin/scripts/worker-service.cjs start` |\n| Worker started from Claude Code install but not responding | Check `cd ~/.claude/plugins/marketplaces/thedotmack && npm run worker:status`. May need `npm run worker:restart`. |\n| Worker started from cloned repo but not responding | Check `cd /path/to/claude-mem && npm run worker:status`. Make sure you ran `npm install && npm run build` first. |\n| No MEMORY.md appearing | Check that `syncMemoryFile` is not set to `false`. Verify the agent's event context includes `workspaceDir`. |\n| Observations not being recorded | Check gateway logs for `[claude-mem]` messages. The worker must be running and reachable on localhost:37777. |\n| Feed shows `disconnected` | Worker's `/stream` endpoint not reachable. Check `workerPort` matches the actual worker port. |\n| Feed shows `reconnecting` | Connection dropped. The plugin auto-reconnects — wait up to 30 seconds. |\n| `Unknown channel type` in logs | The channel plugin (e.g., telegram) isn't loaded on your gateway. Make sure the channel is configured and running. |\n| `Observation feed disabled` in logs | Set `observationFeed.enabled` to `true` in your config. |\n| `Observation feed misconfigured` in logs | Both `observationFeed.channel` and `observationFeed.to` are required. |\n| No messages in channel despite `connected` | The feed only sends processed observations, not raw tool usage. There's a 1-2 second delay. Make sure the worker is actually processing observations (check http://localhost:37777). |\n\n## Full Config Reference\n\n```json\n{\n  \"plugins\": {\n    \"claude-mem\": {\n      \"enabled\": true,\n      \"config\": {\n        \"project\": \"openclaw\",\n        \"syncMemoryFile\": true,\n        \"workerPort\": 37777,\n        \"observationFeed\": {\n          \"enabled\": false,\n          \"channel\": \"telegram\",\n          \"to\": \"123456789\"\n        }\n      }\n    }\n  }\n}\n```\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `project` | string | `\"openclaw\"` | Project name scoping observations in the database |\n| `syncMemoryFile` | boolean | `true` | Write MEMORY.md to agent workspaces |\n| `workerPort` | number | `37777` | Claude-mem worker service port |\n| `observationFeed.enabled` | boolean | `false` | Stream observations to a messaging channel |\n| `observationFeed.channel` | string | — | Channel type: `telegram`, `discord`, `slack`, `signal`, `whatsapp`, `line` |\n| `observationFeed.to` | string | — | Target chat/channel/user ID |\n\nFile v1.0.1:skills/do-plan/SKILL.md\n\n---\nname: do-plan\ndescription: Execute a phased implementation plan using subagents. Use when asked to execute, run, or carry out a plan — especially one created by make-plan.\n---\n\n# Do Plan\n\nYou are an ORCHESTRATOR. Deploy subagents to execute *all* work. Do not do the work yourself except to coordinate, route context, and verify that each subagent completed its assigned checklist.\n\n## Execution Protocol\n\n### Rules\n\n- Each phase uses fresh subagents where noted (or when context is large/unclear)\n- Assign one clear objective per subagent and require evidence (commands run, outputs, files changed)\n- Do not advance to the next step until the assigned subagent reports completion and the orchestrator confirms it matches the plan\n\n### During Each Phase\n\nDeploy an \"Implementation\" subagent to:\n1. Execute the implementation as specified\n2. COPY patterns from documentation, don't invent\n3. Cite documentation sources in code comments when using unfamiliar APIs\n4. If an API seems missing, STOP and verify — don't assume it exists\n\n### After Each Phase\n\nDeploy subagents for each post-phase responsibility:\n1. **Run verification checklist** — Deploy a \"Verification\" subagent to prove the phase worked\n2. **Anti-pattern check** — Deploy an \"Anti-pattern\" subagent to grep for known bad patterns from the plan\n3. **Code quality review** — Deploy a \"Code Quality\" subagent to review changes\n4. **Commit only if verified** — Deploy a \"Commit\" subagent *only after* verification passes; otherwise, do not commit\n\n### Between Phases\n\nDeploy a \"Branch/Sync\" subagent to:\n- Push to working branch after each verified phase\n- Prepare the next phase handoff so the next phase's subagents start fresh but have plan context\n\n## Failure Modes to Prevent\n\n- Don't invent APIs that \"should\" exist — verify against docs\n- Don't add undocumented parameters — copy exact signatures\n- Don't skip verification — deploy a verification subagent and run the checklist\n- Don't commit before verification passes (or without explicit orchestrator approval)\n\nFile v1.0.1:skills/make-plan/SKILL.md\n\n---\nname: make-plan\ndescription: Create a detailed, phased implementation plan with documentation discovery. Use when asked to plan a feature, task, or multi-step implementation — especially before executing with do-plan.\n---\n\n# Make Plan\n\nYou are an ORCHESTRATOR. Create an LLM-friendly plan in phases that can be executed consecutively in new chat contexts.\n\n## Delegation Model\n\nUse subagents for *fact gathering and extraction* (docs, examples, signatures, grep results). Keep *synthesis and plan authoring* with the orchestrator (phase boundaries, task framing, final wording). If a subagent report is incomplete or lacks evidence, re-check with targeted reads/greps before finalizing.\n\n### Subagent Reporting Contract (MANDATORY)\n\nEach subagent response must include:\n1. Sources consulted (files/URLs) and what was read\n2. Concrete findings (exact API names/signatures; exact file paths/locations)\n3. Copy-ready snippet locations (example files/sections to copy)\n4. \"Confidence\" note + known gaps (what might still be missing)\n\nReject and redeploy the subagent if it reports conclusions without sources.\n\n## Plan Structure\n\n### Phase 0: Documentation Discovery (ALWAYS FIRST)\n\nBefore planning implementation, deploy \"Documentation Discovery\" subagents to:\n1. Search for and read relevant documentation, examples, and existing patterns\n2. Identify the actual APIs, methods, and signatures available (not assumed)\n3. Create a brief \"Allowed APIs\" list citing specific documentation sources\n4. Note any anti-patterns to avoid (methods that DON'T exist, deprecated parameters)\n\nThe orchestrator consolidates findings into a single Phase 0 output.\n\n### Each Implementation Phase Must Include\n\n1. **What to implement** — Frame tasks to COPY from docs, not transform existing code\n   - Good: \"Copy the V2 session pattern from docs/examples.ts:45-60\"\n   - Bad: \"Migrate the existing code to V2\"\n2. **Documentation references** — Cite specific files/lines for patterns to follow\n3. **Verification checklist** — How to prove this phase worked (tests, grep checks)\n4. **Anti-pattern guards** — What NOT to do (invented APIs, undocumented params)\n\n### Final Phase: Verification\n\n1. Verify all implementations match documentation\n2. Check for anti-patterns (grep for known bad patterns)\n3. Run tests to confirm functionality\n\n## Key Principles\n\n- Documentation Availability ≠ Usage: Explicitly require reading docs\n- Task Framing Matters: Direct agents to docs, not just outcomes\n- Verify > Assume: Require proof, not assumptions about APIs\n- Session Boundaries: Each phase should be self-contained with its own doc references\n\n## Anti-Patterns to Prevent\n\n- Inventing API methods that \"should\" exist\n- Adding parameters not in documentation\n- Skipping verification steps\n- Assuming structure without checking examples\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn703a38ytyj60r07b6q9a2j3581kk40\",\n  \"slug\": \"claude-mem\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1771701902574\n}\n\nFile v1.0.1:TESTING.md\n\n# OpenClaw Claude-Mem Plugin — Testing Guide\n\n## Quick Start (Docker)\n\nThe fastest way to test the plugin is using the pre-built Docker E2E environment:\n\n```bash\ncd openclaw\n\n# Automated test (builds, installs plugin on real OpenClaw, verifies everything)\n./test-e2e.sh\n\n# Interactive shell (for manual exploration)\n./test-e2e.sh --interactive\n\n# Just build the image\n./test-e2e.sh --build-only\n```\n\n---\n\n## Test Layers\n\n### 1. Unit Tests (fastest)\n\n```bash\ncd openclaw\nnpm test    # compiles TypeScript, runs 17 tests\n```\n\nTests plugin registration, service lifecycle, command handling, SSE integration, and all 6 channel types.\n\n### 2. Smoke Test\n\n```bash\nnode test-sse-consumer.js\n```\n\nQuick check that the plugin loads and registers its service + command correctly.\n\n### 3. Container Unit Tests (fresh install)\n\n```bash\n./test-container.sh          # Unit tests in clean Docker\n./test-container.sh --full   # Integration tests with mock worker\n```\n\n### 4. E2E on Real OpenClaw (Docker)\n\n```bash\n./test-e2e.sh\n```\n\nThis is the most comprehensive test. It:\n1. Uses the official `ghcr.io/openclaw/openclaw:main` Docker image\n2. Installs the plugin via `openclaw plugins install` (same as a real user)\n3. Enables the plugin via `openclaw plugins enable`\n4. Starts a mock claude-mem worker on port 37777\n5. Starts the OpenClaw gateway with plugin config\n6. Verifies the plugin loads, connects to SSE, and processes events\n\n**All 16 checks must pass.**\n\n---\n\n## Human E2E Testing (Interactive Docker)\n\nFor manual walkthrough testing, use the interactive Docker mode:\n\n```bash\n./test-e2e.sh --interactive\n```\n\nThis drops you into a fully-configured OpenClaw container with the plugin pre-installed.\n\n### Step-by-step inside the container\n\n#### 1. Verify plugin is installed\n\n```bash\nnode openclaw.mjs plugins list\nnode openclaw.mjs plugins info claude-mem\nnode openclaw.mjs plugins doctor\n```\n\n**Expected:**\n- `claude-mem` appears in the plugins list as \"enabled\" or \"loaded\"\n- Info shows version 1.0.0, source at `/home/node/.openclaw/extensions/claude-mem/`\n- Doctor reports no issues\n\n#### 2. Inspect plugin files\n\n```bash\nls -la /home/node/.openclaw/extensions/claude-mem/\ncat /home/node/.openclaw/extensions/claude-mem/openclaw.plugin.json\ncat /home/node/.openclaw/extensions/claude-mem/package.json\n```\n\n**Expected:**\n- `dist/index.js` exists (compiled plugin)\n- `openclaw.plugin.json` has `\"id\": \"claude-mem\"` and `\"kind\": \"memory\"`\n- `package.json` has `openclaw.extensions` field pointing to `./dist/index.js`\n\n#### 3. Start mock worker\n\n```bash\nnode /app/mock-worker.js &\n```\n\nVerify it's running:\n\n```bash\ncurl -s http://localhost:37777/health\n# → {\"status\":\"ok\"}\n\ncurl -s --max-time 3 http://localhost:37777/stream\n# → data: {\"type\":\"connected\",\"message\":\"Mock worker SSE stream\"}\n# → data: {\"type\":\"new_observation\",\"observation\":{...}}\n```\n\n#### 4. Configure and start gateway\n\n```bash\ncat > /home/node/.openclaw/openclaw.json << 'EOF'\n{\n  \"gateway\": {\n    \"mode\": \"local\",\n    \"auth\": {\n      \"mode\": \"token\",\n      \"token\": \"e2e-test-token\"\n    }\n  },\n  \"plugins\": {\n    \"slots\": {\n      \"memory\": \"claude-mem\"\n    },\n    \"entries\": {\n      \"claude-mem\": {\n        \"enabled\": true,\n        \"config\": {\n          \"workerPort\": 37777,\n          \"observationFeed\": {\n            \"enabled\": true,\n            \"channel\": \"telegram\",\n            \"to\": \"test-chat-id-12345\"\n          }\n        }\n      }\n    }\n  }\n}\nEOF\n\nnode openclaw.mjs gateway --allow-unconfigured --verbose --token e2e-test-token\n```\n\n**Expected in gateway logs:**\n- `[claude-mem] OpenClaw plugin loaded — v1.0.0`\n- `[claude-mem] Observation feed starting — channel: telegram, target: test-chat-id-12345`\n- `[claude-mem] Connecting to SSE stream at http://localhost:37777/stream`\n- `[claude-mem] Connected to SSE stream`\n\n#### 5. Run automated verification (optional)\n\nFrom a second shell in the container (or after stopping the gateway):\n\n```bash\n/bin/bash /app/e2e-verify.sh\n```\n\n---\n\n## Manual E2E (Real OpenClaw + Real Worker)\n\nFor testing with a real claude-mem worker and real messaging channel:\n\n### Prerequisites\n\n- OpenClaw gateway installed and configured\n- Claude-Mem worker running on port 37777\n- Plugin built: `cd openclaw && npm run build`\n\n### 1. Install the plugin\n\n```bash\n# Build the plugin\ncd openclaw && npm run build\n\n# Install on OpenClaw (from the openclaw/ directory)\nopenclaw plugins install .\n\n# Enable it\nopenclaw plugins enable claude-mem\n```\n\n### 2. Configure\n\nEdit `~/.openclaw/openclaw.json` to add plugin config:\n\n```json\n{\n  \"plugins\": {\n    \"entries\": {\n      \"claude-mem\": {\n        \"enabled\": true,\n        \"config\": {\n          \"workerPort\": 37777,\n          \"observationFeed\": {\n            \"enabled\": true,\n            \"channel\": \"telegram\",\n            \"to\": \"YOUR_CHAT_ID\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n**Supported channels:** `telegram`, `discord`, `signal`, `slack`, `whatsapp`, `line`\n\n### 3. Restart gateway\n\n```bash\nopenclaw restart\n```\n\n**Look for in logs:**\n- `[claude-mem] OpenClaw plugin loaded — v1.0.0`\n- `[claude-mem] Connected to SSE stream`\n\n### 4. Trigger an observation\n\nStart a Claude Code session with claude-mem enabled and perform any action. The worker will emit a `new_observation` SSE event.\n\n### 5. Verify delivery\n\nCheck the target messaging channel for:\n\n```\n🧠 Claude-Mem Observation\n**Observation Title**\nOptional subtitle\n```\n\n---\n\n## Troubleshooting\n\n### `api.log is not a function`\nThe plugin was built against the wrong API. Ensure `src/index.ts` uses `api.logger.info()` not `api.log()`. Rebuild with `npm run build`.\n\n### Worker not running\n- **Symptom:** `SSE stream error: fetch failed. Reconnecting in 1s`\n- **Fix:** Start the worker: `cd /path/to/claude-mem && npm run build-and-sync`\n\n### Port mismatch\n- **Fix:** Ensure `workerPort` in config matches the worker's actual port (default: 37777)\n\n### Channel not configured\n- **Symptom:** `Observation feed misconfigured — channel or target missing`\n- **Fix:** Add both `channel` and `to` to `observationFeed` in config\n\n### Unknown channel type\n- **Fix:** Use: `telegram`, `discord`, `signal`, `slack`, `whatsapp`, or `line`\n\n### Feed disabled\n- **Symptom:** `Observation feed disabled`\n- **Fix:** Set `observationFeed.enabled: true`\n\n### Messages not arriving\n1. Verify the bot/integration is configured in the target channel\n2. Check the target ID (`to`) is correct\n3. Look for `Failed to send to <channel>` in logs\n4. Test the channel via OpenClaw's built-in tools\n\n### Memory slot conflict\n- **Symptom:** `plugin disabled (memory slot set to \"memory-core\")`\n- **Fix:** Add `\"slots\": { \"memory\": \"claude-mem\" }` to plugins config\n\nFile v1.0.1:openclaw.plugin.json\n\n{\n  \"id\": \"claude-mem\",\n  \"name\": \"Claude-Mem (Persistent Memory)\",\n  \"description\": \"Official OpenClaw plugin for Claude-Mem. Records observations from embedded runner sessions and streams them to messaging channels.\",\n  \"kind\": \"memory\",\n  \"version\": \"1.0.0\",\n  \"author\": \"thedotmack\",\n  \"homepage\": \"https://claude-mem.com\",\n  \"skills\": [\"skills/make-plan\", \"skills/do-plan\"],\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"properties\": {\n      \"syncMemoryFile\": {\n        \"type\": \"boolean\",\n        \"default\": true,\n        \"description\": \"Automatically sync MEMORY.md on session start\"\n      },\n      \"workerPort\": {\n        \"type\": \"number\",\n        \"default\": 37777,\n        \"description\": \"Port for Claude-Mem worker service\"\n      },\n      \"project\": {\n        \"type\": \"string\",\n        \"default\": \"openclaw\",\n        \"description\": \"Project name for scoping observations in the memory database\"\n      },\n      \"observationFeed\": {\n        \"type\": \"object\",\n        \"description\": \"Live observation feed — streams observations to any OpenClaw channel in real-time\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": \"Enable live observation feed to messaging channels\"\n          },\n          \"channel\": {\n            \"type\": \"string\",\n            \"description\": \"Channel type: telegram, discord, signal, slack, whatsapp, line\"\n          },\n          \"to\": {\n            \"type\": \"string\",\n            \"description\": \"Target chat/user ID to send observations to\"\n          },\n          \"botToken\": {\n            \"type\": \"string\",\n            \"description\": \"Optional dedicated Telegram bot token for the feed (bypasses gateway channel)\"\n          },\n          \"emojis\": {\n            \"type\": \"object\",\n            \"description\": \"Emoji personalization for the observation feed. Each agent gets a unique emoji automatically — customize here to override.\",\n            \"properties\": {\n              \"primary\": {\n                \"type\": \"string\",\n                \"default\": \"🦞\",\n                \"description\": \"Emoji for the main OpenClaw gateway (project='openclaw')\"\n              },\n              \"claudeCode\": {\n                \"type\": \"string\",\n                \"default\": \"⌨️\",\n                \"description\": \"Emoji for Claude Code sessions (non-OpenClaw)\"\n              },\n              \"claudeCodeLabel\": {\n                \"type\": \"string\",\n                \"default\": \"Claude Code Session\",\n                \"description\": \"Display label prefix for Claude Code sessions in the feed (project identifier is appended automatically)\"\n              },\n              \"default\": {\n                \"type\": \"string\",\n                \"default\": \"🦀\",\n                \"description\": \"Fallback emoji when no match is found\"\n              },\n              \"agents\": {\n                \"type\": \"object\",\n                \"default\": {},\n                \"description\": \"Pin specific emojis to agent IDs (e.g. {\\\"devops\\\": \\\"🔧\\\"}). Agents not listed here get auto-assigned emojis.\",\n                \"additionalProperties\": { \"type\": \"string\" }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\nFile v1.0.1:package.json\n\n{\n  \"name\": \"@openclaw/claude-mem\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"main\": \"dist/index.js\",\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"test\": \"tsc && node --test dist/index.test.js\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"^25.2.1\",\n    \"typescript\": \"^5.3.0\"\n  },\n  \"openclaw\": {\n    \"extensions\": [\n      \"./dist/index.js\"\n    ]\n  }\n}\n\nFile v1.0.1:tsconfig.json\n\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"lib\": [\"ES2022\", \"DOM\"],\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"./src\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"sourceMap\": true,\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\n    \"src/**/*\"\n  ],\n  \"exclude\": [\n    \"node_modules\",\n    \"dist\"\n  ]\n}\n\nArchive v1.0.0: 2 files, 5673 bytes\n\nFiles: SKILL.md (15404b), _meta.json (129b)\n\nFile v1.0.0:SKILL.md\n\n# Claude-Mem OpenClaw Plugin — Setup Guide\n\nThis guide walks through setting up the claude-mem plugin on an OpenClaw gateway. By the end, your agents will have persistent memory across sessions, a live-updating MEMORY.md in their workspace, and optionally a real-time observation feed streaming to a messaging channel.\n\n## Quick Install (Recommended)\n\nRun this one-liner to install everything automatically:\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash\n```\n\nThe installer handles dependency checks (Bun, uv), plugin installation, memory slot configuration, AI provider setup, worker startup, and optional observation feed configuration — all interactively.\n\n### Install with options\n\nPre-select your AI provider and API key to skip interactive prompts:\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --provider=gemini --api-key=YOUR_KEY\n```\n\nFor fully unattended installation (defaults to Claude Max Plan, skips observation feed):\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --non-interactive\n```\n\nTo upgrade an existing installation (preserves settings, updates plugin):\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --upgrade\n```\n\nAfter installation, skip to [Step 4: Restart the Gateway and Verify](#step-4-restart-the-gateway-and-verify) to confirm everything is working.\n\n---\n\n## Manual Setup\n\nThe steps below are for manual installation if you prefer not to use the automated installer, or need to troubleshoot individual steps.\n\n### Step 1: Clone the Claude-Mem Repo\n\nFirst, clone the claude-mem repository to a location accessible by your OpenClaw gateway. This gives you the worker service source and the plugin code.\n\n```bash\ncd /opt  # or wherever you want to keep it\ngit clone https://github.com/thedotmack/claude-mem.git\ncd claude-mem\nnpm install\nnpm run build\n```\n\nYou'll need **bun** installed for the worker service. If you don't have it:\n\n```bash\ncurl -fsSL https://bun.sh/install | bash\n```\n\n### Step 2: Get the Worker Running\n\nThe claude-mem worker is an HTTP service on port 37777. It stores observations, generates summaries, and serves the context timeline. The plugin talks to it over HTTP — it doesn't matter where the worker is running, just that it's reachable on localhost:37777.\n\n#### Check if it's already running\n\nIf this machine also runs Claude Code with claude-mem installed, the worker may already be running:\n\n```bash\ncurl http://localhost:37777/api/health\n```\n\n**Got `{\"status\":\"ok\"}`?** The worker is already running. Skip to Step 3.\n\n**Got connection refused or no response?** The worker isn't running. Continue below.\n\n#### If Claude Code has claude-mem installed\n\nIf claude-mem is installed as a Claude Code plugin (at `~/.claude/plugins/marketplaces/thedotmack/`), start the worker from that installation:\n\n```bash\ncd ~/.claude/plugins/marketplaces/thedotmack\nnpm run worker:restart\n```\n\nVerify:\n```bash\ncurl http://localhost:37777/api/health\n```\n\n**Got `{\"status\":\"ok\"}`?** You're set. Skip to Step 3.\n\n**Still not working?** Check `npm run worker:status` for error details, or check that bun is installed and on your PATH.\n\n#### If there's no Claude Code installation\n\nRun the worker from the cloned repo:\n\n```bash\ncd /opt/claude-mem  # wherever you cloned it\nnpm run worker:start\n```\n\nVerify:\n```bash\ncurl http://localhost:37777/api/health\n```\n\n**Got `{\"status\":\"ok\"}`?** You're set. Move to Step 3.\n\n**Still not working?** Debug steps:\n- Check that bun is installed: `bun --version`\n- Check the worker status: `npm run worker:status`\n- Check if something else is using port 37777: `lsof -i :37777`\n- Check logs: `npm run worker:logs` (if available)\n- Try running it directly to see errors: `bun plugin/scripts/worker-service.cjs start`\n\n### Step 3: Add the Plugin to Your Gateway\n\nAdd the `claude-mem` plugin to your OpenClaw gateway configuration:\n\n```json\n{\n  \"plugins\": {\n    \"claude-mem\": {\n      \"enabled\": true,\n      \"config\": {\n        \"project\": \"my-project\",\n        \"syncMemoryFile\": true,\n        \"workerPort\": 37777\n      }\n    }\n  }\n}\n```\n\n#### Config fields explained\n\n- **`project`** (string, default: `\"openclaw\"`) — The project name that scopes all observations in the memory database. Use a unique name per gateway/use-case so observations don't mix. For example, if this gateway runs a coding bot, use `\"coding-bot\"`.\n\n- **`syncMemoryFile`** (boolean, default: `true`) — When enabled, the plugin writes a `MEMORY.md` file to each agent's workspace directory. This file contains the full timeline of observations and summaries from previous sessions, and it updates on every tool use so agents always have fresh context. Set to `false` only if you don't want the plugin writing files to agent workspaces.\n\n- **`workerPort`** (number, default: `37777`) — The port where the claude-mem worker service is listening. Only change this if you configured the worker to use a different port.\n\n---\n\n## Step 4: Restart the Gateway and Verify\n\nRestart your OpenClaw gateway so it picks up the new plugin configuration. After restart, check the gateway logs for:\n\n```\n[claude-mem] OpenClaw plugin loaded — v1.0.0 (worker: 127.0.0.1:37777)\n```\n\nIf you see this, the plugin is loaded. You can also verify by running `/claude_mem_status` in any OpenClaw chat:\n\n```\nClaude-Mem Worker Status\nStatus: ok\nPort: 37777\nActive sessions: 0\nObservation feed: disconnected\n```\n\nThe observation feed shows `disconnected` because we haven't configured it yet. That's next.\n\n## Step 5: Verify Observations Are Being Recorded\n\nHave an agent do some work. The plugin automatically records observations through these OpenClaw events:\n\n1. **`before_agent_start`** — Initializes a claude-mem session when the agent starts, syncs MEMORY.md to the workspace\n2. **`tool_result_persist`** — Records each tool use (Read, Write, Bash, etc.) as an observation, re-syncs MEMORY.md\n3. **`agent_end`** — Summarizes the session and marks it complete\n\nAll of this happens automatically. No additional configuration needed.\n\nTo verify it's working, check the agent's workspace directory for a `MEMORY.md` file after the agent runs. It should contain a formatted timeline of observations.\n\nYou can also check the worker's viewer UI at http://localhost:37777 to see observations appearing in real time.\n\n## Step 6: Set Up the Observation Feed (Streaming to a Channel)\n\nThe observation feed connects to the claude-mem worker's SSE (Server-Sent Events) stream and forwards every new observation to a messaging channel in real time. Your agents learn things, and you see them learning in your Telegram/Discord/Slack/etc.\n\n### What you'll see\n\nEvery time claude-mem creates a new observation from your agent's tool usage, a message like this appears in your channel:\n\n```\n🧠 Claude-Mem Observation\n**Implemented retry logic for API client**\nAdded exponential backoff with configurable max retries to handle transient failures\n```\n\n### Pick your channel\n\nYou need two things:\n- **Channel type** — Must match a channel plugin already running on your OpenClaw gateway\n- **Target ID** — The chat/channel/user ID where messages go\n\n#### Telegram\n\nChannel type: `telegram`\n\nTo find your chat ID:\n1. Message @userinfobot on Telegram — https://t.me/userinfobot\n2. It replies with your numeric chat ID (e.g., `123456789`)\n3. For group chats, the ID is negative (e.g., `-1001234567890`)\n\n```json\n\"observationFeed\": {\n  \"enabled\": true,\n  \"channel\": \"telegram\",\n  \"to\": \"123456789\"\n}\n```\n\n#### Discord\n\nChannel type: `discord`\n\nTo find your channel ID:\n1. Enable Developer Mode in Discord: Settings → Advanced → Developer Mode\n2. Right-click the target channel → Copy Channel ID\n\n```json\n\"observationFeed\": {\n  \"enabled\": true,\n  \"channel\": \"discord\",\n  \"to\": \"1234567890123456789\"\n}\n```\n\n#### Slack\n\nChannel type: `slack`\n\nTo find your channel ID (not the channel name):\n1. Open the channel in Slack\n2. Click the channel name at the top\n3. Scroll to the bottom of the channel details — the ID looks like `C01ABC2DEFG`\n\n```json\n\"observationFeed\": {\n  \"enabled\": true,\n  \"channel\": \"slack\",\n  \"to\": \"C01ABC2DEFG\"\n}\n```\n\n#### Signal\n\nChannel type: `signal`\n\nUse the phone number or group ID configured in your OpenClaw gateway's Signal plugin.\n\n```json\n\"observationFeed\": {\n  \"enabled\": true,\n  \"channel\": \"signal\",\n  \"to\": \"+1234567890\"\n}\n```\n\n#### WhatsApp\n\nChannel type: `whatsapp`\n\nUse the phone number or group JID configured in your OpenClaw gateway's WhatsApp plugin.\n\n```json\n\"observationFeed\": {\n  \"enabled\": true,\n  \"channel\": \"whatsapp\",\n  \"to\": \"+1234567890\"\n}\n```\n\n#### LINE\n\nChannel type: `line`\n\nUse the user ID or group ID from the LINE Developer Console.\n\n```json\n\"observationFeed\": {\n  \"enabled\": true,\n  \"channel\": \"line\",\n  \"to\": \"U1234567890abcdef\"\n}\n```\n\n### Add it to your config\n\nYour complete plugin config should now look like this (using Telegram as an example):\n\n```json\n{\n  \"plugins\": {\n    \"claude-mem\": {\n      \"enabled\": true,\n      \"config\": {\n        \"project\": \"my-project\",\n        \"syncMemoryFile\": true,\n        \"workerPort\": 37777,\n        \"observationFeed\": {\n          \"enabled\": true,\n          \"channel\": \"telegram\",\n          \"to\": \"123456789\"\n        }\n      }\n    }\n  }\n}\n```\n\n### Restart and verify\n\nRestart the gateway. Check the logs for these three lines in order:\n\n```\n[claude-mem] Observation feed starting — channel: telegram, target: 123456789\n[claude-mem] Connecting to SSE stream at http://localhost:37777/stream\n[claude-mem] Connected to SSE stream\n```\n\nThen run `/claude_mem_feed` in any OpenClaw chat:\n\n```\nClaude-Mem Observation Feed\nEnabled: yes\nChannel: telegram\nTarget: 123456789\nConnection: connected\n```\n\nIf `Connection` shows `connected`, you're done. Have an agent do some work and watch observations stream to your channel.\n\n## Commands Reference\n\nThe plugin registers two commands:\n\n### /claude_mem_status\n\nReports worker health and current session state.\n\n```\n/claude_mem_status\n```\n\nOutput:\n```\nClaude-Mem Worker Status\nStatus: ok\nPort: 37777\nActive sessions: 2\nObservation feed: connected\n```\n\n### /claude_mem_feed\n\nShows observation feed status. Accepts optional `on`/`off` argument.\n\n```\n/claude_mem_feed          — show status\n/claude_mem_feed on       — request enable (update config to persist)\n/claude_mem_feed off      — request disable (update config to persist)\n```\n\n## How It All Works\n\n```\nOpenClaw Gateway\n  │\n  ├── before_agent_start ──→ Sync MEMORY.md + Init session\n  ├── tool_result_persist ──→ Record observation + Re-sync MEMORY.md\n  ├── agent_end ────────────→ Summarize + Complete session\n  └── gateway_start ────────→ Reset session tracking\n                    │\n                    ▼\n         Claude-Mem Worker (localhost:37777)\n           ├── POST /api/sessions/init\n           ├── POST /api/sessions/observations\n           ├── POST /api/sessions/summarize\n           ├── POST /api/sessions/complete\n           ├── GET  /api/context/inject ──→ MEMORY.md content\n           └── GET  /stream ─────────────→ SSE → Messaging channels\n```\n\n### MEMORY.md live sync\n\nThe plugin writes `MEMORY.md` to each agent's workspace with the full observation timeline. It updates:\n- On every `before_agent_start` — agent gets fresh context before starting\n- On every `tool_result_persist` — context stays current as the agent works\n\nUpdates are fire-and-forget (non-blocking). The agent is never held up waiting for MEMORY.md to write.\n\n### Observation recording\n\nEvery tool use (Read, Write, Bash, etc.) is sent to the claude-mem worker as an observation. The worker's AI agent processes it into a structured observation with title, subtitle, facts, concepts, and narrative. Tools prefixed with `memory_` are skipped to avoid recursive recording.\n\n### Session lifecycle\n\n- **`before_agent_start`** — Creates a session in the worker, syncs MEMORY.md. Short prompts (under 10 chars) skip session init but still sync.\n- **`tool_result_persist`** — Records observation (fire-and-forget), re-syncs MEMORY.md (fire-and-forget). Tool responses are truncated to 1000 characters.\n- **`agent_end`** — Sends the last assistant message for summarization, then completes the session. Both fire-and-forget.\n- **`gateway_start`** — Clears all session tracking (session IDs, workspace mappings) so agents start fresh.\n\n### Observation feed\n\nA background service connects to the worker's SSE stream and forwards `new_observation` events to a configured messaging channel. The connection auto-reconnects with exponential backoff (1s → 30s max).\n\n## Troubleshooting\n\n| Problem | What to check |\n|---------|---------------|\n| Worker health check fails | Is bun installed? (`bun --version`). Is something else on port 37777? (`lsof -i :37777`). Try running directly: `bun plugin/scripts/worker-service.cjs start` |\n| Worker started from Claude Code install but not responding | Check `cd ~/.claude/plugins/marketplaces/thedotmack && npm run worker:status`. May need `npm run worker:restart`. |\n| Worker started from cloned repo but not responding | Check `cd /path/to/claude-mem && npm run worker:status`. Make sure you ran `npm install && npm run build` first. |\n| No MEMORY.md appearing | Check that `syncMemoryFile` is not set to `false`. Verify the agent's event context includes `workspaceDir`. |\n| Observations not being recorded | Check gateway logs for `[claude-mem]` messages. The worker must be running and reachable on localhost:37777. |\n| Feed shows `disconnected` | Worker's `/stream` endpoint not reachable. Check `workerPort` matches the actual worker port. |\n| Feed shows `reconnecting` | Connection dropped. The plugin auto-reconnects — wait up to 30 seconds. |\n| `Unknown channel type` in logs | The channel plugin (e.g., telegram) isn't loaded on your gateway. Make sure the channel is configured and running. |\n| `Observation feed disabled` in logs | Set `observationFeed.enabled` to `true` in your config. |\n| `Observation feed misconfigured` in logs | Both `observationFeed.channel` and `observationFeed.to` are required. |\n| No messages in channel despite `connected` | The feed only sends processed observations, not raw tool usage. There's a 1-2 second delay. Make sure the worker is actually processing observations (check http://localhost:37777). |\n\n## Full Config Reference\n\n```json\n{\n  \"plugins\": {\n    \"claude-mem\": {\n      \"enabled\": true,\n      \"config\": {\n        \"project\": \"openclaw\",\n        \"syncMemoryFile\": true,\n        \"workerPort\": 37777,\n        \"observationFeed\": {\n          \"enabled\": false,\n          \"channel\": \"telegram\",\n          \"to\": \"123456789\"\n        }\n      }\n    }\n  }\n}\n```\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `project` | string | `\"openclaw\"` | Project name scoping observations in the database |\n| `syncMemoryFile` | boolean | `true` | Write MEMORY.md to agent workspaces |\n| `workerPort` | number | `37777` | Claude-mem worker service port |\n| `observationFeed.enabled` | boolean | `false` | Stream observations to a messaging channel |\n| `observationFeed.channel` | string | — | Channel type: `telegram`, `discord`, `slack`, `signal`, `whatsapp`, `line` |\n| `observationFeed.to` | string | — | Target chat/channel/user ID |\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn703a38ytyj60r07b6q9a2j3581kk40\",\n  \"slug\": \"claude-mem\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1771701154213\n}","readmeExcerpt":"Skill: Official Claude-Mem OpenClaw Memory Plugin Owner: thedotmack Summary: Enables persistent agent memory with a live-updating MEMORY.md file and optional real-time observation feed streaming via OpenClaw. Tags: latest:1.0.1 Version history: v1.0.1 | 2026-02-21T19:25:02.574Z | user claude-mem v1.0.1 changelog: - Initial public release of the claude-mem OpenClaw plugin and worker service. - Added full setup documen","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"curl -fsSL https://install.cmem.ai/openclaw.sh | bash"},{"language":"bash","snippet":"curl -fsSL https://install.cmem.ai/openclaw.sh | bash"},{"language":"bash","snippet":"curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --provider=gemini --api-key=YOUR_KEY"},{"language":"bash","snippet":"curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --provider=gemini --api-key=YOUR_KEY"},{"language":"bash","snippet":"curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --non-interactive"},{"language":"bash","snippet":"curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --non-interactive"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"# Claude-Mem OpenClaw Plugin — Setup Guide\n\nThis guide walks through setting up the claude-mem plugin on an OpenClaw gateway. By the end, your agents will have persistent memory across sessions, a live-updating MEMORY.md in their workspace, and optionally a real-time observation feed streaming to a messaging channel.\n\n## Quick Install (Recommended)\n\nRun this one-liner to install everything automatically:\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash\n```\n\nThe installer handles dependency checks (Bun, uv), plugin installation, memory slot configuration, AI provider setup, worker startup, and optional observation feed configuration — all interactively.\n\n### Install with options\n\nPre-select your AI provider and API key to skip interactive prompts:\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --provider=gemini --api-key=YOUR_KEY\n```\n\nFor fully unattended installation (defaults to Claude Max Plan, skips observation feed):\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --non-interactive\n```\n\nTo upgrade an existing installation (preserves settings, updates plugin):\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --upgrade\n```\n\nAfter installation, skip to [Step 4: Restart the Gateway and Verify](#step-4-restart-the-gateway-and-verify) to confirm everything is working.\n\n---\n\n## Manual Setup\n\nThe steps below are for manual installation if you prefer not to use the automated installer, or need to troubleshoot individual steps.\n\n### Step 1: Clone the Claude-Mem Repo\n\nFirst, clone the claude-mem repository to a location accessible by your OpenClaw gateway. This gives you the worker service source and the plugin code.\n\n```bash\ncd /opt  # or wherever you want to keep it\ngit clone https://github.com/thedotmack/claude-mem.git\ncd claude-mem\nnpm install\nnpm run build\n```\n\nYou'll need **bun** installed for the worker service. If you don't have it:\n\n```bash\ncurl -fsSL https://bun.sh/install | bash\n```\n\n### Step 2: Get the Worker Running\n\nThe claude-mem worker is an HTTP service on port 37777. It stores observations, generates summaries, and serves the context timeline. The plugin talks to it over HTTP — it doesn't matter where the worker is running, just that it's reachable on localhost:37777.\n\n#### Check if it's already running\n\nIf this machine also runs Claude Code with claude-mem installed, the worker may already be running:\n\n```bash\ncurl http://localhost:37777/api/health\n```\n\n**Got `{\"status\":\"ok\"}`?** The worker is already running. Skip to Step 3.\n\n**Got connection refused or no response?** The worker isn't running. Continue below.\n\n#### If Claude Code has claude-mem installed\n\nIf claude-mem is installed as a Claude Code plugin (at `~/.claude/plugins/marketplaces/thedotmack/`), start the worker from that installation:\n\n```bash\ncd ~/.claude/plugins/marketplaces/thedotmack\nnpm run worker:restart\n```\n\nVerify:\n```bash\ncurl http://localhost:37777/api/health\n```\n\n**Got `{\"status\":\"ok\"}`"},{"path":"skills/do-plan/SKILL.md","content":"---\nname: do-plan\ndescription: Execute a phased implementation plan using subagents. Use when asked to execute, run, or carry out a plan — especially one created by make-plan.\n---\n\n# Do Plan\n\nYou are an ORCHESTRATOR. Deploy subagents to execute *all* work. Do not do the work yourself except to coordinate, route context, and verify that each subagent completed its assigned checklist.\n\n## Execution Protocol\n\n### Rules\n\n- Each phase uses fresh subagents where noted (or when context is large/unclear)\n- Assign one clear objective per subagent and require evidence (commands run, outputs, files changed)\n- Do not advance to the next step until the assigned subagent reports completion and the orchestrator confirms it matches the plan\n\n### During Each Phase\n\nDeploy an \"Implementation\" subagent to:\n1. Execute the implementation as specified\n2. COPY patterns from documentation, don't invent\n3. Cite documentation sources in code comments when using unfamiliar APIs\n4. If an API seems missing, STOP and verify — don't assume it exists\n\n### After Each Phase\n\nDeploy subagents for each post-phase responsibility:\n1. **Run verification checklist** — Deploy a \"Verification\" subagent to prove the phase worked\n2. **Anti-pattern check** — Deploy an \"Anti-pattern\" subagent to grep for known bad patterns from the plan\n3. **Code quality review** — Deploy a \"Code Quality\" subagent to review changes\n4. **Commit only if verified** — Deploy a \"Commit\" subagent *only after* verification passes; otherwise, do not commit\n\n### Between Phases\n\nDeploy a \"Branch/Sync\" subagent to:\n- Push to working branch after each verified phase\n- Prepare the next phase handoff so the next phase's subagents start fresh but have plan context\n\n## Failure Modes to Prevent\n\n- Don't invent APIs that \"should\" exist — verify against docs\n- Don't add undocumented parameters — copy exact signatures\n- Don't skip verification — deploy a verification subagent and run the checklist\n- Don't commit before verification passes (or without explicit orchestrator approval)"},{"path":"skills/make-plan/SKILL.md","content":"---\nname: make-plan\ndescription: Create a detailed, phased implementation plan with documentation discovery. Use when asked to plan a feature, task, or multi-step implementation — especially before executing with do-plan.\n---\n\n# Make Plan\n\nYou are an ORCHESTRATOR. Create an LLM-friendly plan in phases that can be executed consecutively in new chat contexts.\n\n## Delegation Model\n\nUse subagents for *fact gathering and extraction* (docs, examples, signatures, grep results). Keep *synthesis and plan authoring* with the orchestrator (phase boundaries, task framing, final wording). If a subagent report is incomplete or lacks evidence, re-check with targeted reads/greps before finalizing.\n\n### Subagent Reporting Contract (MANDATORY)\n\nEach subagent response must include:\n1. Sources consulted (files/URLs) and what was read\n2. Concrete findings (exact API names/signatures; exact file paths/locations)\n3. Copy-ready snippet locations (example files/sections to copy)\n4. \"Confidence\" note + known gaps (what might still be missing)\n\nReject and redeploy the subagent if it reports conclusions without sources.\n\n## Plan Structure\n\n### Phase 0: Documentation Discovery (ALWAYS FIRST)\n\nBefore planning implementation, deploy \"Documentation Discovery\" subagents to:\n1. Search for and read relevant documentation, examples, and existing patterns\n2. Identify the actual APIs, methods, and signatures available (not assumed)\n3. Create a brief \"Allowed APIs\" list citing specific documentation sources\n4. Note any anti-patterns to avoid (methods that DON'T exist, deprecated parameters)\n\nThe orchestrator consolidates findings into a single Phase 0 output.\n\n### Each Implementation Phase Must Include\n\n1. **What to implement** — Frame tasks to COPY from docs, not transform existing code\n   - Good: \"Copy the V2 session pattern from docs/examples.ts:45-60\"\n   - Bad: \"Migrate the existing code to V2\"\n2. **Documentation references** — Cite specific files/lines for patterns to follow\n3. **Verification checklist** — How to prove this phase worked (tests, grep checks)\n4. **Anti-pattern guards** — What NOT to do (invented APIs, undocumented params)\n\n### Final Phase: Verification\n\n1. Verify all implementations match documentation\n2. Check for anti-patterns (grep for known bad patterns)\n3. Run tests to confirm functionality\n\n## Key Principles\n\n- Documentation Availability ≠ Usage: Explicitly require reading docs\n- Task Framing Matters: Direct agents to docs, not just outcomes\n- Verify > Assume: Require proof, not assumptions about APIs\n- Session Boundaries: Each phase should be self-contained with its own doc references\n\n## Anti-Patterns to Prevent\n\n- Inventing API methods that \"should\" exist\n- Adding parameters not in documentation\n- Skipping verification steps\n- Assuming structure without checking examples"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn703a38ytyj60r07b6q9a2j3581kk40\",\n  \"slug\": \"claude-mem\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1771701902574\n}"},{"path":"TESTING.md","content":"# OpenClaw Claude-Mem Plugin — Testing Guide\n\n## Quick Start (Docker)\n\nThe fastest way to test the plugin is using the pre-built Docker E2E environment:\n\n```bash\ncd openclaw\n\n# Automated test (builds, installs plugin on real OpenClaw, verifies everything)\n./test-e2e.sh\n\n# Interactive shell (for manual exploration)\n./test-e2e.sh --interactive\n\n# Just build the image\n./test-e2e.sh --build-only\n```\n\n---\n\n## Test Layers\n\n### 1. Unit Tests (fastest)\n\n```bash\ncd openclaw\nnpm test    # compiles TypeScript, runs 17 tests\n```\n\nTests plugin registration, service lifecycle, command handling, SSE integration, and all 6 channel types.\n\n### 2. Smoke Test\n\n```bash\nnode test-sse-consumer.js\n```\n\nQuick check that the plugin loads and registers its service + command correctly.\n\n### 3. Container Unit Tests (fresh install)\n\n```bash\n./test-container.sh          # Unit tests in clean Docker\n./test-container.sh --full   # Integration tests with mock worker\n```\n\n### 4. E2E on Real OpenClaw (Docker)\n\n```bash\n./test-e2e.sh\n```\n\nThis is the most comprehensive test. It:\n1. Uses the official `ghcr.io/openclaw/openclaw:main` Docker image\n2. Installs the plugin via `openclaw plugins install` (same as a real user)\n3. Enables the plugin via `openclaw plugins enable`\n4. Starts a mock claude-mem worker on port 37777\n5. Starts the OpenClaw gateway with plugin config\n6. Verifies the plugin loads, connects to SSE, and processes events\n\n**All 16 checks must pass.**\n\n---\n\n## Human E2E Testing (Interactive Docker)\n\nFor manual walkthrough testing, use the interactive Docker mode:\n\n```bash\n./test-e2e.sh --interactive\n```\n\nThis drops you into a fully-configured OpenClaw container with the plugin pre-installed.\n\n### Step-by-step inside the container\n\n#### 1. Verify plugin is installed\n\n```bash\nnode openclaw.mjs plugins list\nnode openclaw.mjs plugins info claude-mem\nnode openclaw.mjs plugins doctor\n```\n\n**Expected:**\n- `claude-mem` appears in the plugins list as \"enabled\" or \"loaded\"\n- Info shows version 1.0.0, source at `/home/node/.openclaw/extensions/claude-mem/`\n- Doctor reports no issues\n\n#### 2. Inspect plugin files\n\n```bash\nls -la /home/node/.openclaw/extensions/claude-mem/\ncat /home/node/.openclaw/extensions/claude-mem/openclaw.plugin.json\ncat /home/node/.openclaw/extensions/claude-mem/package.json\n```\n\n**Expected:**\n- `dist/index.js` exists (compiled plugin)\n- `openclaw.plugin.json` has `\"id\": \"claude-mem\"` and `\"kind\": \"memory\"`\n- `package.json` has `openclaw.extensions` field pointing to `./dist/index.js`\n\n#### 3. Start mock worker\n\n```bash\nnode /app/mock-worker.js &\n```\n\nVerify it's running:\n\n```bash\ncurl -s http://localhost:37777/health\n# → {\"status\":\"ok\"}\n\ncurl -s --max-time 3 http://localhost:37777/stream\n# → data: {\"type\":\"connected\",\"message\":\"Mock worker SSE stream\"}\n# → data: {\"type\":\"new_observation\",\"observation\":{...}}\n```\n\n#### 4. Configure and start gateway\n\n```bash\ncat > /home/node/.openclaw/openclaw.json << 'EOF'\n{\n  \"gateway\": {\n    \"mode\": \"local\",\n    \"auth\": {\n "}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1800,"uniquenessScore":43,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T02:29:11.812Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T02:29:11.812Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:44:56.095Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}