superlocalmemory 4.1.13 → 4.1.14

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 (740) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +48 -0
  3. package/README.md +3 -3
  4. package/package.json +1 -8
  5. package/plugin/.claude-plugin/plugin.json +1 -1
  6. package/plugin/CLAUDE.md +3 -3
  7. package/plugin/agents/slm-governance-advisor.md +1 -1
  8. package/plugin/agents/slm-loop-runner.md +1 -1
  9. package/plugin/agents/slm-memory-advisor.md +1 -1
  10. package/plugin/agents/slm-optimize-advisor.md +1 -1
  11. package/plugin/requirements.txt +1 -1
  12. package/plugin/skills/slm-cache/SKILL.md +1 -1
  13. package/plugin/skills/slm-compress/SKILL.md +1 -1
  14. package/plugin/skills/slm-governance/SKILL.md +1 -1
  15. package/plugin/skills/slm-graph/SKILL.md +1 -1
  16. package/plugin/skills/slm-loop/SKILL.md +1 -1
  17. package/plugin/skills/slm-mesh/SKILL.md +1 -1
  18. package/plugin/skills/slm-profile/SKILL.md +1 -1
  19. package/plugin/skills/slm-recall/SKILL.md +1 -1
  20. package/plugin/skills/slm-remember/SKILL.md +1 -1
  21. package/plugin/skills/slm-scope/SKILL.md +1 -1
  22. package/plugin/skills/slm-session/SKILL.md +1 -1
  23. package/plugin/skills/slm-status/SKILL.md +1 -1
  24. package/plugin-src/agents/slm-memory-advisor.md +1 -1
  25. package/plugin-src/agents/slm-optimize-advisor.md +1 -1
  26. package/plugin-src/rules/AGENTS.md +1 -1
  27. package/plugin-src/skills/slm-cache/SKILL.md +1 -1
  28. package/plugin-src/skills/slm-compress/SKILL.md +1 -1
  29. package/plugin-src/skills/slm-governance/SKILL.md +1 -1
  30. package/plugin-src/skills/slm-graph/SKILL.md +1 -1
  31. package/plugin-src/skills/slm-loop/SKILL.md +1 -1
  32. package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
  33. package/plugin-src/skills/slm-profile/SKILL.md +1 -1
  34. package/plugin-src/skills/slm-recall/SKILL.md +1 -1
  35. package/plugin-src/skills/slm-remember/SKILL.md +1 -1
  36. package/plugin-src/skills/slm-scope/SKILL.md +1 -1
  37. package/plugin-src/skills/slm-session/SKILL.md +1 -1
  38. package/plugin-src/skills/slm-status/SKILL.md +1 -1
  39. package/scripts/postinstall.js +71 -2
  40. package/pyproject.toml +0 -250
  41. package/src/superlocalmemory/__init__.py +0 -82
  42. package/src/superlocalmemory/access/__init__.py +0 -3
  43. package/src/superlocalmemory/access/rbac.py +0 -575
  44. package/src/superlocalmemory/attribution/__init__.py +0 -9
  45. package/src/superlocalmemory/attribution/signer.py +0 -173
  46. package/src/superlocalmemory/attribution/watermark.py +0 -189
  47. package/src/superlocalmemory/brain/__init__.py +0 -5
  48. package/src/superlocalmemory/brain/truth.py +0 -418
  49. package/src/superlocalmemory/cli/__init__.py +0 -5
  50. package/src/superlocalmemory/cli/__main__.py +0 -17
  51. package/src/superlocalmemory/cli/_lazy_init.py +0 -115
  52. package/src/superlocalmemory/cli/cache_cmd.py +0 -198
  53. package/src/superlocalmemory/cli/commands.py +0 -4710
  54. package/src/superlocalmemory/cli/compress_cmd.py +0 -151
  55. package/src/superlocalmemory/cli/context_commands.py +0 -193
  56. package/src/superlocalmemory/cli/daemon.py +0 -909
  57. package/src/superlocalmemory/cli/db_migrate.py +0 -150
  58. package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
  59. package/src/superlocalmemory/cli/escape_hatch.py +0 -220
  60. package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
  61. package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
  62. package/src/superlocalmemory/cli/gdpr_io.py +0 -109
  63. package/src/superlocalmemory/cli/help_cmd.py +0 -197
  64. package/src/superlocalmemory/cli/host_upgrades.py +0 -189
  65. package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
  66. package/src/superlocalmemory/cli/json_output.py +0 -81
  67. package/src/superlocalmemory/cli/loop_cmd.py +0 -187
  68. package/src/superlocalmemory/cli/main.py +0 -1145
  69. package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
  70. package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
  71. package/src/superlocalmemory/cli/ops_cmd.py +0 -281
  72. package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
  73. package/src/superlocalmemory/cli/optimize_constants.py +0 -31
  74. package/src/superlocalmemory/cli/pending_store.py +0 -296
  75. package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
  76. package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
  77. package/src/superlocalmemory/cli/service_installer.py +0 -373
  78. package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
  79. package/src/superlocalmemory/cli/summary_cmd.py +0 -215
  80. package/src/superlocalmemory/cli/version_banner.py +0 -202
  81. package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
  82. package/src/superlocalmemory/code_graph/__init__.py +0 -46
  83. package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
  84. package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
  85. package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
  86. package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
  87. package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
  88. package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
  89. package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
  90. package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
  91. package/src/superlocalmemory/code_graph/changes.py +0 -363
  92. package/src/superlocalmemory/code_graph/communities.py +0 -299
  93. package/src/superlocalmemory/code_graph/config.py +0 -154
  94. package/src/superlocalmemory/code_graph/database.py +0 -526
  95. package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
  96. package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
  97. package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
  98. package/src/superlocalmemory/code_graph/flows.py +0 -350
  99. package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
  100. package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
  101. package/src/superlocalmemory/code_graph/graph_store.py +0 -335
  102. package/src/superlocalmemory/code_graph/incremental.py +0 -200
  103. package/src/superlocalmemory/code_graph/models.py +0 -130
  104. package/src/superlocalmemory/code_graph/parser.py +0 -687
  105. package/src/superlocalmemory/code_graph/resolver.py +0 -321
  106. package/src/superlocalmemory/code_graph/search.py +0 -460
  107. package/src/superlocalmemory/code_graph/service.py +0 -95
  108. package/src/superlocalmemory/code_graph/watcher.py +0 -207
  109. package/src/superlocalmemory/compliance/__init__.py +0 -0
  110. package/src/superlocalmemory/compliance/abac.py +0 -204
  111. package/src/superlocalmemory/compliance/audit.py +0 -385
  112. package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
  113. package/src/superlocalmemory/compliance/gdpr.py +0 -1479
  114. package/src/superlocalmemory/compliance/lifecycle.py +0 -158
  115. package/src/superlocalmemory/compliance/retention.py +0 -415
  116. package/src/superlocalmemory/compliance/scheduler.py +0 -217
  117. package/src/superlocalmemory/contracts/__init__.py +0 -1
  118. package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
  119. package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
  120. package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
  121. package/src/superlocalmemory/contracts/v402.py +0 -62
  122. package/src/superlocalmemory/core/__init__.py +0 -0
  123. package/src/superlocalmemory/core/actor_context.py +0 -166
  124. package/src/superlocalmemory/core/admission.py +0 -769
  125. package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
  126. package/src/superlocalmemory/core/block_hygiene.py +0 -147
  127. package/src/superlocalmemory/core/community_summary.py +0 -267
  128. package/src/superlocalmemory/core/component_healer.py +0 -144
  129. package/src/superlocalmemory/core/component_registry.py +0 -514
  130. package/src/superlocalmemory/core/config.py +0 -2204
  131. package/src/superlocalmemory/core/consolidation_engine.py +0 -983
  132. package/src/superlocalmemory/core/context_cache.py +0 -574
  133. package/src/superlocalmemory/core/derivation_lineage.py +0 -246
  134. package/src/superlocalmemory/core/embedding_worker.py +0 -208
  135. package/src/superlocalmemory/core/embeddings.py +0 -1052
  136. package/src/superlocalmemory/core/engine.py +0 -1395
  137. package/src/superlocalmemory/core/engine_capabilities.py +0 -24
  138. package/src/superlocalmemory/core/engine_ingestion.py +0 -983
  139. package/src/superlocalmemory/core/engine_lock.py +0 -75
  140. package/src/superlocalmemory/core/engine_wiring.py +0 -776
  141. package/src/superlocalmemory/core/entity_community.py +0 -178
  142. package/src/superlocalmemory/core/error_envelope.py +0 -60
  143. package/src/superlocalmemory/core/evidence_bundle.py +0 -528
  144. package/src/superlocalmemory/core/fact_consolidator.py +0 -812
  145. package/src/superlocalmemory/core/file_lock.py +0 -92
  146. package/src/superlocalmemory/core/graph_analyzer.py +0 -456
  147. package/src/superlocalmemory/core/graph_metrics.py +0 -597
  148. package/src/superlocalmemory/core/graph_pruner.py +0 -939
  149. package/src/superlocalmemory/core/health_monitor.py +0 -338
  150. package/src/superlocalmemory/core/hooks.py +0 -65
  151. package/src/superlocalmemory/core/ingest_gate.py +0 -133
  152. package/src/superlocalmemory/core/ingest_policy.py +0 -38
  153. package/src/superlocalmemory/core/ingestion_command.py +0 -1042
  154. package/src/superlocalmemory/core/injection.py +0 -434
  155. package/src/superlocalmemory/core/install_detector.py +0 -131
  156. package/src/superlocalmemory/core/key_expander.py +0 -138
  157. package/src/superlocalmemory/core/lifecycle_state.py +0 -153
  158. package/src/superlocalmemory/core/maintenance.py +0 -777
  159. package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
  160. package/src/superlocalmemory/core/materialization_control.py +0 -20
  161. package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
  162. package/src/superlocalmemory/core/memory_health.py +0 -266
  163. package/src/superlocalmemory/core/mode_capability.py +0 -111
  164. package/src/superlocalmemory/core/modes.py +0 -168
  165. package/src/superlocalmemory/core/mutations.py +0 -688
  166. package/src/superlocalmemory/core/ollama_embedder.py +0 -266
  167. package/src/superlocalmemory/core/ollama_validator.py +0 -315
  168. package/src/superlocalmemory/core/operation_policy.py +0 -92
  169. package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
  170. package/src/superlocalmemory/core/operation_request.py +0 -127
  171. package/src/superlocalmemory/core/ops_remediation.py +0 -542
  172. package/src/superlocalmemory/core/pii.py +0 -105
  173. package/src/superlocalmemory/core/platform_utils.py +0 -138
  174. package/src/superlocalmemory/core/profiles.py +0 -234
  175. package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
  176. package/src/superlocalmemory/core/projection_drain.py +0 -380
  177. package/src/superlocalmemory/core/queue_consumer.py +0 -168
  178. package/src/superlocalmemory/core/ram_lock.py +0 -160
  179. package/src/superlocalmemory/core/rate_limit.py +0 -151
  180. package/src/superlocalmemory/core/recall_gate.py +0 -95
  181. package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
  182. package/src/superlocalmemory/core/recall_queue.py +0 -377
  183. package/src/superlocalmemory/core/recall_worker.py +0 -414
  184. package/src/superlocalmemory/core/registry.py +0 -121
  185. package/src/superlocalmemory/core/remember_admission.py +0 -161
  186. package/src/superlocalmemory/core/remember_runtime.py +0 -1190
  187. package/src/superlocalmemory/core/remote_mode.py +0 -214
  188. package/src/superlocalmemory/core/reranker_worker.py +0 -338
  189. package/src/superlocalmemory/core/safe_fs.py +0 -108
  190. package/src/superlocalmemory/core/scale_autopromote.py +0 -196
  191. package/src/superlocalmemory/core/scale_engine.py +0 -915
  192. package/src/superlocalmemory/core/score_contract.py +0 -82
  193. package/src/superlocalmemory/core/security_primitives.py +0 -672
  194. package/src/superlocalmemory/core/session_identity.py +0 -98
  195. package/src/superlocalmemory/core/shadow_router.py +0 -319
  196. package/src/superlocalmemory/core/slm_disabled.py +0 -85
  197. package/src/superlocalmemory/core/status_contract.py +0 -108
  198. package/src/superlocalmemory/core/store_pipeline.py +0 -1404
  199. package/src/superlocalmemory/core/summarizer.py +0 -200
  200. package/src/superlocalmemory/core/tier_manager.py +0 -461
  201. package/src/superlocalmemory/core/topic_signature.py +0 -156
  202. package/src/superlocalmemory/core/transactions/__init__.py +0 -78
  203. package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
  204. package/src/superlocalmemory/core/transactions/erasure.py +0 -825
  205. package/src/superlocalmemory/core/transactions/manifest.py +0 -255
  206. package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
  207. package/src/superlocalmemory/core/transactions/obligations.py +0 -272
  208. package/src/superlocalmemory/core/transactions/owners.py +0 -114
  209. package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
  210. package/src/superlocalmemory/core/transactions/service.py +0 -330
  211. package/src/superlocalmemory/core/worker_pool.py +0 -377
  212. package/src/superlocalmemory/core/working_memory.py +0 -288
  213. package/src/superlocalmemory/dynamics/__init__.py +0 -0
  214. package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
  215. package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
  216. package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
  217. package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
  218. package/src/superlocalmemory/encoding/__init__.py +0 -0
  219. package/src/superlocalmemory/encoding/auto_linker.py +0 -308
  220. package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
  221. package/src/superlocalmemory/encoding/consolidator.py +0 -472
  222. package/src/superlocalmemory/encoding/context_generator.py +0 -175
  223. package/src/superlocalmemory/encoding/emotional.py +0 -189
  224. package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
  225. package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
  226. package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
  227. package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
  228. package/src/superlocalmemory/encoding/foresight.py +0 -93
  229. package/src/superlocalmemory/encoding/graph_builder.py +0 -346
  230. package/src/superlocalmemory/encoding/observation_builder.py +0 -177
  231. package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
  232. package/src/superlocalmemory/encoding/scene_builder.py +0 -410
  233. package/src/superlocalmemory/encoding/signal_inference.py +0 -90
  234. package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
  235. package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
  236. package/src/superlocalmemory/encoding/type_router.py +0 -237
  237. package/src/superlocalmemory/evaluation/__init__.py +0 -13
  238. package/src/superlocalmemory/evaluation/calibration.py +0 -308
  239. package/src/superlocalmemory/evolution/__init__.py +0 -29
  240. package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
  241. package/src/superlocalmemory/evolution/budget.py +0 -356
  242. package/src/superlocalmemory/evolution/evolution_store.py +0 -619
  243. package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
  244. package/src/superlocalmemory/evolution/model_selection.py +0 -175
  245. package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
  246. package/src/superlocalmemory/evolution/skill_activator.py +0 -270
  247. package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
  248. package/src/superlocalmemory/evolution/triggers.py +0 -376
  249. package/src/superlocalmemory/evolution/types.py +0 -114
  250. package/src/superlocalmemory/graph/__init__.py +0 -9
  251. package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
  252. package/src/superlocalmemory/graph/cozo_backend.py +0 -751
  253. package/src/superlocalmemory/hooks/__init__.py +0 -3
  254. package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
  255. package/src/superlocalmemory/hooks/adapter_base.py +0 -347
  256. package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
  257. package/src/superlocalmemory/hooks/auto_capture.py +0 -133
  258. package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
  259. package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
  260. package/src/superlocalmemory/hooks/auto_recall.py +0 -191
  261. package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
  262. package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
  263. package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
  264. package/src/superlocalmemory/hooks/codex_assets.py +0 -251
  265. package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
  266. package/src/superlocalmemory/hooks/context_payload.py +0 -311
  267. package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
  268. package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
  269. package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
  270. package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
  271. package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
  272. package/src/superlocalmemory/hooks/ide_connector.py +0 -246
  273. package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
  274. package/src/superlocalmemory/hooks/portable_kit.py +0 -755
  275. package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
  276. package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
  277. package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
  278. package/src/superlocalmemory/hooks/rules_engine.py +0 -99
  279. package/src/superlocalmemory/hooks/session_registry.py +0 -330
  280. package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
  281. package/src/superlocalmemory/hooks/sync_loop.py +0 -114
  282. package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
  283. package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
  284. package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
  285. package/src/superlocalmemory/infra/__init__.py +0 -3
  286. package/src/superlocalmemory/infra/auth_middleware.py +0 -145
  287. package/src/superlocalmemory/infra/backup.py +0 -974
  288. package/src/superlocalmemory/infra/backup_obligations.py +0 -423
  289. package/src/superlocalmemory/infra/cache_manager.py +0 -267
  290. package/src/superlocalmemory/infra/cloud_backup.py +0 -788
  291. package/src/superlocalmemory/infra/daemon_identity.py +0 -300
  292. package/src/superlocalmemory/infra/data_root.py +0 -238
  293. package/src/superlocalmemory/infra/event_bus.py +0 -637
  294. package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
  295. package/src/superlocalmemory/infra/pid_manager.py +0 -193
  296. package/src/superlocalmemory/infra/process_identity.py +0 -180
  297. package/src/superlocalmemory/infra/process_reaper.py +0 -624
  298. package/src/superlocalmemory/infra/rate_limiter.py +0 -228
  299. package/src/superlocalmemory/infra/self_heal.py +0 -401
  300. package/src/superlocalmemory/infra/version_integrity.py +0 -229
  301. package/src/superlocalmemory/ingestion/__init__.py +0 -13
  302. package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
  303. package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
  304. package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
  305. package/src/superlocalmemory/ingestion/credentials.py +0 -125
  306. package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
  307. package/src/superlocalmemory/ingestion/parsers.py +0 -100
  308. package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
  309. package/src/superlocalmemory/integrations/__init__.py +0 -1
  310. package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
  311. package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
  312. package/src/superlocalmemory/learning/__init__.py +0 -0
  313. package/src/superlocalmemory/learning/adaptive.py +0 -172
  314. package/src/superlocalmemory/learning/arm_catalog.py +0 -97
  315. package/src/superlocalmemory/learning/assertion_miner.py +0 -403
  316. package/src/superlocalmemory/learning/bandit.py +0 -654
  317. package/src/superlocalmemory/learning/bandit_cache.py +0 -131
  318. package/src/superlocalmemory/learning/behavioral.py +0 -542
  319. package/src/superlocalmemory/learning/bootstrap.py +0 -298
  320. package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
  321. package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
  322. package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
  323. package/src/superlocalmemory/learning/cross_project.py +0 -408
  324. package/src/superlocalmemory/learning/database.py +0 -698
  325. package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
  326. package/src/superlocalmemory/learning/engagement.py +0 -487
  327. package/src/superlocalmemory/learning/engagement_features.py +0 -279
  328. package/src/superlocalmemory/learning/ensemble.py +0 -309
  329. package/src/superlocalmemory/learning/entity_compiler.py +0 -356
  330. package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
  331. package/src/superlocalmemory/learning/features.py +0 -138
  332. package/src/superlocalmemory/learning/feedback.py +0 -724
  333. package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
  334. package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
  335. package/src/superlocalmemory/learning/labeler.py +0 -85
  336. package/src/superlocalmemory/learning/legacy_migration.py +0 -316
  337. package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
  338. package/src/superlocalmemory/learning/memory_merge.py +0 -175
  339. package/src/superlocalmemory/learning/model_cache.py +0 -267
  340. package/src/superlocalmemory/learning/model_rollback.py +0 -281
  341. package/src/superlocalmemory/learning/outcome_queue.py +0 -306
  342. package/src/superlocalmemory/learning/outcomes.py +0 -286
  343. package/src/superlocalmemory/learning/pattern_miner.py +0 -465
  344. package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
  345. package/src/superlocalmemory/learning/pcos.py +0 -291
  346. package/src/superlocalmemory/learning/project_context.py +0 -366
  347. package/src/superlocalmemory/learning/propensity.py +0 -131
  348. package/src/superlocalmemory/learning/ranker.py +0 -300
  349. package/src/superlocalmemory/learning/ranker_common.py +0 -163
  350. package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
  351. package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
  352. package/src/superlocalmemory/learning/reward.py +0 -888
  353. package/src/superlocalmemory/learning/reward_archive.py +0 -223
  354. package/src/superlocalmemory/learning/reward_boost.py +0 -211
  355. package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
  356. package/src/superlocalmemory/learning/reward_model.py +0 -144
  357. package/src/superlocalmemory/learning/reward_proxy.py +0 -578
  358. package/src/superlocalmemory/learning/shadow_test.py +0 -524
  359. package/src/superlocalmemory/learning/signal_kinds.py +0 -79
  360. package/src/superlocalmemory/learning/signal_worker.py +0 -268
  361. package/src/superlocalmemory/learning/signals.py +0 -646
  362. package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
  363. package/src/superlocalmemory/learning/source_quality.py +0 -828
  364. package/src/superlocalmemory/learning/trigram_index.py +0 -548
  365. package/src/superlocalmemory/learning/workflows.py +0 -309
  366. package/src/superlocalmemory/llm/__init__.py +0 -0
  367. package/src/superlocalmemory/llm/backbone.py +0 -364
  368. package/src/superlocalmemory/loops/__init__.py +0 -58
  369. package/src/superlocalmemory/loops/budget.py +0 -58
  370. package/src/superlocalmemory/loops/engine.py +0 -174
  371. package/src/superlocalmemory/loops/ledger.py +0 -298
  372. package/src/superlocalmemory/loops/models.py +0 -152
  373. package/src/superlocalmemory/loops/rules.py +0 -52
  374. package/src/superlocalmemory/math/__init__.py +0 -0
  375. package/src/superlocalmemory/math/ebbinghaus.py +0 -352
  376. package/src/superlocalmemory/math/fisher.py +0 -356
  377. package/src/superlocalmemory/math/fisher_quantized.py +0 -255
  378. package/src/superlocalmemory/math/hopfield.py +0 -282
  379. package/src/superlocalmemory/math/langevin.py +0 -411
  380. package/src/superlocalmemory/math/polar_quant.py +0 -414
  381. package/src/superlocalmemory/math/qjl.py +0 -115
  382. package/src/superlocalmemory/math/sheaf.py +0 -261
  383. package/src/superlocalmemory/math/turbo_quant.py +0 -318
  384. package/src/superlocalmemory/mcp/__init__.py +0 -0
  385. package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
  386. package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
  387. package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
  388. package/src/superlocalmemory/mcp/agent_context.py +0 -115
  389. package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
  390. package/src/superlocalmemory/mcp/http_transport.py +0 -85
  391. package/src/superlocalmemory/mcp/profiles.py +0 -154
  392. package/src/superlocalmemory/mcp/resources.py +0 -281
  393. package/src/superlocalmemory/mcp/server.py +0 -480
  394. package/src/superlocalmemory/mcp/session_binding.py +0 -98
  395. package/src/superlocalmemory/mcp/shared.py +0 -112
  396. package/src/superlocalmemory/mcp/tools.py +0 -18
  397. package/src/superlocalmemory/mcp/tools_active.py +0 -958
  398. package/src/superlocalmemory/mcp/tools_brain.py +0 -298
  399. package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
  400. package/src/superlocalmemory/mcp/tools_context.py +0 -239
  401. package/src/superlocalmemory/mcp/tools_core.py +0 -1112
  402. package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
  403. package/src/superlocalmemory/mcp/tools_learning.py +0 -393
  404. package/src/superlocalmemory/mcp/tools_loops.py +0 -345
  405. package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
  406. package/src/superlocalmemory/mcp/tools_ops.py +0 -115
  407. package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
  408. package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
  409. package/src/superlocalmemory/mcp/tools_v28.py +0 -292
  410. package/src/superlocalmemory/mcp/tools_v3.py +0 -398
  411. package/src/superlocalmemory/mcp/tools_v33.py +0 -507
  412. package/src/superlocalmemory/mesh/__init__.py +0 -12
  413. package/src/superlocalmemory/mesh/broker.py +0 -812
  414. package/src/superlocalmemory/mesh/broker_security.py +0 -470
  415. package/src/superlocalmemory/mesh/discovery.py +0 -365
  416. package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
  417. package/src/superlocalmemory/mesh/node_identity.py +0 -97
  418. package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
  419. package/src/superlocalmemory/mesh/remote_sync.py +0 -829
  420. package/src/superlocalmemory/mesh/state_sync.py +0 -286
  421. package/src/superlocalmemory/migrations/__init__.py +0 -5
  422. package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
  423. package/src/superlocalmemory/optimize/NOTICE +0 -6
  424. package/src/superlocalmemory/optimize/__init__.py +0 -0
  425. package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
  426. package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
  427. package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
  428. package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
  429. package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
  430. package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
  431. package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
  432. package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
  433. package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
  434. package/src/superlocalmemory/optimize/cache/exact.py +0 -88
  435. package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
  436. package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
  437. package/src/superlocalmemory/optimize/cache/manager.py +0 -737
  438. package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
  439. package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
  440. package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
  441. package/src/superlocalmemory/optimize/compress/align.py +0 -159
  442. package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
  443. package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
  444. package/src/superlocalmemory/optimize/compress/router.py +0 -667
  445. package/src/superlocalmemory/optimize/config/__init__.py +0 -56
  446. package/src/superlocalmemory/optimize/config/defaults.py +0 -43
  447. package/src/superlocalmemory/optimize/config/schema.py +0 -327
  448. package/src/superlocalmemory/optimize/config/store.py +0 -270
  449. package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
  450. package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
  451. package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
  452. package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
  453. package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
  454. package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
  455. package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
  456. package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
  457. package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
  458. package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
  459. package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
  460. package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
  461. package/src/superlocalmemory/optimize/proxy/server.py +0 -199
  462. package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
  463. package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
  464. package/src/superlocalmemory/optimize/storage/db.py +0 -1185
  465. package/src/superlocalmemory/optimize/storage/schema.py +0 -205
  466. package/src/superlocalmemory/parameterization/__init__.py +0 -47
  467. package/src/superlocalmemory/parameterization/cross_project.py +0 -12
  468. package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
  469. package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
  470. package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
  471. package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
  472. package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
  473. package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
  474. package/src/superlocalmemory/reliability/__init__.py +0 -45
  475. package/src/superlocalmemory/reliability/join_liveness.py +0 -301
  476. package/src/superlocalmemory/reliability/prior_distance.py +0 -243
  477. package/src/superlocalmemory/retrieval/__init__.py +0 -0
  478. package/src/superlocalmemory/retrieval/agentic.py +0 -367
  479. package/src/superlocalmemory/retrieval/ann_index.py +0 -235
  480. package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
  481. package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
  482. package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
  483. package/src/superlocalmemory/retrieval/channel_status.py +0 -117
  484. package/src/superlocalmemory/retrieval/engine.py +0 -1615
  485. package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
  486. package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
  487. package/src/superlocalmemory/retrieval/fusion.py +0 -81
  488. package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
  489. package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
  490. package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
  491. package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
  492. package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
  493. package/src/superlocalmemory/retrieval/reranker.py +0 -674
  494. package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
  495. package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
  496. package/src/superlocalmemory/retrieval/spreading.py +0 -288
  497. package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
  498. package/src/superlocalmemory/retrieval/strategy.py +0 -248
  499. package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
  500. package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
  501. package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
  502. package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
  503. package/src/superlocalmemory/retrieval/time_window.py +0 -181
  504. package/src/superlocalmemory/retrieval/vector_store.py +0 -863
  505. package/src/superlocalmemory/server/__init__.py +0 -1
  506. package/src/superlocalmemory/server/api.py +0 -310
  507. package/src/superlocalmemory/server/asset_versions.py +0 -171
  508. package/src/superlocalmemory/server/bandit_loops.py +0 -158
  509. package/src/superlocalmemory/server/config_file.py +0 -90
  510. package/src/superlocalmemory/server/consolidation_runner.py +0 -140
  511. package/src/superlocalmemory/server/egress_policy.py +0 -258
  512. package/src/superlocalmemory/server/loopback.py +0 -85
  513. package/src/superlocalmemory/server/middleware/__init__.py +0 -11
  514. package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
  515. package/src/superlocalmemory/server/origin.py +0 -55
  516. package/src/superlocalmemory/server/profile_runtime.py +0 -515
  517. package/src/superlocalmemory/server/rbac_enforce.py +0 -194
  518. package/src/superlocalmemory/server/recall_health.py +0 -343
  519. package/src/superlocalmemory/server/recall_serializer.py +0 -320
  520. package/src/superlocalmemory/server/route_mutations.py +0 -104
  521. package/src/superlocalmemory/server/routes/__init__.py +0 -4
  522. package/src/superlocalmemory/server/routes/abstraction.py +0 -314
  523. package/src/superlocalmemory/server/routes/adapters.py +0 -63
  524. package/src/superlocalmemory/server/routes/agents.py +0 -303
  525. package/src/superlocalmemory/server/routes/backup.py +0 -869
  526. package/src/superlocalmemory/server/routes/behavioral.py +0 -659
  527. package/src/superlocalmemory/server/routes/brain.py +0 -1892
  528. package/src/superlocalmemory/server/routes/chat.py +0 -393
  529. package/src/superlocalmemory/server/routes/compliance.py +0 -533
  530. package/src/superlocalmemory/server/routes/config_api.py +0 -703
  531. package/src/superlocalmemory/server/routes/data_io.py +0 -329
  532. package/src/superlocalmemory/server/routes/entity.py +0 -237
  533. package/src/superlocalmemory/server/routes/events.py +0 -214
  534. package/src/superlocalmemory/server/routes/evolution.py +0 -510
  535. package/src/superlocalmemory/server/routes/helpers.py +0 -499
  536. package/src/superlocalmemory/server/routes/ingest.py +0 -137
  537. package/src/superlocalmemory/server/routes/insights.py +0 -366
  538. package/src/superlocalmemory/server/routes/learning.py +0 -834
  539. package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
  540. package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
  541. package/src/superlocalmemory/server/routes/memories.py +0 -1661
  542. package/src/superlocalmemory/server/routes/mesh.py +0 -517
  543. package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
  544. package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
  545. package/src/superlocalmemory/server/routes/optimize.py +0 -197
  546. package/src/superlocalmemory/server/routes/prewarm.py +0 -173
  547. package/src/superlocalmemory/server/routes/profiles.py +0 -292
  548. package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
  549. package/src/superlocalmemory/server/routes/rbac.py +0 -366
  550. package/src/superlocalmemory/server/routes/stats.py +0 -385
  551. package/src/superlocalmemory/server/routes/tiers.py +0 -222
  552. package/src/superlocalmemory/server/routes/timeline.py +0 -258
  553. package/src/superlocalmemory/server/routes/token.py +0 -90
  554. package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
  555. package/src/superlocalmemory/server/routes/ws.py +0 -171
  556. package/src/superlocalmemory/server/security_middleware.py +0 -89
  557. package/src/superlocalmemory/server/ui.py +0 -354
  558. package/src/superlocalmemory/server/unified_daemon.py +0 -6326
  559. package/src/superlocalmemory/server/write_identity.py +0 -195
  560. package/src/superlocalmemory/storage/__init__.py +0 -0
  561. package/src/superlocalmemory/storage/_migration_internals.py +0 -638
  562. package/src/superlocalmemory/storage/_schema_version.py +0 -174
  563. package/src/superlocalmemory/storage/access_log.py +0 -170
  564. package/src/superlocalmemory/storage/admission_codec.py +0 -129
  565. package/src/superlocalmemory/storage/admission_journal.py +0 -843
  566. package/src/superlocalmemory/storage/agent_experience.py +0 -546
  567. package/src/superlocalmemory/storage/backup.py +0 -531
  568. package/src/superlocalmemory/storage/correction_cases.py +0 -670
  569. package/src/superlocalmemory/storage/database.py +0 -3180
  570. package/src/superlocalmemory/storage/deferred_writes.py +0 -209
  571. package/src/superlocalmemory/storage/embedding_codec.py +0 -200
  572. package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
  573. package/src/superlocalmemory/storage/erasure_fence.py +0 -45
  574. package/src/superlocalmemory/storage/execution_learning.py +0 -285
  575. package/src/superlocalmemory/storage/external_evidence.py +0 -359
  576. package/src/superlocalmemory/storage/generation_fence.py +0 -63
  577. package/src/superlocalmemory/storage/lineage_retention.py +0 -236
  578. package/src/superlocalmemory/storage/logical_edges.py +0 -86
  579. package/src/superlocalmemory/storage/memory_write.py +0 -115
  580. package/src/superlocalmemory/storage/migration_runner.py +0 -895
  581. package/src/superlocalmemory/storage/migration_v33.py +0 -140
  582. package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
  583. package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
  584. package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
  585. package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
  586. package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
  587. package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
  588. package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
  589. package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
  590. package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
  591. package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
  592. package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
  593. package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
  594. package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
  595. package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
  596. package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
  597. package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
  598. package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
  599. package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
  600. package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
  601. package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
  602. package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
  603. package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
  604. package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
  605. package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
  606. package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
  607. package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
  608. package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
  609. package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
  610. package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
  611. package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
  612. package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
  613. package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
  614. package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
  615. package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
  616. package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
  617. package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
  618. package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
  619. package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
  620. package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
  621. package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
  622. package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
  623. package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
  624. package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
  625. package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
  626. package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
  627. package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
  628. package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
  629. package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
  630. package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
  631. package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
  632. package/src/superlocalmemory/storage/migrations.py +0 -333
  633. package/src/superlocalmemory/storage/models.py +0 -500
  634. package/src/superlocalmemory/storage/projection_outbox.py +0 -346
  635. package/src/superlocalmemory/storage/quantized_store.py +0 -280
  636. package/src/superlocalmemory/storage/read_connection.py +0 -115
  637. package/src/superlocalmemory/storage/retention_policy.py +0 -860
  638. package/src/superlocalmemory/storage/schema.py +0 -1108
  639. package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
  640. package/src/superlocalmemory/storage/schema_v32.py +0 -382
  641. package/src/superlocalmemory/storage/schema_v3410.py +0 -159
  642. package/src/superlocalmemory/storage/schema_v3411.py +0 -149
  643. package/src/superlocalmemory/storage/schema_v343.py +0 -315
  644. package/src/superlocalmemory/storage/schema_v345.py +0 -109
  645. package/src/superlocalmemory/storage/schema_v347.py +0 -140
  646. package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
  647. package/src/superlocalmemory/storage/v2_migrator.py +0 -466
  648. package/src/superlocalmemory/storage/write_coordinator.py +0 -949
  649. package/src/superlocalmemory/storage/write_lock.py +0 -88
  650. package/src/superlocalmemory/summaries/__init__.py +0 -37
  651. package/src/superlocalmemory/summaries/base.py +0 -267
  652. package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
  653. package/src/superlocalmemory/summaries/non_answer.py +0 -223
  654. package/src/superlocalmemory/summaries/project_work_log.py +0 -440
  655. package/src/superlocalmemory/summaries/session_summary.py +0 -311
  656. package/src/superlocalmemory/trust/__init__.py +0 -0
  657. package/src/superlocalmemory/trust/gate.py +0 -171
  658. package/src/superlocalmemory/trust/provenance.py +0 -124
  659. package/src/superlocalmemory/trust/scorer.py +0 -413
  660. package/src/superlocalmemory/trust/signals.py +0 -153
  661. package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
  662. package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
  663. package/src/superlocalmemory/ui/css/brain.css +0 -409
  664. package/src/superlocalmemory/ui/css/design-system.css +0 -696
  665. package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
  666. package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
  667. package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
  668. package/src/superlocalmemory/ui/favicon.svg +0 -36
  669. package/src/superlocalmemory/ui/index.html +0 -1638
  670. package/src/superlocalmemory/ui/js/agents.js +0 -192
  671. package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
  672. package/src/superlocalmemory/ui/js/brain.js +0 -1400
  673. package/src/superlocalmemory/ui/js/clusters.js +0 -326
  674. package/src/superlocalmemory/ui/js/compliance.js +0 -307
  675. package/src/superlocalmemory/ui/js/core.js +0 -566
  676. package/src/superlocalmemory/ui/js/dashboard.js +0 -503
  677. package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
  678. package/src/superlocalmemory/ui/js/events.js +0 -178
  679. package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
  680. package/src/superlocalmemory/ui/js/feedback.js +0 -339
  681. package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
  682. package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
  683. package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
  684. package/src/superlocalmemory/ui/js/ide-status.js +0 -115
  685. package/src/superlocalmemory/ui/js/init.js +0 -54
  686. package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
  687. package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
  688. package/src/superlocalmemory/ui/js/math-health.js +0 -114
  689. package/src/superlocalmemory/ui/js/memories.js +0 -394
  690. package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
  691. package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
  692. package/src/superlocalmemory/ui/js/modal.js +0 -733
  693. package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
  694. package/src/superlocalmemory/ui/js/ng-health.js +0 -208
  695. package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
  696. package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
  697. package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
  698. package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
  699. package/src/superlocalmemory/ui/js/od-agents.js +0 -588
  700. package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
  701. package/src/superlocalmemory/ui/js/od-backup.js +0 -878
  702. package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
  703. package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
  704. package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
  705. package/src/superlocalmemory/ui/js/od-components.js +0 -147
  706. package/src/superlocalmemory/ui/js/od-entities.js +0 -622
  707. package/src/superlocalmemory/ui/js/od-graph.js +0 -776
  708. package/src/superlocalmemory/ui/js/od-health.js +0 -579
  709. package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
  710. package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
  711. package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
  712. package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
  713. package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
  714. package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
  715. package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
  716. package/src/superlocalmemory/ui/js/od-shell.js +0 -819
  717. package/src/superlocalmemory/ui/js/od-skills.js +0 -600
  718. package/src/superlocalmemory/ui/js/od-team.js +0 -265
  719. package/src/superlocalmemory/ui/js/optimize.js +0 -191
  720. package/src/superlocalmemory/ui/js/profiles.js +0 -362
  721. package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
  722. package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
  723. package/src/superlocalmemory/ui/js/search.js +0 -86
  724. package/src/superlocalmemory/ui/js/settings.js +0 -556
  725. package/src/superlocalmemory/ui/js/timeline.js +0 -62
  726. package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
  727. package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
  728. package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  729. package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  730. package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
  731. package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
  732. package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
  733. package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
  734. package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
  735. package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
  736. package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
  737. package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
  738. package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
  739. package/src/superlocalmemory/vector/__init__.py +0 -9
  740. package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
@@ -1,314 +0,0 @@
1
- # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
- # Licensed under AGPL-3.0-or-later — see LICENSE file
3
- # Part of SuperLocalMemory V3 | https://qualixar.com
4
-
5
- """Progressive-abstraction read API (Wave Q3).
6
-
7
- Exposes the abstraction hierarchy so the dashboard can browse it and drill
8
- down to source atoms:
9
-
10
- GET /api/v3/abstraction/persona — the per-profile persona roll-up
11
- GET /api/v3/abstraction/communities — community summaries (Q2)
12
- GET /api/v3/abstraction/consolidated — display-only cluster summaries
13
- GET /api/v3/abstraction/health — can my memories be found? (4.0.10)
14
- GET /api/v3/abstraction/sources — drill-down (node -> source atoms)
15
-
16
- Read-only, profile-scoped (Rule 01), direct sqlite3 (Rule 06). All handlers
17
- fail-soft: a missing DB or table returns an empty payload, never a 500.
18
- """
19
-
20
- from __future__ import annotations
21
-
22
- import logging
23
- import sqlite3
24
- from typing import Any
25
-
26
- from fastapi import APIRouter, Query
27
- from fastapi.responses import JSONResponse
28
-
29
- from superlocalmemory.server.routes.helpers import DB_PATH, get_active_profile, get_read_connection
30
-
31
- logger = logging.getLogger(__name__)
32
-
33
- router = APIRouter(prefix="/api/v3/abstraction", tags=["abstraction"])
34
-
35
- #: How many summary rows /consolidated will read before ranking them by
36
- #: quality. Bounded because this runs on a request thread: a store with tens of
37
- #: thousands of summaries must not turn one card into a full-table scan.
38
- _SCAN_CEILING = 400
39
-
40
- #: Characters of normalised opening text that make two summaries "the same
41
- #: summary" for display. Long enough that two genuinely different subjects
42
- #: diverge within it, short enough to catch the same sentence with a different
43
- #: tail — which is the shape the summarizer actually produces.
44
- _OPENING_KEY_CHARS = 90
45
-
46
-
47
- def _opening_key(content: object) -> str:
48
- """Normalised opening of a summary, for near-duplicate collapsing.
49
-
50
- Case-folded with runs of whitespace flattened, so two summaries differing
51
- only in line wrapping or capitalisation collapse together. Returns "" for
52
- anything too short to judge, which is then never collapsed — better to show
53
- a duplicate than to hide a distinct summary on a weak signal.
54
- """
55
- text = " ".join(str(content or "").split()).casefold()
56
- if len(text) < 40:
57
- return ""
58
- return text[:_OPENING_KEY_CHARS]
59
-
60
-
61
- class _ReadDB:
62
- """Adapt a raw sqlite3 connection to the .execute(...) -> list contract
63
- the read-only builder methods expect (matches DatabaseManager.execute)."""
64
-
65
- def __init__(self, conn: sqlite3.Connection) -> None:
66
- self._conn = conn
67
-
68
- def execute(self, sql: str, params: tuple = ()) -> list:
69
- return self._conn.execute(sql, params).fetchall()
70
-
71
-
72
- def _conn() -> sqlite3.Connection | None:
73
- if not DB_PATH.exists():
74
- return None
75
- return get_read_connection(DB_PATH)
76
-
77
-
78
- @router.get("/persona")
79
- def get_persona(profile: str = Query("")) -> JSONResponse:
80
- pid = profile or get_active_profile()
81
- conn = _conn()
82
- if conn is None:
83
- return JSONResponse({"profile": pid, "persona": None})
84
- try:
85
- from superlocalmemory.core.progressive_abstraction import ProgressiveAbstraction
86
-
87
- persona = ProgressiveAbstraction(_ReadDB(conn)).get_persona(pid)
88
- return JSONResponse({"profile": pid, "persona": persona})
89
- except Exception as exc: # pragma: no cover - defensive
90
- logger.debug("persona read failed: %s", exc)
91
- return JSONResponse({"profile": pid, "persona": None})
92
- finally:
93
- conn.close()
94
-
95
-
96
- @router.get("/communities")
97
- def get_communities(profile: str = Query("")) -> JSONResponse:
98
- pid = profile or get_active_profile()
99
- conn = _conn()
100
- if conn is None:
101
- return JSONResponse({"profile": pid, "communities": []})
102
- try:
103
- from superlocalmemory.core.community_summary import CommunitySummaryBuilder
104
-
105
- summaries = CommunitySummaryBuilder(_ReadDB(conn)).get_summaries(pid)
106
- return JSONResponse({"profile": pid, "communities": summaries})
107
- except Exception as exc: # pragma: no cover - defensive
108
- logger.debug("communities read failed: %s", exc)
109
- return JSONResponse({"profile": pid, "communities": []})
110
- finally:
111
- conn.close()
112
-
113
-
114
- @router.get("/sources")
115
- def get_sources(
116
- profile: str = Query(""), node: str = Query("persona"),
117
- ) -> JSONResponse:
118
- pid = profile or get_active_profile()
119
- conn = _conn()
120
- empty: dict[str, Any] = {
121
- "node_id": node, "node_type": "unknown", "communities": [], "fact_ids": [],
122
- }
123
- if conn is None:
124
- return JSONResponse({"profile": pid, "sources": empty})
125
- try:
126
- from superlocalmemory.core.progressive_abstraction import ProgressiveAbstraction
127
-
128
- node_val: Any = node
129
- if node != "persona":
130
- try:
131
- node_val = int(node)
132
- except (ValueError, TypeError):
133
- node_val = node
134
- sources = ProgressiveAbstraction(_ReadDB(conn)).get_sources(pid, node_val)
135
- return JSONResponse({"profile": pid, "sources": sources})
136
- except Exception as exc: # pragma: no cover - defensive
137
- logger.debug("sources read failed: %s", exc)
138
- return JSONResponse({"profile": pid, "sources": empty})
139
- finally:
140
- conn.close()
141
-
142
-
143
- @router.get("/consolidated")
144
- def get_consolidated(
145
- profile: str = Query(""),
146
- limit: int = Query(50, ge=1, le=200),
147
- include_unusable: bool = Query(False),
148
- ) -> JSONResponse:
149
- """Cluster summaries, read from the DISPLAY table and nowhere else.
150
-
151
- ``consolidated_summaries`` is the only source. Reading ``atomic_facts``
152
- here would put the boundary back where it was: these summaries were in the
153
- retrieval corpus until 4.0.10 and the whole point of moving them is that
154
- exactly one surface shows them, and it is this one.
155
-
156
- ``summaries`` holds only rows worth reading. The rest are REPORTED, not
157
- returned: ``unusable`` and ``near_duplicates`` are counts over the scanned
158
- window. A reader is better served by "62 of these came back empty" than by a
159
- page that silently shows a handful and looks complete — and hiding the fact
160
- that they came back empty would hide the problem this endpoint exists to make
161
- visible. ``include_unusable=true`` returns them for inspection.
162
-
163
- Two orderings, both measured rather than chosen:
164
-
165
- * Ranking by ``source_count`` alone put the junk on top, because the
166
- summaries merging the largest clusters are exactly the ones the model had
167
- least in common to work with. On the author's store **0 of the top 24 by
168
- source_count were usable**, so a card asking for 24 rendered empty against
169
- a store holding a thousand summaries.
170
- * Rows covering real memories rank above rows covering none. 353 of these
171
- are summaries of summaries; their honest ``source_count`` is 0, and a
172
- digest of the summarizer's own output is worth less to a reader than a
173
- digest of their own words.
174
-
175
- Quality is a Python predicate rather than a SQL expression, which is why the
176
- window is read to at most ``_SCAN_CEILING`` rows, classified, and then
177
- ordered.
178
- """
179
- pid = profile or get_active_profile()
180
- conn = _conn()
181
- if conn is None:
182
- return JSONResponse({
183
- "profile": pid, "summaries": [], "unusable": 0, "scanned": 0,
184
- })
185
- try:
186
- from superlocalmemory.summaries.base import clean_llm_summary
187
- from superlocalmemory.summaries.non_answer import (
188
- MIN_USEFUL_CHARS,
189
- is_non_answer,
190
- )
191
-
192
- scan = min(_SCAN_CEILING, max(int(limit) * 8, int(limit)))
193
- rows = conn.execute(
194
- "SELECT summary_id, entity_name, content, source_count, "
195
- " generated_by, source_earliest, source_latest, created_at "
196
- " FROM consolidated_summaries "
197
- " WHERE profile_id = ? "
198
- " ORDER BY source_count DESC, created_at DESC, summary_id ASC "
199
- " LIMIT ?",
200
- (pid, scan),
201
- ).fetchall()
202
-
203
- classified: list[dict[str, Any]] = []
204
- unusable = 0
205
- for row in rows:
206
- item = dict(row)
207
- # CLEAN, THEN JUDGE — the same order the write path uses, and for
208
- # the same reason. Rows migrated from the old corpus were never
209
- # cleaned, so their scaffolding is still attached: judging first let
210
- # "Here is a concise summary paragraph incorporating all 10 facts..."
211
- # through as usable and put it at the top of the card, because it
212
- # does contain a summary and the non-answer rules are about refusals,
213
- # not preambles. Cleaning is also what the reader should see: the
214
- # scaffolding is addressed to a conversation they cannot read.
215
- item["content"] = clean_llm_summary(str(item.get("content") or ""))
216
- rejected, why = is_non_answer(
217
- item["content"], min_chars=MIN_USEFUL_CHARS,
218
- )
219
- item["quality"] = why if rejected else "ok"
220
- if rejected:
221
- unusable += 1
222
- classified.append(item)
223
-
224
- # Usable first, then rows that cover real memories, then the SQL
225
- # ordering within each group. Stable sort, so two runs of one request
226
- # return the same rows in the same order — a summary card that
227
- # reshuffles itself on refresh reads as a bug even when every row is
228
- # correct.
229
- classified.sort(key=lambda item: (
230
- 0 if item["quality"] == "ok" else 1,
231
- 0 if (item.get("source_count") or 0) > 0 else 1,
232
- ))
233
-
234
- # Collapse near-duplicates.
235
- #
236
- # The table's UNIQUE constraint is on exact content, so summaries that
237
- # differ by a clause survive as separate rows. On the author's store the
238
- # first 24 usable rows all opened "The Pro and SuperLocalMemory (SLM)
239
- # projects have made significant progress in..." — twenty-four cards
240
- # saying one thing, which reads as a broken page rather than as a view
241
- # of a memory.
242
- #
243
- # Collapsed on a normalised opening, keeping the row that merged the
244
- # most memories (the ordering above already put it first). The count is
245
- # reported, not swallowed: that these summaries repeat each other is a
246
- # real property of the store and worth a reader knowing.
247
- deduped: list[dict[str, Any]] = []
248
- seen_openings: set[str] = set()
249
- collapsed = 0
250
- for item in classified:
251
- key = _opening_key(item.get("content"))
252
- if key and key in seen_openings:
253
- collapsed += 1
254
- continue
255
- if key:
256
- seen_openings.add(key)
257
- deduped.append(item)
258
-
259
- # Only rows worth reading occupy the window.
260
- #
261
- # A first draft returned everything, usable first, and truncated at
262
- # `limit`. Because the usable rows on this store collapse to a handful
263
- # of distinct openings, the tail of a limit-10 request filled with
264
- # refusals — and a card asking for 10 got 2 it could render and 8 it
265
- # threw away. The counts carry what the reader needs to know about the
266
- # rest; the rows themselves add nothing to a card.
267
- shown = (
268
- deduped[:int(limit)] if include_unusable
269
- else [i for i in deduped if i["quality"] == "ok"][:int(limit)]
270
- )
271
- return JSONResponse({
272
- "profile": pid,
273
- "summaries": shown,
274
- "unusable": unusable,
275
- "near_duplicates": collapsed,
276
- "scanned": len(rows),
277
- })
278
- except sqlite3.Error as exc:
279
- # A store that predates the display table. Empty, not an error.
280
- logger.debug("consolidated summaries read failed: %s", exc)
281
- return JSONResponse({
282
- "profile": pid, "summaries": [], "unusable": 0, "scanned": 0,
283
- })
284
- finally:
285
- conn.close()
286
-
287
-
288
- @router.get("/health")
289
- def get_memory_health() -> JSONResponse:
290
- """Whether this store's memories can actually be found.
291
-
292
- Same measurement ``slm doctor`` prints, so the dashboard and the CLI cannot
293
- tell the owner two different things. Read-only and fail-soft.
294
- """
295
- try:
296
- from superlocalmemory.core.memory_health import describe, measure
297
-
298
- health = measure(DB_PATH)
299
- return JSONResponse({
300
- "live_facts": health.live_facts,
301
- "findable_by_meaning": health.findable_by_meaning,
302
- "missing_vector": health.missing_vector,
303
- "withheld_summaries": health.withheld_summaries,
304
- "display_summaries": health.display_summaries,
305
- "hidden_by_forgetting": health.hidden_by_forgetting,
306
- "inconsistently_hidden": health.inconsistently_hidden,
307
- "reachability": round(health.reachability, 4),
308
- "healthy": health.healthy,
309
- "unavailable": list(health.unavailable),
310
- "summary": describe(health),
311
- })
312
- except Exception as exc: # pragma: no cover - defensive
313
- logger.debug("memory health read failed: %s", exc)
314
- return JSONResponse({"healthy": None, "summary": [], "unavailable": ["error"]})
@@ -1,63 +0,0 @@
1
- # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
- # Licensed under AGPL-3.0-or-later - see LICENSE file
3
- # Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
4
-
5
- """Ingestion adapter management API — enable/disable/start/stop from dashboard.
6
-
7
- v3.4.4: Users can manage Gmail, Calendar, Transcript adapters entirely from
8
- the dashboard UI — no CLI needed. The best product experience.
9
-
10
- Endpoints:
11
- GET /api/adapters — list all adapters with status
12
- POST /api/adapters/enable — enable an adapter
13
- POST /api/adapters/disable — disable an adapter
14
- POST /api/adapters/start — start a running adapter
15
- POST /api/adapters/stop — stop a running adapter
16
- """
17
-
18
- from __future__ import annotations
19
-
20
- from fastapi import APIRouter, Request
21
- from pydantic import BaseModel
22
-
23
- router = APIRouter(tags=["adapters"])
24
-
25
-
26
- class AdapterAction(BaseModel):
27
- name: str
28
-
29
-
30
- @router.get("/api/adapters")
31
- async def list_adapters_api():
32
- """List all adapters with their enabled/running status."""
33
- from superlocalmemory.ingestion.adapter_manager import list_adapters
34
- adapters = list_adapters()
35
- return {"adapters": adapters}
36
-
37
-
38
- @router.post("/api/adapters/enable")
39
- async def enable_adapter_api(body: AdapterAction):
40
- """Enable an adapter (doesn't start it yet)."""
41
- from superlocalmemory.ingestion.adapter_manager import enable_adapter
42
- return enable_adapter(body.name)
43
-
44
-
45
- @router.post("/api/adapters/disable")
46
- async def disable_adapter_api(body: AdapterAction):
47
- """Disable and stop an adapter."""
48
- from superlocalmemory.ingestion.adapter_manager import disable_adapter
49
- return disable_adapter(body.name)
50
-
51
-
52
- @router.post("/api/adapters/start")
53
- async def start_adapter_api(body: AdapterAction):
54
- """Start a running adapter subprocess."""
55
- from superlocalmemory.ingestion.adapter_manager import start_adapter
56
- return start_adapter(body.name)
57
-
58
-
59
- @router.post("/api/adapters/stop")
60
- async def stop_adapter_api(body: AdapterAction):
61
- """Stop a running adapter."""
62
- from superlocalmemory.ingestion.adapter_manager import stop_adapter
63
- return stop_adapter(body.name)
@@ -1,303 +0,0 @@
1
- # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
- # Licensed under AGPL-3.0-or-later - see LICENSE file
3
- # Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
4
- """SuperLocalMemory V3 - Agent Registry + Trust Routes
5
- - AGPL-3.0-or-later
6
-
7
- Routes: /api/agents, /api/agents/stats, /api/trust/stats, /api/trust/signals/{agent_id}
8
- Uses V3 TrustScorer and core.registry.
9
- """
10
- import logging
11
- from typing import Optional
12
-
13
- from fastapi import APIRouter, HTTPException, Query, Request
14
-
15
- from superlocalmemory.infra.data_root import state_path
16
-
17
- from .helpers import DB_PATH, get_read_connection
18
-
19
- logger = logging.getLogger("superlocalmemory.routes.agents")
20
- router = APIRouter()
21
-
22
-
23
- def _internal_error(detail: str = "Internal server error") -> HTTPException:
24
- """SEC-H-02: log full traceback server-side; return a generic message to the client."""
25
- logger.exception("agents route error")
26
- return HTTPException(status_code=500, detail=detail)
27
-
28
- # Feature flag: V3 trust scorer
29
- TRUST_AVAILABLE = False
30
- try:
31
- from superlocalmemory.trust.scorer import TrustScorer
32
- TRUST_AVAILABLE = True
33
- except ImportError:
34
- pass
35
-
36
- REGISTRY_AVAILABLE = False
37
- try:
38
- from superlocalmemory.core.registry import AgentRegistry
39
- REGISTRY_AVAILABLE = True
40
- except ImportError:
41
- pass
42
-
43
-
44
- def _registry_path():
45
- return state_path("agents.json")
46
-
47
-
48
- @router.get("/api/agents")
49
- async def get_agents(
50
- request: Request,
51
- protocol: Optional[str] = None,
52
- limit: int = Query(50, ge=1, le=200),
53
- ):
54
- """List registered agents with optional protocol filter."""
55
- if not REGISTRY_AVAILABLE:
56
- return {"agents": [], "count": 0, "message": "Agent registry not available"}
57
- try:
58
- registry = AgentRegistry(persist_path=_registry_path())
59
- agents = registry.list_agents()
60
- return {
61
- "agents": agents,
62
- "count": len(agents),
63
- "stats": {"total_agents": len(agents)},
64
- }
65
- except Exception:
66
- raise _internal_error("Agent registry error")
67
-
68
-
69
- @router.get("/api/agents/stats")
70
- async def get_agent_stats(request: Request):
71
- """Get agent registry statistics."""
72
- if not REGISTRY_AVAILABLE:
73
- return {"total_agents": 0, "message": "Agent registry not available"}
74
- try:
75
- registry = AgentRegistry(persist_path=_registry_path())
76
- agents = registry.list_agents()
77
- return {"total_agents": len(agents)}
78
- except Exception:
79
- raise _internal_error("Agent stats error")
80
-
81
-
82
- @router.get("/api/agents/memory-activity")
83
- async def get_agent_memory_activity(
84
- request: Request,
85
- limit: int = Query(20, ge=1, le=100),
86
- ):
87
- """Per-agent memory attribution for the multi-agent memory view.
88
-
89
- Reports how many memories each writing agent contributed, when each was
90
- last active, which ingestion sources they used, and the most recent
91
- entries — grouped by ``ingestion_operations.trusted_actor_id`` (the agent
92
- that wrote the memory). Profile-scoped. Uses a direct DB read because the
93
- dashboard runs without the engine subprocess. Never raises to the client;
94
- returns empty structures if the operations table is absent.
95
- """
96
- import sqlite3
97
-
98
- from .helpers import get_active_profile
99
-
100
- pid = get_active_profile()
101
- agents: list[dict] = []
102
- recent: list[dict] = []
103
- total = 0
104
-
105
- if DB_PATH.exists():
106
- conn = get_read_connection(DB_PATH)
107
- try:
108
- try:
109
- # Group by the agent's OWN identity, not by the capability that
110
- # authorised the write.
111
- #
112
- # This grouped by ``trusted_actor_id``, which on a real store is
113
- # a capability digest — 43 distinct agents rendered as 43 rows of
114
- # ``daemon-capability:923b7d6e616f46d3...`` and not one readable
115
- # name. For a pane whose entire purpose is telling agents apart,
116
- # that is the same as showing nothing.
117
- #
118
- # The real name was already being stored the whole time: writers
119
- # pass ``agent_id`` and it lands in ``raw_metadata_json``. On this
120
- # store that yields claude-desktop, claude, gemini, codex, grok
121
- # and mcp_client. Capability digests remain available per row for
122
- # audit — they answer "what was allowed to write this", which is a
123
- # different and also useful question, just not this pane's.
124
- # raw_metadata_json is absent on stores predating it. Try the
125
- # identity query and fall back to capability grouping if the
126
- # column is missing — without this, the OperationalError is
127
- # caught below and an older install shows ZERO agents while
128
- # having plenty. Deliberately not PRAGMA table_info: this
129
- # handler is on the dashboard read path, which is gated against
130
- # anything that parses as DDL.
131
- _tail = (
132
- "COUNT(*) AS cnt, MAX(created_at) AS last_active, "
133
- "GROUP_CONCAT(DISTINCT source_type) AS sources, "
134
- "COUNT(DISTINCT NULLIF(trusted_actor_id, '')) AS capabilities "
135
- "FROM ingestion_operations WHERE profile_id=? "
136
- "GROUP BY agent_id ORDER BY cnt DESC, agent_id ASC "
137
- "LIMIT 500"
138
- )
139
- try:
140
- rows = conn.execute(
141
- "SELECT COALESCE("
142
- " NULLIF(json_extract(raw_metadata_json, '$.agent_id'), ''),"
143
- " NULLIF(trusted_actor_id, ''),"
144
- " 'unknown'"
145
- ") AS agent_id, " + _tail,
146
- (pid,),
147
- ).fetchall()
148
- except sqlite3.OperationalError:
149
- rows = conn.execute(
150
- "SELECT COALESCE(NULLIF(trusted_actor_id, ''), 'unknown')"
151
- " AS agent_id, " + _tail,
152
- (pid,),
153
- ).fetchall()
154
- for r in rows:
155
- name = r["agent_id"]
156
- agents.append({
157
- "agent_id": name,
158
- "count": r["cnt"],
159
- "last_active": r["last_active"],
160
- "source_types": (
161
- [s for s in (r["sources"] or "").split(",") if s]
162
- ),
163
- # How many distinct capabilities this agent wrote under.
164
- "capability_count": r["capabilities"],
165
- # True when we fell back to a digest — the UI can then say
166
- # "this writer did not identify itself" instead of
167
- # presenting a hash as though it were a name.
168
- "identified": not str(name).startswith(
169
- ("daemon-capability:", "local-capability:")
170
- ) and name != "unknown",
171
- })
172
- total += r["cnt"]
173
- except sqlite3.OperationalError:
174
- pass
175
-
176
- try:
177
- rows = conn.execute(
178
- "SELECT CASE WHEN trusted_actor_id='' THEN 'unknown' "
179
- "ELSE trusted_actor_id END AS agent_id, "
180
- "substr(raw_content, 1, 160) AS snippet, "
181
- "created_at, source_type, session_id "
182
- "FROM ingestion_operations WHERE profile_id=? "
183
- "ORDER BY created_at DESC, rowid DESC LIMIT ?",
184
- (pid, int(limit)),
185
- ).fetchall()
186
- recent = [{
187
- "agent_id": r["agent_id"],
188
- "content": r["snippet"],
189
- "created_at": r["created_at"],
190
- "source_type": r["source_type"],
191
- "session_id": r["session_id"],
192
- } for r in rows]
193
- except sqlite3.OperationalError:
194
- pass
195
- finally:
196
- conn.close()
197
-
198
- return {
199
- "ok": True,
200
- "profile_id": pid,
201
- "total_memories": total,
202
- "agent_count": len(agents),
203
- "agents": agents,
204
- "recent": recent,
205
- }
206
-
207
-
208
- @router.get("/api/trust/stats")
209
- async def get_trust_stats(request: Request):
210
- """Get trust scoring statistics.
211
-
212
- Queries trust_scores and trust_signals tables directly (no engine needed).
213
- Falls back to engine._trust_scorer if available.
214
- """
215
- try:
216
- # Try engine-based scorer first
217
- try:
218
- engine = getattr(request.app.state, "engine", None)
219
- if engine and getattr(engine, "_trust_scorer", None):
220
- return engine._trust_scorer.get_trust_stats()
221
- except (AttributeError, Exception):
222
- pass # Fall through to direct DB query
223
-
224
- # Direct DB query (dashboard runs without engine subprocess)
225
- import sqlite3
226
- from .helpers import get_active_profile
227
- pid = get_active_profile()
228
-
229
- total_signals = 0
230
- avg_trust_score = 0.667
231
- by_signal_type = {}
232
-
233
- if DB_PATH.exists():
234
- conn = get_read_connection(DB_PATH)
235
- try:
236
- try:
237
- # Count trust signals
238
- row = conn.execute(
239
- "SELECT COUNT(*) AS cnt FROM trust_signals "
240
- "WHERE profile_id = ?", (pid,),
241
- ).fetchone()
242
- total_signals = row["cnt"] if row else 0
243
- except sqlite3.OperationalError:
244
- pass
245
-
246
- try:
247
- # Average trust score
248
- row = conn.execute(
249
- "SELECT AVG(trust_score) AS avg_ts FROM trust_scores "
250
- "WHERE profile_id = ?", (pid,),
251
- ).fetchone()
252
- if row and row["avg_ts"] is not None:
253
- avg_trust_score = round(float(row["avg_ts"]), 3)
254
- except sqlite3.OperationalError:
255
- pass
256
-
257
- try:
258
- # Signal breakdown by type
259
- rows = conn.execute(
260
- "SELECT signal_type, COUNT(*) AS cnt "
261
- "FROM trust_signals WHERE profile_id = ? "
262
- "GROUP BY signal_type", (pid,),
263
- ).fetchall()
264
- by_signal_type = {r["signal_type"]: r["cnt"] for r in rows}
265
- except sqlite3.OperationalError:
266
- pass
267
- finally:
268
- conn.close()
269
-
270
- # Enforcement status: SLM uses "Silent Collection" by default
271
- enforcement = "Silent Collection"
272
-
273
- return {
274
- "total_signals": total_signals,
275
- "avg_trust_score": avg_trust_score,
276
- "enforcement": enforcement,
277
- "by_signal_type": by_signal_type,
278
- }
279
- except Exception:
280
- raise _internal_error("Trust stats error")
281
-
282
-
283
- @router.get("/api/trust/signals/{agent_id}")
284
- async def get_agent_trust_signals(
285
- request: Request, agent_id: str,
286
- limit: int = Query(50, ge=1, le=200),
287
- ):
288
- """Get trust signal history for a specific agent."""
289
- if not TRUST_AVAILABLE:
290
- return {"signals": [], "count": 0}
291
- try:
292
- engine = getattr(request.app.state, "engine", None)
293
- if engine and engine._trust_scorer:
294
- scorer = engine._trust_scorer
295
- signals = scorer.get_signals(agent_id, limit=limit)
296
- score = scorer.get_trust_score(agent_id)
297
- return {
298
- "agent_id": agent_id, "trust_score": score,
299
- "signals": signals, "count": len(signals),
300
- }
301
- return {"agent_id": agent_id, "signals": [], "count": 0}
302
- except Exception:
303
- raise _internal_error("Trust signals error")