superlocalmemory 2.8.6 → 3.0.1

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 (431) hide show
  1. package/LICENSE +9 -1
  2. package/NOTICE +63 -0
  3. package/README.md +165 -480
  4. package/bin/slm +17 -449
  5. package/bin/slm-npm +62 -48
  6. package/conftest.py +5 -0
  7. package/docs/api-reference.md +284 -0
  8. package/docs/architecture.md +149 -0
  9. package/docs/auto-memory.md +150 -0
  10. package/docs/cli-reference.md +276 -0
  11. package/docs/compliance.md +191 -0
  12. package/docs/configuration.md +182 -0
  13. package/docs/getting-started.md +102 -0
  14. package/docs/ide-setup.md +261 -0
  15. package/docs/mcp-tools.md +220 -0
  16. package/docs/migration-from-v2.md +170 -0
  17. package/docs/profiles.md +173 -0
  18. package/docs/troubleshooting.md +310 -0
  19. package/{configs → ide/configs}/antigravity-mcp.json +3 -3
  20. package/ide/configs/chatgpt-desktop-mcp.json +16 -0
  21. package/{configs → ide/configs}/claude-desktop-mcp.json +3 -3
  22. package/{configs → ide/configs}/codex-mcp.toml +4 -4
  23. package/{configs → ide/configs}/continue-mcp.yaml +4 -3
  24. package/{configs → ide/configs}/continue-skills.yaml +6 -6
  25. package/ide/configs/cursor-mcp.json +15 -0
  26. package/{configs → ide/configs}/gemini-cli-mcp.json +2 -2
  27. package/{configs → ide/configs}/jetbrains-mcp.json +2 -2
  28. package/{configs → ide/configs}/opencode-mcp.json +2 -2
  29. package/{configs → ide/configs}/perplexity-mcp.json +2 -2
  30. package/{configs → ide/configs}/vscode-copilot-mcp.json +2 -2
  31. package/{configs → ide/configs}/windsurf-mcp.json +3 -3
  32. package/{configs → ide/configs}/zed-mcp.json +2 -2
  33. package/{hooks → ide/hooks}/context-hook.js +9 -20
  34. package/ide/hooks/memory-list-skill.js +70 -0
  35. package/ide/hooks/memory-profile-skill.js +101 -0
  36. package/ide/hooks/memory-recall-skill.js +62 -0
  37. package/ide/hooks/memory-remember-skill.js +68 -0
  38. package/ide/hooks/memory-reset-skill.js +160 -0
  39. package/{hooks → ide/hooks}/post-recall-hook.js +2 -2
  40. package/ide/integrations/langchain/README.md +106 -0
  41. package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +9 -0
  42. package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +201 -0
  43. package/ide/integrations/langchain/pyproject.toml +38 -0
  44. package/{src/learning → ide/integrations/langchain}/tests/__init__.py +1 -0
  45. package/ide/integrations/langchain/tests/test_chat_message_history.py +215 -0
  46. package/ide/integrations/langchain/tests/test_security.py +117 -0
  47. package/ide/integrations/llamaindex/README.md +81 -0
  48. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +9 -0
  49. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +316 -0
  50. package/ide/integrations/llamaindex/pyproject.toml +43 -0
  51. package/{src/lifecycle → ide/integrations/llamaindex}/tests/__init__.py +1 -2
  52. package/ide/integrations/llamaindex/tests/test_chat_store.py +294 -0
  53. package/ide/integrations/llamaindex/tests/test_security.py +241 -0
  54. package/{skills → ide/skills}/slm-build-graph/SKILL.md +6 -6
  55. package/{skills → ide/skills}/slm-list-recent/SKILL.md +5 -5
  56. package/{skills → ide/skills}/slm-recall/SKILL.md +5 -5
  57. package/{skills → ide/skills}/slm-remember/SKILL.md +6 -6
  58. package/{skills → ide/skills}/slm-show-patterns/SKILL.md +7 -7
  59. package/{skills → ide/skills}/slm-status/SKILL.md +9 -9
  60. package/{skills → ide/skills}/slm-switch-profile/SKILL.md +9 -9
  61. package/package.json +13 -22
  62. package/pyproject.toml +85 -0
  63. package/scripts/build-dmg.sh +417 -0
  64. package/scripts/install-skills.ps1 +334 -0
  65. package/scripts/postinstall.js +2 -2
  66. package/scripts/start-dashboard.ps1 +52 -0
  67. package/scripts/start-dashboard.sh +41 -0
  68. package/scripts/sync-wiki.ps1 +127 -0
  69. package/scripts/sync-wiki.sh +82 -0
  70. package/scripts/test-dmg.sh +161 -0
  71. package/scripts/test-npm-package.ps1 +252 -0
  72. package/scripts/test-npm-package.sh +207 -0
  73. package/scripts/verify-install.ps1 +294 -0
  74. package/scripts/verify-install.sh +266 -0
  75. package/src/superlocalmemory/__init__.py +0 -0
  76. package/src/superlocalmemory/attribution/__init__.py +9 -0
  77. package/src/superlocalmemory/attribution/mathematical_dna.py +235 -0
  78. package/src/superlocalmemory/attribution/signer.py +153 -0
  79. package/src/superlocalmemory/attribution/watermark.py +189 -0
  80. package/src/superlocalmemory/cli/__init__.py +5 -0
  81. package/src/superlocalmemory/cli/commands.py +245 -0
  82. package/src/superlocalmemory/cli/main.py +89 -0
  83. package/src/superlocalmemory/cli/migrate_cmd.py +55 -0
  84. package/src/superlocalmemory/cli/post_install.py +99 -0
  85. package/src/superlocalmemory/cli/setup_wizard.py +129 -0
  86. package/src/superlocalmemory/compliance/__init__.py +0 -0
  87. package/src/superlocalmemory/compliance/abac.py +204 -0
  88. package/src/superlocalmemory/compliance/audit.py +314 -0
  89. package/src/superlocalmemory/compliance/eu_ai_act.py +131 -0
  90. package/src/superlocalmemory/compliance/gdpr.py +294 -0
  91. package/src/superlocalmemory/compliance/lifecycle.py +158 -0
  92. package/src/superlocalmemory/compliance/retention.py +232 -0
  93. package/src/superlocalmemory/compliance/scheduler.py +148 -0
  94. package/src/superlocalmemory/core/__init__.py +0 -0
  95. package/src/superlocalmemory/core/config.py +391 -0
  96. package/src/superlocalmemory/core/embeddings.py +293 -0
  97. package/src/superlocalmemory/core/engine.py +701 -0
  98. package/src/superlocalmemory/core/hooks.py +65 -0
  99. package/src/superlocalmemory/core/maintenance.py +172 -0
  100. package/src/superlocalmemory/core/modes.py +140 -0
  101. package/src/superlocalmemory/core/profiles.py +234 -0
  102. package/src/superlocalmemory/core/registry.py +117 -0
  103. package/src/superlocalmemory/dynamics/__init__.py +0 -0
  104. package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +223 -0
  105. package/src/superlocalmemory/encoding/__init__.py +0 -0
  106. package/src/superlocalmemory/encoding/consolidator.py +485 -0
  107. package/src/superlocalmemory/encoding/emotional.py +125 -0
  108. package/src/superlocalmemory/encoding/entity_resolver.py +525 -0
  109. package/src/superlocalmemory/encoding/entropy_gate.py +104 -0
  110. package/src/superlocalmemory/encoding/fact_extractor.py +775 -0
  111. package/src/superlocalmemory/encoding/foresight.py +91 -0
  112. package/src/superlocalmemory/encoding/graph_builder.py +302 -0
  113. package/src/superlocalmemory/encoding/observation_builder.py +160 -0
  114. package/src/superlocalmemory/encoding/scene_builder.py +183 -0
  115. package/src/superlocalmemory/encoding/signal_inference.py +90 -0
  116. package/src/superlocalmemory/encoding/temporal_parser.py +426 -0
  117. package/src/superlocalmemory/encoding/type_router.py +235 -0
  118. package/src/superlocalmemory/hooks/__init__.py +3 -0
  119. package/src/superlocalmemory/hooks/auto_capture.py +111 -0
  120. package/src/superlocalmemory/hooks/auto_recall.py +93 -0
  121. package/src/superlocalmemory/hooks/ide_connector.py +204 -0
  122. package/src/superlocalmemory/hooks/rules_engine.py +99 -0
  123. package/src/superlocalmemory/infra/__init__.py +3 -0
  124. package/src/superlocalmemory/infra/auth_middleware.py +82 -0
  125. package/src/superlocalmemory/infra/backup.py +317 -0
  126. package/src/superlocalmemory/infra/cache_manager.py +267 -0
  127. package/src/superlocalmemory/infra/event_bus.py +381 -0
  128. package/src/superlocalmemory/infra/rate_limiter.py +135 -0
  129. package/src/{webhook_dispatcher.py → superlocalmemory/infra/webhook_dispatcher.py} +104 -101
  130. package/src/superlocalmemory/learning/__init__.py +0 -0
  131. package/src/superlocalmemory/learning/adaptive.py +172 -0
  132. package/src/superlocalmemory/learning/behavioral.py +490 -0
  133. package/src/superlocalmemory/learning/behavioral_listener.py +94 -0
  134. package/src/superlocalmemory/learning/bootstrap.py +298 -0
  135. package/src/superlocalmemory/learning/cross_project.py +399 -0
  136. package/src/superlocalmemory/learning/database.py +376 -0
  137. package/src/superlocalmemory/learning/engagement.py +323 -0
  138. package/src/superlocalmemory/learning/features.py +138 -0
  139. package/src/superlocalmemory/learning/feedback.py +316 -0
  140. package/src/superlocalmemory/learning/outcomes.py +255 -0
  141. package/src/superlocalmemory/learning/project_context.py +366 -0
  142. package/src/superlocalmemory/learning/ranker.py +155 -0
  143. package/src/superlocalmemory/learning/source_quality.py +303 -0
  144. package/src/superlocalmemory/learning/workflows.py +309 -0
  145. package/src/superlocalmemory/llm/__init__.py +0 -0
  146. package/src/superlocalmemory/llm/backbone.py +316 -0
  147. package/src/superlocalmemory/math/__init__.py +0 -0
  148. package/src/superlocalmemory/math/fisher.py +356 -0
  149. package/src/superlocalmemory/math/langevin.py +398 -0
  150. package/src/superlocalmemory/math/sheaf.py +257 -0
  151. package/src/superlocalmemory/mcp/__init__.py +0 -0
  152. package/src/superlocalmemory/mcp/resources.py +245 -0
  153. package/src/superlocalmemory/mcp/server.py +61 -0
  154. package/src/superlocalmemory/mcp/tools.py +18 -0
  155. package/src/superlocalmemory/mcp/tools_core.py +305 -0
  156. package/src/superlocalmemory/mcp/tools_v28.py +223 -0
  157. package/src/superlocalmemory/mcp/tools_v3.py +286 -0
  158. package/src/superlocalmemory/retrieval/__init__.py +0 -0
  159. package/src/superlocalmemory/retrieval/agentic.py +295 -0
  160. package/src/superlocalmemory/retrieval/ann_index.py +223 -0
  161. package/src/superlocalmemory/retrieval/bm25_channel.py +185 -0
  162. package/src/superlocalmemory/retrieval/bridge_discovery.py +170 -0
  163. package/src/superlocalmemory/retrieval/engine.py +390 -0
  164. package/src/superlocalmemory/retrieval/entity_channel.py +179 -0
  165. package/src/superlocalmemory/retrieval/fusion.py +78 -0
  166. package/src/superlocalmemory/retrieval/profile_channel.py +105 -0
  167. package/src/superlocalmemory/retrieval/reranker.py +154 -0
  168. package/src/superlocalmemory/retrieval/semantic_channel.py +232 -0
  169. package/src/superlocalmemory/retrieval/strategy.py +96 -0
  170. package/src/superlocalmemory/retrieval/temporal_channel.py +175 -0
  171. package/src/superlocalmemory/server/__init__.py +1 -0
  172. package/src/superlocalmemory/server/api.py +248 -0
  173. package/src/superlocalmemory/server/routes/__init__.py +4 -0
  174. package/src/superlocalmemory/server/routes/agents.py +107 -0
  175. package/src/superlocalmemory/server/routes/backup.py +91 -0
  176. package/src/superlocalmemory/server/routes/behavioral.py +127 -0
  177. package/src/superlocalmemory/server/routes/compliance.py +160 -0
  178. package/src/superlocalmemory/server/routes/data_io.py +188 -0
  179. package/src/superlocalmemory/server/routes/events.py +183 -0
  180. package/src/superlocalmemory/server/routes/helpers.py +85 -0
  181. package/src/superlocalmemory/server/routes/learning.py +273 -0
  182. package/src/superlocalmemory/server/routes/lifecycle.py +116 -0
  183. package/src/superlocalmemory/server/routes/memories.py +399 -0
  184. package/src/superlocalmemory/server/routes/profiles.py +219 -0
  185. package/src/superlocalmemory/server/routes/stats.py +346 -0
  186. package/src/superlocalmemory/server/routes/v3_api.py +365 -0
  187. package/src/superlocalmemory/server/routes/ws.py +82 -0
  188. package/src/superlocalmemory/server/security_middleware.py +57 -0
  189. package/src/superlocalmemory/server/ui.py +245 -0
  190. package/src/superlocalmemory/storage/__init__.py +0 -0
  191. package/src/superlocalmemory/storage/access_control.py +182 -0
  192. package/src/superlocalmemory/storage/database.py +594 -0
  193. package/src/superlocalmemory/storage/migrations.py +303 -0
  194. package/src/superlocalmemory/storage/models.py +406 -0
  195. package/src/superlocalmemory/storage/schema.py +726 -0
  196. package/src/superlocalmemory/storage/v2_migrator.py +317 -0
  197. package/src/superlocalmemory/trust/__init__.py +0 -0
  198. package/src/superlocalmemory/trust/gate.py +130 -0
  199. package/src/superlocalmemory/trust/provenance.py +124 -0
  200. package/src/superlocalmemory/trust/scorer.py +347 -0
  201. package/src/superlocalmemory/trust/signals.py +153 -0
  202. package/ui/index.html +278 -5
  203. package/ui/js/auto-settings.js +70 -0
  204. package/ui/js/dashboard.js +90 -0
  205. package/ui/js/fact-detail.js +92 -0
  206. package/ui/js/feedback.js +2 -2
  207. package/ui/js/ide-status.js +102 -0
  208. package/ui/js/math-health.js +98 -0
  209. package/ui/js/recall-lab.js +127 -0
  210. package/ui/js/settings.js +2 -2
  211. package/ui/js/trust-dashboard.js +73 -0
  212. package/api_server.py +0 -724
  213. package/bin/aider-smart +0 -72
  214. package/bin/superlocalmemoryv2-learning +0 -4
  215. package/bin/superlocalmemoryv2-list +0 -3
  216. package/bin/superlocalmemoryv2-patterns +0 -4
  217. package/bin/superlocalmemoryv2-profile +0 -3
  218. package/bin/superlocalmemoryv2-recall +0 -3
  219. package/bin/superlocalmemoryv2-remember +0 -3
  220. package/bin/superlocalmemoryv2-reset +0 -3
  221. package/bin/superlocalmemoryv2-status +0 -3
  222. package/configs/chatgpt-desktop-mcp.json +0 -16
  223. package/configs/cursor-mcp.json +0 -15
  224. package/hooks/memory-list-skill.js +0 -139
  225. package/hooks/memory-profile-skill.js +0 -273
  226. package/hooks/memory-recall-skill.js +0 -114
  227. package/hooks/memory-remember-skill.js +0 -127
  228. package/hooks/memory-reset-skill.js +0 -274
  229. package/mcp_server.py +0 -1808
  230. package/requirements-core.txt +0 -22
  231. package/requirements-learning.txt +0 -12
  232. package/requirements.txt +0 -12
  233. package/src/agent_registry.py +0 -411
  234. package/src/auth_middleware.py +0 -61
  235. package/src/auto_backup.py +0 -459
  236. package/src/behavioral/__init__.py +0 -49
  237. package/src/behavioral/behavioral_listener.py +0 -203
  238. package/src/behavioral/behavioral_patterns.py +0 -275
  239. package/src/behavioral/cross_project_transfer.py +0 -206
  240. package/src/behavioral/outcome_inference.py +0 -194
  241. package/src/behavioral/outcome_tracker.py +0 -193
  242. package/src/behavioral/tests/__init__.py +0 -4
  243. package/src/behavioral/tests/test_behavioral_integration.py +0 -108
  244. package/src/behavioral/tests/test_behavioral_patterns.py +0 -150
  245. package/src/behavioral/tests/test_cross_project_transfer.py +0 -142
  246. package/src/behavioral/tests/test_mcp_behavioral.py +0 -139
  247. package/src/behavioral/tests/test_mcp_report_outcome.py +0 -117
  248. package/src/behavioral/tests/test_outcome_inference.py +0 -107
  249. package/src/behavioral/tests/test_outcome_tracker.py +0 -96
  250. package/src/cache_manager.py +0 -518
  251. package/src/compliance/__init__.py +0 -48
  252. package/src/compliance/abac_engine.py +0 -149
  253. package/src/compliance/abac_middleware.py +0 -116
  254. package/src/compliance/audit_db.py +0 -215
  255. package/src/compliance/audit_logger.py +0 -148
  256. package/src/compliance/retention_manager.py +0 -289
  257. package/src/compliance/retention_scheduler.py +0 -186
  258. package/src/compliance/tests/__init__.py +0 -4
  259. package/src/compliance/tests/test_abac_enforcement.py +0 -95
  260. package/src/compliance/tests/test_abac_engine.py +0 -124
  261. package/src/compliance/tests/test_abac_mcp_integration.py +0 -118
  262. package/src/compliance/tests/test_audit_db.py +0 -123
  263. package/src/compliance/tests/test_audit_logger.py +0 -98
  264. package/src/compliance/tests/test_mcp_audit.py +0 -128
  265. package/src/compliance/tests/test_mcp_retention_policy.py +0 -125
  266. package/src/compliance/tests/test_retention_manager.py +0 -131
  267. package/src/compliance/tests/test_retention_scheduler.py +0 -99
  268. package/src/compression/__init__.py +0 -25
  269. package/src/compression/cli.py +0 -150
  270. package/src/compression/cold_storage.py +0 -217
  271. package/src/compression/config.py +0 -72
  272. package/src/compression/orchestrator.py +0 -133
  273. package/src/compression/tier2_compressor.py +0 -228
  274. package/src/compression/tier3_compressor.py +0 -153
  275. package/src/compression/tier_classifier.py +0 -148
  276. package/src/db_connection_manager.py +0 -536
  277. package/src/embedding_engine.py +0 -63
  278. package/src/embeddings/__init__.py +0 -47
  279. package/src/embeddings/cache.py +0 -70
  280. package/src/embeddings/cli.py +0 -113
  281. package/src/embeddings/constants.py +0 -47
  282. package/src/embeddings/database.py +0 -91
  283. package/src/embeddings/engine.py +0 -247
  284. package/src/embeddings/model_loader.py +0 -145
  285. package/src/event_bus.py +0 -562
  286. package/src/graph/__init__.py +0 -36
  287. package/src/graph/build_helpers.py +0 -74
  288. package/src/graph/cli.py +0 -87
  289. package/src/graph/cluster_builder.py +0 -188
  290. package/src/graph/cluster_summary.py +0 -148
  291. package/src/graph/constants.py +0 -47
  292. package/src/graph/edge_builder.py +0 -162
  293. package/src/graph/entity_extractor.py +0 -95
  294. package/src/graph/graph_core.py +0 -226
  295. package/src/graph/graph_search.py +0 -231
  296. package/src/graph/hierarchical.py +0 -207
  297. package/src/graph/schema.py +0 -99
  298. package/src/graph_engine.py +0 -52
  299. package/src/hnsw_index.py +0 -628
  300. package/src/hybrid_search.py +0 -46
  301. package/src/learning/__init__.py +0 -217
  302. package/src/learning/adaptive_ranker.py +0 -682
  303. package/src/learning/bootstrap/__init__.py +0 -69
  304. package/src/learning/bootstrap/constants.py +0 -93
  305. package/src/learning/bootstrap/db_queries.py +0 -316
  306. package/src/learning/bootstrap/sampling.py +0 -82
  307. package/src/learning/bootstrap/text_utils.py +0 -71
  308. package/src/learning/cross_project_aggregator.py +0 -857
  309. package/src/learning/db/__init__.py +0 -40
  310. package/src/learning/db/constants.py +0 -44
  311. package/src/learning/db/schema.py +0 -279
  312. package/src/learning/engagement_tracker.py +0 -628
  313. package/src/learning/feature_extractor.py +0 -708
  314. package/src/learning/feedback_collector.py +0 -806
  315. package/src/learning/learning_db.py +0 -915
  316. package/src/learning/project_context_manager.py +0 -572
  317. package/src/learning/ranking/__init__.py +0 -33
  318. package/src/learning/ranking/constants.py +0 -84
  319. package/src/learning/ranking/helpers.py +0 -278
  320. package/src/learning/source_quality_scorer.py +0 -676
  321. package/src/learning/synthetic_bootstrap.py +0 -755
  322. package/src/learning/tests/test_adaptive_ranker.py +0 -325
  323. package/src/learning/tests/test_adaptive_ranker_v28.py +0 -60
  324. package/src/learning/tests/test_aggregator.py +0 -306
  325. package/src/learning/tests/test_auto_retrain_v28.py +0 -35
  326. package/src/learning/tests/test_e2e_ranking_v28.py +0 -82
  327. package/src/learning/tests/test_feature_extractor_v28.py +0 -93
  328. package/src/learning/tests/test_feedback_collector.py +0 -294
  329. package/src/learning/tests/test_learning_db.py +0 -602
  330. package/src/learning/tests/test_learning_db_v28.py +0 -110
  331. package/src/learning/tests/test_learning_init_v28.py +0 -48
  332. package/src/learning/tests/test_outcome_signals.py +0 -48
  333. package/src/learning/tests/test_project_context.py +0 -292
  334. package/src/learning/tests/test_schema_migration.py +0 -319
  335. package/src/learning/tests/test_signal_inference.py +0 -397
  336. package/src/learning/tests/test_source_quality.py +0 -351
  337. package/src/learning/tests/test_synthetic_bootstrap.py +0 -429
  338. package/src/learning/tests/test_workflow_miner.py +0 -318
  339. package/src/learning/workflow_pattern_miner.py +0 -655
  340. package/src/lifecycle/__init__.py +0 -54
  341. package/src/lifecycle/bounded_growth.py +0 -239
  342. package/src/lifecycle/compaction_engine.py +0 -226
  343. package/src/lifecycle/lifecycle_engine.py +0 -355
  344. package/src/lifecycle/lifecycle_evaluator.py +0 -257
  345. package/src/lifecycle/lifecycle_scheduler.py +0 -130
  346. package/src/lifecycle/retention_policy.py +0 -285
  347. package/src/lifecycle/tests/test_bounded_growth.py +0 -193
  348. package/src/lifecycle/tests/test_compaction.py +0 -179
  349. package/src/lifecycle/tests/test_lifecycle_engine.py +0 -137
  350. package/src/lifecycle/tests/test_lifecycle_evaluation.py +0 -177
  351. package/src/lifecycle/tests/test_lifecycle_scheduler.py +0 -127
  352. package/src/lifecycle/tests/test_lifecycle_search.py +0 -109
  353. package/src/lifecycle/tests/test_mcp_compact.py +0 -149
  354. package/src/lifecycle/tests/test_mcp_lifecycle_status.py +0 -114
  355. package/src/lifecycle/tests/test_retention_policy.py +0 -162
  356. package/src/mcp_tools_v28.py +0 -281
  357. package/src/memory/__init__.py +0 -36
  358. package/src/memory/cli.py +0 -205
  359. package/src/memory/constants.py +0 -39
  360. package/src/memory/helpers.py +0 -28
  361. package/src/memory/schema.py +0 -166
  362. package/src/memory-profiles.py +0 -595
  363. package/src/memory-reset.py +0 -491
  364. package/src/memory_compression.py +0 -989
  365. package/src/memory_store_v2.py +0 -1155
  366. package/src/migrate_v1_to_v2.py +0 -629
  367. package/src/pattern_learner.py +0 -34
  368. package/src/patterns/__init__.py +0 -24
  369. package/src/patterns/analyzers.py +0 -251
  370. package/src/patterns/learner.py +0 -271
  371. package/src/patterns/scoring.py +0 -171
  372. package/src/patterns/store.py +0 -225
  373. package/src/patterns/terminology.py +0 -140
  374. package/src/provenance_tracker.py +0 -312
  375. package/src/qualixar_attribution.py +0 -139
  376. package/src/qualixar_watermark.py +0 -78
  377. package/src/query_optimizer.py +0 -511
  378. package/src/rate_limiter.py +0 -83
  379. package/src/search/__init__.py +0 -20
  380. package/src/search/cli.py +0 -77
  381. package/src/search/constants.py +0 -26
  382. package/src/search/engine.py +0 -241
  383. package/src/search/fusion.py +0 -122
  384. package/src/search/index_loader.py +0 -114
  385. package/src/search/methods.py +0 -162
  386. package/src/search_engine_v2.py +0 -401
  387. package/src/setup_validator.py +0 -482
  388. package/src/subscription_manager.py +0 -391
  389. package/src/tree/__init__.py +0 -59
  390. package/src/tree/builder.py +0 -185
  391. package/src/tree/nodes.py +0 -202
  392. package/src/tree/queries.py +0 -257
  393. package/src/tree/schema.py +0 -80
  394. package/src/tree_manager.py +0 -19
  395. package/src/trust/__init__.py +0 -45
  396. package/src/trust/constants.py +0 -66
  397. package/src/trust/queries.py +0 -157
  398. package/src/trust/schema.py +0 -95
  399. package/src/trust/scorer.py +0 -299
  400. package/src/trust/signals.py +0 -95
  401. package/src/trust_scorer.py +0 -44
  402. package/ui/app.js +0 -1588
  403. package/ui/js/graph-cytoscape-monolithic-backup.js +0 -1168
  404. package/ui/js/graph-cytoscape.js +0 -1168
  405. package/ui/js/graph-d3-backup.js +0 -32
  406. package/ui/js/graph.js +0 -32
  407. package/ui_server.py +0 -286
  408. /package/docs/{ACCESSIBILITY.md → v2-archive/ACCESSIBILITY.md} +0 -0
  409. /package/docs/{ARCHITECTURE.md → v2-archive/ARCHITECTURE.md} +0 -0
  410. /package/docs/{CLI-COMMANDS-REFERENCE.md → v2-archive/CLI-COMMANDS-REFERENCE.md} +0 -0
  411. /package/docs/{COMPRESSION-README.md → v2-archive/COMPRESSION-README.md} +0 -0
  412. /package/docs/{FRAMEWORK-INTEGRATIONS.md → v2-archive/FRAMEWORK-INTEGRATIONS.md} +0 -0
  413. /package/docs/{MCP-MANUAL-SETUP.md → v2-archive/MCP-MANUAL-SETUP.md} +0 -0
  414. /package/docs/{MCP-TROUBLESHOOTING.md → v2-archive/MCP-TROUBLESHOOTING.md} +0 -0
  415. /package/docs/{PATTERN-LEARNING.md → v2-archive/PATTERN-LEARNING.md} +0 -0
  416. /package/docs/{PROFILES-GUIDE.md → v2-archive/PROFILES-GUIDE.md} +0 -0
  417. /package/docs/{RESET-GUIDE.md → v2-archive/RESET-GUIDE.md} +0 -0
  418. /package/docs/{SEARCH-ENGINE-V2.2.0.md → v2-archive/SEARCH-ENGINE-V2.2.0.md} +0 -0
  419. /package/docs/{SEARCH-INTEGRATION-GUIDE.md → v2-archive/SEARCH-INTEGRATION-GUIDE.md} +0 -0
  420. /package/docs/{UI-SERVER.md → v2-archive/UI-SERVER.md} +0 -0
  421. /package/docs/{UNIVERSAL-INTEGRATION.md → v2-archive/UNIVERSAL-INTEGRATION.md} +0 -0
  422. /package/docs/{V2.2.0-OPTIONAL-SEARCH.md → v2-archive/V2.2.0-OPTIONAL-SEARCH.md} +0 -0
  423. /package/docs/{WINDOWS-INSTALL-README.txt → v2-archive/WINDOWS-INSTALL-README.txt} +0 -0
  424. /package/docs/{WINDOWS-POST-INSTALL.txt → v2-archive/WINDOWS-POST-INSTALL.txt} +0 -0
  425. /package/docs/{example_graph_usage.py → v2-archive/example_graph_usage.py} +0 -0
  426. /package/{completions → ide/completions}/slm.bash +0 -0
  427. /package/{completions → ide/completions}/slm.zsh +0 -0
  428. /package/{configs → ide/configs}/cody-commands.json +0 -0
  429. /package/{install-skills.sh → scripts/install-skills.sh} +0 -0
  430. /package/{install.ps1 → scripts/install.ps1} +0 -0
  431. /package/{install.sh → scripts/install.sh} +0 -0
@@ -0,0 +1,223 @@
1
+ # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
+ # Licensed under the MIT License - see LICENSE file
3
+ # Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
4
+
5
+ """SuperLocalMemory V3 — V2.8 Ported MCP Tools (6 tools).
6
+
7
+ report_outcome, get_lifecycle_status, set_retention_policy,
8
+ compact_memories, get_behavioral_patterns, audit_trail.
9
+
10
+ Part of Qualixar | Author: Varun Pratap Bhardwaj
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import logging
16
+ from typing import Callable
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ def register_v28_tools(server, get_engine: Callable) -> None:
22
+ """Register 6 V2.8-ported tools on *server*."""
23
+
24
+ # ------------------------------------------------------------------
25
+ # 1. report_outcome
26
+ # ------------------------------------------------------------------
27
+ @server.tool()
28
+ async def report_outcome(
29
+ memory_ids: str,
30
+ outcome: str,
31
+ context: str = "",
32
+ ) -> dict:
33
+ """Report outcome of using recalled memories.
34
+
35
+ Feeds into the adaptive learning loop to improve future retrieval.
36
+ Valid outcomes: success, failure, partial.
37
+
38
+ Args:
39
+ memory_ids: Comma-separated list of fact/memory IDs.
40
+ outcome: One of 'success', 'failure', 'partial'.
41
+ context: Optional freetext context about the outcome.
42
+ """
43
+ try:
44
+ engine = get_engine()
45
+ from superlocalmemory.learning.outcomes import OutcomeTracker
46
+ tracker = OutcomeTracker(engine._db)
47
+ ids = [mid.strip() for mid in memory_ids.split(",") if mid.strip()]
48
+ ctx = {"note": context} if context else None
49
+ ao = tracker.record_outcome(
50
+ query="[mcp_feedback]",
51
+ fact_ids=ids,
52
+ outcome=outcome,
53
+ profile_id=engine.profile_id,
54
+ context=ctx,
55
+ )
56
+ return {"success": True, "outcome_id": ao.outcome_id, "outcome": outcome}
57
+ except Exception as exc:
58
+ logger.exception("report_outcome failed")
59
+ return {"success": False, "error": str(exc)}
60
+
61
+ # ------------------------------------------------------------------
62
+ # 2. get_lifecycle_status
63
+ # ------------------------------------------------------------------
64
+ @server.tool()
65
+ async def get_lifecycle_status(limit: int = 50) -> dict:
66
+ """Get lifecycle state distribution for stored memories.
67
+
68
+ Shows counts per lifecycle state (active, warm, cold, archived)
69
+ and the most recent facts in each state.
70
+
71
+ Args:
72
+ limit: Maximum facts to inspect (default 50).
73
+ """
74
+ try:
75
+ engine = get_engine()
76
+ pid = engine.profile_id
77
+ facts = engine._db.get_all_facts(pid)[:limit]
78
+ states: dict[str, list[dict]] = {
79
+ "active": [], "warm": [], "cold": [], "archived": [],
80
+ }
81
+ for f in facts:
82
+ state = f.lifecycle.value
83
+ if state in states and len(states[state]) < 10:
84
+ states[state].append({
85
+ "fact_id": f.fact_id,
86
+ "content": f.content[:80],
87
+ "access_count": f.access_count,
88
+ "created_at": f.created_at,
89
+ })
90
+ counts = {k: len(v) for k, v in states.items()}
91
+ return {"success": True, "counts": counts, "samples": states}
92
+ except Exception as exc:
93
+ logger.exception("get_lifecycle_status failed")
94
+ return {"success": False, "error": str(exc)}
95
+
96
+ # ------------------------------------------------------------------
97
+ # 3. set_retention_policy
98
+ # ------------------------------------------------------------------
99
+ @server.tool()
100
+ async def set_retention_policy(
101
+ cold_after_days: int = 30,
102
+ archive_after_days: int = 90,
103
+ ) -> dict:
104
+ """Set memory retention policy thresholds.
105
+
106
+ Controls when memories transition from active to warm, cold,
107
+ and archived states. Coupled with Langevin dynamics when available.
108
+
109
+ Args:
110
+ cold_after_days: Days of inactivity before cold state (default 30).
111
+ archive_after_days: Days before archival (default 90).
112
+ """
113
+ try:
114
+ engine = get_engine()
115
+ engine._db.set_config("retention_cold_days", str(cold_after_days))
116
+ engine._db.set_config("retention_archive_days", str(archive_after_days))
117
+ return {
118
+ "success": True,
119
+ "cold_after_days": cold_after_days,
120
+ "archive_after_days": archive_after_days,
121
+ }
122
+ except Exception as exc:
123
+ logger.exception("set_retention_policy failed")
124
+ return {"success": False, "error": str(exc)}
125
+
126
+ # ------------------------------------------------------------------
127
+ # 4. compact_memories
128
+ # ------------------------------------------------------------------
129
+ @server.tool()
130
+ async def compact_memories(dry_run: bool = True) -> dict:
131
+ """Compact memory store by archiving cold/stale facts.
132
+
133
+ Transitions eligible memories from cold to archived state.
134
+ Run with dry_run=True first to preview changes.
135
+
136
+ Args:
137
+ dry_run: If True, only preview without making changes (default True).
138
+ """
139
+ try:
140
+ engine = get_engine()
141
+ pid = engine.profile_id
142
+ from superlocalmemory.compliance.lifecycle import LifecycleManager
143
+ mgr = LifecycleManager(engine._db)
144
+ facts = engine._db.get_all_facts(pid)
145
+ candidates = []
146
+ for f in facts:
147
+ new_state = mgr.get_lifecycle_state(f)
148
+ if new_state != f.lifecycle:
149
+ candidates.append({
150
+ "fact_id": f.fact_id,
151
+ "current": f.lifecycle.value,
152
+ "proposed": new_state.value,
153
+ })
154
+ if not dry_run:
155
+ for c in candidates:
156
+ engine._db.update_fact(
157
+ c["fact_id"], {"lifecycle": c["proposed"]},
158
+ )
159
+ return {
160
+ "success": True,
161
+ "dry_run": dry_run,
162
+ "candidates": len(candidates),
163
+ "transitions": candidates[:20],
164
+ }
165
+ except Exception as exc:
166
+ logger.exception("compact_memories failed")
167
+ return {"success": False, "error": str(exc)}
168
+
169
+ # ------------------------------------------------------------------
170
+ # 5. get_behavioral_patterns
171
+ # ------------------------------------------------------------------
172
+ @server.tool()
173
+ async def get_behavioral_patterns(limit: int = 20) -> dict:
174
+ """Get detected behavioral patterns for the active profile.
175
+
176
+ Returns patterns such as topic interests, refinement habits,
177
+ and time-of-day usage with confidence scores.
178
+
179
+ Args:
180
+ limit: Maximum patterns to return (default 20).
181
+ """
182
+ try:
183
+ engine = get_engine()
184
+ from superlocalmemory.learning.behavioral import BehavioralStore
185
+ store = BehavioralStore(engine._db.db_path)
186
+ patterns = store.get_patterns(engine.profile_id, limit=limit)
187
+ summary = store.get_summary(engine.profile_id)
188
+ return {
189
+ "success": True,
190
+ "patterns": patterns,
191
+ "summary": summary,
192
+ "count": len(patterns),
193
+ }
194
+ except Exception as exc:
195
+ logger.exception("get_behavioral_patterns failed")
196
+ return {"success": False, "error": str(exc)}
197
+
198
+ # ------------------------------------------------------------------
199
+ # 6. audit_trail
200
+ # ------------------------------------------------------------------
201
+ @server.tool()
202
+ async def audit_trail(limit: int = 50) -> dict:
203
+ """Get compliance audit trail for the active profile.
204
+
205
+ Returns logged operations (store, retrieve, delete, export)
206
+ for GDPR and EU AI Act compliance reporting.
207
+
208
+ Args:
209
+ limit: Maximum audit entries to return (default 50).
210
+ """
211
+ try:
212
+ engine = get_engine()
213
+ from superlocalmemory.compliance.gdpr import GDPRCompliance
214
+ gdpr = GDPRCompliance(engine._db)
215
+ entries = gdpr.get_audit_trail(engine.profile_id, limit=limit)
216
+ return {
217
+ "success": True,
218
+ "entries": entries,
219
+ "count": len(entries),
220
+ }
221
+ except Exception as exc:
222
+ logger.exception("audit_trail failed")
223
+ return {"success": False, "error": str(exc)}
@@ -0,0 +1,286 @@
1
+ # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
+ # Licensed under the MIT License - see LICENSE file
3
+ # Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
4
+
5
+ """SuperLocalMemory V3 — V3-Only MCP Tools (5 tools).
6
+
7
+ set_mode, get_mode, health, consistency_check, recall_trace.
8
+
9
+ Part of Qualixar | Author: Varun Pratap Bhardwaj
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import logging
15
+ from typing import Callable
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ def register_v3_tools(server, get_engine: Callable) -> None:
21
+ """Register 5 V3-exclusive tools on *server*."""
22
+
23
+ # ------------------------------------------------------------------
24
+ # 1. set_mode
25
+ # ------------------------------------------------------------------
26
+ @server.tool()
27
+ async def set_mode(mode: str) -> dict:
28
+ """Switch operating mode (a, b, or c).
29
+
30
+ Mode A: Local Guardian (zero LLM, EU AI Act full compliance).
31
+ Mode B: Smart Local (local Ollama LLM, EU AI Act full).
32
+ Mode C: Full Power (cloud LLM, best accuracy).
33
+
34
+ Resets the engine to apply the new mode configuration.
35
+
36
+ Args:
37
+ mode: Target mode - 'a', 'b', or 'c'.
38
+ """
39
+ try:
40
+ mode_lower = mode.strip().lower()
41
+ if mode_lower not in ("a", "b", "c"):
42
+ return {
43
+ "success": False,
44
+ "error": f"Invalid mode '{mode}'. Use 'a', 'b', or 'c'.",
45
+ }
46
+ from superlocalmemory.core.config import SLMConfig
47
+ from superlocalmemory.storage.models import Mode
48
+ from superlocalmemory.mcp.server import reset_engine
49
+
50
+ mode_enum = Mode(mode_lower)
51
+ config = SLMConfig.for_mode(mode_enum)
52
+ config.save()
53
+ reset_engine()
54
+
55
+ return {
56
+ "success": True,
57
+ "mode": mode_lower,
58
+ "description": _mode_description(mode_lower),
59
+ }
60
+ except Exception as exc:
61
+ logger.exception("set_mode failed")
62
+ return {"success": False, "error": str(exc)}
63
+
64
+ # ------------------------------------------------------------------
65
+ # 2. get_mode
66
+ # ------------------------------------------------------------------
67
+ @server.tool()
68
+ async def get_mode() -> dict:
69
+ """Get current operating mode and its capabilities.
70
+
71
+ Returns mode identifier, description, and feature flags
72
+ (LLM availability, cross-encoder, agentic retrieval).
73
+ """
74
+ try:
75
+ engine = get_engine()
76
+ m = engine._config.mode.value
77
+ caps = {
78
+ "llm_available": engine._llm is not None,
79
+ "cross_encoder": engine._config.retrieval.use_cross_encoder,
80
+ "agentic_rounds": engine._config.retrieval.agentic_max_rounds,
81
+ "sheaf_at_encoding": engine._config.math.sheaf_at_encoding,
82
+ }
83
+ return {
84
+ "success": True,
85
+ "mode": m,
86
+ "description": _mode_description(m),
87
+ "capabilities": caps,
88
+ }
89
+ except Exception as exc:
90
+ logger.exception("get_mode failed")
91
+ return {"success": False, "error": str(exc)}
92
+
93
+ # ------------------------------------------------------------------
94
+ # 3. health
95
+ # ------------------------------------------------------------------
96
+ @server.tool()
97
+ async def health() -> dict:
98
+ """Get system health including math layer status.
99
+
100
+ Reports on Fisher-Rao, Sheaf consistency, and Langevin dynamics
101
+ health. Also includes database integrity and component status.
102
+ """
103
+ try:
104
+ engine = get_engine()
105
+ pid = engine.profile_id
106
+
107
+ status: dict = {
108
+ "success": True,
109
+ "mode": engine._config.mode.value,
110
+ "profile": pid,
111
+ "components": {},
112
+ }
113
+
114
+ # Database health
115
+ fact_count = engine._db.get_fact_count(pid)
116
+ status["components"]["database"] = {
117
+ "status": "ok",
118
+ "fact_count": fact_count,
119
+ }
120
+
121
+ # Embedding service
122
+ status["components"]["embedder"] = {
123
+ "status": "ok" if engine._embedder else "unavailable",
124
+ "model": engine._config.embedding.model_name,
125
+ }
126
+
127
+ # LLM
128
+ status["components"]["llm"] = {
129
+ "status": "ok" if engine._llm else "disabled",
130
+ "provider": engine._config.llm.provider or "none",
131
+ }
132
+
133
+ # Fisher-Rao (math layer 1)
134
+ fisher_facts = 0
135
+ if fact_count > 0:
136
+ rows = engine._db.execute(
137
+ "SELECT COUNT(*) AS c FROM atomic_facts "
138
+ "WHERE profile_id = ? AND fisher_mean IS NOT NULL",
139
+ (pid,),
140
+ )
141
+ fisher_facts = int(dict(rows[0])["c"]) if rows else 0
142
+ status["components"]["fisher_rao"] = {
143
+ "status": "ok" if fisher_facts > 0 else "no_data",
144
+ "indexed_facts": fisher_facts,
145
+ "temperature": engine._config.math.fisher_temperature,
146
+ }
147
+
148
+ # Sheaf consistency (math layer 2)
149
+ status["components"]["sheaf"] = {
150
+ "status": "active" if engine._sheaf_checker else "disabled",
151
+ "threshold": engine._config.math.sheaf_contradiction_threshold,
152
+ }
153
+
154
+ # Langevin dynamics (math layer 3)
155
+ langevin_facts = 0
156
+ if fact_count > 0:
157
+ rows = engine._db.execute(
158
+ "SELECT COUNT(*) AS c FROM atomic_facts "
159
+ "WHERE profile_id = ? AND langevin_position IS NOT NULL",
160
+ (pid,),
161
+ )
162
+ langevin_facts = int(dict(rows[0])["c"]) if rows else 0
163
+ status["components"]["langevin"] = {
164
+ "status": "ok" if langevin_facts > 0 else "no_data",
165
+ "positioned_facts": langevin_facts,
166
+ }
167
+
168
+ return status
169
+ except Exception as exc:
170
+ logger.exception("health failed")
171
+ return {"success": False, "error": str(exc)}
172
+
173
+ # ------------------------------------------------------------------
174
+ # 4. consistency_check
175
+ # ------------------------------------------------------------------
176
+ @server.tool()
177
+ async def consistency_check(limit: int = 100) -> dict:
178
+ """Run sheaf consistency check on stored memories.
179
+
180
+ Detects contradictions between facts using algebraic topology
181
+ (sheaf cohomology). Returns pairs of contradicting facts with
182
+ severity scores.
183
+
184
+ Args:
185
+ limit: Maximum facts to check (default 100).
186
+ """
187
+ try:
188
+ engine = get_engine()
189
+ pid = engine.profile_id
190
+
191
+ if not engine._sheaf_checker:
192
+ return {
193
+ "success": True,
194
+ "contradictions": [],
195
+ "note": "Sheaf checker is disabled in current configuration.",
196
+ }
197
+
198
+ facts = engine._db.get_all_facts(pid)[:limit]
199
+ all_contradictions: list[dict] = []
200
+ for fact in facts:
201
+ if not fact.embedding or not fact.canonical_entities:
202
+ continue
203
+ try:
204
+ contradictions = engine._sheaf_checker.check_consistency(
205
+ fact, pid,
206
+ )
207
+ for c in contradictions:
208
+ all_contradictions.append({
209
+ "fact_a": fact.fact_id,
210
+ "fact_b": c.fact_id_b,
211
+ "severity": round(c.severity, 3),
212
+ "content_a": fact.content[:80],
213
+ })
214
+ except Exception:
215
+ continue
216
+
217
+ return {
218
+ "success": True,
219
+ "facts_checked": len(facts),
220
+ "contradictions": all_contradictions[:50],
221
+ "total_contradictions": len(all_contradictions),
222
+ }
223
+ except Exception as exc:
224
+ logger.exception("consistency_check failed")
225
+ return {"success": False, "error": str(exc)}
226
+
227
+ # ------------------------------------------------------------------
228
+ # 5. recall_trace
229
+ # ------------------------------------------------------------------
230
+ @server.tool()
231
+ async def recall_trace(query: str, limit: int = 10) -> dict:
232
+ """Recall with per-channel score breakdown.
233
+
234
+ Like recall, but returns detailed channel-by-channel scores
235
+ for debugging retrieval quality.
236
+
237
+ Args:
238
+ query: Natural-language search query.
239
+ limit: Maximum results (default 10).
240
+ """
241
+ try:
242
+ engine = get_engine()
243
+ response = engine.recall(query, limit=limit)
244
+ results = []
245
+ for r in response.results[:limit]:
246
+ results.append({
247
+ "fact_id": r.fact.fact_id,
248
+ "content": r.fact.content,
249
+ "final_score": round(r.score, 4),
250
+ "confidence": round(r.confidence, 3),
251
+ "trust_score": round(r.trust_score, 3),
252
+ "channel_scores": {
253
+ k: round(v, 4) for k, v in r.channel_scores.items()
254
+ },
255
+ "evidence_chain": r.evidence_chain,
256
+ "fact_type": r.fact.fact_type.value,
257
+ "lifecycle": r.fact.lifecycle.value,
258
+ "access_count": r.fact.access_count,
259
+ })
260
+ return {
261
+ "success": True,
262
+ "results": results,
263
+ "count": len(results),
264
+ "query_type": response.query_type,
265
+ "channel_weights": {
266
+ k: round(v, 3)
267
+ for k, v in response.channel_weights.items()
268
+ },
269
+ "total_candidates": response.total_candidates,
270
+ "retrieval_time_ms": round(response.retrieval_time_ms, 1),
271
+ }
272
+ except Exception as exc:
273
+ logger.exception("recall_trace failed")
274
+ return {"success": False, "error": str(exc)}
275
+
276
+
277
+ # -- Helpers ------------------------------------------------------------------
278
+
279
+ def _mode_description(mode: str) -> str:
280
+ """Human-readable description for a mode."""
281
+ descriptions = {
282
+ "a": "Local Guardian: zero LLM, full EU AI Act compliance",
283
+ "b": "Smart Local: local Ollama LLM, full EU AI Act compliance",
284
+ "c": "Full Power: cloud LLM, best accuracy, partial EU AI Act",
285
+ }
286
+ return descriptions.get(mode, "Unknown mode")
File without changes