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.
- package/.claude-plugin/marketplace.json +3 -3
- package/CHANGELOG.md +202 -0
- package/README.md +40 -16
- package/bin/slm-npm +1 -1
- package/ide/configs/cursor-mcp.json +4 -1
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +2 -2
- package/plugin/CLAUDE.md +5 -4
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +7 -6
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/scripts/ensure-venv.bat +5 -5
- package/plugin/scripts/ensure-venv.sh +4 -4
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +4 -4
- package/plugin/skills/slm-recall/SKILL.md +10 -3
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +16 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +7 -6
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +24 -12
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +4 -4
- package/plugin-src/skills/slm-recall/SKILL.md +10 -3
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +16 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 & 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> · MCP: add <code>slm_compress</code> to your config · 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.
|
|
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`
|
|
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.
|
|
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
|
|
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` |
|
|
439
|
-
| `code` |
|
|
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` |
|
|
442
|
-
| `power` |
|
|
443
|
-
| `whole` |
|
|
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.
|
|
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 #
|
|
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.
|
|
31
|
+
console.error('If Python is missing, install Python 3.12-3.14 first.');
|
|
32
32
|
process.exit(1);
|
|
33
33
|
}
|
|
34
34
|
|
package/package.json
CHANGED
|
@@ -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.
|
|
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.
|
|
18
|
+
"version": "4.1.19"
|
|
19
19
|
}
|
package/plugin/CLAUDE.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
<!-- BEGIN SuperLocalMemory v4.1.
|
|
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;
|
|
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.
|
|
43
|
+
<!-- END SuperLocalMemory v4.1.19 -->
|
|
43
44
|
|
|
44
|
-
SuperLocalMemory v4.1.
|
|
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.
|
|
80
|
+
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
|
|
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.
|
|
36
|
-
8.
|
|
37
|
-
9.
|
|
38
|
-
10.
|
|
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.
|
|
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.
|
|
44
|
+
SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later
|
package/plugin/requirements.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
superlocalmemory==4.1.
|
|
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.
|
|
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.
|
|
32
|
+
:: Python >= 3.12 guard
|
|
33
33
|
:: ---------------------------------------------------------------------------
|
|
34
|
-
python -c "import sys; sys.exit(0 if sys.version_info >= (3,
|
|
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.
|
|
38
|
-
echo Install Python 3.
|
|
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.
|
|
28
|
+
# Python >= 3.12 guard
|
|
29
29
|
# ---------------------------------------------------------------------------
|
|
30
|
-
if ! python3 -c "import sys; sys.exit(0 if sys.version_info >= (3,
|
|
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.
|
|
33
|
-
echo "Install Python 3.
|
|
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
|
|
|
@@ -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` |
|
|
35
|
-
| `full` |
|
|
36
|
-
| `power` |
|
|
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.
|
|
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
|
|
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.
|
|
333
|
+
*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.
|
|
271
|
+
*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
|
|
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.
|
|
36
|
-
8.
|
|
37
|
-
9.
|
|
38
|
-
10.
|
|
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.
|
|
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.
|
|
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
|
|
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 `
|
|
86
|
-
>
|
|
87
|
-
>
|
|
88
|
-
>
|
|
89
|
-
> `
|
|
90
|
-
>
|
|
91
|
-
> `
|
|
92
|
-
> `
|
|
93
|
-
>
|
|
94
|
-
>
|
|
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.
|
|
152
|
+
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` |
|
|
35
|
-
| `full` |
|
|
36
|
-
| `power` |
|
|
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.
|
|
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
|
|
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.
|
|
333
|
+
*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.
|
|
271
|
+
*SuperLocalMemory v4.1.19 · Qualixar · AGPL-3.0-or-later*
|
package/scripts/postinstall.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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.
|
|
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,
|