Skip to content

Commit 818b7f4

Browse files
authored
Merge pull request #1118 from MemPalace/ben/crystal-lattice-brand
feat(website): Crystal Lattice brand — fonts, palette, hero copy
2 parents 9b35d9f + 4f00390 commit 818b7f4

16 files changed

Lines changed: 248 additions & 108 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"name": "mempalace",
1010
"source": "./.claude-plugin",
1111
"description": "AI memory system — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, guided setup.",
12-
"version": "3.3.0",
12+
"version": "3.3.2",
1313
"author": {
1414
"name": "milla-jovovich"
1515
}

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mempalace",
3-
"version": "3.3.0",
3+
"version": "3.3.2",
44
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, and guided setup.",
55
"author": {
66
"name": "milla-jovovich"

.codex-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mempalace",
3-
"version": "3.3.0",
3+
"version": "3.3.2",
44
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, and guided setup.",
55
"author": {
66
"name": "milla-jovovich"

CHANGELOG.md

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,106 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66

77
---
88

9-
## [Unreleased] — v3.3.0 (on develop)
9+
## [3.3.2] — 2026-04-19
10+
11+
### Bug Fixes
12+
13+
- Fix silent drop of `.jsonl` files in project miner; raise `MAX_FILE_SIZE` cap from 10 MB to 500 MB so large transcripts no longer fall through unnoticed. Adds a tandem **sweeper** — a message-level, timestamp-coordinated, idempotent safety net that catches anything the primary miner missed. (#998)
14+
- `mempalace sweep <target>` CLI to run the sweeper on demand against a transcript file or a directory. (#998)
15+
- Guard `Layer3.search_raw` against `None` doc/meta rows returned by ChromaDB — prevents `AttributeError` crashes on mixed-schema palaces. (#1011, #1013)
16+
- Guard searcher API path, closet loop, and miner status histogram against `None` metadata; matching guards added to `tool_status` / `list_wings` / `list_rooms` / `get_taxonomy` in the MCP server. (#999)
17+
- Upgrade `chromadb` floor to `>=1.5.4` for Python 3.13 / 3.14 compatibility and pin upper bound to `<2` so future breaking majors don't silently install. (#1010)
18+
- Fix Unicode checkmark rendering on Windows terminals that can't encode the `` glyph — avoids `UnicodeEncodeError` crashes on first-run output. (#681)
19+
- **`quarantine_stale_hnsw`** — on open, detect HNSW segment directories whose `data_level0.bin` is significantly older than `chroma.sqlite3` and rename them out of the way. Recovers cleanly from HNSW/sqlite drift that otherwise causes SIGSEGV on `count()` / `query(...)` (the chroma-core/chroma#2594 failure mode). Rebuilds the index lazily on next use. (#1000)
20+
- **PID file guard**`mine` writes a per-source-directory PID file and refuses to start if an existing mine is still running, preventing process stacking that bloats HNSW and wedges concurrent writes. Includes cross-platform PID liveness check (`os.kill(pid, 0)` terminates on Windows, so the guard falls back to a platform-aware probe). (#1023)
21+
22+
### Improvements
23+
24+
- **RFC 001 §10 — typed backend contracts.** `BaseBackend` now returns typed `QueryResult` / `GetResult` dataclasses and `PalaceRef` for palace identity; registry-based backend discovery. Internal refactor; no user-facing API change. (#995)
25+
- **RFC 002 §9 — source adapter scaffolding.** Introduces `BaseSourceAdapter`, adapter registry, and `PalaceContext` — the plumbing that future pluggable ingest sources will target. Internal refactor; no user-facing API change yet. (#1014)
26+
27+
### Documentation
28+
29+
- **RFC 002** — full specification for the source adapter plugin system (future pluggable ingest). (#990)
30+
- First-run help text and `README` now reference the real `~/.claude/projects/<project>/` path shape instead of the placeholder `/path/to/transcripts`. (#996, #1012)
31+
32+
### Internal
33+
34+
- Harden sweeper for production: verbatim tool blocks, full `session_id`, logged failures.
35+
- Address Copilot review on #995: cursor tie-break, honest metrics, accurate comments.
36+
- Test hygiene: avoid ONNX network download in update-length validation tests; dedup update-length-validation tests; fix Windows file-lock in cache-invalidation test.
37+
38+
---
39+
40+
## [3.3.1] — 2026-04-16
41+
42+
### New Features
43+
44+
**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)
45+
46+
- **Five new fully-supported locales** with CLI strings, AAAK compression instructions, and entity-detection patterns:
47+
- Brazilian Portuguese `pt-br` (#156)
48+
- Russian `ru` (#760)
49+
- Italian `it` (#907)
50+
- Hindi `hi` (#773)
51+
- Indonesian `id` (#778)
52+
- **`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)
53+
- **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)
54+
- **VSCode devcontainer** matching the CI environment (#881)
55+
- `MEMPAL_VERBOSE` env toggle — developers see diaries surfaced in chat while the default remains silent (#871)
56+
- `created_at` timestamps included in search results (#846)
57+
58+
### Bug Fixes
59+
60+
**i18n / Unicode**
61+
62+
- 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)
63+
- 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)
64+
- 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)
65+
- 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)
66+
- `ko.json` `status_drawers` used `{drawers}` instead of `{count}`, showing the raw template string instead of the number (#758)
67+
- Move `test_i18n.py` from inside the installed package into `tests/` so pytest actually collects it; remove the `sys.path.insert` hack (#758)
68+
- `Dialect.from_config()` defaulted to `current_lang()` (module-global) when config had no `lang` key — replaced with explicit `"en"` fallback for determinism (#758)
69+
70+
**Other**
71+
72+
- Guard `KnowledgeGraph.close()` and `query_relationship`/`timeline`/`stats` methods with the instance lock to prevent concurrent-access corruption (#887, #884)
73+
- Replace invalid `{"decision": "allow"}` with `{}` in hook responses — the string wasn't a valid decision value and triggered schema warnings (#885)
74+
- `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)
75+
- Precompact hook no longer blocks compaction when it fails or takes too long (#856, #858, #863)
76+
- Redirect stdout to stderr during MCP server import so library logging can't corrupt the JSON-RPC channel (#225, #864)
77+
- `mempalace init` auto-adds per-project files to `.gitignore` in git repositories so users don't accidentally commit `mempalace.yaml` / `entities.json` (#185, #866)
78+
- Searcher guards against empty ChromaDB query results that previously raised on edge-case corpora (#195, #865)
79+
- Return empty status instead of an error on a cold-start palace with no drawers yet (#830, #831)
80+
- Restrict file permissions on sensitive palace data (#814)
81+
- Slack transcript importer writes a provenance header and preserves speaker IDs (#815)
82+
- Allow `mempalace mine` to run in directories without a local `mempalace.yaml` and surface the missing-yaml warning on stderr (#604)
83+
- Security hook injection fix (#812)
84+
- Save hook auto-mines transcripts even when `MEMPAL_DIR` is unset (#840)
85+
- Pin the Pages custom domain via a shipped `CNAME` in the deploy artifact (#877)
86+
- Version drift safeguard — sync pyproject + `version.py` + README badge in one place (#876)
87+
- Deploy docs workflow now runs on `develop` only, preventing accidental main-branch deploys (#845)
88+
89+
### Improvements
90+
91+
- 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)
92+
- Knowledge-graph value sanitization now preserves natural punctuation (commas, colons, parentheses) that commonly appears in KG subject/object values (#873)
93+
94+
### Documentation
95+
96+
- Clarify that `mempalace init` requires a `<dir>` argument in CLI help text (#210, #862)
97+
- Domain name and specific impostor sites called out in the scam-alert section (#869)
98+
- Tightened `SECURITY.md` with a real version-support policy and the GHPVR-only reporting channel (#810)
99+
- Fixed stale `pyproject.toml` URLs (#853)
100+
- v4 planning prep (#852)
101+
102+
### Internal
103+
104+
- `palace_graph` tunnel helper test coverage (#908)
105+
106+
---
107+
108+
## [3.3.0] — 2026-04-13
10109

11110
### New Features
12111
- Closet layer — a compact searchable index of pointers to verbatim drawers, enabling fast topical lookup without reading all content (#788)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ PRs welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).
177177
MIT — see [LICENSE](LICENSE).
178178

179179
<!-- Link Definitions -->
180-
[version-shield]: https://img.shields.io/badge/version-3.3.0-4dc9f6?style=flat-square&labelColor=0a0e14
180+
[version-shield]: https://img.shields.io/badge/version-3.3.2-4dc9f6?style=flat-square&labelColor=0a0e14
181181
[release-link]: https://github.com/MemPalace/mempalace/releases
182182
[python-shield]: https://img.shields.io/badge/python-3.9+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8
183183
[python-link]: https://www.python.org/

mempalace/backends/chroma.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,8 @@ def _normalize_get_collection_args(args, kwargs):
615615
create = kwargs.pop("create", False)
616616
if rest:
617617
create = rest.pop(0)
618+
if rest:
619+
raise TypeError(f"unexpected positional args: {rest!r}")
618620
if kwargs:
619621
raise TypeError(f"unexpected kwargs: {sorted(kwargs)}")
620622
return (

mempalace/cli.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,12 +179,12 @@ def cmd_sweep(args):
179179
failures = result.get("failures") or []
180180
if failures:
181181
print(
182-
f" {len(failures)} file(s) failed to sweep see stderr / logs for details.",
182+
f" WARNING: {len(failures)} file(s) failed to sweep - see stderr / logs for details.",
183183
file=sys.stderr,
184184
)
185185
sys.exit(2)
186186
else:
187-
print(f" Not a file or directory: {target}", file=sys.stderr)
187+
print(f" ERROR: Not a file or directory: {target}", file=sys.stderr)
188188
sys.exit(1)
189189

190190

mempalace/sweeper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ def sweep_directory(dir_path: str, palace_path: str) -> dict:
321321
result = sweep(str(f), palace_path, source_label=str(f))
322322
except Exception as exc:
323323
logger.error("sweeper: sweep failed on %s: %s", f, exc)
324-
print(f" \u26a0 sweep failed on {f}: {exc}", file=sys.stderr)
324+
print(f" WARNING: sweep failed on {f}: {exc}", file=sys.stderr)
325325
failures.append({"file": str(f), "error": str(exc)})
326326
continue
327327
total_added += result["drawers_added"]

mempalace/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
"""Single source of truth for the MemPalace package version."""
22

3-
__version__ = "3.3.0"
3+
__version__ = "3.3.2"

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "mempalace"
3-
version = "3.3.0"
3+
version = "3.3.2"
44
description = "Give your AI a memory — mine projects and conversations into a searchable palace. No API key required."
55
readme = "README.md"
66
requires-python = ">=3.9"

0 commit comments

Comments
 (0)