superlocalmemory 4.1.24 → 4.2.2

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 (162) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/CHANGELOG.md +387 -0
  3. package/README.md +235 -269
  4. package/antigravity-plugin/_GENERATED.md +2 -1
  5. package/antigravity-plugin/agents/slm-governance-advisor.md +10 -4
  6. package/antigravity-plugin/agents/slm-loop-runner.md +1 -1
  7. package/antigravity-plugin/agents/slm-memory-advisor.md +8 -4
  8. package/antigravity-plugin/agents/slm-optimize-advisor.md +1 -1
  9. package/antigravity-plugin/plugin.json +1 -1
  10. package/antigravity-plugin/skills/slm-bot-memory/SKILL.md +36 -1
  11. package/antigravity-plugin/skills/slm-cache/SKILL.md +1 -1
  12. package/antigravity-plugin/skills/slm-compress/SKILL.md +1 -1
  13. package/antigravity-plugin/skills/slm-getting-started-bot/SKILL.md +58 -7
  14. package/antigravity-plugin/skills/slm-governance/SKILL.md +61 -5
  15. package/antigravity-plugin/skills/slm-graph/SKILL.md +1 -1
  16. package/antigravity-plugin/skills/slm-loop/SKILL.md +22 -2
  17. package/antigravity-plugin/skills/slm-media/SKILL.md +340 -0
  18. package/antigravity-plugin/skills/slm-mesh/SKILL.md +110 -8
  19. package/antigravity-plugin/skills/slm-profile/SKILL.md +17 -12
  20. package/antigravity-plugin/skills/slm-recall/SKILL.md +91 -3
  21. package/antigravity-plugin/skills/slm-remember/SKILL.md +6 -1
  22. package/antigravity-plugin/skills/slm-scope/SKILL.md +1 -1
  23. package/antigravity-plugin/skills/slm-session/SKILL.md +1 -1
  24. package/antigravity-plugin/skills/slm-status/SKILL.md +48 -2
  25. package/antigravity-plugin/skills/slm-web-access/SKILL.md +92 -6
  26. package/bin/slm-npm +1 -1
  27. package/codex-plugin/.claude-plugin/plugin.json +1 -1
  28. package/codex-plugin/.codex-plugin/plugin.json +1 -1
  29. package/codex-plugin/AGENTS.md +38 -9
  30. package/codex-plugin/README.md +8 -6
  31. package/codex-plugin/_GENERATED.md +2 -1
  32. package/codex-plugin/agents/slm-governance-advisor.md +10 -4
  33. package/codex-plugin/agents/slm-loop-runner.md +1 -1
  34. package/codex-plugin/agents/slm-memory-advisor.md +8 -4
  35. package/codex-plugin/agents/slm-optimize-advisor.md +1 -1
  36. package/codex-plugin/skills/slm-bot-memory/SKILL.md +36 -1
  37. package/codex-plugin/skills/slm-cache/SKILL.md +1 -1
  38. package/codex-plugin/skills/slm-compress/SKILL.md +1 -1
  39. package/codex-plugin/skills/slm-getting-started-bot/SKILL.md +58 -7
  40. package/codex-plugin/skills/slm-governance/SKILL.md +61 -5
  41. package/codex-plugin/skills/slm-graph/SKILL.md +1 -1
  42. package/codex-plugin/skills/slm-loop/SKILL.md +22 -2
  43. package/codex-plugin/skills/slm-media/SKILL.md +340 -0
  44. package/codex-plugin/skills/slm-mesh/SKILL.md +110 -8
  45. package/codex-plugin/skills/slm-profile/SKILL.md +17 -12
  46. package/codex-plugin/skills/slm-recall/SKILL.md +91 -3
  47. package/codex-plugin/skills/slm-remember/SKILL.md +6 -1
  48. package/codex-plugin/skills/slm-scope/SKILL.md +1 -1
  49. package/codex-plugin/skills/slm-session/SKILL.md +1 -1
  50. package/codex-plugin/skills/slm-status/SKILL.md +48 -2
  51. package/codex-plugin/skills/slm-web-access/SKILL.md +92 -6
  52. package/copilot-plugin/.github/agents/slm-governance-advisor.agent.md +11 -5
  53. package/copilot-plugin/.github/agents/slm-loop-runner.agent.md +2 -2
  54. package/copilot-plugin/.github/agents/slm-memory-advisor.agent.md +9 -5
  55. package/copilot-plugin/.github/agents/slm-optimize-advisor.agent.md +2 -2
  56. package/copilot-plugin/.github/copilot-instructions.md +14 -5
  57. package/copilot-plugin/.github/prompts/slm-bot-memory.prompt.md +35 -2
  58. package/copilot-plugin/.github/prompts/slm-cache.prompt.md +2 -2
  59. package/copilot-plugin/.github/prompts/slm-compress.prompt.md +2 -2
  60. package/copilot-plugin/.github/prompts/slm-getting-started-bot.prompt.md +57 -8
  61. package/copilot-plugin/.github/prompts/slm-governance.prompt.md +60 -5
  62. package/copilot-plugin/.github/prompts/slm-graph.prompt.md +2 -2
  63. package/copilot-plugin/.github/prompts/slm-loop.prompt.md +28 -2
  64. package/copilot-plugin/.github/prompts/slm-media.prompt.md +341 -0
  65. package/copilot-plugin/.github/prompts/slm-mesh.prompt.md +108 -8
  66. package/copilot-plugin/.github/prompts/slm-profile.prompt.md +18 -13
  67. package/copilot-plugin/.github/prompts/slm-recall.prompt.md +92 -3
  68. package/copilot-plugin/.github/prompts/slm-remember.prompt.md +7 -2
  69. package/copilot-plugin/.github/prompts/slm-scope.prompt.md +2 -2
  70. package/copilot-plugin/.github/prompts/slm-session.prompt.md +2 -2
  71. package/copilot-plugin/.github/prompts/slm-status.prompt.md +48 -2
  72. package/copilot-plugin/.github/prompts/slm-web-access.prompt.md +92 -6
  73. package/copilot-plugin/README.md +3 -3
  74. package/copilot-plugin/_GENERATED.md +2 -1
  75. package/hermes-plugin/__init__.py +21 -10
  76. package/hermes-plugin/agents/slm-governance-advisor.md +10 -4
  77. package/hermes-plugin/agents/slm-loop-runner.md +1 -1
  78. package/hermes-plugin/agents/slm-memory-advisor.md +8 -4
  79. package/hermes-plugin/agents/slm-optimize-advisor.md +1 -1
  80. package/hermes-plugin/command-inventory.json +3 -3
  81. package/hermes-plugin/plugin.yaml +1 -1
  82. package/hermes-plugin/remote.py +25 -4
  83. package/hermes-plugin/skills/slm-bot-memory/SKILL.md +36 -1
  84. package/hermes-plugin/skills/slm-cache/SKILL.md +1 -1
  85. package/hermes-plugin/skills/slm-compress/SKILL.md +1 -1
  86. package/hermes-plugin/skills/slm-getting-started-bot/SKILL.md +58 -7
  87. package/hermes-plugin/skills/slm-governance/SKILL.md +61 -5
  88. package/hermes-plugin/skills/slm-graph/SKILL.md +1 -1
  89. package/hermes-plugin/skills/slm-loop/SKILL.md +22 -2
  90. package/hermes-plugin/skills/slm-media/SKILL.md +340 -0
  91. package/hermes-plugin/skills/slm-mesh/SKILL.md +110 -8
  92. package/hermes-plugin/skills/slm-profile/SKILL.md +17 -12
  93. package/hermes-plugin/skills/slm-recall/SKILL.md +91 -3
  94. package/hermes-plugin/skills/slm-remember/SKILL.md +6 -1
  95. package/hermes-plugin/skills/slm-scope/SKILL.md +1 -1
  96. package/hermes-plugin/skills/slm-session/SKILL.md +1 -1
  97. package/hermes-plugin/skills/slm-status/SKILL.md +48 -2
  98. package/hermes-plugin/skills/slm-web-access/SKILL.md +92 -6
  99. package/ide/configs/cody-commands.json +1 -1
  100. package/ide/configs/continue-mcp.yaml +9 -14
  101. package/ide/configs/continue-skills.yaml +8 -3
  102. package/ide/configs/opencode-mcp.json +4 -5
  103. package/package.json +38 -21
  104. package/plugin/.claude-plugin/plugin.json +2 -2
  105. package/plugin/.cursor-plugin/plugin.json +1 -1
  106. package/plugin/CLAUDE.md +13 -4
  107. package/plugin/agents/slm-governance-advisor.md +10 -4
  108. package/plugin/agents/slm-loop-runner.md +1 -1
  109. package/plugin/agents/slm-memory-advisor.md +8 -4
  110. package/plugin/agents/slm-optimize-advisor.md +1 -1
  111. package/plugin/cursor-skills/slm-bot-memory/SKILL.md +36 -1
  112. package/plugin/cursor-skills/slm-getting-started-bot/SKILL.md +58 -7
  113. package/plugin/cursor-skills/slm-recall/SKILL.md +91 -3
  114. package/plugin/cursor-skills/slm-remember/SKILL.md +6 -1
  115. package/plugin/cursor-skills/slm-scope/SKILL.md +1 -1
  116. package/plugin/cursor-skills/slm-session/SKILL.md +1 -1
  117. package/plugin/mcp.cursor.json +1 -1
  118. package/plugin/requirements.txt +1 -1
  119. package/plugin/skills/slm-bot-memory/SKILL.md +36 -1
  120. package/plugin/skills/slm-cache/SKILL.md +1 -1
  121. package/plugin/skills/slm-compress/SKILL.md +1 -1
  122. package/plugin/skills/slm-getting-started-bot/SKILL.md +58 -7
  123. package/plugin/skills/slm-governance/SKILL.md +61 -5
  124. package/plugin/skills/slm-graph/SKILL.md +1 -1
  125. package/plugin/skills/slm-loop/SKILL.md +22 -2
  126. package/plugin/skills/slm-media/SKILL.md +340 -0
  127. package/plugin/skills/slm-mesh/SKILL.md +110 -8
  128. package/plugin/skills/slm-profile/SKILL.md +17 -12
  129. package/plugin/skills/slm-recall/SKILL.md +91 -3
  130. package/plugin/skills/slm-remember/SKILL.md +6 -1
  131. package/plugin/skills/slm-scope/SKILL.md +1 -1
  132. package/plugin/skills/slm-session/SKILL.md +1 -1
  133. package/plugin/skills/slm-status/SKILL.md +48 -2
  134. package/plugin/skills/slm-web-access/SKILL.md +92 -6
  135. package/plugin-src/agents/slm-governance-advisor.md +10 -4
  136. package/plugin-src/agents/slm-loop-runner.md +1 -1
  137. package/plugin-src/agents/slm-memory-advisor.md +8 -4
  138. package/plugin-src/agents/slm-optimize-advisor.md +1 -1
  139. package/plugin-src/rules/AGENTS.md +38 -9
  140. package/plugin-src/rules/CLAUDE.md.fragment +13 -4
  141. package/plugin-src/skills/slm-bot-memory/SKILL.md +36 -1
  142. package/plugin-src/skills/slm-cache/SKILL.md +1 -1
  143. package/plugin-src/skills/slm-compress/SKILL.md +1 -1
  144. package/plugin-src/skills/slm-getting-started-bot/SKILL.md +58 -7
  145. package/plugin-src/skills/slm-governance/SKILL.md +61 -5
  146. package/plugin-src/skills/slm-graph/SKILL.md +1 -1
  147. package/plugin-src/skills/slm-loop/SKILL.md +22 -2
  148. package/plugin-src/skills/slm-media/SKILL.md +340 -0
  149. package/plugin-src/skills/slm-mesh/SKILL.md +110 -8
  150. package/plugin-src/skills/slm-profile/SKILL.md +17 -12
  151. package/plugin-src/skills/slm-recall/SKILL.md +91 -3
  152. package/plugin-src/skills/slm-remember/SKILL.md +6 -1
  153. package/plugin-src/skills/slm-scope/SKILL.md +1 -1
  154. package/plugin-src/skills/slm-session/SKILL.md +1 -1
  155. package/plugin-src/skills/slm-status/SKILL.md +48 -2
  156. package/plugin-src/skills/slm-web-access/SKILL.md +92 -6
  157. package/scripts/postinstall/engine-upgrade.js +112 -0
  158. package/scripts/postinstall/media-request.js +203 -0
  159. package/scripts/postinstall/node-arch.js +27 -0
  160. package/scripts/postinstall-interactive.js +15 -19
  161. package/scripts/postinstall.js +101 -13
  162. package/scripts/preuninstall.js +55 -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. Serves the 56-tool full profile by default; set SLM_MCP_PROFILE=code for the 38-tool code profile.",
12
+ "description": "Local-first agent memory + reversible context compression and KV cache, as an MCP server, with optional pictures, PDFs and bot messaging. Serves the 58-tool full profile by default; set SLM_MCP_PROFILE=code for the 39-tool code profile.",
13
13
  "homepage": "https://github.com/qualixar/superlocalmemory",
14
14
  "keywords": [
15
15
  "memory",
@@ -21,7 +21,7 @@
21
21
  "license": "AGPL-3.0-or-later",
22
22
  "name": "superlocalmemory",
23
23
  "source": "./plugin",
24
- "version": "4.1.24"
24
+ "version": "4.2.2"
25
25
  },
26
26
  {
27
27
  "author": {
@@ -39,7 +39,7 @@
39
39
  "license": "AGPL-3.0-or-later",
40
40
  "name": "superlocalmemory-codex",
41
41
  "source": "./codex-plugin",
42
- "version": "4.1.24"
42
+ "version": "4.2.2"
43
43
  }
44
44
  ]
45
45
  }
package/CHANGELOG.md CHANGED
@@ -5,6 +5,393 @@ 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.2.2] — Recall never refuses answers it has after a model change, and "What am I working on?" answers from your work
9
+
10
+ A fix release. Upgrading never moves or deletes memory. Text stays on the model it uses today.
11
+
12
+ ### Fixes
13
+
14
+ - **Moving text to the newer memory engine could make recall refuse answers it had.**
15
+ Recall decides "this is in your memory" with a check fitted on one text model
16
+ (nomic). After "Upgrade memory engine" (the Settings card, or `slm embedder upgrade`)
17
+ moved text to EmbeddingGemma 2, that check scored correct memories far
18
+ below its bar, and recall said "That isn't in SuperLocalMemory" to questions it
19
+ had answered before. The check is now chosen by the text model in use, and
20
+ SuperLocalMemory no longer moves text to a model the check was not fitted for,
21
+ whichever way it is asked (the Settings card, the embedding picker, the config file,
22
+ the CLI or MCP); only `slm embedder switch --force` does. Measured on the release harness (a synthetic store): with the old check, EmbeddingGemma 2 refused all 203 real questions. A check fitted for it found every real answer on questions it had not seen, but also answered questions with no answer (it refused 69% of made-up questions; nomic refuses 98.5%), so it is not used: text stays on nomic, and Gemma keeps serving pictures and documents.
23
+ - **Two models, one memory.** Text is searched with the text model (nomic); if you
24
+ turn on pictures and documents, EmbeddingGemma 2 reads those, and one recall returns
25
+ both. The picture model unloads after 30 minutes unused. "Upgrade memory engine" is
26
+ no longer offered: the Settings card now appears only for a store whose text already
27
+ moved, the npm installer no longer offers it, and `slm embedder upgrade` is hidden.
28
+ - **Install, three ways, the same result.** The README now has a prompt to paste into
29
+ any agent (Claude Code, Codex, Cursor, …), and the npm and pip commands. The agent
30
+ setup steps ask the person one question, whether to turn on pictures and documents,
31
+ and `npm install -g superlocalmemory --media` turns them on from the start.
32
+ - **If your text already moved,** the Settings card, `slm doctor` (new check
33
+ "Answer check fit") and the MCP `health` tool say so and how to go back: Roll back on the card, or
34
+ `slm embedder rollback`. Your previous vectors are kept, so it takes minutes, and
35
+ the rollback message now says that instead of promising a full re-index.
36
+ - **A model switch kept its hub baselines.** Each memory carries a baseline that
37
+ stops a few "close to everything" memories from looking like answers. A switch
38
+ renamed the vector columns, a trigger followed the old column, and the clean-up
39
+ afterwards deleted every baseline (27,236 to 0 on one store). The trigger is now
40
+ re-bound on every switch, a store an earlier switch damaged is repaired by itself,
41
+ and the new model's baselines are measured before the switch finishes.
42
+ - **`slm embedder calibrate` works on a real install.** It stopped on two settings
43
+ that only its own tests had (`config.profile_id`, `RetrievalEngine._channels`). It
44
+ is now tested against a real engine, and a test checks every setting it reads
45
+ exists.
46
+ - **"What am I working on?" answers from your work.** The newest rows on a busy
47
+ store were the hooks' own bookkeeping ("[project] session ended …",
48
+ "File changed: …", "files: …") and the prompts you typed to an agent, so they
49
+ won a question about the present. Bookkeeping is now recognised in all its shapes,
50
+ flagged when it is saved, and the rows already stored are flagged once on upgrade
51
+ (nothing deleted; they stay listable). Your captured prompts stay searchable but
52
+ rank as requests: below what you and your agents saved, and never as the answer
53
+ to "what am I working on?". Ask "what did I ask for…" and they come back first.
54
+
55
+ ### Upgrading
56
+
57
+ - The store's schema version moves to 62 (a data repair, no new table). Going back
58
+ to 4.2.1 needs `slm db prepare-downgrade` first, as for earlier releases.
59
+
60
+ ## [4.2.1] — Each person sees only their own workspace, and moving to the newer memory engine finishes
61
+
62
+ A fix release. Upgrading never moves or deletes memory.
63
+
64
+ ### Security
65
+
66
+ - **Recall Lab, Memories search and memory chat stay in the signed-in person's
67
+ workspace.** These three dashboard requests checked that a signed-in person could
68
+ read their workspace, then searched the machine's active workspace instead. With
69
+ more than one workspace, someone signed in to one could read another's memories.
70
+ They now search only the workspace that was checked, and a test signs in two people
71
+ in two workspaces and fails if either sees the other's memories. Saved views, the
72
+ REST `/recall` route, MCP and the CLI were not affected.
73
+
74
+ ### Fixes
75
+
76
+ - **Moving to the newer memory engine no longer stops at a long memory.** A memory
77
+ over 8,000 characters made the EmbeddingGemma 2 worker refuse its batch, and the
78
+ whole re-index stopped. It is now embedded from its start (the model reads about
79
+ that much anyway), the same way the previous engine handled it.
80
+ - **Hermes plugin keeps working after an SLM upgrade.** It refused every `/slm`
81
+ command unless SLM was exactly the release it shipped with. It now works with that
82
+ release and every newer one of the same major version, and its message says how to
83
+ move a pinned plugin ([Hermes](docs/hermes.md#upgrade)).
84
+ - **Recall Lab:** clicking a result opens the whole memory, not the shortened text.
85
+ - **Dashboard:** a source opened from "Ask your memory" opens that memory in the
86
+ Memories tab. Settings no longer comes up blank after moving between panes.
87
+ - **Choose folder:** while remote access is on, folders cannot be connected; the page
88
+ now says so next to the button before anyone clicks, instead of after a click below
89
+ the fold.
90
+ - **Sign-in:** when every person must sign in (company mode), a signed-out visitor
91
+ gets one sign-in screen instead of panes that never load, and a signed-in person
92
+ sees who they are, their role and workspace, with Sign out. On a personal computer
93
+ nothing changes: the owner never signs in. Governance says so plainly, and the first
94
+ person you add starts as an admin. There is no default account or password.
95
+ - **README:** the product film follows the twelve superpowers; the architecture
96
+ diagram is redrawn.
97
+
98
+ ## [4.2.0] — Recall that says "That isn't in SuperLocalMemory", memory that looks after itself, pictures and documents
99
+
100
+ This release changes what recall does when memory cannot answer, adds a Memory
101
+ health service that improves older memories without touching what you wrote,
102
+ and lets SLM remember pictures and documents. It also closes a long list of
103
+ erasure, access-control and backup gaps. Upgrading never moves or deletes
104
+ memory, and an update that changes the store takes a restore point first.
105
+
106
+ ### Many agents at once
107
+
108
+ - **A question waits for its full answer instead of getting a keyword guess.** When
109
+ several agents ask at once, an agent's recall, `slm recall`, the Recall Lab and
110
+ saved views now wait their turn (up to about twelve seconds) and run the full
111
+ pipeline. If every slot is still busy, they get a plain "SuperLocalMemory is
112
+ answering other questions right now. Ask again in about N seconds" (HTTP 503 with
113
+ `Retry-After`, `code: RECALL_BUSY` over MCP, exit code 75 from the CLI), never a
114
+ stale keyword answer presented as recall. Hooks that run before a prompt keep their
115
+ three-second limit, so typing is never held up. Measured on a 27,000-memory store
116
+ with twelve agents asking at once: twelve full answers in 2.4 to 5.4 seconds, where
117
+ before two of the twelve fell back to keywords.
118
+ - **The same question asked twice at once runs once.** Identical recalls in flight
119
+ share one run, and a complete answer is reused for a few seconds while nothing is
120
+ written. Any write (remember, update, delete, forget, a scope change) drops it at
121
+ once, so an agent never reads an answer from before its own write.
122
+ - **Background work steps aside for questions.** Local-model extraction and summaries
123
+ in Mode B now wait while a recall is running (never more than twenty seconds), so a
124
+ long generation no longer sits in front of every recall.
125
+ - **The dashboard reads once for everyone.** Memory health, totals and the compliance
126
+ pane are computed once and shared for a few seconds between every open dashboard;
127
+ a repeat look answers in milliseconds. The audit trail is opened once, with an
128
+ index for the workspace it is read for.
129
+ - **"What am I working on" answers with your newest memories.** A present-tense
130
+ question no longer faces the word-match test (its answer shares no word with it),
131
+ so it stops saying "That isn't in SuperLocalMemory."
132
+ - **Dashboard:** a "please wait" bar with the mascot while SLM starts or warms up;
133
+ loading and error messages carry the mascot; the folder dialog comes to the front
134
+ instead of opening behind other windows; Settings rows wrap instead of squeezing a
135
+ label to one letter per line.
136
+
137
+ ### Recall quality
138
+
139
+ - **Recall says so when nothing supports the question.** Every recall now comes back
140
+ in one of three tiers. *Supported*: at least one memory is strong enough evidence.
141
+ *Closest memories*: nothing supports it, but the question is a real one and a few
142
+ memories are close, so you see up to three, labelled, under "I don't have this
143
+ exactly — here are the closest memories." *Not in memory*: a nonsense question, or
144
+ nothing close, returns no results and the sentence "That isn't in
145
+ SuperLocalMemory." Before this, a nonsense question could still return the nearest
146
+ memories. Each memory is scored on several signals together (meaning, keywords,
147
+ names, rare terms, how the question is phrased, and how often the memory matches
148
+ everything); pinned memories are always returned. The command line and the
149
+ dashboard show the closest memories by default; over MCP and the REST API an agent
150
+ gets them when it asks (`include_related`). It is far better at rejecting nonsense
151
+ than at spotting an on-topic question memory has no answer to, which is what the
152
+ answer check is for ([Recall](docs/recall.md#when-memory-cannot-answer)).
153
+ - **`slm recall --show-weak`** (the `show_weak` option on the MCP recall tool, the
154
+ REST API and the dashboard's "Show closest matches") returns the closest weak
155
+ matches when nothing supports the question, each marked weak, with the same
156
+ sentence on top.
157
+ - **A recall that runs before SLM is ready says so.** For a few minutes after a start
158
+ the models, probes and memory graph are still loading. Recall then shows the
159
+ keyword finds it has (up to five) under "SuperLocalMemory is still warming up —
160
+ results may be incomplete", and never says the memory is empty. The response
161
+ carries `warming_up` and `status_note` for agents.
162
+ - **Layered recall.** `depth` 0 returns ids, the tier and a one-line preview; 1 (the
163
+ default) the full facts; 2 adds the source memory, up to three neighbours from the
164
+ same session, up to three facts about the same entities and the correction that
165
+ replaced it. `max_tokens` is a hard cap that is never exceeded, a new `expand`
166
+ tool drills into one result, and every injected context block is capped too.
167
+ `slm recall --depth 2 --max-tokens 1500`.
168
+ - **A recall that matches by keyword alone is no longer written off**, and the
169
+ keyword fallback serves only memories that cover the words you asked with.
170
+ Questions are also rewritten into base forms and known aliases for the keyword
171
+ search; the check that decides whether a memory answers always reads your
172
+ original words, so a rewrite can never make nonsense answer.
173
+ - **The on-device answer check (Laya) is installed by default where it can run.** On
174
+ an Apple Silicon Mac, setup installs it (about 1.1 GB) without asking in unattended
175
+ runs, and the first command after an upgrade offers it the same way: it asks in a
176
+ terminal and starts a background install without one. It is independent of the
177
+ operating mode, so Mode A and Mode B both run it entirely on your computer. Opt out
178
+ with `slm setup --no-laya` or `SLM_SKIP_LAYA=1`; answering no once is remembered. It is
179
+ never installed on other hardware, over an install you already have, or when you chose
180
+ Off or the online check. The check has its own time budget, so a slow check can no
181
+ longer eat the recall ceiling. The online option (Jev) stays off until you choose it
182
+ and tick its consent.
183
+ - **Local checks are calibrated in the background**, with visible progress and a
184
+ cancel button, and a new calibration is rejected if it does worse than the
185
+ current one on held-out questions.
186
+ - **Recall stays fast while you write.** A save no longer forces the whole graph
187
+ to rebuild on the next recall: the cached graph follows writes, deletes and
188
+ erasures, and full rebuilds run in the background. On a 26,000-fact store with
189
+ a write every 2 seconds, p95 recall fell from 4.3 s to 0.94 s and peak memory
190
+ from up to 1.7 GB to about 260 MB. Large stores get new recall indexes, and
191
+ recall waits are bounded all the way through the HTTP layer.
192
+ - **Entity matching is exact.** A name matches exactly, then after
193
+ normalisation, then with one typo in one word. It never merges different
194
+ numbers or versions, never chains near-miss names into an unrelated person or
195
+ project, and timestamps, hashes, paths, status words and sentence fragments
196
+ are no longer saved as people or projects. `slm db repair-entities` previews,
197
+ applies (after a backup, with an undo record) and undoes the clean-up of links
198
+ left by the older rules.
199
+ - **Saving is checked against what you wrote.** Every statement SLM extracts is
200
+ checked against its source before it is stored: no added names, numbers or
201
+ dates, no flipped negation. The original note is always kept. Quoted speech is
202
+ never rewritten, relative dates ("last Tuesday") resolve against the memory's
203
+ own date, and saving the same text twice adds no row.
204
+ - **The learning loop learns from real outcomes.** One query id runs from recall
205
+ to the reward, and each outcome settles exactly one recall, across restarts.
206
+ `slm outcome success|partial|failure <fact_id>...` tells SLM whether the
207
+ memories a recall gave you helped; MCP, the REST API, the dashboard and the
208
+ command share one writer. Health shows "Not demonstrated" until an outcome has
209
+ settled.
210
+ - **Upgrade memory engine** (preview, opt-in): `slm embedder upgrade` or the
211
+ Settings card re-reads memories with the one-model engine in the background,
212
+ with recall working throughout and one-click rollback.
213
+ - **Quantized retrieval is used when configured**, the status says when a tier is
214
+ degraded, and damaged or older sketches are repaired by `slm quantize` instead
215
+ of hiding the memory from search.
216
+
217
+ ### Memory health
218
+
219
+ - **A Memory health card** in the dashboard shows what SLM can improve in older
220
+ memories and what it is doing about it. A background worker runs only when the
221
+ computer is idle and **only adds**: it fills in missing observation and event
222
+ dates, names of people and tools, tags, a project and a kind on older memories,
223
+ and never edits the text you saved or replaces a value you set. It stops when you
224
+ are working and when memory is tight ([Memory health](docs/memory-health.md)).
225
+ - **Stubs are marked, not hidden.** A memory that is only a label and an id
226
+ (for example a session receipt) carries a **stub** badge in lists and counts.
227
+ Only recall leaves stubs out of its answers.
228
+ - **Anything that deletes or moves something waits for your explicit Fix.**
229
+ Repairs that remove junk entity links, re-file hidden memories or repair failed
230
+ saves are offered as a count with a **Fix** button, and every run that changed
231
+ something has an **Undo** that restores exactly what it changed (anything you
232
+ edited since is kept).
233
+ - **`slm enrich`** is the command-line side: `status`, `pause`, `resume`,
234
+ `undo`, and `fix entity-links|refile-hidden|repair-saves` (the last has no
235
+ undo, so it takes a safety copy first and says so). `--include-undone`
236
+ applies items from a repair you undid earlier.
237
+ - **One safety copy per store**, taken before the first automatic change and
238
+ reused by every later run.
239
+ - **`slm doctor`** reports the same state, a **Failed saves** row (it warns when
240
+ saves were given up on after repeated attempts and fails at 50 or more), and
241
+ `slm doctor --refile-hidden` lists memories that were moved out of sight
242
+ although their retention score says to keep them; `--yes` moves exactly those
243
+ back.
244
+
245
+ ### Privacy and erasure
246
+
247
+ - **Erasing a person leaves no readable copy.** The bytes of the data folder are
248
+ checked after an erasure and everything they found is closed: queued saves,
249
+ the encrypted request journal, the recall queue, caches, reversible
250
+ compression originals, free pages inside the side databases, event previews,
251
+ the vector index itself, the Lance history, the graph's entity nodes, an erased
252
+ picture's backup mirror and the prompt text two logs kept.
253
+ - **Erasure says exactly what it did.** `slm gdpr erase --json` reports
254
+ `success: false` for an incomplete erasure, the dashboard lists what was
255
+ removed and what remains, and the stored receipt is written after every step.
256
+ A backup keeps its erasure obligation until it is deleted or re-read clean, and
257
+ a restore replays targeted erasures as well as profile ones.
258
+ - **Exporting your data works on a real store.** Export writes plain JSON,
259
+ leaves embeddings out unless you ask (`--include-embeddings`), streams to
260
+ disk, and reports failures instead of "Export started". The full export now
261
+ carries the audit records about you, pictures, documents, folders and jobs,
262
+ and lists what it leaves out under `export_manifest`.
263
+ - **Personal data is redacted on every save path** when redaction is on,
264
+ including metadata, tags, keys and events, for pictures as well as text.
265
+ - **Mode A says what it is:** "Memories are saved and recalled without a
266
+ language model — nothing leaves this device." The server serves that one
267
+ sentence and the dashboard shows it, and it stays true when the on-device
268
+ answer check is running.
269
+
270
+ ### Access control
271
+
272
+ - **Company mode checks a role on every change and every data route.** Every
273
+ state-changing route asks for a role before the request body is read, so a
274
+ refusal is 401 or 403, never 422 or 500; with login required, every page of
275
+ data needs a signed-in user. While users are enrolled, the install token or an
276
+ API key alone no longer administers the workspace; use an admin account, or
277
+ `slm team` on the SLM computer (`slm team status`, `slm team policy
278
+ --require-login on|off`, so the owner can never be locked out).
279
+ - **Skill approvals and maintenance are scoped to the workspace.** Skill
280
+ evolution keeps each workspace's skills, backups and quarantine apart; an
281
+ approval applies to the workspace it was made in, and installation-wide
282
+ settings need authority over every workspace.
283
+ - **Roles and profiles apply to every picture, document, folder and feature
284
+ route.** Reading a file by path, connecting a folder and turning features on
285
+ need the owner or an admin, and SLM's own data folder can never be named.
286
+ - **A connected web app cannot see or change what it may not read.** It cannot
287
+ update, delete, pin, replace or give feedback on a memory by id when it may not
288
+ see that memory; it is answered as if the memory did not exist. Pictures saved
289
+ before this release are held back from web apps until they are re-checked in
290
+ the background.
291
+ - With `SLM_REQUIRE_CREDENTIALS=1` the dashboard key is no longer handed to other
292
+ programs on the computer; the dashboard asks for it once (`slm token show`).
293
+
294
+ ### Backup and restore
295
+
296
+ - **A restore is all or nothing.** While it runs, the store is held so no daemon
297
+ can start and write part-way; everything the restore may change is copied
298
+ first, and a failure puts those files back. Only if that put-back also fails
299
+ does `slm backup restore-safety-copy` bring back the safety copy taken after
300
+ the service stopped. The dashboard and the command line say in plain words
301
+ what happened and what to run next.
302
+ - **Backups are complete and honest.** Local backups copy picture and PDF
303
+ originals (never the upload-link database), a backup just taken is no longer
304
+ "overdue", and the dashboard export is one archive with every store, the
305
+ originals and a manifest.
306
+ - **A damaged keyword index is repaired for good.** On SQLite 3.44.0 to 3.46.0,
307
+ `slm db repair --apply` turns off the setting that damages the index, rebuilds
308
+ it, checks it again and says plainly if it is still damaged. Your memories are
309
+ kept.
310
+
311
+ ### Dashboard
312
+
313
+ - **Documents & Images** pane with progress, a drop zone, **Find a picture**,
314
+ connected folders and a **Choose folder** button that uses the computer's own
315
+ picker; **Bot messages** tab listing every bot by name with mute, rename and
316
+ retire; a **What's new** card that knows what is already on.
317
+ - **Connected apps shows which apps are connected right now**: live MCP
318
+ processes by host with a count, a flag on apps still running older SLM code,
319
+ and a reconnect. Connect, doctor, repair and restart are buttons.
320
+ - **Search says why it found nothing.** The Memories search shows the tier's sentence
321
+ ("That isn't in SuperLocalMemory.", the closest memories, or the warming-up note)
322
+ instead of an empty list, and has a **Show closest matches** switch.
323
+ - **Answer Check** tab, Settings → Answer check with a test for each option and
324
+ **Calibrate on my store**, and the Memory health card described above.
325
+ - Memory guards read real memory use on macOS (physical footprint); the
326
+ resident size under-reported up to 15 times on a busy Mac.
327
+
328
+ ### Pictures and documents
329
+
330
+ - **Save screenshots, photos and PDFs and find them by describing them.** A
331
+ picture model runs on your computer (EmbeddingGemma 2), OCR reads the text
332
+ inside pictures, and each PDF page is indexed by its picture and its text. No
333
+ generative model looks at your files. Off by default; turn it on from the npm
334
+ installer or upgrader, the dashboard, or `slm media enable`. Pictures live in
335
+ their own database, so your existing memories and embeddings are never
336
+ changed. It needs a computer with 16 GB of memory and downloads about 1.5 GB the
337
+ first time; limits are in `docs/pictures-and-documents.md`.
338
+ - `slm media status|disable|gc|repair`; `slm sources add` mirrors **folders and
339
+ Obsidian vaults** read-only (properties, links and canvases kept) and re-reads a
340
+ file as soon as it changes.
341
+ - **Recall finds pictures and pages** beside text memories, shows them to local AI
342
+ apps, and counts a picture as evidence only above the model's own similarity
343
+ floor. The generated picture caption stays in the picture's metadata and never
344
+ becomes searchable words or facts.
345
+ - **Erasing a memory erases its picture**, and a replaced picture or PDF is
346
+ erased for good at the end of its grace period.
347
+ - Pictures and documents work on Linux 64-bit ARM, are refused with a plain
348
+ reason on computers under 16 GB, and the picture tools are stopped before they
349
+ pass their memory cap. The picture model embeds in small passes; its peak fell
350
+ from about 12 GB to under 4 GB on large batches.
351
+
352
+ ### Bots and web apps
353
+
354
+ - **Bots that talk to each other.** Web apps connected through Web access
355
+ (ChatGPT, Claude on the web, Grok Bot, Muse, Composio) can join SLM-Mesh beside
356
+ the agents on your computer: see peers, send a named bot a message, wait for a
357
+ reply and read shared state. Each app needs two yeses: a box on the approval
358
+ page and a switch on the **Web access** row in Connected apps (or `slm remote
359
+ keys allow <key> mesh`). Messages reach a web app at least once, marked as a
360
+ repeat if it did not acknowledge them.
361
+ - **Web apps save real files.** A connected app can ask for a one-time upload
362
+ link: you open it, pick the file, and it streams to your computer through the
363
+ connection gateway, which keeps no copy. A link belongs to the app that asked
364
+ for it, works once and expires in 10 minutes. ChatGPT can hand over an
365
+ attached file directly once its file hosts are on your allowed list.
366
+ - **Frameworks and editors.** Google ADK, CrewAI and Semantic Kernel run through
367
+ an isolated engine bridge instead of failing to install next to SLM; Continue,
368
+ OpenCode, Antigravity, VS Code and Gemini CLI setup write each host's current
369
+ schema; and Claude Desktop on Windows is configured in `%APPDATA%\Claude`.
370
+ - Every plugin, skill and setup text now teaches this release: a new `slm-media`
371
+ skill, and the mesh, web access, governance and bot skills cover upload links,
372
+ `mesh_wait` and the Connected apps switches. Hermes registers all 16 skills
373
+ and its four advisor tools load again.
374
+
375
+ ### Reliability
376
+
377
+ - **Windows reads and writes SLM's own files as UTF-8**: the dashboard, the
378
+ answer-check settings and the backup reader no longer depend on the Windows
379
+ code page, so text outside it round-trips.
380
+ - Services and ports belong to one install: `slm dashboard`, Health, Settings and
381
+ HTTP setup use the configured port, strict credential settings survive
382
+ auto-start, and a second install gets its own service name. A daemon started
383
+ with `python -m` publishes its ready record, so `stop` no longer waits 90
384
+ seconds.
385
+ - `--sync` saves return after enrichment completes, the Python API shares the
386
+ daemon's embedder, failed session opens exit non-zero, and a queued embedding
387
+ upgrade says why it waits. A model refused for lack of memory says so instead
388
+ of "no vector", and an embedding pause explains itself in the model status.
389
+ - `npm install` says plainly when the Python it found cannot work (an Intel Mac,
390
+ 32-bit Windows, Windows on ARM, 32-bit Linux, Node under Rosetta) and how to
391
+ install a supported one; pip installs on 64-bit ARM Linux.
392
+ - `slm doctor` makes at most one short health probe of the daemon, never starts
393
+ it, and prints a full report within a hard deadline instead of hanging.
394
+
8
395
  ## [4.1.24] — Connecting ChatGPT, Grok Bot, Muse and dots works the first time
9
396
 
10
397
  ### Added