@bcmyguest/openmem 0.6.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/{skills → .agents/skills}/openmem/SKILL.md +5 -0
  2. package/README.md +80 -76
  3. package/cli/coding-agent/capabilities.mjs +14 -3
  4. package/cli/coding-agent/context-store.mjs +81 -0
  5. package/cli/coding-agent/context-trim.mjs +897 -0
  6. package/cli/coding-agent/file-io.mjs +72 -0
  7. package/cli/coding-agent/hook-harnesses.mjs +2 -1
  8. package/cli/coding-agent/hook-runner.mjs +28 -4
  9. package/cli/coding-agent/install-access.mjs +43 -17
  10. package/cli/coding-agent/install-context-proxy.mjs +333 -0
  11. package/cli/coding-agent/install-rtk.mjs +60 -0
  12. package/cli/coding-agent/install-shim.mjs +119 -15
  13. package/cli/coding-agent/opencode-config.mjs +21 -5
  14. package/cli/coding-agent/opencode-plugin.mjs +39 -3
  15. package/cli/coding-agent/opencode2-plugin/index.js +299 -0
  16. package/cli/coding-agent/recall-frame.mjs +29 -0
  17. package/cli/coding-agent/remove-upstream-access.mjs +122 -0
  18. package/cli/coding-agent/runtime.mjs +2 -1
  19. package/cli/coding-agent/session-db.mjs +626 -0
  20. package/cli/coding-agent/session-facade.mjs +30 -6
  21. package/cli/coding-agent/toml-edit.mjs +161 -0
  22. package/cli/context-management.mjs +254 -0
  23. package/cli/feed-sync.mjs +18 -2
  24. package/cli/install-coding-agent.mjs +173 -40
  25. package/cli/mcp/context-sql-runner.mjs +58 -0
  26. package/cli/mcp/context-store.mjs +670 -0
  27. package/cli/mcp/knowledge.mjs +333 -0
  28. package/cli/mcp/memory-facade.mjs +99 -33
  29. package/cli/openmem-mcp.mjs +3 -0
  30. package/cli/openmem.mjs +18 -1
  31. package/cli/schedule.mjs +176 -0
  32. package/cli/stack.mjs +2 -0
  33. package/cli/switch-memory-provider.mjs +1 -1
  34. package/compose.yaml +67 -4
  35. package/config/hindsight.env.example +2 -0
  36. package/config/openmem.toml.example +64 -2
  37. package/docs/architecture.md +35 -9
  38. package/docs/coding-agent-hooks.md +26 -2
  39. package/docs/coding-agents.md +27 -7
  40. package/docs/compatibility.md +80 -0
  41. package/docs/concepts.md +30 -7
  42. package/docs/context-management.md +255 -0
  43. package/docs/context-proxy.md +115 -0
  44. package/docs/context-research.md +215 -0
  45. package/docs/context-store.md +277 -0
  46. package/docs/hindsight.md +5 -2
  47. package/docs/mcp-setup.md +5 -2
  48. package/docs/mem0.md +39 -1
  49. package/docs/memory-providers.md +2 -2
  50. package/docs/meridian-litellm.md +198 -0
  51. package/docs/model-configuration.md +22 -0
  52. package/docs/npx-install.md +6 -4
  53. package/docs/openmem-config.md +2 -2
  54. package/docs/quickstart.md +12 -6
  55. package/docs/setup-wizard.md +5 -4
  56. package/docs/sources-feeds.md +9 -22
  57. package/package.json +5 -4
  58. package/providers/cognee/OPERATOR.md +2 -2
  59. package/providers/hindsight/lib/clack.mjs +122 -20
  60. package/providers/hindsight/lib/coding-agent.mjs +1 -1
  61. package/providers/hindsight/lib/config.mjs +6 -0
  62. package/providers/hindsight/lib/env-setup.mjs +2 -1
  63. package/providers/hindsight/lib/litellm-routes.mjs +21 -12
  64. package/providers/hindsight/lib/meridian.mjs +307 -0
  65. package/providers/hindsight/lib/model-backend.mjs +38 -9
  66. package/providers/hindsight/lib/probe.mjs +21 -0
  67. package/providers/hindsight/lib/stack-env.mjs +5 -12
  68. package/providers/hindsight/lib/state.mjs +6 -1
  69. package/providers/hindsight/lib/summary.mjs +16 -2
  70. package/providers/hindsight/lib/validate.mjs +6 -0
  71. package/providers/hindsight/wizard.mjs +3 -2
  72. package/providers/mem0/OPERATOR.md +21 -2
  73. package/providers/mem0/compose.yaml +24 -2
  74. package/providers/mem0/lib/coding-agent.mjs +1 -1
  75. package/providers/mem0/lib/configure.mjs +66 -0
  76. package/providers/mem0/lib/litellm.mjs +457 -0
  77. package/providers/mem0/lib/stack-env.mjs +40 -1
  78. package/providers/mem0/lib/summary.mjs +30 -2
  79. package/providers/mem0/manifest.json +1 -1
  80. package/providers/mem0/wizard.mjs +15 -2
  81. package/proxy/config.yaml +33 -0
  82. package/proxy/openmem_context/__init__.py +6 -0
  83. package/proxy/openmem_context/adapters.py +504 -0
  84. package/proxy/openmem_context/compress.py +53 -0
  85. package/proxy/openmem_context/core.py +606 -0
  86. package/proxy/openmem_context/embed.py +212 -0
  87. package/proxy/openmem_context/recall.py +49 -0
  88. package/proxy/openmem_context/session.py +70 -0
  89. package/proxy/openmem_context/sessiondb.py +276 -0
  90. package/proxy/openmem_context/settings.py +134 -0
  91. package/proxy/openmem_context/store.py +129 -0
  92. package/proxy/openmem_context/tokens.py +123 -0
  93. package/proxy/openmem_context/ttl.py +78 -0
  94. package/proxy/openmem_context_hook.py +34 -0
  95. package/scripts/check-pack.mjs +2 -1
  96. package/scripts/setup.mjs +14 -1
  97. package/server.json +2 -2
  98. package/wizard/lib/context-step.mjs +140 -0
  99. package/wizard/lib/litellm-env.mjs +55 -0
  100. package/wizard/lib/pm-config.mjs +212 -4
  101. package/wizard/lib/prompts.mjs +28 -0
  102. package/wizard/lib/run-wizard.mjs +26 -31
package/docs/mem0.md CHANGED
@@ -15,7 +15,7 @@ Upstream project: [mem0ai/mem0](https://github.com/mem0ai/mem0). Stack details f
15
15
  | Bind so the indexer container can reach the server | Wizard smoke: docs, retain, search, delete-by-id |
16
16
  | | Unified MCP + optional native mem0 MCP |
17
17
 
18
- Compose profile `mem0` adds env + `extra_hosts` on the shared **indexer** only — there is no mem0 container in this repo yet.
18
+ Compose profile `mem0` adds env + `extra_hosts` on the shared **indexer** only — there is no mem0 container in this repo yet. The optional profile `litellm` adds the stack LiteLLM on loopback for mem0's LLM ([below](#models-through-the-stack-litellm-optional)).
19
19
 
20
20
  ## First-time setup
21
21
 
@@ -55,6 +55,44 @@ curl -fsS "$MEM0_API_URL/docs" # URL from wizard / stack .env
55
55
 
56
56
  Search fails if the server’s embedder is misconfigured; smoke stores with `infer: false` and looks for that fact.
57
57
 
58
+ ## Models through the stack LiteLLM (optional)
59
+
60
+ mem0 picks its own LLM and embedder. The wizard can instead route mem0's LLM through the stack's LiteLLM, the gateway Hindsight uses, so a model change (Claude included) is one LiteLLM route. In step 3 answer yes to "Route mem0's LLM through the stack LiteLLM", or run `./setup --yes` with `MEM0_LITELLM=1`.
61
+
62
+ | Backend | mem0 LLM (`memory-llm`) | Embeddings (`memory-embed`) | Key in `litellm.env` |
63
+ | --- | --- | --- | --- |
64
+ | Ollama | `ollama_chat/<model>` (default `gemma4:e2b`) | `ollama/nomic-embed-text` by default (`none` keeps mem0's embedder) | none |
65
+ | Custom OpenAI-compatible URL | `openai/<model>` | optional `openai/<model>` (e.g. `text-embedding-3-small`) | `LEMOND_API_KEY` (same variable as Hindsight's custom route) |
66
+ | Anthropic API key | `anthropic/<model>` (default `claude-haiku-5-5`) | none: mem0 keeps its own embedder | `ANTHROPIC_API_KEY` |
67
+ | Claude subscription (Meridian) | `anthropic/<model>` at Meridian ([guide](meridian-litellm.md)); use is governed by Anthropic's [Consumer Terms](https://www.anthropic.com/legal/consumer-terms) | none | `MERIDIAN_API_KEY` |
68
+
69
+ What the wizard does:
70
+
71
+ - writes `~/.config/personal-memory/mem0-litellm.yaml` (routes only; keys are `os.environ/…` references) and points `LITELLM_CONFIG` at it;
72
+ - keeps `LITELLM_MASTER_KEY` and provider keys in `~/.config/hindsight/litellm.env` (mode 600; `LITELLM_ENV_FILE` overrides), creating an `sk-` master key when the file is new;
73
+ - sets `COMPOSE_PROFILES=mem0,litellm`. `litellm` has its own compose profile; `providers/mem0/compose.yaml` publishes it on **`127.0.0.1:${MEM0_LITELLM_PORT:-4000}` only** (the wizard keeps 4000 when free, else offers the next free port) and its entrypoint exits unless `LITELLM_MASTER_KEY` starts with `sk-`;
74
+ - prints the mem0 config blocks below. It does **not** edit your mem0 server config.
75
+
76
+ ```json
77
+ {
78
+ "llm": {"provider": "openai", "config": {"model": "memory-llm", "openai_base_url": "http://127.0.0.1:4000/v1", "api_key": "<LITELLM_MASTER_KEY>"}},
79
+ "embedder": {"provider": "openai", "config": {"model": "memory-embed", "openai_base_url": "http://127.0.0.1:4000/v1", "api_key": "<LITELLM_MASTER_KEY>"}},
80
+ "vector_store": {"config": {"embedding_model_dims": 768}}
81
+ }
82
+ ```
83
+
84
+ The `embedder` and `vector_store` blocks appear only when the backend serves embeddings (768 is `nomic-embed-text`'s size). Apply the blocks yourself: `POST /configure` on the REST server with an admin key, or merge them into the dict you pass to `Memory.from_config`.
85
+
86
+ Why these keys (mem0 `main` at [26cdefb](https://github.com/mem0ai/mem0/tree/26cdefb46600c0fa5953c4b5ee5003c125539fc4)):
87
+
88
+ - The self-hosted REST server bundles only the `openai`, `anthropic` and `gemini` LLM providers and the `openai` and `gemini` embedders ([server/main.py L62-63](https://github.com/mem0ai/mem0/blob/26cdefb46600c0fa5953c4b5ee5003c125539fc4/server/main.py#L62-L63)), so the snippet uses provider `openai` against LiteLLM rather than mem0's `litellm` provider ([docs](https://docs.mem0.ai/components/llms/models/litellm)), which also passes no base URL to `litellm.completion` ([mem0/llms/litellm.py](https://github.com/mem0ai/mem0/blob/26cdefb46600c0fa5953c4b5ee5003c125539fc4/mem0/llms/litellm.py)).
89
+ - The `openai` LLM uses `openai_base_url` and `api_key` from its config, but switches to OpenRouter when `OPENROUTER_API_KEY` is set ([mem0/llms/openai.py](https://github.com/mem0ai/mem0/blob/26cdefb46600c0fa5953c4b5ee5003c125539fc4/mem0/llms/openai.py), [config](https://docs.mem0.ai/components/llms/config)).
90
+ - The `openai` embedder reads `openai_base_url`, `api_key` and `model` ([mem0/embeddings/openai.py](https://github.com/mem0ai/mem0/blob/26cdefb46600c0fa5953c4b5ee5003c125539fc4/mem0/embeddings/openai.py), [config](https://docs.mem0.ai/components/embedders/config)). Leaving `embedding_dims` unset keeps it from sending a `dimensions` parameter.
91
+ - pgvector's collection size is `vector_store.config.embedding_model_dims` (default 1536, [mem0/configs/vector_stores/pgvector.py](https://github.com/mem0ai/mem0/blob/26cdefb46600c0fa5953c4b5ee5003c125539fc4/mem0/configs/vector_stores/pgvector.py)). A different embedder needs a new collection or re-added memories.
92
+ - `POST /configure` deep-merges the body into the running config and persists it ([server/main.py L332-337](https://github.com/mem0ai/mem0/blob/26cdefb46600c0fa5953c4b5ee5003c125539fc4/server/main.py#L332-L337), `update_config` in `server/server_state.py`).
93
+
94
+ Limits: `127.0.0.1` reaches LiteLLM only from a mem0 server running on this host; a mem0 server inside another container needs host networking or a different route. Claude has no embedding model, so the Anthropic and Meridian backends route the LLM only. Whether mem0's extraction prompts (JSON `response_format`) work with every routed model is not verified here; test with an `infer: true` add after switching.
95
+
58
96
  ## Banks / scopes
59
97
 
60
98
  mem0 scopes map to **`user_id`**. OpenMem’s MCP `bank` argument and indexer banks become that `user_id`. Default unified MCP scope is `openmem-mcp` unless tools pass `bank`. Project work should pass the resolved project bank so session noise does not land in the default. See [Concepts — Context and banks](concepts.md#context-and-banks).
@@ -65,7 +65,7 @@ after meta steps — like asdf plugin install scripts, not reimplemented npm/mem
65
65
 
66
66
  NotebookLM sync is **orthogonal** to which provider you picked: enable the `notebooklm` profile and the sync container uses the same `MEMORY_SINK` as the indexer (Hindsight, mem0, or Cognee).
67
67
 
68
- Coding-agent session memory uses the **same** in-repo hooks and unified MCP for every provider; optional `--hindsight-plugin` adds the upstream Hindsight plugin on Hindsight stacks only.
68
+ Coding-agent session memory uses the **same** in-repo hooks and unified MCP for every provider; on Hindsight stacks `--provider-plugin` swaps the in-repo hooks for the upstream Hindsight plugin (`[agents] integration = "provider"`).
69
69
 
70
70
  ## Provider manifest
71
71
 
@@ -143,7 +143,7 @@ first step); default action is full **configure and start**.
143
143
 
144
144
  ### Changing provider later
145
145
 
146
- Prefer **`npx @bcmyguest/openmem switch <id> --yes`** (checkout: `npx . switch <id> --yes`) over a full
146
+ Prefer **`npx @bcmyguest/openmem switch <id> --yes`** (checkout: `node cli/openmem.mjs switch <id> --yes`) over a full
147
147
  interactive setup re-run when you only need to change backends:
148
148
 
149
149
  - Updates `MEMORY_PROVIDER` in `~/.config/hindsight/wizard.conf`
@@ -0,0 +1,198 @@
1
+ # Meridian route (Claude subscription)
2
+
3
+ Route the three Hindsight aliases through [Meridian](https://github.com/rynfar/meridian), a local proxy that serves a signed-in Claude subscription over the Anthropic Messages and OpenAI Chat Completions APIs. Hindsight still calls `http://litellm:4000/v1`; only the override YAML changes.
4
+
5
+ ```
6
+ hindsight ──openai──▶ litellm:4000 ──anthropic/──▶ host.docker.internal:3456 (Meridian) ──Agent SDK──▶ Claude subscription
7
+ ```
8
+
9
+ Checked against Meridian 1.87.0 docs and LiteLLM docs on 2026-10-29. Nothing below was run end to end; steps marked **unverified** rest on docs alone.
10
+
11
+ ## Prerequisites
12
+
13
+ | Need | Why |
14
+ | --- | --- |
15
+ | Node.js 22+ | [Meridian quick start](https://github.com/rynfar/meridian#quick-start) |
16
+ | Claude Code CLI, signed in (`claude login`) | Meridian runs requests through the Agent SDK with those credentials. Haiku 5.5 needs Claude Code 2.1.293+ ([Haiku 5.5](https://github.com/rynfar/meridian/blob/main/docs/configuration.md#haiku-55)) |
17
+ | Claude Pro or Max plan | Requests count against plan limits |
18
+ | OpenMem stack set up | `node scripts/setup.mjs` has run once |
19
+
20
+ ## Run Meridian
21
+
22
+ ```sh
23
+ npm install -g @rynfar/meridian
24
+ claude login
25
+ ```
26
+
27
+ Meridian binds `127.0.0.1:3456` by default. The LiteLLM container reaches the host through `host.docker.internal` (`extra_hosts: host-gateway` in `compose.yaml`), which resolves to the Docker bridge address, not loopback, so a loopback-only Meridian is unreachable from the container on Linux. Bind all interfaces and require a key:
28
+
29
+ | Variable | Value | Source |
30
+ | --- | --- | --- |
31
+ | `MERIDIAN_HOST` | `0.0.0.0` (default `127.0.0.1`) | [Configuration table](https://github.com/rynfar/meridian/blob/main/docs/configuration.md#configuration) |
32
+ | `MERIDIAN_PORT` | `3456` (default) | same |
33
+ | `MERIDIAN_API_KEY` | long random secret. Clients send it as `x-api-key` or `Authorization: Bearer`; `/` and `/health` stay open | [API Key Authentication](https://github.com/rynfar/meridian/blob/main/docs/configuration.md#api-key-authentication) |
34
+
35
+ `0.0.0.0` also exposes port 3456 on every host interface; firewall it to the Docker bridge if the machine sits on a shared network.
36
+
37
+ ```sh
38
+ install -d -m 700 ~/.config/meridian
39
+ printf 'MERIDIAN_HOST=0.0.0.0\nMERIDIAN_API_KEY=%s\n' "$(openssl rand -hex 32)" > ~/.config/meridian/meridian.env
40
+ chmod 600 ~/.config/meridian/meridian.env
41
+ set -a; . ~/.config/meridian/meridian.env; set +a
42
+ meridian
43
+ ```
44
+
45
+ ### Keep it running
46
+
47
+ Meridian documents a Nix Home Manager user service and a [systemd socket-activation example](https://github.com/rynfar/meridian/blob/main/docs/configuration.md#systemd-socket-activation). For an npm install it ships `bin/meridian-launchd.sh`, a POSIX launcher it documents as usable "as a systemd `ExecStart`" ([Running as a service without drift](https://github.com/rynfar/meridian/blob/main/docs/configuration.md#running-as-a-service-without-drift)); the launcher self-updates at start unless `MERIDIAN_NO_SELF_UPDATE=1`.
48
+
49
+ The unit below is **unverified** (written from those docs, not tested). Replace `ExecStart` with the output of `echo "$(npm root -g)/@rynfar/meridian/bin/meridian-launchd.sh"`, and set `PATH` so the unit finds the same `node` and `npm` as your shell (nvm and volta installs live outside the systemd default `PATH`).
50
+
51
+ ```ini
52
+ # ~/.config/systemd/user/meridian.service
53
+ [Unit]
54
+ Description=Meridian proxy (Claude subscription)
55
+
56
+ [Service]
57
+ EnvironmentFile=%h/.config/meridian/meridian.env
58
+ Environment=PATH=/usr/local/bin:/usr/bin:/bin
59
+ ExecStart=/usr/lib/node_modules/@rynfar/meridian/bin/meridian-launchd.sh
60
+ Restart=on-failure
61
+
62
+ [Install]
63
+ WantedBy=default.target
64
+ ```
65
+
66
+ ```sh
67
+ systemctl --user daemon-reload
68
+ systemctl --user enable --now meridian
69
+ loginctl enable-linger "$USER" # keep it running while logged out
70
+ ```
71
+
72
+ **Docker alternative (unverified).** Meridian publishes no image; build it from the repo (`docker build -t meridian .`) and mount `~/.claude` ([Docker, single account](https://github.com/rynfar/meridian/blob/main/docs/deployment.md#single-account)). The image already sets `CLAUDE_PROXY_HOST=0.0.0.0`. Attach it to the stack network with `docker network connect openmem_default meridian` and use `api_base: http://meridian:3456`; nothing is then published to the host. Set `MERIDIAN_HOST_ID` and persist the volumes listed under [Persistence and host identity](https://github.com/rynfar/meridian/blob/main/docs/deployment.md#persistence-and-host-identity).
73
+
74
+ ## Provider choice: `anthropic/`
75
+
76
+ | | `anthropic/<model>` → `/v1/messages` | `openai/<model>` → `/v1/chat/completions` |
77
+ | --- | --- | --- |
78
+ | Meridian path | Primary API; Meridian's docs describe LiteLLM on this route (`passthrough` adapter, [Claude Code behind a gateway](https://github.com/rynfar/meridian/blob/main/docs/configuration.md#claude-code-behind-a-gateway)) | Supported; headerless tool loops get a derived session key ([OpenAI-compatible tools](https://github.com/rynfar/meridian/blob/main/docs/agents.md#openai-compatible-tools-open-webui-continue-etc)) |
79
+ | Tool calls (`memory-reflect`) | LiteLLM translates OpenAI `tools` to Anthropic `tool_use` ([function calling](https://docs.litellm.ai/docs/providers/anthropic#functiontool-calling)); Meridian returns calls to the client in passthrough mode ([Passthrough Mode](https://github.com/rynfar/meridian/blob/main/docs/configuration.md#passthrough-mode-and-tool-calling)) | Meridian translates OpenAI tools itself |
80
+ | `reasoning_effort` | LiteLLM maps it to `thinking` (budget 1024/2048/4096, or adaptive + `output_config.effort` on 4.6+ models) ([thinking](https://docs.litellm.ai/docs/providers/anthropic#usage---thinking--reasoning)). Drop it, below | Meridian's handling undocumented |
81
+ | `response_format` | LiteLLM converts it to native `output_format` on models it knows, else to a forced tool call ([structured outputs](https://docs.litellm.ai/docs/providers/anthropic#structured-outputs)). Meridian's handling of `output_format` is **unverified** | Meridian's handling undocumented |
82
+
83
+ Use `anthropic/`: it is the route Meridian documents for LiteLLM and gives the request shape LiteLLM translates most predictably. Fall back to `openai/<model>` with `api_base: http://host.docker.internal:3456/v1` if retain fails on structured output.
84
+
85
+ LiteLLM appends `/v1/messages` to `api_base`, so `api_base` has no `/v1` ([Custom API Base](https://docs.litellm.ai/docs/providers/anthropic#custom-api-base)). LiteLLM sends `api_key` as `x-api-key`, which Meridian accepts.
86
+
87
+ ## Thinking and token limits
88
+
89
+ The shipped `enable_thinking: false` is a llama.cpp chat-template flag; Claude ignores it. Remove it.
90
+
91
+ | Setting | Behavior through Meridian |
92
+ | --- | --- |
93
+ | Thinking off | Meridian refuses explicit `thinking: disabled` on Haiku 5.5 with HTTP 400 before generation ([Haiku 5.5](https://github.com/rynfar/meridian/blob/main/docs/configuration.md#haiku-55)). Send no thinking parameter; `additional_drop_params: ["reasoning_effort"]` stops LiteLLM generating one from Hindsight's `reasoning_effort` ([Specify params to drop](https://docs.litellm.ai/docs/completion/drop_params#specify-params-to-drop)) |
94
+ | `HINDSIGHT_API_*_MAX_COMPLETION_TOKENS`, LiteLLM `max_tokens` | Ignored by default: the Agent SDK has no output cap, so Meridian does not bound the answer ([Known limitations](https://github.com/rynfar/meridian/blob/main/docs/configuration.md#known-limitations)). Reflect tool calls are never truncated, and output is unbounded |
95
+ | `MERIDIAN_ENFORCE_MAX_TOKENS=1` | Enforces the cap on thinking plus text. With reflect at 2048, adaptive thinking can consume the budget, and a cap that lands mid tool call fails the request. Leave unset |
96
+ | `temperature`, `top_p` | Meridian's Claude docs do not say whether these reach the model; assume ignored (**unverified**). The README's "does not expose … sampling controls" sentence describes the Antigravity CLI backend, not Claude |
97
+
98
+ ## Route file
99
+
100
+ `~/.config/hindsight/litellm.yaml` replaces the backend route entirely. Model ids must appear in Meridian's `GET /v1/models`; `claude-haiku-5-5` is Meridian's `haiku` default and `claude-sonnet-5-5` appears in its client examples ([Pi](https://github.com/rynfar/meridian/blob/main/docs/agents.md#pi)). Reflect gets the larger model, as in the shipped routes.
101
+
102
+ ```yaml
103
+ # LiteLLM routes for Hindsight, backend: Meridian on the host (Claude subscription).
104
+ # See docs/meridian-litellm.md. MERIDIAN_API_KEY lives in ~/.config/hindsight/litellm.env.
105
+ model_list:
106
+ - model_name: memory-retain
107
+ litellm_params:
108
+ model: anthropic/claude-haiku-5-5
109
+ api_base: http://host.docker.internal:3456
110
+ api_key: os.environ/MERIDIAN_API_KEY
111
+ max_tokens: 4096
112
+ timeout: 300
113
+ additional_drop_params: ["reasoning_effort"]
114
+ - model_name: memory-reflect
115
+ litellm_params:
116
+ model: anthropic/claude-sonnet-5-5
117
+ api_base: http://host.docker.internal:3456
118
+ api_key: os.environ/MERIDIAN_API_KEY
119
+ max_tokens: 4096
120
+ timeout: 300
121
+ additional_drop_params: ["reasoning_effort"]
122
+ - model_name: memory-consolidate
123
+ litellm_params:
124
+ model: anthropic/claude-haiku-5-5
125
+ api_base: http://host.docker.internal:3456
126
+ api_key: os.environ/MERIDIAN_API_KEY
127
+ max_tokens: 4096
128
+ timeout: 300
129
+ additional_drop_params: ["reasoning_effort"]
130
+
131
+ general_settings:
132
+ master_key: os.environ/LITELLM_MASTER_KEY
133
+ ```
134
+
135
+ ## With the wizard
136
+
137
+ `./setup` step "3. Model backend" option 4, **Claude subscription (Meridian)**, automates [Route file](#route-file) and [Apply](#apply). It does not install or start Meridian; run it first as in [Run Meridian](#run-meridian).
138
+
139
+ | Step | What the wizard does |
140
+ | --- | --- |
141
+ | Ask | Meridian URL from the host (default `http://127.0.0.1:3456`, port from `MERIDIAN_PORT` in `~/.config/meridian/meridian.env`) and an optional `MERIDIAN_API_KEY` (blank reuses the environment, `meridian.env`, or `litellm.env`) |
142
+ | Probe | `GET /health` and `GET /v1/models` (with `x-api-key`) from the host, then `/health` on the `docker0` address. Answering on 127.0.0.1 but not on `docker0` means a loopback-only bind: it warns to set `MERIDIAN_HOST=0.0.0.0`. Without `docker0` it states the requirement |
143
+ | Models | Retain and consolidate: `claude-haiku-5-5`, reflect: `claude-sonnet-5-5`, when listed; otherwise the first listed Haiku and Sonnet ids. Unreachable Meridian: the guide defaults |
144
+ | Write | The route file above as `~/.config/hindsight/litellm.yaml` (an existing one is copied to `litellm.yaml.bak-<timestamp>`), `MERIDIAN_API_KEY` in `litellm.env` (mode 600; `placeholder` when Meridian runs without a key), and `[model] backend = "meridian"` in `wizard.conf` and `config.toml` |
145
+
146
+ Non-interactive: `PM_BACKEND=meridian MERIDIAN_BASE=http://127.0.0.1:3456 MERIDIAN_API_KEY=... ./setup --yes`. `[model.meridian] host` in `config.toml` sets `MERIDIAN_BASE`; `PM_DEFAULT_MODEL` and `PM_REFLECT_MODEL` pick models. `--dry-run` probes and prints the plan without writing. Then run the [Smoke test](#smoke-test); the wizard's host-side probe does not prove the container reaches Meridian through a firewall.
147
+
148
+ ## Apply
149
+
150
+ ```sh
151
+ cd ~/personal-memory # this checkout
152
+ [ -f ~/.config/hindsight/litellm.yaml ] && cp ~/.config/hindsight/litellm.yaml ~/.config/hindsight/litellm.yaml.bak-$(date +%Y%m%d%H%M%S)
153
+ $EDITOR ~/.config/hindsight/litellm.yaml # paste the route file
154
+ grep -h '^MERIDIAN_API_KEY' ~/.config/meridian/meridian.env >> ~/.config/hindsight/litellm.env
155
+ node scripts/setup.mjs
156
+ docker compose up -d --force-recreate litellm
157
+ ```
158
+
159
+ `--force-recreate` matters: Compose does not see edits inside the mounted YAML, so a plain `up -d` can keep the old routes. Revert by moving the override aside and rerunning the last two commands.
160
+
161
+ ## Smoke test
162
+
163
+ LiteLLM publishes no host port; run curl on the stack network (`openmem_default`, from `name: openmem`).
164
+
165
+ ```sh
166
+ set -a; . ~/.config/hindsight/litellm.env; set +a
167
+ net="--network openmem_default --add-host host.docker.internal:host-gateway"
168
+
169
+ # 1. Meridian reachable from a container, models listed
170
+ docker run --rm $net curlimages/curl -s http://host.docker.internal:3456/health
171
+ docker run --rm $net curlimages/curl -s -H "x-api-key: $MERIDIAN_API_KEY" http://host.docker.internal:3456/v1/models
172
+
173
+ # 2. Alias answers through LiteLLM
174
+ docker run --rm $net curlimages/curl -s http://litellm:4000/v1/chat/completions \
175
+ -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H 'Content-Type: application/json' \
176
+ -d '{"model":"memory-retain","messages":[{"role":"user","content":"Reply with OK."}]}'
177
+
178
+ # 3. Reflect returns a tool call (expect finish_reason "tool_calls")
179
+ docker run --rm $net curlimages/curl -s http://litellm:4000/v1/chat/completions \
180
+ -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H 'Content-Type: application/json' \
181
+ -d '{"model":"memory-reflect","reasoning_effort":"low","messages":[{"role":"user","content":"What is the weather in Paris? Use the tool."}],
182
+ "tools":[{"type":"function","function":{"name":"get_weather","description":"Weather for a city",
183
+ "parameters":{"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}}}]}'
184
+ ```
185
+
186
+ Then run a smoke retain and reflect through Hindsight, as for any route change ([Model configuration](model-configuration.md#verify-and-migrate)).
187
+
188
+ ## Caveats
189
+
190
+ | Topic | Detail |
191
+ | --- | --- |
192
+ | Terms | Subscription use through third-party proxies is governed by Anthropic's [Consumer Terms](https://www.anthropic.com/legal/consumer-terms); see also Claude Code's [Authentication and credential use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use) |
193
+ | Third-party detection | Meridian reports Claude refusing Pi traffic as third-party ("Third-party apps now draw from your extra usage, not your plan limits") until Pi's prompt fingerprint is scrubbed ([Pi](https://github.com/rynfar/meridian/blob/main/docs/agents.md#pi)). Whether Hindsight's prompts trigger the same is **unverified**; watch Meridian's `/telemetry` |
194
+ | Plan limits | Retain runs on every ingest; indexing a large repo spends plan quota. `GET /v1/usage/quota` shows the windows |
195
+ | Concurrency | Meridian serializes requests that share a session identity and can return `400 This session advanced while the request was waiting` ([Concurrent requests](https://github.com/rynfar/meridian/blob/main/docs/configuration.md#concurrent-requests-to-the-same-session)). Keep `HINDSIGHT_API_LLM_MAX_CONCURRENT=1` (shipped default) |
196
+ | System prompt | Meridian can prepend Claude Code's own system prompt per adapter (SDK feature toggles at `/settings`). An [adapter instance](https://github.com/rynfar/meridian/blob/main/docs/agents.md#adapter-instances) matching `userAgentPrefix: "litellm/"` can turn it off; effect on Hindsight output is **unverified** |
197
+ | Exposure | `MERIDIAN_HOST=0.0.0.0` without `MERIDIAN_API_KEY` gives anyone on the network your subscription |
198
+ | Server tools | Anthropic server tools (`web_search_*`, `web_fetch_*`) return 400 through Meridian; Hindsight does not use them |
@@ -16,6 +16,7 @@ Edit the YAML (or a per-machine override) to change models.
16
16
  | --- | --- | --- |
17
17
  | `config/litellm.lemond.yaml` | lemond on the host | Reflect: Gemma 4 E4B GGUF (`unsloth/`); retain and consolidate: E2B |
18
18
  | `config/litellm.ollama.yaml` | Ollama on the host | Used when `MEMORY_BACKEND=ollama`; `gemma4:e4b` needs Ollama newer than 0.20.3 |
19
+ | `~/.config/hindsight/litellm.yaml` (written by `./setup`, backend `meridian`) | Meridian on the host (Claude subscription) | Retain and consolidate: `claude-haiku-5-5`; reflect: `claude-sonnet-5-5`. See [Meridian route](meridian-litellm.md#with-the-wizard) |
19
20
 
20
21
  **Why reflect uses a larger model:** E2B often returns no usable tool call on Hindsight reflect (`finish_reason=length`). The shipped lemond route uses E4B for `memory-reflect` only. Qwen3.5-4B works as an alternative if you change the route; pick any model that passes a direct tool-call check and a smoke reflect.
21
22
 
@@ -51,6 +52,16 @@ Thinking is off on all three aliases in the route YAML (`enable_thinking: false`
51
52
 
52
53
  Retain cap must exceed each retain strategy's chunk size (coding-agent strategies use 12000) or Hindsight returns `400 Invalid retain strategy`.
53
54
 
55
+ ## Retain extraction mode
56
+
57
+ OpenMem’s shipped `config/hindsight.env.example` sets:
58
+
59
+ ```env
60
+ HINDSIGHT_API_RETAIN_EXTRACTION_MODE=verbatim
61
+ ```
62
+
63
+ **verbatim** keeps each chunk’s text as the memory unit and still calls the retain LLM for entities, time, and location (cheaper than default `concise` fact rewriting). Alternatives: `concise` / `verbose` (LLM facts), `chunks` (no LLM on ingest; pass entities yourself if needed), or `HINDSIGHT_API_LLM_PROVIDER=none` (chunks-only; reflect disabled). Per-bank strategies can override this (the indexer already uses `chunks` for `project-index`).
64
+
54
65
  ## Secrets
55
66
 
56
67
  `~/.config/hindsight/litellm.env` (mode 600): `LITELLM_MASTER_KEY` (Hindsight uses this as `HINDSIGHT_API_LLM_API_KEY`), plus provider keys referenced as `os.environ/NAME` in the YAML.
@@ -66,6 +77,17 @@ Example hosted reflect model:
66
77
 
67
78
  Hindsight always sends the alias names above; you do not edit model ids in `hindsight.env` for route changes.
68
79
 
80
+ ## mem0 through the same LiteLLM
81
+
82
+ The `litellm` service carries its own compose profile `litellm` next to `hindsight` and `notebooklm`, so Hindsight's stack renders and starts as before. mem0's wizard can enable that profile: LiteLLM then runs without Hindsight, published on `127.0.0.1:${MEM0_LITELLM_PORT:-4000}` only, from `~/.config/personal-memory/mem0-litellm.yaml`, with the same `litellm.env` and master key.
83
+
84
+ | Alias | mem0 use |
85
+ | --- | --- |
86
+ | `memory-llm` | mem0's LLM (fact extraction and memory updates) |
87
+ | `memory-embed` | mem0's embedder, only for backends with an embedding model (Ollama `nomic-embed-text`, an OpenAI-compatible server) |
88
+
89
+ Claude (Anthropic API key or Meridian) has no embedding model; with those backends mem0 keeps its own embedder. The mem0 config keys and their sources are in [mem0 — Models through the stack LiteLLM](mem0.md#models-through-the-stack-litellm-optional).
90
+
69
91
  ## Verify and migrate
70
92
 
71
93
  Health check from the compose network:
@@ -5,7 +5,7 @@ checkout. The package name lives in one place, the `name` field of `package.json
5
5
  command stays `openmem` if you switch to a scoped name such as
6
6
  `openmem`; older installs may still see `openmem`).
7
7
 
8
- Requirements: Node ≥ 20.12 (the floor of `@clack/prompts`), Docker with the compose v2
8
+ Requirements: Node ≥ 24 (`node:sqlite` with FTS5, for the session context store), Docker with the compose v2
9
9
  plugin (`docker compose version`), `curl`. Linux and macOS are supported; there is no
10
10
  bash dependency in the CLI (macOS ships bash 3.2).
11
11
 
@@ -23,11 +23,12 @@ npx @bcmyguest/openmem switch mem0 --yes
23
23
  npm i -g openmem # then: openmem setup | up | down | ...
24
24
  # From a git checkout (package not required on the registry):
25
25
  git clone https://github.com/bcmyguest/openmem && cd openmem
26
- npm install && npx . setup # same wizard; also: npm run setup / ./setup
26
+ npm install && npm run setup # same wizard; also: ./setup
27
+ node cli/openmem.mjs doctor # any other command
27
28
  ```
28
29
 
29
30
  No global `pm` command is installed: it collides with Android's `pm`. `./pm` and `npm run pm`
30
- exist only inside a checkout; prefer `npx @bcmyguest/openmem …` (or `npx . …` in a checkout).
31
+ exist only inside a checkout; prefer `npx @bcmyguest/openmem …` (or `node cli/openmem.mjs …` in a checkout).
31
32
 
32
33
  ### Commands
33
34
 
@@ -38,7 +39,8 @@ exist only inside a checkout; prefer `npx @bcmyguest/openmem …` (or `npx . …
38
39
  | `up` / `down` | start / stop the stack with the saved configuration |
39
40
  | `doctor` | validate the configuration without the smoke test |
40
41
  | `install-mcp` | merge **openmem** unified MCP (`memory_*`) by default; NotebookLM when sync is on or `--notebooklm`; native mem0/Cognee with `--provider-only`; `--no-unified-mcp` to skip |
41
- | `install-coding-agent` | `install-mcp` + session hooks for all providers; optional `--hindsight-plugin` runs `@vectorize-io/hindsight-coding-agents` on Hindsight stacks |
42
+ | `install-coding-agent` | `install-mcp` + session hooks for all providers; `--provider-plugin` runs `@vectorize-io/hindsight-coding-agents` instead of OpenMem hooks on Hindsight stacks (saved as `[agents] integration`; `--no-provider-plugin` reverts) |
43
+ | `context <on\|off\|status>` | context management (smart compaction) per agent: saves `[context_proxy.agents]` (`--agents claude-code,opencode1,codex,opencode2`, default all), re-runs `install-coding-agent`, which starts or stops the `context-proxy` service (`--dry-run`); `status` lists each agent, proxy health and pointed agents ([Context management](context-management.md)) |
42
44
  | `wiring` | report `MEMORY_PROVIDER`, API URLs, and `mcp.json` alignment (`--json`) |
43
45
  | `switch <provider>` | change `MEMORY_PROVIDER` (optional stack restart + MCP; no data migration) |
44
46
  | `providers [--json]` | list the provider manifests shipped in the package with their status |
@@ -162,7 +162,7 @@ Interactive `./setup` uses this file for **defaults** (Clack pre-selects); your
162
162
  Flags: `--yes`, `--dry-run`, `--no-stack`, `--no-mcp`. Does not migrate data between
163
163
  backends. See [README — Switch memory provider](../README.md#switch-memory-provider).
164
164
  - `feed-sync` — runs `cli/feed-sync.mjs` (RSS + OpenAlex → `feeds.out_dir` in `index.yml`).
165
- - `install-coding-agent` — unified MCP + session hooks (all providers); optional `--hindsight-plugin`; see
165
+ - `install-coding-agent` — unified MCP + session hooks (all providers); `--provider-plugin` / `--no-provider-plugin` set `[agents] integration`; see
166
166
  [coding-agent hooks](coding-agent-hooks.md).
167
167
 
168
168
  ## MCP (unified `memory_*` tools)
@@ -179,7 +179,7 @@ After changing MCP code, re-run `npx @bcmyguest/openmem install-coding-agent --y
179
179
  cp config/openmem.toml.example ~/.config/personal-memory/config.toml
180
180
  # edit provider, ports, model backend
181
181
  npx @bcmyguest/openmem configure --yes
182
- # checkout before publish: npx . configure --yes
182
+ # from a checkout: node cli/openmem.mjs configure --yes
183
183
  ```
184
184
 
185
185
  After a successful configure, the wizard **writes back** `~/.config/personal-memory/config.toml` so
@@ -7,8 +7,8 @@ Get from zero to a running stack in one wizard run. **Choose your memory provide
7
7
  | Requirement | Why |
8
8
  | --- | --- |
9
9
  | Docker + Compose v2 | Runs the stack; your user must run `docker` without sudo |
10
- | Node.js ≥ 20.12 | CLI and setup wizard |
11
- | LLM for Hindsight (default provider) | lemond, Ollama, or OpenAI-compatible — wizard wires LiteLLM |
10
+ | Node.js ≥ 24 | CLI, setup wizard, and the session context store (`node:sqlite` with FTS5) |
11
+ | LLM for Hindsight (default provider) | lemond, Ollama, OpenAI-compatible, or a Claude subscription through [Meridian](meridian-litellm.md) — wizard wires LiteLLM |
12
12
  | git, curl | Wizard preflight |
13
13
 
14
14
  Default stack is [Hindsight](hindsight.md). Other providers: wizard or `npx @bcmyguest/openmem providers` ([provider status](provider-status.md)).
@@ -27,9 +27,11 @@ npx @bcmyguest/openmem
27
27
  git clone https://github.com/bcmyguest/openmem.git
28
28
  cd openmem
29
29
  npm install
30
- npx . setup
30
+ npm run setup
31
31
  ```
32
32
 
33
+ Run other commands from the checkout with `node cli/openmem.mjs <command>`.
34
+
33
35
  The wizard asks for a memory provider, provider settings, what to index, then starts Docker and runs a smoke test.
34
36
 
35
37
  Useful variants:
@@ -41,7 +43,9 @@ npx @bcmyguest/openmem configure --yes # defaults + start, no prompts
41
43
 
42
44
  Wizard dry-run (what first setup plans — no writes):
43
45
 
44
- ![Setup dry-run: npx @bcmyguest/openmem setup --dry-run](https://bcmyguest.github.io/openmem/setup-demo.gif)
46
+ <p align="center">
47
+ <img src="https://bcmyguest.github.io/openmem/setup-demo.gif" alt="Terminal recording of the setup wizard dry run: preflight checks, memory provider, model backend, secrets, sources and stack steps, each planned write printed as a [dry-run] line" width="720" />
48
+ </p>
45
49
 
46
50
  ## 2. Confirm it is up
47
51
 
@@ -52,7 +56,7 @@ curl -fsS http://127.0.0.1:8888/health # Hindsight default; see wizard output
52
56
 
53
57
  ## 3. Wire your coding agent (optional)
54
58
 
55
- **Session memory:** `npx @bcmyguest/openmem install-coding-agent --yes` — unified MCP **plus** session hooks for Claude Code, Codex, OpenCode, Cursor CLI (any active provider). Optional `--hindsight-plugin` adds the upstream Hindsight plugin. Not the same as `install-mcp` alone.
59
+ **Session memory** (after step 1 — MCP and hooks need the running stack): `npx @bcmyguest/openmem install-coding-agent --yes` — unified MCP **plus** session hooks for Claude Code, Codex, OpenCode, Cursor CLI (any active provider). On Hindsight, `--provider-plugin` uses the upstream Hindsight plugin hooks instead (one hook set at a time). Not the same as `install-mcp` alone.
56
60
 
57
61
  **`install-mcp`** merges the **`openmem` unified MCP** (`memory_add`, `memory_search`, `memory_recall`, `memory_reflect`, `memory_consolidate`, `memory_forget` on whichever provider you picked) and, when NotebookLM sync is on, the **NotebookLM MCP**:
58
62
 
@@ -61,7 +65,7 @@ npx @bcmyguest/openmem install-mcp --yes
61
65
  npx @bcmyguest/openmem install-mcp --yes --notebooklm # force NotebookLM entry
62
66
  ```
63
67
 
64
- Session hooks use the in-repo shim by default; add `--hindsight-plugin` if you also want the upstream Hindsight plugin. Optional native mem0/Cognee MCP: `install-mcp --provider-only`. Full guide: [MCP setup](mcp-setup.md).
68
+ Session hooks use the in-repo shim by default (`[agents] integration = "openmem"`); `--provider-plugin` replaces them with the upstream Hindsight plugin and `--no-provider-plugin` switches back. Optional native mem0/Cognee MCP: `install-mcp --provider-only`. Full guide: [MCP setup](mcp-setup.md).
65
69
 
66
70
  Restart Cursor Agent after MCP changes. Move memories between providers with [Portable memory (PMM)](memory-portability.md) — `switch` alone does not migrate data.
67
71
 
@@ -79,6 +83,7 @@ npx @bcmyguest/openmem doctor
79
83
  | `up` / `down` | Start or stop the stack (down keeps data volumes) |
80
84
  | `switch <id> --yes` | Change provider (no memory migration) |
81
85
  | `doctor` | Validate config without the smoke test |
86
+ | `schedule install` | Refresh configured RSS/OpenAlex feeds hourly with the OS scheduler |
82
87
 
83
88
  In a checkout, use `npx .` instead of `npx @bcmyguest/openmem`.
84
89
 
@@ -97,5 +102,6 @@ Secrets and index config: `~/.config/hindsight/` (and optional `~/.config/person
97
102
  - [Portable memory (PMM)](memory-portability.md) — export/import
98
103
  - [Architecture](architecture.md) — data flow, indexing, MCP by provider
99
104
  - [Index sources](index-sources.md) — git, Obsidian, notes/papers/bookmarks, feed cache
105
+ - [Feed sync](sources-feeds.md) — configure RSS/OpenAlex and schedule refreshes
100
106
  - [Install with npx](npx-install.md) — upgrades, troubleshooting
101
107
  - [Configuration file](openmem-config.md) — declarative `config.toml`
@@ -5,7 +5,7 @@ The wizard is a Node program (`wizard/bin/setup.mjs`). It is exposed as:
5
5
  | How you run it | When |
6
6
  | --- | --- |
7
7
  | `npx @bcmyguest/openmem` / `npx @bcmyguest/openmem setup` | Normal install ([Install with npx](npx-install.md)) |
8
- | `npx . setup` / `npm run setup` / `./setup` | Git checkout (stack root stays in the repo) |
8
+ | `npm run setup` / `./setup` | Git checkout (stack root stays in the repo); other commands: `node cli/openmem.mjs <command>` |
9
9
 
10
10
  Interactive runs use [@clack/prompts](https://github.com/bombshell-dev/clack). `--yes` and `--dry-run` skip Clack.
11
11
 
@@ -40,8 +40,9 @@ Configure runs these steps in order (provider hooks replace or extend some steps
40
40
  | 5 | Sources to index | Writes `~/.config/hindsight/index.yml`; lists sources with a dry indexer run |
41
41
  | 6 | NotebookLM sync | Opt-in; Google login when enabled |
42
42
  | 7 | Start the stack | Build indexer image if inputs changed; health wait; smoke retain/recall (unless `--no-smoke`) |
43
- | 8 | Coding-agent plugin | Optional `npx` install for detected CLIs; provider-specific MCP hints |
44
- | 9 | Validate memory setup | Provider checks + shared validation |
43
+ | 8 | Context management (smart compaction) | Multi-select of the installed agents (Claude Code, OpenCode 1, OpenCode 2). Defaults: saved `[context_proxy.agents]` keys, else `[context_proxy] enabled`, else OpenCode 2 on and the proxy-routed agents off. Saves all four keys to `config.toml`. Claude Code or OpenCode 1 on: writes the proxy key file and store directories, then starts the `context-proxy` compose service. Neither on: stops a running `context-proxy` after step 9, unless an agent still points at it ([Context management](context-management.md)) |
44
+ | 9 | Coding agents (optional) | For detected CLIs (claude, codex, opencode, cursor-agent), offers `install-coding-agent --yes`: unified MCP, OpenMem skill, session hooks; honours `[agents] integration` (OpenMem hooks or the provider plugin) and `[context_proxy.agents]`. Default answer is no |
45
+ | 10 | Validate memory setup | Provider checks + shared validation |
45
46
 
46
47
  The last line is `wizard: changed=N` (files and containers this run touched). An unchanged re-run prints `changed=0`.
47
48
 
@@ -49,7 +50,7 @@ The last line is `wizard: changed=N` (files and containers this run touched). An
49
50
 
50
51
  | Provider | Step 3 asks for |
51
52
  | --- | --- |
52
- | Hindsight | Model backend: lemond, Ollama (host or compose profile), or custom OpenAI-compatible URL; LiteLLM routes for `memory-retain`, `memory-reflect`, `memory-consolidate` |
53
+ | Hindsight | Model backend: lemond, Ollama (host or compose profile), custom OpenAI-compatible URL, or a Claude subscription through a running Meridian ([guide](meridian-litellm.md#with-the-wizard)); LiteLLM routes for `memory-retain`, `memory-reflect`, `memory-consolidate` |
53
54
  | mem0 | Self-hosted REST base URL and API key file path |
54
55
  | Cognee | Loopback port and `LLM_API_KEY` for graph build |
55
56
 
@@ -22,31 +22,18 @@ Then ensure the stack indexer is running. Each run writes markdown files under `
22
22
 
23
23
  Network use: feed-sync calls public RSS/OpenAlex URLs from the host (not from CI by default).
24
24
 
25
- ## Cron / timer (optional)
25
+ `feed-sync` needs Python 3 with PyYAML on the host. On Windows it uses `py -3`, then `python`; on macOS and Linux it uses `python3`, then `python`. Set `PYTHON` to choose a specific executable.
26
26
 
27
- Run sync on a schedule so feeds stay fresh without manual commands:
27
+ ## Schedule feed sync (optional)
28
28
 
29
- ```ini
30
- # ~/.config/systemd/user/openmem-feed-sync.timer
31
- [Unit]
32
- Description=Refresh openmem feed cache
29
+ Install an hourly job with the current user's native scheduler. The GitHub npx source works before the next npm release includes `schedule`:
33
30
 
34
- [Timer]
35
- OnCalendar=hourly
36
- Persistent=true
37
-
38
- [Install]
39
- WantedBy=timers.target
31
+ ```sh
32
+ npx --yes github:bcmyguest/openmem schedule install --dry-run
33
+ npx --yes github:bcmyguest/openmem schedule install
34
+ npx --yes github:bcmyguest/openmem schedule remove
40
35
  ```
41
36
 
42
- ```ini
43
- # ~/.config/systemd/user/openmem-feed-sync.service
44
- [Unit]
45
- Description=openmem feed-sync
46
-
47
- [Service]
48
- Type=oneshot
49
- ExecStart=/usr/bin/env npx @bcmyguest/openmem feed-sync
50
- ```
37
+ After that release, `npx @bcmyguest/openmem schedule ...` runs the same command from npm.
51
38
 
52
- Enable with `systemctl --user enable --now openmem-feed-sync.timer`.
39
+ OpenMem installs a systemd user timer on Linux, a launchd agent on macOS, or a Task Scheduler task on Windows. The job calls the published npm package through a stable runner in your user config directory. Installation records the Python interpreter with PyYAML, so the job does not depend on your interactive shell's PATH. It runs when your user scheduler is active; the Linux timer catches up after downtime. Re-run `schedule install` if you move or upgrade Node.js or Python.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bcmyguest/openmem",
3
- "version": "0.6.3",
4
- "description": "OpenMem \u2014 memory interface for coding agents: pluggable providers (Hindsight, mem0, Cognee, \u2026), shared wizard/indexer, multi-format import/export (PMM and more).",
3
+ "version": "0.8.0",
4
+ "description": "OpenMem — memory interface for coding agents: pluggable providers (Hindsight, mem0, Cognee, …), shared wizard/indexer, multi-format import/export (PMM and more).",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
7
7
  "author": "B Guest",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "files": [
42
42
  "cli/",
43
- "skills/",
43
+ ".agents/skills/openmem/",
44
44
  "wizard/bin/",
45
45
  "wizard/lib/",
46
46
  "providers/",
@@ -49,6 +49,7 @@
49
49
  "indexer/",
50
50
  "bin/",
51
51
  "sync/",
52
+ "proxy/",
52
53
  "config/*.example",
53
54
  "config/index.yml",
54
55
  "config/notebooklm.yml",
@@ -71,7 +72,7 @@
71
72
  "!**/.pytest_cache"
72
73
  ],
73
74
  "engines": {
74
- "node": ">=20.12.0"
75
+ "node": ">=24.0.0"
75
76
  },
76
77
  "publishConfig": {
77
78
  "access": "public"
@@ -43,7 +43,7 @@ When `MEMORY_PROVIDER=cognee`:
43
43
 
44
44
  ```sh
45
45
  npx openmem install-mcp --yes --provider-only
46
- # checkout: npx . install-mcp --yes --provider-only
46
+ # checkout: node cli/openmem.mjs install-mcp --yes --provider-only
47
47
  # or during setup: coding-agent step registers the same entry
48
48
  ```
49
49
 
@@ -74,7 +74,7 @@ v1 MCP is read-only (no add/cognify). Ingest stays with the indexer or curl.
74
74
  ```sh
75
75
  npx openmem switch cognee --yes
76
76
  # later: npx openmem switch hindsight --yes
77
- # checkout: npx . switch cognee --yes
77
+ # checkout: node cli/openmem.mjs switch cognee --yes
78
78
  ```
79
79
 
80
80
  Updates `wizard.conf` (and `config.toml` `[memory].provider` when present), restarts the stack