Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
921db17
feat: add Hindi language support to i18n module
tejasashinde Apr 13, 2026
0f217f7
fix: harden hooks against shell injection, path traversal, and arithm…
Kesshite Apr 13, 2026
f7d703f
fix: add logging on rejected transcript paths and platform-native pat…
Kesshite Apr 13, 2026
1bff7d9
Increase visibility of fake website caution
gbhat618 Apr 14, 2026
79c9c0e
fix: use permissive validator for KG entity values (closes #455)
sha2fiddy Apr 14, 2026
e8e93b5
fix: allow mining directories without local mempalace.yaml
mvanhorn Apr 7, 2026
a035293
fix: remove unused sys import
mvanhorn Apr 7, 2026
1ea00fb
fix: send missing-yaml warning to stderr and flag basename collisions
mvanhorn Apr 11, 2026
6378588
Merge pull request #604 from mvanhorn/fix/14-mine-no-yaml
igorls Apr 14, 2026
e1d24d8
Merge pull request #812 from Kesshite/fix/security-hook-injection
igorls Apr 14, 2026
da89a11
docs: name official domain and specific impostors in scam alert
igorls Apr 14, 2026
8630e7e
Merge pull request #869 from gbhat618/fake-website-visibility-increase
igorls Apr 14, 2026
4741bc0
Merge pull request #873 from sha2fiddy/feature/455/kg-sanitize-punctu…
igorls Apr 14, 2026
21793cf
perf: optimize regex compilation in entity extraction
google-labs-jules[bot] Apr 14, 2026
3ac75d0
feat: add MEMPAL_VERBOSE toggle — developers see diaries in chat (#871)
milla-jovovich Apr 14, 2026
6a5e73c
feat: add VSCode devcontainer matching CI environment
igorls Apr 14, 2026
c9b3245
Merge pull request #880 from MemPalace/perf-optimize-regex-compilatio…
igorls Apr 14, 2026
a3f4674
Merge pull request #881 from MemPalace/feat/devcontainer
igorls Apr 14, 2026
1fa0e57
fix: add missing self._lock to query_relationship, timeline, stats in…
shafdev Apr 14, 2026
df986fd
fix: replace invalid 'decision: allow' with {} in hooks
milla-jovovich Apr 14, 2026
0369227
Merge pull request #884 from shafdev/fix/kg-missing-lock
igorls Apr 14, 2026
205867a
Merge pull request #885 from MemPalace/fix/hook-invalid-decision
igorls Apr 14, 2026
3094c0b
fix: add missing self._lock to KnowledgeGraph.close()
milla-jovovich Apr 14, 2026
29bc868
Merge pull request #887 from MemPalace/fix/kg-close-lock
igorls Apr 14, 2026
8df7b9b
benchmarks: add --llm-backend ollama for non-Anthropic rerank
igorls Apr 15, 2026
ca0682a
benchmarks: apply ruff-format to llm_rerank (trivial line wrap)
igorls Apr 15, 2026
61d02e1
benchmarks: add v3.3.0 reproduction results + 50/450 split
igorls Apr 15, 2026
65bf1eb
docs: slim README and move corrections/notices to docs/HISTORY.md
igorls Apr 15, 2026
f20a1a3
docs(website): align mempalaceofficial.com with honest benchmarks
igorls Apr 15, 2026
bf3b9c5
docs: #875 follow-up — repo surfaces + reproduction URLs + CHANGELOG
igorls Apr 15, 2026
1076859
docs+tests: fix CI after README slim (#875)
igorls Apr 15, 2026
db4c52e
Merge pull request #895 from MemPalace/bench/v3.3.0-verification
igorls Apr 15, 2026
ced1fc9
Merge pull request #897 from MemPalace/docs/honest-benchmarks-and-readme
bensig Apr 15, 2026
d565718
fix: address i18n review issues from PR #718
mvalentsev Apr 13, 2026
f36d04e
docs(cli): clarify that 'mempalace init' requires <dir> (#210) (#862)
arnoldwender Apr 15, 2026
f20f45a
fix: make entity_registry.research() local-only by default (#811)
Kesshite Apr 15, 2026
54a386d
fix: return empty status instead of error on cold-start palace (#830)…
mvalentsev Apr 15, 2026
6a73eb2
fix(searcher): guard against empty ChromaDB query results (#195) (#865)
arnoldwender Apr 15, 2026
0aee6f3
fix(init): auto-add per-project files to .gitignore in git repos (#18…
arnoldwender Apr 15, 2026
b226251
fix(mcp): redirect stdout to stderr during import to protect JSON-RPC…
arnoldwender Apr 15, 2026
ecd44f7
fix(hooks): stop precompact hook from blocking compaction (#856, #858…
mvalentsev Apr 15, 2026
a15094c
feat: include created_at timestamp in search results (#846)
sha2fiddy Apr 15, 2026
e61dc2a
fix: add provenance header and speaker IDs to Slack transcript import…
Kesshite Apr 15, 2026
b524b31
fix: restrict file permissions on sensitive palace data (#814)
Kesshite Apr 15, 2026
966937d
test: add palace_graph tunnel helper coverage
fatkobra Apr 15, 2026
56b6a63
Merge pull request #908 from fatkobra/test/palace-graph-tunnels
igorls Apr 15, 2026
b214ace
refactor(entity_detector): make multi-language extensible via i18n JSON
igorls Apr 15, 2026
c722c91
test: document orphan-locale recovery for _temp_locale helper
igorls Apr 15, 2026
3bac365
Merge pull request #911 from MemPalace/refactor/entity-detector-i18n
igorls Apr 15, 2026
b87ada3
feat: add Russian language support to i18n module
mvalentsev Apr 13, 2026
d6bd7de
feat(i18n): add entity detection section to Russian locale
mvalentsev Apr 15, 2026
3e49522
fix(i18n): apply review feedback on ru.json (#760)
mvalentsev Apr 15, 2026
4b998de
feat(i18n): expand Russian entity stopwords with prepositions and con…
mvalentsev Apr 15, 2026
312b3b5
Merge pull request #758 from mvalentsev/fix/i18n-review-issues
igorls Apr 15, 2026
73a2f82
Merge pull request #760 from mvalentsev/feat/i18n-russian
igorls Apr 15, 2026
2e998db
feat: add italian i18n support
Archetipo95 Apr 15, 2026
69453b2
feat: add italian entity patterns
Archetipo95 Apr 15, 2026
ce3ae0a
Merge branch 'MemPalace:develop' into feat/add-i18n-hindi
tejasashinde Apr 15, 2026
33a98fb
Updated hi.json to support infra for entity,pronoun_patterns,dialogue…
tejasashinde Apr 15, 2026
3d13a72
feat(i18n): add Brazilian Portuguese locale with entity detection (cl…
mvalentsev Apr 15, 2026
4221589
fix(i18n): address review feedback on pt-br.json
mvalentsev Apr 15, 2026
57b0b14
Merge pull request #156 from mvalentsev/feat/pt-br-entity-detection
igorls Apr 15, 2026
122ce38
Merge pull request #907 from Archetipo95/feat/italian-i18n-support
igorls Apr 15, 2026
0174b93
fix(i18n): resolve language codes case-insensitively (#927)
arnoldwender Apr 15, 2026
6caac50
fix(i18n): use Optional[str] for Python 3.9 compatibility
arnoldwender Apr 15, 2026
f895bc5
fix(entity_detector): script-aware word boundaries for combining-mark…
igorls Apr 16, 2026
d4c9424
Merge pull request #932 from MemPalace/fix/entity-detector-non-latin-…
igorls Apr 16, 2026
21da870
fix(i18n/hi): add boundary_chars and update action_pattern for Devana…
tejasashinde Apr 16, 2026
8bf940f
fix: use i18n candidate patterns for entity extraction in miner and p…
mvalentsev Apr 16, 2026
973bd62
fix: use pre-wrapped candidate patterns after #932 refactor
mvalentsev Apr 16, 2026
cde0f5b
remove unnecessary comment
mvalentsev Apr 16, 2026
88f5b5f
Add Indonesian language support
dominosaurs Apr 13, 2026
939d4c1
feat: Update Indonesian translations
dominosaurs Apr 16, 2026
09fe2dd
fix: add explicit UTF-8 encoding to read_text() calls (#776)
mvalentsev Apr 16, 2026
4215be3
Merge pull request #773 from tejasashinde/feat/add-i18n-hindi
igorls Apr 16, 2026
29112fa
Merge pull request #778 from dominosaurs/feat/id-lang
igorls Apr 16, 2026
65f99ad
Merge pull request #928 from arnoldwender/fix/i18n-lang-case-insensitive
igorls Apr 16, 2026
c5e249b
Merge pull request #946 from mvalentsev/fix/utf8-read-text
igorls Apr 16, 2026
55a004f
Merge pull request #931 from mvalentsev/fix/i18n-entity-metadata
igorls Apr 16, 2026
2087869
release: v3.3.1
igorls Apr 16, 2026
fd89303
docs(changelog): backfill post-v3.3.0 PRs missed by initial boundary
igorls Apr 16, 2026
05ad2dc
release: bump plugin manifests to 3.3.1
igorls Apr 16, 2026
b552bcf
Merge pull request #958 from MemPalace/fix/release-3.3.1-plugin-manif…
igorls Apr 16, 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
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"name": "mempalace",
"source": "./.claude-plugin",
"description": "AI memory system — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, guided setup.",
"version": "3.3.0",
"version": "3.3.1",
"author": {
"name": "milla-jovovich"
}
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mempalace",
"version": "3.3.0",
"version": "3.3.1",
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, and guided setup.",
"author": {
"name": "milla-jovovich"
Expand Down
2 changes: 1 addition & 1 deletion .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mempalace",
"version": "3.3.0",
"version": "3.3.1",
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, and guided setup.",
"author": {
"name": "milla-jovovich"
Expand Down
25 changes: 25 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"name": "MemPalace",
"image": "mcr.microsoft.com/devcontainers/python:3.11",
"features": {
"ghcr.io/devcontainers/features/github-cli:1": {}
},
"postCreateCommand": "bash .devcontainer/post-create.sh",
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"ms-python.debugpy",
"charliermarsh.ruff"
],
"settings": {
"python.defaultInterpreterPath": "/usr/local/bin/python",
"python.testing.pytestEnabled": true,
"python.testing.pytestArgs": ["tests/", "-v", "--ignore=tests/benchmarks"],
"ruff.importStrategy": "fromEnvironment",
"editor.formatOnSave": true,
"editor.defaultFormatter": "charliermarsh.ruff"
}
}
}
}
21 changes: 21 additions & 0 deletions .devcontainer/post-create.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -euo pipefail

echo "=== MemPalace Dev Container Setup ==="

pip install -e ".[dev]"

# Match CI's ruff pin (pyproject only sets a floor; without this contributors
# get a newer ruff locally than CI runs, causing phantom lint failures).
pip install "ruff>=0.4.0,<0.5"

pip install pre-commit
pre-commit install

echo ""
echo "=== Verification ==="
echo "python: $(python --version)"
echo "pytest: $(python -m pytest --version 2>&1 | head -1)"
echo "ruff: $(python -m ruff --version 2>&1 | head -1)"
echo ""
echo "Ready. Run: pytest tests/ -v --ignore=tests/benchmarks"
5 changes: 4 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.9.0
# Keep in lock-step with the ruff version pinned in .github/workflows/ci.yml
# (>=0.4.0,<0.5). Using a newer rev here produces a different formatter
# output than CI and breaks `ruff format --check` in the lint job.
rev: v0.4.10
hooks:
- id: ruff
args: [--fix]
Expand Down
73 changes: 72 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,75 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),

---

## [Unreleased] — v3.3.0 (on develop)
## [3.3.1] — 2026-04-16

### New Features

**Multi-language entity detection** — lexical patterns (person verbs, pronouns, dialogue markers, project verbs, stopwords, candidate character classes) now live in the optional `entity` section of each locale JSON under `mempalace/i18n/<lang>.json`. Every public function in `entity_detector` accepts a `languages=` tuple and unions patterns across enabled locales. Default stays `("en",)` so existing English-only callers are unchanged. (#911)

- **Five new fully-supported locales** with CLI strings, AAAK compression instructions, and entity-detection patterns:
- Brazilian Portuguese `pt-br` (#156)
- Russian `ru` (#760)
- Italian `it` (#907)
- Hindi `hi` (#773)
- Indonesian `id` (#778)
- **`MempalaceConfig.entity_languages`** — persistent palace-level language selection; `MEMPALACE_ENTITY_LANGUAGES` env override; `mempalace init --lang en,pt-br` flag that saves to `~/.mempalace/config.json` (#911)
- **Per-language `candidate_pattern`** — non-Latin scripts register their own character class, so names like `João`, `Инна`, `राज` are no longer silently dropped by the ASCII-only default (#911)
- **VSCode devcontainer** matching the CI environment (#881)
- `MEMPAL_VERBOSE` env toggle — developers see diaries surfaced in chat while the default remains silent (#871)
- `created_at` timestamps included in search results (#846)

### Bug Fixes

**i18n / Unicode**

- Script-aware word boundaries for combining-mark scripts — Python's `\b` fails on Devanagari vowel signs (`ा ी ु`), Arabic, Hebrew, Thai, Tamil, Khmer etc., truncating names like `अनीता` → `अनीत` and making person-verb patterns never fire. Locales now declare an optional `boundary_chars` field and the i18n loader expands `\b` into a script-aware lookaround boundary (#932)
- Case-insensitive BCP 47 language code resolution — `--lang PT-BR`, `zh-cn`, `Pt-Br` previously fell through to English silently; now resolve to the canonical locale file via lowercase matching, with the entity-pattern cache keyed on the canonical form so casing variations share one cache entry (#928)
- Wire i18n candidate patterns into `miner._extract_entities_for_metadata()`, `palace.build_closet_lines()`, and `entity_registry.extract_unknown_candidates()` — three code paths that still hardcoded ASCII-only `[A-Z][a-z]{2,}` and silently missed Cyrillic, accented Latin, and non-Latin entity metadata tags (#931)
- Explicit `encoding="utf-8"` on `Path.read_text()` calls across entity_registry, instructions_cli, split_mega_files, and onboarding tests — prevents Windows GBK (and other non-UTF-8) locales from corrupting UTF-8 files (#946, #776)
- `ko.json` `status_drawers` used `{drawers}` instead of `{count}`, showing the raw template string instead of the number (#758)
- Move `test_i18n.py` from inside the installed package into `tests/` so pytest actually collects it; remove the `sys.path.insert` hack (#758)
- `Dialect.from_config()` defaulted to `current_lang()` (module-global) when config had no `lang` key — replaced with explicit `"en"` fallback for determinism (#758)

**Other**

- Guard `KnowledgeGraph.close()` and `query_relationship`/`timeline`/`stats` methods with the instance lock to prevent concurrent-access corruption (#887, #884)
- Replace invalid `{"decision": "allow"}` with `{}` in hook responses — the string wasn't a valid decision value and triggered schema warnings (#885)
- `entity_registry.research()` defaults to local-only — previously made outbound Wikipedia HTTPS requests without explicit user opt-in; callers now must pass `allow_network=True` (#811)
- Precompact hook no longer blocks compaction when it fails or takes too long (#856, #858, #863)
- Redirect stdout to stderr during MCP server import so library logging can't corrupt the JSON-RPC channel (#225, #864)
- `mempalace init` auto-adds per-project files to `.gitignore` in git repositories so users don't accidentally commit `mempalace.yaml` / `entities.json` (#185, #866)
- Searcher guards against empty ChromaDB query results that previously raised on edge-case corpora (#195, #865)
- Return empty status instead of an error on a cold-start palace with no drawers yet (#830, #831)
- Restrict file permissions on sensitive palace data (#814)
- Slack transcript importer writes a provenance header and preserves speaker IDs (#815)
- Allow `mempalace mine` to run in directories without a local `mempalace.yaml` and surface the missing-yaml warning on stderr (#604)
- Security hook injection fix (#812)
- Save hook auto-mines transcripts even when `MEMPAL_DIR` is unset (#840)
- Pin the Pages custom domain via a shipped `CNAME` in the deploy artifact (#877)
- Version drift safeguard — sync pyproject + `version.py` + README badge in one place (#876)
- Deploy docs workflow now runs on `develop` only, preventing accidental main-branch deploys (#845)

### Improvements

- Regex compilation optimization for entity extraction — pre-compile per-entity pattern sets once and cache by `(name, languages)` tuple, so multi-language callers don't thrash the cache (#880)
- Knowledge-graph value sanitization now preserves natural punctuation (commas, colons, parentheses) that commonly appears in KG subject/object values (#873)

### Documentation

- Clarify that `mempalace init` requires a `<dir>` argument in CLI help text (#210, #862)
- Domain name and specific impostor sites called out in the scam-alert section (#869)
- Tightened `SECURITY.md` with a real version-support policy and the GHPVR-only reporting channel (#810)
- Fixed stale `pyproject.toml` URLs (#853)
- v4 planning prep (#852)

### Internal

- `palace_graph` tunnel helper test coverage (#908)

---

## [3.3.0] — 2026-04-13

### New Features
- Closet layer — a compact searchable index of pointers to verbatim drawers, enabling fast topical lookup without reading all content (#788)
Expand Down Expand Up @@ -41,6 +109,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
- Add `docs/CLOSETS.md` — closet layer overview
- Fix stale `milla-jovovich/*` org URLs in website and plugin manifests (#787)
- Fix remaining stale org URLs in contributor docs (#808)
- Rewrite `README.md` and `mempalaceofficial.com` benchmark pages to remove category-error cross-system comparisons (R@5 retrieval recall had been listed next to competitor QA accuracy under one column), remove the retracted "+34% palace boost" claim from the surfaces where it had remained, replace the `100%` Haiku-rerank headline with the honest held-out `98.4%` R@5, drop the LoCoMo `100%` top-50 row (retrieval-bypass artefact), and fix the broken `aya-thekeeper/mempal` reproduction URL (#875)
- Add `docs/HISTORY.md` as the canonical home for corrections, retractions, and public notices; move the 2026-04-07 "Note from Milla & Ben" and the 2026-04-11 impostor-domain notice out of `README.md`
- Add v3.3.0 reproduction result JSONLs and the deterministic `seed=42` 50/450 LongMemEval split under `benchmarks/` — every BENCHMARKS.md claim reproduces exactly

### Internal
- Add test coverage for `mine_lock`, closets, entity metadata, BM25, and diary
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ If you're planning a significant change, open an issue first to discuss the appr
- **Verbatim first**: Never summarize user content. Store exact words.
- **Local first**: Everything runs on the user's machine. No cloud dependencies.
- **Zero API by default**: Core features must work without any API key.
- **Palace structure matters**: Wings, halls, and rooms aren't cosmetic — they drive a 34% retrieval improvement. Respect the hierarchy.
- **Palace structure is scoping, not magic**: Wings, halls, and rooms act as metadata filters in the underlying vector store. They keep retrieval predictable when a palace holds many unrelated projects or people. Respect the hierarchy — but don't present it as a novel retrieval mechanism.

## Community

Expand Down
Loading
Loading