fix(memory): make qmd gateway startup lazy

This commit is contained in:
Peter Steinberger
2026-04-29 08:45:03 +01:00
parent e52b660749
commit 2b811fe6d9
19 changed files with 294 additions and 41 deletions

View File

@@ -1,4 +1,4 @@
6a67688ac174403c996027d90fa16eabb9aeff6a8af890b17d4628910c3b440f config-baseline.json
8bc9fda7c1096472beaa416a61043ce51d691d4dcad9ed3e0be46e68bb70b0ce config-baseline.core.json
96edba9fd67fa057f6b6c43d54a168db25d0e27ddd4e91a7e2918c8657f0f212 config-baseline.json
510ed7af2e3731c8a307dbc10181328f82764a4e8dd9e9dddc6118db6f882ff7 config-baseline.core.json
9f5fad66a49fa618d64a963470aa69fed9fe4b4639cc4321f9ec04bfb2f8aa50 config-baseline.channel.json
0dd6583fafae6c9134e46c4cf9bddee9822d6436436dcb1a6dcba6d012962e51 config-baseline.plugin.json

View File

@@ -51,17 +51,21 @@ present.
## How the sidecar works
- OpenClaw creates collections from your workspace memory files and any
configured `memory.qmd.paths`, then runs `qmd update` on boot and
periodically (default every 5 minutes). These refreshes run through QMD
subprocesses, not an in-process filesystem crawl. Semantic modes also run
`qmd embed`.
configured `memory.qmd.paths`, then runs `qmd update` when the QMD manager is
opened and periodically afterward (default every 5 minutes). These refreshes
run through QMD subprocesses, not an in-process filesystem crawl. Semantic
modes also run `qmd embed`.
- The default workspace collection tracks `MEMORY.md` plus the `memory/`
tree. Lowercase `memory.md` is not indexed as a root memory file.
- QMD's own scanner ignores hidden paths and common dependency/build
directories such as `.git`, `.cache`, `node_modules`, `vendor`, `dist`, and
`build`. Boot refreshes use a one-shot QMD subprocess path instead of
creating the full long-lived in-process watcher during gateway startup.
- Boot refresh runs in the background so chat startup is not blocked.
`build`. Gateway startup does not initialize QMD by default, so cold boot
avoids importing the memory runtime or creating the long-lived watcher before
memory is first used.
- If you want a gateway-start refresh anyway, set
`memory.qmd.update.startup` to `idle` or `immediate`. The opt-in startup
refresh uses a one-shot QMD subprocess path instead of creating the full
long-lived in-process watcher.
- Searches use the configured `searchMode` (default: `search`; also supports
`vsearch` and `query`). `search` is BM25-only, so OpenClaw skips semantic
vector readiness probes and embedding maintenance in that mode. If a mode

View File

@@ -497,8 +497,10 @@ QMD model overrides stay on the QMD side, not OpenClaw config. If you need to ov
| ------------------------- | --------- | ------- | ------------------------------------- |
| `update.interval` | `string` | `5m` | Refresh interval |
| `update.debounceMs` | `number` | `15000` | Debounce file changes |
| `update.onBoot` | `boolean` | `true` | Refresh on startup in a QMD subprocess |
| `update.waitForBootSync` | `boolean` | `false` | Block startup until refresh completes |
| `update.onBoot` | `boolean` | `true` | Refresh when the long-lived QMD manager opens; also gates opt-in startup refresh |
| `update.startup` | `string` | `off` | Optional gateway-start refresh: `off`, `idle`, or `immediate` |
| `update.startupDelayMs` | `number` | `120000` | Delay before `startup: "idle"` refresh runs |
| `update.waitForBootSync` | `boolean` | `false` | Block manager opening until its initial refresh completes |
| `update.embedInterval` | `string` | -- | Separate embed cadence |
| `update.commandTimeoutMs` | `number` | -- | Timeout for QMD commands |
| `update.updateTimeoutMs` | `number` | -- | Timeout for QMD update operations |