superlocalmemory 4.1.17 → 4.1.19

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 (43) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/CHANGELOG.md +202 -0
  3. package/README.md +40 -16
  4. package/bin/slm-npm +1 -1
  5. package/ide/configs/cursor-mcp.json +4 -1
  6. package/package.json +1 -1
  7. package/plugin/.claude-plugin/plugin.json +2 -2
  8. package/plugin/CLAUDE.md +5 -4
  9. package/plugin/agents/slm-governance-advisor.md +1 -1
  10. package/plugin/agents/slm-loop-runner.md +1 -1
  11. package/plugin/agents/slm-memory-advisor.md +7 -6
  12. package/plugin/agents/slm-optimize-advisor.md +1 -1
  13. package/plugin/requirements.txt +1 -1
  14. package/plugin/scripts/ensure-venv.bat +5 -5
  15. package/plugin/scripts/ensure-venv.sh +4 -4
  16. package/plugin/skills/slm-cache/SKILL.md +1 -1
  17. package/plugin/skills/slm-compress/SKILL.md +1 -1
  18. package/plugin/skills/slm-governance/SKILL.md +1 -1
  19. package/plugin/skills/slm-graph/SKILL.md +1 -1
  20. package/plugin/skills/slm-loop/SKILL.md +1 -1
  21. package/plugin/skills/slm-mesh/SKILL.md +1 -1
  22. package/plugin/skills/slm-profile/SKILL.md +4 -4
  23. package/plugin/skills/slm-recall/SKILL.md +10 -3
  24. package/plugin/skills/slm-remember/SKILL.md +1 -1
  25. package/plugin/skills/slm-scope/SKILL.md +1 -1
  26. package/plugin/skills/slm-session/SKILL.md +16 -1
  27. package/plugin/skills/slm-status/SKILL.md +1 -1
  28. package/plugin-src/agents/slm-memory-advisor.md +7 -6
  29. package/plugin-src/agents/slm-optimize-advisor.md +1 -1
  30. package/plugin-src/rules/AGENTS.md +24 -12
  31. package/plugin-src/skills/slm-cache/SKILL.md +1 -1
  32. package/plugin-src/skills/slm-compress/SKILL.md +1 -1
  33. package/plugin-src/skills/slm-governance/SKILL.md +1 -1
  34. package/plugin-src/skills/slm-graph/SKILL.md +1 -1
  35. package/plugin-src/skills/slm-loop/SKILL.md +1 -1
  36. package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
  37. package/plugin-src/skills/slm-profile/SKILL.md +4 -4
  38. package/plugin-src/skills/slm-recall/SKILL.md +10 -3
  39. package/plugin-src/skills/slm-remember/SKILL.md +1 -1
  40. package/plugin-src/skills/slm-scope/SKILL.md +1 -1
  41. package/plugin-src/skills/slm-session/SKILL.md +16 -1
  42. package/plugin-src/skills/slm-status/SKILL.md +1 -1
  43. package/scripts/postinstall.js +47 -16
@@ -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. 34-tool code profile with graph intelligence.",
12
+ "description": "Local-first agent memory + reversible context compression and KV cache, as an MCP server. 38-tool code profile with graph intelligence.",
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.17"
24
+ "version": "4.1.19"
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.17"
42
+ "version": "4.1.19"
43
43
  }
44
44
  ]
45
45
  }
package/CHANGELOG.md CHANGED
@@ -5,6 +5,208 @@ 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.19] — Memories know what kind they are
9
+
10
+ ### Added
11
+
12
+ - **Nine memory kinds.** A memory can be a fact, an event, a current status, an
13
+ opinion, a standing rule, a decision, a how-to, a plan or a correction. You
14
+ or your agent can say which when saving (`kind` on `remember`, `--kind` on
15
+ the CLI); otherwise SLM suggests one. A suggestion changes nothing until
16
+ someone confirms it.
17
+ - **Standing rules at session start.** Rules and decisions you confirmed are
18
+ given to every new agent session, up to ten rules and five decisions.
19
+ Proposed, rejected, archived, quarantined and replaced items are never
20
+ included.
21
+ - **Classify existing memories** in the background (`slm kinds backfill`, or
22
+ HTTP), with progress, pause, cancel and an exact undo. It never changes a
23
+ kind you confirmed. Classifying online with Jev needs its own consent and a
24
+ confirmation that memory text leaves this machine.
25
+ - **Review and confirm kinds** from agents (four new tools in the default,
26
+ code, full and power tool sets), the CLI (`slm kinds set | review | confirm`)
27
+ and HTTP.
28
+ - **Ask for a kind of memory.** Recall, search and list take a `kind` filter.
29
+ "What did we decide" favours decisions, "how do I" favours how-tos, and "what
30
+ is the current state" puts the newest confirmed status or decision first.
31
+ Questions that ask for no particular kind are ranked exactly as before.
32
+ - **Narrow a recall** by project, by the agent that saved a memory, or by who
33
+ or what it is about (`project`, `saved_by`, `about`). The filter applies on
34
+ every recall path and before the answer check, so the check judges only what
35
+ you will see.
36
+ - **Say which memory a new one replaces.** `remember(..., replaces=<id>)`
37
+ retires the old memory (kept, never deleted) and recall shows the new one.
38
+ Undoing it through correction review brings the old memory back exactly.
39
+ It works with a per-request `profile_id` too: a client routed to its own
40
+ profile can replace a memory and undo it there (`review_correction` and
41
+ `list_corrections` take the same `profile_id`), without switching the
42
+ daemon's active profile.
43
+ - **Upgrades keep a verified copy you can go back to:** restore points, a
44
+ restore that also brings back memories saved since the copy, and a prepared
45
+ path back to the previous version (`slm db restore-points | restore |
46
+ prepare-downgrade`).
47
+ - **Encrypted cloud backups** (see Security), with `slm backup recovery-key` and
48
+ `slm backup decrypt`.
49
+
50
+ ### Fixed
51
+
52
+ - **Recall never writes.** Asking about an unknown name no longer creates
53
+ entities or calls a model, which also removes a multi-second delay on the
54
+ first question about a new name.
55
+ - **Enrichment no longer gets stuck** on memories that hold credentials.
56
+ - **Memories blanked by an earlier release are repaired once**, after a
57
+ verified safety copy: their text, the facts searched from it, and wrongly
58
+ set "replaced" marks.
59
+ - **A restore never repeats a loss.** It deletes again only what you or a
60
+ privacy erasure deleted, works when the live store is damaged, refuses a copy
61
+ made by a newer version, keeps kinds you confirmed after the copy, keeps
62
+ erased profiles erased in learning data, and cannot be cancelled half-way
63
+ through. Its messages say what actually happened.
64
+ - **A kind you confirmed is never overwritten** by background work, and a
65
+ machine suggestion never changes a memory's type.
66
+ - **The same request gives the same answer on MCP, the CLI and HTTP**,
67
+ including refusals. Every `--json` command prints JSON on errors too.
68
+ - **The Hermes plugin works with the release it ships with**, and asks for
69
+ confirmation before `remember --replaces`.
70
+ - **Windows:** the test suite runs on Windows again, and a read timeout in the
71
+ embedding worker no longer freezes it.
72
+ - **npm install on Linux finds `python3.12` and newer** next to an older
73
+ `python3`, and honours `SLM_PYTHON`.
74
+
75
+ ### Security
76
+
77
+ - **Credentials leave this machine redacted on every path.** One outbound gate
78
+ covers model providers, cloud embedders, summaries, the reranker, the
79
+ answer check, a LAN Ollama and mesh peers; a model provider's key is sent only
80
+ to that provider. Context given to agent sessions is redacted the same way,
81
+ with no last-four-character tails. Requests to this machine never go through
82
+ an environment proxy.
83
+ - **Cloud backups are encrypted on this machine before upload** to GitHub or
84
+ Google Drive. You get a recovery key; keep it to restore on another
85
+ machine. Backups made by earlier releases still restore.
86
+ - **Every new read route checks permission.**
87
+ - **Error responses no longer include file paths or internal messages.**
88
+
89
+ ### Changed
90
+
91
+ - **Credentials you save are stored as written.** Up to 4.1.18, known key
92
+ formats were removed on save. SLM keeps them so your agents can recall them,
93
+ and redacts them on the way out.
94
+ - **Python 3.12 or newer is required**, and every check now says so.
95
+ - **Tool sets:** default and full 54 tools, code 38, power 66. The Antigravity
96
+ plugin uses the power set (within Antigravity's limit) and the Cursor
97
+ configuration uses the code set.
98
+ - **Recall's ceiling is 3.0 seconds** including the answer check.
99
+
100
+ ### Known limits
101
+
102
+ - **Macs shared by several user accounts:** the per-account check is still not
103
+ in this release. Turn on company mode (Team → Access policy) on a shared Mac.
104
+ - **Classifying existing memories with a cloud model** uses on-device rules.
105
+ - **Drive does not rotate old backups**: delete plain-text backups made before
106
+ this release yourself.
107
+
108
+ ## [4.1.18] — Recall can say "I don't have that"
109
+
110
+ ### Added
111
+
112
+ - **Answer check.** Recall now says whether the memories it found actually
113
+ answer the question, instead of handing back the best of a bad set. Results
114
+ are never removed or hidden: each recall reports `abstained`, the reason,
115
+ a confidence, and `answer_check_status` (judged, off, skipped, busy,
116
+ warming or unavailable), and every connected agent is told not to present
117
+ memories that do not answer as the answer.
118
+ - **Two ways to run it, one at a time.** "On this Mac" runs privately on Apple
119
+ Silicon and nothing leaves the machine. "Online with Jev" works anywhere with
120
+ your own TypeSafe or OpenRouter key; it is off until you choose it and tick a
121
+ consent box, and it sends only the question and its top three memories,
122
+ with credentials stripped out first. It never sends another profile's
123
+ memories, and recalls that only load context (session start, auto-loaded
124
+ context, the per-prompt hook) are never sent. Turning one on turns the
125
+ other off.
126
+ - **Optional: let Jev reorder results.** Inside "Online with Jev" there is a
127
+ separate switch, off by default with its own notice, that also asks Jev
128
+ which of the top results answers the question most directly and returns
129
+ them in that order. Still one request per recall. On a public benchmark of
130
+ long conversations (LoCoMo, 1,531 questions) the memory that answers came
131
+ first 62% of the time instead of 49%; it adds about 0.4 seconds to a
132
+ recall. If the provider is slow or unreachable, results keep their usual
133
+ order.
134
+ - **Set up from the dashboard.** Settings → Answer check: choose, set up with a
135
+ progress bar, use an existing install on networks that block downloads,
136
+ save and test a key (only its last four characters are ever shown), or turn
137
+ it off. The dashboard home shows what is actually running. Changing it
138
+ needs the manage permission, and withdrawing consent stops the online
139
+ check at once, in every mode.
140
+ - **First-time setup installs it** on Apple Silicon (about 1.1 GB to
141
+ download, about 1.1 GB of memory while on). If the download is blocked or
142
+ interrupted, setup finishes and Set up again picks up where it left off.
143
+ Unattended setup skips it unless `SLM_INSTALL_LAYA=1` is set.
144
+ - **Every recall response says what chose its order** and what became of
145
+ the answer check, from the MCP tools, the CLI and the HTTP API alike.
146
+
147
+ ### Fixed
148
+
149
+ - **Archived memories stay archived after a restart.** A repair that should
150
+ have run once ran on every start and put archived memories back into
151
+ recall.
152
+ - **Upgrades keep one safety copy instead of two**, and copies left by
153
+ earlier upgrades are cleaned up.
154
+ - **Ranking no longer loses its second pass.** After a crash, a restart of its
155
+ helper, or an idle shutdown, the reranking step recovers on its own, and it
156
+ keeps ranking while its helper restarts. It also uses much less memory on
157
+ long, mixed-length requests.
158
+ - **A configured remote reranker is now used**, and one that stops answering
159
+ no longer slows every recall: recall falls back to its usual ranking right
160
+ away and checks the endpoint again in the background.
161
+ - **A newer memory is no longer pushed down by an older one** about the same
162
+ subject.
163
+ - **Health checks** report the reranking step and no longer raise false alarms
164
+ when a working search simply has no match.
165
+ - **No more project files at the root of the disk.** Background context sync
166
+ only writes into real project folders.
167
+ - **Bounded loops** waiting on memory no longer finish on a recall that does
168
+ not answer their question.
169
+ - **Restoring a backup** no longer loses or corrupts recent memories, takes
170
+ effect while the store is in use, and no longer leaves a large temporary
171
+ file next to the store.
172
+ - **Stored memories keep their links and file paths.** Saving a memory no
173
+ longer blanks out long URLs and paths.
174
+ - **`slm db compact` works while SLM is running.**
175
+ - **Hooks work when the data folder has a long path.**
176
+ - **Maintenance no longer reports a step that does not apply to your store
177
+ as a failure.**
178
+ - **Windows:** safety copies are flushed to disk properly.
179
+
180
+ ### Security
181
+
182
+ - **A web page on another site can no longer reach SLM through your
183
+ browser.** SLM now answers only requests addressed to this computer. To
184
+ reach a LAN install by a host name, list the name in `SLM_ALLOWED_HOSTS`;
185
+ reaching it by address, or by a name already allowed for network access,
186
+ is unchanged.
187
+ - **The per-prompt hook only talks to your own SLM service.** Its fallback
188
+ path could send a prompt to any program listening on the service's port.
189
+ - **Known API key formats, webhook links and private-key bodies are removed
190
+ when a memory is saved**, not only before anything is sent online.
191
+ - Dependencies updated to versions that fix published security advisories.
192
+
193
+ ### Changed
194
+
195
+ - **A background consistency check is off by default**, including on upgraded
196
+ installs. It changed no recall result in testing and ran on every save. It
197
+ can be turned back on, and turning it back on now sticks.
198
+ - **Answer-check settings live in one file for every mode**, so switching
199
+ modes never changes them.
200
+ - **Mode A says when it is not local-only:** with the online answer check on,
201
+ the mode description says so instead of "zero-cloud".
202
+
203
+ ### Known limits
204
+
205
+ - **Macs shared by several user accounts:** another account on the same Mac
206
+ can reach the local SLM service. Turn on company mode (Team → Access
207
+ policy) on a shared Mac; a per-account check is planned for the next
208
+ release. See the "Shared Macs" section of the security notes.
209
+
8
210
  ## [4.1.17] — Vector history that actually gets pruned
9
211
 
10
212
  ### Fixed
package/README.md CHANGED
@@ -5,12 +5,35 @@
5
5
  </picture>
6
6
  </p>
7
7
 
8
- <h1 align="center">SuperLocalMemory V4.1.17</h1>
8
+ <h1 align="center">SuperLocalMemory V4.1.19 — local-first memory for AI agents</h1>
9
9
 
10
10
  <h2 align="center">Rent the LLM. Own the memory.</h2>
11
11
 
12
12
  <p align="center"><em>Rent an LLM — but own the memory, for your company and for your industry.</em></p>
13
13
 
14
+ Store context once and recall it across agent sessions through the CLI or MCP. Start with local memory, then choose the operating mode and integrations your workspace needs. SuperLocalMemory is part of Qualixar's AI Reliability Engineering work.
15
+
16
+ **[Research and evidence](https://www.superlocalmemory.com/research)** · **[Qualixar product overview](https://qualixar.com/products/superlocalmemory)** · **[Author and research context](https://varunpratap.com/products/superlocalmemory)**
17
+
18
+ **[Install](https://www.superlocalmemory.com/install)** · **[Product walkthrough](https://www.superlocalmemory.com/demo)** · **[CLI proof](docs/QUICK_PROOF.md)** · **[Release notes](CHANGELOG.md)**
19
+
20
+ ```bash
21
+ npm install -g superlocalmemory # Primary CLI install path
22
+ slm setup # Select mode A for local-only operation; review integration choices.
23
+ slm doctor
24
+ slm remember "Synthetic demo: the release checklist requires a human approval after tests pass." --tags demo --json --sync
25
+ slm recall "release checklist human approval" --json
26
+ ```
27
+
28
+ The synthetic CLI proof returned the stored sentence in mode A on version 4.1.17. It tests store-and-recall behavior; it is not a retrieval accuracy benchmark.
29
+ [See the commands, scope and isolation settings](docs/QUICK_PROOF.md).
30
+
31
+ If the proof is useful for your agent workflow, [star the repository](https://github.com/qualixar/superlocalmemory) to find the project again. Stars are optional; installation and documentation are open without one.
32
+
33
+ **Release maintenance:** dependency updates are being reviewed separately in [PR #143](https://github.com/qualixar/superlocalmemory/pull/143). This documentation update does not change already published packages.
34
+
35
+ ## Governance, architecture and research
36
+
14
37
  <p align="center"><strong>The governed memory layer for AI agents: local-first, auditable, and built for the compliance obligations teams now actually carry.</strong><br/>
15
38
  Models are interchangeable and rented by the token. What your agents <em>remember</em> is
16
39
  yours — it is your customers' data, your retention obligations, and your audit trail. SLM
@@ -27,12 +50,12 @@ guarantee here is stated as a falsifiable invariant, tested under an adversarial
27
50
  negative control, and shipped with the harness that regenerates the evidence:
28
51
  <code>python benchmark/run_all.py --trials 200 --output-dir results/</code>. What each experiment
29
52
  does <em>not</em> exercise is stated too.</p>
30
- <p align="center"><code>v4.1.17</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/>
53
+ <p align="center"><code>v4.1.19</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
54
  Proxy: <code>slm wrap claude</code> &nbsp;·&nbsp; MCP: add <code>slm_compress</code> to your config &nbsp;·&nbsp; Skill: zero-config</p>
32
55
  <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
56
 
34
57
  <p align="center">
35
- <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/v4.1.17-Current_Release-2ea44f?style=for-the-badge&logo=checkmarx&logoColor=white" alt="v4.1.17 — Current Release"/></a>
58
+ <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/v4.1.19-Current_Release-2ea44f?style=for-the-badge&logo=checkmarx&logoColor=white" alt="v4.1.19 — Current Release"/></a>
36
59
  <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
60
  <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
61
  <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>
@@ -68,10 +91,10 @@ SuperLocalMemory V4 combines conventional dense and lexical retrieval with graph
68
91
  - **Multi-scope memory & profiles** — workspaces (profiles) plus `personal` / `shared` / `global` scopes; cross-profile recall is default-deny.
69
92
  - **Cache & compression (context optimization)** — exact-match cache with tagged invalidation, safe compression, and opt-in reversible/aggressive paths across proxy, MCP, and skill surfaces.
70
93
  - **Entity Explorer & skill evolution** — compiled entity summaries/timelines; opt-in skill lineage, budgets, and verification outcomes.
71
- - **Modes A / B / C** — local-only (A), on-device LLM enrichment (B), provider-assisted (C). An operating mode records technical locality facts; it does **not** determine EU AI Act legal compliance (that is deployment-context assessment — see [Privacy controls](#privacy-controls-and-operating-modes)).
94
+ - **Modes A / B / C** — local-only by default (A), on-device LLM enrichment (B), provider-assisted (C). An operating mode records technical locality facts; it does **not** determine EU AI Act legal compliance (that is deployment-context assessment — see [Privacy controls](#privacy-controls-and-operating-modes)).
72
95
  - **GDPR posture, retention & audit chain** — export, fail-closed cross-store erasure, retention policies, and a hash-chained audit trail. Engineering controls for compliance programs, not a legal certification.
73
96
  - **7-layer retrieval/recall stack & code graph** — multi-channel candidates (semantic, BM25, temporal, Hopfield, spreading activation) plus optional code-graph tools for blast radius and review context.
74
- - **MCP profiles** — `code` exposes **31** tools for installed coding agents; `full` **49**; `power` **61**; `whole` **94** (all registered). Also `core` (16), `mesh` (8), and the unrestricted default surface (49 with mesh enabled).
97
+ - **MCP profiles** — `code` (38 tools) for installed coding agents; `full` (54 tools); `power` (66 tools); `whole` (101 tools, all registered). Also `core` (18 tools), `mesh` (8 tools), and the unrestricted default surface — the same 54 tools as `full`.
75
98
  - **Governed write path & verifiable transactions** — admission + policy control, a per-owner obligation ledger, and a hash-sealed completion manifest with a reconciler that redrives unmet obligations.
76
99
  - **Self-healing lifecycle & admin remediation** — stale locks cleared on restart; list/resolve stuck operations from CLI, MCP, or the dashboard.
77
100
 
@@ -150,6 +173,7 @@ health surfaces expose the stages actually completed by the installed runtime.
150
173
  | **Memory boundaries** | Profile-isolated workspaces plus `personal`, `shared`, and `global` memory scopes | Personal is the default; shared/global recall requires explicit scope policy or per-call opt-in. |
151
174
  | **Ingestion** | Durable raw-to-complete operation state, fact extraction, entity resolution, graph/temporal/provenance derivations, and replay-safe identity | `--sync` waits for declared stages; dependencies and mode determine which enrichers are available. |
152
175
  | **Retrieval and recall** | Semantic, lexical, temporal, Hopfield and spreading-activation candidate channels; RRF fusion, optional reranking and graph score enhancement | Healthy channels participate; response provenance states the evidence used. |
176
+ | **Answer check** | A check (on-device or hosted) that reports whether the top results actually answer the question, not just whether they're related | Until you choose, it runs only once an on-device install has passed its check; otherwise it is off. The hosted check runs only after you turn it on and agree. Results are never filtered or hidden because of it. See [docs/answer-check.md](docs/answer-check.md). |
153
177
  | **Brain and learning** | Behavioral patterns, feedback/outcome records, rewards, consolidation, LightGBM-related ranking components, soft prompts, and guarded skill-evolution workflows | Learning is evidence-driven; it does not claim autonomous correctness or guaranteed improvement. |
154
178
  | **Knowledge graph and entities** | Canonical entities, aliases, entity profiles, graph edges, scenes, timelines, explorer and graph APIs | Stored/derived graph data is evidence, not an instruction authority. |
155
179
  | **Scale Engine** | SQLite + sqlite-vec are canonical. CozoDB graph and LanceDB vector projections are managed with prepare → verify → promote → rollback; a structurally detected pre-v3.7 projection can be explicitly adopted. | Promotion is parity-gated and crash-recoverable. Legacy adoption preserves the prior projection as a rollback backup; repeated physical edge rows normalize to one logical edge with the strongest weight. |
@@ -379,10 +403,10 @@ Full docs: [docs/multi-machine.md](docs/multi-machine.md) · [docs/distributed-d
379
403
  | Path | Command | When |
380
404
  |:-----|:--------|:-----|
381
405
  | **npm global CLI** (primary) | `npm install -g superlocalmemory` | Node 18+; package-owned virtual environment; system Python is not modified; run `slm setup` explicitly afterward |
382
- | **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 |
406
+ | **Python CLI + SDK** (primary) | Activate a Python virtual environment, then `python -m pip install superlocalmemory` | Python 3.12+; the `slm` CLI and importable SDK stay inside that environment |
383
407
  | **Repository clone — macOS/Linux** | `./scripts/install.sh install` | Research/contributor path; delegates to an existing uv or pipx installation |
384
408
  | **Repository clone — Windows** | `.\scripts\install.ps1 -Action Install` | Research/contributor path; delegates to an existing uv or pipx installation |
385
- | **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 |
409
+ | **Claude Code Plugin** | `/plugin marketplace add qualixar/superlocalmemory` then `/plugin install superlocalmemory@qualixar` | Self-bootstraps venv, additive, no isolated data directory — reads the same store as every other install and sets no `SLM_MCP_PROFILE`, so it defaults to the same 54-tool `full` surface. Ships the skills/agents/hooks/commands |
386
410
  | **Portable / IDE connect** | `slm connect <ide> [--here]` | Wire any IDE without reinstalling; `slm connect claude-code` → plugin pointer |
387
411
 
388
412
  After any install path: `slm setup` → `slm doctor` → `slm warmup` (optional, pre-downloads ~500MB embedding model).
@@ -435,12 +459,12 @@ Control tool surface via `SLM_MCP_PROFILE`:
435
459
 
436
460
  | Profile | Tools | Use case |
437
461
  |:--------|:-----:|:---------|
438
- | `core` | 16 | Memory, session, optimize, and correction review |
439
- | `code` | 31 | Core + portable Brain evidence + code-graph tools + profile switching + bounded loops |
462
+ | `core` | 18 | Memory, session, optimize, and correction review |
463
+ | `code` | 38 | Core + portable Brain evidence + code-graph tools + profile switching + bounded loops + memory-kind management |
440
464
  | `mesh` | 8 | SLM-Mesh only — multi-session / multi-machine coordination |
441
- | `full` | 49 | Memory + portable Brain evidence + optimize + evolution + mesh + bounded loops |
442
- | `power` | 61 | Full + administration, lifecycle, and diagnostics |
443
- | `whole` | 94 | Every registered MCP tool |
465
+ | `full` | 54 | Memory + portable Brain evidence + optimize + evolution + mesh + bounded loops + memory-kind management (also the no-profile default) |
466
+ | `power` | 66 | Full + administration, lifecycle, and diagnostics |
467
+ | `whole` | 101 | Every registered MCP tool |
444
468
 
445
469
  **Precedence:** `ALL` > `TOOLS` > `PROFILE` > `default`
446
470
 
@@ -491,7 +515,7 @@ Hermes users get the same SLM skills and advisor roles through a native
491
515
  `plugin.yaml` package, plus `/slm <command>` and generated `/slm-<command>`
492
516
  aliases for the public CLI surface. The plugin is intentionally separate from
493
517
  the PyPI/npm runtime: install the owning SLM runtime first, then install the
494
- reviewed pinned pack from the `v4.1.13` GitHub release. It is additive and does
518
+ reviewed pinned pack from the `v4.1.19` GitHub release. It is additive and does
495
519
  not replace Hermes's selected memory provider or existing configuration. See
496
520
  [the Hermes integration guide](docs/hermes.md).
497
521
 
@@ -515,17 +539,17 @@ For the other three, replace the directory from the tag you are on.
515
539
 
516
540
  | Mode | What | Core memory path | Optional network behavior |
517
541
  |:----:|:-----|:-----------------|:--------------------------|
518
- | **A** | Local Guardian | Local processing | Model/dependency downloads, connectors, backup, and other enabled integrations may use the network |
542
+ | **A** | Local Guardian | Local processing | Model/dependency downloads, connectors, backup, the online answer check, and other enabled integrations may use the network |
519
543
  | **B** | Smart Local | Local Ollama enrichment | Same optional integrations as Mode A |
520
544
  | **C** | Provider-assisted | Local storage with provider calls | Query or enrichment content is sent to the configured provider |
521
545
 
522
546
  ```bash
523
- slm mode a # Zero-cloud (default)
547
+ slm mode a # Local only (default)
524
548
  slm mode b # Local Ollama
525
549
  slm mode c # Cloud LLM
526
550
  ```
527
551
 
528
- Mode A can run core memory operations without sending memory content to a cloud model provider. This does not disable optional connectors, cloud backup, proxy providers, dependency acquisition, or model downloads; review configuration and network policy for the deployment.
552
+ Mode A can run core memory operations without sending memory content to a cloud model provider. This does not disable optional connectors, cloud backup, proxy providers, dependency acquisition, or model downloads; review configuration and network policy for the deployment. Memory content leaves the machine in two opt-in cases, not one. The online answer check: off unless you turn it on and agree, in any mode, and while it is on each recall sends its question and top memories to the provider you chose — the dashboard and the MCP `get_mode` tool say so. Jev memory-kind typing: off unless the answer check is already using Jev AND you separately consent to kind typing — both must be the literal boolean `true` — and while it is on, a memory's content (not just the recall question) is sent to Jev to suggest its kind.
529
553
 
530
554
  SuperLocalMemory provides local storage, export/erasure commands, provenance, policy, and audit features that can support a compliance program. The software is not a legal certification, and compliance depends on the use case, operator, configuration, and surrounding systems.
531
555
 
package/bin/slm-npm CHANGED
@@ -28,7 +28,7 @@ if (!fs.existsSync(runtimePython)) {
28
28
  console.error(`Expected the package-owned interpreter at: ${runtimePython}`);
29
29
  console.error('Repair it without touching system Python by running:');
30
30
  console.error(' npm rebuild superlocalmemory');
31
- console.error('If Python is missing, install Python 3.11-3.14 first.');
31
+ console.error('If Python is missing, install Python 3.12-3.14 first.');
32
32
  process.exit(1);
33
33
  }
34
34
 
@@ -6,7 +6,10 @@
6
6
  "mcp"
7
7
  ],
8
8
  "description": "SuperLocalMemory V3 - Local memory system with mathematical foundations and knowledge graphs",
9
- "type": "stdio"
9
+ "type": "stdio",
10
+ "env": {
11
+ "SLM_MCP_PROFILE": "code"
12
+ }
10
13
  }
11
14
  }
12
15
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "superlocalmemory",
3
- "version": "4.1.17",
3
+ "version": "4.1.19",
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",
@@ -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. 34-tool code profile with graph intelligence.",
6
+ "description": "Local-first agent memory + reversible context compression and KV cache, as an MCP server. 38-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.1.17"
18
+ "version": "4.1.19"
19
19
  }
package/plugin/CLAUDE.md CHANGED
@@ -1,8 +1,8 @@
1
- <!-- BEGIN SuperLocalMemory v4.1.17 -->
1
+ <!-- BEGIN SuperLocalMemory v4.1.19 -->
2
2
 
3
3
  ## SuperLocalMemory (SLM) — Agent Rules
4
4
 
5
- SLM is local-first memory for agents. All tools run on the user's machine; no cloud calls.
5
+ SLM is local-first memory for agents. All tools run on the user's machine; nothing goes to the cloud unless the user chose Mode C, turned on the online answer check, or separately opted into Jev memory-kind typing (its own consent, on top of the answer check already using Jev).
6
6
 
7
7
  ### Session start
8
8
  Call `session_init(project_path, query)` ONCE per fresh session before any recall/remember. Never twice.
@@ -17,6 +17,7 @@ Call `session_init(project_path, query)` ONCE per fresh session before any recal
17
17
  ### Recall
18
18
  - `recall` for conceptual/semantic queries; `search` for exact keywords.
19
19
  - Phrase as concepts; pass session_id when available. Never fabricate.
20
+ - If `abstained` is `true`, the returned memories do not answer the question — say so, or ask; never present them as the answer. `answer_confidence` is a measurement, not a guarantee.
20
21
 
21
22
  ### Optimize (fail-open)
22
23
  - Output >2000 chars → `slm_compress(mode="auto", reversible=True)`; keep ccr_id if lossy.
@@ -39,6 +40,6 @@ slm-recall · slm-remember · slm-session · slm-status · slm-cache · slm-comp
39
40
  ### Subagents
40
41
  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
42
 
42
- <!-- END SuperLocalMemory v4.1.17 -->
43
+ <!-- END SuperLocalMemory v4.1.19 -->
43
44
 
44
- SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later
45
+ SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later
80
+ SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later
71
+ SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later
@@ -17,7 +17,7 @@ When the main agent: starts a session and hasn't loaded project context; is abou
17
17
 
18
18
  # Tools you may use (real SLM MCP tools, core profile)
19
19
  - `session_init(project_path, query, max_results, max_age_days)` — ONCE at session start; returns recent decisions + relevant memories.
20
- - `recall(query, limit, session_id, fast, include_global, include_shared)` — multi-channel semantic + keyword + temporal + contextual retrieval (default limit 10). Leave `include_global`/`include_shared` unset — recall is private-by-default (v3.6.15). Returns fast local results (~1–2s, no server-side LLM round) plus confidence signals: if `no_confident_match` is true or `answer_confidence` is low, advise the main agent to rewrite into 1–3 sharper sub-queries and recall again rather than treating the memory as absent.
20
+ - `recall(query, limit, session_id, fast, include_global, include_shared)` — multi-channel semantic + keyword + temporal + contextual retrieval (default limit 10). Leave `include_global`/`include_shared` unset — recall is private-by-default (v3.6.15). Returns results from this machine in about 1–2 s (no server-side LLM round unless the user turned on the online answer check, which adds one request per recall) plus confidence signals: if `no_confident_match` is true or `answer_confidence` is low, advise the main agent to rewrite into 1–3 sharper sub-queries and recall again rather than treating the memory as absent.
21
21
  - `search(query, limit, profile_id)` — exact keyword / FTS5 BM25.
22
22
  - `remember(content, tags, project, importance, session_id, scope, shared_with)` — store atomic fact; importance 1-10. Leave `scope` unset (defaults to `personal`/private).
23
23
  - `update_memory(fact_id, content)` — correct by exact id.
@@ -32,10 +32,11 @@ When the main agent: starts a session and hasn't loaded project context; is abou
32
32
  4. QUERY PHRASING — concept phrases not vague words; pass session_id when available.
33
33
  5. recall vs search — recall for conceptual; search for literal keyword.
34
34
  6. EMPTY/LOW results → broaden, try search, or list_recent; never fabricate.
35
- 7. SESSION END — close_session(session_id) when work meaningfully complete.
36
- 8. SCOPE IS OPT-IN (v3.6.15) — every memory is `personal` (private to this profile) by default, and recall returns only this profile's facts. Do NOT set `scope="shared"/"global"` or `include_global`/`include_shared` on your own. Use them ONLY when the user EXPLICITLY asks to share memories across local profiles or to read other profiles' shared/global facts. Default behaviour is identical to single-profile SLM. See slm-scope for the complete sharing model.
37
- 9. PROFILE CONTEXT (v3.8.0) — session_init and all memory ops use the active profile. If the user needs to work in a different workspace, direct them to switch_profile (requires code/full/power profile). See slm-profile.
38
- 10. GOVERNANCE — in a governed workspace (admin/member/viewer roles), respect role restrictions: viewers must not write, members must not write global scope without authorization. See slm-governance.
35
+ 7. ABSTAINED MEANS DON'T ANSWER FROM THESE — if `abstained` is `true`, the memories `recall`/`session_init` returned do not answer the question; say you don't have it, or ask, never present them as the answer. `answer_confidence` is a measurement, not a guarantee.
36
+ 8. SESSION END — close_session(session_id) when work meaningfully complete.
37
+ 9. SCOPE IS OPT-IN (v3.6.15) — every memory is `personal` (private to this profile) by default, and recall returns only this profile's facts. Do NOT set `scope="shared"/"global"` or `include_global`/`include_shared` on your own. Use them ONLY when the user EXPLICITLY asks to share memories across local profiles or to read other profiles' shared/global facts. Default behaviour is identical to single-profile SLM. See slm-scope for the complete sharing model.
38
+ 10. PROFILE CONTEXT (v3.8.0) — session_init and all memory ops use the active profile. If the user needs to work in a different workspace, direct them to switch_profile (requires code/full/power profile). See slm-profile.
39
+ 11. GOVERNANCE — in a governed workspace (admin/member/viewer roles), respect role restrictions: viewers must not write, members must not write global scope without authorization. See slm-governance.
39
40
 
40
41
  # CLI fallback (MCP unavailable)
41
42
  recall→`slm recall "<q>" --limit N` (add `--include-global`/`--include-shared` only on explicit user request) · search→`slm search "<q>"` · remember→`slm remember "<c>" --tags a,b` (project/importance are MCP-only, NOT CLI flags; `--scope shared --shared-with a,b` only when the user asks to share) · list→`slm list --limit N` · forget→`slm forget` (preview first) · status→`slm status`. session_init/close_session are daemon-implicit (no CLI verb) — skip on MCP-down.
@@ -46,4 +47,4 @@ slm-recall · slm-remember · slm-session · slm-scope · slm-profile · slm-gov
46
47
  # What NOT to do
47
48
  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
49
 
49
- SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later
50
+ SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later
44
+ SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later
@@ -1 +1 @@
1
- superlocalmemory==4.1.17
1
+ superlocalmemory==4.1.19
@@ -12,7 +12,7 @@
12
12
  :: Exit codes: 0 = venv ready non-0 = failure (logged to stderr)
13
13
  :: All informational output goes to stderr (stdout reserved for MCP stdio protocol).
14
14
  ::
15
- :: Requires: Python 3.11+ on PATH, pip, standard Windows cmd.exe
15
+ :: Requires: Python 3.12+ on PATH, pip, standard Windows cmd.exe
16
16
 
17
17
  setlocal EnableDelayedExpansion
18
18
 
@@ -29,13 +29,13 @@ if not defined CLAUDE_PLUGIN_DATA (
29
29
  )
30
30
 
31
31
  :: ---------------------------------------------------------------------------
32
- :: Python >= 3.11 guard
32
+ :: Python >= 3.12 guard
33
33
  :: ---------------------------------------------------------------------------
34
- python -c "import sys; sys.exit(0 if sys.version_info >= (3, 11) else 1)" 2>nul
34
+ python -c "import sys; sys.exit(0 if sys.version_info >= (3, 12) else 1)" 2>nul
35
35
  if errorlevel 1 (
36
36
  for /f "tokens=*" %%v in ('python --version 2^>^&1') do set PY_VER=%%v
37
- echo ERROR: SuperLocalMemory plugin requires Python ^>= 3.11, found: !PY_VER! >&2
38
- echo Install Python 3.11+ and ensure it is first on PATH. >&2
37
+ echo ERROR: SuperLocalMemory plugin requires Python ^>= 3.12, found: !PY_VER! >&2
38
+ echo Install Python 3.12+ and ensure it is first on PATH. >&2
39
39
  exit /b 1
40
40
  )
41
41
 
@@ -25,12 +25,12 @@ set -euo pipefail
25
25
  exec 1>&2
26
26
 
27
27
  # ---------------------------------------------------------------------------
28
- # Python >= 3.11 guard
28
+ # Python >= 3.12 guard
29
29
  # ---------------------------------------------------------------------------
30
- if ! python3 -c "import sys; sys.exit(0 if sys.version_info >= (3, 11) else 1)" 2>/dev/null; then
30
+ if ! python3 -c "import sys; sys.exit(0 if sys.version_info >= (3, 12) else 1)" 2>/dev/null; then
31
31
  PY_VER=$(python3 --version 2>&1 || echo "unknown")
32
- echo "ERROR: SuperLocalMemory plugin requires Python >= 3.11, found: ${PY_VER}" >&2
33
- echo "Install Python 3.11+ and ensure it is first on PATH." >&2
32
+ echo "ERROR: SuperLocalMemory plugin requires Python >= 3.12, found: ${PY_VER}" >&2
33
+ echo "Install Python 3.12+ and ensure it is first on PATH." >&2
34
34
  exit 1
35
35
  fi
36
36
 
@@ -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.1.17 · Qualixar · AGPL-3.0-or-later
148
+ SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later
150
+ SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later*
248
+ *SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later
315
+ SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later
99
+ SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later
@@ -279,4 +279,4 @@ mesh availability.
279
279
 
280
280
  ---
281
281
 
282
- *SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later*
282
+ *SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later*
@@ -31,9 +31,9 @@ project, a client engagement, a production vs staging environment.
31
31
  | Profile | Tools | When to use |
32
32
  |---------|-------|-------------|
33
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 |
34
+ | `code` | 38 tools — core + portable Brain evidence + code graph + profile switching + bounded loops + memory-kind management | Default for IDE/coding agents |
35
+ | `full` | 54 tools — code + all memory ops + mesh + bounded loops | Multi-session, team workflows |
36
+ | `power` | 66 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.1.17 · Qualixar · AGPL-3.0-or-later*
149
+ *SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later*
@@ -93,7 +93,12 @@ Real response shape (`--json` equivalent):
93
93
  },
94
94
  "incomplete_channels": [],
95
95
  "retrieval_time_ms": 134,
96
- "no_confident_match": false
96
+ "no_confident_match": false,
97
+ "calibration_status": "uncalibrated",
98
+ "calibration_id": null,
99
+ "answer_confidence": null,
100
+ "abstained": false,
101
+ "abstention_reason": null
97
102
  }
98
103
  ```
99
104
 
@@ -124,7 +129,9 @@ rest come back empty.
124
129
  say so to the user rather than reporting "no memories found". `incomplete_channels`
125
130
  carries the same warning as a plain list.
126
131
 
127
- **Refine on low confidence.** `recall` returns confidence signals with every result. If `no_confident_match` is `true` (or `answer_confidence` is low / `abstained` is `true`), do NOT invent a memory — rewrite the query into 1–3 more specific sub-queries (split multi-hop questions; try entity names, synonyms, or broader phrasing) and call `recall` again before concluding nothing was found. A confident match → use it directly. SLM returns fast local results (~1–2s, no server-side LLM round on the hot path) and lets you, the calling model, drive this refinement.
132
+ **Refine on low confidence.** `recall` returns confidence signals with every result. If `no_confident_match` is `true` (or `answer_confidence` is low / `abstained` is `true`), do NOT invent a memory — rewrite the query into 1–3 more specific sub-queries (split multi-hop questions; try entity names, synonyms, or broader phrasing) and call `recall` again before concluding nothing was found. A confident match → use it directly. SLM answers from this machine in about 1–2 s, with no server-side LLM round — unless the user turned on the online answer check, which adds one request to that service per recall — and lets you, the calling model, drive this refinement.
133
+
134
+ **`abstained` means the results shown do not answer the question.** If `abstained` is `true`, say you don't have it, or ask — never present the returned memories as the answer anyway. `abstention_reason` distinguishes why: `"judged_insufficient"` means candidates were found and scored, but none of them actually answers this question; `"evidence_floor"` / `"no_candidates"` means nothing was found at all. `answer_confidence` is a measurement, not a guarantee — treat a low number the same way you'd treat `abstained: true`. `calibration_status: "uncalibrated"` means no judge is configured for this recall; in that case `abstained` only ever reflects the older "nothing found" signal.
128
135
 
129
136
  ### 2. Passing session_id
130
137
 
@@ -323,4 +330,4 @@ before recalling, then switch back. See `slm-profile` for workspace switching.
323
330
 
324
331
  ---
325
332
 
326
- *SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later*
333
+ *SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later*
@@ -270,4 +270,4 @@ different workspace, use `switch_profile` first. See `slm-profile`.
270
270
 
271
271
  ---
272
272
 
273
- *SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later*
273
+ *SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later*
176
+ *SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later*
@@ -92,6 +92,11 @@ session_init(
92
92
  "core_memory": [],
93
93
  "degraded_mode": false,
94
94
  "retrieval_mode": "full_6_channel",
95
+ "calibration_status": "uncalibrated",
96
+ "calibration_id": null,
97
+ "answer_confidence": null,
98
+ "abstained": false,
99
+ "abstention_reason": null,
95
100
  "learning": {
96
101
  "feedback_signals": 37,
97
102
  "phase": 1,
@@ -104,6 +109,16 @@ session_init(
104
109
  FTS5 BM25 was used — semantic, graph, temporal, and structural channels were
105
110
  unavailable. The context is still usable; note the degradation if relevant.
106
111
 
112
+ **Check `abstained`.** If `true`, the memories returned in `context` and
113
+ `memories` do not answer the query that seeded this session — say so, or
114
+ ask, rather than presenting them as settled fact. This is most relevant
115
+ when you passed an explicit `query`; the default project-context query
116
+ rarely has a single "right answer" for a judge to evaluate.
117
+ `answer_confidence` is a measurement, not a guarantee. `calibration_status:
118
+ "uncalibrated"` means no judge is configured, and `abstained` then only
119
+ reflects the older "nothing found" signal. See `slm-recall` for the full
120
+ rule, which applies identically here.
121
+
107
122
  **Check `learning.phase`:**
108
123
  - Phase 1 (< 50 signals): collecting baseline feedback
109
124
  - Phase 2 (50–199 signals): active learning
@@ -253,4 +268,4 @@ explicitly and call `recall` with `include_global`/`include_shared` after
253
268
 
254
269
  ---
255
270
 
256
- *SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later*
271
+ *SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later*
@@ -163,4 +163,4 @@ multi-profile setup. To switch the active profile, see `slm-profile`.
163
163
 
164
164
  ---
165
165
 
166
- SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later
166
+ SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later
@@ -17,7 +17,7 @@ When the main agent: starts a session and hasn't loaded project context; is abou
17
17
 
18
18
  # Tools you may use (real SLM MCP tools, core profile)
19
19
  - `session_init(project_path, query, max_results, max_age_days)` — ONCE at session start; returns recent decisions + relevant memories.
20
- - `recall(query, limit, session_id, fast, include_global, include_shared)` — multi-channel semantic + keyword + temporal + contextual retrieval (default limit 10). Leave `include_global`/`include_shared` unset — recall is private-by-default (v3.6.15). Returns fast local results (~1–2s, no server-side LLM round) plus confidence signals: if `no_confident_match` is true or `answer_confidence` is low, advise the main agent to rewrite into 1–3 sharper sub-queries and recall again rather than treating the memory as absent.
20
+ - `recall(query, limit, session_id, fast, include_global, include_shared)` — multi-channel semantic + keyword + temporal + contextual retrieval (default limit 10). Leave `include_global`/`include_shared` unset — recall is private-by-default (v3.6.15). Returns results from this machine in about 1–2 s (no server-side LLM round unless the user turned on the online answer check, which adds one request per recall) plus confidence signals: if `no_confident_match` is true or `answer_confidence` is low, advise the main agent to rewrite into 1–3 sharper sub-queries and recall again rather than treating the memory as absent.
21
21
  - `search(query, limit, profile_id)` — exact keyword / FTS5 BM25.
22
22
  - `remember(content, tags, project, importance, session_id, scope, shared_with)` — store atomic fact; importance 1-10. Leave `scope` unset (defaults to `personal`/private).
23
23
  - `update_memory(fact_id, content)` — correct by exact id.
@@ -32,10 +32,11 @@ When the main agent: starts a session and hasn't loaded project context; is abou
32
32
  4. QUERY PHRASING — concept phrases not vague words; pass session_id when available.
33
33
  5. recall vs search — recall for conceptual; search for literal keyword.
34
34
  6. EMPTY/LOW results → broaden, try search, or list_recent; never fabricate.
35
- 7. SESSION END — close_session(session_id) when work meaningfully complete.
36
- 8. SCOPE IS OPT-IN (v3.6.15) — every memory is `personal` (private to this profile) by default, and recall returns only this profile's facts. Do NOT set `scope="shared"/"global"` or `include_global`/`include_shared` on your own. Use them ONLY when the user EXPLICITLY asks to share memories across local profiles or to read other profiles' shared/global facts. Default behaviour is identical to single-profile SLM. See slm-scope for the complete sharing model.
37
- 9. PROFILE CONTEXT (v3.8.0) — session_init and all memory ops use the active profile. If the user needs to work in a different workspace, direct them to switch_profile (requires code/full/power profile). See slm-profile.
38
- 10. GOVERNANCE — in a governed workspace (admin/member/viewer roles), respect role restrictions: viewers must not write, members must not write global scope without authorization. See slm-governance.
35
+ 7. ABSTAINED MEANS DON'T ANSWER FROM THESE — if `abstained` is `true`, the memories `recall`/`session_init` returned do not answer the question; say you don't have it, or ask, never present them as the answer. `answer_confidence` is a measurement, not a guarantee.
36
+ 8. SESSION END — close_session(session_id) when work meaningfully complete.
37
+ 9. SCOPE IS OPT-IN (v3.6.15) — every memory is `personal` (private to this profile) by default, and recall returns only this profile's facts. Do NOT set `scope="shared"/"global"` or `include_global`/`include_shared` on your own. Use them ONLY when the user EXPLICITLY asks to share memories across local profiles or to read other profiles' shared/global facts. Default behaviour is identical to single-profile SLM. See slm-scope for the complete sharing model.
38
+ 10. PROFILE CONTEXT (v3.8.0) — session_init and all memory ops use the active profile. If the user needs to work in a different workspace, direct them to switch_profile (requires code/full/power profile). See slm-profile.
39
+ 11. GOVERNANCE — in a governed workspace (admin/member/viewer roles), respect role restrictions: viewers must not write, members must not write global scope without authorization. See slm-governance.
39
40
 
40
41
  # CLI fallback (MCP unavailable)
41
42
  recall→`slm recall "<q>" --limit N` (add `--include-global`/`--include-shared` only on explicit user request) · search→`slm search "<q>"` · remember→`slm remember "<c>" --tags a,b` (project/importance are MCP-only, NOT CLI flags; `--scope shared --shared-with a,b` only when the user asks to share) · list→`slm list --limit N` · forget→`slm forget` (preview first) · status→`slm status`. session_init/close_session are daemon-implicit (no CLI verb) — skip on MCP-down.
@@ -46,4 +47,4 @@ slm-recall · slm-remember · slm-session · slm-scope · slm-profile · slm-gov
46
47
  # What NOT to do
47
48
  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
49
 
49
- SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later
50
+ SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later
44
+ SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later
@@ -28,7 +28,8 @@ Call `session_init(project_path, query, max_results, max_age_days)` **once** at
28
28
  - **Concept phrasing** — phrase queries as concepts, not vague words ("database migration strategy" not "database").
29
29
  - **Pass session_id** when available to narrow results to the current session.
30
30
  - **Empty / low results** — broaden the query, try `search`, or fall back to `list_recent`. Never fabricate a memory.
31
- - **Refine on low confidence** — if `no_confident_match` is `true` (or `answer_confidence` is low / `abstained` is `true`), rewrite the query into 1–3 more specific sub-queries (split multi-hop questions; try entity names, synonyms, or broader phrasing) and call `recall` again before concluding nothing was found. SLM returns fast local results (~1–2s, no server-side LLM round on the hot path) — you, the calling model, drive refinement.
31
+ - **Refine on low confidence** — if `no_confident_match` is `true` (or `answer_confidence` is low / `abstained` is `true`), rewrite the query into 1–3 more specific sub-queries (split multi-hop questions; try entity names, synonyms, or broader phrasing) and call `recall` again before concluding nothing was found. SLM answers from this machine in about 1–2 s, with no server-side LLM round — unless the user turned on the online answer check, which adds one request to that service per recall. You, the calling model, drive refinement.
32
+ - **Abstained means do not answer from these** — if `abstained` is `true`, the returned memories do not answer the question: say you don't have it, or ask. Never present them as the answer. `answer_confidence` is a measurement, not a guarantee. `abstention_reason: "judged_insufficient"` means candidates were found but none answers; `"evidence_floor"`/`"no_candidates"` means nothing was found.
32
33
 
33
34
  ---
34
35
 
@@ -82,16 +83,27 @@ When the SLM MCP server is unavailable, use these CLI equivalents:
82
83
 
83
84
  ## Tool reference (core profile — 18 tools)
84
85
 
85
- > The MCP config ships `SLM_MCP_PROFILE=code` and `SLM_AGENT_ID=claude_code` (34 tools):
86
- > the 18 core tools below **plus** 6 code-graph tools (`build_code_graph`,
87
- > `get_blast_radius`, `query_graph`, `semantic_search_code`, `get_review_context`,
88
- > `detect_changes`), 5 portable-evidence tools (`get_brain_evidence_status`,
89
- > `record_agent_experience`, `record_cognitive_turn`, `finalize_cognitive_turn`,
90
- > `observe_bounded_loop_evidence`), 3 bounded-loop tools (`slm_loop_run`,
91
- > `slm_loop_history`, `slm_loop_show`) and 2 usefulness reports (`report_outcome`,
92
- > `report_feedback`).
93
- > Use `full` (50 tools) to add mesh coordination. Use `power` (62 tools) for governance
94
- > and audit tools. See slm-profile for profile switching.
86
+ > The MCP config ships only `SLM_AGENT_ID=claude_code` — no `SLM_MCP_PROFILE` —
87
+ > so it falls back to the same no-profile default every install gets: the
88
+ > 54-tool `full` surface. That is the 18 core tools below **plus** mesh
89
+ > coordination (8: `mesh_summary`, `mesh_peers`, `mesh_send`, `mesh_inbox`,
90
+ > `mesh_state`, `mesh_lock`, `mesh_events`, `mesh_status`), portable-evidence
91
+ > tools (5: `get_brain_evidence_status`, `record_agent_experience`,
92
+ > `record_cognitive_turn`, `finalize_cognitive_turn`,
93
+ > `observe_bounded_loop_evidence`), memory-kind tools (4: `set_memory_kind`,
94
+ > `memory_kinds_status`, `review_memory_kinds`, `confirm_memory_kinds`),
95
+ > bounded-loop tools (3: `slm_loop_run`, `slm_loop_history`, `slm_loop_show`),
96
+ > usefulness reports (2: `report_outcome`, `report_feedback`) and 14 more
97
+ > administration/learning tools (`delete_memory`, `get_status`, `observe`,
98
+ > `run_maintenance`, `consolidate_cognitive`, `get_soft_prompts`, `set_mode`,
99
+ > `log_tool_event`, `get_assertions`, `reinforce_assertion`,
100
+ > `contradict_assertion`, `evolve_skill`, `skill_health`, `skill_lineage`).
101
+ > Set `SLM_MCP_PROFILE=code` yourself for the narrower 38-tool `code` surface,
102
+ > which trades mesh and administration tools for 6 code-graph tools
103
+ > (`build_code_graph`, `get_blast_radius`, `query_graph`,
104
+ > `semantic_search_code`, `get_review_context`, `detect_changes`). Use
105
+ > `power` (66 tools) for governance and audit tools. See slm-profile for
106
+ > profile switching.
95
107
 
96
108
  | Tool | Signature (key params) | Notes |
97
109
  |--------------------|----------------------------------------------------------------------------------------------|----------------------------------------|
@@ -137,4 +149,4 @@ When the SLM MCP server is unavailable, use these CLI equivalents:
137
149
  - **slm-optimize-advisor** — context compression and KV cache
138
150
  - **slm-governance-advisor** — scope/role compliance, retention policies, GDPR
139
151
 
140
- SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later
152
+ SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later
@@ -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.1.17 · Qualixar · AGPL-3.0-or-later
148
+ SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later
150
+ SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later*
248
+ *SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later
315
+ SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later
99
+ SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later
@@ -279,4 +279,4 @@ mesh availability.
279
279
 
280
280
  ---
281
281
 
282
- *SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later*
282
+ *SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later*
@@ -31,9 +31,9 @@ project, a client engagement, a production vs staging environment.
31
31
  | Profile | Tools | When to use |
32
32
  |---------|-------|-------------|
33
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 |
34
+ | `code` | 38 tools — core + portable Brain evidence + code graph + profile switching + bounded loops + memory-kind management | Default for IDE/coding agents |
35
+ | `full` | 54 tools — code + all memory ops + mesh + bounded loops | Multi-session, team workflows |
36
+ | `power` | 66 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.1.17 · Qualixar · AGPL-3.0-or-later*
149
+ *SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later*
@@ -93,7 +93,12 @@ Real response shape (`--json` equivalent):
93
93
  },
94
94
  "incomplete_channels": [],
95
95
  "retrieval_time_ms": 134,
96
- "no_confident_match": false
96
+ "no_confident_match": false,
97
+ "calibration_status": "uncalibrated",
98
+ "calibration_id": null,
99
+ "answer_confidence": null,
100
+ "abstained": false,
101
+ "abstention_reason": null
97
102
  }
98
103
  ```
99
104
 
@@ -124,7 +129,9 @@ rest come back empty.
124
129
  say so to the user rather than reporting "no memories found". `incomplete_channels`
125
130
  carries the same warning as a plain list.
126
131
 
127
- **Refine on low confidence.** `recall` returns confidence signals with every result. If `no_confident_match` is `true` (or `answer_confidence` is low / `abstained` is `true`), do NOT invent a memory — rewrite the query into 1–3 more specific sub-queries (split multi-hop questions; try entity names, synonyms, or broader phrasing) and call `recall` again before concluding nothing was found. A confident match → use it directly. SLM returns fast local results (~1–2s, no server-side LLM round on the hot path) and lets you, the calling model, drive this refinement.
132
+ **Refine on low confidence.** `recall` returns confidence signals with every result. If `no_confident_match` is `true` (or `answer_confidence` is low / `abstained` is `true`), do NOT invent a memory — rewrite the query into 1–3 more specific sub-queries (split multi-hop questions; try entity names, synonyms, or broader phrasing) and call `recall` again before concluding nothing was found. A confident match → use it directly. SLM answers from this machine in about 1–2 s, with no server-side LLM round — unless the user turned on the online answer check, which adds one request to that service per recall — and lets you, the calling model, drive this refinement.
133
+
134
+ **`abstained` means the results shown do not answer the question.** If `abstained` is `true`, say you don't have it, or ask — never present the returned memories as the answer anyway. `abstention_reason` distinguishes why: `"judged_insufficient"` means candidates were found and scored, but none of them actually answers this question; `"evidence_floor"` / `"no_candidates"` means nothing was found at all. `answer_confidence` is a measurement, not a guarantee — treat a low number the same way you'd treat `abstained: true`. `calibration_status: "uncalibrated"` means no judge is configured for this recall; in that case `abstained` only ever reflects the older "nothing found" signal.
128
135
 
129
136
  ### 2. Passing session_id
130
137
 
@@ -323,4 +330,4 @@ before recalling, then switch back. See `slm-profile` for workspace switching.
323
330
 
324
331
  ---
325
332
 
326
- *SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later*
333
+ *SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later*
@@ -270,4 +270,4 @@ different workspace, use `switch_profile` first. See `slm-profile`.
270
270
 
271
271
  ---
272
272
 
273
- *SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later*
273
+ *SuperLocalMemory v4.1.19 · 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.1.17 · Qualixar · AGPL-3.0-or-later*
176
+ *SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later*
@@ -92,6 +92,11 @@ session_init(
92
92
  "core_memory": [],
93
93
  "degraded_mode": false,
94
94
  "retrieval_mode": "full_6_channel",
95
+ "calibration_status": "uncalibrated",
96
+ "calibration_id": null,
97
+ "answer_confidence": null,
98
+ "abstained": false,
99
+ "abstention_reason": null,
95
100
  "learning": {
96
101
  "feedback_signals": 37,
97
102
  "phase": 1,
@@ -104,6 +109,16 @@ session_init(
104
109
  FTS5 BM25 was used — semantic, graph, temporal, and structural channels were
105
110
  unavailable. The context is still usable; note the degradation if relevant.
106
111
 
112
+ **Check `abstained`.** If `true`, the memories returned in `context` and
113
+ `memories` do not answer the query that seeded this session — say so, or
114
+ ask, rather than presenting them as settled fact. This is most relevant
115
+ when you passed an explicit `query`; the default project-context query
116
+ rarely has a single "right answer" for a judge to evaluate.
117
+ `answer_confidence` is a measurement, not a guarantee. `calibration_status:
118
+ "uncalibrated"` means no judge is configured, and `abstained` then only
119
+ reflects the older "nothing found" signal. See `slm-recall` for the full
120
+ rule, which applies identically here.
121
+
107
122
  **Check `learning.phase`:**
108
123
  - Phase 1 (< 50 signals): collecting baseline feedback
109
124
  - Phase 2 (50–199 signals): active learning
@@ -253,4 +268,4 @@ explicitly and call `recall` with `include_global`/`include_shared` after
253
268
 
254
269
  ---
255
270
 
256
- *SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later*
271
+ *SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later*
@@ -163,4 +163,4 @@ multi-profile setup. To switch the active profile, see `slm-profile`.
163
163
 
164
164
  ---
165
165
 
166
- SuperLocalMemory v4.1.17 · Qualixar · AGPL-3.0-or-later
166
+ SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later
@@ -17,7 +17,7 @@ const fs = require('fs');
17
17
  const path = require('path');
18
18
  const os = require('os');
19
19
 
20
- const MIN_PYTHON = Object.freeze([3, 11]);
20
+ const MIN_PYTHON = Object.freeze([3, 12]);
21
21
  const MAX_PYTHON_EXCLUSIVE = Object.freeze([3, 15]);
22
22
  const INSTALL_TIMEOUT_MS = 15 * 60 * 1000;
23
23
 
@@ -43,12 +43,19 @@ function pythonCandidates(platform = os.platform()) {
43
43
  ['py', '-3.14'],
44
44
  ['py', '-3.13'],
45
45
  ['py', '-3.12'],
46
- ['py', '-3.11'],
47
46
  ['python3'],
48
47
  ['python'],
49
48
  ];
50
49
  }
50
+ // Debian 12, Ubuntu 22.04 (with deadsnakes) and RHEL 9 all ship a system
51
+ // `python3` older than 3.12, with the supported versioned interpreter
52
+ // installed alongside it, unused. Try the versioned names first so that
53
+ // interpreter is found before falling back to the bare names and the
54
+ // fixed absolute paths below.
51
55
  return [
56
+ ['python3.14'],
57
+ ['python3.13'],
58
+ ['python3.12'],
52
59
  ['python3'],
53
60
  ['python'],
54
61
  ['/opt/homebrew/bin/python3'],
@@ -57,21 +64,44 @@ function pythonCandidates(platform = os.platform()) {
57
64
  ];
58
65
  }
59
66
 
67
+ function probePython(command, prefixArgs) {
68
+ try {
69
+ const result = spawnSync(command, [...prefixArgs, '--version'], {
70
+ stdio: 'pipe',
71
+ timeout: 5000,
72
+ env: process.env,
73
+ });
74
+ const output = `${(result.stdout || '').toString()} ${(result.stderr || '').toString()}`;
75
+ return { status: result.status, version: parsePythonVersion(output) };
76
+ } catch (error) {
77
+ return { status: null, version: null, error };
78
+ }
79
+ }
80
+
60
81
  function findSupportedPython() {
82
+ const override = String(process.env.SLM_PYTHON || '').trim();
83
+ if (override) {
84
+ // The user named this interpreter explicitly (docs/getting-started.md's
85
+ // escape hatch for a system where no supported `python3` is on PATH, for
86
+ // example a deadsnakes or pyenv install at a custom path). Honour it,
87
+ // but still version-check it — and if it fails, say so plainly instead
88
+ // of silently trying a different interpreter the user did not choose.
89
+ const probe = probePython(override, []);
90
+ if (probe.status === 0 && isSupportedPython(probe.version)) {
91
+ return { command: override, prefixArgs: [], version: probe.version };
92
+ }
93
+ const detail = probe.status === 0 && probe.version
94
+ ? `found Python ${probe.version.join('.')}, which is not supported (need 3.12-3.14)`
95
+ : 'could not be run (check the path and that it is executable)';
96
+ console.error(`SuperLocalMemory: SLM_PYTHON=${override} ${detail}.`);
97
+ console.error('Point SLM_PYTHON at a Python 3.12-3.14 interpreter, or unset it to let the installer search automatically.');
98
+ return null;
99
+ }
100
+
61
101
  for (const candidate of pythonCandidates()) {
62
- try {
63
- const result = spawnSync(candidate[0], [...candidate.slice(1), '--version'], {
64
- stdio: 'pipe',
65
- timeout: 5000,
66
- env: process.env,
67
- });
68
- const output = `${(result.stdout || '').toString()} ${(result.stderr || '').toString()}`;
69
- const version = parsePythonVersion(output);
70
- if (result.status === 0 && isSupportedPython(version)) {
71
- return { command: candidate[0], prefixArgs: candidate.slice(1), version };
72
- }
73
- } catch (_error) {
74
- // Try the next interpreter without mutating PATH or the machine.
102
+ const probe = probePython(candidate[0], candidate.slice(1));
103
+ if (probe.status === 0 && isSupportedPython(probe.version)) {
104
+ return { command: candidate[0], prefixArgs: candidate.slice(1), version: probe.version };
75
105
  }
76
106
  }
77
107
  return null;
@@ -142,7 +172,7 @@ function validateRuntimeLocation(venvRoot) {
142
172
 
143
173
  function printPythonGuidance() {
144
174
  console.error('');
145
- console.error('SuperLocalMemory requires Python 3.11, 3.12, 3.13, or 3.14.');
175
+ console.error('SuperLocalMemory requires Python 3.12, 3.13, or 3.14.');
146
176
  console.error('Install Python from https://www.python.org/downloads/ and rerun:');
147
177
  console.error(' npm rebuild superlocalmemory');
148
178
  console.error('The npm installer will create a private virtual environment;');
@@ -296,6 +326,7 @@ module.exports = {
296
326
  isSupportedPython,
297
327
  main,
298
328
  parsePythonVersion,
329
+ probePython,
299
330
  pypiSpecifier,
300
331
  pythonCandidates,
301
332
  runtimePythonPath,