superlocalmemory 4.0.0 → 4.0.1

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 (40) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +8 -7
  3. package/package.json +1 -1
  4. package/plugin/.claude-plugin/plugin.json +1 -1
  5. package/plugin/CLAUDE.md +3 -3
  6. package/plugin/agents/slm-governance-advisor.md +1 -1
  7. package/plugin/agents/slm-loop-runner.md +1 -1
  8. package/plugin/agents/slm-memory-advisor.md +1 -1
  9. package/plugin/agents/slm-optimize-advisor.md +1 -1
  10. package/plugin/requirements.txt +1 -1
  11. package/plugin/skills/slm-cache/SKILL.md +1 -1
  12. package/plugin/skills/slm-compress/SKILL.md +1 -1
  13. package/plugin/skills/slm-governance/SKILL.md +1 -1
  14. package/plugin/skills/slm-graph/SKILL.md +1 -1
  15. package/plugin/skills/slm-loop/SKILL.md +1 -1
  16. package/plugin/skills/slm-mesh/SKILL.md +1 -1
  17. package/plugin/skills/slm-profile/SKILL.md +1 -1
  18. package/plugin/skills/slm-recall/SKILL.md +1 -1
  19. package/plugin/skills/slm-remember/SKILL.md +1 -1
  20. package/plugin/skills/slm-scope/SKILL.md +1 -1
  21. package/plugin/skills/slm-session/SKILL.md +1 -1
  22. package/plugin/skills/slm-status/SKILL.md +1 -1
  23. package/plugin-src/rules/AGENTS.md +1 -1
  24. package/plugin-src/skills/slm-cache/SKILL.md +1 -1
  25. package/plugin-src/skills/slm-compress/SKILL.md +1 -1
  26. package/plugin-src/skills/slm-governance/SKILL.md +1 -1
  27. package/plugin-src/skills/slm-graph/SKILL.md +1 -1
  28. package/plugin-src/skills/slm-loop/SKILL.md +1 -1
  29. package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
  30. package/plugin-src/skills/slm-profile/SKILL.md +1 -1
  31. package/plugin-src/skills/slm-recall/SKILL.md +1 -1
  32. package/plugin-src/skills/slm-remember/SKILL.md +1 -1
  33. package/plugin-src/skills/slm-scope/SKILL.md +1 -1
  34. package/plugin-src/skills/slm-session/SKILL.md +1 -1
  35. package/plugin-src/skills/slm-status/SKILL.md +1 -1
  36. package/pyproject.toml +3 -3
  37. package/src/superlocalmemory/__init__.py +1 -1
  38. package/src/superlocalmemory/server/ui.py +7 -2
  39. package/src/superlocalmemory/server/unified_daemon.py +12 -4
  40. package/src/superlocalmemory/ui/index.html +2 -2
package/CHANGELOG.md CHANGED
@@ -5,6 +5,17 @@ All notable changes to SuperLocalMemory will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [4.0.1] - 2026-08-09 — Dashboard and operations-status correctness
9
+
10
+ ### Fixed
11
+ - The packaged dashboard identifies itself as SuperLocalMemory V4 and uses an
12
+ absolute packaged favicon path. Both unified and standalone dashboard servers
13
+ now provide the conventional `/favicon.ico` route by redirecting to the
14
+ packaged SVG icon.
15
+ - The daemon's operations-status counters now receive their FastAPI application
16
+ explicitly, so persisted dead-letter, degraded-manifest, and exhausted-
17
+ obligation counts cannot be silently reported as zero.
18
+
8
19
  ## [4.0.0] - 2026-08-01 — Verifiable memory transactions
9
20
 
10
21
  Version 4.0 hardens the full lifecycle of a memory operation — admission,
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  </picture>
6
6
  </p>
7
7
 
8
- <h1 align="center">SuperLocalMemory V4.0.0</h1>
8
+ <h1 align="center">SuperLocalMemory V4.0.1</h1>
9
9
 
10
10
  <h2 align="center">Rent the LLM. Own the memory.</h2>
11
11
 
@@ -27,12 +27,13 @@ guarantee here is stated as a falsifiable invariant, tested under an adversarial
27
27
  negative control, and shipped with the harness that regenerates the evidence:
28
28
  <code>python benchmark/run_all.py --trials 200 --output-dir results/</code>. What each experiment
29
29
  does <em>not</em> exercise is stated too.</p>
30
- <p align="center"><code>v4.0.0</code> — one control plane: <strong>SLM-Mesh</strong> peer coordination · multi-scope memory (personal / shared / global) · profiles · Cache · Compress · 7-layer retrieval · code graph · Entity Explorer · skill evolution · Modes A/B/C · GDPR retention &amp; audit chain · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
30
+ <p align="center"><code>v4.0.1</code> — one control plane: <strong>SLM-Mesh</strong> peer coordination · multi-scope memory (personal / shared / global) · profiles · Cache · Compress · 7-layer retrieval · code graph · Entity Explorer · skill evolution · Modes A/B/C · GDPR retention &amp; audit chain · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
31
31
  Proxy: <code>slm wrap claude</code> &nbsp;·&nbsp; MCP: add <code>slm_compress</code> to your config &nbsp;·&nbsp; Skill: zero-config</p>
32
- <p align="center"><strong>3 public research preprints</strong> (arXiv + Zenodo archives) · <a href="https://arxiv.org/abs/2603.02240">arXiv:2603.02240</a> · <a href="https://arxiv.org/abs/2603.14588">arXiv:2603.14588</a> · <a href="https://arxiv.org/abs/2604.04514">arXiv:2604.04514</a></p>
32
+ <p align="center"><strong>4 public research records</strong> · V4 preprint: <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 arXiv 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>. The V4 arXiv submission is pending public announcement.</p>
33
33
 
34
34
  <p align="center">
35
- <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/v4.0.0-Current_Release-2ea44f?style=for-the-badge&logo=checkmarx&logoColor=white" alt="v4.0.0 — Current Release"/></a>
35
+ <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/v4.0.1-Current_Release-2ea44f?style=for-the-badge&logo=checkmarx&logoColor=white" alt="v4.0.1 — Current Release"/></a>
36
+ <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>
36
37
  <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>
37
38
  <a href="#three-surfaces-proxy--mcp-tools--skill"><img src="https://img.shields.io/badge/Proxy_|_MCP_|_Skill-22c55e?style=for-the-badge" alt="Three Surfaces: Proxy, MCP Tools, Skill"/></a>
38
39
  <a href="https://pypi.org/project/superlocalmemory/"><img src="https://img.shields.io/pypi/v/superlocalmemory?style=for-the-badge&logo=pypi&logoColor=white" alt="PyPI"/></a>
@@ -60,7 +61,7 @@ SuperLocalMemory V4 combines conventional dense and lexical retrieval with graph
60
61
 
61
62
  **Memory with a sense of time.** SLM does not only store *what* an agent learned — it records *when*. Every fact carries ingestion timing and provenance; recall runs a dedicated temporal candidate channel alongside semantic, lexical, and associative retrieval; scenes and entity timelines reconstruct sequence; and the lifecycle lets neglected memory decay and self-archive instead of growing without bound. Time is a first-class ranking and lifecycle signal rather than a timestamp column an agent never reads — which is what lets a long-lived agent reason about how its context changed, not only what it currently holds.
62
63
 
63
- **What V4.0.0 ships.** V4 is a *governed* local-first control plane — every canonical write is admitted, policy-authorized, tracked as durable per-store obligations (lexical, temporal, vector), and sealed by a completion manifest, so it is either fully applied or explicitly marked degraded, never silently half-done. Flagship surfaces in this release:
64
+ **What V4.0.1 ships.** V4 is a *governed* local-first control plane — every canonical write is admitted, policy-authorized, tracked as durable per-store obligations (lexical, temporal, vector), and sealed by a completion manifest, so it is either fully applied or explicitly marked degraded, never silently half-done. Flagship surfaces in this release:
64
65
 
65
66
  - **[SLM-Mesh](#slm-mesh-cross-session--cross-machine-coordination)** — authenticated cross-session and cross-machine peer coordination (messages, locks, shared state, inbox/outbox, optional discovery). Coordination only — not automatic replicated memory.
66
67
  - **Multi-scope memory & profiles** — workspaces (profiles) plus `personal` / `shared` / `global` scopes; cross-profile recall is default-deny.
@@ -693,11 +694,11 @@ configuration for that framework.
693
694
  Open the web dashboard with `slm dashboard`; workspaces appear only when their
694
695
  runtime capability is enabled and healthy. See [CHANGELOG.md](CHANGELOG.md) for
695
696
  the complete release history.
696
-
697
697
  ## Research Papers
698
698
 
699
- SuperLocalMemory is backed by three preprints by Varun Pratap Bhardwaj (2026):
699
+ SuperLocalMemory has a V4 Zenodo preprint and three earlier arXiv preprints (2026):
700
700
 
701
+ - **SuperLocalMemory 4.0: The Governed Memory Operating System for AI Agents:** [Zenodo 21853302](https://zenodo.org/records/21853302) · [DOI 10.5281/zenodo.21853302](https://doi.org/10.5281/zenodo.21853302). The arXiv submission is pending public announcement.
701
702
  - **The Living Brain (V3.3):** [arXiv:2604.04514](https://arxiv.org/abs/2604.04514) · [Zenodo 19435120](https://zenodo.org/records/19435120)
702
703
  - **Information-Geometric Foundations (V3):** [arXiv:2603.14588](https://arxiv.org/abs/2603.14588) · [Zenodo 19038659](https://zenodo.org/records/19038659)
703
704
  - **Trust & Behavioral Foundations (V2):** [arXiv:2603.02240](https://arxiv.org/abs/2603.02240) · [Zenodo 18709670](https://zenodo.org/records/18709670)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "superlocalmemory",
3
- "version": "4.0.0",
3
+ "version": "4.0.1",
4
4
  "description": "Local-first agent memory with MCP and an agent-native CLI. Documented clients include Claude Code, Cursor, and Windsurf.",
5
5
  "keywords": [
6
6
  "ai-memory",
@@ -15,5 +15,5 @@
15
15
  "mcpServers": "./.mcp.json",
16
16
  "name": "superlocalmemory",
17
17
  "repository": "https://github.com/qualixar/superlocalmemory",
18
- "version": "4.0.0"
18
+ "version": "4.0.1"
19
19
  }
package/plugin/CLAUDE.md CHANGED
@@ -1,4 +1,4 @@
1
- <!-- BEGIN SuperLocalMemory v4.0.0 -->
1
+ <!-- BEGIN SuperLocalMemory v4.0.1 -->
2
2
 
3
3
  ## SuperLocalMemory (SLM) — Agent Rules
4
4
 
@@ -39,6 +39,6 @@ slm-recall · slm-remember · slm-session · slm-status · slm-cache · slm-comp
39
39
  ### Subagents
40
40
  slm-memory-advisor (memory decisions, session hygiene, scope/profile guidance) · slm-optimize-advisor (context compression + KV cache) · slm-governance-advisor (scope/roles/compliance/GDPR)
41
41
 
42
- <!-- END SuperLocalMemory v4.0.0 -->
42
+ <!-- END SuperLocalMemory v4.0.1 -->
43
43
 
44
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
44
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -77,4 +77,4 @@ slm-scope · slm-governance · slm-profile · slm-remember · slm-recall
77
77
  # What NOT to do
78
78
  Never session_init twice; never forget without dry-run preview; never store secrets; never bypass role checks; never claim an erasure succeeded without verifying via recall.
79
79
 
80
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
80
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -68,4 +68,4 @@ assessment. The gate is the authority.
68
68
 
69
69
  ---
70
70
 
71
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
71
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -46,4 +46,4 @@ slm-recall · slm-remember · slm-session · slm-scope · slm-profile · slm-gov
46
46
  # What NOT to do
47
47
  Never session_init twice; never forget dry_run=False without reporting preview; never dump a whole file into remember; never invent a memory; never claim "saved" without success:true / clean CLI exit; never bypass scope or governance restrictions.
48
48
 
49
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
49
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -41,4 +41,4 @@ slm-compress · slm-cache · slm-status · slm-profile
41
41
  # What NOT to do
42
42
  Never compress code-for-edit/JSON-to-parse/<500 chars; never store secrets/ccr_ids; never let optimize failure block/alter the task; never claim a specific savings %; never carry ccr_ids across profile switches.
43
43
 
44
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
44
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -1 +1 @@
1
- superlocalmemory==4.0.0
1
+ superlocalmemory==4.0.1
@@ -145,4 +145,4 @@ These subcommands control daemon-level cache settings. They do not read or write
145
145
 
146
146
  ---
147
147
 
148
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
148
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -147,4 +147,4 @@ Content over 1 MB (1 000 000 bytes UTF-8) is processed but `reversible` is force
147
147
 
148
148
  ---
149
149
 
150
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
150
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -245,4 +245,4 @@ Before running any destructive operation (`forget`, `compact_memories`):
245
245
 
246
246
  ---
247
247
 
248
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
248
+ *SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later*
@@ -311,4 +311,4 @@ profile. See `slm-profile` for the full profile switching workflow.
311
311
 
312
312
  ---
313
313
 
314
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
314
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -96,4 +96,4 @@ paused, name the approval needed; when errored, quote the short detail.
96
96
 
97
97
  ---
98
98
 
99
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
99
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -279,4 +279,4 @@ mesh availability.
279
279
 
280
280
  ---
281
281
 
282
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
282
+ *SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later*
@@ -145,4 +145,4 @@ Name them differently in your MCP config (e.g. `superlocalmemory-personal` and
145
145
 
146
146
  ---
147
147
 
148
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
148
+ *SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later*
@@ -236,4 +236,4 @@ before recalling, then switch back. See `slm-profile` for workspace switching.
236
236
 
237
237
  ---
238
238
 
239
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
239
+ *SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later*
@@ -238,4 +238,4 @@ different workspace, use `switch_profile` first. See `slm-profile`.
238
238
 
239
239
  ---
240
240
 
241
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
241
+ *SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later*
@@ -173,4 +173,4 @@ to review the impact. See `slm-remember` for the full deletion discipline.
173
173
 
174
174
  ---
175
175
 
176
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
176
+ *SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later*
@@ -227,4 +227,4 @@ explicitly and call `recall` with `include_global`/`include_shared` after
227
227
 
228
228
  ---
229
229
 
230
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
230
+ *SuperLocalMemory v4.0.1 · 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.0.0 · Qualixar · AGPL-3.0-or-later
166
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -128,4 +128,4 @@ When the SLM MCP server is unavailable, use these CLI equivalents:
128
128
  - **slm-optimize-advisor** — context compression and KV cache
129
129
  - **slm-governance-advisor** — scope/role compliance, retention policies, GDPR
130
130
 
131
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
131
+ SuperLocalMemory v4.0.1 · 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.0.0 · Qualixar · AGPL-3.0-or-later
148
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -147,4 +147,4 @@ Content over 1 MB (1 000 000 bytes UTF-8) is processed but `reversible` is force
147
147
 
148
148
  ---
149
149
 
150
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
150
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -245,4 +245,4 @@ Before running any destructive operation (`forget`, `compact_memories`):
245
245
 
246
246
  ---
247
247
 
248
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
248
+ *SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later*
@@ -311,4 +311,4 @@ profile. See `slm-profile` for the full profile switching workflow.
311
311
 
312
312
  ---
313
313
 
314
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
314
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -96,4 +96,4 @@ paused, name the approval needed; when errored, quote the short detail.
96
96
 
97
97
  ---
98
98
 
99
- SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later
99
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
@@ -279,4 +279,4 @@ mesh availability.
279
279
 
280
280
  ---
281
281
 
282
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
282
+ *SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later*
@@ -145,4 +145,4 @@ Name them differently in your MCP config (e.g. `superlocalmemory-personal` and
145
145
 
146
146
  ---
147
147
 
148
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
148
+ *SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later*
@@ -236,4 +236,4 @@ before recalling, then switch back. See `slm-profile` for workspace switching.
236
236
 
237
237
  ---
238
238
 
239
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
239
+ *SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later*
@@ -238,4 +238,4 @@ different workspace, use `switch_profile` first. See `slm-profile`.
238
238
 
239
239
  ---
240
240
 
241
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
241
+ *SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later*
@@ -173,4 +173,4 @@ to review the impact. See `slm-remember` for the full deletion discipline.
173
173
 
174
174
  ---
175
175
 
176
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
176
+ *SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later*
@@ -227,4 +227,4 @@ explicitly and call `recall` with `include_global`/`include_shared` after
227
227
 
228
228
  ---
229
229
 
230
- *SuperLocalMemory v4.0.0 · Qualixar · AGPL-3.0-or-later*
230
+ *SuperLocalMemory v4.0.1 · 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.0.0 · Qualixar · AGPL-3.0-or-later
166
+ SuperLocalMemory v4.0.1 · Qualixar · AGPL-3.0-or-later
package/pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superlocalmemory"
3
- version = "4.0.0"
3
+ version = "4.0.1"
4
4
  description = "Local-first agent memory with auditable hybrid retrieval"
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-or-later"
@@ -90,8 +90,8 @@ dependencies = [
90
90
  # the ~560MB model downloads on first setup/warmup (fail-open). Verified the
91
91
  # pin does NOT disturb the transformers/torch/numpy pins above.
92
92
  "llmlingua==0.2.2",
93
- # LLMLingua pulls NLTK transitively. Pin the patched release so clean
94
- # installs cannot resolve to the vulnerable 3.9.x line.
93
+ # LLMLingua pulls NLTK transitively. Pin above the disclosed traversal
94
+ # advisories so clean installs cannot resolve to the vulnerable 3.9.x line.
95
95
  "nltk==3.10.0",
96
96
  ]
97
97
 
@@ -32,7 +32,7 @@ if "OMP_NUM_THREADS" not in os.environ:
32
32
  os.environ["OMP_NUM_THREADS"] = "2"
33
33
  # ---------------------------------------------------------------------------
34
34
 
35
- __version__ = "4.0.0"
35
+ __version__ = "4.0.1"
36
36
 
37
37
  _REQUIRED_VERSIONS = {
38
38
  "sentence_transformers": "5.3.0",
@@ -43,7 +43,7 @@ sys.path = [p for p in sys.path if p not in ("", _script_dir)]
43
43
  try:
44
44
  from fastapi import FastAPI
45
45
  from fastapi.staticfiles import StaticFiles
46
- from fastapi.responses import HTMLResponse
46
+ from fastapi.responses import HTMLResponse, RedirectResponse
47
47
  from fastapi.middleware.cors import CORSMiddleware
48
48
  from fastapi.middleware.gzip import GZipMiddleware
49
49
  import uvicorn
@@ -73,7 +73,7 @@ def create_app() -> FastAPI:
73
73
  """Create and configure the FastAPI application."""
74
74
  application = FastAPI(
75
75
  title="SuperLocalMemory V4 UI Server",
76
- description="Memory Dashboard with V4 Engine, Trust, Learning, and Compliance",
76
+ description="Governed memory dashboard with trust, learning, and compliance controls.",
77
77
  version=SLM_VERSION,
78
78
  docs_url="/api/docs",
79
79
  redoc_url="/api/redoc",
@@ -233,6 +233,11 @@ def create_app() -> FastAPI:
233
233
  )
234
234
  return index_path.read_text()
235
235
 
236
+ @application.get("/favicon.ico", include_in_schema=False)
237
+ async def favicon():
238
+ """Serve the packaged SVG icon for browsers that request favicon.ico."""
239
+ return RedirectResponse(url="/static/favicon.svg", status_code=307)
240
+
236
241
  @application.get("/health")
237
242
  async def health_check():
238
243
  """Health check endpoint."""
@@ -3467,7 +3467,7 @@ def _register_dashboard_routes(application: FastAPI) -> None:
3467
3467
  _data_io_mod.ws_manager = ws_manager
3468
3468
 
3469
3469
  # Root page
3470
- from fastapi.responses import HTMLResponse, JSONResponse
3470
+ from fastapi.responses import HTMLResponse, JSONResponse, RedirectResponse
3471
3471
 
3472
3472
  # v3.4.23: /api/version — dashboard polls this to detect daemon upgrades
3473
3473
  # and auto-reload stale tabs (see ui/js/core.js::checkVersionFingerprint).
@@ -3531,6 +3531,11 @@ def _register_dashboard_routes(application: FastAPI) -> None:
3531
3531
  html = index_path.read_text()
3532
3532
  return html.replace("__SLM_VERSION__", _SLM_VERSION)
3533
3533
 
3534
+ @application.get("/favicon.ico", include_in_schema=False)
3535
+ async def favicon():
3536
+ """Serve the packaged SVG icon for browsers that request favicon.ico."""
3537
+ return RedirectResponse(url="/static/favicon.svg", status_code=307)
3538
+
3534
3539
  def _register_daemon_routes(application: FastAPI) -> None:
3535
3540
  """Add daemon-specific routes for CLI integration."""
3536
3541
  global _last_activity
@@ -3695,7 +3700,7 @@ def _register_daemon_routes(application: FastAPI) -> None:
3695
3700
  "active_profile": profile_snapshot.profile_id,
3696
3701
  "profile_generation": profile_snapshot.generation,
3697
3702
  # Wave-3: operational failure counts (visible to all team members)
3698
- **_ops_failure_counts(engine),
3703
+ **_ops_failure_counts(engine, application),
3699
3704
  # issue #107: does this daemon's *imported* code still match the
3700
3705
  # installed distribution? ``version`` above reports what this
3701
3706
  # process loaded, which is self-consistent and therefore cannot
@@ -4271,7 +4276,7 @@ def _register_daemon_routes(application: FastAPI) -> None:
4271
4276
  # "Optimizing memory…" line from this. Defaults to idle before start.
4272
4277
  "self_heal": globals().get("_SELF_HEAL_STATUS", {"state": "idle"}),
4273
4278
  # Wave-3: operational failure counts (dead-letter, degraded, stalled)
4274
- **_ops_failure_counts(engine),
4279
+ **_ops_failure_counts(engine, application),
4275
4280
  }
4276
4281
 
4277
4282
  @application.get("/api/v3/components")
@@ -4870,7 +4875,7 @@ def _terminalize_orphan_operation(engine, operation_id: str) -> None:
4870
4875
  )
4871
4876
 
4872
4877
 
4873
- def _ops_failure_counts(engine) -> dict:
4878
+ def _ops_failure_counts(engine, application) -> dict:
4874
4879
  """Return Wave-3 operational failure counts for /status and /health.
4875
4880
 
4876
4881
  Always returns a dict (never raises). Counts default to 0 on any error.
@@ -4885,6 +4890,9 @@ def _ops_failure_counts(engine) -> dict:
4885
4890
  "writer_stalled_op_id": None,
4886
4891
  "writer_stalled_age_s": None,
4887
4892
  }
4893
+ # ``application`` is explicitly passed by the route handlers. There is no
4894
+ # module-global FastAPI app; relying on one silently returned all-zero
4895
+ # counters whenever this helper caught the resulting NameError.
4888
4896
  # Writer stall info from canonical coordinator
4889
4897
  try:
4890
4898
  writer_runtime = getattr(application.state, "canonical_remember_runtime", None)
@@ -7,8 +7,8 @@
7
7
  compares this to /api/version and hard-reloads + clears localStorage
8
8
  on mismatch, so the browser cannot show stale UI after an upgrade. -->
9
9
  <meta name="slm-version" content="__SLM_VERSION__">
10
- <title>SuperLocalMemory V3 — Dashboard</title>
11
- <link rel="icon" type="image/svg+xml" href="static/favicon.svg">
10
+ <title>SuperLocalMemory V4 — Dashboard</title>
11
+ <link rel="icon" type="image/svg+xml" href="/static/favicon.svg">
12
12
 
13
13
  <!-- Bootstrap CSS (vendored locally v3.4.21 — no CDN calls, works offline) -->
14
14
  <link href="static/vendor/bootstrap.min.css" rel="stylesheet">