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
@@ -9,10 +9,10 @@ from __future__ import annotations
9
9
  import json
10
10
  import logging
11
11
  import os
12
- from pathlib import Path
13
- from fastapi import APIRouter, Request
12
+ from fastapi import APIRouter, HTTPException, Request
14
13
  from fastapi.responses import JSONResponse
15
14
  from superlocalmemory.server.routes.helpers import SLM_VERSION
15
+ from superlocalmemory.server.route_mutations import authorize_route_mutation
16
16
 
17
17
  logger = logging.getLogger(__name__)
18
18
 
@@ -678,17 +678,16 @@ async def recall_trace(request: Request):
678
678
  )
679
679
  elapsed_ms = round((_time.monotonic() - t0) * 1000, 1)
680
680
 
681
- results = []
682
- for r in response.results[:limit]:
683
- results.append({
684
- "fact_id": r.fact.fact_id,
685
- "memory_id": getattr(r.fact, "memory_id", ""),
686
- "content": r.fact.content[:300],
687
- "score": round(r.score, 4),
688
- "confidence": round(getattr(r, "confidence", 0.0), 4),
689
- "channel_scores": getattr(r, "channel_scores", {}),
690
- "created_at": getattr(r.fact, "created_at", ""),
691
- })
681
+ from superlocalmemory.server.recall_serializer import (
682
+ recall_response_metadata,
683
+ serialize_recall_response,
684
+ )
685
+ results, no_confident_match = serialize_recall_response(
686
+ response,
687
+ limit=limit,
688
+ per_fact_max=300,
689
+ total_max=max(300, limit * 300),
690
+ )
692
691
 
693
692
  # Record learning signals (non-blocking, non-critical)
694
693
  try:
@@ -704,6 +703,8 @@ async def recall_trace(request: Request):
704
703
  "retrieval_time_ms": elapsed_ms,
705
704
  "results": results,
706
705
  "synthesis": "",
706
+ "no_confident_match": no_confident_match,
707
+ **recall_response_metadata(response),
707
708
  }
708
709
  except Exception as e:
709
710
  return JSONResponse({"error": str(e)}, status_code=500)
@@ -713,7 +714,8 @@ def _record_learning_signals(query: str, results: list) -> None:
713
714
  """Record feedback + co-retrieval + confidence boost for any recall."""
714
715
  from superlocalmemory.core.config import SLMConfig
715
716
 
716
- slm_dir = Path.home() / ".superlocalmemory"
717
+ from superlocalmemory.infra.data_root import canonical_data_root
718
+ slm_dir = canonical_data_root()
717
719
  config = SLMConfig.load()
718
720
  pid = config.active_profile
719
721
  fact_ids = [r.get("fact_id", "") for r in results[:10] if r.get("fact_id")]
@@ -970,6 +972,12 @@ async def run_consolidation(request: Request):
970
972
 
971
973
  config = SLMConfig.load()
972
974
  learning_db = DB_PATH.parent / "learning.db"
975
+ authorization = authorize_route_mutation(
976
+ request,
977
+ operation="update",
978
+ source_agent_id="http-learning-consolidate",
979
+ profile_id=config.active_profile,
980
+ )
973
981
  result = await run_in_threadpool(
974
982
  run_consolidation_isolated,
975
983
  str(DB_PATH),
@@ -988,7 +996,10 @@ async def run_consolidation(request: Request):
988
996
  except Exception:
989
997
  pass
990
998
  stats = result.get("stats") or {}
999
+ authorization.complete()
991
1000
  return {"success": True, **stats}
1001
+ except HTTPException:
1002
+ raise
992
1003
  except Exception as exc:
993
1004
  return {"success": False, "error": str(exc)}
994
1005
 
@@ -1383,6 +1394,12 @@ async def trigger_consolidation(request: Request):
1383
1394
 
1384
1395
  from superlocalmemory.server.routes.helpers import get_active_profile
1385
1396
  pid = profile or get_active_profile()
1397
+ authorization = authorize_route_mutation(
1398
+ request,
1399
+ operation="update",
1400
+ source_agent_id="http-consolidation-trigger",
1401
+ profile_id=pid,
1402
+ )
1386
1403
 
1387
1404
  # Use WorkerPool to run consolidation in the worker subprocess (Rule 18)
1388
1405
  try:
@@ -1394,6 +1411,7 @@ async def trigger_consolidation(request: Request):
1394
1411
  "lightweight": lightweight,
1395
1412
  })
1396
1413
  if result and result.get("ok"):
1414
+ authorization.complete()
1397
1415
  return {"success": True, **result}
1398
1416
  except Exception:
1399
1417
  pass
@@ -1422,7 +1440,10 @@ async def trigger_consolidation(request: Request):
1422
1440
  except Exception as exc:
1423
1441
  logger.debug("Pattern mining after consolidation failed: %s", exc)
1424
1442
 
1443
+ authorization.complete()
1425
1444
  return {"success": True, **result}
1445
+ except HTTPException:
1446
+ raise
1426
1447
  except Exception as e:
1427
1448
  return JSONResponse({"error": str(e)}, status_code=500)
1428
1449
 
@@ -1490,7 +1511,7 @@ async def update_core_memory_block(block_id: str, request: Request):
1490
1511
  status_code=400,
1491
1512
  )
1492
1513
 
1493
- from superlocalmemory.server.routes.helpers import DB_PATH
1514
+ from superlocalmemory.server.routes.helpers import DB_PATH, get_active_profile
1494
1515
  import sqlite3
1495
1516
  from datetime import datetime, timezone
1496
1517
 
@@ -1500,14 +1521,24 @@ async def update_core_memory_block(block_id: str, request: Request):
1500
1521
  status_code=404,
1501
1522
  )
1502
1523
 
1524
+ pid = get_active_profile()
1525
+ authorization = authorize_route_mutation(
1526
+ request,
1527
+ operation="update",
1528
+ source_agent_id="http-core-memory-update",
1529
+ profile_id=pid,
1530
+ fact_id=block_id,
1531
+ content_preview=str(content),
1532
+ )
1533
+
1503
1534
  conn = sqlite3.connect(str(DB_PATH))
1504
1535
  conn.row_factory = sqlite3.Row
1505
1536
 
1506
1537
  # Verify block exists
1507
1538
  existing = conn.execute(
1508
1539
  "SELECT block_id, profile_id, block_type, version "
1509
- "FROM core_memory_blocks WHERE block_id = ?",
1510
- (block_id,),
1540
+ "FROM core_memory_blocks WHERE block_id = ? AND profile_id = ?",
1541
+ (block_id, pid),
1511
1542
  ).fetchone()
1512
1543
 
1513
1544
  if not existing:
@@ -1524,8 +1555,8 @@ async def update_core_memory_block(block_id: str, request: Request):
1524
1555
  conn.execute(
1525
1556
  "UPDATE core_memory_blocks SET content = ?, char_count = ?, "
1526
1557
  "version = ?, compiled_by = 'manual', updated_at = ? "
1527
- "WHERE block_id = ?",
1528
- (content, len(content), new_version, now, block_id),
1558
+ "WHERE block_id = ? AND profile_id = ?",
1559
+ (content, len(content), new_version, now, block_id, pid),
1529
1560
  )
1530
1561
  conn.commit()
1531
1562
 
@@ -1533,12 +1564,15 @@ async def update_core_memory_block(block_id: str, request: Request):
1533
1564
  updated = conn.execute(
1534
1565
  "SELECT block_id, block_type, content, char_count, version, "
1535
1566
  "compiled_by, updated_at FROM core_memory_blocks "
1536
- "WHERE block_id = ?",
1537
- (block_id,),
1567
+ "WHERE block_id = ? AND profile_id = ?",
1568
+ (block_id, pid),
1538
1569
  ).fetchone()
1539
1570
  conn.close()
1540
1571
 
1572
+ authorization.complete()
1541
1573
  return dict(updated) if updated else {"block_id": block_id, "updated": True}
1574
+ except HTTPException:
1575
+ raise
1542
1576
  except Exception as e:
1543
1577
  return JSONResponse({"error": str(e)}, status_code=500)
1544
1578
 
@@ -1664,6 +1698,12 @@ async def run_forgetting(request: Request):
1664
1698
  if not DB_PATH.exists():
1665
1699
  return {"success": False, "error": "Database not found"}
1666
1700
 
1701
+ authorization = authorize_route_mutation(
1702
+ request,
1703
+ operation="update",
1704
+ source_agent_id="http-forgetting-run",
1705
+ profile_id=pid,
1706
+ )
1667
1707
  conn = _sqlite3.connect(str(DB_PATH))
1668
1708
  conn.row_factory = _sqlite3.Row
1669
1709
 
@@ -1707,13 +1747,19 @@ async def run_forgetting(request: Request):
1707
1747
  (pid,),
1708
1748
  )
1709
1749
 
1750
+ from superlocalmemory.core.lifecycle_state import reconcile_profile_lifecycle
1751
+ reconcile_profile_lifecycle(conn, pid)
1752
+
1710
1753
  conn.commit()
1711
1754
  except Exception as exc:
1712
1755
  conn.close()
1713
1756
  return {"success": False, "error": str(exc)}
1714
1757
 
1715
1758
  conn.close()
1759
+ authorization.complete()
1716
1760
  return {"success": True, "facts_decayed": updated, "profile": pid}
1761
+ except HTTPException:
1762
+ raise
1717
1763
  except Exception as e:
1718
1764
  return JSONResponse({"error": str(e)}, status_code=500)
1719
1765
 
@@ -2083,12 +2129,21 @@ async def run_community_detection(request: Request):
2083
2129
  from superlocalmemory.core.graph_analyzer import GraphAnalyzer
2084
2130
 
2085
2131
  pid = get_active_profile()
2132
+ authorization = authorize_route_mutation(
2133
+ request,
2134
+ operation="update",
2135
+ source_agent_id="http-community-detection",
2136
+ profile_id=pid,
2137
+ )
2086
2138
  db = DatabaseManager(DB_PATH)
2087
2139
  db.initialize(_schema)
2088
2140
 
2089
2141
  analyzer = GraphAnalyzer(db)
2090
2142
  result = analyzer.compute_and_store(pid)
2143
+ authorization.complete()
2091
2144
  return {"success": True, **result}
2145
+ except HTTPException:
2146
+ raise
2092
2147
  except Exception as e:
2093
2148
  return JSONResponse({"error": str(e)}, status_code=500)
2094
2149
 
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env python3
2
- # SPDX-License-Identifier: Elastic-2.0
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
3
  # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
4
4
  # Part of Qualixar | Author: Varun Pratap Bhardwaj (qualixar.com | varunpratap.com)
5
5
  """Security headers middleware for FastAPI servers.
@@ -45,9 +45,12 @@ except ImportError:
45
45
 
46
46
  from superlocalmemory.server.security_middleware import SecurityHeadersMiddleware
47
47
 
48
- # V3 Paths (migrated from ~/.claude-memory to ~/.superlocalmemory)
49
- MEMORY_DIR = Path.home() / ".superlocalmemory"
50
- DB_PATH = MEMORY_DIR / "memory.db"
48
+ # V3 Paths reuse the lazy resolvers from routes.helpers so the dashboard
49
+ # honours SLM_DATA_DIR / SL_MEMORY_PATH / SLM_HOME / config.json:base_dir
50
+ # exactly like the CLI. Previously this hardcoded ~/.superlocalmemory, which
51
+ # caused dashboard-created profiles to land in a different memory.db than
52
+ # `slm profile list` reads when a custom data dir was configured.
53
+ from superlocalmemory.server.routes.helpers import MEMORY_DIR, DB_PATH
51
54
  # V3.3.21: UI shipped inside the package for pip/npm installs.
52
55
  # Check package location first, then fall back to repo root for dev mode.
53
56
  _PKG_UI = Path(__file__).resolve().parent.parent / "ui"