superlocalmemory 4.0.9 → 4.1.0

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 (165) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +245 -0
  3. package/README.md +7 -7
  4. package/package.json +4 -2
  5. package/plugin/.claude-plugin/plugin.json +2 -2
  6. package/plugin/CLAUDE.md +3 -3
  7. package/plugin/agents/slm-governance-advisor.md +1 -1
  8. package/plugin/agents/slm-loop-runner.md +4 -4
  9. package/plugin/agents/slm-memory-advisor.md +1 -1
  10. package/plugin/agents/slm-optimize-advisor.md +1 -1
  11. package/plugin/requirements.txt +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 +2 -2
  17. package/plugin/skills/slm-mesh/SKILL.md +1 -1
  18. package/plugin/skills/slm-profile/SKILL.md +5 -5
  19. package/plugin/skills/slm-recall/SKILL.md +102 -15
  20. package/plugin/skills/slm-remember/SKILL.md +35 -3
  21. package/plugin/skills/slm-scope/SKILL.md +1 -1
  22. package/plugin/skills/slm-session/SKILL.md +29 -3
  23. package/plugin/skills/slm-status/SKILL.md +1 -1
  24. package/plugin-src/rules/AGENTS.md +16 -8
  25. package/plugin-src/skills/slm-cache/SKILL.md +1 -1
  26. package/plugin-src/skills/slm-compress/SKILL.md +1 -1
  27. package/plugin-src/skills/slm-governance/SKILL.md +1 -1
  28. package/plugin-src/skills/slm-graph/SKILL.md +1 -1
  29. package/plugin-src/skills/slm-loop/SKILL.md +2 -2
  30. package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
  31. package/plugin-src/skills/slm-profile/SKILL.md +5 -5
  32. package/plugin-src/skills/slm-recall/SKILL.md +102 -15
  33. package/plugin-src/skills/slm-remember/SKILL.md +35 -3
  34. package/plugin-src/skills/slm-scope/SKILL.md +1 -1
  35. package/plugin-src/skills/slm-session/SKILL.md +29 -3
  36. package/plugin-src/skills/slm-status/SKILL.md +1 -1
  37. package/pyproject.toml +1 -1
  38. package/src/superlocalmemory/__init__.py +1 -1
  39. package/src/superlocalmemory/cli/commands.py +308 -20
  40. package/src/superlocalmemory/cli/daemon.py +30 -0
  41. package/src/superlocalmemory/cli/db_migrate.py +71 -1
  42. package/src/superlocalmemory/cli/gdpr_cmd.py +15 -2
  43. package/src/superlocalmemory/cli/main.py +26 -4
  44. package/src/superlocalmemory/code_graph/bridge/maintenance.py +8 -0
  45. package/src/superlocalmemory/code_graph/database.py +44 -0
  46. package/src/superlocalmemory/compliance/gdpr.py +449 -39
  47. package/src/superlocalmemory/core/admission.py +231 -11
  48. package/src/superlocalmemory/core/backend_orchestrator.py +190 -84
  49. package/src/superlocalmemory/core/config.py +90 -11
  50. package/src/superlocalmemory/core/consolidation_engine.py +34 -0
  51. package/src/superlocalmemory/core/engine.py +140 -11
  52. package/src/superlocalmemory/core/fact_consolidator.py +316 -125
  53. package/src/superlocalmemory/core/graph_analyzer.py +76 -112
  54. package/src/superlocalmemory/core/graph_metrics.py +597 -0
  55. package/src/superlocalmemory/core/graph_pruner.py +121 -0
  56. package/src/superlocalmemory/core/maintenance.py +44 -6
  57. package/src/superlocalmemory/core/maintenance_scheduler.py +205 -0
  58. package/src/superlocalmemory/core/memory_health.py +266 -0
  59. package/src/superlocalmemory/core/mode_capability.py +111 -0
  60. package/src/superlocalmemory/core/ollama_validator.py +315 -0
  61. package/src/superlocalmemory/core/operation_policy_registry.py +1 -1
  62. package/src/superlocalmemory/core/operation_request.py +1 -1
  63. package/src/superlocalmemory/core/ops_remediation.py +2 -2
  64. package/src/superlocalmemory/core/projection_drain.py +380 -0
  65. package/src/superlocalmemory/core/recall_pipeline.py +390 -3
  66. package/src/superlocalmemory/core/recall_worker.py +6 -3
  67. package/src/superlocalmemory/core/scale_autopromote.py +196 -0
  68. package/src/superlocalmemory/core/scale_engine.py +16 -2
  69. package/src/superlocalmemory/core/score_contract.py +21 -1
  70. package/src/superlocalmemory/core/session_identity.py +85 -0
  71. package/src/superlocalmemory/core/status_contract.py +108 -0
  72. package/src/superlocalmemory/core/store_pipeline.py +78 -3
  73. package/src/superlocalmemory/core/worker_pool.py +4 -4
  74. package/src/superlocalmemory/core/working_memory.py +288 -0
  75. package/src/superlocalmemory/encoding/cognitive_consolidator.py +51 -7
  76. package/src/superlocalmemory/encoding/context_generator.py +1 -1
  77. package/src/superlocalmemory/encoding/entity_resolver.py +38 -0
  78. package/src/superlocalmemory/encoding/fact_extractor.py +18 -14
  79. package/src/superlocalmemory/encoding/prospective_markers.py +262 -0
  80. package/src/superlocalmemory/encoding/type_router.py +12 -12
  81. package/src/superlocalmemory/evolution/mutation_generator.py +30 -4
  82. package/src/superlocalmemory/graph/cozo_adjacency.py +122 -0
  83. package/src/superlocalmemory/graph/cozo_backend.py +103 -138
  84. package/src/superlocalmemory/hooks/portable_kit.py +10 -2
  85. package/src/superlocalmemory/learning/bandit.py +43 -0
  86. package/src/superlocalmemory/learning/consolidation_worker.py +54 -0
  87. package/src/superlocalmemory/learning/database.py +60 -3
  88. package/src/superlocalmemory/learning/entity_compiler.py +21 -58
  89. package/src/superlocalmemory/learning/feedback.py +3 -1
  90. package/src/superlocalmemory/learning/outcomes.py +47 -16
  91. package/src/superlocalmemory/learning/pattern_miner.py +28 -3
  92. package/src/superlocalmemory/learning/pattern_miner_constants.py +43 -0
  93. package/src/superlocalmemory/learning/pcos.py +291 -0
  94. package/src/superlocalmemory/learning/reward_from_outcomes.py +365 -0
  95. package/src/superlocalmemory/learning/reward_proxy.py +100 -10
  96. package/src/superlocalmemory/learning/signal_kinds.py +79 -0
  97. package/src/superlocalmemory/mcp/profiles.py +14 -2
  98. package/src/superlocalmemory/mcp/server.py +1 -1
  99. package/src/superlocalmemory/mcp/session_binding.py +92 -0
  100. package/src/superlocalmemory/mcp/tools_active.py +2 -1
  101. package/src/superlocalmemory/mcp/tools_core.py +71 -42
  102. package/src/superlocalmemory/mcp/tools_ops.py +2 -2
  103. package/src/superlocalmemory/mcp/tools_v28.py +20 -1
  104. package/src/superlocalmemory/parameterization/pattern_extractor.py +14 -1
  105. package/src/superlocalmemory/parameterization/soft_prompt_generator.py +98 -0
  106. package/src/superlocalmemory/retrieval/bm25_channel.py +68 -11
  107. package/src/superlocalmemory/retrieval/channel_status.py +117 -0
  108. package/src/superlocalmemory/retrieval/engine.py +106 -11
  109. package/src/superlocalmemory/retrieval/entity_channel.py +217 -257
  110. package/src/superlocalmemory/retrieval/graph_adjacency.py +219 -0
  111. package/src/superlocalmemory/retrieval/scope_policy.py +42 -1
  112. package/src/superlocalmemory/retrieval/semantic_channel.py +47 -5
  113. package/src/superlocalmemory/retrieval/spreading.py +288 -0
  114. package/src/superlocalmemory/retrieval/temporal_channel.py +13 -1
  115. package/src/superlocalmemory/retrieval/vector_store.py +63 -0
  116. package/src/superlocalmemory/server/api.py +26 -2
  117. package/src/superlocalmemory/server/asset_versions.py +171 -0
  118. package/src/superlocalmemory/server/bandit_loops.py +17 -1
  119. package/src/superlocalmemory/server/rbac_enforce.py +26 -6
  120. package/src/superlocalmemory/server/recall_serializer.py +9 -0
  121. package/src/superlocalmemory/server/routes/abstraction.py +201 -0
  122. package/src/superlocalmemory/server/routes/behavioral.py +75 -10
  123. package/src/superlocalmemory/server/routes/compliance.py +98 -18
  124. package/src/superlocalmemory/server/routes/config_api.py +186 -4
  125. package/src/superlocalmemory/server/routes/data_io.py +29 -1
  126. package/src/superlocalmemory/server/routes/entity.py +13 -1
  127. package/src/superlocalmemory/server/routes/evolution.py +178 -0
  128. package/src/superlocalmemory/server/routes/ingest.py +8 -0
  129. package/src/superlocalmemory/server/routes/learning_telemetry.py +2 -1
  130. package/src/superlocalmemory/server/routes/memories.py +49 -7
  131. package/src/superlocalmemory/server/routes/mesh.py +1 -1
  132. package/src/superlocalmemory/server/routes/timeline.py +4 -0
  133. package/src/superlocalmemory/server/routes/v3_api.py +193 -17
  134. package/src/superlocalmemory/server/ui.py +24 -1
  135. package/src/superlocalmemory/server/unified_daemon.py +292 -9
  136. package/src/superlocalmemory/storage/_migration_internals.py +35 -0
  137. package/src/superlocalmemory/storage/_schema_version.py +24 -3
  138. package/src/superlocalmemory/storage/database.py +598 -82
  139. package/src/superlocalmemory/storage/embedding_codec.py +71 -0
  140. package/src/superlocalmemory/storage/lineage_retention.py +236 -0
  141. package/src/superlocalmemory/storage/logical_edges.py +43 -2
  142. package/src/superlocalmemory/storage/migration_runner.py +130 -0
  143. package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +488 -0
  144. package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +127 -0
  145. package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +158 -0
  146. package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +620 -0
  147. package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +306 -0
  148. package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +207 -0
  149. package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +201 -0
  150. package/src/superlocalmemory/storage/migrations.py +18 -2
  151. package/src/superlocalmemory/storage/models.py +40 -1
  152. package/src/superlocalmemory/storage/projection_outbox.py +346 -0
  153. package/src/superlocalmemory/storage/retention_policy.py +860 -0
  154. package/src/superlocalmemory/storage/schema.py +110 -1
  155. package/src/superlocalmemory/storage/write_coordinator.py +19 -2
  156. package/src/superlocalmemory/summaries/base.py +1 -1
  157. package/src/superlocalmemory/summaries/non_answer.py +223 -0
  158. package/src/superlocalmemory/trust/scorer.py +43 -1
  159. package/src/superlocalmemory/ui/index.html +10 -19
  160. package/src/superlocalmemory/ui/js/event-delegation.js +12 -1
  161. package/src/superlocalmemory/ui/js/od-health.js +28 -6
  162. package/src/superlocalmemory/ui/js/od-memories.js +209 -1
  163. package/src/superlocalmemory/ui/js/od-ops-health.js +1 -1
  164. package/src/superlocalmemory/ui/js/od-settings.js +87 -1
  165. package/src/superlocalmemory/ui/js/recall-lab.js +78 -3
@@ -9,7 +9,7 @@
9
9
  "author": {
10
10
  "name": "Qualixar"
11
11
  },
12
- "description": "Local-first agent memory + reversible context compression and KV cache, as an MCP server. 21-tool code profile with graph intelligence.",
12
+ "description": "Local-first agent memory + reversible context compression and KV cache, as an MCP server. 34-tool code profile with graph intelligence.",
13
13
  "name": "superlocalmemory",
14
14
  "source": "./plugin"
15
15
  }
package/CHANGELOG.md CHANGED
@@ -5,6 +5,251 @@ 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.1.0] — Every door asks the same question
9
+
10
+ ### Fixed
11
+ - **Nothing was recording which memories a recall actually returned, so nothing
12
+ could learn from it.** The step that notes "these memories were shown, for this
13
+ question, in this session" had no caller anywhere — a worker started with the
14
+ service and waited for events that were never sent. On a real store that left
15
+ every one of 162 recorded outcomes with no way to trace back to the recall that
16
+ produced it, every per-memory usefulness score sitting at its untouched
17
+ starting value, and the ranking model unchanged for eleven weeks. Recalls now
18
+ leave that record. It costs 1.6 microseconds and is written outside the reply,
19
+ so recall returns the same answers in the same time — measured across 30 warmed
20
+ queries, the difference was 3.5 ms in favour of the change, which is to say
21
+ none. It records only: whether what is learned may reorder your results remains
22
+ a separate setting that stays off unless you turn it on.
23
+ - **Memories stored since the last graph analysis were ranked as unconnected.**
24
+ Recall weighs a memory partly by where it sits in your knowledge graph. That
25
+ position was only recalculated when a consolidation happened to run or you
26
+ asked for it by hand, so on a real store 1,036 of 4,034 memories had no
27
+ position recorded — including every memory from the previous four days. They
28
+ were still found, then ranked as though nothing linked to them. The
29
+ calculation now runs on a schedule and again shortly after startup, it covers
30
+ every memory including ones with no links yet, and it no longer ranks memories
31
+ the store is not allowed to return, which had been diluting the scores of the
32
+ ones it can.
33
+ - **One small calculation could push a handful of memories above everything
34
+ else.** A separate routine gave every memory in a group the same score and
35
+ wrote it where the ranking reads. On a real store that score was more than ten
36
+ times the highest genuine one, so those memories took the largest ranking
37
+ bonus available for no reason beyond having shared a subject with a few
38
+ others. It has been removed; nothing depended on it.
39
+ - **Turning on per-user access did not apply to agent connections.** Company
40
+ mode is set from the dashboard, and the setting it writes was read by the web
41
+ interface but not by the connection your AI tools use — so with per-user access
42
+ on, two users configured, and one of them restricted to read-only, a write
43
+ arriving over the tool connection was accepted as the machine owner while the
44
+ same write through the dashboard was refused. Both now read the same setting,
45
+ and a tool connection that cannot identify who is calling is refused. Personal,
46
+ single-user use is unchanged and needs no login.
47
+ - **The settings could claim a storage engine that was not there.** A store
48
+ recorded the fast graph and vector engines as active with neither present on
49
+ disk and nothing in progress to explain it, so the dashboard reported one thing
50
+ while retrieval used another, on every restart. The claim is now checked
51
+ against what is actually on disk when the service starts, and dropped if there
52
+ is nothing behind it. Nothing is disabled: an engine that is installed is still
53
+ detected and used.
54
+ - **A note about which schema versions had been applied was stored thousands of
55
+ times over.** Seven versions were recorded as 3,496 rows on one store and
56
+ 234,348 on another, because the six places that write it all assumed a
57
+ uniqueness rule the table did not have. The rule is now there, so those writes
58
+ do what they always intended, and the duplicates are collapsed to one row each
59
+ keeping the original date.
60
+ - **A second workspace could take over a memory belonging to the first.** Where
61
+ two workspaces on one store were handed the same identifier for a memory or a
62
+ fact — an import keyed on an external record id, feeding one source into two
63
+ workspaces, does exactly this — the later write could claim the first
64
+ workspace's entry outright: new owner, new content, and the notes attached to
65
+ it discarded, with nothing raised. Whether it was refused or went through in
66
+ silence depended on unrelated details of the entry, so neither outcome could
67
+ be relied on. A write that would move an entry from one workspace to another
68
+ is now refused, and says which workspace owns it.
69
+
70
+ - **Restricting someone to read-only did not restrict every way in.** Per-user
71
+ access was applied where a memory is written, and not where one is deleted or
72
+ corrected over the network, not on four of the compliance controls, and not on
73
+ bulk import — which established who was calling and then never asked whether
74
+ they were allowed to write. Three ways of reading stored memories back asked
75
+ nothing at all. Every entrance now asks the same question of the same setting.
76
+ - **A workspace that could not answer "what is this person allowed to do?"
77
+ assumed the most permissive answer.** If that lookup failed — a busy store, a
78
+ locked file — the caller was treated as able to write. A lookup that fails is
79
+ not a lookup that said yes; it is now refused outright and says so, and the
80
+ caller can retry.
81
+ - **Deleting a memory left its connections behind.** The connections were
82
+ expected to be removed along with it and nothing removed them, so recall kept
83
+ walking links to memories that no longer existed. Both kinds of connection are
84
+ now removed with the memory. Erasing a person had the same shape: their entry
85
+ was removed from the store and left in the copy that search reads, name and
86
+ all, which is not what an erasure request means.
87
+ - **Housekeeping could remove connections it had no way to announce.** If the
88
+ copy that search reads could not be told what had gone, the removal was
89
+ committed anyway and the two drifted apart silently. It is now undone and
90
+ retried instead. `slm db regraph` rebuilds that copy from the store if they
91
+ have already drifted.
92
+ - **A request to be told what is held about you left out what had been learned
93
+ about how you work.** Erasure removed it; the export did not include it. Both
94
+ now cover the same ground.
95
+ - **Storing a memory waited on a model that was still loading.** A write
96
+ computes the memory's vector on the spot so it can be found by asking a
97
+ question rather than only by quoting its own words, and gives that one second
98
+ before handing the job to the background worker. It started that wait even
99
+ when the model had not loaded, which it could never win — loading takes about
100
+ ten seconds. On a copy of a real store the first twelve writes after a fresh
101
+ start took a median of 1,055 ms and eleven stored no vector; they now take
102
+ 34 ms. Writes against a loaded model are unchanged at about 75 ms. The service
103
+ now loads the model on startup, in the background, so the wait is not simply
104
+ moved onto whoever searches first.
105
+ - **The dashboard reported "Healthy" whenever the service answered at all**, and
106
+ the page never reloaded after an upgrade because the version it looked for was
107
+ never filled in — so an upgraded install kept showing the previous version's
108
+ page until someone cleared their cache by hand. Both fixed; the card now
109
+ reports what the service is actually doing, including how far the search copy
110
+ is behind.
111
+ - **An unrecognised result was recorded as a mildly positive one.** A client
112
+ reporting "ok" instead of one of the three accepted words had that counted as
113
+ partial success and fed to the ranking as though somebody had meant it. It is
114
+ now refused. An answer can also be reported on by name: recall returns an
115
+ identifier and a result quoting it is matched to that exact answer rather than
116
+ guessed at from overlap within a time window.
117
+ - **A hosted model was reported as available before a key was set for it.**
118
+ Switching to Mode C names a provider and leaves the key empty until you supply
119
+ one, and every surface said nothing was wrong while each model-backed feature
120
+ was about to fall back to assembling from your notes. It now says which step
121
+ is missing.
122
+ - **Repeated failures in a background task looked the same as one hiccup.** A
123
+ step failing every cycle for days reported exactly what a single transient
124
+ failure reported. It now says how long it has been failing.
125
+ - **Upgrading a large store could appear to hang.** Collapsing duplicated
126
+ schema-version records compared every record against every other of the same
127
+ version; on a store with 234,348 of them that had not finished after 25
128
+ minutes. It now takes 324 ms, and the whole upgrade of that store takes 40
129
+ seconds with every memory, fact and connection preserved.
130
+ - **A refusal from the service was reported as a crash.** Commands that were
131
+ correctly denied printed a stack trace instead of the reason, and one denial
132
+ told users to run a command that does not exist.
133
+ - **`slm connect claude-code` told you to run a command that does not exist.**
134
+ It pointed at `slm plugin install`; there is no `slm plugin` subcommand, so
135
+ the only instruction it gave ended in an error with nothing else offered. It
136
+ now names the two Claude Code commands that actually install the plugin, and
137
+ the setup wizard that runs both for you. Reported by @barrygfox (#123).
138
+ - **The bridge install in the IDE guide named a package that is not on npm.**
139
+ `@modelcontextprotocol/client-cli` has never existed, so the documented
140
+ install could not produce the `mcp-remote` binary that the config we write
141
+ points at. All three places now name `mcp-remote`, which does provide it.
142
+ Reported by @tonydzi (#122).
143
+ - **Two settings did not survive a restart.** The consistency threshold and the
144
+ per-channel retrieval weights were never written to the config file and never
145
+ read back, so tuning either one — by hand or by switching mode — lasted until
146
+ the next restart and then reverted to the default with nothing said. Both are
147
+ now saved and restored, a pair stays a pair through the file, and a section
148
+ someone has hand-edited into nonsense falls back to defaults instead of
149
+ stopping `slm` from running. Reported by @barrygfox (#124).
150
+ - **A migration failure said which, never why.** A migration recorded complete
151
+ is re-checked by its own verification on every start; when that check stops
152
+ passing, the log still reads complete while the health endpoint reports a
153
+ failure, and nothing said the two were answering different questions. The
154
+ health output now carries the reason for each failure, and `slm db migrate
155
+ --status` marks any migration whose recorded state and actual end-state
156
+ disagree instead of only reprinting the log. Reported by @unfall103-debug
157
+ (#125).
158
+ ### Changed
159
+ - **Every table that only grows now has a stated limit, or states why it has
160
+ none.** Three of them had a cleanup routine, each written and wired
161
+ separately; the fourth was found by reading a disk-usage report and the fifth
162
+ by reading the fourth. All 45 are now declared in one place with the reasoning
163
+ attached, one pass enforces them, and a table added without a decision is
164
+ something the tests can see. On a real store the first pass removed 7,342 rows
165
+ in 0.4 s, and 123,918 on a larger one — the biggest single group being 83,623
166
+ records describing memories that had already been deleted.
167
+ Nothing that holds your memories, your corrections, an erasure record, or the
168
+ feedback that improves ranking is touched; each of those says so explicitly.
169
+ Two tables are recorded as growing faster than the store with no rule decided
170
+ yet, rather than being quietly given one.
171
+ - **Recall assembles your knowledge graph from the graph store.** On a store with
172
+ 208,000 connections that assembly took 2.5 seconds and now takes 0.4. It runs
173
+ whenever the graph changes, so it was on the path of a recall. The answers are
174
+ the same — every probe query returns the same memories with the same scores
175
+ from either source. Recalls that also span shared or global memories continue
176
+ to read SQLite, which is the only store that holds them.
177
+
178
+ ## [4.0.10] — Your memories, not the summarizer's
179
+
180
+ ### Fixed
181
+ - **A background pass had been writing its own summaries into your memory, and
182
+ they answered your questions.** SuperLocalMemory groups related memories and
183
+ writes a short summary of each group, meant for the dashboard. Since June
184
+ those summaries were being stored as memories, where they competed with your
185
+ own notes — and won, because each one carried the combined subjects of
186
+ everything it summarised and so looked more connected than any single note you
187
+ had written. Asked what you were working on, a store could answer with the
188
+ summarizer apologising for having nothing to say. Summaries now live
189
+ separately and are shown on the dashboard only. They are never returned as
190
+ answers, by any route: recall, search, the recent list, pinned context, an
191
+ export, or the memory count.
192
+ - **Summarising a group set aside the memories in it.** That made sense while
193
+ the summary stood in for them in your answers. It does not now, so it has
194
+ stopped — and upgrading brings back the memories it had already set aside.
195
+ Where a store had been running long enough for those memories to have faded on
196
+ their own, they are restored to whatever standing their own history warrants,
197
+ not promoted.
198
+ - **Upgrading repairs an affected store by itself.** No commands, no files to
199
+ edit. A verified backup is taken first, the repair is safe to interrupt and
200
+ safe to repeat, and it reports in plain language what it changed. It also
201
+ keeps checking: if the problem ever reappears, the next start handles it.
202
+ - **The setting that turns summarising off did nothing.** It has been
203
+ documented and ignored since it was added.
204
+ - **A summary that is a refusal is no longer stored as one.** When a group has
205
+ nothing in common, a model does not fail — it answers in prose, and that prose
206
+ was indistinguishable from a summary to anything that only checked whether
207
+ text came back. Model output is now cleaned of chat framing and rejected if it
208
+ turns out to be about the request rather than about your memories. A summary
209
+ assembled from your own sentences is exempt, so a note that happens to be
210
+ phrased like a chatbot is not thrown away.
211
+ - **A summary of a group could pull real memories into a later grouping pass
212
+ and set them aside with it.**
213
+ - **Summarising an unchanged group repeated its work indefinitely**, including
214
+ calling a language model to regenerate text it already had. It now recognises
215
+ that nothing has changed and stops.
216
+ - **An exported backup carried the summaries**, and importing it would have
217
+ turned them back into memories on a machine where nothing was wrong.
218
+ - **A memory can now be dated to when it happened**, not just to when it was
219
+ written. Everything was previously stamped with its ingestion date, so a note
220
+ written today about something from March filed itself under today. A date that
221
+ cannot be understood is refused rather than quietly dropped.
222
+ - **A dated memory is now findable by its date even when nothing in it was
223
+ recognised as a name.** Roughly a quarter of a typical store was reachable
224
+ only by being recent, rather than by being about the right time.
225
+ - **Stored memories now record which conversation they came from.** Reading
226
+ memories worked this out; writing them did not, so almost nothing carried it —
227
+ which left the feature that spreads an answer across different conversations
228
+ with nothing to work with.
229
+
230
+ ### Added
231
+ - **`slm doctor` and the dashboard now tell you whether your memories can
232
+ actually be found**, with the counts behind the answer: how many you have, how
233
+ many are searchable by meaning, and how many are being held back and why. This
234
+ was previously unknowable without writing your own queries against the
235
+ database — one machine ran for months with 44% of its memory unreachable while
236
+ every status line said it was healthy.
237
+ - **A Knowledge Overview on the Summaries tab.** What your memory knows, how
238
+ many memories each summary covers, and the stretch of time it spans. Summaries
239
+ that came back empty are counted rather than shown, and near-identical ones
240
+ are collapsed, so the page reflects what is there instead of padding itself.
241
+
242
+ ### Changed
243
+ - **Searching by meaning no longer spends its results on held-back summaries.**
244
+ On a store with a lot of them, a question close to their subject matter could
245
+ come back with nothing usable at all while appearing to have answered.
246
+ - **The startup repair no longer reports itself finished while memories remain
247
+ unsearchable.** It says how many are left, why, and that it will retry — and
248
+ it does retry, instead of recording success and never looking again.
249
+ - **Dashboard files now carry a version taken from their own contents**, so a
250
+ changed script or stylesheet is always served as a new address. The version
251
+ numbers were maintained by hand and had stopped matching the files they named.
252
+
8
253
  ## [4.0.9] — Findable the moment you write it
9
254
 
10
255
  ### Fixed
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  </picture>
6
6
  </p>
7
7
 
8
- <h1 align="center">SuperLocalMemory V4.0.9</h1>
8
+ <h1 align="center">SuperLocalMemory V4.1.0</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.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/>
30
+ <p align="center"><code>v4.1.0</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.9-Current_Release-2ea44f?style=for-the-badge&logo=checkmarx&logoColor=white" alt="v4.0.9 — Current Release"/></a>
35
+ <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/v4.1.0-Current_Release-2ea44f?style=for-the-badge&logo=checkmarx&logoColor=white" alt="v4.1.0 — 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>
@@ -45,7 +45,7 @@ Proxy: <code>slm wrap claude</code> &nbsp;·&nbsp; MCP: add <code>slm_compress</
45
45
  <a href="https://superlocalmemory.com"><img src="https://img.shields.io/badge/Web-superlocalmemory.com-ff6b35?style=for-the-badge" alt="Website"/></a>
46
46
  <a href="#dual-interface-mcp--cli"><img src="https://img.shields.io/badge/MCP-Native-blue?style=for-the-badge" alt="MCP Native"/></a>
47
47
  <a href="#dual-interface-mcp--cli"><img src="https://img.shields.io/badge/CLI-Agent--Native-green?style=for-the-badge" alt="CLI Agent-Native"/></a>
48
- <a href="#multilingual-embedding-support"><img src="https://img.shields.io/badge/Multilingual-30%2B_Languages-ff69b4?style=for-the-badge" alt="Multilingual 30+ Languages"/></a>
48
+ <a href="#multilingual-embedding-support"><img src="https://img.shields.io/badge/Multilingual-via_your_embedding_model-ff69b4?style=for-the-badge" alt="Multilingual via your embedding model"/></a>
49
49
  </p>
50
50
 
51
51
  ---
@@ -310,7 +310,7 @@ can run without a cloud LLM:
310
310
 
311
311
  1. **Fisher-informed scoring** — dense candidate generation uses cosine similarity; Fisher-derived terms can modify later scoring when their state is available.
312
312
  2. **Sheaf Cohomology for Consistency** — algebraic topology detects contradictions via coboundary norms on the knowledge graph.
313
- 3. **Riemannian Langevin Lifecycle** — memory positions evolve on the Poincare ball; neglected memories self-archive, no hardcoded thresholds.
313
+ 3. **Riemannian Langevin Lifecycle** — memory positions evolve continuously on the Poincare ball, and where a memory sits decides its lifecycle stage. There is no retention timer counting down against a memory: what moves it outward is being left alone, and what pulls it back is being used. The stage boundaries themselves are fixed radii.
314
314
 
315
315
  Auto-capture hooks are installed explicitly with `slm hooks install` (Claude
316
316
  Code) or `slm hooks install --agent codex` (Codex). Hook latency and capture
@@ -386,7 +386,7 @@ 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** | `/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 |
389
+ | **Claude Code Plugin** | `/plugin marketplace add qualixar/superlocalmemory` then `/plugin install superlocalmemory@qualixar` | Self-bootstraps venv, isolated SLM_DATA_DIR, additive — 34-tool code profile. Ships the skills/agents/hooks/commands |
390
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).
@@ -477,7 +477,7 @@ then install:
477
477
  ```
478
478
 
479
479
  - Self-bootstraps a Python venv, installs all deps in an isolated `SLM_DATA_DIR`
480
- - Registers the 16-tool core MCP surface (`core16` profile by default; `core14` remains a compatibility alias)
480
+ - Registers the 34-tool `code` MCP surface — the 18-tool `core` memory surface plus code-graph, portable-evidence, bounded-loop and usefulness-report tools
481
481
  - Ships the SLM skills / agents / hooks / commands / rules
482
482
  - Additive — does not replace an existing SLM install
483
483
  - `slm connect claude-code` detects an existing plugin install and links them
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "superlocalmemory",
3
- "version": "4.0.9",
3
+ "version": "4.1.0",
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",
@@ -50,7 +50,9 @@
50
50
  "check:plugin": "node scripts/build-plugin.mjs --check",
51
51
  "build:copilot-plugin": "node scripts/build-copilot-plugin.mjs",
52
52
  "check:copilot-plugin": "node scripts/build-copilot-plugin.mjs --check",
53
- "prepack": "node scripts/build-plugin.mjs && node scripts/build-copilot-plugin.mjs && node scripts/prepack.js",
53
+ "build:codex-plugin": "node scripts/build-codex-plugin.mjs",
54
+ "check:codex-plugin": "node scripts/build-codex-plugin.mjs --check",
55
+ "prepack": "node scripts/build-plugin.mjs && node scripts/build-copilot-plugin.mjs && node scripts/build-codex-plugin.mjs && node scripts/prepack.js",
54
56
  "postinstall": "node scripts/postinstall.js",
55
57
  "preuninstall": "node scripts/preuninstall.js",
56
58
  "test": "node scripts/run-ui-tests.mjs"
@@ -3,7 +3,7 @@
3
3
  "name": "Qualixar",
4
4
  "url": "https://github.com/qualixar/superlocalmemory"
5
5
  },
6
- "description": "Local-first agent memory + reversible context compression and KV cache, as an MCP server. 21-tool code profile with graph intelligence.",
6
+ "description": "Local-first agent memory + reversible context compression and KV cache, as an MCP server. 34-tool code profile with graph intelligence.",
7
7
  "displayName": "SuperLocalMemory",
8
8
  "keywords": [
9
9
  "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.9"
18
+ "version": "4.1.0"
19
19
  }
package/plugin/CLAUDE.md CHANGED
@@ -1,4 +1,4 @@
1
- <!-- BEGIN SuperLocalMemory v4.0.9 -->
1
+ <!-- BEGIN SuperLocalMemory v4.1.0 -->
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.9 -->
42
+ <!-- END SuperLocalMemory v4.1.0 -->
43
43
 
44
- SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
44
+ SuperLocalMemory v4.1.0 · 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.9 · Qualixar · AGPL-3.0-or-later
80
+ SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later
@@ -8,7 +8,7 @@ description: >
8
8
  completion with an auditable, resumable ledger persisted in SLM. Reports the
9
9
  exact terminal status (DONE/HALT/PAUSE/KILLED/ERROR) and never dresses a
10
10
  non-DONE outcome up as success.
11
- tools: Bash, slm_recall, slm_remember, Read
11
+ tools: Bash, recall, remember, Read
12
12
  model: inherit
13
13
  ---
14
14
 
@@ -57,8 +57,8 @@ bounds, or report the exact non-DONE status.
57
57
 
58
58
  # Memory hygiene
59
59
 
60
- - At the start, `slm_recall` prior runs of the same loop to resume context.
61
- - On a substantial outcome, `slm_remember` a one-paragraph summary (what the
60
+ - At the start, `recall` prior runs of the same loop to resume context.
61
+ - On a substantial outcome, `remember` a one-paragraph summary (what the
62
62
  gate was, the final status, the run_id) so the next session can find it.
63
63
 
64
64
  # Anti-rationalization
@@ -68,4 +68,4 @@ assessment. The gate is the authority.
68
68
 
69
69
  ---
70
70
 
71
- SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later
71
+ SuperLocalMemory v4.1.0 · 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.9 · Qualixar · AGPL-3.0-or-later
49
+ SuperLocalMemory v4.1.0 · 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.9 · Qualixar · AGPL-3.0-or-later
44
+ SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later
@@ -1 +1 @@
1
- superlocalmemory==4.0.9
1
+ superlocalmemory==4.1.0
@@ -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.9 · Qualixar · AGPL-3.0-or-later
148
+ SuperLocalMemory v4.1.0 · 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.9 · Qualixar · AGPL-3.0-or-later
150
+ SuperLocalMemory v4.1.0 · 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.9 · Qualixar · AGPL-3.0-or-later*
248
+ *SuperLocalMemory v4.1.0 · 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.9 · Qualixar · AGPL-3.0-or-later
315
+ SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later
@@ -2,7 +2,7 @@
2
2
  name: slm-loop
3
3
  description: Run gate-verified bounded loops with SuperLocalMemory as the durable ledger. Use when a task has a checkable acceptance condition (tests, schema, lint, reconciliation) and you must iterate until an INDEPENDENT gate passes — never stopping just because the agent believes it is done. `slm loop demo` runs a keyless convergence demo; `slm loop history` and `slm loop show <run_id>` inspect past runs whose every lap is persisted as queryable SLM memory (tag `loop:<name>`). Terminal statuses are DONE / HALT / PAUSE / KILLED / ERROR — report them exactly, never converting HALT/PAUSE/ERROR into success.
4
4
  when_to_use: "run a bounded loop, gate-verified task, iterate until tests pass, verify against an independent gate, don't trust the agent's own done claim, slm loop, convergence loop, loop until green, loop ledger, resume a loop"
5
- allowed-tools: Bash, slm_recall
5
+ allowed-tools: Bash, recall
6
6
  ---
7
7
 
8
8
  # slm-loop — Bounded, gate-verified agent loops
@@ -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.9 · Qualixar · AGPL-3.0-or-later
99
+ SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later
@@ -279,4 +279,4 @@ mesh availability.
279
279
 
280
280
  ---
281
281
 
282
- *SuperLocalMemory v4.0.9 · Qualixar · AGPL-3.0-or-later*
282
+ *SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later*
@@ -30,10 +30,10 @@ project, a client engagement, a production vs staging environment.
30
30
 
31
31
  | Profile | Tools | When to use |
32
32
  |---------|-------|-------------|
33
- | `core` | 14 tools — remember, recall, search, session, optimize | Minimal footprint, no code tools |
34
- | `code` | 29 tools — core + portable Brain evidence + code graph + profile switching + bounded loops | Default for IDE/coding agents |
35
- | `full` | 47 tools — code + all memory ops + mesh + bounded loops | Multi-session, team workflows |
36
- | `power` | 59 tools — full + governance + behavioral tools | Enterprise, admin, audit use cases |
33
+ | `core` | 18 tools — remember, recall, search, session, optimize | Minimal footprint, no code tools |
34
+ | `code` | 34 tools — core + portable Brain evidence + code graph + profile switching + bounded loops | Default for IDE/coding agents |
35
+ | `full` | 50 tools — code + all memory ops + mesh + bounded loops | Multi-session, team workflows |
36
+ | `power` | 62 tools — full + governance + behavioral tools | Enterprise, admin, audit use cases |
37
37
  | `mesh` | 8 tools — mesh coordination only | Lightweight cross-session signalling |
38
38
 
39
39
  The profile is set at MCP server startup via `SLM_MCP_PROFILE` in the MCP config.
@@ -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.9 · Qualixar · AGPL-3.0-or-later*
149
+ *SuperLocalMemory v4.1.0 · Qualixar · AGPL-3.0-or-later*