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,15 +0,0 @@
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
@@ -1,17 +0,0 @@
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
@@ -1,16 +0,0 @@
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
- }
@@ -1,140 +0,0 @@
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.18 · Qualixar · AGPL-3.0-or-later
@@ -1,143 +0,0 @@
1
- ---
2
- name: slm-compress
3
- description: Compress large text, tool output, or transcripts to reduce context-window usage while keeping the full 1M window intact — call slm_compress(content, mode, reversible, ttl_seconds) to shrink content; if the result is lossy a ccr_id is returned so you can call slm_retrieve(ccr_id) later to recover the exact original; always fail-open (ok:false → continue with the original).
4
- when_to_use: "compress context, shrink output, save tokens, context window full, long transcript, compress tool result, reduce tokens, large output, compress text"
5
- allowed-tools: slm_compress, slm_retrieve, Bash
6
- ---
7
-
8
- # slm-compress — Reversible Context Compression (Surface B)
9
-
10
- ## Purpose
11
-
12
- When a tool output, transcript, or accumulated context grows large enough to crowd out working space, `slm_compress` reduces it in-place. The compressed form is used for the remainder of the session; the exact original is recoverable on demand via `slm_retrieve`. This works without a proxy and without touching `ANTHROPIC_BASE_URL`, so the full 1M context window is never sacrificed.
13
-
14
- ## Primary MCP Tool: slm_compress
15
-
16
- ```
17
- slm_compress(
18
- content: str, # required — text to compress (max 1 MB)
19
- mode: str = "auto", # "normalize" | "auto" | "aggressive"
20
- reversible: bool = True, # store original in CCR for later retrieval
21
- ttl_seconds: int = 86400, # CCR lifetime in seconds (default 24 h)
22
- ) -> dict
23
- ```
24
-
25
- ### Return dict (all keys always present)
26
-
27
- | Key | Type | Meaning |
28
- |-----|------|---------|
29
- | `ok` | bool | `True` on success; `False` on internal error or empty input |
30
- | `compressed` | str | Compressed text (or original on failure) |
31
- | `strategy` | str | Which strategy was applied (e.g. `"normalize"`, `"none"`) |
32
- | `tokens_before` | int | Word-count estimate of the input |
33
- | `tokens_after` | int | Word-count estimate of the output |
34
- | `ratio` | float | `tokens_after / tokens_before` (lower = more compact) |
35
- | `lossy` | bool | Whether information was removed |
36
- | `ccr_id` | str \| None | UUID4 session token; present only when `lossy=True` and `reversible=True` |
37
- | `note` | str \| None | Human-readable note (e.g. warnings, recovery hint) |
38
-
39
- ### Mode semantics (verified from source)
40
-
41
- - **`"normalize"`** — lossless whitespace collapse; no daemon dependency; `lossy: false`, `ccr_id: null`.
42
- - **`"auto"`** — delegates to `CompressRouter`; may be lossy depending on daemon config; default.
43
- - **`"aggressive"`** — requests aggressive compression from the daemon; daemon must have `compress_mode=aggressive` set in config; note field will warn if daemon config does not match.
44
-
45
- ## Recovery Tool: slm_retrieve
46
-
47
- When `slm_compress` returns `lossy: true`, the original is stored under the `ccr_id`. Use `slm_retrieve` to get it back:
48
-
49
- ```
50
- slm_retrieve(ccr_id: str) -> dict
51
- ```
52
-
53
- | Key | Type | Meaning |
54
- |-----|------|---------|
55
- | `ok` | bool | `True` when content was found |
56
- | `content` | str \| None | Original text, decoded from UTF-8 (or Latin-1 fallback) |
57
- | `size_bytes` | int | Byte length of the stored original |
58
- | `error` | str \| None | Error message on failure; `None` on success |
59
-
60
- `ccr_id` must be a valid UUID4. Non-UUID4 strings return `ok: false` immediately.
61
-
62
- ### CCR security rule
63
-
64
- `ccr_id` values are **unguessable session tokens**. Treat them like short-lived credentials:
65
- - Never log them.
66
- - Never share them across agents.
67
- - Never pass them as tool arguments to any tool other than `slm_retrieve`.
68
- - Never compress a `ccr_id` string itself.
69
- - They expire after `ttl_seconds` (default 24 h); `slm_retrieve` returns `ok: false` after expiry.
70
-
71
- ## Decision: When to Compress
72
-
73
- **Compress when:**
74
- - A single tool output or transcript exceeds approximately 2 000 characters.
75
- - You are accumulating repeated context (e.g. full file reads across multiple steps).
76
- - Context is nearing the point where recall quality or response quality degrades.
77
-
78
- **Do NOT compress:**
79
- - Code you are about to read, edit, or diff — you need every character.
80
- - JSON you will parse programmatically — compression may alter structure.
81
- - Secrets, credentials, or `ccr_id` strings.
82
- - Anything under ~500 characters — overhead exceeds benefit.
83
- - The compressed form of content already compressed this session.
84
-
85
- ## Fail-Open Guarantee
86
-
87
- `slm_compress` never raises an exception. On any internal error it returns:
88
-
89
- ```json
90
- { "ok": false, "compressed": "<original input>", "ratio": 1.0, ... }
91
- ```
92
-
93
- **When `ok` is `false`, continue with the original content.** Never block a task waiting for compression to succeed.
94
-
95
- ## Worked Example
96
-
97
- ```python
98
- # Step 1: compress a large tool output
99
- result = await slm_compress(
100
- content=long_log_text,
101
- mode="auto",
102
- reversible=True,
103
- ttl_seconds=3600,
104
- )
105
-
106
- if result["ok"]:
107
- working_text = result["compressed"]
108
- ccr_id = result["ccr_id"] # None if lossless
109
- else:
110
- working_text = long_log_text # fail-open
111
- ccr_id = None
112
-
113
- # ... work with working_text ...
114
-
115
- # Step 2: restore original when needed (e.g. before final summary)
116
- if ccr_id:
117
- restore = await slm_retrieve(ccr_id=ccr_id)
118
- if restore["ok"]:
119
- original_text = restore["content"]
120
- ```
121
-
122
- ## Secondary CLI (fallback when MCP is unavailable)
123
-
124
- The `slm compress` subcommand exists but has known pre-existing parse-test failures. Prefer the MCP tools above. If you must use CLI:
125
-
126
- ```bash
127
- slm compress status [--json]
128
- slm compress mode safe|aggressive [--json]
129
- slm compress code on|off [--json]
130
- slm compress prose on|off [--json]
131
- slm compress ccr on|off [--json]
132
- slm compress align on|off [--json]
133
- ```
134
-
135
- These subcommands control daemon-level compression settings — they do not compress content inline. For inline compression, use `slm_compress` via MCP.
136
-
137
- ## Size Cap
138
-
139
- Content over 1 MB (1 000 000 bytes UTF-8) is processed but `reversible` is forced to `False` and `ccr_id` will be `None`. The `note` field will state `"content over 1MB: ccr skipped"`.
140
-
141
- ---
142
-
143
- SuperLocalMemory v3.6.18 · Qualixar · AGPL-3.0-or-later
@@ -1,300 +0,0 @@
1
- ---
2
- name: slm-graph
3
- description: >
4
- Index and query a codebase as a structural graph — build the code graph, trace blast radius of a
5
- change, find callers/callees/inheritors, semantic code search by meaning, assemble PR review
6
- context, and detect what changed since last index. Use when the user asks how code connects, what
7
- breaks if X changes, what calls a function, what a class inherits from, how to navigate an
8
- unfamiliar codebase, or to understand risk before editing.
9
- when_to_use: |
10
- - what calls X
11
- - what breaks if I change Y
12
- - what does Z inherit from
13
- - find code that handles authentication
14
- - impact analysis before editing
15
- - code navigation in unfamiliar repos
16
- - blast radius before a PR
17
- - pre-commit change detection
18
- allowed-tools: build_code_graph, query_graph, get_blast_radius, semantic_search_code, get_review_context, detect_changes, Bash
19
- ---
20
-
21
- # slm-graph — Code Intelligence Skill
22
-
23
- Index any repo as a code knowledge graph and answer structural questions about it: callers, callees, impact radius, semantic search, and review context. Requires the `code` MCP profile (set `SLM_MCP_PROFILE=code` in your plugin `.mcp.json`).
24
-
25
- **Prerequisite rule:** every tool except `build_code_graph` self-guards — if the graph is not built it returns `{"success": false, "error": "Code graph not built. Run build_code_graph first."}`. Always index first.
26
-
27
- ---
28
-
29
- ## Tool Reference
30
-
31
- ### 1. `build_code_graph` — index a repository
32
-
33
- ```
34
- build_code_graph(
35
- repo_path: str,
36
- languages: str = "",
37
- exclude_patterns: str = "",
38
- ) -> {success, files_parsed, nodes, edges, flows, communities, duration_ms}
39
- ```
40
-
41
- Parses all supported source files, extracts functions/classes/imports, builds the call graph, detects execution flows, and identifies code communities. Replaces any previous index for the same repo.
42
-
43
- - `repo_path` — absolute path to the repository root. Must exist.
44
- - `languages` — comma-separated language filter, e.g. `"python,typescript"`. Empty string = index all supported languages.
45
- - `exclude_patterns` — comma-separated glob patterns to exclude, e.g. `"**/node_modules/**,**/.venv/**"`. Empty = no exclusions.
46
-
47
- When to (re)build:
48
- - Before using any other graph tool for the first time on a repo.
49
- - After significant changes to the codebase (pull, merge, large refactor).
50
- - When `detect_changes` or `query_graph` returns stale/unexpected results.
51
- - Rebuild is safe and idempotent — it replaces the previous index atomically per file.
52
-
53
- ```
54
- # Index the full repo
55
- build_code_graph(repo_path="/abs/path/to/myrepo")
56
-
57
- # Index only Python, skip tests and generated code
58
- build_code_graph(
59
- repo_path="/abs/path/to/myrepo",
60
- languages="python",
61
- exclude_patterns="**/tests/**,**/generated/**"
62
- )
63
- ```
64
-
65
- ---
66
-
67
- ### 2. `query_graph` — traverse relationships
68
-
69
- ```
70
- query_graph(
71
- pattern: str,
72
- target: str = "",
73
- limit: int = 20,
74
- ) -> {success, pattern, target, results: [{qualified_name, kind, file_path, name}]}
75
- ```
76
-
77
- Query the graph for structural relationships. `pattern` is required and must be one of the eight valid values below. `target` is a qualified name, partial name, or node ID — matched with exact-then-LIKE fallback.
78
-
79
- Valid patterns:
80
-
81
- | pattern | returns |
82
- |---|---|
83
- | `callers_of` | functions/methods that call `target` |
84
- | `callees_of` | functions/methods that `target` calls |
85
- | `imports_of` | modules/symbols that `target` imports |
86
- | `imported_by` | who imports `target` |
87
- | `tests_for` | test nodes associated with `target` |
88
- | `inherits_from` | base classes of `target` |
89
- | `inherited_by` | subclasses of `target` |
90
- | `contains` | symbols defined inside `target` (e.g. methods in a class) |
91
-
92
- ```
93
- # Who calls the auth handler?
94
- query_graph(pattern="callers_of", target="authenticate_user")
95
-
96
- # What does the payment processor import?
97
- query_graph(pattern="imports_of", target="PaymentProcessor", limit=30)
98
-
99
- # What classes inherit from BaseModel?
100
- query_graph(pattern="inherited_by", target="BaseModel")
101
- ```
102
-
103
- ---
104
-
105
- ### 3. `get_blast_radius` — impact analysis
106
-
107
- ```
108
- get_blast_radius(
109
- changed_files: str,
110
- max_depth: int = 2,
111
- max_nodes: int = 500,
112
- ) -> {success, changed_nodes, impacted_nodes, impacted_files, edges, depth_reached, truncated}
113
- ```
114
-
115
- Computes the full impact radius for one or more changed files using bidirectional BFS (callers and callees). Returns every node and file reachable within `max_depth` hops. Use this before editing to understand risk surface.
116
-
117
- - `changed_files` — comma-separated file paths relative to the repo root, e.g. `"src/auth/handler.py,src/auth/models.py"`.
118
- - `max_depth` — BFS depth. Default 2. Increase to 3–4 for deep call chains; lower to 1 for a quick first-degree check.
119
- - `max_nodes` — caps the result set. If `truncated=true` in the response, the real blast radius is larger.
120
-
121
- ```
122
- # What breaks if I change the auth handler?
123
- get_blast_radius(changed_files="src/auth/handler.py")
124
-
125
- # Deeper analysis across two files
126
- get_blast_radius(
127
- changed_files="src/payments/gateway.py,src/payments/models.py",
128
- max_depth=3,
129
- max_nodes=200
130
- )
131
- ```
132
-
133
- If `truncated` is `true`, narrow the scope with `max_nodes` or reduce `max_depth` to get a reliable result.
134
-
135
- ---
136
-
137
- ### 4. `semantic_search_code` — find code by meaning
138
-
139
- ```
140
- semantic_search_code(
141
- query: str,
142
- kind: str = "",
143
- limit: int = 20,
144
- ) -> {success, results: [{qualified_name, kind, file_path, score, line_start, name}]}
145
- ```
146
-
147
- Hybrid FTS5 + vector search over all indexed code entities. Use when you know what the code *does* but not what it's *called*.
148
-
149
- - `query` — natural language description, e.g. `"retry logic for HTTP requests"` or `"parse JWT token from header"`.
150
- - `kind` — optional filter: `"Function"`, `"Class"`, `"File"`, or `"Test"`. Empty = all kinds. Case-insensitive match in the engine.
151
- - `limit` — max results. Default 20.
152
-
153
- Results include a `score` field (higher = more relevant).
154
-
155
- ```
156
- # Find where authentication is handled
157
- semantic_search_code(query="authenticate user from request token")
158
-
159
- # Find only test functions that cover database writes
160
- semantic_search_code(query="database write transaction rollback", kind="Test")
161
-
162
- # Find the rate limiter class
163
- semantic_search_code(query="rate limiting middleware", kind="Class", limit=5)
164
- ```
165
-
166
- ---
167
-
168
- ### 5. `get_review_context` — assemble PR review context
169
-
170
- ```
171
- get_review_context(
172
- changed_files: str,
173
- include_source: bool = True,
174
- ) -> {success, summary, review_items, test_gaps, risk_score}
175
- ```
176
-
177
- Produces a token-optimized review package for a set of changed files: a plain-language summary, a ranked list of review items with per-node risk scores, and a list of changed symbols that have no associated test coverage.
178
-
179
- - `changed_files` — comma-separated file paths relative to the repo root.
180
- - `include_source` — whether to include source code snippets in the context (default `True`). Set `False` to reduce token usage when you only need the risk analysis.
181
-
182
- `risk_score` is a float 0–1 on the overall changeset. `review_items[].risk_score` is per-node.
183
-
184
- ```
185
- # Get review context for a PR touching two files
186
- get_review_context(changed_files="src/auth/handler.py,src/auth/utils.py")
187
-
188
- # Risk summary only, no source snippets
189
- get_review_context(
190
- changed_files="src/payments/gateway.py",
191
- include_source=False
192
- )
193
- ```
194
-
195
- ---
196
-
197
- ### 6. `detect_changes` — what changed since last index
198
-
199
- ```
200
- detect_changes(
201
- base: str = "HEAD~1",
202
- ) -> {success, summary, risk_score, changed_functions, test_gaps, review_priorities}
203
- ```
204
-
205
- Runs `git diff` against `base`, maps the changed hunks to graph nodes, and returns a risk-scored list of changed functions, test gaps, and review priorities. Requires the repo to be a git repository.
206
-
207
- - `base` — git ref to diff against. Default `"HEAD~1"` (one commit back). Any valid git ref works: `"main"`, `"v3.6.13"`, a commit SHA, etc.
208
-
209
- ```
210
- # What changed in the last commit?
211
- detect_changes()
212
-
213
- # What changed since the release branch?
214
- detect_changes(base="release/v3.6.13")
215
-
216
- # What changed relative to main?
217
- detect_changes(base="main")
218
- ```
219
-
220
- Returns `error` if the repo root is not a git repository or if git is not available.
221
-
222
- ---
223
-
224
- ## Realistic Workflow
225
-
226
- ### Explore an unfamiliar codebase
227
-
228
- ```
229
- # 1. Index it
230
- build_code_graph(repo_path="/abs/path/to/repo")
231
-
232
- # 2. Find the entry point by meaning
233
- semantic_search_code(query="request router entry point", kind="Function")
234
-
235
- # 3. Trace what it calls
236
- query_graph(pattern="callees_of", target="handle_request")
237
-
238
- # 4. See who else calls the same core function
239
- query_graph(pattern="callers_of", target="authenticate_user")
240
- ```
241
-
242
- ### Before editing a function
243
-
244
- ```
245
- # 1. Know what you are touching
246
- semantic_search_code(query="retry HTTP requests with backoff")
247
-
248
- # 2. Understand blast radius before making the change
249
- get_blast_radius(changed_files="src/http/client.py")
250
-
251
- # 3. Check test gaps
252
- get_review_context(changed_files="src/http/client.py")
253
- ```
254
-
255
- ### Pre-commit / PR review
256
-
257
- ```
258
- # 1. What changed in this branch vs main?
259
- detect_changes(base="main")
260
-
261
- # 2. Full impact analysis for the changed files
262
- get_blast_radius(changed_files="src/auth/handler.py,src/auth/models.py")
263
-
264
- # 3. Assemble review context
265
- get_review_context(changed_files="src/auth/handler.py,src/auth/models.py")
266
- ```
267
-
268
- ---
269
-
270
- ## Error Handling
271
-
272
- All tools return `{"success": false, "error": "<message>"}` on failure — they never raise.
273
-
274
- | Error message | Cause | Fix |
275
- |---|---|---|
276
- | `Code graph not built. Run build_code_graph first.` | No index exists | Call `build_code_graph(repo_path=...)` first |
277
- | `Repository path does not exist: <path>` | Bad `repo_path` in build | Pass an absolute path that exists |
278
- | `Git not available or not a git repository: ...` | `detect_changes` needs git | Only works in git repos with git installed |
279
- | `Invalid pattern '...'` | Wrong `pattern` in `query_graph` | Use one of the 8 valid pattern strings |
280
- | `No node found matching '<target>'` | Target not in index | Rebuild or check the qualified name via `semantic_search_code` |
281
-
282
- If `build_code_graph` returns `files_parsed: 0`, no supported source files were found — check `repo_path` and `exclude_patterns`.
283
-
284
- ---
285
-
286
- ## Profile Requirement
287
-
288
- This skill uses graph tools that are only active under the `code` MCP profile. Your plugin `.mcp.json` must include:
289
-
290
- ```json
291
- "env": {
292
- "SLM_MCP_PROFILE": "code"
293
- }
294
- ```
295
-
296
- Without this, the six graph tools are not registered and will appear as unknown tools. Run `slm status` to confirm the active profile.
297
-
298
- ---
299
-
300
- SuperLocalMemory v3.6.18 · Qualixar · AGPL-3.0-or-later