Claude-Mem OpenClaw Plugin — Setup Guide skill

This guide walks through setting up the claude-mem plugin on an OpenClaw gateway.

by thedotmack·Apache-2.0 license·★ 95,043 Stars on the repo·GitHub ↗

Download ZIPUse now

Files of Claude-Mem OpenClaw Plugin — Setup Guide

thedotmack/e290f3d66 files
Shared references1SKILL.md reads these from elsewhere in the repo. Not in the ZIP.Get them on GitHub ↗
SKILL.md
Show the full text463 lines

Claude-Mem OpenClaw Plugin — Setup Guide

This guide walks through setting up the claude-mem plugin on an OpenClaw gateway. By the end, your agents will have persistent memory across sessions via system prompt context injection, and optionally a real-time observation feed streaming to a messaging channel.

Run this one-liner to install everything automatically:

curl -fsSL https://install.cmem.ai/openclaw.sh | bash

The installer handles dependency checks (Bun, uv), plugin installation, memory slot configuration, AI provider setup, worker startup, and optional observation feed configuration — all interactively.

Install with options

Pre-select your AI provider and API key to skip interactive prompts:

curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --provider=gemini --api-key=YOUR_KEY

For fully unattended installation (defaults to Claude Max Plan, skips observation feed):

curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --non-interactive

To upgrade an existing installation (preserves settings, updates plugin):

curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --upgrade

After installation, skip to Step 4: Restart the Gateway and Verify to confirm everything is working.


Manual Setup

The steps below are for manual installation if you prefer not to use the automated installer, or need to troubleshoot individual steps.

Step 1: Clone the Claude-Mem Repo

First, clone the claude-mem repository to a location accessible by your OpenClaw gateway. This gives you the worker service source and the plugin code.

cd /opt  # or wherever you want to keep it
git clone https://github.com/thedotmack/claude-mem.git
cd claude-mem
npm install
npm run build

You'll need bun installed for the worker service. If you don't have it:

curl -fsSL https://bun.sh/install | bash
Step 2: Get the Worker Running

The 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.

Check if it's already running

If this machine also runs Claude Code with claude-mem installed, the worker may already be running:

curl http://localhost:37777/api/health

Got {"status":"ok"}? The worker is already running. Skip to Step 3.

Got connection refused or no response? The worker isn't running. Continue below.

If Claude Code has claude-mem installed

If claude-mem is installed as a Claude Code plugin (at ~/.claude/plugins/marketplaces/thedotmack/), start the worker from that installation:

cd ~/.claude/plugins/marketplaces/thedotmack
npm run worker:restart

Verify:

curl http://localhost:37777/api/health

Got {"status":"ok"}? You're set. Skip to Step 3.

Still not working? Check npm run worker:status for error details, or check that bun is installed and on your PATH.

If there's no Claude Code installation

Run the worker from the cloned repo:

cd /opt/claude-mem  # wherever you cloned it
npm run worker:start

Verify:

curl http://localhost:37777/api/health

Got {"status":"ok"}? You're set. Move to Step 3.

Still not working? Debug steps:

  • Check that bun is installed: bun --version
  • Check the worker status: npm run worker:status
  • Check if something else is using port 37777: lsof -i :37777
  • Check logs: npm run worker:logs (if available)
  • Try running it directly to see errors: bun plugin/scripts/worker-service.cjs start
Step 3: Add the Plugin to Your Gateway

Add the claude-mem plugin to your OpenClaw gateway configuration:

{
  "plugins": {
    "claude-mem": {
      "enabled": true,
      "config": {
        "project": "my-project",
        "syncMemoryFile": true,
        "workerPort": 37777
      }
    }
  }
}
Config fields explained
  • 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".

  • syncMemoryFile (boolean, default: true) — When enabled, the plugin injects the observation timeline into each agent's system prompt via the before_prompt_build hook. This gives agents cross-session context without writing to MEMORY.md. Set to false to disable context injection entirely (observations are still recorded).

  • syncMemoryFileExclude (string[], default: []) — Agent IDs excluded from automatic context injection. Useful for agents that curate their own memory. Observations are still recorded for excluded agents.

  • 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.


Step 4: Restart the Gateway and Verify

Restart your OpenClaw gateway so it picks up the new plugin configuration. After restart, check the gateway logs for:

[claude-mem] OpenClaw plugin loaded — v1.0.0 (worker: 127.0.0.1:37777)

If you see this, the plugin is loaded. You can also verify by running /claude_mem_status in any OpenClaw chat:

Claude-Mem Worker Status
Status: ok
Port: 37777
Active sessions: 0
Observation feed: disconnected

The observation feed shows disconnected because we haven't configured it yet. That's next.

Step 5: Verify Observations Are Being Recorded

Have an agent do some work. The plugin automatically records observations through these OpenClaw events:

  1. before_agent_start — Initializes a claude-mem session when the agent starts
  2. before_prompt_build — Injects the observation timeline into the agent's system prompt (cached for 60s)
  3. tool_result_persist — Records each tool use (Read, Write, Bash, etc.) as an observation
  4. agent_end — Summarizes the session and marks it complete

All of this happens automatically. No additional configuration needed.

To verify it's working, check the worker's viewer UI at http://localhost:37777 to see observations appearing after the agent runs.

You can also check the worker's viewer UI at http://localhost:37777 to see observations appearing in real time.

Step 6: Set Up the Observation Feed (Streaming to a Channel)

The 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.

What you'll see

Every time claude-mem creates a new observation from your agent's tool usage, a message like this appears in your channel:

🧠 Claude-Mem Observation
**Implemented retry logic for API client**
Added exponential backoff with configurable max retries to handle transient failures
Pick your channel

You need two things:

  • Channel type — Must match a channel plugin already running on your OpenClaw gateway
  • Target ID — The chat/channel/user ID where messages go
Telegram

Channel type: telegram

To find your chat ID:

  1. Message @userinfobot on Telegram — https://t.me/userinfobot
  2. It replies with your numeric chat ID (e.g., 123456789)
  3. For group chats, the ID is negative (e.g., -1001234567890)
"observationFeed": {
  "enabled": true,
  "channel": "telegram",
  "to": "123456789"
}
Discord

Channel type: discord

To find your channel ID:

  1. Enable Developer Mode in Discord: Settings → Advanced → Developer Mode
  2. Right-click the target channel → Copy Channel ID
"observationFeed": {
  "enabled": true,
  "channel": "discord",
  "to": "1234567890123456789"
}
Slack

Channel type: slack

To find your channel ID (not the channel name):

  1. Open the channel in Slack
  2. Click the channel name at the top
  3. Scroll to the bottom of the channel details — the ID looks like C01ABC2DEFG
"observationFeed": {
  "enabled": true,
  "channel": "slack",
  "to": "C01ABC2DEFG"
}
Signal

Channel type: signal

Use the phone number or group ID configured in your OpenClaw gateway's Signal plugin.

"observationFeed": {
  "enabled": true,
  "channel": "signal",
  "to": "+1234567890"
}
WhatsApp

Channel type: whatsapp

Use the phone number or group JID configured in your OpenClaw gateway's WhatsApp plugin.

"observationFeed": {
  "enabled": true,
  "channel": "whatsapp",
  "to": "+1234567890"
}
LINE

Channel type: line

Use the user ID or group ID from the LINE Developer Console.

"observationFeed": {
  "enabled": true,
  "channel": "line",
  "to": "U1234567890abcdef"
}
Add it to your config

Your complete plugin config should now look like this (using Telegram as an example):

{
  "plugins": {
    "claude-mem": {
      "enabled": true,
      "config": {
        "project": "my-project",
        "syncMemoryFile": true,
        "workerPort": 37777,
        "observationFeed": {
          "enabled": true,
          "channel": "telegram",
          "to": "123456789"
        }
      }
    }
  }
}
Restart and verify

Restart the gateway. Check the logs for these three lines in order:

[claude-mem] Observation feed starting — channel: telegram, target: 123456789
[claude-mem] Connecting to SSE stream at http://localhost:37777/stream
[claude-mem] Connected to SSE stream

Then run /claude_mem_feed in any OpenClaw chat:

Claude-Mem Observation Feed
Enabled: yes
Channel: telegram
Target: 123456789
Connection: connected

If Connection shows connected, you're done. Have an agent do some work and watch observations stream to your channel.

Commands Reference

The plugin registers two commands:

/claude_mem_status

Reports worker health and current session state.

/claude_mem_status

Output:

Claude-Mem Worker Status
Status: ok
Port: 37777
Active sessions: 2
Observation feed: connected
/claude_mem_feed

Shows observation feed status. Accepts optional on/off argument.

/claude_mem_feed          — show status
/claude_mem_feed on       — request enable (update config to persist)
/claude_mem_feed off      — request disable (update config to persist)

How It All Works

OpenClaw Gateway
  │
  ├── before_agent_start ───→ Init session
  ├── before_prompt_build ──→ Inject context into system prompt
  ├── tool_result_persist ──→ Record observation
  ├── agent_end ────────────→ Summarize + Complete session
  └── gateway_start ────────→ Reset session tracking + context cache
                    │
                    ▼
         Claude-Mem Worker (localhost:37777)
           ├── POST /api/sessions/init
           ├── POST /api/sessions/observations
           ├── POST /api/sessions/summarize
           ├── POST /api/sessions/complete
           ├── GET  /api/context/inject ──→ System prompt context
           └── GET  /stream ─────────────→ SSE → Messaging channels
System prompt context injection

The plugin injects the observation timeline into each agent's system prompt via the before_prompt_build hook. The content comes from the worker's GET /api/context/inject endpoint. Context is cached for 60 seconds per project to avoid re-fetching on every LLM turn. The cache is cleared on gateway restart.

This keeps MEMORY.md under the agent's control for curated long-term memory, while the observation timeline is delivered through the system prompt.

Observation recording

Every 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.

Session lifecycle
  • before_agent_start — Creates a session in the worker.
  • before_prompt_build — Fetches the observation timeline and returns it as appendSystemContext. Cached for 60s.
  • tool_result_persist — Records observation (fire-and-forget). Tool responses are truncated to 1000 characters.
  • agent_end — Sends the last assistant message for summarization, then completes the session. Both fire-and-forget.
  • gateway_start — Clears all session tracking (session IDs, context cache) so agents start fresh.
Observation feed

A 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).

Troubleshooting

Problem What to check
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
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.
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.
No context in agent system prompt Check that syncMemoryFile is not set to false. Check that the agent's ID is not in syncMemoryFileExclude. Verify the worker is running and has observations.
Observations not being recorded Check gateway logs for [claude-mem] messages. The worker must be running and reachable on localhost:37777.
Feed shows disconnected Worker's /stream endpoint not reachable. Check workerPort matches the actual worker port.
Feed shows reconnecting Connection dropped. The plugin auto-reconnects — wait up to 30 seconds.
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.
Observation feed disabled in logs Set observationFeed.enabled to true in your config.
Observation feed misconfigured in logs Both observationFeed.channel and observationFeed.to are required.
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).

Full Config Reference

{
  "plugins": {
    "claude-mem": {
      "enabled": true,
      "config": {
        "project": "openclaw",
        "syncMemoryFile": true,
        "workerPort": 37777,
        "observationFeed": {
          "enabled": false,
          "channel": "telegram",
          "to": "123456789"
        }
      }
    }
  }
}
Field Type Default Description
project string "openclaw" Project name scoping observations in the database
syncMemoryFile boolean true Inject observation context into agent system prompt
syncMemoryFileExclude string[] [] Agent IDs excluded from context injection
workerPort number 37777 Claude-mem worker service port
observationFeed.enabled boolean false Stream observations to a messaging channel
observationFeed.channel string — Channel type: telegram, discord, slack, signal, whatsapp, line
observationFeed.to string — Target chat/channel/user ID
1# Claude-Mem OpenClaw Plugin — Setup Guide
2 
3This guide walks through setting up the claude-mem plugin on an OpenClaw gateway. By the end, your agents will have persistent memory across sessions via system prompt context injection, and optionally a real-time observation feed streaming to a messaging channel.
4 
5## Quick Install (Recommended)
6 
7Run this one-liner to install everything automatically:
8 
9```bash
10curl -fsSL https://install.cmem.ai/openclaw.sh | bash
11```
12 
13The installer handles dependency checks (Bun, uv), plugin installation, memory slot configuration, AI provider setup, worker startup, and optional observation feed configuration — all interactively.
14 
15### Install with options
16 
17Pre-select your AI provider and API key to skip interactive prompts:
18 
19```bash
20curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --provider=gemini --api-key=YOUR_KEY
21```
22 
23For fully unattended installation (defaults to Claude Max Plan, skips observation feed):
24 
25```bash
26curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --non-interactive
27```
28 
29To upgrade an existing installation (preserves settings, updates plugin):
30 
31```bash
32curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --upgrade
33```
34 
35After installation, skip to [Step 4: Restart the Gateway and Verify](#step-4-restart-the-gateway-and-verify) to confirm everything is working.
36 
37---
38 
39## Manual Setup
40 
41The steps below are for manual installation if you prefer not to use the automated installer, or need to troubleshoot individual steps.
42 
43### Step 1: Clone the Claude-Mem Repo
44 
45First, clone the claude-mem repository to a location accessible by your OpenClaw gateway. This gives you the worker service source and the plugin code.
46 
47```bash
48cd /opt # or wherever you want to keep it
49git clone https://github.com/thedotmack/claude-mem.git
50cd claude-mem
51npm install
52npm run build
53```
54 
55You'll need **bun** installed for the worker service. If you don't have it:
56 
57```bash
58curl -fsSL https://bun.sh/install | bash
59```
60 
61### Step 2: Get the Worker Running
62 
63The 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.
64 
65#### Check if it's already running
66 
67If this machine also runs Claude Code with claude-mem installed, the worker may already be running:
68 
69```bash
70curl http://localhost:37777/api/health
71```
72 
73**Got `{"status":"ok"}`?** The worker is already running. Skip to Step 3.
74 
75**Got connection refused or no response?** The worker isn't running. Continue below.
76 
77#### If Claude Code has claude-mem installed
78 
79If claude-mem is installed as a Claude Code plugin (at `~/.claude/plugins/marketplaces/thedotmack/`), start the worker from that installation:
80 
81```bash
82cd ~/.claude/plugins/marketplaces/thedotmack
83npm run worker:restart
84```
85 
86Verify:
87```bash
88curl http://localhost:37777/api/health
89```
90 
91**Got `{"status":"ok"}`?** You're set. Skip to Step 3.
92 
93**Still not working?** Check `npm run worker:status` for error details, or check that bun is installed and on your PATH.
94 
95#### If there's no Claude Code installation
96 
97Run the worker from the cloned repo:
98 
99```bash
100cd /opt/claude-mem # wherever you cloned it
101npm run worker:start
102```
103 
104Verify:
105```bash
106curl http://localhost:37777/api/health
107```
108 
109**Got `{"status":"ok"}`?** You're set. Move to Step 3.
110 
111**Still not working?** Debug steps:
112- Check that bun is installed: `bun --version`
113- Check the worker status: `npm run worker:status`
114- Check if something else is using port 37777: `lsof -i :37777`
115- Check logs: `npm run worker:logs` (if available)
116- Try running it directly to see errors: `bun plugin/scripts/worker-service.cjs start`
117 
118### Step 3: Add the Plugin to Your Gateway
119 
120Add the `claude-mem` plugin to your OpenClaw gateway configuration:
121 
122```json
123{
124 "plugins": {
125 "claude-mem": {
126 "enabled": true,
127 "config": {
128 "project": "my-project",
129 "syncMemoryFile": true,
130 "workerPort": 37777
131 }
132 }
133 }
134}
135```
136 
137#### Config fields explained
138 
139- **`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"`.
140 
141- **`syncMemoryFile`** (boolean, default: `true`) — When enabled, the plugin injects the observation timeline into each agent's system prompt via the `before_prompt_build` hook. This gives agents cross-session context without writing to MEMORY.md. Set to `false` to disable context injection entirely (observations are still recorded).
142 
143- **`syncMemoryFileExclude`** (string[], default: `[]`) — Agent IDs excluded from automatic context injection. Useful for agents that curate their own memory. Observations are still recorded for excluded agents.
144 
145- **`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.
146 
147---
148 
149## Step 4: Restart the Gateway and Verify
150 
151Restart your OpenClaw gateway so it picks up the new plugin configuration. After restart, check the gateway logs for:
152 
153```
154[claude-mem] OpenClaw plugin loaded — v1.0.0 (worker: 127.0.0.1:37777)
155```
156 
157If you see this, the plugin is loaded. You can also verify by running `/claude_mem_status` in any OpenClaw chat:
158 
159```
160Claude-Mem Worker Status
161Status: ok
162Port: 37777
163Active sessions: 0
164Observation feed: disconnected
165```
166 
167The observation feed shows `disconnected` because we haven't configured it yet. That's next.
168 
169## Step 5: Verify Observations Are Being Recorded
170 
171Have an agent do some work. The plugin automatically records observations through these OpenClaw events:
172 
1731. **`before_agent_start`** — Initializes a claude-mem session when the agent starts
1742. **`before_prompt_build`** — Injects the observation timeline into the agent's system prompt (cached for 60s)
1753. **`tool_result_persist`** — Records each tool use (Read, Write, Bash, etc.) as an observation
1764. **`agent_end`** — Summarizes the session and marks it complete
177 
178All of this happens automatically. No additional configuration needed.
179 
180To verify it's working, check the worker's viewer UI at http://localhost:37777 to see observations appearing after the agent runs.
181 
182You can also check the worker's viewer UI at http://localhost:37777 to see observations appearing in real time.
183 
184## Step 6: Set Up the Observation Feed (Streaming to a Channel)
185 
186The 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.
187 
188### What you'll see
189 
190Every time claude-mem creates a new observation from your agent's tool usage, a message like this appears in your channel:
191 
192```
193🧠 Claude-Mem Observation
194**Implemented retry logic for API client**
195Added exponential backoff with configurable max retries to handle transient failures
196```
197 
198### Pick your channel
199 
200You need two things:
201- **Channel type** — Must match a channel plugin already running on your OpenClaw gateway
202- **Target ID** — The chat/channel/user ID where messages go
203 
204#### Telegram
205 
206Channel type: `telegram`
207 
208To find your chat ID:
2091. Message @userinfobot on Telegram — https://t.me/userinfobot
2102. It replies with your numeric chat ID (e.g., `123456789`)
2113. For group chats, the ID is negative (e.g., `-1001234567890`)
212 
213```json
214"observationFeed": {
215 "enabled": true,
216 "channel": "telegram",
217 "to": "123456789"
218}
219```
220 
221#### Discord
222 
223Channel type: `discord`
224 
225To find your channel ID:
2261. Enable Developer Mode in Discord: Settings → Advanced → Developer Mode
2272. Right-click the target channel → Copy Channel ID
228 
229```json
230"observationFeed": {
231 "enabled": true,
232 "channel": "discord",
233 "to": "1234567890123456789"
234}
235```
236 
237#### Slack
238 
239Channel type: `slack`
240 
241To find your channel ID (not the channel name):
2421. Open the channel in Slack
2432. Click the channel name at the top
2443. Scroll to the bottom of the channel details — the ID looks like `C01ABC2DEFG`
245 
246```json
247"observationFeed": {
248 "enabled": true,
249 "channel": "slack",
250 "to": "C01ABC2DEFG"
251}
252```
253 
254#### Signal
255 
256Channel type: `signal`
257 
258Use the phone number or group ID configured in your OpenClaw gateway's Signal plugin.
259 
260```json
261"observationFeed": {
262 "enabled": true,
263 "channel": "signal",
264 "to": "+1234567890"
265}
266```
267 
268#### WhatsApp
269 
270Channel type: `whatsapp`
271 
272Use the phone number or group JID configured in your OpenClaw gateway's WhatsApp plugin.
273 
274```json
275"observationFeed": {
276 "enabled": true,
277 "channel": "whatsapp",
278 "to": "+1234567890"
279}
280```
281 
282#### LINE
283 
284Channel type: `line`
285 
286Use the user ID or group ID from the LINE Developer Console.
287 
288```json
289"observationFeed": {
290 "enabled": true,
291 "channel": "line",
292 "to": "U1234567890abcdef"
293}
294```
295 
296### Add it to your config
297 
298Your complete plugin config should now look like this (using Telegram as an example):
299 
300```json
301{
302 "plugins": {
303 "claude-mem": {
304 "enabled": true,
305 "config": {
306 "project": "my-project",
307 "syncMemoryFile": true,
308 "workerPort": 37777,
309 "observationFeed": {
310 "enabled": true,
311 "channel": "telegram",
312 "to": "123456789"
313 }
314 }
315 }
316 }
317}
318```
319 
320### Restart and verify
321 
322Restart the gateway. Check the logs for these three lines in order:
323 
324```
325[claude-mem] Observation feed starting — channel: telegram, target: 123456789
326[claude-mem] Connecting to SSE stream at http://localhost:37777/stream
327[claude-mem] Connected to SSE stream
328```
329 
330Then run `/claude_mem_feed` in any OpenClaw chat:
331 
332```
333Claude-Mem Observation Feed
334Enabled: yes
335Channel: telegram
336Target: 123456789
337Connection: connected
338```
339 
340If `Connection` shows `connected`, you're done. Have an agent do some work and watch observations stream to your channel.
341 
342## Commands Reference
343 
344The plugin registers two commands:
345 
346### /claude_mem_status
347 
348Reports worker health and current session state.
349 
350```
351/claude_mem_status
352```
353 
354Output:
355```
356Claude-Mem Worker Status
357Status: ok
358Port: 37777
359Active sessions: 2
360Observation feed: connected
361```
362 
363### /claude_mem_feed
364 
365Shows observation feed status. Accepts optional `on`/`off` argument.
366 
367```
368/claude_mem_feed — show status
369/claude_mem_feed on — request enable (update config to persist)
370/claude_mem_feed off — request disable (update config to persist)
371```
372 
373## How It All Works
374 
375```
376OpenClaw Gateway
377 │
378 ├── before_agent_start ───→ Init session
379 ├── before_prompt_build ──→ Inject context into system prompt
380 ├── tool_result_persist ──→ Record observation
381 ├── agent_end ────────────→ Summarize + Complete session
382 └── gateway_start ────────→ Reset session tracking + context cache
383 │
384 ▼
385 Claude-Mem Worker (localhost:37777)
386 ├── POST /api/sessions/init
387 ├── POST /api/sessions/observations
388 ├── POST /api/sessions/summarize
389 ├── POST /api/sessions/complete
390 ├── GET /api/context/inject ──→ System prompt context
391 └── GET /stream ─────────────→ SSE → Messaging channels
392```
393 
394### System prompt context injection
395 
396The plugin injects the observation timeline into each agent's system prompt via the `before_prompt_build` hook. The content comes from the worker's `GET /api/context/inject` endpoint. Context is cached for 60 seconds per project to avoid re-fetching on every LLM turn. The cache is cleared on gateway restart.
397 
398This keeps MEMORY.md under the agent's control for curated long-term memory, while the observation timeline is delivered through the system prompt.
399 
400### Observation recording
401 
402Every 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.
403 
404### Session lifecycle
405 
406- **`before_agent_start`** — Creates a session in the worker.
407- **`before_prompt_build`** — Fetches the observation timeline and returns it as `appendSystemContext`. Cached for 60s.
408- **`tool_result_persist`** — Records observation (fire-and-forget). Tool responses are truncated to 1000 characters.
409- **`agent_end`** — Sends the last assistant message for summarization, then completes the session. Both fire-and-forget.
410- **`gateway_start`** — Clears all session tracking (session IDs, context cache) so agents start fresh.
411 
412### Observation feed
413 
414A 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).
415 
416## Troubleshooting
417 
418| Problem | What to check |
419|---------|---------------|
420| 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` |
421| 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`. |
422| 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. |
423| No context in agent system prompt | Check that `syncMemoryFile` is not set to `false`. Check that the agent's ID is not in `syncMemoryFileExclude`. Verify the worker is running and has observations. |
424| Observations not being recorded | Check gateway logs for `[claude-mem]` messages. The worker must be running and reachable on localhost:37777. |
425| Feed shows `disconnected` | Worker's `/stream` endpoint not reachable. Check `workerPort` matches the actual worker port. |
426| Feed shows `reconnecting` | Connection dropped. The plugin auto-reconnects — wait up to 30 seconds. |
427| `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. |
428| `Observation feed disabled` in logs | Set `observationFeed.enabled` to `true` in your config. |
429| `Observation feed misconfigured` in logs | Both `observationFeed.channel` and `observationFeed.to` are required. |
430| 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). |
431 
432## Full Config Reference
433 
434```json
435{
436 "plugins": {
437 "claude-mem": {
438 "enabled": true,
439 "config": {
440 "project": "openclaw",
441 "syncMemoryFile": true,
442 "workerPort": 37777,
443 "observationFeed": {
444 "enabled": false,
445 "channel": "telegram",
446 "to": "123456789"
447 }
448 }
449 }
450 }
451}
452```
453 
454| Field | Type | Default | Description |
455|-------|------|---------|-------------|
456| `project` | string | `"openclaw"` | Project name scoping observations in the database |
457| `syncMemoryFile` | boolean | `true` | Inject observation context into agent system prompt |
458| `syncMemoryFileExclude` | string[] | `[]` | Agent IDs excluded from context injection |
459| `workerPort` | number | `37777` | Claude-mem worker service port |
460| `observationFeed.enabled` | boolean | `false` | Stream observations to a messaging channel |
461| `observationFeed.channel` | string | — | Channel type: `telegram`, `discord`, `slack`, `signal`, `whatsapp`, `line` |
462| `observationFeed.to` | string | — | Target chat/channel/user ID |
463 

Discussion