superlocalmemory 3.6.13 → 3.6.15
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 +17 -0
- package/CHANGELOG.md +28 -0
- package/README.md +189 -740
- package/package.json +12 -5
- package/plugin/.claude-plugin/plugin.json +20 -0
- package/plugin/.mcp.json +12 -0
- package/plugin/CLAUDE.md +44 -0
- package/plugin/_GENERATED.md +6 -0
- package/plugin/agents/slm-memory-advisor.md +44 -0
- package/plugin/agents/slm-optimize-advisor.md +38 -0
- package/plugin/hooks/hooks.json +14 -0
- package/plugin/requirements.txt +1 -0
- package/plugin/scripts/ensure-venv.bat +122 -0
- package/plugin/scripts/ensure-venv.sh +105 -0
- package/plugin/scripts/slm-launch +15 -0
- package/plugin/scripts/slm-launch.bat +17 -0
- package/plugin/settings.json +16 -0
- package/plugin/skills/slm-cache/SKILL.md +140 -0
- package/plugin/skills/slm-compress/SKILL.md +143 -0
- package/plugin/skills/slm-graph/SKILL.md +300 -0
- package/plugin/skills/slm-recall/SKILL.md +204 -0
- package/plugin/skills/slm-remember/SKILL.md +194 -0
- package/plugin/skills/slm-session/SKILL.md +207 -0
- package/plugin/skills/slm-status/SKILL.md +149 -0
- package/plugin-src/.mcp.json +12 -0
- package/plugin-src/agents/slm-memory-advisor.md +44 -0
- package/plugin-src/agents/slm-optimize-advisor.md +38 -0
- package/plugin-src/commands/slm-optimize.md +22 -0
- package/plugin-src/commands/slm-recall.md +16 -0
- package/plugin-src/commands/slm-remember.md +16 -0
- package/plugin-src/commands/slm-status.md +15 -0
- package/plugin-src/hooks/.gitkeep +0 -0
- package/plugin-src/hooks/hooks.json +14 -0
- package/plugin-src/manifest.json +25 -0
- package/plugin-src/requirements.txt +1 -0
- package/plugin-src/rules/AGENTS.md +91 -0
- package/plugin-src/rules/CLAUDE.md.fragment +44 -0
- package/plugin-src/scripts/ensure-venv.bat +122 -0
- package/plugin-src/scripts/ensure-venv.sh +105 -0
- package/plugin-src/scripts/slm-launch +15 -0
- package/plugin-src/scripts/slm-launch.bat +17 -0
- package/plugin-src/settings.json +16 -0
- package/plugin-src/skills/slm-cache/SKILL.md +140 -0
- package/plugin-src/skills/slm-compress/SKILL.md +143 -0
- package/plugin-src/skills/slm-graph/SKILL.md +300 -0
- package/plugin-src/skills/slm-recall/SKILL.md +204 -0
- package/plugin-src/skills/slm-remember/SKILL.md +194 -0
- package/plugin-src/skills/slm-session/SKILL.md +207 -0
- package/plugin-src/skills/slm-status/SKILL.md +149 -0
- package/pyproject.toml +6 -2
- package/scripts/__tests__/build-plugin.test.mjs +613 -0
- package/scripts/_savings_math.py +270 -0
- package/scripts/build-plugin.js +742 -0
- package/scripts/dogfood_savings.py +490 -0
- package/scripts/install-skills.ps1 +4 -334
- package/scripts/install-skills.sh +4 -435
- package/scripts/postinstall-interactive.js +0 -27
- package/scripts/postinstall.js +21 -2
- package/src/superlocalmemory/__init__.py +1 -1
- package/src/superlocalmemory/cli/_lazy_init.py +115 -0
- package/src/superlocalmemory/cli/commands.py +439 -41
- package/src/superlocalmemory/cli/main.py +92 -4
- package/src/superlocalmemory/cli/setup_wizard.py +47 -6
- package/src/superlocalmemory/core/backend_orchestrator.py +12 -8
- package/src/superlocalmemory/core/config.py +194 -9
- package/src/superlocalmemory/core/embeddings.py +10 -5
- package/src/superlocalmemory/core/engine.py +76 -5
- package/src/superlocalmemory/core/fact_consolidator.py +20 -3
- package/src/superlocalmemory/core/platform_utils.py +8 -0
- package/src/superlocalmemory/core/recall_pipeline.py +7 -0
- package/src/superlocalmemory/core/recall_worker.py +7 -0
- package/src/superlocalmemory/core/store_pipeline.py +23 -1
- package/src/superlocalmemory/core/worker_pool.py +14 -2
- package/src/superlocalmemory/hooks/claude_code_hooks.py +27 -3
- package/src/superlocalmemory/hooks/portable_kit.py +506 -0
- package/src/superlocalmemory/hooks/session_registry.py +8 -4
- package/src/superlocalmemory/infra/cloud_backup.py +99 -23
- package/src/superlocalmemory/mcp/_daemon_proxy.py +12 -2
- package/src/superlocalmemory/mcp/_pool_adapter.py +15 -6
- package/src/superlocalmemory/mcp/cli_fallback.py +602 -0
- package/src/superlocalmemory/mcp/server.py +75 -4
- package/src/superlocalmemory/mcp/tools_code_graph.py +3 -3
- package/src/superlocalmemory/mcp/tools_core.py +37 -4
- package/src/superlocalmemory/mcp/tools_v3.py +6 -1
- package/src/superlocalmemory/mcp/tools_v33.py +8 -4
- package/src/superlocalmemory/optimize/cache/boundary_store.py +25 -6
- package/src/superlocalmemory/optimize/cache/centroid_store.py +27 -4
- package/src/superlocalmemory/optimize/cache/manager.py +92 -6
- package/src/superlocalmemory/optimize/cache/semantic.py +20 -1
- package/src/superlocalmemory/optimize/compress/ccr.py +12 -0
- package/src/superlocalmemory/optimize/compress/router.py +46 -13
- package/src/superlocalmemory/optimize/config/schema.py +6 -0
- package/src/superlocalmemory/optimize/proxy/_helpers.py +111 -8
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +14 -4
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +23 -6
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +10 -4
- package/src/superlocalmemory/optimize/proxy/server.py +11 -0
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +246 -0
- package/src/superlocalmemory/optimize/storage/db.py +30 -0
- package/src/superlocalmemory/retrieval/bm25_channel.py +12 -2
- package/src/superlocalmemory/retrieval/engine.py +36 -3
- package/src/superlocalmemory/retrieval/entity_channel.py +5 -5
- package/src/superlocalmemory/retrieval/hopfield_channel.py +10 -2
- package/src/superlocalmemory/retrieval/semantic_channel.py +10 -2
- package/src/superlocalmemory/server/recall_serializer.py +3 -1
- package/src/superlocalmemory/server/unified_daemon.py +156 -16
- package/src/superlocalmemory/storage/database.py +215 -43
- package/src/superlocalmemory/storage/migration_runner.py +17 -1
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +120 -0
- package/src/superlocalmemory/storage/models.py +10 -0
- package/src/superlocalmemory/storage/schema.py +15 -10
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +18 -0
- package/src/superlocalmemory/ui/css/neural-glass.css +5 -0
- package/src/superlocalmemory/ui/index.html +2 -2
- package/src/superlocalmemory/ui/js/core.js +98 -0
- package/src/superlocalmemory/ui/js/dashboard.js +8 -1
- package/src/superlocalmemory/ui/js/ide-status.js +16 -3
- package/src/superlocalmemory/ui/js/math-health.js +15 -3
- package/src/superlocalmemory/ui/js/optimize.js +18 -2
- package/src/superlocalmemory/ui/js/trust-dashboard.js +10 -1
- package/src/superlocalmemory.egg-info/PKG-INFO +191 -741
- package/src/superlocalmemory.egg-info/SOURCES.txt +7 -9
- package/src/superlocalmemory.egg-info/requires.txt +1 -0
- package/ide/skills/slm-build-graph/SKILL.md +0 -423
- package/ide/skills/slm-list-recent/SKILL.md +0 -348
- package/ide/skills/slm-recall/SKILL.md +0 -326
- package/ide/skills/slm-remember/SKILL.md +0 -194
- package/ide/skills/slm-show-patterns/SKILL.md +0 -224
- package/ide/skills/slm-status/SKILL.md +0 -363
- package/ide/skills/slm-switch-profile/SKILL.md +0 -442
- package/skills/slm-build-graph/SKILL.md +0 -423
- package/skills/slm-list-recent/SKILL.md +0 -348
- package/skills/slm-optimize/README.md +0 -55
- package/skills/slm-optimize/SKILL.md +0 -139
- package/skills/slm-recall/SKILL.md +0 -343
- package/skills/slm-remember/SKILL.md +0 -194
- package/skills/slm-show-patterns/SKILL.md +0 -224
- package/skills/slm-status/SKILL.md +0 -363
- package/skills/slm-switch-profile/SKILL.md +0 -442
- package/src/superlocalmemory/cli/doctor_cmd.py +0 -152
- package/src/superlocalmemory/skills/slm-build-graph/SKILL.md +0 -423
- package/src/superlocalmemory/skills/slm-list-recent/SKILL.md +0 -348
- package/src/superlocalmemory/skills/slm-recall/SKILL.md +0 -343
- package/src/superlocalmemory/skills/slm-remember/SKILL.md +0 -194
- package/src/superlocalmemory/skills/slm-show-patterns/SKILL.md +0 -224
- package/src/superlocalmemory/skills/slm-status/SKILL.md +0 -363
- package/src/superlocalmemory/skills/slm-switch-profile/SKILL.md +0 -442
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Recall relevant facts and decisions from SuperLocalMemory by query.
|
|
3
|
+
argument-hint: <what to recall>
|
|
4
|
+
allowed-tools: recall, search, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Recall from SuperLocalMemory using the query: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
1. Call `recall(query="$ARGUMENTS", limit=10)` via MCP.
|
|
10
|
+
2. If no confident match or count==0, also call `search("$ARGUMENTS", 10)`.
|
|
11
|
+
3. Present results concisely — fact, tags, importance, date. Never invent or fabricate a memory.
|
|
12
|
+
4. If MCP is unavailable, fall back to CLI:
|
|
13
|
+
- `slm recall "$ARGUMENTS" --limit 10`
|
|
14
|
+
- then `slm search "$ARGUMENTS"`
|
|
15
|
+
|
|
16
|
+
SuperLocalMemory v3.6.15 · Qualixar · AGPL-3.0-or-later
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Save an atomic fact or decision to SuperLocalMemory.
|
|
3
|
+
argument-hint: <the fact> [#tag1,tag2]
|
|
4
|
+
allowed-tools: recall, remember, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Save to SuperLocalMemory: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
1. First call `recall("$ARGUMENTS", 5)` — dedupe check. If a near-identical memory exists, tell the user and stop; delegate to slm-memory-advisor to update_memory if a correction is needed.
|
|
10
|
+
2. Extract tags from any trailing `#tag1,tag2` pattern in the arguments.
|
|
11
|
+
3. Determine importance: use 8 for blockers/security/architecture decisions; use 7 for conventions and constraints; use 5 for general facts.
|
|
12
|
+
4. Call `remember(content="$ARGUMENTS", tags=<extracted tags>, importance=<n>)`.
|
|
13
|
+
5. Confirm only on success:true. If success is not true, report the error — never claim "saved."
|
|
14
|
+
6. MCP unavailable → CLI fallback: `slm remember "$ARGUMENTS" --tags <tags>` (note: `--importance` is MCP-only, not a CLI flag).
|
|
15
|
+
|
|
16
|
+
SuperLocalMemory v3.6.15 · Qualixar · AGPL-3.0-or-later
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Show SuperLocalMemory health and optimization counters.
|
|
3
|
+
argument-hint: (no arguments)
|
|
4
|
+
allowed-tools: slm_optimize_stats, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Show SuperLocalMemory status and optimization counters.
|
|
8
|
+
|
|
9
|
+
1. Run `slm status` via Bash — this is the canonical health check (memory count, profile, daemon state, integrity).
|
|
10
|
+
2. Also call `slm_optimize_stats()` via MCP for Surface-B counters (cache_kv_hits, compress_runs, tokens_saved_compress). If ok:false, omit silently — do not surface the error.
|
|
11
|
+
3. Summarize both outputs in a concise report. Flag any integrity warnings from `slm status`.
|
|
12
|
+
|
|
13
|
+
Note: MCP get_status is intentionally NOT used here — it is outside the core profile and would error. Use `slm status` (CLI) + `slm_optimize_stats` (MCP) only.
|
|
14
|
+
|
|
15
|
+
SuperLocalMemory v3.6.15 · Qualixar · AGPL-3.0-or-later
|
|
File without changes
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "3.6.15",
|
|
3
|
+
"pluginName": "superlocalmemory",
|
|
4
|
+
"displayName": "SuperLocalMemory",
|
|
5
|
+
"repository": "https://github.com/qualixar/superlocalmemory",
|
|
6
|
+
"keywords": ["memory", "mcp", "agents", "local-first", "context-compression"],
|
|
7
|
+
"skills": [
|
|
8
|
+
{ "name": "slm-cache", "hasReadme": false },
|
|
9
|
+
{ "name": "slm-compress", "hasReadme": false },
|
|
10
|
+
{ "name": "slm-graph", "hasReadme": false },
|
|
11
|
+
{ "name": "slm-recall", "hasReadme": false },
|
|
12
|
+
{ "name": "slm-remember", "hasReadme": false },
|
|
13
|
+
{ "name": "slm-session", "hasReadme": false },
|
|
14
|
+
{ "name": "slm-status", "hasReadme": false }
|
|
15
|
+
],
|
|
16
|
+
"targets": {
|
|
17
|
+
"plugin": "plugin/.claude-plugin/plugin.json"
|
|
18
|
+
},
|
|
19
|
+
"marketplace": {
|
|
20
|
+
"owner": "qualixar",
|
|
21
|
+
"ownerEmail": "varun.pratap.bhardwaj@gmail.com",
|
|
22
|
+
"repo": "superlocalmemory",
|
|
23
|
+
"description": "Local-first agent memory + reversible context compression and KV cache, as an MCP server. 20-tool code profile with graph intelligence."
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
superlocalmemory==3.6.15
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# SuperLocalMemory — Agent Rules
|
|
2
|
+
|
|
3
|
+
> Drop into any IDE agent config or AGENTS.md to give agents disciplined SLM usage.
|
|
4
|
+
> SLM is local-first: every MCP tool runs on the user's machine, zero cloud calls.
|
|
5
|
+
> Prefer MCP tools when the server is running; use the CLI fallback table when not.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Session start
|
|
10
|
+
|
|
11
|
+
Call `session_init(project_path, query, max_results, max_age_days)` **once** at the start of every new session before any `recall` or `remember` calls. Never call it twice in the same session. `session_init` loads recent decisions and relevant memories into context automatically.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Remember discipline
|
|
16
|
+
|
|
17
|
+
- **Atomic durable facts only** — decisions, conventions, constraints, gotchas, stable preferences. One fact per `remember` call.
|
|
18
|
+
- **Recall before remember** — call `recall(query, 5)` first. If a near-identical memory exists, use `update_memory(fact_id, content)` to correct it; never duplicate.
|
|
19
|
+
- **Tags + project + importance** — always supply meaningful tags and the project name. Use importance 7–10 for blockers, security findings, and architecture decisions; 5 for general facts.
|
|
20
|
+
- **Never dump a whole file** — extract only the durable decision or constraint; store the path reference if needed.
|
|
21
|
+
- **Scope is opt-in (v3.6.15)** — memories are `personal` (private to this profile) by default. Only pass `scope="shared"/"global"` (or recall's `include_global`/`include_shared`) when the user EXPLICITLY asks to share across local profiles. Never opt in on your own; the default is identical to single-profile SLM.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Recall discipline
|
|
26
|
+
|
|
27
|
+
- **recall for concepts, search for keywords** — use `recall(query, limit)` for conceptual / semantic queries; use `search(query, limit)` for exact keyword / FTS5 matches.
|
|
28
|
+
- **Concept phrasing** — phrase queries as concepts, not vague words ("database migration strategy" not "database").
|
|
29
|
+
- **Pass session_id** when available to narrow results to the current session.
|
|
30
|
+
- **Empty / low results** — broaden the query, try `search`, or fall back to `list_recent`. Never fabricate a memory.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Optimize rules
|
|
35
|
+
|
|
36
|
+
Apply automatically when context pressure builds:
|
|
37
|
+
|
|
38
|
+
1. Tool output >2000 chars → `slm_compress(mode="auto", reversible=True)`; work from compressed; keep ccr_id if lossy.
|
|
39
|
+
2. Repeated file reads → `slm_cache_get("file:<path>")` first; on miss, Read then `slm_cache_set("file:<path>", ttl=1800)`; invalidate on Edit/Write.
|
|
40
|
+
3. Repeated bash/web → `slm_cache_set("bash:<cmd[:64]>", ttl=600)`; web ttl=3600.
|
|
41
|
+
4. **NEVER** compress/cache: code for Edit/Write; JSON to parse; secrets/keys/tokens; ccr_ids; content <500 chars.
|
|
42
|
+
5. **FAIL-OPEN** — if any optimize call returns ok:false, continue with the original content, no retry, don't surface the error.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Session end
|
|
47
|
+
|
|
48
|
+
Call `close_session(session_id)` when the work in the session is meaningfully complete. This finalises session metadata and allows the next session to find this one via `session_init`.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## CLI fallback table
|
|
53
|
+
|
|
54
|
+
When the SLM MCP server is unavailable, use these CLI equivalents:
|
|
55
|
+
|
|
56
|
+
| MCP tool | CLI fallback |
|
|
57
|
+
|------------------------|-----------------------------------------------------------|
|
|
58
|
+
| `recall` | `slm recall "<query>" --limit N` |
|
|
59
|
+
| `search` | `slm search "<query>"` |
|
|
60
|
+
| `remember` | `slm remember "<content>" --tags a,b` (project/importance are MCP-only) |
|
|
61
|
+
| `list_recent` | `slm list --limit N` |
|
|
62
|
+
| `forget` | `slm forget` (always preview first) |
|
|
63
|
+
| `slm_optimize_stats` | `slm optimize status` / `slm optimize savings` |
|
|
64
|
+
| `slm_compress` | `slm compress` |
|
|
65
|
+
| `slm_cache_*` | `slm cache ...` |
|
|
66
|
+
| `slm status` (health) | `slm status` |
|
|
67
|
+
| `session_init` | daemon-implicit — skip when MCP is down |
|
|
68
|
+
| `close_session` | daemon-implicit — skip when MCP is down |
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Tool reference (core profile — 14 tools)
|
|
73
|
+
|
|
74
|
+
| Tool | Signature (key params) | Notes |
|
|
75
|
+
|--------------------|--------------------------------------------------------------------------------|------------------------------------|
|
|
76
|
+
| `remember` | `content, tags="", project="", importance=5, session_id="", scope="personal", shared_with=""` | Store atomic fact. `scope` opt-in (personal default) |
|
|
77
|
+
| `recall` | `query, limit=10, agent_id, session_id="", fast=False, include_global, include_shared` | Multi-channel retrieval. Scope flags off by default |
|
|
78
|
+
| `search` | `query, limit=10, profile_id=""` | FTS5 BM25 keyword search |
|
|
79
|
+
| `fetch` | `url, ...` | Fetch remote content |
|
|
80
|
+
| `list_recent` | `limit=20, profile_id=""` | Newest memories first |
|
|
81
|
+
| `update_memory` | `fact_id, content, agent_id` | Correct an existing memory by id |
|
|
82
|
+
| `forget` | `profile_id="", dry_run=True` | Decay cycle; always dry_run first |
|
|
83
|
+
| `session_init` | `project_path="", query="", max_results=10, max_age_days=30` | Once per session; loads context |
|
|
84
|
+
| `close_session` | `session_id=""` | Finalise session |
|
|
85
|
+
| `slm_compress` | `content, mode="auto", reversible=True, ttl_seconds=86400` | Returns compressed, lossy, ccr_id |
|
|
86
|
+
| `slm_retrieve` | `ccr_id` | Retrieve original from ccr_id |
|
|
87
|
+
| `slm_cache_set` | `key, value, ttl_seconds=86400` | KV cache set |
|
|
88
|
+
| `slm_cache_get` | `key` | KV cache get; returns hit, value |
|
|
89
|
+
| `slm_optimize_stats` | `()` | Returns compress_runs, tokens_saved_compress, cache_kv_hits |
|
|
90
|
+
|
|
91
|
+
SuperLocalMemory v3.6.15 · Qualixar · AGPL-3.0-or-later
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<!-- BEGIN SuperLocalMemory v3.6.15 -->
|
|
2
|
+
|
|
3
|
+
## SuperLocalMemory (SLM) — Agent Rules
|
|
4
|
+
|
|
5
|
+
SLM is local-first memory for agents. All tools run on the user's machine; no cloud calls.
|
|
6
|
+
|
|
7
|
+
### Session start
|
|
8
|
+
Call `session_init(project_path, query)` ONCE per fresh session before any recall/remember. Never twice.
|
|
9
|
+
|
|
10
|
+
### Remember
|
|
11
|
+
- Atomic durable facts only (decisions, conventions, constraints, gotchas). One fact per call.
|
|
12
|
+
- Recall-before-remember: `recall(query, 5)` first; use `update_memory` if near-match found.
|
|
13
|
+
- Always supply tags + project + importance (7–10 for blockers/security/architecture).
|
|
14
|
+
- Never dump a whole file; never claim "saved" without success:true.
|
|
15
|
+
- Scope is opt-in (v3.6.15): writes are `personal`/private by default. Only use `scope="shared"/"global"` (or recall's `include_global`/`include_shared`) when the user explicitly asks to share across local profiles.
|
|
16
|
+
|
|
17
|
+
### Recall
|
|
18
|
+
- `recall` for conceptual/semantic queries; `search` for exact keywords.
|
|
19
|
+
- Phrase as concepts; pass session_id when available. Never fabricate.
|
|
20
|
+
|
|
21
|
+
### Optimize (fail-open)
|
|
22
|
+
- Output >2000 chars → `slm_compress(mode="auto", reversible=True)`; keep ccr_id if lossy.
|
|
23
|
+
- Repeated reads → `slm_cache_get("file:<path>")` first; on miss cache with ttl=1800.
|
|
24
|
+
- NEVER compress/cache: code-for-edit, JSON-to-parse, secrets, ccr_ids, <500 chars.
|
|
25
|
+
- If ok:false → continue with original; never block the task.
|
|
26
|
+
|
|
27
|
+
### Session end
|
|
28
|
+
`close_session(session_id)` when work is meaningfully complete.
|
|
29
|
+
|
|
30
|
+
### CLI fallback (MCP down)
|
|
31
|
+
`slm recall "<q>" --limit N` · `slm search "<q>"` · `slm remember "<c>" --tags t` · `slm list --limit N` · `slm forget` (preview first) · `slm status` · `slm optimize status`
|
|
32
|
+
|
|
33
|
+
### Skills
|
|
34
|
+
slm-recall · slm-remember · slm-session · slm-status · slm-cache · slm-compress · slm-graph
|
|
35
|
+
|
|
36
|
+
### Commands
|
|
37
|
+
/superlocalmemory:slm-recall · /superlocalmemory:slm-remember · /superlocalmemory:slm-session · /superlocalmemory:slm-status · /superlocalmemory:slm-cache · /superlocalmemory:slm-compress · /superlocalmemory:slm-graph
|
|
38
|
+
|
|
39
|
+
### Subagents
|
|
40
|
+
slm-memory-advisor (memory decisions, session hygiene) · slm-optimize-advisor (context compression + KV cache)
|
|
41
|
+
|
|
42
|
+
<!-- END SuperLocalMemory v3.6.15 -->
|
|
43
|
+
|
|
44
|
+
SuperLocalMemory v3.6.15 · Qualixar · AGPL-3.0-or-later
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
:: ensure-venv.bat — WP-F SuperLocalMemory plugin venv bootstrap (Windows)
|
|
3
|
+
::
|
|
4
|
+
:: Windows equivalent of ensure-venv.sh. Called by Claude Code SessionStart hook
|
|
5
|
+
:: on Windows hosts. Idempotent: fast-path exits quickly when requirements.txt
|
|
6
|
+
:: is unchanged (sentinel file guards reinstall).
|
|
7
|
+
::
|
|
8
|
+
:: Environment (set by Claude Code plugin runtime):
|
|
9
|
+
:: CLAUDE_PLUGIN_ROOT — plugin installation dir (ephemeral, contains scripts\ + requirements.txt)
|
|
10
|
+
:: CLAUDE_PLUGIN_DATA — persistent data dir (venv lives here, survives plugin updates)
|
|
11
|
+
::
|
|
12
|
+
:: Exit codes: 0 = venv ready non-0 = failure (logged to stderr)
|
|
13
|
+
:: All informational output goes to stderr (stdout reserved for MCP stdio protocol).
|
|
14
|
+
::
|
|
15
|
+
:: Requires: Python 3.11+ on PATH, pip, standard Windows cmd.exe
|
|
16
|
+
|
|
17
|
+
setlocal EnableDelayedExpansion
|
|
18
|
+
|
|
19
|
+
:: ---------------------------------------------------------------------------
|
|
20
|
+
:: Guard: required env vars must be set
|
|
21
|
+
:: ---------------------------------------------------------------------------
|
|
22
|
+
if not defined CLAUDE_PLUGIN_ROOT (
|
|
23
|
+
echo ERROR: CLAUDE_PLUGIN_ROOT must be set ^(plugin installation directory^) >&2
|
|
24
|
+
exit /b 1
|
|
25
|
+
)
|
|
26
|
+
if not defined CLAUDE_PLUGIN_DATA (
|
|
27
|
+
echo ERROR: CLAUDE_PLUGIN_DATA must be set ^(plugin persistent data directory^) >&2
|
|
28
|
+
exit /b 1
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
:: ---------------------------------------------------------------------------
|
|
32
|
+
:: Python >= 3.11 guard
|
|
33
|
+
:: ---------------------------------------------------------------------------
|
|
34
|
+
python -c "import sys; sys.exit(0 if sys.version_info >= (3, 11) else 1)" 2>nul
|
|
35
|
+
if errorlevel 1 (
|
|
36
|
+
for /f "tokens=*" %%v in ('python --version 2^>^&1') do set PY_VER=%%v
|
|
37
|
+
echo ERROR: SuperLocalMemory plugin requires Python ^>= 3.11, found: !PY_VER! >&2
|
|
38
|
+
echo Install Python 3.11+ and ensure it is first on PATH. >&2
|
|
39
|
+
exit /b 1
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
:: ---------------------------------------------------------------------------
|
|
43
|
+
:: Paths
|
|
44
|
+
:: ---------------------------------------------------------------------------
|
|
45
|
+
set "REQ=%CLAUDE_PLUGIN_ROOT%\requirements.txt"
|
|
46
|
+
set "VENV=%CLAUDE_PLUGIN_DATA%\venv"
|
|
47
|
+
set "VENV_SCRIPTS=%VENV%\Scripts"
|
|
48
|
+
set "SENTINEL=%CLAUDE_PLUGIN_DATA%\.venv-reqs.sha256"
|
|
49
|
+
set "VENV_TMP=%CLAUDE_PLUGIN_DATA%\venv.tmp"
|
|
50
|
+
|
|
51
|
+
:: ---------------------------------------------------------------------------
|
|
52
|
+
:: Compute sha256 of requirements.txt using PowerShell (built-in on Windows 10+)
|
|
53
|
+
:: Output: hex string of SHA256 hash
|
|
54
|
+
:: ---------------------------------------------------------------------------
|
|
55
|
+
for /f "usebackq tokens=*" %%h in (
|
|
56
|
+
`powershell -NoProfile -Command "(Get-FileHash -Algorithm SHA256 '%REQ%').Hash.ToLower()"`
|
|
57
|
+
) do set "NEW_HASH=%%h"
|
|
58
|
+
|
|
59
|
+
if "!NEW_HASH!"=="" (
|
|
60
|
+
echo ERROR: Could not compute sha256 of requirements.txt >&2
|
|
61
|
+
exit /b 1
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
:: ---------------------------------------------------------------------------
|
|
65
|
+
:: Fast-path: venv Scripts\python.exe exists AND sentinel matches
|
|
66
|
+
:: ---------------------------------------------------------------------------
|
|
67
|
+
set "VENV_PYTHON=%VENV_SCRIPTS%\python.exe"
|
|
68
|
+
if exist "%VENV_PYTHON%" (
|
|
69
|
+
if exist "%SENTINEL%" (
|
|
70
|
+
set /p "CURRENT_HASH=" < "%SENTINEL%"
|
|
71
|
+
if "!CURRENT_HASH!"=="!NEW_HASH!" (
|
|
72
|
+
echo SLM plugin: venv up-to-date, skipping install. >&2
|
|
73
|
+
exit /b 0
|
|
74
|
+
)
|
|
75
|
+
)
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
:: ---------------------------------------------------------------------------
|
|
79
|
+
:: Rebuild venv atomically: install to venv.tmp, rename to venv, write sentinel LAST
|
|
80
|
+
:: ---------------------------------------------------------------------------
|
|
81
|
+
echo SLM plugin: bootstrapping Python venv at %VENV% ... >&2
|
|
82
|
+
echo requirements: %REQ% >&2
|
|
83
|
+
|
|
84
|
+
:: Clean up any partial previous attempt
|
|
85
|
+
if exist "%VENV_TMP%" rmdir /s /q "%VENV_TMP%"
|
|
86
|
+
|
|
87
|
+
:: Create fresh venv
|
|
88
|
+
python -m venv "%VENV_TMP%"
|
|
89
|
+
if errorlevel 1 (
|
|
90
|
+
echo ERROR: python -m venv failed >&2
|
|
91
|
+
exit /b 1
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
:: Upgrade pip first
|
|
95
|
+
"%VENV_TMP%\Scripts\pip.exe" install --upgrade pip --prefer-binary --quiet
|
|
96
|
+
if errorlevel 1 (
|
|
97
|
+
echo ERROR: pip upgrade failed >&2
|
|
98
|
+
exit /b 1
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
:: Install requirements
|
|
102
|
+
"%VENV_TMP%\Scripts\pip.exe" install --require-virtualenv --prefer-binary --quiet -r "%REQ%"
|
|
103
|
+
if errorlevel 1 (
|
|
104
|
+
echo ERROR: pip install requirements failed >&2
|
|
105
|
+
exit /b 1
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
echo SLM plugin: install complete, activating venv. >&2
|
|
109
|
+
|
|
110
|
+
:: Atomic swap: remove old venv (if any), rename tmp into place
|
|
111
|
+
if exist "%VENV%" rmdir /s /q "%VENV%"
|
|
112
|
+
move "%VENV_TMP%" "%VENV%"
|
|
113
|
+
if errorlevel 1 (
|
|
114
|
+
echo ERROR: Could not move venv.tmp to venv >&2
|
|
115
|
+
exit /b 1
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
:: Write sentinel LAST — guarantees that a crash before this line triggers rebuild
|
|
119
|
+
echo !NEW_HASH!>"%SENTINEL%"
|
|
120
|
+
|
|
121
|
+
echo SLM plugin: venv ready at %VENV%\Scripts\slm.exe >&2
|
|
122
|
+
exit /b 0
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ensure-venv.sh — WP-06 SuperLocalMemory plugin venv bootstrap
|
|
3
|
+
#
|
|
4
|
+
# Called by Claude Code SessionStart hook. Idempotent: fast-path exits in <100ms
|
|
5
|
+
# on repeat invocations when requirements.txt is unchanged.
|
|
6
|
+
#
|
|
7
|
+
# Environment (set by Claude Code plugin runtime):
|
|
8
|
+
# CLAUDE_PLUGIN_ROOT — plugin installation dir (ephemeral, contains scripts/ + requirements.txt)
|
|
9
|
+
# CLAUDE_PLUGIN_DATA — persistent data dir (venv lives here, survives plugin updates)
|
|
10
|
+
#
|
|
11
|
+
# Exit codes: 0 = venv ready non-0 = failure (logged to stderr)
|
|
12
|
+
# All output goes to stderr only (stdout reserved for MCP stdio protocol).
|
|
13
|
+
|
|
14
|
+
set -euo pipefail
|
|
15
|
+
|
|
16
|
+
# ---------------------------------------------------------------------------
|
|
17
|
+
# :? guard — fail loudly if required env vars are unset or empty
|
|
18
|
+
# ---------------------------------------------------------------------------
|
|
19
|
+
: "${CLAUDE_PLUGIN_ROOT:?CLAUDE_PLUGIN_ROOT must be set (plugin installation directory)}"
|
|
20
|
+
: "${CLAUDE_PLUGIN_DATA:?CLAUDE_PLUGIN_DATA must be set (plugin persistent data directory)}"
|
|
21
|
+
|
|
22
|
+
# ---------------------------------------------------------------------------
|
|
23
|
+
# Redirect all output to stderr (MCP uses stdout for protocol messages)
|
|
24
|
+
# ---------------------------------------------------------------------------
|
|
25
|
+
exec 1>&2
|
|
26
|
+
|
|
27
|
+
# ---------------------------------------------------------------------------
|
|
28
|
+
# Python >= 3.11 guard
|
|
29
|
+
# ---------------------------------------------------------------------------
|
|
30
|
+
if ! python3 -c "import sys; sys.exit(0 if sys.version_info >= (3, 11) else 1)" 2>/dev/null; then
|
|
31
|
+
PY_VER=$(python3 --version 2>&1 || echo "unknown")
|
|
32
|
+
echo "ERROR: SuperLocalMemory plugin requires Python >= 3.11, found: ${PY_VER}" >&2
|
|
33
|
+
echo "Install Python 3.11+ and ensure it is first on PATH." >&2
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# ---------------------------------------------------------------------------
|
|
38
|
+
# Paths
|
|
39
|
+
# ---------------------------------------------------------------------------
|
|
40
|
+
REQ="${CLAUDE_PLUGIN_ROOT}/requirements.txt"
|
|
41
|
+
VENV="${CLAUDE_PLUGIN_DATA}/venv"
|
|
42
|
+
SENTINEL="${CLAUDE_PLUGIN_DATA}/.venv-reqs.sha256"
|
|
43
|
+
VENV_TMP="${CLAUDE_PLUGIN_DATA}/venv.tmp"
|
|
44
|
+
|
|
45
|
+
# ---------------------------------------------------------------------------
|
|
46
|
+
# Compute sha256 of requirements.txt (cross-platform: prefer sha256sum, fall back to shasum -a 256)
|
|
47
|
+
# ---------------------------------------------------------------------------
|
|
48
|
+
hash_req() {
|
|
49
|
+
if command -v sha256sum >/dev/null 2>&1; then
|
|
50
|
+
sha256sum "${REQ}" | awk '{print $1}'
|
|
51
|
+
else
|
|
52
|
+
shasum -a 256 "${REQ}" | awk '{print $1}'
|
|
53
|
+
fi
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
NEW_HASH=$(hash_req)
|
|
57
|
+
|
|
58
|
+
# ---------------------------------------------------------------------------
|
|
59
|
+
# Fast-path: venv python exists AND sentinel matches current requirements hash
|
|
60
|
+
# venv/bin/python3 (or python) is always present after `python3 -m venv`;
|
|
61
|
+
# the sentinel guards against stale requirements.
|
|
62
|
+
# In production, superlocalmemory also installs venv/bin/slm; both checks pass.
|
|
63
|
+
# ---------------------------------------------------------------------------
|
|
64
|
+
VENV_PYTHON="${VENV}/bin/python3"
|
|
65
|
+
if [ ! -x "${VENV_PYTHON}" ]; then
|
|
66
|
+
VENV_PYTHON="${VENV}/bin/python"
|
|
67
|
+
fi
|
|
68
|
+
if [ -x "${VENV_PYTHON}" ] && [ -f "${SENTINEL}" ] && [ "$(cat "${SENTINEL}")" = "${NEW_HASH}" ]; then
|
|
69
|
+
echo "SLM plugin: venv up-to-date (sha256=${NEW_HASH:0:12}…), skipping install." >&2
|
|
70
|
+
exit 0
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# ---------------------------------------------------------------------------
|
|
74
|
+
# Rebuild venv atomically: install to venv.tmp, rename to venv, write sentinel LAST
|
|
75
|
+
# ---------------------------------------------------------------------------
|
|
76
|
+
echo "SLM plugin: bootstrapping Python venv at ${VENV} …" >&2
|
|
77
|
+
echo " requirements: ${REQ}" >&2
|
|
78
|
+
echo " python3: $(python3 --version 2>&1)" >&2
|
|
79
|
+
|
|
80
|
+
# Clean up any partial previous attempt
|
|
81
|
+
rm -rf "${VENV_TMP}"
|
|
82
|
+
|
|
83
|
+
# Create fresh venv
|
|
84
|
+
python3 -m venv "${VENV_TMP}"
|
|
85
|
+
|
|
86
|
+
# Upgrade pip first (prefer binary to avoid source builds)
|
|
87
|
+
"${VENV_TMP}/bin/pip" install --upgrade pip --prefer-binary --quiet
|
|
88
|
+
|
|
89
|
+
# Install requirements
|
|
90
|
+
"${VENV_TMP}/bin/pip" install \
|
|
91
|
+
--require-virtualenv \
|
|
92
|
+
--prefer-binary \
|
|
93
|
+
--quiet \
|
|
94
|
+
-r "${REQ}"
|
|
95
|
+
|
|
96
|
+
echo "SLM plugin: install complete, activating venv." >&2
|
|
97
|
+
|
|
98
|
+
# Atomic swap: remove old venv (if any), rename tmp into place
|
|
99
|
+
rm -rf "${VENV}"
|
|
100
|
+
mv "${VENV_TMP}" "${VENV}"
|
|
101
|
+
|
|
102
|
+
# Write sentinel LAST — guarantees that a crash before this line triggers rebuild
|
|
103
|
+
echo "${NEW_HASH}" > "${SENTINEL}"
|
|
104
|
+
|
|
105
|
+
echo "SLM plugin: venv ready at ${VENV}/bin/slm" >&2
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# slm-launch — WP-F SuperLocalMemory MCP launcher (POSIX)
|
|
3
|
+
#
|
|
4
|
+
# Cross-platform counterpart: slm-launch.bat (Windows)
|
|
5
|
+
# Referenced by plugin/.mcp.json as the MCP server command.
|
|
6
|
+
#
|
|
7
|
+
# Resolves the correct venv binary for POSIX:
|
|
8
|
+
# ${CLAUDE_PLUGIN_DATA}/venv/bin/slm mcp
|
|
9
|
+
#
|
|
10
|
+
# On Windows, Claude Code invokes slm-launch.bat instead (same-stem, .bat extension).
|
|
11
|
+
#
|
|
12
|
+
# Environment:
|
|
13
|
+
# CLAUDE_PLUGIN_DATA — persistent data dir where venv lives
|
|
14
|
+
|
|
15
|
+
exec "${CLAUDE_PLUGIN_DATA}/venv/bin/slm" mcp
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
:: slm-launch.bat — WP-F SuperLocalMemory MCP launcher (Windows)
|
|
3
|
+
::
|
|
4
|
+
:: Cross-platform counterpart: slm-launch (POSIX bash)
|
|
5
|
+
:: Referenced by plugin/.mcp.json as the MCP server command (Windows picks .bat automatically).
|
|
6
|
+
::
|
|
7
|
+
:: Resolves the correct venv binary for Windows:
|
|
8
|
+
:: %CLAUDE_PLUGIN_DATA%\venv\Scripts\slm.exe mcp
|
|
9
|
+
::
|
|
10
|
+
:: On Windows, Python venv places entry points in Scripts\ (not bin\ like POSIX).
|
|
11
|
+
:: This launcher bridges the path difference so ONE .mcp.json command field works
|
|
12
|
+
:: cross-platform.
|
|
13
|
+
::
|
|
14
|
+
:: Environment:
|
|
15
|
+
:: CLAUDE_PLUGIN_DATA — persistent data dir where venv lives
|
|
16
|
+
|
|
17
|
+
"%CLAUDE_PLUGIN_DATA%\venv\Scripts\slm.exe" mcp
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"mcp__superlocalmemory__remember",
|
|
5
|
+
"mcp__superlocalmemory__recall",
|
|
6
|
+
"mcp__superlocalmemory__search",
|
|
7
|
+
"mcp__superlocalmemory__session_init",
|
|
8
|
+
"mcp__superlocalmemory__slm_compress",
|
|
9
|
+
"mcp__superlocalmemory__slm_retrieve",
|
|
10
|
+
"mcp__superlocalmemory__slm_cache_get",
|
|
11
|
+
"mcp__superlocalmemory__slm_cache_set",
|
|
12
|
+
"mcp__superlocalmemory__slm_optimize_stats",
|
|
13
|
+
"Bash(slm:*)"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: slm-cache
|
|
3
|
+
description: KV cache for repeated reads — call slm_cache_get(key) first; on a miss do the expensive operation then slm_cache_set(key, value, ttl_seconds) to store it; on a hit use the returned value directly; always fail-open (hit:false on any error, never raises); saves tokens when the same file, query result, or tool output is read more than once in a session.
|
|
4
|
+
when_to_use: "cache file, avoid re-reading, repeated read, cache result, cache tool output, save re-read, reuse across session, cache check, cache hit, cache miss"
|
|
5
|
+
allowed-tools: slm_cache_set, slm_cache_get, Bash
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# slm-cache — KV Cache for Repeated Reads (Surface B)
|
|
9
|
+
|
|
10
|
+
## Purpose
|
|
11
|
+
|
|
12
|
+
When the same file, query result, or expensive tool output is needed more than once in a session, fetching it again wastes tokens and time. `slm_cache_set` stores a result under a stable key; `slm_cache_get` retrieves it on subsequent calls. The cache is agent-scoped (automatically namespaced by tenant/agent ID), TTL-bounded, and fail-open.
|
|
13
|
+
|
|
14
|
+
This is an agent-routed cache — it caches results the agent explicitly routes through SLM. It cannot cache Claude conversation turns.
|
|
15
|
+
|
|
16
|
+
## Tool: slm_cache_set
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
slm_cache_set(
|
|
20
|
+
key: str, # required — cache key (max 512 chars)
|
|
21
|
+
value: str, # required — value to store (max 1 MB)
|
|
22
|
+
ttl_seconds: int = 86400, # time-to-live in seconds (default 24 h)
|
|
23
|
+
) -> dict
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Return dict
|
|
27
|
+
|
|
28
|
+
| Key | Type | Meaning |
|
|
29
|
+
|-----|------|---------|
|
|
30
|
+
| `ok` | bool | `True` on success; `False` on validation error or internal error |
|
|
31
|
+
| `stored` | bool | `True` when the value was written to the cache |
|
|
32
|
+
| `note` | str \| None | Error detail or `None` on success |
|
|
33
|
+
|
|
34
|
+
Keys are SHA-256-hashed internally per agent so they do not collide across agents. The raw key string you supply is the only handle you need.
|
|
35
|
+
|
|
36
|
+
## Tool: slm_cache_get
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
slm_cache_get(
|
|
40
|
+
key: str, # required — same key used in slm_cache_set
|
|
41
|
+
) -> dict
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Return dict
|
|
45
|
+
|
|
46
|
+
| Key | Type | Meaning |
|
|
47
|
+
|-----|------|---------|
|
|
48
|
+
| `ok` | bool | `True` on clean execution (including miss); `False` on internal error |
|
|
49
|
+
| `hit` | bool | `True` when the key exists and has not expired |
|
|
50
|
+
| `value` | str \| None | The stored value on a hit; `None` on miss |
|
|
51
|
+
| `note` | str \| None | Error detail or `None` |
|
|
52
|
+
|
|
53
|
+
A miss returns `{"ok": true, "hit": false, "value": null, "note": null}`. `ok: false` means something went wrong internally but the miss behaviour is the same — treat both as a cache miss and proceed with the real fetch.
|
|
54
|
+
|
|
55
|
+
## Standard Pattern: Cache-Aside
|
|
56
|
+
|
|
57
|
+
Always check the cache first, then fill on miss:
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
# 1. Check cache
|
|
61
|
+
cached = await slm_cache_get(key="file:/absolute/path/to/config.json")
|
|
62
|
+
|
|
63
|
+
if cached["hit"]:
|
|
64
|
+
content = cached["value"]
|
|
65
|
+
else:
|
|
66
|
+
# 2. Expensive operation (file read, search, API call)
|
|
67
|
+
content = read_file("/absolute/path/to/config.json")
|
|
68
|
+
|
|
69
|
+
# 3. Store for the rest of the session
|
|
70
|
+
await slm_cache_set(
|
|
71
|
+
key="file:/absolute/path/to/config.json",
|
|
72
|
+
value=content,
|
|
73
|
+
ttl_seconds=3600, # 1 h — adjust to data volatility
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# 4. Use content
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Key Naming Convention
|
|
80
|
+
|
|
81
|
+
Use a stable, human-readable prefix so keys are recognisable in stats and won't collide accidentally:
|
|
82
|
+
|
|
83
|
+
| Content type | Suggested prefix | Example |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| File read | `file:` | `file:/repo/src/config.py` |
|
|
86
|
+
| Search result | `search:` | `search:recall:session_init_context` |
|
|
87
|
+
| Tool output | `tool:` | `tool:build_code_graph:/repo` |
|
|
88
|
+
| External fetch | `url:` | `url:https://api.example.com/v1/data` |
|
|
89
|
+
|
|
90
|
+
Key length cap: 512 characters. Keys longer than that are rejected (`ok: false`).
|
|
91
|
+
|
|
92
|
+
## When Caching Pays Off
|
|
93
|
+
|
|
94
|
+
**Cache when:**
|
|
95
|
+
- You will read the same file more than once in a session.
|
|
96
|
+
- A search or recall result is reused across multiple reasoning steps.
|
|
97
|
+
- An expensive MCP tool call (graph build, semantic search) produces output that is stable for the session duration.
|
|
98
|
+
|
|
99
|
+
**Do NOT cache:**
|
|
100
|
+
- Volatile data (live API responses that change minute-to-minute, current timestamps, streaming output).
|
|
101
|
+
- Secrets, credentials, tokens, or `ccr_id` values (CCR already handles its own storage).
|
|
102
|
+
- Data that must be fresh for correctness — a stale cache is worse than a cache miss.
|
|
103
|
+
- Intermediate scratchpad text you will discard.
|
|
104
|
+
|
|
105
|
+
## Fail-Open Guarantee
|
|
106
|
+
|
|
107
|
+
Neither tool raises an exception. On any internal error:
|
|
108
|
+
|
|
109
|
+
- `slm_cache_get` returns `{"ok": false, "hit": false, "value": null, ...}` — treat as a miss and proceed with the real fetch.
|
|
110
|
+
- `slm_cache_set` returns `{"ok": false, "stored": false, ...}` — log the note if useful, but continue; the value is still available in memory this step.
|
|
111
|
+
|
|
112
|
+
Never block a task on a cache failure.
|
|
113
|
+
|
|
114
|
+
## TTL Guidance
|
|
115
|
+
|
|
116
|
+
| Data type | Suggested TTL |
|
|
117
|
+
|---|---|
|
|
118
|
+
| Static config / generated file | 86400 s (24 h — the default) |
|
|
119
|
+
| Session-specific tool output | 3600 s (1 h) |
|
|
120
|
+
| Rapidly changing API data | Do not cache, or 60–300 s |
|
|
121
|
+
|
|
122
|
+
Set `ttl_seconds` to match how long the data remains valid. After expiry `slm_cache_get` returns a miss automatically.
|
|
123
|
+
|
|
124
|
+
## Secondary CLI (fallback when MCP is unavailable)
|
|
125
|
+
|
|
126
|
+
The `slm cache` subcommand exists but has known pre-existing parse-test failures. Prefer the MCP tools above. If you must use CLI:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
slm cache status [--json] [--tenant default]
|
|
130
|
+
slm cache clear [--json] [--tenant default]
|
|
131
|
+
slm cache invalidate --tag <tag> [--json] [--tenant default]
|
|
132
|
+
slm cache ttl --set <seconds> [--semantic <seconds>] [--json] [--tenant default]
|
|
133
|
+
slm cache semantic on|off [--json] [--tenant default]
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
These subcommands control daemon-level cache settings. They do not read or write individual cache entries — use the MCP tools for that.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
SuperLocalMemory v3.6.15 · Qualixar · AGPL-3.0-or-later
|