superlocalmemory 4.0.7 → 4.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/CHANGELOG.md +219 -1
  2. package/README.md +6 -6
  3. package/package.json +1 -1
  4. package/plugin/.claude-plugin/plugin.json +1 -1
  5. package/plugin/CLAUDE.md +3 -3
  6. package/plugin/agents/slm-governance-advisor.md +1 -1
  7. package/plugin/agents/slm-loop-runner.md +1 -1
  8. package/plugin/agents/slm-memory-advisor.md +1 -1
  9. package/plugin/agents/slm-optimize-advisor.md +1 -1
  10. package/plugin/requirements.txt +1 -1
  11. package/plugin/scripts/ensure-venv.sh +1 -1
  12. package/plugin/skills/slm-cache/SKILL.md +1 -1
  13. package/plugin/skills/slm-compress/SKILL.md +1 -1
  14. package/plugin/skills/slm-governance/SKILL.md +1 -1
  15. package/plugin/skills/slm-graph/SKILL.md +1 -1
  16. package/plugin/skills/slm-loop/SKILL.md +1 -1
  17. package/plugin/skills/slm-mesh/SKILL.md +1 -1
  18. package/plugin/skills/slm-profile/SKILL.md +1 -1
  19. package/plugin/skills/slm-recall/SKILL.md +1 -1
  20. package/plugin/skills/slm-remember/SKILL.md +1 -1
  21. package/plugin/skills/slm-scope/SKILL.md +1 -1
  22. package/plugin/skills/slm-session/SKILL.md +1 -1
  23. package/plugin/skills/slm-status/SKILL.md +3 -3
  24. package/plugin-src/rules/AGENTS.md +1 -1
  25. package/plugin-src/skills/slm-status/SKILL.md +2 -2
  26. package/pyproject.toml +1 -1
  27. package/scripts/postinstall.js +4 -0
  28. package/src/superlocalmemory/__init__.py +1 -1
  29. package/src/superlocalmemory/cli/_lazy_init.py +1 -1
  30. package/src/superlocalmemory/cli/commands.py +119 -9
  31. package/src/superlocalmemory/cli/db_migrate.py +0 -2
  32. package/src/superlocalmemory/cli/gdpr_io.py +1 -1
  33. package/src/superlocalmemory/cli/main.py +5 -5
  34. package/src/superlocalmemory/cli/service_installer.py +2 -1
  35. package/src/superlocalmemory/cli/setup_wizard.py +1 -1
  36. package/src/superlocalmemory/cli/summary_cmd.py +23 -3
  37. package/src/superlocalmemory/code_graph/bridge/maintenance.py +7 -1
  38. package/src/superlocalmemory/core/config.py +41 -7
  39. package/src/superlocalmemory/core/consolidation_engine.py +14 -15
  40. package/src/superlocalmemory/core/context_cache.py +0 -2
  41. package/src/superlocalmemory/core/engine.py +371 -63
  42. package/src/superlocalmemory/core/evidence_bundle.py +3 -1
  43. package/src/superlocalmemory/core/install_detector.py +131 -0
  44. package/src/superlocalmemory/core/progressive_abstraction.py +1 -1
  45. package/src/superlocalmemory/core/recall_worker.py +4 -0
  46. package/src/superlocalmemory/core/security_primitives.py +3 -6
  47. package/src/superlocalmemory/core/store_pipeline.py +94 -26
  48. package/src/superlocalmemory/core/topic_signature.py +0 -2
  49. package/src/superlocalmemory/core/transactions/concrete_owners.py +15 -8
  50. package/src/superlocalmemory/dynamics/eap_scheduler.py +17 -6
  51. package/src/superlocalmemory/encoding/graph_builder.py +2 -2
  52. package/src/superlocalmemory/encoding/scene_builder.py +8 -2
  53. package/src/superlocalmemory/evolution/skill_evolver.py +16 -1
  54. package/src/superlocalmemory/hooks/adapter_base.py +0 -2
  55. package/src/superlocalmemory/hooks/context_payload.py +0 -2
  56. package/src/superlocalmemory/hooks/hook_handlers.py +38 -11
  57. package/src/superlocalmemory/hooks/portable_kit.py +8 -8
  58. package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -2
  59. package/src/superlocalmemory/hooks/prewarm_auth.py +0 -2
  60. package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -2
  61. package/src/superlocalmemory/infra/backup.py +44 -8
  62. package/src/superlocalmemory/integrations/bounded_loops_mcp.py +24 -7
  63. package/src/superlocalmemory/learning/arm_catalog.py +0 -2
  64. package/src/superlocalmemory/learning/bandit.py +0 -2
  65. package/src/superlocalmemory/learning/bandit_cache.py +0 -2
  66. package/src/superlocalmemory/learning/dedup_hnsw.py +11 -11
  67. package/src/superlocalmemory/learning/ensemble.py +0 -2
  68. package/src/superlocalmemory/learning/labeler.py +0 -2
  69. package/src/superlocalmemory/learning/legacy_migration.py +0 -2
  70. package/src/superlocalmemory/learning/model_cache.py +0 -2
  71. package/src/superlocalmemory/learning/pattern_miner.py +12 -7
  72. package/src/superlocalmemory/learning/ranker.py +0 -2
  73. package/src/superlocalmemory/learning/reward_archive.py +6 -1
  74. package/src/superlocalmemory/learning/reward_proxy.py +0 -2
  75. package/src/superlocalmemory/learning/signal_worker.py +0 -2
  76. package/src/superlocalmemory/math/fisher.py +1 -1
  77. package/src/superlocalmemory/math/hopfield.py +4 -1
  78. package/src/superlocalmemory/math/langevin.py +1 -1
  79. package/src/superlocalmemory/math/sheaf.py +7 -3
  80. package/src/superlocalmemory/mcp/cli_fallback.py +1 -1
  81. package/src/superlocalmemory/mcp/profiles.py +11 -4
  82. package/src/superlocalmemory/mcp/server.py +8 -1
  83. package/src/superlocalmemory/mcp/tools_active.py +56 -0
  84. package/src/superlocalmemory/mcp/tools_core.py +1 -1
  85. package/src/superlocalmemory/mcp/tools_summaries.py +147 -0
  86. package/src/superlocalmemory/optimize/cache/manager.py +2 -2
  87. package/src/superlocalmemory/optimize/compress/ccr.py +1 -1
  88. package/src/superlocalmemory/optimize/compress/router.py +1 -1
  89. package/src/superlocalmemory/optimize/proxy/_helpers.py +2 -2
  90. package/src/superlocalmemory/optimize/proxy/server.py +1 -1
  91. package/src/superlocalmemory/optimize/proxy/vertex_surface.py +2 -2
  92. package/src/superlocalmemory/optimize/storage/db.py +2 -2
  93. package/src/superlocalmemory/retrieval/agentic.py +1 -1
  94. package/src/superlocalmemory/retrieval/ann_index.py +9 -2
  95. package/src/superlocalmemory/retrieval/bm25_channel.py +2 -2
  96. package/src/superlocalmemory/retrieval/bridge_discovery.py +2 -2
  97. package/src/superlocalmemory/retrieval/engine.py +272 -43
  98. package/src/superlocalmemory/retrieval/entity_channel.py +1 -1
  99. package/src/superlocalmemory/retrieval/hopfield_channel.py +8 -2
  100. package/src/superlocalmemory/retrieval/profile_channel.py +1 -1
  101. package/src/superlocalmemory/retrieval/quantization_aware_search.py +1 -1
  102. package/src/superlocalmemory/retrieval/remote_reranker.py +2 -2
  103. package/src/superlocalmemory/retrieval/reranker.py +3 -3
  104. package/src/superlocalmemory/retrieval/semantic_channel.py +3 -3
  105. package/src/superlocalmemory/retrieval/spreading_activation.py +8 -8
  106. package/src/superlocalmemory/retrieval/strategy.py +94 -0
  107. package/src/superlocalmemory/retrieval/temporal_channel.py +167 -10
  108. package/src/superlocalmemory/retrieval/temporal_validity_filter.py +1 -1
  109. package/src/superlocalmemory/retrieval/vector_store.py +88 -10
  110. package/src/superlocalmemory/server/consolidation_runner.py +140 -0
  111. package/src/superlocalmemory/server/recall_serializer.py +44 -2
  112. package/src/superlocalmemory/server/routes/agents.py +52 -8
  113. package/src/superlocalmemory/server/routes/brain.py +110 -2
  114. package/src/superlocalmemory/server/routes/memories.py +153 -0
  115. package/src/superlocalmemory/server/routes/prewarm.py +4 -4
  116. package/src/superlocalmemory/server/routes/v3_api.py +24 -46
  117. package/src/superlocalmemory/server/unified_daemon.py +566 -7
  118. package/src/superlocalmemory/storage/_schema_version.py +46 -3
  119. package/src/superlocalmemory/storage/backup.py +531 -0
  120. package/src/superlocalmemory/storage/database.py +11 -4
  121. package/src/superlocalmemory/storage/embedding_codec.py +129 -0
  122. package/src/superlocalmemory/storage/embedding_migrator.py +5 -3
  123. package/src/superlocalmemory/storage/migration_runner.py +142 -2
  124. package/src/superlocalmemory/storage/migrations/__init__.py +1 -1
  125. package/src/superlocalmemory/storage/migrations.py +15 -1
  126. package/src/superlocalmemory/storage/models.py +7 -0
  127. package/src/superlocalmemory/storage/quantized_store.py +4 -2
  128. package/src/superlocalmemory/summaries/base.py +159 -0
  129. package/src/superlocalmemory/summaries/daily_reflection.py +55 -8
  130. package/src/superlocalmemory/summaries/project_work_log.py +23 -7
  131. package/src/superlocalmemory/summaries/session_summary.py +10 -6
  132. package/src/superlocalmemory/ui/css/legacy-dashboard.css +1 -1
  133. package/src/superlocalmemory/ui/css/neural-glass.css +1 -1
  134. package/src/superlocalmemory/ui/index.html +9 -3
  135. package/src/superlocalmemory/ui/js/core.js +1 -1
  136. package/src/superlocalmemory/ui/js/od-boundedloops.js +324 -0
  137. package/src/superlocalmemory/ui/js/od-brain.js +1 -1
  138. package/src/superlocalmemory/ui/js/od-memories.js +337 -12
  139. package/src/superlocalmemory/ui/js/od-mesh.js +97 -5
  140. package/src/superlocalmemory/ui/js/od-operations.js +1 -150
  141. package/src/superlocalmemory/ui/js/od-optimize.js +36 -9
  142. package/src/superlocalmemory/ui/js/od-shell.js +10 -0
package/CHANGELOG.md CHANGED
@@ -5,6 +5,224 @@ All notable changes to SuperLocalMemory will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [4.0.9] — Findable the moment you write it
9
+
10
+ ### Fixed
11
+ - **A memory you just wrote could not be found by asking for it.** Until a
12
+ background pass caught up, a new memory was reachable only by quoting its own
13
+ wording — which is not how anyone asks a question. "What am I working on"
14
+ shares no distinctive word with any particular note, so the memory describing
15
+ what you are doing right now was the hardest thing in the store to find. Every
16
+ way of storing one — command line, tool interface, dashboard — now makes it
17
+ searchable by meaning before it answers, bounded so that a slow or missing
18
+ model costs a short wait and never the write itself. The receipt says which of
19
+ three states a memory is in: stored, findable by its wording, findable by
20
+ meaning.
21
+ - **"What am I working on" answered with notes from a month ago.** Four separate
22
+ faults sat between the question and the answer. The present-tense path weighted
23
+ word-matching more heavily than the path it replaced, so a stale note
24
+ containing the word "working" beat a fresh one. A recency lookup was switched
25
+ off by an unrelated condition that is almost always true. A fact carrying
26
+ several dated events crowded out other recent facts with copies of itself. And
27
+ the lookup drew its candidates from a list that is only assembled later, and
28
+ only for notes that mention a recognisable name and a date — so a plain note
29
+ written seconds ago was not merely ranked low, it was not a candidate at all.
30
+ Recent notes are now read from the memories themselves. Questions about topics
31
+ still answer on topic — asking about the schema does not return whatever is
32
+ newest.
33
+ - **A memory could be reported as findable by meaning when it was not.** Two
34
+ things have to agree before a search on meaning can reach a memory, and one of
35
+ the two ways of storing one wrote them in the wrong order: if the second write
36
+ was refused — because the store was at a different size, or the search
37
+ extension was unavailable on the platform — the memory was left in a state that
38
+ reads as complete, so the pass that repairs missed memories skipped it forever
39
+ while the receipt claimed success. Both writes now happen in the one order that
40
+ is safe, through shared code rather than two copies of it, and if the second
41
+ fails the first is undone so the repair pass can retry. "Already findable" is
42
+ now decided by asking whether a search could actually return the memory.
43
+ - **Questions like "what is the latest authentication design" returned the newest
44
+ notes rather than an answer.** Two words routed any question containing them
45
+ down the time-based path, where a question with no recognisable name in it fell
46
+ back to listing recent memories with no regard for the topic. Asking what is
47
+ latest about something now answers about that something. "What am I currently
48
+ focused on" still answers with current work.
49
+ - **A question about a span of time missed anything recorded as spanning it.** An
50
+ entry describing a period rather than a moment carries no single date, and the
51
+ lookup for date-anchored questions required one — so "what happened in March
52
+ 2024" could not return an entry that says it covers March 2024.
53
+ - **The documented switch for turning the present-tense ranking off did nothing
54
+ when set in configuration.** It worked only as an environment variable, which
55
+ is not what it is documented as. Both now work, and the environment variable
56
+ still wins.
57
+ - **Converting a store could stop making progress instead of finishing.** A row
58
+ that cannot be converted — malformed, or the wrong size — was left in place and
59
+ then selected again on the next pass, so a single bad row meant the conversion
60
+ ran indefinitely without converting anything further. It now moves past what it
61
+ cannot convert, reports how many, and finishes.
62
+ - **Retention could delete half of a safety copy.** The two files taken before an
63
+ upgrade were sometimes counted as two separate copies rather than one, so
64
+ retention could keep one file of a pair and discard the other, leaving a copy
65
+ that cannot be restored from. Choosing the newest copy also relied on file
66
+ timestamps, which on some filesystems cannot tell two copies apart; it now uses
67
+ the timestamp in the name, which can.
68
+ - **An upgrade could be refused on a disk with room for it.** The space check
69
+ asked for roughly twice what the copy actually needs.
70
+ - **Retrying an upgrade that had failed did not take a fresh copy first.** A
71
+ failed step was treated as a finished one, so the retry ran against the
72
+ half-changed store with no new copy taken. The message now also says where the
73
+ copy from the first attempt is.
74
+ - **Shutting the service down could exceed its shutdown budget** and be killed
75
+ mid-write, because the workers that make new memories searchable were never
76
+ released. They are now released on shutdown, and a memory arriving during
77
+ shutdown is declined rather than starting new work.
78
+ - **A question about a particular time missed anything older than the most recent
79
+ few thousand events**, returning nothing rather than answering slowly.
80
+ - **`slm remember --sync` promised to wait and did not.** The flag is now
81
+ honoured, and asking to wait buys a longer attempt at making the memory
82
+ searchable.
83
+ - **A failed upgrade could report that your data was untouched when earlier steps
84
+ had already been applied.** The message now distinguishes a partial change from
85
+ no change, and points at the copy taken beforehand.
86
+ - **The copy taken before an upgrade could be deleted by a later start.** It was
87
+ being retaken on every ordinary start and pruned by retention, so two restarts
88
+ after an upgrade removed the last copy of the original. It is now taken only
89
+ when something is actually about to change.
90
+
91
+ ### Changed
92
+ - **Embeddings are stored in binary rather than text** — the same values to the
93
+ last decimal, five and a half times smaller. Existing stores are converted in
94
+ place; the conversion copies the store aside and verifies the copy first,
95
+ refuses while a service still holds it, and asks before rewriting anything.
96
+ - **Recall tail latency is roughly halved**, and the time a write may spend
97
+ making itself findable has been raised rather than lowered. Giving up early on
98
+ that was never free: it decided whether a memory could be found by asking a
99
+ question or only by quoting its own words. A retrieval channel is likewise
100
+ given more time to answer, because a channel that runs out of time contributes
101
+ nothing at all and the answer silently loses whatever only it could see. That
102
+ limit is now what it was always described as — a guard against one part of
103
+ retrieval getting stuck, set far above how long any of them actually takes,
104
+ rather than a cutoff that trims the wait by dropping part of the answer.
105
+ - **When part of an answer is missing, the reply now says which part.** If one
106
+ source of results has to be abandoned, its memories are absent from that
107
+ answer rather than merely late — so asking again can legitimately give
108
+ something better. Replies carry the list of anything that was abandoned, which
109
+ is empty on a healthy answer, so it is possible to tell an incomplete answer
110
+ from a changed one instead of guessing.
111
+ - **Asking the same question twice gives the same answer.** This had two
112
+ separate causes. Several points in retrieval ordered results by score alone,
113
+ so memories that scored equally were ranked by where they happened to sit on
114
+ disk or which thread finished first. And two stages that improve an answer —
115
+ one that brings in related memories, one that re-scores results by how they
116
+ connect to the things your question mentions — ran only if the answer was not
117
+ already taking too long. Both stages change which memory comes first, so
118
+ whether they ran decided the answer, and the time they were measured against
119
+ was close to how long a typical question takes anyway. The same question
120
+ asked twice took different paths depending on how busy the machine was, and
121
+ nothing in the reply said so. Ordering is now decided only by the data, and
122
+ those stages always run. Measured over 140 questions on a 1 GB store, asked
123
+ twice: the top answer changed on 15% of them before and 5.7% after, and the
124
+ top ten changed on 41% before and 13.6% after. Answering takes roughly a
125
+ tenth of a second longer.
126
+ - **A ranking adjustment for questions about time now actually affects the
127
+ order results come back in.** It was being calculated and then discarded.
128
+ - **Storing a memory stays inside its time budget.** The durable write and the
129
+ work that makes the memory findable by meaning run one after the other, and
130
+ each had been given the whole budget, so a slow write could push the reply to
131
+ several seconds. The second now takes what the first left.
132
+ - **Converting a store can no longer report success while storing nonsense.**
133
+ Two malformed shapes — a vector of one-element lists, and numbers too large to
134
+ represent — passed the size check and would have been written as garbage.
135
+ Both are now rejected and reported, and the memory keeps its original value.
136
+ - **A memory is no longer reported findable by meaning unless both of its stored
137
+ forms agree.** Either one alone could be present without the other, and each
138
+ case was invisible to the pass that repairs it.
139
+ - **Shutting the service down twice in one process no longer halves the capacity
140
+ that makes new memories findable.**
141
+ - **More of your memories can be reached at all.** One stage of retrieval decides
142
+ the final set of results, and the number of candidates handed to it had been cut
143
+ to save time — which quietly meant anything ranked below that cut could never be
144
+ returned, no matter how well it matched. The cut is undone. Recall spends a
145
+ little longer and can reach everything.
146
+ - **Questions about the past distinguish two days ago from a month ago again.**
147
+ The adjustment applied to time-based questions was capped so low that it landed
148
+ on the same value for everything inside about five weeks, so it could not tell
149
+ recent from distant. Note that this changes ranking order for such questions.
150
+ - Storing a memory reports whether it is searchable by meaning yet, so a caller
151
+ no longer has to assume.
152
+
153
+ ## [4.0.8] — Where you were actually looking
154
+
155
+ ### Added
156
+ - **Summaries reach agents and the dashboard.** 4.0.7 gave the summary layer a
157
+ command; an agent still had no way to ask for one, and neither did anyone
158
+ reading the dashboard. Adds the `get_memory_summary` tool and a **Summaries**
159
+ tab under Memories with Today, Yesterday, and a picker listing the projects
160
+ SuperLocalMemory has actually recorded activity in. Every result states how
161
+ many memories it was built from and how much it covered.
162
+ - **Bounded Loops has its own page**, alongside the other integrations. It shows
163
+ whether Bounded Loops is installed, which agreement the two products
164
+ negotiated, and which finished runs have been imported — and states plainly
165
+ that imported evidence is read-only: SuperLocalMemory never learns from it, no
166
+ file paths leave your workspace, and the tamper-evidence it carries is not the
167
+ same thing as independent verification.
168
+ - **Mesh shows its history**, not only who is connected this second. Sessions
169
+ leave the mesh when they end, so the page was empty between sessions even on a
170
+ machine with plenty of mesh activity.
171
+
172
+ ### Changed
173
+ - **Recall Lab is the first thing you see under Memories**, with example
174
+ questions to start from. Summaries sits next to it. The three browsing views
175
+ follow.
176
+
177
+ ### Fixed
178
+ - **Memory stopped learning from use.** Recall marks which memories it returned
179
+ so that later use can be credited back, but the mark never reached the
180
+ assistant, so nothing was ever credited. Every recall was scored as neither
181
+ good nor bad, which is why recall quality sat at its starting value and no
182
+ source ever showed a settled quality signal however much the memory was used.
183
+ - **The behavioural half of consolidation had never run.** Nothing triggered it,
184
+ and when it did run, two of its four steps failed without reporting anything.
185
+ SuperLocalMemory now runs it on a schedule while idle — never while you are
186
+ storing or recalling — and at session end.
187
+ - **"This project" summaries could not work.** The button sent no project, and
188
+ the answer was always an error. SuperLocalMemory installs once for your whole
189
+ machine, so a browser tab has no way to know which project you mean; it now
190
+ lists the ones it has seen.
191
+ - **Locally written summaries began with an apology.** The local model was never
192
+ told what it was writing, so it replied as if in a chat. It now returns the
193
+ summary and nothing else.
194
+ - **A summary built from nothing claimed to cover everything.** A project with
195
+ recorded activity but no saved facts is now reported as a partial view.
196
+ - **Multi-Agent Memory showed access tokens instead of agent names**, and because
197
+ one agent uses many tokens over time, a single agent appeared as dozens.
198
+ - **Optimize invented a chart.** The cache hit-rate graph drew a rising trend
199
+ generated from the current value rather than measured; no history is recorded,
200
+ so it is gone until there is something real to plot. "Tokens saved" was
201
+ labelled as a monthly figure with an upward arrow that nothing ever set — it is
202
+ a total since install, and now says so. The page also explains why its numbers
203
+ are zero while its switches are on.
204
+ - **One kind of memory pattern was never produced.** The query that finds it
205
+ asked for columns that do not exist, so it failed on every run and was skipped
206
+ silently.
207
+ - **Code links never appeared for anyone.** Two separate reasons. The pass that
208
+ creates them matched no facts at all on a real store — it looked for an empty
209
+ archive marker, while live facts carry `live`, so every fact was excluded. And
210
+ the panel that displayed them was the search-results view, not the memory
211
+ drawer people actually open. Both fixed; on a real store this produces 7,470
212
+ links across 3,603 memories.
213
+ - **"Atomic facts" always read "No atomic facts recorded for this memory."** The
214
+ drawer looked up child facts using the row's own id, but a row in that pane is
215
+ itself an atomic fact and its parent is a separate field. Records stored
216
+ directly, which have no parent, now say so rather than reporting missing data.
217
+ - **Summaries ignored your mode.** The command never passed the configuration, so
218
+ every summary took the no-model path — a Mode B user got Mode A output. Ollama
219
+ now writes them when configured, falling back if it is unavailable.
220
+ - **Summary highlights were unreadable.** Truncation counted characters but
221
+ ignored newlines, so one fact containing headings and blank lines rendered as
222
+ six lines and the list stopped being a list.
223
+ - **"Active entities" listed internal identifiers** instead of names. It now
224
+ reads `Fixed (127), Gateway (124)`.
225
+
8
226
  ## [4.0.7] — Reachable
9
227
 
10
228
  Everything here was already built. None of it could be used.
@@ -871,7 +1089,7 @@ Eight community pull requests merged after line-by-line review, plus fixes for t
871
1089
 
872
1090
  ## [3.6.14] - 2026-06-18 — Audit-hardened: memory bounds, cross-tenant cache isolation, atomic credentials
873
1091
 
874
- Shipped through two adversarial audit passes (Qualixar Iron Pattern Stages 8–9), validated against a green 5933-test suite under the real 3.12 runtime. Default single-machine behavior is unchanged.
1092
+ Default single-machine behavior is unchanged.
875
1093
 
876
1094
  ### Security
877
1095
 
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  </picture>
6
6
  </p>
7
7
 
8
- <h1 align="center">SuperLocalMemory V4.0.7</h1>
8
+ <h1 align="center">SuperLocalMemory V4.0.9</h1>
9
9
 
10
10
  <h2 align="center">Rent the LLM. Own the memory.</h2>
11
11
 
@@ -27,12 +27,12 @@ guarantee here is stated as a falsifiable invariant, tested under an adversarial
27
27
  negative control, and shipped with the harness that regenerates the evidence:
28
28
  <code>python benchmark/run_all.py --trials 200 --output-dir results/</code>. What each experiment
29
29
  does <em>not</em> exercise is stated too.</p>
30
- <p align="center"><code>v4.0.7</code> — one control plane: <strong>SLM-Mesh</strong> peer coordination · multi-scope memory (personal / shared / global) · profiles · Cache · Compress · 7-layer retrieval · code graph · Entity Explorer · skill evolution · Modes A/B/C · GDPR retention &amp; audit chain · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
30
+ <p align="center"><code>v4.0.9</code> — one control plane: <strong>SLM-Mesh</strong> peer coordination · multi-scope memory (personal / shared / global) · profiles · Cache · Compress · 7-layer retrieval · code graph · Entity Explorer · skill evolution · Modes A/B/C · GDPR retention &amp; audit chain · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
31
31
  Proxy: <code>slm wrap claude</code> &nbsp;·&nbsp; MCP: add <code>slm_compress</code> to your config &nbsp;·&nbsp; Skill: zero-config</p>
32
32
  <p align="center"><strong>Four public arXiv preprints</strong> · V4: <a href="https://arxiv.org/abs/2608.08253">arXiv:2608.08253</a> · companion archive: <a href="https://zenodo.org/records/21853302">Zenodo 21853302</a> (<a href="https://doi.org/10.5281/zenodo.21853302">DOI 10.5281/zenodo.21853302</a>) · prior preprints: <a href="https://arxiv.org/abs/2603.02240">2603.02240</a> · <a href="https://arxiv.org/abs/2603.14588">2603.14588</a> · <a href="https://arxiv.org/abs/2604.04514">2604.04514</a>.</p>
33
33
 
34
34
  <p align="center">
35
- <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/v4.0.7-Current_Release-2ea44f?style=for-the-badge&logo=checkmarx&logoColor=white" alt="v4.0.7 — Current Release"/></a>
35
+ <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/v4.0.9-Current_Release-2ea44f?style=for-the-badge&logo=checkmarx&logoColor=white" alt="v4.0.9 — Current Release"/></a>
36
36
  <a href="https://arxiv.org/abs/2608.08253"><img src="https://img.shields.io/badge/arXiv-2608.08253-b31b1b?style=for-the-badge&logo=arxiv&logoColor=white" alt="SuperLocalMemory 4.0 paper on arXiv:2608.08253"/></a>
37
37
  <a href="https://zenodo.org/records/21853302"><img src="https://img.shields.io/badge/Zenodo-10.5281%2Fzenodo.21853302-1682D4?style=for-the-badge&logo=zenodo&logoColor=white" alt="V4 paper on Zenodo: 10.5281/zenodo.21853302"/></a>
38
38
  <a href="https://arxiv.org/abs/2603.14588"><img src="https://img.shields.io/badge/arXiv-2603.14588-b31b1b?style=for-the-badge&logo=arxiv&logoColor=white" alt="arXiv Paper"/></a>
@@ -386,8 +386,8 @@ Full docs: [docs/multi-machine.md](docs/multi-machine.md) · [docs/distributed-d
386
386
  | **Python CLI + SDK** (primary) | Activate a Python virtual environment, then `python -m pip install superlocalmemory` | Python 3.11+; the `slm` CLI and importable SDK stay inside that environment |
387
387
  | **Repository clone — macOS/Linux** | `./scripts/install.sh install` | Research/contributor path; delegates to an existing uv or pipx installation |
388
388
  | **Repository clone — Windows** | `.\scripts\install.ps1 -Action Install` | Research/contributor path; delegates to an existing uv or pipx installation |
389
- | **Claude Code Plugin** (WP-06) | `/plugin marketplace add qualixar/superlocalmemory` then `/plugin install superlocalmemory@qualixar` | Self-bootstraps venv, isolated SLM_DATA_DIR, additive — 16-tool core. Ships the skills/agents/hooks/commands |
390
- | **Portable / IDE connect** (WP-08) | `slm connect <ide> [--here]` | Wire any IDE without reinstalling; `slm connect claude-code` → plugin pointer |
389
+ | **Claude Code Plugin** | `/plugin marketplace add qualixar/superlocalmemory` then `/plugin install superlocalmemory@qualixar` | Self-bootstraps venv, isolated SLM_DATA_DIR, additive — 16-tool core. Ships the skills/agents/hooks/commands |
390
+ | **Portable / IDE connect** | `slm connect <ide> [--here]` | Wire any IDE without reinstalling; `slm connect claude-code` → plugin pointer |
391
391
 
392
392
  After any install path: `slm setup` → `slm doctor` → `slm warmup` (optional, pre-downloads ~500MB embedding model).
393
393
 
@@ -433,7 +433,7 @@ Or: `claude mcp add --transport http superlocalmemory http://127.0.0.1:8765/mcp/
433
433
  { "mcpServers": { "superlocalmemory": { "command": "slm", "args": ["mcp"] } } }
434
434
  ```
435
435
 
436
- ### MCP Profiles (WP-01)
436
+ ### MCP Profiles
437
437
 
438
438
  Control tool surface via `SLM_MCP_PROFILE`:
439
439
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "superlocalmemory",
3
- "version": "4.0.7",
3
+ "version": "4.0.9",
4
4
  "description": "Local-first agent memory with MCP and an agent-native CLI. Documented clients include Claude Code, Cursor, and Windsurf.",
5
5
  "keywords": [
6
6
  "ai-memory",
@@ -15,5 +15,5 @@
15
15
  "mcpServers": "./.mcp.json",
16
16
  "name": "superlocalmemory",
17
17
  "repository": "https://github.com/qualixar/superlocalmemory",
18
- "version": "4.0.7"
18
+ "version": "4.0.9"
19
19
  }
package/plugin/CLAUDE.md CHANGED
@@ -1,4 +1,4 @@
1
- <!-- BEGIN SuperLocalMemory v4.0.7 -->
1
+ <!-- BEGIN SuperLocalMemory v4.0.9 -->
2
2
 
3
3
  ## SuperLocalMemory (SLM) — Agent Rules
4
4
 
@@ -39,6 +39,6 @@ slm-recall · slm-remember · slm-session · slm-status · slm-cache · slm-comp
39
39
  ### Subagents
40
40
  slm-memory-advisor (memory decisions, session hygiene, scope/profile guidance) · slm-optimize-advisor (context compression + KV cache) · slm-governance-advisor (scope/roles/compliance/GDPR)
41
41
 
42
- <!-- END SuperLocalMemory v4.0.7 -->
42
+ <!-- END SuperLocalMemory v4.0.9 -->
43
43
 
44
- SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later
44
+ SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
@@ -77,4 +77,4 @@ slm-scope · slm-governance · slm-profile · slm-remember · slm-recall
77
77
  # What NOT to do
78
78
  Never session_init twice; never forget without dry-run preview; never store secrets; never bypass role checks; never claim an erasure succeeded without verifying via recall.
79
79
 
80
- SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later
80
+ SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
@@ -68,4 +68,4 @@ assessment. The gate is the authority.
68
68
 
69
69
  ---
70
70
 
71
- SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later
71
+ SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
@@ -46,4 +46,4 @@ slm-recall · slm-remember · slm-session · slm-scope · slm-profile · slm-gov
46
46
  # What NOT to do
47
47
  Never session_init twice; never forget dry_run=False without reporting preview; never dump a whole file into remember; never invent a memory; never claim "saved" without success:true / clean CLI exit; never bypass scope or governance restrictions.
48
48
 
49
- SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later
49
+ SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
@@ -41,4 +41,4 @@ slm-compress · slm-cache · slm-status · slm-profile
41
41
  # What NOT to do
42
42
  Never compress code-for-edit/JSON-to-parse/<500 chars; never store secrets/ccr_ids; never let optimize failure block/alter the task; never claim a specific savings %; never carry ccr_ids across profile switches.
43
43
 
44
- SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later
44
+ SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
@@ -1 +1 @@
1
- superlocalmemory==4.0.7
1
+ superlocalmemory==4.0.9
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # ensure-venv.sh — WP-06 SuperLocalMemory plugin venv bootstrap
2
+ # ensure-venv.sh — SuperLocalMemory plugin venv bootstrap
3
3
  #
4
4
  # Called by Claude Code SessionStart hook. Idempotent: fast-path exits in <100ms
5
5
  # on repeat invocations when requirements.txt is unchanged.
@@ -145,4 +145,4 @@ These subcommands control daemon-level cache settings. They do not read or write
145
145
 
146
146
  ---
147
147
 
148
- SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later
148
+ SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
@@ -147,4 +147,4 @@ Content over 1 MB (1 000 000 bytes UTF-8) is processed but `reversible` is force
147
147
 
148
148
  ---
149
149
 
150
- SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later
150
+ SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
@@ -245,4 +245,4 @@ Before running any destructive operation (`forget`, `compact_memories`):
245
245
 
246
246
  ---
247
247
 
248
- *SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later*
248
+ *SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later*
@@ -312,4 +312,4 @@ profile. See `slm-profile` for the full profile switching workflow.
312
312
 
313
313
  ---
314
314
 
315
- SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later
315
+ SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
@@ -96,4 +96,4 @@ paused, name the approval needed; when errored, quote the short detail.
96
96
 
97
97
  ---
98
98
 
99
- SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later
99
+ SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
@@ -279,4 +279,4 @@ mesh availability.
279
279
 
280
280
  ---
281
281
 
282
- *SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later*
282
+ *SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later*
@@ -146,4 +146,4 @@ Name them differently in your MCP config (e.g. `superlocalmemory-personal` and
146
146
 
147
147
  ---
148
148
 
149
- *SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later*
149
+ *SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later*
@@ -236,4 +236,4 @@ before recalling, then switch back. See `slm-profile` for workspace switching.
236
236
 
237
237
  ---
238
238
 
239
- *SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later*
239
+ *SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later*
@@ -238,4 +238,4 @@ different workspace, use `switch_profile` first. See `slm-profile`.
238
238
 
239
239
  ---
240
240
 
241
- *SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later*
241
+ *SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later*
@@ -173,4 +173,4 @@ to review the impact. See `slm-remember` for the full deletion discipline.
173
173
 
174
174
  ---
175
175
 
176
- *SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later*
176
+ *SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later*
@@ -227,4 +227,4 @@ explicitly and call `recall` with `include_global`/`include_shared` after
227
227
 
228
228
  ---
229
229
 
230
- *SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later*
230
+ *SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later*
@@ -61,7 +61,7 @@ If `cache_kv_hits` is 0 after repeated work, verify key naming consistency (the
61
61
  slm status [--json] [--verbose]
62
62
  ```
63
63
 
64
- Reports system-level state — not optimization counters. Canonical fields (WP-02):
64
+ Reports system-level state — not optimization counters. Canonical fields:
65
65
 
66
66
  - **mode** — active operation mode (e.g. `local`)
67
67
  - **profile** — current memory profile name
@@ -101,7 +101,7 @@ Do not rely on the human-readable format for parsing — always use `--json` whe
101
101
  slm doctor [--json] [--quick]
102
102
  ```
103
103
 
104
- Preflight check covering dependencies, embedding worker, daemon connectivity, and Surface B health. The **"Optimize (Surface B)"** line (WP-03) confirms whether the compression and cache subsystem initialised correctly.
104
+ Preflight check covering dependencies, embedding worker, daemon connectivity, and Surface B health. The **"Optimize (Surface B)"** line confirms whether the compression and cache subsystem initialised correctly.
105
105
 
106
106
  `--quick` skips the daemon and embedding probes — runs only dependency and config checks; faster but incomplete.
107
107
 
@@ -163,4 +163,4 @@ multi-profile setup. To switch the active profile, see `slm-profile`.
163
163
 
164
164
  ---
165
165
 
166
- SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later
166
+ SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
@@ -129,4 +129,4 @@ When the SLM MCP server is unavailable, use these CLI equivalents:
129
129
  - **slm-optimize-advisor** — context compression and KV cache
130
130
  - **slm-governance-advisor** — scope/role compliance, retention policies, GDPR
131
131
 
132
- SuperLocalMemory v4.0.7 · Qualixar · AGPL-3.0-or-later
132
+ SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
@@ -61,7 +61,7 @@ If `cache_kv_hits` is 0 after repeated work, verify key naming consistency (the
61
61
  slm status [--json] [--verbose]
62
62
  ```
63
63
 
64
- Reports system-level state — not optimization counters. Canonical fields (WP-02):
64
+ Reports system-level state — not optimization counters. Canonical fields:
65
65
 
66
66
  - **mode** — active operation mode (e.g. `local`)
67
67
  - **profile** — current memory profile name
@@ -101,7 +101,7 @@ Do not rely on the human-readable format for parsing — always use `--json` whe
101
101
  slm doctor [--json] [--quick]
102
102
  ```
103
103
 
104
- Preflight check covering dependencies, embedding worker, daemon connectivity, and Surface B health. The **"Optimize (Surface B)"** line (WP-03) confirms whether the compression and cache subsystem initialised correctly.
104
+ Preflight check covering dependencies, embedding worker, daemon connectivity, and Surface B health. The **"Optimize (Surface B)"** line confirms whether the compression and cache subsystem initialised correctly.
105
105
 
106
106
  `--quick` skips the daemon and embedding probes — runs only dependency and config checks; faster but incomplete.
107
107
 
package/pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superlocalmemory"
3
- version = "4.0.7"
3
+ version = "4.0.9"
4
4
  description = "Local-first agent memory with auditable hybrid retrieval"
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-or-later"
@@ -201,6 +201,10 @@ function main(argv = process.argv.slice(2)) {
201
201
  console.log(`SuperLocalMemory ${packageVersion}: isolated runtime verified.`);
202
202
  console.log('No memory database, IDE hooks, daemon, configuration, or models were changed.');
203
203
  console.log('');
204
+ console.log(' Your database will be automatically migrated on first run.');
205
+ console.log(' A backup is created in ~/.superlocalmemory/pre-migration-snapshots/ before');
206
+ console.log(' any migration runs. No action is needed from you.');
207
+ console.log('');
204
208
  console.log(' Next step — run the guided setup (picks your mode, downloads');
205
209
  console.log(' models, connects your IDEs). Takes about a minute:');
206
210
  console.log('');
@@ -32,7 +32,7 @@ if "OMP_NUM_THREADS" not in os.environ:
32
32
  os.environ["OMP_NUM_THREADS"] = "2"
33
33
  # ---------------------------------------------------------------------------
34
34
 
35
- __version__ = "4.0.7"
35
+ __version__ = "4.0.9"
36
36
 
37
37
  _REQUIRED_VERSIONS = {
38
38
  "sentence_transformers": "5.3.0",
@@ -2,7 +2,7 @@
2
2
  # Licensed under AGPL-3.0-or-later - see LICENSE file
3
3
  # Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
4
4
 
5
- """WP-07 — Lazy first-run initialisation (pip cross-install).
5
+ """Lazy first-run initialisation for pip cross-installs.
6
6
 
7
7
  Lightweight import only — zero heavy imports, STDOUT-SILENT.
8
8