v0.10.0
stable2026-09-06The server starts again, stops when you do, and stops re-reading the whole store
Performance: the store is now loaded once, not once per call. Repository.list() re-read and re-parsed every object on every call — 4,075 gzip opens (429 ms) plus 4,075 TOON parses (718 ms), paid in full on every tool call. Memories are content-addressed, so a SHA-keyed cache can never serve stale content, and .memgit/cache/corpus.json carries a pre-parsed pool across processes. Measured on the live store: cold first search 2,035 ms to 401 ms, every later search 1,150 ms to 80 ms, and a session making eight memory calls goes from about 10.1 s to 1.0 s. Released from a repository cleaned of a supply-chain backdoor the same day.
+ Added
- +memgit pro activate / status / deactivate — a Polar-issued licence key, validated against Polar's public customer-portal endpoint and cached at ~/.memgit/license.json (0600). Fail-open with a 14-day grace window, a 24-hour recheck cadence, and the key never echoed in full. MEMGIT_LICENSE_KEY serves headless MCP hosts and is never written to disk. No new dependency: the check uses urllib, so plain memgit stays click + rich + mcp
- +The server releases its memory when it goes idle, dropping the parsed-object and tokenization caches after 15 minutes with no tool call (MEMGIT_IDLE_EVICT_SECONDS). Measured before the fix: six servers with living parents aged over seven hours, two still holding 126 MB and 112 MB. Eviction rather than exit — exiting would gamble on every MCP host reconnecting, and the corpus pool below makes a reload cost about 40 ms
- +An orphan watchdog. Closed stdin already ends the process when a host exits, verified end to end one second after a SIGKILL of the parent; this is the backstop for when it does not
- +memgit savings — what memory cost, against what finding the same fact would have cost. Matching runs over passages rather than whole files, because a 40 KB document holds half the vocabulary of almost any memory. A memory no file carries is never converted into tokens: it is reported as a count, because without memgit those facts are not found more expensively, they are not found. Measured on a 4,075-memory store against a 1,958-file workspace: 40.6% of recalled memories exist in no file at all, and for the rest reading costs 94x what recall costs
✓ Fixed
- ✓mcp is pinned below 2.0, which is what makes memgit installable again. The MCP SDK released 2.0 on 2026-07-28; memgit asked for mcp>=1.0.0 with no upper bound, so from that day every fresh install resolved to 2.x, which removed the decorators this server is built on, and the server crashed on startup before answering a single request. Both routes were affected: pip, and the npm wrapper, which builds a clean venv on first run. Measured: a clean install resolved mcp 2.1.1 and memgit serve died with AttributeError: 'Server' object has no attribute 'list_tools'; with the pin it resolves 1.29.1 and answers initialize
- ✓An incompatible SDK now says so, in words, with the command that fixes it. MCP hosts do not surface a server's stderr, so the old failure reached the user as "the server failed to start" with no cause. The check runs before the decorators are touched and names the version found, the version needed, and the extra step for the npm route
- ✓The server reports its own version again. Server() was constructed without version=, so the SDK filled in its own and every host displayed memgit's version as 1.29.1 — on a defect whose only symptom is silence, that was the one field that could have told anyone which memgit they were running