Persistent Context Across Sessions for Every Agent – Captures everything your agent does during sessions, compresses it with AI, and injects relevant context back into future sessions. Works with Claude Code, OpenClaw, Codex, Gemini, Hermes, Copilot, OpenCode + More
languages detected by GitHub · % code
every merged PR, grouped by type, newest first
Adds MAX_GENERATOR_IDLE_MS=5min to reapStaleSessions(): detects stale lastGeneratorActivity, SIGKILLs the SDKAgent subprocess hung on for-await, aborts the controller, then deleteSession() — instead of skipping when generatorPromise is non-null.
Adds a CLOSED/OPEN/HALF_OPEN state machine in openclaw/src/index.ts guarding workerPost, workerPostFireAndForget and workerGetText: opens after 3 network errors, drops for 30s, probes, then resets on gateway_start.
Replaces deleted `setup.sh` with `node smart-install.js` in `hooks.json` and adds `checkBinaryPlatformCompatibility()` reading the binary's first 4 bytes for Mach-O magic to warn on non-macOS.
Detects SIGTERM (exit 143) in `ensureGeneratorRunning` to abort the AbortController, adds 4h wall-clock guard per session, and kills duplicate `--resume` processes via `createPidCapturingSpawn` before registering new spawn.
Remaps `BeforeAgent` to `session-init` in `GeminiCliHooksInstaller`, adds Gemini 0.37 JSON document parsing (`type: "gemini"`) in `transcript-parser.ts`, and includes `platformSource` in the `/api/sessions/summarize` request body.
Adds `lastSummaryStored` to `ActiveSession` set by `ResponseProcessor` after each `storeObservations`, exposes `summaryStored` on `GET /api/sessions/status`, and makes `summarize.ts` warn when the queue empties with no summary row written.
Declares the 9 `search` and 5 `timeline` parameters explicitly in `inputSchema.properties` inside `src/servers/mcp-server.ts`, since MCP clients only expose declared fields to the LLM (previously `properties: {}` caused empty calls and HTTP 500).
Adds guard in `parseObservations()` (`src/sdk/parser.ts`) skipping observations where `title`, `narrative`, `facts`, `concepts` are all null/empty, eliminating ghost `<observation/>` entries the LLM emits under context pressure.
Pass `cwd: os.homedir()` to `StdioClientTransport` in `ChromaMcpManager.ts` so `pydantic-settings` no longer reads the project's `.env.local` and crashes on unknown keys like `CELERY_TASK_ALWAYS_EAGER`.
Splits findBun() in plugin/scripts/bun-runner.js: Windows calls spawnSync('where bun', {shell:true}) as a single string while Unix uses spawnSync('which', ['bun']) without shell, silencing Node 22+ DEP0190 warning.
Adds `.gitattributes` with `* text=auto eol=lf` plus explicit rules for `plugin/scripts/*.cjs`, preventing Windows CRLF from breaking the shebang with `env: node\r` on macOS/Linux.
In daemon startup async catch handler, detects EADDRINUSE (and Bun message regex variant) then runs a health check: if winner responds, logs INFO and exits cleanly instead of ERROR.
Removes top-level `mock.module('../../src/utils/project-name.js')` from `context-reinjection-guard.test.ts` that pinned `getProjectName()` to `'test-project'` across the Bun worker, and adds `bunfig.toml` with `[test] smol = true`.
Rewrites the 7 shell hook commands in hooks.json to resolve the plugin via `ls -dt ~/.claude/plugins/cache/thedotmack/claude-mem/[0-9]*/` before the marketplaces fallback when `CLAUDE_PLUGIN_ROOT` is missing on Linux.
Adds all-null guard in parseSummary (src/sdk/parser.ts) after extracting the 5 sub-tags request/investigated/learned/completed/next_steps: returns null when none match instead of persisting empty strings to SQLite.
Adds `parseFileList()` in `observations/files.ts`, reused in `SessionStore` and `ChromaSync`: wraps `JSON.parse` in try/catch and falls back to `[value]` for legacy bare-path rows crashing the viewer.
Replaces `${{ steps.inference.outputs.response }}` interpolation inside the `run:` block of `.github/workflows/summary.yml` with the already-declared `$RESPONSE` env var, killing the single-quote shell injection vector.
Replaces the default `CLAUDE_MEM_MODEL` constant from `claude-sonnet-4-5` to `claude-sonnet-4-6` in `SettingsDefaultsManager.ts`, viewer settings, `openclaw/install.sh` installer and test assertions.
Adds optional chaining on `getChromaSync()?.syncUserPrompt` in SessionRoutes.ts:359 and early-returns empty `{ids,distances,metadatas}` from SearchManager.queryChroma when `chromaSync` is null, preventing TypeError when CLAUDE_MEM_CHROMA_ENABLED=false.
Switches `execSync` calls in `plugin/scripts/smart-install.js` from `stdio: 'inherit'` to `['pipe','pipe','inherit']` and prints `{continue:true,suppressOutput:true}` on success and error paths so SessionStart hook receives valid JSON.