Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
5dfe853
fix: guard against data loss in repair, migrate, and CLI rebuild
shaun0927 Apr 16, 2026
5bf8260
fix: sanitize topic parameter in tool_diary_write
shaun0927 Apr 16, 2026
fb1cf53
fix: harden repair backup scope and migrate swap rollback
shaun0927 Apr 16, 2026
c942f58
chore(deps): bump actions/deploy-pages from 4 to 5
dependabot[bot] Apr 17, 2026
04d80eb
chore(deps): bump actions/upload-pages-artifact from 3 to 5
dependabot[bot] Apr 17, 2026
0e632df
chore(deps): bump actions/checkout from 4 to 6
dependabot[bot] Apr 17, 2026
b595cb3
docs: fix HOOKS_TUTORIAL.md paths, matcher, and missing timeout
Apr 22, 2026
659cb81
fix(migrate): harden swap rollback against partial cross-device copy
shaun0927 Apr 24, 2026
e2444a1
ci: add pip caching and bump Python on macOS/Windows
mvalentsev Apr 16, 2026
b291d2a
ci: re-run to verify pip cache restore
mvalentsev Apr 20, 2026
5fd09d3
fix(security): restrict tunnels.json file permissions
arnoldwender Apr 24, 2026
a4868a3
perf(mining): batch per-chunk upserts and add optional GPU acceleration
igorls Apr 24, 2026
fbd0904
test: cover embedding device fallback and bounded upserts
Copilot Apr 24, 2026
25c885a
test: use tmp_path for embedding device config tests
Copilot Apr 24, 2026
9fbdba1
test: isolate embedding device env override tests
Copilot Apr 24, 2026
3d529e7
test: tidy embedding follow-up imports
Copilot Apr 24, 2026
0315124
test: isolate embedding module state with monkeypatch
Copilot Apr 24, 2026
ed2ba72
Merge pull request #1185 from MemPalace/perf/batched-upsert-gpu
igorls Apr 24, 2026
fe051ad
feat(graph): cross-wing tunnels by shared topics (#1180)
igorls Apr 24, 2026
865a36b
feat(graph): namespace topic-tunnel rooms with "topic:" prefix + kind…
igorls Apr 25, 2026
0197b2e
chore: add OpenArena owner claim verification file
igorls Apr 25, 2026
8d49b00
Merge pull request #1184 from MemPalace/feat/cross-wing-topic-tunnels
igorls Apr 25, 2026
b9e4128
Merge pull request #1189 from MemPalace/openarena-claim
igorls Apr 25, 2026
133dfbf
fix(search): BM25 hybrid rerank, legacy-metric warning, invariant tests
igorls Apr 24, 2026
ec5f4eb
fix(test): use tmp_path for full-stack invariant test (Windows CI)
igorls Apr 24, 2026
91c1d15
Merge pull request #1179 from MemPalace/fix/search-metric-quality
igorls Apr 25, 2026
f13b9a4
feat(cli): init prompts to mine, mine handles Ctrl-C gracefully
igorls Apr 24, 2026
23d534f
fix(init): split --auto-mine from --yes; show file-count estimate bef…
igorls Apr 24, 2026
8faf004
fix(cli,mine): shell-quote project_dir in resume hints
igorls Apr 25, 2026
c4eeec8
test: use shlex.quote in resume-hint assertions for Windows
igorls Apr 25, 2026
374fb56
Merge pull request #1183 from MemPalace/feat/init-mine-ux
igorls Apr 25, 2026
9b7536a
Merge pull request #1101 from wahajahmed010/fix/hooks-tutorial-1037
igorls Apr 25, 2026
000acc1
Merge pull request #967 from MemPalace/dependabot/github_actions/acti…
igorls Apr 25, 2026
036742e
Merge pull request #968 from MemPalace/dependabot/github_actions/acti…
igorls Apr 25, 2026
5ed24ad
Merge pull request #969 from MemPalace/dependabot/github_actions/acti…
igorls Apr 25, 2026
320aab3
Merge pull request #939 from mvalentsev/ci/pip-cache-and-python-bump
igorls Apr 25, 2026
91a6026
Merge pull request #1168 from arnoldwender/fix/security-tunnels-permi…
igorls Apr 25, 2026
7e18a70
fix: resolve hooks_cli.py merge conflict + add mine_global_lock tests
felipetruman Apr 17, 2026
99b820c
fix: address PR review — per-palace lock, MCP server path, hook timeo…
felipetruman Apr 17, 2026
1998aed
fix: Windows CI compat for palace lock tests and path normalization
felipetruman Apr 17, 2026
40d7958
test: remove attempt-cap tests obsoleted by develop's pass-through ap…
felipetruman Apr 17, 2026
8df944a
fix: best-effort HNSW thread-pin retrofit + drop dead attempt-cap con…
felipetruman Apr 17, 2026
7773432
chore(rebase): reconcile with develop and apply ruff format
igorls Apr 25, 2026
0d9929c
Merge pull request #976 from felipetruman/fix/hnsw-race-and-fanout
igorls Apr 25, 2026
ee12c07
fix(searcher): tolerate None documents in BM25 reranker
jphein Apr 25, 2026
6724833
chore: ruff format tests/test_searcher.py
jphein Apr 25, 2026
bc24aa1
fix: skip _fix_blob_seq_ids sqlite open on already-migrated palaces (…
jphein Apr 24, 2026
5b07b86
fix(palace_graph): skip None metadata in build_graph
jphein Apr 25, 2026
57854c7
ci: bump Windows and macOS jobs to Python 3.13
igorls Apr 25, 2026
34bc08f
Merge pull request #1205 from MemPalace/ci/python-313-windows-macos
igorls Apr 25, 2026
5e57404
Merge pull request #935 from shaun0927/fix/repair-crash-safety
igorls Apr 25, 2026
452630e
fix(repair): refuse to overwrite when extraction looks truncated (#1208)
bensig Apr 26, 2026
6890948
Merge pull request #1210 from MemPalace/fix/repair-extraction-cap-det…
igorls Apr 26, 2026
db80f6e
fix: call quarantine_stale_hnsw() in make_client(); lower threshold t…
jphein Apr 24, 2026
e5e7a57
fix(hnsw): gate quarantine_stale_hnsw to cold-start, not every reconnect
jphein Apr 26, 2026
74ff5e6
fix(hnsw): integrity gate in quarantine_stale_hnsw — corruption vs fl…
jphein Apr 26, 2026
5de5b09
Merge pull request #936 from shaun0927/fix/diary-topic-sanitize
igorls Apr 26, 2026
b99e545
feat(init): context-aware corpus detection
milla-jovovich Apr 26, 2026
9d18a1c
Merge pull request #1211 from MemPalace/feat/corpus-origin
igorls Apr 26, 2026
942aae3
fix(hnsw): address @igorls's #1173 review
jphein Apr 26, 2026
2477442
fix(blob-seq-marker): tests + style nit per @igorls #1177 review
jphein Apr 26, 2026
7294b69
feat(corpus-origin): merge LLM fields into heuristic result instead o…
milla-jovovich Apr 26, 2026
43aa1aa
style: ruff format under CI-pinned 0.4.x
igorls Apr 26, 2026
4aa93e8
Merge pull request #1173 from jphein/fix/quarantine-on-make-client
igorls Apr 26, 2026
8a1fd95
style: drop unused pathlib.Path imports in marker tests
igorls Apr 26, 2026
0908786
Merge pull request #1221 from MemPalace/feat/corpus-origin-merge-tier…
igorls Apr 26, 2026
025dd03
Merge pull request #1177 from jphein/fix/blob-seq-marker-guard
igorls Apr 26, 2026
30fc0ab
Merge pull request #1201 from jphein/fix/palace-graph-none-metadata
igorls Apr 26, 2026
414aa3e
Merge pull request #1198 from jphein/fix/tokenize-none-guard
igorls Apr 26, 2026
4400734
feat(privacy): warn when LLM tier sends content to external API
milla-jovovich Apr 26, 2026
4d33f14
Merge pull request #1224 from MemPalace/feat/privacy-warn-external-llm
igorls Apr 26, 2026
c92256f
chore(corpus-origin): tag merged evidence by tier + pin confidence-so…
igorls Apr 26, 2026
5e33592
chore(corpus-origin): address Copilot review on #1223
igorls Apr 26, 2026
a0b7ba0
feat(privacy): treat Tailscale CGNAT range (100.64.0.0/10) as local
milla-jovovich Apr 26, 2026
22f3d9b
Merge pull request #1223 from MemPalace/chore/corpus-origin-merge-fol…
igorls Apr 26, 2026
899a5ec
Merge pull request #1225 from MemPalace/feat/privacy-warn-tailscale-c…
igorls Apr 26, 2026
0d349c3
fix(repair): detect HNSW capacity divergence and fall back to BM25 (#…
igorls Apr 26, 2026
57ac669
fix(repair): address Copilot review on #1227
igorls Apr 27, 2026
9dbb4ce
Merge pull request #1227 from MemPalace/fix/hnsw-capacity-divergence-…
igorls Apr 27, 2026
1e3e89a
fix(hooks): pass --mode convos when mining a Claude Code transcript dir
igorls Apr 27, 2026
6a8beef
fix(hooks): harden _get_mine_dir path validation
Copilot Apr 27, 2026
eb4de04
fix(hooks): always mine the active transcript as convos, additive to …
igorls Apr 27, 2026
8bb1772
Merge pull request #1230 from MemPalace/fix/hooks-convos-mode-1232
igorls Apr 27, 2026
fe56797
fix(hooks): consolidate transcript ingest, harden shell parsers (#123…
igorls Apr 27, 2026
3deebfe
test(hooks): skip bash subprocess validator test on Windows
igorls Apr 27, 2026
bc5d3fa
Merge pull request #1231 from MemPalace/fix/hooks-convos-additive-mining
igorls Apr 27, 2026
88a53b2
fix: prevent HNSW index bloat via batch_size + sync_threshold metadata
funguf Apr 25, 2026
f5c8b09
fix: narrow _fix_blob_seq_ids shim + add repair --mode max-seq-id
sha2fiddy Apr 23, 2026
04c48dd
fix(chroma): write blob-fix marker even when narrowing skips all rows
igorls Apr 27, 2026
3474641
fix(tunnels): normalize wing names in topic tunnel lookup for hyphena…
Apr 25, 2026
b7f0a8a
fix(graph): normalize wing slug at init so topic tunnels fire for hyp…
bensig Apr 25, 2026
3bebef1
fix(miner,convo_miner): close remaining wing-name normalization gaps …
igorls Apr 27, 2026
cfca40c
test(cli): mock _run_pass_zero so wing-name test survives corpus-origin
igorls Apr 27, 2026
342270d
fix(palace_graph): defer annotation eval for Python 3.9 compat
igorls Apr 27, 2026
f80c9ff
Merge pull request #1195 from MemPalace/fix/wing-name-normalization-t…
igorls Apr 27, 2026
c3ec708
Merge pull request #1197 from wahajahmed010/fix/1194-hyphenated-wing-…
igorls Apr 27, 2026
003e569
Merge pull request #1135 from sha2fiddy/feature/max-seq-id-shim-fix
igorls Apr 27, 2026
de7801e
Merge pull request #1191 from funguf/fix/hnsw-index-bloat-rebased
igorls Apr 27, 2026
72cbfb5
feat(privacy): blocking consent gate for env-fallback LLM API keys
milla-jovovich Apr 27, 2026
4ffd0bd
Merge pull request #1233 from MemPalace/feat/privacy-consent-prompt
igorls Apr 27, 2026
d12c96e
fix: filtered search fallback and diary_write content alias
lucian-the-traveler Apr 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ jobs:
- uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- run: pip install -e ".[dev]"
- run: python -m pytest tests/ -v --ignore=tests/benchmarks --cov=mempalace --cov-report=term-missing --cov-fail-under=80 --durations=10

Expand All @@ -26,7 +27,8 @@ jobs:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: "3.9"
python-version: "3.13"
cache: 'pip'
- run: pip install -e ".[dev]"
- run: python -m pytest tests/ -v --ignore=tests/benchmarks --cov=mempalace --cov-report=term-missing --cov-fail-under=80 --durations=10

Expand All @@ -36,7 +38,8 @@ jobs:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: "3.9"
python-version: "3.13"
cache: 'pip'
- run: pip install -e ".[dev]"
- run: python -m pytest tests/ -v --ignore=tests/benchmarks --cov=mempalace --cov-report=term-missing --cov-fail-under=80 --durations=10
lint:
Expand All @@ -46,6 +49,7 @@ jobs:
- uses: actions/setup-python@v6
with:
python-version: "3.11"
cache: 'pip'
- run: pip install "ruff>=0.4.0,<0.5"
- run: ruff check .
- run: ruff format --check .
6 changes: 3 additions & 3 deletions .github/workflows/deploy-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
fetch-depth: 0

Expand All @@ -46,7 +46,7 @@ jobs:
DOCS_EDIT_BRANCH: ${{ github.ref_name }}
run: bun run docs:build

- uses: actions/upload-pages-artifact@v3
- uses: actions/upload-pages-artifact@v5
with:
path: website/.vitepress/dist

Expand All @@ -63,4 +63,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@v5
2 changes: 1 addition & 1 deletion .github/workflows/version-guard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
check-versions:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Extract versions from all sources
id: versions
Expand Down
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,27 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),

---

## [3.3.4] — unreleased

### Added

- **`mempalace init` now prompts to mine the same directory.** After entity confirmation, room detection, and gitignore guard, `init` shows a one-line scope estimate (e.g. `~423 files (~12 MB) would be mined into this palace.`) computed from its existing corpus walk, then asks `Mine this directory now? [Y/n]` (default yes) and runs `mine()` in-process if accepted. The estimate fires before the prompt so users on a real corpus aren't surprised by a minutes-long ChromaDB write. Declining prints the exact `mempalace mine <dir>` command for later. (#1181)
- **New `--auto-mine` flag on `mempalace init`** for the non-interactive path (`mempalace init --auto-mine <dir>` skips the mine prompt and runs mine directly). `--yes` retains its existing scope of entity auto-accept only and still prompts for the mine step, so existing scripted callers see no behaviour change; combining `--yes --auto-mine` gives a fully non-interactive setup. (#1181)
- **Cross-wing topic tunnels.** When two wings have confirmed `TOPIC` labels in common (the LLM-refine bucket from `mempalace init --llm`), the miner now drops a symmetric tunnel between them at mine time so the palace graph reflects shared themes (frameworks, vendors, recurring concepts). Tunnels are routed through the existing `create_tunnel` storage so they share dedup and persistence with explicit tunnels. Topic tunnels are stored under a synthetic `topic:<name>` room and tagged with `kind: "topic"` on the stored dict — this keeps them distinct from literal folder-derived rooms of the same name (a wing with both an `Angular` folder room and an `Angular` topic tunnel no longer collides at `follow_tunnels` read time) and gives LLMs scanning `list_tunnels` a visible discriminator. Threshold is configurable via `MEMPALACE_TOPIC_TUNNEL_MIN_COUNT` env var or `topic_tunnel_min_count` in `~/.mempalace/config.json` (default `1`). Manifest-dependency overlap and per-topic allow/deny lists remain out of scope. (#1180)
- **Context-aware corpus detection at `mempalace init`.** A new Pass 0 runs at the start of `init` — before entity detection — and answers one question: *is this corpus an AI-dialogue record, and if so, which platform and what persona names has the user assigned to the agents?* Tier 1 is a free regex heuristic (well-known AI brand terms + turn-marker patterns, with a co-occurrence rule that suppresses ambiguous terms like `Claude`/`Gemini`/`Haiku` when no unambiguous AI signal is present, so French novels and astrology forums don't false-positive). Tier 2 is an LLM call (~$0.01 with Anthropic Haiku, free with local Ollama/LM Studio/llama.cpp/vLLM) that extracts `user_name` and `agent_persona_names` from dialogue structure. Result is persisted to `<palace>/.mempalace/origin.json` with a `schema_version: 1` envelope so downstream tools can read it. Entity classification then routes names matching `agent_persona_names` (case-insensitive) into a new `agent_personas` bucket instead of `people`, so a Claude Code transcript no longer misclassifies the user's `Echo`/`Sparrow`/`Cipher` agents as biological people. `llm_refine` receives the same context as a system-prompt preamble so it can disambiguate other ambiguous candidates with corpus-level knowledge too. Backwards compatible: callers that don't pass `corpus_origin` see the v3.3.3 return shape unchanged. (#TBD)
- **`mempalace init` runs LLM-assisted refinement by default.** v3.3.3 made `--llm` opt-in; the LLM-assisted path is qualitatively better (extracts persona names, refines ambiguous classifications) so it now runs by default. Provider precedence is unchanged — Ollama at `http://localhost:11434` first, then openai-compat, then anthropic with API key. **Never blocks init on a missing LLM**: if no provider is reachable (Ollama not running, no API key set), init prints a one-line message pointing at `--no-llm` and falls through to the heuristic-only path. `--no-llm` is the new explicit opt-out. The legacy `--llm` flag is preserved as a deprecated alias of the default so scripted callers see no behaviour change. Cost story: zero for users with a local LLM (the majority on this repo), ~$0.01 per init for users with `ANTHROPIC_API_KEY` set who explicitly choose `--llm-provider anthropic`, zero for users with no LLM (graceful fallback). (#TBD)
- **`mempalace mine --redetect-origin` flag.** Re-runs corpus-origin detection on the current corpus state and overwrites `<palace>/.mempalace/origin.json`. Useful when the corpus has grown since `mempalace init` and the stored origin may be stale. Heuristic-only by design (the flag is meant to be cheap); re-run `mempalace init` for full Tier 2 LLM refinement. Default `mempalace mine` does not touch `origin.json` — the flag is opt-in. (#TBD)

### Bug Fixes

- **Cross-wing topic tunnels for hyphenated dir names.** `mempalace init` recorded the `topics_by_wing` registry key under the raw directory name (e.g. `mempalace-public`), while `mempalace.yaml`'s `wing` field used the lower-cased + separator-collapsed slug (`mempalace_public`). At mine time the miner read the slug from the yaml and missed the registry, so `_compute_topic_tunnels_for_wing` returned `0` silently. Real-world: any project whose folder contained a hyphen or space lost every topic tunnel. Now both call sites route through a shared `normalize_wing_name()` in `config.py`. (#1194, follow-up to #1180)
- **CLI `mempalace search` retrieval quality.** The CLI was using pure ChromaDB cosine distance with no BM25 rerank, so drawers containing every query term but embedding as noise (directory listings, diff output, shell logs) scored `Match: 0.0` alongside genuinely irrelevant results with no way to tell them apart. Wired the CLI through the same `_hybrid_rank` the `mempalace_search` MCP tool already used, and surfaced both `cosine=` and `bm25=` scores in the output so users see which component of the match is firing. MCP search was unaffected; this fixes the human-facing CLI parity gap.
- **Legacy-palace distance-metric warning.** CLI search now detects palaces created before `hnsw:space=cosine` was consistently set and prints a one-line notice pointing at `mempalace repair`. Without the warning such palaces silently used L2 distance, under which the similarity display floored every result to `Match: 0.0`. New palaces mined today already set cosine correctly and now have invariant tests pinning that behavior so future refactors can't silently regress it. (#1179)
- **Graceful Ctrl-C during `mempalace mine`.** Interrupting a long mine no longer dumps a multi-frame `KeyboardInterrupt` traceback. The main file-processing loop now catches the signal, prints `files_processed: N/M`, `drawers_filed: K`, and `last_file:` so the user knows what landed, then exits with code 130 (standard SIGINT). Already-filed drawers are upserted idempotently on re-mine via deterministic IDs, so resuming is safe. The hooks PID lock at `~/.mempalace/hook_state/mine.pid` is now also actively cleaned up in a `finally` when its entry points at us — clean exit, error, or interrupt — preventing the next hook fire from briefly waiting on a stale PID. (#1182)
- **`mempalace init` is now idempotent across re-runs.** Running `init` twice on the same project produced different `origin.json` results because the first run wrote `entities.json` into the project directory, and the second run's corpus-origin sampling included that file as corpus content — shifting Tier 1's character-density math. Sampling now skips the per-project artifacts (`entities.json`, `mempalace.yaml`), so re-running `init` produces the same classification it did the first time. Pinned by an integration test in `tests/test_corpus_origin_integration.py`. (#TBD)

---

## [3.3.3] — 2026-04-23

### Bug Fixes
Expand Down Expand Up @@ -157,6 +178,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
- Hall detection — routes drawer content to `emotions` / `technical` / `family` / `memory` / `identity` / `consciousness` / `creative` halls, enabling hall-based graph connectivity within wings (#835)

### Bug Fixes
- Repair `max_seq_id` corruption caused by `_fix_blob_seq_ids` misinterpreting chromadb 1.5.x's sysdb-10 BLOB format (`b'\x11\x11'` + ASCII digits) as legacy 0.6.x big-endian BLOBs. The shim now skips the `max_seq_id` table entirely and guards the `embeddings` branch with a prefix check. New subcommand `mempalace repair --mode max-seq-id [--from-sidecar <path>]` restores affected palaces. Fixes silent drawer-write drops that began after chromadb 1.5.x upgrades on palaces that still had BLOB-typed `max_seq_id` rows at migration time.
- Set `hnsw:space=cosine` metadata on all collection creation sites — fixes broken similarity scoring under ChromaDB's default L2 distance (#807, #218)
- File-level locking prevents duplicate drawers when agents mine the same file concurrently (#784, #826)
- Hybrid closet+drawer retrieval — closets boost ranking, never gate results (#795)
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ These are non-negotiable. Every PR, every feature, every refactor must honor the
- **Verbatim always** — Never summarize, paraphrase, or lossy-compress user data. The system searches the index and returns the original words. If a user said it, we store exactly what they said. This is the foundational promise.
- **Incremental only** — Append-only ingest after initial build. Never destroy existing data to rebuild. A crash mid-operation must leave the existing palace untouched.
- **Entity-first** — Everything is keyed by real names with disambiguation by DOB, ID, or context. People matter more than topics.
- **Local-first, zero API** — All extraction, chunking, and embedding happens on the user's machine. No cloud dependency for memory operations. No API keys required.
- **Local-first, zero external API by default** — All extraction, chunking, embedding, and LLM-assisted refinement happens on the user's machine by default, using locally-hosted runtimes (Ollama, LM Studio, llama.cpp, vLLM, unsloth studio, etc.). External providers (Anthropic, OpenAI, Google) are supported via BYOK but are never required and never enabled silently. The system never sends user content to a service the user has not explicitly configured. "Local LLM" is not an external API — Ollama and equivalents running on localhost are part of the user's machine. External BYOK is always a deliberate user choice, never a default and never a silent fallback.
- **Performance budgets** — Hooks under 500ms. Startup injection under 100ms. Memory should feel instant.
- **Privacy by architecture** — The system physically cannot send your data because it never leaves your machine. No telemetry, no phone-home, no external service dependencies for core operations.
- **Background everything** — Filing, indexing, timestamps, and pipeline work happen via hooks in the background. Nothing interrupts the user's conversation. Zero tokens spent on bookkeeping in the chat window.
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,10 @@ system prompt:
Two Claude Code hooks save periodically and before context compression:
[mempalaceofficial.com/guide/hooks](https://mempalaceofficial.com/guide/hooks.html).

For per-message recall on top of the file-level chunks the hooks produce,
run `mempalace sweep <transcript-dir>` periodically — it stores one
verbatim drawer per user/assistant message, idempotent and resume-safe.

---

## Requirements
Expand Down
Loading