superlocalmemory 3.6.22 → 3.7.0

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 (303) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +275 -72
  3. package/bin/slm-npm +43 -89
  4. package/docs/pi-dev-integration.md +43 -0
  5. package/ide/configs/antigravity-mcp.json +2 -2
  6. package/ide/configs/chatgpt-desktop-mcp.json +1 -1
  7. package/ide/configs/claude-desktop-mcp.json +2 -2
  8. package/ide/configs/windsurf-mcp.json +2 -2
  9. package/ide/hooks/context-hook.js +6 -2
  10. package/ide/hooks/post-recall-hook.js +7 -3
  11. package/ide/hooks/tool-event-hook.sh +2 -1
  12. package/package.json +19 -10
  13. package/plugin/.claude-plugin/plugin.json +1 -1
  14. package/plugin/_GENERATED.md +1 -1
  15. package/plugin/agents/slm-memory-advisor.md +1 -1
  16. package/plugin/requirements.txt +1 -1
  17. package/plugin/skills/slm-session/SKILL.md +1 -1
  18. package/plugin-src/rules/AGENTS.md +1 -1
  19. package/pyproject.toml +40 -8
  20. package/scripts/postinstall-interactive.js +17 -94
  21. package/scripts/postinstall.js +185 -258
  22. package/scripts/preuninstall.js +9 -50
  23. package/src/superlocalmemory/__init__.py +2 -2
  24. package/src/superlocalmemory/attribution/mathematical_dna.py +1 -1
  25. package/src/superlocalmemory/attribution/signer.py +34 -19
  26. package/src/superlocalmemory/attribution/watermark.py +1 -1
  27. package/src/superlocalmemory/cli/_lazy_init.py +3 -5
  28. package/src/superlocalmemory/cli/commands.py +490 -195
  29. package/src/superlocalmemory/cli/context_commands.py +5 -4
  30. package/src/superlocalmemory/cli/daemon.py +282 -187
  31. package/src/superlocalmemory/cli/db_migrate.py +3 -1
  32. package/src/superlocalmemory/cli/diagnostics_cmd.py +28 -0
  33. package/src/superlocalmemory/cli/evidence_cmd.py +103 -0
  34. package/src/superlocalmemory/cli/ingest_cmd.py +7 -3
  35. package/src/superlocalmemory/cli/main.py +128 -31
  36. package/src/superlocalmemory/cli/pending_store.py +54 -38
  37. package/src/superlocalmemory/cli/scale_engine_cmd.py +37 -0
  38. package/src/superlocalmemory/cli/service_installer.py +57 -52
  39. package/src/superlocalmemory/cli/setup_wizard.py +142 -88
  40. package/src/superlocalmemory/cli/version_banner.py +2 -1
  41. package/src/superlocalmemory/code_graph/config.py +3 -1
  42. package/src/superlocalmemory/core/backend_orchestrator.py +81 -21
  43. package/src/superlocalmemory/core/config.py +65 -20
  44. package/src/superlocalmemory/core/consolidation_engine.py +9 -7
  45. package/src/superlocalmemory/core/context_cache.py +56 -8
  46. package/src/superlocalmemory/core/derivation_lineage.py +246 -0
  47. package/src/superlocalmemory/core/embedding_worker.py +32 -20
  48. package/src/superlocalmemory/core/embeddings.py +54 -18
  49. package/src/superlocalmemory/core/engine.py +150 -104
  50. package/src/superlocalmemory/core/engine_ingestion.py +513 -0
  51. package/src/superlocalmemory/core/engine_wiring.py +2 -0
  52. package/src/superlocalmemory/core/evidence_bundle.py +526 -0
  53. package/src/superlocalmemory/core/fact_consolidator.py +5 -11
  54. package/src/superlocalmemory/core/graph_analyzer.py +2 -2
  55. package/src/superlocalmemory/core/health_monitor.py +4 -2
  56. package/src/superlocalmemory/core/ingestion_command.py +636 -0
  57. package/src/superlocalmemory/core/injection.py +69 -18
  58. package/src/superlocalmemory/core/lifecycle_state.py +153 -0
  59. package/src/superlocalmemory/core/maintenance.py +23 -22
  60. package/src/superlocalmemory/core/maintenance_scheduler.py +51 -35
  61. package/src/superlocalmemory/core/mutations.py +143 -0
  62. package/src/superlocalmemory/core/platform_utils.py +7 -4
  63. package/src/superlocalmemory/core/ram_lock.py +16 -5
  64. package/src/superlocalmemory/core/rate_limit.py +1 -1
  65. package/src/superlocalmemory/core/recall_pipeline.py +60 -101
  66. package/src/superlocalmemory/core/recall_worker.py +76 -59
  67. package/src/superlocalmemory/core/registry.py +1 -1
  68. package/src/superlocalmemory/core/scale_engine.py +293 -0
  69. package/src/superlocalmemory/core/score_contract.py +62 -0
  70. package/src/superlocalmemory/core/security_primitives.py +3 -1
  71. package/src/superlocalmemory/core/slm_disabled.py +3 -5
  72. package/src/superlocalmemory/core/store_pipeline.py +172 -40
  73. package/src/superlocalmemory/core/tier_manager.py +32 -20
  74. package/src/superlocalmemory/core/worker_pool.py +13 -4
  75. package/src/superlocalmemory/dynamics/activation_guided_quantization.py +1 -1
  76. package/src/superlocalmemory/dynamics/eap_scheduler.py +10 -3
  77. package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +1 -1
  78. package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +1 -1
  79. package/src/superlocalmemory/encoding/auto_linker.py +1 -1
  80. package/src/superlocalmemory/encoding/cognitive_consolidator.py +7 -16
  81. package/src/superlocalmemory/encoding/consolidator.py +22 -5
  82. package/src/superlocalmemory/encoding/fact_extractor.py +1 -1
  83. package/src/superlocalmemory/encoding/foresight.py +2 -0
  84. package/src/superlocalmemory/encoding/graph_builder.py +1 -1
  85. package/src/superlocalmemory/encoding/temporal_parser.py +2 -0
  86. package/src/superlocalmemory/evaluation/__init__.py +13 -0
  87. package/src/superlocalmemory/evaluation/calibration.py +308 -0
  88. package/src/superlocalmemory/evolution/skill_evolver.py +2 -1
  89. package/src/superlocalmemory/graph/cozo_backend.py +256 -23
  90. package/src/superlocalmemory/hooks/_outcome_common.py +21 -11
  91. package/src/superlocalmemory/hooks/antigravity_adapter.py +10 -31
  92. package/src/superlocalmemory/hooks/auto_invoker.py +25 -27
  93. package/src/superlocalmemory/hooks/auto_recall.py +31 -6
  94. package/src/superlocalmemory/hooks/auto_recall_hook.py +13 -33
  95. package/src/superlocalmemory/hooks/before_web_hook.py +9 -7
  96. package/src/superlocalmemory/hooks/claude_code_hooks.py +126 -39
  97. package/src/superlocalmemory/hooks/codex_assets.py +59 -0
  98. package/src/superlocalmemory/hooks/codex_hooks.py +186 -0
  99. package/src/superlocalmemory/hooks/context_payload.py +1 -1
  100. package/src/superlocalmemory/hooks/copilot_adapter.py +9 -24
  101. package/src/superlocalmemory/hooks/cursor_adapter.py +10 -32
  102. package/src/superlocalmemory/hooks/hook_daemon.py +4 -2
  103. package/src/superlocalmemory/hooks/hook_handlers.py +241 -55
  104. package/src/superlocalmemory/hooks/memory_protocol.py +5 -3
  105. package/src/superlocalmemory/hooks/post_tool_async_hook.py +4 -2
  106. package/src/superlocalmemory/hooks/session_registry.py +15 -8
  107. package/src/superlocalmemory/hooks/stop_outcome_hook.py +10 -6
  108. package/src/superlocalmemory/hooks/topic_shift_hook.py +42 -12
  109. package/src/superlocalmemory/hooks/user_prompt_hook.py +9 -14
  110. package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +19 -11
  111. package/src/superlocalmemory/infra/auth_middleware.py +38 -5
  112. package/src/superlocalmemory/infra/backup.py +7 -5
  113. package/src/superlocalmemory/infra/cloud_backup.py +18 -8
  114. package/src/superlocalmemory/infra/daemon_identity.py +248 -0
  115. package/src/superlocalmemory/infra/data_root.py +199 -0
  116. package/src/superlocalmemory/infra/event_bus.py +3 -1
  117. package/src/superlocalmemory/infra/local_diagnostics.py +327 -0
  118. package/src/superlocalmemory/infra/process_reaper.py +23 -0
  119. package/src/superlocalmemory/ingestion/adapter_manager.py +27 -9
  120. package/src/superlocalmemory/ingestion/base_adapter.py +25 -31
  121. package/src/superlocalmemory/ingestion/calendar_adapter.py +13 -4
  122. package/src/superlocalmemory/ingestion/credentials.py +14 -7
  123. package/src/superlocalmemory/ingestion/gmail_adapter.py +13 -4
  124. package/src/superlocalmemory/ingestion/transcript_adapter.py +7 -2
  125. package/src/superlocalmemory/learning/consolidation_quantization_worker.py +1 -1
  126. package/src/superlocalmemory/learning/ensemble.py +11 -0
  127. package/src/superlocalmemory/learning/entity_compiler.py +1 -1
  128. package/src/superlocalmemory/learning/feedback.py +1 -1
  129. package/src/superlocalmemory/learning/forgetting_scheduler.py +12 -7
  130. package/src/superlocalmemory/learning/quantization_scheduler.py +1 -1
  131. package/src/superlocalmemory/learning/ranker.py +4 -1
  132. package/src/superlocalmemory/learning/source_quality.py +1 -1
  133. package/src/superlocalmemory/learning/trigram_index.py +3 -2
  134. package/src/superlocalmemory/llm/backbone.py +13 -8
  135. package/src/superlocalmemory/math/ebbinghaus.py +1 -1
  136. package/src/superlocalmemory/math/fisher.py +1 -1
  137. package/src/superlocalmemory/math/fisher_quantized.py +1 -1
  138. package/src/superlocalmemory/math/hopfield.py +1 -1
  139. package/src/superlocalmemory/math/langevin.py +1 -1
  140. package/src/superlocalmemory/math/polar_quant.py +3 -4
  141. package/src/superlocalmemory/math/qjl.py +1 -1
  142. package/src/superlocalmemory/math/sheaf.py +1 -1
  143. package/src/superlocalmemory/math/turbo_quant.py +3 -2
  144. package/src/superlocalmemory/mcp/_daemon_proxy.py +12 -11
  145. package/src/superlocalmemory/mcp/_pool_adapter.py +27 -0
  146. package/src/superlocalmemory/mcp/http_transport.py +53 -0
  147. package/src/superlocalmemory/mcp/server.py +39 -13
  148. package/src/superlocalmemory/mcp/shared.py +69 -3
  149. package/src/superlocalmemory/mcp/tools_active.py +141 -31
  150. package/src/superlocalmemory/mcp/tools_core.py +128 -29
  151. package/src/superlocalmemory/mcp/tools_evolution.py +5 -7
  152. package/src/superlocalmemory/mcp/tools_learning.py +42 -2
  153. package/src/superlocalmemory/mcp/tools_mesh.py +7 -23
  154. package/src/superlocalmemory/mcp/tools_optimize.py +8 -1
  155. package/src/superlocalmemory/mcp/tools_v28.py +23 -2
  156. package/src/superlocalmemory/mcp/tools_v3.py +26 -1
  157. package/src/superlocalmemory/mcp/tools_v33.py +56 -17
  158. package/src/superlocalmemory/mesh/broker.py +2 -0
  159. package/src/superlocalmemory/mesh/remote_sync.py +50 -12
  160. package/src/superlocalmemory/optimize/cache/manager.py +77 -1
  161. package/src/superlocalmemory/optimize/cache/semantic.py +23 -3
  162. package/src/superlocalmemory/optimize/compress/ccr.py +4 -0
  163. package/src/superlocalmemory/optimize/compress/router.py +6 -1
  164. package/src/superlocalmemory/optimize/config/__init__.py +5 -0
  165. package/src/superlocalmemory/optimize/config/store.py +6 -4
  166. package/src/superlocalmemory/optimize/proxy/_helpers.py +15 -5
  167. package/src/superlocalmemory/optimize/proxy/capture.py +3 -2
  168. package/src/superlocalmemory/optimize/proxy/server.py +2 -2
  169. package/src/superlocalmemory/optimize/storage/db.py +14 -13
  170. package/src/superlocalmemory/retrieval/agentic.py +1 -1
  171. package/src/superlocalmemory/retrieval/ann_index.py +1 -1
  172. package/src/superlocalmemory/retrieval/bm25_channel.py +35 -11
  173. package/src/superlocalmemory/retrieval/bridge_discovery.py +73 -8
  174. package/src/superlocalmemory/retrieval/engine.py +169 -79
  175. package/src/superlocalmemory/retrieval/entity_channel.py +289 -67
  176. package/src/superlocalmemory/retrieval/forgetting_filter.py +1 -1
  177. package/src/superlocalmemory/retrieval/fusion.py +1 -1
  178. package/src/superlocalmemory/retrieval/hopfield_channel.py +118 -30
  179. package/src/superlocalmemory/retrieval/profile_channel.py +1 -1
  180. package/src/superlocalmemory/retrieval/quantization_aware_search.py +16 -10
  181. package/src/superlocalmemory/retrieval/reranker.py +56 -20
  182. package/src/superlocalmemory/retrieval/scope_policy.py +85 -0
  183. package/src/superlocalmemory/retrieval/semantic_channel.py +122 -14
  184. package/src/superlocalmemory/retrieval/spreading_activation.py +141 -25
  185. package/src/superlocalmemory/retrieval/strategy.py +1 -1
  186. package/src/superlocalmemory/retrieval/temporal_channel.py +30 -15
  187. package/src/superlocalmemory/retrieval/vector_store.py +1 -1
  188. package/src/superlocalmemory/server/api.py +10 -7
  189. package/src/superlocalmemory/server/bandit_loops.py +4 -2
  190. package/src/superlocalmemory/server/recall_serializer.py +24 -0
  191. package/src/superlocalmemory/server/route_mutations.py +84 -0
  192. package/src/superlocalmemory/server/routes/agents.py +8 -6
  193. package/src/superlocalmemory/server/routes/brain.py +14 -12
  194. package/src/superlocalmemory/server/routes/chat.py +29 -12
  195. package/src/superlocalmemory/server/routes/data_io.py +55 -24
  196. package/src/superlocalmemory/server/routes/helpers.py +29 -4
  197. package/src/superlocalmemory/server/routes/ingest.py +53 -36
  198. package/src/superlocalmemory/server/routes/memories.py +104 -43
  199. package/src/superlocalmemory/server/routes/mesh.py +31 -0
  200. package/src/superlocalmemory/server/routes/profiles.py +26 -4
  201. package/src/superlocalmemory/server/routes/tiers.py +43 -11
  202. package/src/superlocalmemory/server/routes/timeline.py +5 -1
  203. package/src/superlocalmemory/server/routes/v3_api.py +76 -21
  204. package/src/superlocalmemory/server/security_middleware.py +1 -1
  205. package/src/superlocalmemory/server/ui.py +6 -3
  206. package/src/superlocalmemory/server/unified_daemon.py +680 -293
  207. package/src/superlocalmemory/server/write_identity.py +147 -0
  208. package/src/superlocalmemory/storage/access_log.py +4 -3
  209. package/src/superlocalmemory/storage/database.py +118 -25
  210. package/src/superlocalmemory/storage/migration_runner.py +84 -1
  211. package/src/superlocalmemory/storage/migration_v33.py +1 -1
  212. package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +6 -60
  213. package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +120 -0
  214. package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +54 -0
  215. package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +52 -0
  216. package/src/superlocalmemory/storage/migrations/__init__.py +5 -0
  217. package/src/superlocalmemory/storage/models.py +16 -0
  218. package/src/superlocalmemory/storage/quantized_store.py +20 -3
  219. package/src/superlocalmemory/storage/v2_migrator.py +5 -3
  220. package/src/superlocalmemory/ui/favicon.svg +5 -0
  221. package/src/superlocalmemory/ui/index.html +1 -0
  222. package/src/superlocalmemory/ui/js/compliance.js +1 -1
  223. package/src/superlocalmemory/ui/js/core.js +49 -8
  224. package/src/superlocalmemory/ui/js/dashboard.js +23 -2
  225. package/src/superlocalmemory/ui/js/feedback.js +1 -1
  226. package/src/superlocalmemory/ui/js/graph-filters.js +1 -1
  227. package/src/superlocalmemory/ui/js/graph-ui.js +1 -1
  228. package/src/superlocalmemory/ui/js/lifecycle.js +1 -1
  229. package/src/superlocalmemory/ui/js/ng-mesh.js +15 -49
  230. package/src/superlocalmemory/ui/js/settings.js +4 -2
  231. package/src/superlocalmemory/vector/lancedb_backend.py +57 -9
  232. package/bin/slm +0 -59
  233. package/bin/slm.bat +0 -77
  234. package/bin/slm.cmd +0 -5
  235. package/ide/integrations/langchain/README.md +0 -106
  236. package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +0 -9
  237. package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +0 -201
  238. package/ide/integrations/langchain/pyproject.toml +0 -38
  239. package/ide/integrations/langchain/tests/__init__.py +0 -3
  240. package/ide/integrations/langchain/tests/test_chat_message_history.py +0 -215
  241. package/ide/integrations/langchain/tests/test_security.py +0 -117
  242. package/ide/integrations/llamaindex/README.md +0 -81
  243. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +0 -9
  244. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +0 -316
  245. package/ide/integrations/llamaindex/pyproject.toml +0 -43
  246. package/ide/integrations/llamaindex/tests/__init__.py +0 -3
  247. package/ide/integrations/llamaindex/tests/test_chat_store.py +0 -294
  248. package/ide/integrations/llamaindex/tests/test_security.py +0 -241
  249. package/plugin-src/.mcp.json +0 -12
  250. package/plugin-src/agents/slm-memory-advisor.md +0 -44
  251. package/plugin-src/agents/slm-optimize-advisor.md +0 -38
  252. package/plugin-src/hooks/.gitkeep +0 -0
  253. package/plugin-src/hooks/hooks.json +0 -23
  254. package/plugin-src/manifest.json +0 -25
  255. package/plugin-src/requirements.txt +0 -1
  256. package/plugin-src/rules/CLAUDE.md.fragment +0 -44
  257. package/plugin-src/scripts/ensure-venv.bat +0 -122
  258. package/plugin-src/scripts/ensure-venv.sh +0 -105
  259. package/plugin-src/scripts/slm-launch +0 -15
  260. package/plugin-src/scripts/slm-launch.bat +0 -17
  261. package/plugin-src/settings.json +0 -16
  262. package/plugin-src/skills/slm-cache/SKILL.md +0 -140
  263. package/plugin-src/skills/slm-compress/SKILL.md +0 -143
  264. package/plugin-src/skills/slm-graph/SKILL.md +0 -300
  265. package/plugin-src/skills/slm-recall/SKILL.md +0 -204
  266. package/plugin-src/skills/slm-remember/SKILL.md +0 -194
  267. package/plugin-src/skills/slm-session/SKILL.md +0 -207
  268. package/plugin-src/skills/slm-status/SKILL.md +0 -149
  269. package/scripts/__tests__/build-plugin.test.mjs +0 -613
  270. package/scripts/_savings_math.py +0 -270
  271. package/scripts/build-dmg.sh +0 -417
  272. package/scripts/build-plugin.js +0 -742
  273. package/scripts/build-slm-hook.ps1 +0 -40
  274. package/scripts/build-slm-hook.sh +0 -45
  275. package/scripts/build_entry.py +0 -452
  276. package/scripts/ci/stage5b_gate.sh +0 -50
  277. package/scripts/dogfood_savings.py +0 -490
  278. package/scripts/generate-thumbnails.py +0 -218
  279. package/scripts/install-skills.ps1 +0 -4
  280. package/scripts/install-skills.sh +0 -5
  281. package/scripts/install.ps1 +0 -701
  282. package/scripts/install.sh +0 -1015
  283. package/scripts/postinstall_binary.js +0 -287
  284. package/scripts/prepack.js +0 -33
  285. package/scripts/release_manifest.py +0 -273
  286. package/scripts/slm-hook.spec +0 -56
  287. package/scripts/start-dashboard.ps1 +0 -52
  288. package/scripts/start-dashboard.sh +0 -41
  289. package/scripts/sync-wiki.ps1 +0 -127
  290. package/scripts/sync-wiki.sh +0 -82
  291. package/scripts/test-dmg.sh +0 -161
  292. package/scripts/test-npm-package.ps1 +0 -252
  293. package/scripts/test-npm-package.sh +0 -207
  294. package/scripts/verify-install.ps1 +0 -294
  295. package/scripts/verify-install.sh +0 -266
  296. package/scripts/verify-v27.ps1 +0 -301
  297. package/scripts/verify-v27.sh +0 -233
  298. package/src/superlocalmemory.egg-info/PKG-INFO +0 -513
  299. package/src/superlocalmemory.egg-info/SOURCES.txt +0 -529
  300. package/src/superlocalmemory.egg-info/dependency_links.txt +0 -1
  301. package/src/superlocalmemory.egg-info/entry_points.txt +0 -2
  302. package/src/superlocalmemory.egg-info/requires.txt +0 -71
  303. package/src/superlocalmemory.egg-info/top_level.txt +0 -1
@@ -1,204 +0,0 @@
1
- ---
2
- name: slm-recall
3
- description: Search and retrieve facts, decisions, and past context from SuperLocalMemory. Use when the user asks to recall, find, search, or "what did we decide/say about X". Triggers multi-channel semantic retrieval with reranking; always call before storing anything new.
4
- when_to_use: |
5
- - "What did we decide about X?"
6
- - "Recall anything about Y"
7
- - "Do we have context on the Z feature?"
8
- - "Find stored information about authentication / the database / error handling"
9
- - "Search for what I said about Y"
10
- - Automatically before any non-trivial task, to surface prior context
11
- allowed-tools: recall, search, fetch, list_recent, Bash
12
- ---
13
-
14
- # slm-recall — Search & Retrieve Memory
15
-
16
- Retrieve stored facts, decisions, and past context from SuperLocalMemory using
17
- multi-channel retrieval. The golden rule: **recall before you remember**.
18
-
19
- ---
20
-
21
- ## When to use recall vs search vs fetch vs list_recent
22
-
23
- | Situation | Tool |
24
- |-----------|------|
25
- | Conceptual or paraphrase query ("what did we agree on for auth?") | `recall` — full multi-channel retrieval + rerank |
26
- | Exact keyword match needed ("find facts containing BM25") | `search` — FTS5 BM25 only, lower latency |
27
- | You have a specific `fact_id` from a prior result | `fetch` — exact lookup, full detail |
28
- | Browse newest entries without a query | `list_recent` |
29
-
30
- Use `recall` as the default. `search` is a fallback for zero-result recall on a
31
- known exact term. `fetch` is for when you already know the ID.
32
-
33
- ---
34
-
35
- ## Recall-before-remember discipline
36
-
37
- Before storing anything new, always call `recall` first. If a near-duplicate
38
- fact already exists, call `update_memory(fact_id, content)` to refine it
39
- rather than creating a duplicate. Duplicates degrade retrieval quality for
40
- every future session.
41
-
42
- ---
43
-
44
- ## MCP-first workflow
45
-
46
- ### 1. Standard recall
47
-
48
- ```
49
- recall(
50
- query="authentication strategy decision",
51
- limit=20, # default 20; reduce to 5 for quick pre-task checks
52
- session_id="<sid>", # pass the session_id returned by session_init
53
- fast=False, # default False; True skips SpreadingActivation channel
54
- )
55
- ```
56
-
57
- Real response shape (`--json` equivalent):
58
- ```json
59
- {
60
- "success": true,
61
- "results": [
62
- {
63
- "fact_id": "f8a2bc91",
64
- "content": "Decided to use JWT with 1h expiry for API auth (2026-06-10)",
65
- "score": 0.87,
66
- "confidence": 0.91,
67
- "trust_score": 0.84,
68
- "fact_type": "decision",
69
- "channel_scores": {
70
- "semantic": 0.88,
71
- "lexical": 0.61,
72
- "temporal": 0.72,
73
- "structural": 0.55
74
- }
75
- }
76
- ],
77
- "count": 1,
78
- "query_type": "semantic",
79
- "channel_weights": {
80
- "semantic": 0.4,
81
- "lexical": 0.2,
82
- "temporal": 0.2,
83
- "structural": 0.2
84
- },
85
- "retrieval_time_ms": 134,
86
- "no_confident_match": false
87
- }
88
- ```
89
-
90
- **Always check `no_confident_match`.** When `true`, no result cleared the
91
- evidence floor. Do not invent a memory — tell the user nothing was found and
92
- offer to search more broadly or store a new fact.
93
-
94
- ### 2. Passing session_id
95
-
96
- Pass the `session_id` returned by `session_init`. It threads engagement signals
97
- through to the ranker so each recall contributes to improving retrieval for
98
- your project over time. Omitting it degrades the learning loop — recall works
99
- correctly, but feedback is not attributed to the session.
100
-
101
- ### 3. Fast mode
102
-
103
- Use `fast=True` for pre-tool-call checks where sub-second response matters.
104
- This skips the SpreadingActivation channel. The remaining channels — semantic,
105
- lexical, temporal, and structural — still run.
106
-
107
- ```
108
- recall(query="rate limiting approach", limit=5, session_id="<sid>", fast=True)
109
- ```
110
-
111
- ### 4. Keyword fallback via search
112
-
113
- When `recall` returns zero results on a specific term, try `search`:
114
-
115
- ```
116
- search(query="BM25 indexing", limit=10, profile_id="")
117
- ```
118
-
119
- `profile_id=""` uses the active profile. Response has `success`, `results`,
120
- and `count` but no `channel_scores` or `query_type`.
121
-
122
- ### 5. Pull full detail for a known fact
123
-
124
- ```
125
- fetch(fact_ids="f8a2bc91,d4c1e203")
126
- ```
127
-
128
- Returns the full record for each ID: `entities`, `lifecycle`, `access_count`,
129
- `importance`, `observation_date`, `referenced_date`. Use this when the recall
130
- summary (120-char truncation in `list_recent`) is not enough.
131
-
132
- ### 6. Browse recent memories
133
-
134
- ```
135
- list_recent(limit=20, profile_id="")
136
- ```
137
-
138
- Returns facts newest-first. Content is truncated to 120 chars. Use `fetch`
139
- once you have the `fact_id` for full content.
140
-
141
- ---
142
-
143
- ## How multi-channel retrieval works
144
-
145
- `recall` runs four channels in parallel — semantic vector similarity, lexical
146
- BM25, temporal recency, and structural/graph — then fuses them with Reciprocal
147
- Rank Fusion (RRF) and applies a reranker. The `channel_weights` field in the
148
- response shows how each channel contributed for that query. Weights adapt over
149
- time based on engagement signals attributed via `session_id`.
150
-
151
- To inspect per-channel scores for a real query against your own data:
152
-
153
- ```bash
154
- slm trace "<query>" [--limit N] [--json]
155
- ```
156
-
157
- No benchmark numbers are cited here; performance is workload-dependent.
158
-
159
- ---
160
-
161
- ## CLI fallback (when MCP is unavailable)
162
-
163
- ```bash
164
- # Multi-channel semantic recall
165
- slm recall "<query>" [--limit N] [--fast] [--json]
166
-
167
- # Opt into shared/global facts for one query (v3.6.15 — off by default)
168
- slm recall "<query>" --include-global --include-shared
169
-
170
- # Keyword/FTS5 search (alias: slm search)
171
- slm search "<query>" [--limit N] [--json]
172
-
173
- # Per-channel score breakdown
174
- slm trace "<query>" [--limit N] [--json]
175
-
176
- # Browse recent memories
177
- slm list [--limit N] [--json]
178
- ```
179
-
180
- Flags verified in source (main.py):
181
- - `slm recall`: `--limit`, `--fast`, `--json`, `--include-global` / `--no-global`, `--include-shared` / `--no-shared`
182
- - `slm search`: `--limit`, `--json`
183
- - `slm trace`: `--limit`, `--json`
184
- - `slm list`: `--limit` / `-n`, `--json`
185
-
186
- > **Multi-scope (v3.6.15, opt-in):** recall is shared-OFF by default — it returns only
187
- > this profile's facts. Pass `--include-global` / `--include-shared` (or the MCP
188
- > `include_global` / `include_shared` args) to opt in for a query, or set the defaults in
189
- > your `mode_a/b/c.json` config. See [docs/shared-memory.md](../../../docs/shared-memory.md).
190
-
191
- **Flags that do NOT exist** (fabricated in old skills — never write these):
192
- `--min-score`, `--format`, `--project`, `--tags` on recall or search.
193
-
194
- ---
195
-
196
- ## Never fabricate a memory
197
-
198
- If `results` is empty or `no_confident_match` is `true`, report it plainly.
199
- Never construct a response as if a memory was found when it was not. The user
200
- trusts that what you surface came from the store.
201
-
202
- ---
203
-
204
- *SuperLocalMemory v3.6.18 · Qualixar · AGPL-3.0-or-later*
@@ -1,194 +0,0 @@
1
- ---
2
- name: slm-remember
3
- description: Capture durable facts, decisions, constraints, and gotchas into SuperLocalMemory. Use when the user says "remember that", "save this decision", "note this constraint", or when a session produces a conclusion worth persisting across sessions. Always recall first to avoid duplicates.
4
- when_to_use: |
5
- - "Remember that we use JWT with 1h expiry"
6
- - "Save this architectural decision"
7
- - "Store the constraint that X must not Y"
8
- - "Note this as a gotcha / blocker / convention"
9
- - After making a non-obvious decision during a coding session
10
- - After resolving a bug whose root cause should be persisted
11
- allowed-tools: remember, recall, update_memory, Bash
12
- ---
13
-
14
- # slm-remember — Capture Durable Facts
15
-
16
- Store atomic, durable facts into SuperLocalMemory for retrieval in future
17
- sessions. One fact per call. Recall before you remember.
18
-
19
- ---
20
-
21
- ## What to store (and what not to)
22
-
23
- **Store:**
24
- - Architectural decisions ("Decided to use Postgres not MySQL — reason: JSONB support")
25
- - Project conventions ("All API routes follow /api/v1/resource/{id} pattern")
26
- - Hard constraints ("Never expose raw SQL errors to the HTTP response")
27
- - Resolved gotchas ("Ollama needs keep_alive=-1 or it unloads the model between calls")
28
- - Security rules ("Rate limit all public endpoints at 100 req/min")
29
-
30
- **Do not store:**
31
- - Transient context that is only relevant within this conversation
32
- - Large blobs of code or full file contents (those belong in the project, not memory)
33
- - Facts the project README already captures
34
-
35
- ---
36
-
37
- ## Recall-before-remember (mandatory discipline)
38
-
39
- Before calling `remember`, always call `recall` first with the core terms of
40
- what you are about to store. If a near-duplicate exists:
41
-
42
- - Use `update_memory(fact_id, content)` to refine the existing fact instead
43
- of creating a new one.
44
- - Only call `remember` when no sufficiently similar fact is found.
45
-
46
- Duplicates degrade retrieval quality for every future session.
47
-
48
- ---
49
-
50
- ## MCP-first workflow
51
-
52
- ### 1. Check for duplicates first
53
-
54
- ```
55
- recall(query="JWT token expiry auth", limit=5, session_id="<sid>")
56
- ```
57
-
58
- If a near-duplicate is returned:
59
-
60
- ```
61
- update_memory(
62
- fact_id="f8a2bc91",
63
- content="JWT tokens use 1h expiry for API access tokens; refresh tokens 30d (updated 2026-06-16)",
64
- )
65
- ```
66
-
67
- `update_memory` returns `{"success": true, "fact_id": "f8a2bc91", "content": "..."}`.
68
-
69
- ### 2. Store a new fact
70
-
71
- ```
72
- remember(
73
- content="Decided to use JWT with 1h expiry for API auth; refresh tokens persist 30 days",
74
- tags="auth,security,decision",
75
- project="superlocalmemory",
76
- importance=8,
77
- session_id="<sid>",
78
- )
79
- ```
80
-
81
- Real response shape:
82
- ```json
83
- {
84
- "success": true,
85
- "fact_ids": ["c9d4e112"],
86
- "count": 1,
87
- "pending": false,
88
- "message": "Stored (recallable now; enriching async)."
89
- }
90
- ```
91
-
92
- When `pending: true`, the daemon was offline at save time; the fact enters a
93
- pending queue and becomes recallable once the daemon is back. Do not re-save.
94
-
95
- **Never claim "saved" unless `success: true` is in the response.**
96
-
97
- ### 3. Parameter reference
98
-
99
- ```
100
- remember(
101
- content: str, # required — the atomic fact to store
102
- tags: str = "", # comma-separated tags, e.g. "auth,security,gotcha"
103
- project: str = "", # project scope, e.g. "superlocalmemory"
104
- importance: int = 5,# 1–10; see scale below
105
- session_id: str = "",# from session_init; attributes the write to this session
106
- scope: str = None, # v3.6.15 multi-scope: "personal" (default) | "shared" | "global"
107
- shared_with: str = "",# comma-separated profile_ids for scope="shared"
108
- )
109
- ```
110
-
111
- > **Multi-scope (v3.6.15, opt-in):** leave `scope` unset for `personal` (private to
112
- > this profile — the default, identical to 3.6.14). `"global"` is visible to every
113
- > profile on the machine; `"shared"` is visible to the profiles in `shared_with`.
114
- > See [docs/shared-memory.md](../../../docs/shared-memory.md).
115
-
116
- **importance scale:**
117
- - 1–3: Low — passing notes, ideas, soft preferences
118
- - 4–6: Normal — patterns, conventions, standard decisions (default: 5)
119
- - 7–8: High — architectural decisions, integration contracts, known gotchas
120
- - 9–10: Critical — security rules, blockers, irreversible decisions
121
-
122
- Use 7–10 only for facts that would cause real damage if forgotten.
123
-
124
- ### 4. One fact per call
125
-
126
- Store one atomic fact per `remember` call. Do not concatenate multiple unrelated
127
- points into a single content string — they will be hard to update individually
128
- and harder to retrieve cleanly. If you have three separate decisions, make three
129
- calls.
130
-
131
- ### 5. Always set tags and project
132
-
133
- Untagged, unscoped facts are harder to retrieve and harder to manage. Minimum:
134
- set `tags` to one or two relevant terms and `project` to the repo/product name.
135
-
136
- ---
137
-
138
- ## Deleting stale facts via CLI
139
-
140
- For deletion, the CLI is the authoritative surface. The MCP `forget` tool in
141
- v3.6.14 runs an Ebbinghaus decay cycle — it does NOT delete by query. For
142
- targeted deletion, use the CLI:
143
-
144
- ```bash
145
- # Preview what would be deleted (always do this first)
146
- slm forget "<query>" --dry-run [--json]
147
-
148
- # Execute deletion after confirming the preview
149
- slm forget "<query>" --yes [--json]
150
-
151
- # Delete a specific fact by exact ID (use when you have the fact_id)
152
- slm delete <fact_id> --yes [--json]
153
- ```
154
-
155
- Flags verified in source (main.py):
156
- - `slm forget`: positional `query`, `--dry-run`, `--yes` / `-y`, `--json`
157
- - `slm delete`: positional `fact_id`, `--yes` / `-y`, `--json`
158
-
159
- Always run `--dry-run` first and review the preview before passing `--yes`.
160
-
161
- ---
162
-
163
- ## CLI fallback (when MCP is unavailable)
164
-
165
- ```bash
166
- # Store a fact
167
- slm remember "<content>" [--tags a,b,c] [--json]
168
-
169
- # Store a shared/global fact (v3.6.15, opt-in)
170
- slm remember "<content>" --scope global
171
- slm remember "<content>" --scope shared --shared-with alice,bob
172
-
173
- # Flags verified in source (main.py): --tags, --json, --sync, --scope, --shared-with
174
- # --sync: wait for full enrichment before returning (default is async)
175
- # --scope: personal (default) | shared | global ; --shared-with: profile ids for shared
176
- ```
177
-
178
- **Flags that do NOT exist** on `slm remember`:
179
- `--importance`, `--project`, `--format` — these are MCP-only params or fabricated.
180
-
181
- ---
182
-
183
- ## Update vs forget discipline
184
-
185
- | Scenario | Action |
186
- |----------|--------|
187
- | Fact is still true but needs refinement | `update_memory(fact_id, new_content)` |
188
- | Fact is superseded or wrong | `slm forget "<query>" --dry-run` then `--yes` |
189
- | Duplicate found that matches recall result | `update_memory` on the existing one |
190
- | Fact has a known ID and is clearly obsolete | `slm delete <fact_id> --yes` |
191
-
192
- ---
193
-
194
- *SuperLocalMemory v3.6.18 · Qualixar · AGPL-3.0-or-later*
@@ -1,207 +0,0 @@
1
- ---
2
- name: slm-session
3
- description: Manage SuperLocalMemory session lifecycle — call session_init once at the start of every fresh session to load relevant project context and get a session_id; call close_session when work is meaningfully complete to commit temporal summaries. Correct lifecycle hygiene is what makes SLM's learning loop work.
4
- when_to_use: |
5
- - At the start of every session (auto-trigger on first user message in a project context)
6
- - When the user says "start a new session" or "initialize memory"
7
- - When meaningful work completes and context should be committed
8
- - When the user says "close session" or "end session"
9
- allowed-tools: session_init, close_session, Bash
10
- ---
11
-
12
- # slm-session — Session Lifecycle Hygiene
13
-
14
- Session lifecycle is the mechanism that makes SuperLocalMemory's learning loop
15
- work. Without it, recall signals are not attributed and temporal summaries are
16
- not written. This is not optional housekeeping — it is load-bearing.
17
-
18
- ---
19
-
20
- ## The lifecycle in one diagram
21
-
22
- ```
23
- Session starts
24
- |
25
- v
26
- session_init(project_path, query)
27
- |--- returns session_id, context, memories
28
- |
29
- v
30
- Use session_id in every recall() and remember() call
31
- |
32
- v
33
- Work completes
34
- |
35
- v
36
- close_session(session_id)
37
- |--- writes temporal summaries to DB
38
- ```
39
-
40
- ---
41
-
42
- ## session_init — call once per fresh session
43
-
44
- ### When to call
45
-
46
- Call `session_init` exactly once at the start of every fresh session, before
47
- any `recall` or `remember`. Never call it twice in a session — the second call
48
- would generate a new `session_id` and break signal attribution for any prior
49
- recalls or remembers in that session.
50
-
51
- ### Signature
52
-
53
- ```
54
- session_init(
55
- project_path: str = "", # working directory path, e.g. "/Users/me/projects/foo"
56
- query: str = "", # topic override; if omitted, derived from project_path
57
- max_results: int = 10, # max memories to return (default: 10)
58
- max_age_days: int = 30, # suppress memories older than N days unless score >= 0.7
59
- # set to 0 to disable the age gate entirely
60
- )
61
- ```
62
-
63
- ### What it does
64
-
65
- 1. Derives a search query from `project_path` (or uses your explicit `query`).
66
- 2. Runs a 2-tier recall: full 6-channel via daemon (primary) or FTS5 BM25
67
- (emergency fallback if daemon is unreachable).
68
- 3. Merges any pinned "core memory" facts with the recall results.
69
- 4. Applies an age gate — memories older than `max_age_days` are suppressed
70
- unless their relevance score is 0.70 or above (architectural decisions that
71
- remain permanently relevant still surface).
72
- 5. Returns a pre-formatted `context` block and a structured `memories` array
73
- for your session.
74
- 6. Generates a stable `session_id` (`slm-YYYYMMDD-<8hex>`) and returns it.
75
-
76
- ### Real response shape
77
-
78
- ```json
79
- {
80
- "success": true,
81
- "session_id": "slm-20260616-a3f8c1d2",
82
- "context": "# Relevant Memory Context\n\n- JWT tokens use 1h expiry ...",
83
- "memories": [
84
- {
85
- "fact_id": "f8a2bc91",
86
- "content": "JWT tokens use 1h expiry for API auth (2026-06-10)",
87
- "score": 0.87,
88
- "is_core": false
89
- }
90
- ],
91
- "memory_count": 3,
92
- "core_memory": [],
93
- "degraded_mode": false,
94
- "retrieval_mode": "full_6_channel",
95
- "learning": {
96
- "feedback_signals": 37,
97
- "phase": 1,
98
- "status": "collecting"
99
- }
100
- }
101
- ```
102
-
103
- **Check `degraded_mode`.** When `true`, the daemon was unreachable and only
104
- FTS5 BM25 was used — semantic, graph, temporal, and structural channels were
105
- unavailable. The context is still usable; note the degradation if relevant.
106
-
107
- **Check `learning.phase`:**
108
- - Phase 1 (< 50 signals): collecting baseline feedback
109
- - Phase 2 (50–199 signals): active learning
110
- - Phase 3 (≥ 200 signals): full ML-driven ranking
111
-
112
- ### How to use the returned session_id
113
-
114
- Store it and thread it into every `recall` and `remember` call in this session:
115
-
116
- ```
117
- session_id = "<value from session_init>"
118
-
119
- recall(query="auth strategy", session_id=session_id, limit=10)
120
- remember(content="...", session_id=session_id, tags="auth,decision", project="myapp")
121
- ```
122
-
123
- This attribution is what allows the ranker to learn which recalls led to useful
124
- outcomes for this project.
125
-
126
- ---
127
-
128
- ## close_session — call when work is meaningfully complete
129
-
130
- ### When to call
131
-
132
- Call `close_session` when a meaningful unit of work is done — end of a coding
133
- session, after shipping a feature, after a design review. You do not need to
134
- call it after every small interaction. The signal is "this session's work is
135
- committed and should be summarised."
136
-
137
- Do not call it at the start of a new session as a cleanup step — `session_init`
138
- is the correct opener and it does not require a prior close.
139
-
140
- ### Signature
141
-
142
- ```
143
- close_session(
144
- session_id: str = "", # the session_id from session_init; if omitted,
145
- # the system queries the DB for the most recent session
146
- )
147
- ```
148
-
149
- ### What it does
150
-
151
- Aggregates facts written during the session into per-entity temporal summary
152
- events. These summaries enable future queries like "what happened during session
153
- X?" and contribute to the temporal channel in retrieval.
154
-
155
- ### Real response shape
156
-
157
- ```json
158
- {
159
- "success": true,
160
- "session_id": "slm-20260616-a3f8c1d2",
161
- "summary_events_created": 4
162
- }
163
- ```
164
-
165
- `summary_events_created: 0` is normal for short sessions where no new facts
166
- were written. It is not an error.
167
-
168
- ---
169
-
170
- ## Why this matters
171
-
172
- Every `recall` call with a `session_id` enqueues engagement signals — which
173
- results were shown, which were acted on. The learning ranker processes these
174
- signals to gradually up-weight channels and facts that prove useful for your
175
- project. Without `session_id`, signals land on a fallback identifier and are
176
- never attributed to a project or agent. Over many sessions this compounds:
177
- projects where lifecycle is respected have measurably better retrieval quality
178
- than projects where session_init is skipped.
179
-
180
- ---
181
-
182
- ## CLI fallback (when MCP is unavailable)
183
-
184
- There are no direct `session_init` or `close_session` CLI subcommands.
185
- When MCP is unavailable, use `slm status` to check system health and
186
- `slm recall` / `slm remember` directly. Session attribution will not be
187
- available in degraded CLI-only mode.
188
-
189
- ```bash
190
- slm status [--json] # check mode, profile, DB size, fact count
191
- slm doctor [--json] # preflight check including daemon and embedding worker
192
- ```
193
-
194
- ---
195
-
196
- ## Common mistakes
197
-
198
- | Mistake | Consequence | Fix |
199
- |---------|-------------|-----|
200
- | Calling `session_init` twice in one session | Two session IDs; signals split across them | Call once; store the returned ID |
201
- | Omitting `session_id` from `recall` / `remember` | No learning attribution | Always pass the stored `session_id` |
202
- | Never calling `close_session` | Temporal summaries not written | Call at end of each meaningful work unit |
203
- | Calling `close_session` without a `session_id` when no prior writes exist | Returns error "No session_id found" | Pass the explicit `session_id` from `session_init` |
204
-
205
- ---
206
-
207
- *SuperLocalMemory v3.6.18 · Qualixar · AGPL-3.0-or-later*