superlocalmemory 3.6.23 → 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 (301) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +271 -71
  3. package/bin/slm-npm +43 -89
  4. package/ide/configs/antigravity-mcp.json +2 -2
  5. package/ide/configs/chatgpt-desktop-mcp.json +1 -1
  6. package/ide/configs/claude-desktop-mcp.json +2 -2
  7. package/ide/configs/windsurf-mcp.json +2 -2
  8. package/ide/hooks/context-hook.js +6 -2
  9. package/ide/hooks/post-recall-hook.js +7 -3
  10. package/ide/hooks/tool-event-hook.sh +2 -1
  11. package/package.json +18 -10
  12. package/plugin/.claude-plugin/plugin.json +1 -1
  13. package/plugin/_GENERATED.md +1 -1
  14. package/plugin/agents/slm-memory-advisor.md +1 -1
  15. package/plugin/requirements.txt +1 -1
  16. package/plugin/skills/slm-session/SKILL.md +1 -1
  17. package/plugin-src/rules/AGENTS.md +1 -1
  18. package/pyproject.toml +40 -8
  19. package/scripts/postinstall-interactive.js +17 -94
  20. package/scripts/postinstall.js +185 -258
  21. package/scripts/preuninstall.js +9 -50
  22. package/src/superlocalmemory/__init__.py +2 -2
  23. package/src/superlocalmemory/attribution/mathematical_dna.py +1 -1
  24. package/src/superlocalmemory/attribution/signer.py +34 -19
  25. package/src/superlocalmemory/attribution/watermark.py +1 -1
  26. package/src/superlocalmemory/cli/_lazy_init.py +3 -5
  27. package/src/superlocalmemory/cli/commands.py +453 -191
  28. package/src/superlocalmemory/cli/context_commands.py +5 -4
  29. package/src/superlocalmemory/cli/daemon.py +282 -187
  30. package/src/superlocalmemory/cli/db_migrate.py +3 -1
  31. package/src/superlocalmemory/cli/diagnostics_cmd.py +28 -0
  32. package/src/superlocalmemory/cli/evidence_cmd.py +103 -0
  33. package/src/superlocalmemory/cli/ingest_cmd.py +7 -3
  34. package/src/superlocalmemory/cli/main.py +128 -31
  35. package/src/superlocalmemory/cli/pending_store.py +54 -38
  36. package/src/superlocalmemory/cli/scale_engine_cmd.py +37 -0
  37. package/src/superlocalmemory/cli/service_installer.py +57 -52
  38. package/src/superlocalmemory/cli/setup_wizard.py +142 -88
  39. package/src/superlocalmemory/cli/version_banner.py +2 -1
  40. package/src/superlocalmemory/code_graph/config.py +3 -1
  41. package/src/superlocalmemory/core/backend_orchestrator.py +81 -21
  42. package/src/superlocalmemory/core/config.py +65 -20
  43. package/src/superlocalmemory/core/consolidation_engine.py +9 -7
  44. package/src/superlocalmemory/core/context_cache.py +56 -8
  45. package/src/superlocalmemory/core/derivation_lineage.py +246 -0
  46. package/src/superlocalmemory/core/embedding_worker.py +32 -20
  47. package/src/superlocalmemory/core/embeddings.py +54 -18
  48. package/src/superlocalmemory/core/engine.py +150 -104
  49. package/src/superlocalmemory/core/engine_ingestion.py +513 -0
  50. package/src/superlocalmemory/core/engine_wiring.py +2 -0
  51. package/src/superlocalmemory/core/evidence_bundle.py +526 -0
  52. package/src/superlocalmemory/core/fact_consolidator.py +5 -11
  53. package/src/superlocalmemory/core/graph_analyzer.py +2 -2
  54. package/src/superlocalmemory/core/health_monitor.py +4 -2
  55. package/src/superlocalmemory/core/ingestion_command.py +636 -0
  56. package/src/superlocalmemory/core/injection.py +69 -18
  57. package/src/superlocalmemory/core/lifecycle_state.py +153 -0
  58. package/src/superlocalmemory/core/maintenance.py +1 -1
  59. package/src/superlocalmemory/core/maintenance_scheduler.py +51 -35
  60. package/src/superlocalmemory/core/mutations.py +143 -0
  61. package/src/superlocalmemory/core/platform_utils.py +7 -4
  62. package/src/superlocalmemory/core/ram_lock.py +16 -5
  63. package/src/superlocalmemory/core/rate_limit.py +1 -1
  64. package/src/superlocalmemory/core/recall_pipeline.py +60 -101
  65. package/src/superlocalmemory/core/recall_worker.py +76 -59
  66. package/src/superlocalmemory/core/registry.py +1 -1
  67. package/src/superlocalmemory/core/scale_engine.py +293 -0
  68. package/src/superlocalmemory/core/score_contract.py +62 -0
  69. package/src/superlocalmemory/core/security_primitives.py +3 -1
  70. package/src/superlocalmemory/core/slm_disabled.py +3 -5
  71. package/src/superlocalmemory/core/store_pipeline.py +172 -40
  72. package/src/superlocalmemory/core/tier_manager.py +32 -20
  73. package/src/superlocalmemory/core/worker_pool.py +13 -4
  74. package/src/superlocalmemory/dynamics/activation_guided_quantization.py +1 -1
  75. package/src/superlocalmemory/dynamics/eap_scheduler.py +10 -3
  76. package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +1 -1
  77. package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +1 -1
  78. package/src/superlocalmemory/encoding/auto_linker.py +1 -1
  79. package/src/superlocalmemory/encoding/cognitive_consolidator.py +7 -16
  80. package/src/superlocalmemory/encoding/consolidator.py +22 -5
  81. package/src/superlocalmemory/encoding/fact_extractor.py +1 -1
  82. package/src/superlocalmemory/encoding/foresight.py +2 -0
  83. package/src/superlocalmemory/encoding/graph_builder.py +1 -1
  84. package/src/superlocalmemory/encoding/temporal_parser.py +2 -0
  85. package/src/superlocalmemory/evaluation/__init__.py +13 -0
  86. package/src/superlocalmemory/evaluation/calibration.py +308 -0
  87. package/src/superlocalmemory/evolution/skill_evolver.py +2 -1
  88. package/src/superlocalmemory/graph/cozo_backend.py +256 -23
  89. package/src/superlocalmemory/hooks/_outcome_common.py +21 -11
  90. package/src/superlocalmemory/hooks/antigravity_adapter.py +10 -31
  91. package/src/superlocalmemory/hooks/auto_invoker.py +25 -27
  92. package/src/superlocalmemory/hooks/auto_recall.py +31 -6
  93. package/src/superlocalmemory/hooks/auto_recall_hook.py +13 -33
  94. package/src/superlocalmemory/hooks/before_web_hook.py +9 -7
  95. package/src/superlocalmemory/hooks/claude_code_hooks.py +123 -35
  96. package/src/superlocalmemory/hooks/codex_assets.py +59 -0
  97. package/src/superlocalmemory/hooks/codex_hooks.py +186 -0
  98. package/src/superlocalmemory/hooks/context_payload.py +1 -1
  99. package/src/superlocalmemory/hooks/copilot_adapter.py +9 -24
  100. package/src/superlocalmemory/hooks/cursor_adapter.py +10 -32
  101. package/src/superlocalmemory/hooks/hook_daemon.py +4 -2
  102. package/src/superlocalmemory/hooks/hook_handlers.py +219 -32
  103. package/src/superlocalmemory/hooks/memory_protocol.py +5 -3
  104. package/src/superlocalmemory/hooks/post_tool_async_hook.py +4 -2
  105. package/src/superlocalmemory/hooks/session_registry.py +15 -8
  106. package/src/superlocalmemory/hooks/stop_outcome_hook.py +10 -6
  107. package/src/superlocalmemory/hooks/topic_shift_hook.py +42 -12
  108. package/src/superlocalmemory/hooks/user_prompt_hook.py +9 -14
  109. package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +19 -11
  110. package/src/superlocalmemory/infra/auth_middleware.py +38 -5
  111. package/src/superlocalmemory/infra/backup.py +7 -5
  112. package/src/superlocalmemory/infra/cloud_backup.py +18 -8
  113. package/src/superlocalmemory/infra/daemon_identity.py +248 -0
  114. package/src/superlocalmemory/infra/data_root.py +199 -0
  115. package/src/superlocalmemory/infra/event_bus.py +3 -1
  116. package/src/superlocalmemory/infra/local_diagnostics.py +327 -0
  117. package/src/superlocalmemory/infra/process_reaper.py +23 -0
  118. package/src/superlocalmemory/ingestion/adapter_manager.py +27 -9
  119. package/src/superlocalmemory/ingestion/base_adapter.py +25 -31
  120. package/src/superlocalmemory/ingestion/calendar_adapter.py +13 -4
  121. package/src/superlocalmemory/ingestion/credentials.py +14 -7
  122. package/src/superlocalmemory/ingestion/gmail_adapter.py +13 -4
  123. package/src/superlocalmemory/ingestion/transcript_adapter.py +7 -2
  124. package/src/superlocalmemory/learning/consolidation_quantization_worker.py +1 -1
  125. package/src/superlocalmemory/learning/ensemble.py +11 -0
  126. package/src/superlocalmemory/learning/entity_compiler.py +1 -1
  127. package/src/superlocalmemory/learning/feedback.py +1 -1
  128. package/src/superlocalmemory/learning/forgetting_scheduler.py +12 -7
  129. package/src/superlocalmemory/learning/quantization_scheduler.py +1 -1
  130. package/src/superlocalmemory/learning/ranker.py +4 -1
  131. package/src/superlocalmemory/learning/source_quality.py +1 -1
  132. package/src/superlocalmemory/learning/trigram_index.py +3 -2
  133. package/src/superlocalmemory/llm/backbone.py +1 -1
  134. package/src/superlocalmemory/math/ebbinghaus.py +1 -1
  135. package/src/superlocalmemory/math/fisher.py +1 -1
  136. package/src/superlocalmemory/math/fisher_quantized.py +1 -1
  137. package/src/superlocalmemory/math/hopfield.py +1 -1
  138. package/src/superlocalmemory/math/langevin.py +1 -1
  139. package/src/superlocalmemory/math/polar_quant.py +3 -4
  140. package/src/superlocalmemory/math/qjl.py +1 -1
  141. package/src/superlocalmemory/math/sheaf.py +1 -1
  142. package/src/superlocalmemory/math/turbo_quant.py +3 -2
  143. package/src/superlocalmemory/mcp/_daemon_proxy.py +12 -11
  144. package/src/superlocalmemory/mcp/_pool_adapter.py +27 -0
  145. package/src/superlocalmemory/mcp/http_transport.py +53 -0
  146. package/src/superlocalmemory/mcp/server.py +39 -13
  147. package/src/superlocalmemory/mcp/shared.py +69 -3
  148. package/src/superlocalmemory/mcp/tools_active.py +141 -31
  149. package/src/superlocalmemory/mcp/tools_core.py +128 -29
  150. package/src/superlocalmemory/mcp/tools_evolution.py +5 -7
  151. package/src/superlocalmemory/mcp/tools_learning.py +42 -2
  152. package/src/superlocalmemory/mcp/tools_mesh.py +7 -23
  153. package/src/superlocalmemory/mcp/tools_optimize.py +8 -1
  154. package/src/superlocalmemory/mcp/tools_v28.py +23 -2
  155. package/src/superlocalmemory/mcp/tools_v3.py +26 -1
  156. package/src/superlocalmemory/mcp/tools_v33.py +56 -17
  157. package/src/superlocalmemory/mesh/broker.py +2 -0
  158. package/src/superlocalmemory/mesh/remote_sync.py +50 -12
  159. package/src/superlocalmemory/optimize/cache/manager.py +77 -1
  160. package/src/superlocalmemory/optimize/cache/semantic.py +23 -3
  161. package/src/superlocalmemory/optimize/compress/ccr.py +4 -0
  162. package/src/superlocalmemory/optimize/compress/router.py +6 -1
  163. package/src/superlocalmemory/optimize/config/__init__.py +5 -0
  164. package/src/superlocalmemory/optimize/config/store.py +6 -4
  165. package/src/superlocalmemory/optimize/proxy/_helpers.py +15 -5
  166. package/src/superlocalmemory/optimize/proxy/capture.py +3 -2
  167. package/src/superlocalmemory/optimize/proxy/server.py +2 -2
  168. package/src/superlocalmemory/optimize/storage/db.py +12 -12
  169. package/src/superlocalmemory/retrieval/agentic.py +1 -1
  170. package/src/superlocalmemory/retrieval/ann_index.py +1 -1
  171. package/src/superlocalmemory/retrieval/bm25_channel.py +35 -11
  172. package/src/superlocalmemory/retrieval/bridge_discovery.py +73 -8
  173. package/src/superlocalmemory/retrieval/engine.py +169 -79
  174. package/src/superlocalmemory/retrieval/entity_channel.py +289 -67
  175. package/src/superlocalmemory/retrieval/forgetting_filter.py +1 -1
  176. package/src/superlocalmemory/retrieval/fusion.py +1 -1
  177. package/src/superlocalmemory/retrieval/hopfield_channel.py +118 -30
  178. package/src/superlocalmemory/retrieval/profile_channel.py +1 -1
  179. package/src/superlocalmemory/retrieval/quantization_aware_search.py +16 -10
  180. package/src/superlocalmemory/retrieval/reranker.py +56 -20
  181. package/src/superlocalmemory/retrieval/scope_policy.py +85 -0
  182. package/src/superlocalmemory/retrieval/semantic_channel.py +122 -14
  183. package/src/superlocalmemory/retrieval/spreading_activation.py +141 -25
  184. package/src/superlocalmemory/retrieval/strategy.py +1 -1
  185. package/src/superlocalmemory/retrieval/temporal_channel.py +30 -15
  186. package/src/superlocalmemory/retrieval/vector_store.py +1 -1
  187. package/src/superlocalmemory/server/api.py +10 -7
  188. package/src/superlocalmemory/server/bandit_loops.py +4 -2
  189. package/src/superlocalmemory/server/recall_serializer.py +24 -0
  190. package/src/superlocalmemory/server/route_mutations.py +84 -0
  191. package/src/superlocalmemory/server/routes/agents.py +8 -6
  192. package/src/superlocalmemory/server/routes/brain.py +14 -12
  193. package/src/superlocalmemory/server/routes/chat.py +29 -12
  194. package/src/superlocalmemory/server/routes/data_io.py +55 -24
  195. package/src/superlocalmemory/server/routes/helpers.py +8 -63
  196. package/src/superlocalmemory/server/routes/ingest.py +53 -36
  197. package/src/superlocalmemory/server/routes/memories.py +104 -43
  198. package/src/superlocalmemory/server/routes/mesh.py +31 -0
  199. package/src/superlocalmemory/server/routes/profiles.py +26 -4
  200. package/src/superlocalmemory/server/routes/tiers.py +43 -11
  201. package/src/superlocalmemory/server/routes/timeline.py +5 -1
  202. package/src/superlocalmemory/server/routes/v3_api.py +76 -21
  203. package/src/superlocalmemory/server/security_middleware.py +1 -1
  204. package/src/superlocalmemory/server/unified_daemon.py +680 -293
  205. package/src/superlocalmemory/server/write_identity.py +147 -0
  206. package/src/superlocalmemory/storage/access_log.py +4 -3
  207. package/src/superlocalmemory/storage/database.py +118 -25
  208. package/src/superlocalmemory/storage/migration_runner.py +84 -1
  209. package/src/superlocalmemory/storage/migration_v33.py +1 -1
  210. package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +6 -60
  211. package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +120 -0
  212. package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +54 -0
  213. package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +52 -0
  214. package/src/superlocalmemory/storage/migrations/__init__.py +5 -0
  215. package/src/superlocalmemory/storage/models.py +16 -0
  216. package/src/superlocalmemory/storage/quantized_store.py +20 -3
  217. package/src/superlocalmemory/storage/v2_migrator.py +5 -3
  218. package/src/superlocalmemory/ui/favicon.svg +5 -0
  219. package/src/superlocalmemory/ui/index.html +1 -0
  220. package/src/superlocalmemory/ui/js/compliance.js +1 -1
  221. package/src/superlocalmemory/ui/js/core.js +49 -8
  222. package/src/superlocalmemory/ui/js/dashboard.js +23 -2
  223. package/src/superlocalmemory/ui/js/feedback.js +1 -1
  224. package/src/superlocalmemory/ui/js/graph-filters.js +1 -1
  225. package/src/superlocalmemory/ui/js/graph-ui.js +1 -1
  226. package/src/superlocalmemory/ui/js/lifecycle.js +1 -1
  227. package/src/superlocalmemory/ui/js/ng-mesh.js +15 -49
  228. package/src/superlocalmemory/ui/js/settings.js +4 -2
  229. package/src/superlocalmemory/vector/lancedb_backend.py +57 -9
  230. package/bin/slm +0 -59
  231. package/bin/slm.bat +0 -77
  232. package/bin/slm.cmd +0 -5
  233. package/ide/integrations/langchain/README.md +0 -106
  234. package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +0 -9
  235. package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +0 -201
  236. package/ide/integrations/langchain/pyproject.toml +0 -38
  237. package/ide/integrations/langchain/tests/__init__.py +0 -3
  238. package/ide/integrations/langchain/tests/test_chat_message_history.py +0 -215
  239. package/ide/integrations/langchain/tests/test_security.py +0 -117
  240. package/ide/integrations/llamaindex/README.md +0 -81
  241. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +0 -9
  242. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +0 -316
  243. package/ide/integrations/llamaindex/pyproject.toml +0 -43
  244. package/ide/integrations/llamaindex/tests/__init__.py +0 -3
  245. package/ide/integrations/llamaindex/tests/test_chat_store.py +0 -294
  246. package/ide/integrations/llamaindex/tests/test_security.py +0 -241
  247. package/plugin-src/.mcp.json +0 -12
  248. package/plugin-src/agents/slm-memory-advisor.md +0 -44
  249. package/plugin-src/agents/slm-optimize-advisor.md +0 -38
  250. package/plugin-src/hooks/.gitkeep +0 -0
  251. package/plugin-src/hooks/hooks.json +0 -23
  252. package/plugin-src/manifest.json +0 -25
  253. package/plugin-src/requirements.txt +0 -1
  254. package/plugin-src/rules/CLAUDE.md.fragment +0 -44
  255. package/plugin-src/scripts/ensure-venv.bat +0 -122
  256. package/plugin-src/scripts/ensure-venv.sh +0 -105
  257. package/plugin-src/scripts/slm-launch +0 -15
  258. package/plugin-src/scripts/slm-launch.bat +0 -17
  259. package/plugin-src/settings.json +0 -16
  260. package/plugin-src/skills/slm-cache/SKILL.md +0 -140
  261. package/plugin-src/skills/slm-compress/SKILL.md +0 -143
  262. package/plugin-src/skills/slm-graph/SKILL.md +0 -300
  263. package/plugin-src/skills/slm-recall/SKILL.md +0 -204
  264. package/plugin-src/skills/slm-remember/SKILL.md +0 -194
  265. package/plugin-src/skills/slm-session/SKILL.md +0 -207
  266. package/plugin-src/skills/slm-status/SKILL.md +0 -149
  267. package/scripts/__tests__/build-plugin.test.mjs +0 -613
  268. package/scripts/_savings_math.py +0 -270
  269. package/scripts/build-dmg.sh +0 -417
  270. package/scripts/build-plugin.js +0 -742
  271. package/scripts/build-slm-hook.ps1 +0 -40
  272. package/scripts/build-slm-hook.sh +0 -45
  273. package/scripts/build_entry.py +0 -452
  274. package/scripts/ci/stage5b_gate.sh +0 -50
  275. package/scripts/dogfood_savings.py +0 -490
  276. package/scripts/generate-thumbnails.py +0 -218
  277. package/scripts/install-skills.ps1 +0 -4
  278. package/scripts/install-skills.sh +0 -5
  279. package/scripts/install.ps1 +0 -701
  280. package/scripts/install.sh +0 -1015
  281. package/scripts/postinstall_binary.js +0 -287
  282. package/scripts/prepack.js +0 -33
  283. package/scripts/release_manifest.py +0 -273
  284. package/scripts/slm-hook.spec +0 -56
  285. package/scripts/start-dashboard.ps1 +0 -52
  286. package/scripts/start-dashboard.sh +0 -41
  287. package/scripts/sync-wiki.ps1 +0 -127
  288. package/scripts/sync-wiki.sh +0 -82
  289. package/scripts/test-dmg.sh +0 -161
  290. package/scripts/test-npm-package.ps1 +0 -252
  291. package/scripts/test-npm-package.sh +0 -207
  292. package/scripts/verify-install.ps1 +0 -294
  293. package/scripts/verify-install.sh +0 -266
  294. package/scripts/verify-v27.ps1 +0 -301
  295. package/scripts/verify-v27.sh +0 -233
  296. package/src/superlocalmemory.egg-info/PKG-INFO +0 -516
  297. package/src/superlocalmemory.egg-info/SOURCES.txt +0 -529
  298. package/src/superlocalmemory.egg-info/dependency_links.txt +0 -1
  299. package/src/superlocalmemory.egg-info/entry_points.txt +0 -2
  300. package/src/superlocalmemory.egg-info/requires.txt +0 -71
  301. 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.