Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
6165aa2
feat(miner): add C# and .NET file extensions to READABLE_EXTENSIONS
Davez69gto Apr 16, 2026
e039a67
feat(miner): add support for Swift and Kotlin file extensions
EVSalomon May 5, 2026
66b0c50
feat: add Pi agent JSONL session normalizer
adv3nt3 Apr 7, 2026
a9a2c35
feat: add Gemini CLI / AI Studio JSON session import support
FBISiri May 9, 2026
25b918e
feat(normalize): add Continue.dev session parser
sjhddh Apr 12, 2026
f5d2212
style(tests): apply ruff 0.4.x format to test_normalize
sjhddh Jun 3, 2026
ae415b8
fix: detect Java project manifests
jsiu93 Jun 7, 2026
74453ee
fix: handle rootless Java subprojects
jsiu93 Jun 7, 2026
374400a
test(backends): live-substrate conformance module for pgvector
jphein Jun 10, 2026
47bddb0
review(gemini): marker-race stub, created-list lock, exact-order + ex…
jphein Jun 10, 2026
13d6c3e
chore(deps): bump docker/metadata-action from 5 to 6
dependabot[bot] Jun 12, 2026
38de37a
chore(deps): bump docker/build-push-action from 6 to 7
dependabot[bot] Jun 12, 2026
2b457a2
chore(deps): bump docker/login-action from 3 to 4
dependabot[bot] Jun 12, 2026
c45d069
fix(tests): run fact_checker __main__ via subprocess to clear runpy w…
trek-e Jun 13, 2026
9f434e0
test(migrate): cover swap-failure rollback
eldar702 Jun 15, 2026
d486aef
feat(mcp): add mempalace_delete_by_source bulk-cleanup tool (#1722)
arnoldwender Jun 8, 2026
f56e306
fix(mcp): harden delete_by_source per review — strip surrogates + typ…
arnoldwender Jun 8, 2026
c2f42cd
feat(miner): add PHP ecosystem file extensions
ManuelReschke Jun 18, 2026
ad5e7df
fix(claude-plugin): run final mine on SessionEnd
fatkobra Jun 18, 2026
d8d88f4
fix reviewer feedback: To prevent a KeyError and provide a clear, act…
fatkobra Jun 18, 2026
d704433
fix(chroma): route stale hnsw divergence to sqlite fallback
fatkobra Jun 18, 2026
ea71c52
fix reviewer feedback for chroma and tests
fatkobra Jun 18, 2026
e594bad
fix(mcp): refuse second writer for same palace
fatkobra Jun 18, 2026
f0b5cbf
fix(mcp): cache writer lock setup failures
fatkobra Jun 18, 2026
617aa0c
feat(miner): add PHP ecosystem file extensions (#1819)
igorls Jun 18, 2026
d4391ab
Merge pull request #1368 from EVSalomon/feat/add-support-swift-kotlin
igorls Jun 18, 2026
301aa33
Merge pull request #1720 from jsiu93/feat/java-project-scanner
igorls Jun 18, 2026
cbf6cbe
Merge pull request #731 from sjhddh/feat/continue-dev-parser
igorls Jun 18, 2026
22cf8af
Merge remote-tracking branch 'origin/develop' into HEAD
igorls Jun 18, 2026
78a32c6
Merge pull request #204 from FBISiri/feat/gemini-cli-import
igorls Jun 18, 2026
349485b
Merge remote-tracking branch 'origin/develop' into HEAD
igorls Jun 18, 2026
5935dac
Merge remote-tracking branch 'origin/develop' into HEAD
igorls Jun 18, 2026
f0e76c4
Merge pull request #169 from adv3nt3/feat/pi-cli-normalizer
igorls Jun 18, 2026
afa749c
Merge pull request #952 from Davez69gto/feat/csharp-extensions
igorls Jun 18, 2026
aa96bb5
feat: add opt-in local daemon for queued MemPalace writes
igorls Jun 19, 2026
63a382f
fix(mcp): gate startup on sqlite integrity failures
fatkobra Jun 19, 2026
6bccf82
chore(deps-dev): bump ruff from 0.15.15 to 0.15.18
dependabot[bot] Jun 19, 2026
4c46290
fix(mcp): applied 3 of the 4 reviewer suggestions
fatkobra Jun 19, 2026
3c7808e
fix(mcp): guard remaining None palace_path in _mcp_sqlite_integrity_r…
fatkobra Jun 19, 2026
5f58cdb
fix: unblock daemon PR CI + address review comments
igorls Jun 19, 2026
d859d5a
fix: daemon client bypasses proxy discovery; tests force-shutdown ser…
igorls Jun 19, 2026
95211e8
test: win32-only diagnostic for daemon process-exit hang
igorls Jun 19, 2026
f868ee7
fix(daemon): Windows-safe pid liveness probe; finalize cross-platform…
igorls Jun 19, 2026
fe0391a
fix(daemon): skip reverse-DNS in server_bind so startup can't block ~30s
igorls Jun 19, 2026
d09392c
feat(hooks): add a budget-safe SessionEnd save hook for clean exits (…
mvalentsev Jun 18, 2026
393107e
fix(claude-plugin): resolve SessionEnd merge semantics
fatkobra Jun 19, 2026
4e03ce9
Merge pull request #1826 from MemPalace/feat/daemon-mode
igorls Jun 19, 2026
32ec879
fix(claude-plugin):reviewer feedback for _validate_transcript_path fu…
fatkobra Jun 19, 2026
7fb981c
fix(daemon): address post-merge review feedback on #1826
igorls Jun 19, 2026
49e427b
Merge pull request #1828 from MemPalace/fix/daemon-review-followups
igorls Jun 19, 2026
94d1ced
Merge pull request #1827 from MemPalace/dependabot/pip/ruff-0.15.18
igorls Jun 19, 2026
b0eddf6
fix(backends): single-scroll bulk metadata fetch for Qdrant; bump scr…
fatkobra Jun 20, 2026
5fda4e5
fix: apply suggested reviewer suggestions
fatkobra Jun 20, 2026
03f638a
updated tests/test_qdrant_bulk_metadata_scroll.py because of CI failu…
fatkobra Jun 20, 2026
157022a
perf(embedding): cap ORT intra-op threads so a background mine doesn'…
igorls Jun 20, 2026
0601026
perf(mcp): answer overview tools from the sqlite aggregate to fix lar…
igorls Jun 20, 2026
abaf09b
fix(pgvector): strip NUL bytes so a transcript NUL no longer aborts t…
mvalentsev Jun 20, 2026
8bdebe1
fix: address PR review feedback (preserve "unknown" label; use super(…
igorls Jun 20, 2026
2eda1f9
Merge pull request #1836 from MemPalace/fix/perf-status-and-embedder-…
igorls Jun 20, 2026
477aa36
perf(mcp): sqlite fast path for graph_stats to fix large-palace timeo…
igorls Jun 20, 2026
73f455c
fix: address PR review feedback on graph_stats sqlite fast path (#1379)
igorls Jun 20, 2026
9d5a375
Merge pull request #1837 from MemPalace/fix/graph-stats-sqlite-fast-path
igorls Jun 20, 2026
38253b1
fix: percent-encode sqlite read-only URIs so spaced/special-char path…
igorls Jun 20, 2026
73772cb
Potential fix for pull request finding
igorls Jun 20, 2026
fe460c4
Merge pull request #1838 from MemPalace/fix/sqlite-ro-uri-encoding
igorls Jun 20, 2026
31fff1c
fix(mcp): route _sqlite_graph_stats through sqlite_read_uri
igorls Jun 20, 2026
fa27e41
fix(pgvector): push get(limit, offset) pagination into SQL (#1830)
mvalentsev Jun 20, 2026
4791999
Merge pull request #1831 from mvalentsev/fix/1829-pgvector-nul
igorls Jun 20, 2026
a27129a
fix(pgvector): replace lone surrogates so a transcript surrogate no l…
mvalentsev Jun 20, 2026
3eacbe0
Merge pull request #1834 from mvalentsev/fix/pgvector-surrogate
igorls Jun 20, 2026
e0da99b
Merge pull request #1839 from MemPalace/fix/graph-stats-sqlite-uri
igorls Jun 20, 2026
386f3c9
fix(backends): push sqlite_exact get(limit, offset) pagination into SQL
mvalentsev Jun 21, 2026
6cc5832
ci: re-trigger checks (unrelated Windows closet flake)
mvalentsev Jun 21, 2026
2ec48dd
refactor(qdrant): reuse _rows() in get_all_metadata(); fix sys.module…
fatkobra Jun 21, 2026
8723d30
test(mcp_server): add missing _fetch_all_metadata delegation/fallback…
fatkobra Jun 21, 2026
7fb7bd3
feat(search): add an optional source_file filter to mempalace_search …
mvalentsev Jun 17, 2026
4c4c4ab
fix(mcp): reject non-string source_file with a clean error (#1815)
mvalentsev Jun 17, 2026
c203aac
ci: re-trigger Windows (flaky closet-boost test)
mvalentsev Jun 17, 2026
44016ad
fix(repair): point index-read failures to repair --mode from-sqlite (…
mvalentsev Jun 21, 2026
fb8dc1f
fix: use CREATE_NO_WINDOW so Windows hook miner spawns don't flash a …
eldar702 Jun 21, 2026
65d0704
fix: point diverged-index recovery at from-sqlite, not re-mine (#1843)
undeadindustries Jun 22, 2026
d7e182a
docs: add Windows backup alternative to corrupt-index recovery (#1843)
undeadindustries Jun 22, 2026
4291fec
feat: add mempalace_checkpoint batch save tool
undeadindustries Jun 22, 2026
f3ed6f7
fix: harden tool_checkpoint input validation
undeadindustries Jun 22, 2026
352eb67
test: update Cursor followup assertion for checkpoint tool
undeadindustries Jun 22, 2026
5ae2315
fix(mcp): purge matching closets in delete_by_source (#1722)
igorls Jun 22, 2026
7d311af
Merge pull request #1842 from mvalentsev/fix/sqlite-exact-pagination
igorls Jun 22, 2026
b8c6bfe
Merge pull request #1840 from mvalentsev/fix/1830-pgvector-pagination
igorls Jun 22, 2026
fff8546
Merge pull request #1769 from techempower-org/test/pgvector-live-conf…
igorls Jun 22, 2026
e576c98
Merge pull request #1798 from trek-e/fix/fact-checker-runpy-warning
igorls Jun 22, 2026
92ac104
Merge pull request #1848 from eldar702/fix/1783-create-no-window
igorls Jun 22, 2026
b4a6ffd
Merge pull request #1822 from fatkobra/fix/1816-hnsw-strict-repair-kg
igorls Jun 22, 2026
91e2158
Merge pull request #1847 from mvalentsev/fix/1843-repair-from-sqlite-…
igorls Jun 22, 2026
db90cdf
Merge pull request #1849 from undeadindustries/fix/1843-recovery-guid…
igorls Jun 22, 2026
abd780e
Merge pull request #1788 from MemPalace/dependabot/github_actions/doc…
igorls Jun 22, 2026
a934493
Merge pull request #1787 from MemPalace/dependabot/github_actions/doc…
igorls Jun 22, 2026
a11cf4b
Merge pull request #1786 from MemPalace/dependabot/github_actions/doc…
igorls Jun 22, 2026
70ec8e4
Merge pull request #1832 from fatkobra/fix/1796-qdrant-bulk-metadata-…
igorls Jun 22, 2026
e38af8c
Merge pull request #1823 from fatkobra/fix/1818-mcp-peer-writer
igorls Jun 22, 2026
7392ab8
Merge pull request #1817 from mvalentsev/fix/1815-source-file-filter
igorls Jun 22, 2026
971e5a7
Merge pull request #1851 from undeadindustries/feat/cursor-checkpoint…
igorls Jun 22, 2026
a91f7e0
Merge pull request #1820 from fatkobra/fix/1814-session-end-hook
igorls Jun 22, 2026
9902e3a
Merge pull request #1729 from arnoldwender/feat/mcp-delete-by-source
igorls Jun 22, 2026
2f92774
feat(mcp): add opt-in HTTP transport
fatkobra Jun 14, 2026
94519b9
fix suggestion of reviewer to avoid a critical race condition and oth…
fatkobra Jun 14, 2026
2e8ff64
test(mcp): keep HTTP transport tests Python 3.9 compatible
fatkobra Jun 14, 2026
54e9f46
test(mcp): avoid subprocess flakiness in HTTP transport tests
fatkobra Jun 14, 2026
960eaac
test(mcp): bypass proxies in HTTP transport loopback tests
fatkobra Jun 14, 2026
1a47b78
test(mcp): make HTTP transport loopback tests proxy-free
fatkobra Jun 14, 2026
3fbab55
test(mcp): make HTTP transport tests network-free
fatkobra Jun 14, 2026
569beff
fix(mcp): move _HTTP_REQUEST_LOCK and _HTTP_MAX_REQUEST_BYTES
fatkobra Jun 14, 2026
3e3fcf2
fix(mcp): move _HTTP_REQUEST_LOCK
fatkobra Jun 15, 2026
ce00cf0
fix reviewer: handling JSON-RPC
fatkobra Jun 15, 2026
eff887d
fix(tests): rewrite test_mcp_http_transport for Python 3.9-3.13 + Win…
fatkobra Jun 15, 2026
32fad48
fix(lint): resolve 7 ruff errors in test_mcp_http_transport
fatkobra Jun 15, 2026
1095d68
fix(mcp): harden HTTP transport — DNS-rebinding guard, optional token…
igorls Jun 22, 2026
58ea91b
Merge pull request #1806 from fatkobra/fix/1801-http-transport-stdio
igorls Jun 22, 2026
37194cf
ci(test-windows): retry the transient ChromaDB HNSW compaction flake
igorls Jun 22, 2026
270f1ae
Merge pull request #1854 from MemPalace/ci/windows-chromadb-flake-ret…
igorls Jun 22, 2026
e8f96dd
chore(release): 3.5.0
igorls Jun 22, 2026
65fa151
Merge pull request #1853 from MemPalace/chore/release-3.5.0
igorls Jun 22, 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
7 changes: 4 additions & 3 deletions .claude-plugin/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# MemPalace Claude Code Plugin

A Claude Code plugin that gives your AI a persistent memory system. Mine projects and conversations into a searchable palace backed by ChromaDB, with 33 MCP tools, auto-save hooks, and 5 guided skills.
A Claude Code plugin that gives your AI a persistent memory system. Mine projects and conversations into a searchable palace backed by ChromaDB, with 35 MCP tools, auto-save hooks, and 5 guided skills.

## Prerequisites

Expand Down Expand Up @@ -41,16 +41,17 @@ After installing the plugin, run the init command to complete setup (installs th

## Hooks

MemPalace registers two hooks that run automatically:
MemPalace registers three hooks that run automatically:

- **Stop** -- Saves conversation context every 15 messages.
- **SessionEnd** -- Runs one final save in the background on a clean exit, so short sessions that never hit the Stop interval or a compaction are still captured.
- **PreCompact** -- Preserves important memories before context compaction.

Set the `MEMPAL_DIR` environment variable to a directory path to automatically run `mempalace mine` on that directory during each save trigger.

## MCP Server

The plugin automatically configures a local MCP server with 33 tools for storing, searching, and managing memories. No manual MCP setup is required -- `/mempalace:init` handles everything.
The plugin automatically configures a local MCP server with 34 tools for storing, searching, and managing memories. No manual MCP setup is required -- `/mempalace:init` handles everything.

## Full Documentation

Expand Down
11 changes: 11 additions & 0 deletions .claude-plugin/hooks/hooks.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,17 @@
]
}
],
"SessionEnd": [
{
"hooks": [
{
"type": "command",
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/mempal-session-end-hook.sh\"",
"timeout": 10
}
]
}
],
"PreCompact": [
{
"hooks": [
Expand Down
43 changes: 43 additions & 0 deletions .claude-plugin/hooks/mempal-session-end-hook.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/bin/bash
# MemPalace SessionEnd Hook — thin wrapper calling the Python CLI.
#
# Claude Code documents a default SessionEnd hook timeout of 1.5s, and
# "timeouts set on plugin-provided hooks do not raise the budget"
# (https://code.claude.com/docs/en/hooks). A cold `mempalace` start alone
# exceeds 1.5s, so the final mine must NOT run in the foreground — it would be
# killed before it saved anything. Unlike the foreground Stop/PreCompact plugin
# wrappers, this one backgrounds the hook and returns immediately; the detached
# child finishes the save after the session has exited. All logic lives in
# mempalace.hooks_cli for cross-harness extensibility.
run_mempalace_hook() {
if command -v mempalace >/dev/null 2>&1; then
exec mempalace hook run "$@"
fi

MEMPAL_PYTHON_BIN="${MEMPAL_PYTHON:-}"
if [ -z "$MEMPAL_PYTHON_BIN" ] || [ ! -x "$MEMPAL_PYTHON_BIN" ]; then
MEMPAL_PYTHON_BIN="$(command -v python3 2>/dev/null || echo python3)"
fi
if "$MEMPAL_PYTHON_BIN" -c "import mempalace" >/dev/null 2>&1; then
exec "$MEMPAL_PYTHON_BIN" -m mempalace hook run "$@"
fi

if command -v python >/dev/null 2>&1 && python -c "import mempalace" >/dev/null 2>&1; then
exec python -m mempalace hook run "$@"
fi

echo "MemPalace hook error: could not find a runnable mempalace command or module" >&2
exit 1
}

# Capture stdin (the SessionEnd JSON) before backgrounding — the parent's
# stdin is gone once we return. Forward it to the detached worker, which runs
# the final mine on its own time and outlives this process.
payload="$(cat)"
(
printf '%s' "$payload" | run_mempalace_hook --hook session-end --harness "${MEMPALACE_HOOK_HARNESS:-claude-code}"
) >/dev/null 2>&1 </dev/null &
disown 2>/dev/null || true

# Return immediately so the harness never blocks on session exit.
printf '{}'
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
{
"name": "mempalace",
"source": "./.claude-plugin",
"description": "AI memory system — mine projects and conversations into a searchable palace. 33 MCP tools, auto-save hooks, guided setup.",
"version": "3.4.1",
"description": "AI memory system — mine projects and conversations into a searchable palace. 35 MCP tools, auto-save hooks, guided setup.",
"version": "3.5.0",
"author": {
"name": "milla-jovovich"
}
Expand Down
4 changes: 2 additions & 2 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "mempalace",
"version": "3.4.1",
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 33 MCP tools, auto-save hooks, and guided setup.",
"version": "3.5.0",
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 35 MCP tools, auto-save hooks, and guided setup.",
"author": {
"name": "milla-jovovich"
},
Expand Down
7 changes: 7 additions & 0 deletions .claude-plugin/skills/mempalace-recall/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,13 @@ a variable, fixing a typo). Recall is question-driven, not reflexive.
an answer. Offer to widen the search or file the new information.
- **MCP error / server down** — surface the error, suggest `mempalace
status` or re-running `/init`; never fall back to guessing.
- **Palace index corrupt / compactor error** — if the server reports an
HNSW segment-writer error, a ChromaDB compaction failure, or stays
"Not connected" after a write, the index is out of sync with
`chroma.sqlite3` but the rows are intact. Tell the user to stop the
server and rebuild from SQLite (`mempalace repair --mode from-sqlite
--archive-existing --yes`), not re-mine, which drops MCP-added drawers
and diary entries (#1843). Do not repair in-process.
- **Conflicting facts** — trust the knowledge graph's time-valid answer;
invalidate-then-add rather than overwriting silently.

Expand Down
2 changes: 1 addition & 1 deletion .codex-plugin/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# MemPalace - Codex CLI Plugin

Give your AI a persistent memory -- mine projects and conversations into a searchable palace backed by ChromaDB, with 33 MCP tools, auto-save hooks, and guided skills.
Give your AI a persistent memory -- mine projects and conversations into a searchable palace backed by ChromaDB, with 35 MCP tools, auto-save hooks, and guided skills.

## Prerequisites

Expand Down
6 changes: 3 additions & 3 deletions .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "mempalace",
"version": "3.4.1",
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 33 MCP tools, auto-save hooks, and guided setup.",
"version": "3.5.0",
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 35 MCP tools, auto-save hooks, and guided setup.",
"author": {
"name": "milla-jovovich"
},
Expand All @@ -27,7 +27,7 @@
"interface": {
"displayName": "MemPalace",
"shortDescription": "AI memory system for Codex",
"longDescription": "Give your AI a persistent memory — mine projects and conversations into a searchable palace backed by ChromaDB, with 33 MCP tools, auto-save hooks, and guided skills.",
"longDescription": "Give your AI a persistent memory — mine projects and conversations into a searchable palace backed by ChromaDB, with 35 MCP tools, auto-save hooks, and guided skills.",
"developerName": "milla-jovovich",
"category": "Coding",
"capabilities": [
Expand Down
4 changes: 2 additions & 2 deletions .cursor-plugin/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# MemPalace Cursor Plugin

A Cursor IDE plugin that gives your agent a persistent memory system. Auto-registers the `mempalace-mcp` server (33 MCP tools), ships 5 slash commands, two model-invocable skills (setup/mining/search and a recall protocol), and an optional recall rule.
A Cursor IDE plugin that gives your agent a persistent memory system. Auto-registers the `mempalace-mcp` server (35 MCP tools), ships 5 slash commands, two model-invocable skills (setup/mining/search and a recall protocol), and an optional recall rule.

> Hooks (auto-save + session-start memory recall) are shipped separately under `hooks/cursor/` so the plugin is safe to install in any Cursor workspace without touching the agent loop. See [Hooks](#hooks-optional) below.

Expand Down Expand Up @@ -87,7 +87,7 @@ This plugin ships `mcp.json` at the plugin root, so Cursor auto-loads the `mempa
}
```

All 33 MemPalace MCP tools (`mempalace_search`, `mempalace_add_drawer`, `mempalace_diary_write`, `mempalace_check_duplicate`, `mempalace_diary_read`, …) become available to the agent immediately. No manual `~/.cursor/mcp.json` edit required.
All 34 MemPalace MCP tools (`mempalace_search`, `mempalace_add_drawer`, `mempalace_diary_write`, `mempalace_check_duplicate`, `mempalace_diary_read`, …) become available to the agent immediately. No manual `~/.cursor/mcp.json` edit required.

If the server doesn't appear, confirm `mempalace-mcp` is on the user `$PATH`:

Expand Down
2 changes: 1 addition & 1 deletion .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
{
"name": "mempalace",
"source": ".",
"description": "AI memory system — mine projects and conversations into a searchable palace. 33 MCP tools, slash commands, and a guided skill for Cursor.",
"description": "AI memory system — mine projects and conversations into a searchable palace. 35 MCP tools, slash commands, and a guided skill for Cursor.",
"author": {
"name": "milla-jovovich"
}
Expand Down
2 changes: 1 addition & 1 deletion .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mempalace",
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 33 MCP tools, slash commands, and a guided skill for Cursor.",
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 35 MCP tools, slash commands, and a guided skill for Cursor.",
"author": {
"name": "milla-jovovich"
},
Expand Down
8 changes: 7 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,13 @@ jobs:
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
# ChromaDB's rust HNSW core intermittently fails compaction on Windows
# ("Failed to apply logs to the hnsw segment writer") regardless of our
# code — a long-standing, non-reproducible-on-Linux/macOS flake. Retry
# ONLY that specific transient error (via --only-rerun) so real,
# deterministic failures still fail on the first run. Linux/macOS jobs
# deliberately run with no reruns so genuine regressions surface there.
- run: python -m pytest tests/ -v --ignore=tests/benchmarks --cov=mempalace --cov-report=term-missing --cov-fail-under=80 --durations=10 --reruns 2 --reruns-delay 5 --only-rerun "Failed to apply logs to the hnsw segment writer"

test-macos:
runs-on: macos-latest
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,15 @@ jobs:
# do not push.
- name: Log in to GHCR
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@v6
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
# latest -> main (the latest release); semver tags -> released versions.
Expand All @@ -56,7 +56,7 @@ jobs:
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}

- name: Build and push
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
context: .
file: ./Dockerfile
Expand Down Expand Up @@ -85,7 +85,7 @@ jobs:
uses: docker/setup-buildx-action@v3

- name: Build GPU image (validation only — not published)
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
context: .
file: ./Dockerfile.gpu
Expand Down
52 changes: 52 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,58 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),

---

## [3.5.0] — 2026-06-22

### Features

- **Opt-in local daemon for queued writes.** A new `mempalace daemon` queues MemPalace writes through a single local process so background mines, diary saves, and hook-driven ingests serialize against one palace handle instead of racing for it. Opt-in and local-only — nothing binds to a public interface. (#1826)

- **Opt-in HTTP transport for the MCP server.** `mempalace-mcp --transport http` serves JSON-RPC at `POST /mcp` (with a `GET /healthz` liveness probe) for operators running MemPalace behind a long-lived HTTP MCP client/proxy, avoiding the long-lived-stdio framing failures of #1801. stdio remains the default and is unchanged. The transport reuses the exact stdio request dispatcher (no separate write/search path), binds `127.0.0.1` by default, and is hardened against the two ways a local HTTP server leaks to the network: it pins the `Host` header to loopback on a loopback bind and rejects any non-loopback browser `Origin` (DNS-rebinding/SSRF guard), and supports an optional bearer token via `MEMPALACE_MCP_HTTP_TOKEN` (required on `/mcp`, never on `/healthz`). A 16 MiB request cap and a loud warning when bound to a non-loopback host round it out. (#1801, #1806)

- **`mempalace_checkpoint` batch-save MCP tool.** Collapses multiple `add_drawer` calls plus an optional diary entry into a single MCP round-trip for agents that want to file a whole session at once. Stores content verbatim and reuses the existing idempotent add/dedup path. (#1851)

- **`mempalace_delete_by_source` bulk-cleanup MCP tool.** Exact-match, dry-run-by-default deletion of every drawer (and its matching closet/AAAK index entries) for a given `source_file` — the recourse for benchmark/eval files mined into the same wing as real data and drowning out search. The dry run reports the drawer and closet blast radius before anything is removed, and the commit writes a WAL audit entry. (#1722, #1729)

- **Optional `source_file` filter for `mempalace_search`.** Scope a search to an exact stored source path. The filter is threaded through every search path (vector, BM25/SQLite fallback, lexical union, and index-mismatch fallback) so it never silently drops a matching drawer, and results now expose the full `source_path` as a round-trippable key. (#1815, #1817)

- **New transcript parsers / importers.** Continue.dev session parser (#731), Gemini CLI / AI Studio JSON session import (#204), and a Pi agent JSONL session normalizer (#169).

- **Wider miner language coverage.** C# / .NET, PHP (#1819), Swift / Kotlin (#1368), and Java project detection including rootless subprojects (#1720).

- **Final mine on Claude plugin `SessionEnd`.** The Claude Code plugin now runs a closing mine when a session ends so the last exchanges are captured without waiting for the next save nudge. (#1814, #1820)

### Performance

- **Overview/status MCP tools answer from the SQLite aggregate.** Large palaces no longer time out building wing/room/status overviews — the counts come from a single SQLite aggregate instead of a client-side fetch-and-tally. (#1748, #1379)

- **`graph_stats` SQLite fast path.** Knowledge-graph stats are computed in SQLite rather than walking the collection, fixing large-palace timeouts. (#1379)

- **Embedder caps ONNX-runtime intra-op threads** so a background mine no longer pins every core. (#1068)

- **Backend pagination pushed into the query.** `sqlite_exact` (#1841, #1842) and `pgvector` (#1830, #1840) now apply `get(limit, offset)` in SQL, and Qdrant fetches bulk metadata in a single scroll with a larger page size (#1796, #1832).

### Bug Fixes

- **pgvector tolerates hostile transcript bytes.** A lone Unicode surrogate (#1833) or a NUL byte (#1829) in a transcript no longer aborts the whole mine — both are sanitized before the row is written.

- **SQLite read-only URIs are percent-encoded** so palace paths with spaces or special characters open correctly, and `_sqlite_graph_stats` is routed through the same `sqlite_read_uri` helper.

- **Stale ChromaDB HNSW divergence routes to the SQLite fallback** instead of failing the read outright. (#1816, #1822)

- **Diverged-index recovery now points at `repair --mode from-sqlite`, not a re-mine.** A failed ChromaDB HNSW compaction leaves the index out of sync while the rows stay intact in `chroma.sqlite3`; the old "re-mine from source" advice silently dropped MCP-added drawers and diary entries (which have no source file). Both the legacy `repair`/`rebuild_index` error messages and the `repair-status` recommendation, plus the recall skill docs, now guide users to rebuild from SQLite. (#1843, #1847, #1849)

- **The MCP server refuses a second writer for the same palace** rather than letting two processes race the same HNSW handle. (#1818, #1823)

- **Windows hook miner spawns with `CREATE_NO_WINDOW`** so background mines no longer flash a console window. (#1783, #1848)

- **`fact_checker` `__main__` no longer emits a runpy warning** under the test runner. (#1798)

### Internal

- Live-substrate conformance test module for pgvector (#1769); dependabot bumps for `docker/login-action` (3→4), `docker/build-push-action` (6→7), and `docker/metadata-action` (5→6) (#1788, #1787, #1786); ruff dev dependency bumped to 0.15.18.

---

## [3.4.1] — 2026-06-14

### Features
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ Usage and tool reference:

## MCP server

33 MCP tools cover palace reads/writes, knowledge-graph operations,
35 MCP tools cover palace reads/writes, knowledge-graph operations,
cross-wing navigation, drawer management, and agent diaries. Installation
and the full tool list:
[mempalaceofficial.com/reference/mcp-tools](https://mempalaceofficial.com/reference/mcp-tools.html).
Expand Down Expand Up @@ -285,7 +285,7 @@ PRs welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).
MIT — see [LICENSE](LICENSE).

<!-- Link Definitions -->
[version-shield]: https://img.shields.io/badge/version-3.4.1-4dc9f6?style=flat-square&labelColor=0a0e14
[version-shield]: https://img.shields.io/badge/version-3.5.0-4dc9f6?style=flat-square&labelColor=0a0e14
[release-link]: https://github.com/MemPalace/mempalace/releases
[python-shield]: https://img.shields.io/badge/python-3.9+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8
[python-link]: https://www.python.org/
Expand Down
Loading
Loading