superlocalmemory 2.8.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +9 -1
  3. package/NOTICE +63 -0
  4. package/README.md +165 -480
  5. package/bin/slm +17 -449
  6. package/bin/slm-npm +2 -2
  7. package/bin/slm.bat +4 -2
  8. package/conftest.py +5 -0
  9. package/docs/api-reference.md +284 -0
  10. package/docs/architecture.md +149 -0
  11. package/docs/auto-memory.md +150 -0
  12. package/docs/cli-reference.md +276 -0
  13. package/docs/compliance.md +191 -0
  14. package/docs/configuration.md +182 -0
  15. package/docs/getting-started.md +102 -0
  16. package/docs/ide-setup.md +261 -0
  17. package/docs/mcp-tools.md +220 -0
  18. package/docs/migration-from-v2.md +170 -0
  19. package/docs/profiles.md +173 -0
  20. package/docs/troubleshooting.md +310 -0
  21. package/{configs → ide/configs}/antigravity-mcp.json +3 -3
  22. package/ide/configs/chatgpt-desktop-mcp.json +16 -0
  23. package/{configs → ide/configs}/claude-desktop-mcp.json +3 -3
  24. package/{configs → ide/configs}/codex-mcp.toml +4 -4
  25. package/{configs → ide/configs}/continue-mcp.yaml +4 -3
  26. package/{configs → ide/configs}/continue-skills.yaml +6 -6
  27. package/ide/configs/cursor-mcp.json +15 -0
  28. package/{configs → ide/configs}/gemini-cli-mcp.json +2 -2
  29. package/{configs → ide/configs}/jetbrains-mcp.json +2 -2
  30. package/{configs → ide/configs}/opencode-mcp.json +2 -2
  31. package/{configs → ide/configs}/perplexity-mcp.json +2 -2
  32. package/{configs → ide/configs}/vscode-copilot-mcp.json +2 -2
  33. package/{configs → ide/configs}/windsurf-mcp.json +3 -3
  34. package/{configs → ide/configs}/zed-mcp.json +2 -2
  35. package/{hooks → ide/hooks}/context-hook.js +9 -20
  36. package/ide/hooks/memory-list-skill.js +70 -0
  37. package/ide/hooks/memory-profile-skill.js +101 -0
  38. package/ide/hooks/memory-recall-skill.js +62 -0
  39. package/ide/hooks/memory-remember-skill.js +68 -0
  40. package/ide/hooks/memory-reset-skill.js +160 -0
  41. package/{hooks → ide/hooks}/post-recall-hook.js +2 -2
  42. package/ide/integrations/langchain/README.md +106 -0
  43. package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +9 -0
  44. package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +201 -0
  45. package/ide/integrations/langchain/pyproject.toml +38 -0
  46. package/{src/learning → ide/integrations/langchain}/tests/__init__.py +1 -0
  47. package/ide/integrations/langchain/tests/test_chat_message_history.py +215 -0
  48. package/ide/integrations/langchain/tests/test_security.py +117 -0
  49. package/ide/integrations/llamaindex/README.md +81 -0
  50. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +9 -0
  51. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +316 -0
  52. package/ide/integrations/llamaindex/pyproject.toml +43 -0
  53. package/{src/lifecycle → ide/integrations/llamaindex}/tests/__init__.py +1 -2
  54. package/ide/integrations/llamaindex/tests/test_chat_store.py +294 -0
  55. package/ide/integrations/llamaindex/tests/test_security.py +241 -0
  56. package/{skills → ide/skills}/slm-build-graph/SKILL.md +6 -6
  57. package/{skills → ide/skills}/slm-list-recent/SKILL.md +5 -5
  58. package/{skills → ide/skills}/slm-recall/SKILL.md +5 -5
  59. package/{skills → ide/skills}/slm-remember/SKILL.md +6 -6
  60. package/{skills → ide/skills}/slm-show-patterns/SKILL.md +7 -7
  61. package/{skills → ide/skills}/slm-status/SKILL.md +9 -9
  62. package/{skills → ide/skills}/slm-switch-profile/SKILL.md +9 -9
  63. package/package.json +13 -22
  64. package/pyproject.toml +85 -0
  65. package/scripts/build-dmg.sh +417 -0
  66. package/scripts/install-skills.ps1 +334 -0
  67. package/{install.ps1 → scripts/install.ps1} +36 -4
  68. package/{install.sh → scripts/install.sh} +14 -13
  69. package/scripts/postinstall.js +2 -2
  70. package/scripts/start-dashboard.ps1 +52 -0
  71. package/scripts/start-dashboard.sh +41 -0
  72. package/scripts/sync-wiki.ps1 +127 -0
  73. package/scripts/sync-wiki.sh +82 -0
  74. package/scripts/test-dmg.sh +161 -0
  75. package/scripts/test-npm-package.ps1 +252 -0
  76. package/scripts/test-npm-package.sh +207 -0
  77. package/scripts/verify-install.ps1 +294 -0
  78. package/scripts/verify-install.sh +266 -0
  79. package/src/superlocalmemory/__init__.py +0 -0
  80. package/src/superlocalmemory/attribution/__init__.py +9 -0
  81. package/src/superlocalmemory/attribution/mathematical_dna.py +235 -0
  82. package/src/superlocalmemory/attribution/signer.py +153 -0
  83. package/src/superlocalmemory/attribution/watermark.py +189 -0
  84. package/src/superlocalmemory/cli/__init__.py +5 -0
  85. package/src/superlocalmemory/cli/commands.py +245 -0
  86. package/src/superlocalmemory/cli/main.py +89 -0
  87. package/src/superlocalmemory/cli/migrate_cmd.py +55 -0
  88. package/src/superlocalmemory/cli/post_install.py +99 -0
  89. package/src/superlocalmemory/cli/setup_wizard.py +129 -0
  90. package/src/superlocalmemory/compliance/__init__.py +0 -0
  91. package/src/superlocalmemory/compliance/abac.py +204 -0
  92. package/src/superlocalmemory/compliance/audit.py +314 -0
  93. package/src/superlocalmemory/compliance/eu_ai_act.py +131 -0
  94. package/src/superlocalmemory/compliance/gdpr.py +294 -0
  95. package/src/superlocalmemory/compliance/lifecycle.py +158 -0
  96. package/src/superlocalmemory/compliance/retention.py +232 -0
  97. package/src/superlocalmemory/compliance/scheduler.py +148 -0
  98. package/src/superlocalmemory/core/__init__.py +0 -0
  99. package/src/superlocalmemory/core/config.py +391 -0
  100. package/src/superlocalmemory/core/embeddings.py +293 -0
  101. package/src/superlocalmemory/core/engine.py +701 -0
  102. package/src/superlocalmemory/core/hooks.py +65 -0
  103. package/src/superlocalmemory/core/maintenance.py +172 -0
  104. package/src/superlocalmemory/core/modes.py +140 -0
  105. package/src/superlocalmemory/core/profiles.py +234 -0
  106. package/src/superlocalmemory/core/registry.py +117 -0
  107. package/src/superlocalmemory/dynamics/__init__.py +0 -0
  108. package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +223 -0
  109. package/src/superlocalmemory/encoding/__init__.py +0 -0
  110. package/src/superlocalmemory/encoding/consolidator.py +485 -0
  111. package/src/superlocalmemory/encoding/emotional.py +125 -0
  112. package/src/superlocalmemory/encoding/entity_resolver.py +525 -0
  113. package/src/superlocalmemory/encoding/entropy_gate.py +104 -0
  114. package/src/superlocalmemory/encoding/fact_extractor.py +775 -0
  115. package/src/superlocalmemory/encoding/foresight.py +91 -0
  116. package/src/superlocalmemory/encoding/graph_builder.py +302 -0
  117. package/src/superlocalmemory/encoding/observation_builder.py +160 -0
  118. package/src/superlocalmemory/encoding/scene_builder.py +183 -0
  119. package/src/superlocalmemory/encoding/signal_inference.py +90 -0
  120. package/src/superlocalmemory/encoding/temporal_parser.py +426 -0
  121. package/src/superlocalmemory/encoding/type_router.py +235 -0
  122. package/src/superlocalmemory/hooks/__init__.py +3 -0
  123. package/src/superlocalmemory/hooks/auto_capture.py +111 -0
  124. package/src/superlocalmemory/hooks/auto_recall.py +93 -0
  125. package/src/superlocalmemory/hooks/ide_connector.py +204 -0
  126. package/src/superlocalmemory/hooks/rules_engine.py +99 -0
  127. package/src/superlocalmemory/infra/__init__.py +3 -0
  128. package/src/superlocalmemory/infra/auth_middleware.py +82 -0
  129. package/src/superlocalmemory/infra/backup.py +317 -0
  130. package/src/superlocalmemory/infra/cache_manager.py +267 -0
  131. package/src/superlocalmemory/infra/event_bus.py +381 -0
  132. package/src/superlocalmemory/infra/rate_limiter.py +135 -0
  133. package/src/{webhook_dispatcher.py → superlocalmemory/infra/webhook_dispatcher.py} +104 -101
  134. package/src/superlocalmemory/learning/__init__.py +0 -0
  135. package/src/superlocalmemory/learning/adaptive.py +172 -0
  136. package/src/superlocalmemory/learning/behavioral.py +490 -0
  137. package/src/superlocalmemory/learning/behavioral_listener.py +94 -0
  138. package/src/superlocalmemory/learning/bootstrap.py +298 -0
  139. package/src/superlocalmemory/learning/cross_project.py +399 -0
  140. package/src/superlocalmemory/learning/database.py +376 -0
  141. package/src/superlocalmemory/learning/engagement.py +323 -0
  142. package/src/superlocalmemory/learning/features.py +138 -0
  143. package/src/superlocalmemory/learning/feedback.py +316 -0
  144. package/src/superlocalmemory/learning/outcomes.py +255 -0
  145. package/src/superlocalmemory/learning/project_context.py +366 -0
  146. package/src/superlocalmemory/learning/ranker.py +155 -0
  147. package/src/superlocalmemory/learning/source_quality.py +303 -0
  148. package/src/superlocalmemory/learning/workflows.py +309 -0
  149. package/src/superlocalmemory/llm/__init__.py +0 -0
  150. package/src/superlocalmemory/llm/backbone.py +316 -0
  151. package/src/superlocalmemory/math/__init__.py +0 -0
  152. package/src/superlocalmemory/math/fisher.py +356 -0
  153. package/src/superlocalmemory/math/langevin.py +398 -0
  154. package/src/superlocalmemory/math/sheaf.py +257 -0
  155. package/src/superlocalmemory/mcp/__init__.py +0 -0
  156. package/src/superlocalmemory/mcp/resources.py +245 -0
  157. package/src/superlocalmemory/mcp/server.py +61 -0
  158. package/src/superlocalmemory/mcp/tools.py +18 -0
  159. package/src/superlocalmemory/mcp/tools_core.py +305 -0
  160. package/src/superlocalmemory/mcp/tools_v28.py +223 -0
  161. package/src/superlocalmemory/mcp/tools_v3.py +286 -0
  162. package/src/superlocalmemory/retrieval/__init__.py +0 -0
  163. package/src/superlocalmemory/retrieval/agentic.py +295 -0
  164. package/src/superlocalmemory/retrieval/ann_index.py +223 -0
  165. package/src/superlocalmemory/retrieval/bm25_channel.py +185 -0
  166. package/src/superlocalmemory/retrieval/bridge_discovery.py +170 -0
  167. package/src/superlocalmemory/retrieval/engine.py +390 -0
  168. package/src/superlocalmemory/retrieval/entity_channel.py +179 -0
  169. package/src/superlocalmemory/retrieval/fusion.py +78 -0
  170. package/src/superlocalmemory/retrieval/profile_channel.py +105 -0
  171. package/src/superlocalmemory/retrieval/reranker.py +154 -0
  172. package/src/superlocalmemory/retrieval/semantic_channel.py +232 -0
  173. package/src/superlocalmemory/retrieval/strategy.py +96 -0
  174. package/src/superlocalmemory/retrieval/temporal_channel.py +175 -0
  175. package/src/superlocalmemory/server/__init__.py +1 -0
  176. package/src/superlocalmemory/server/api.py +248 -0
  177. package/src/superlocalmemory/server/routes/__init__.py +4 -0
  178. package/src/superlocalmemory/server/routes/agents.py +107 -0
  179. package/src/superlocalmemory/server/routes/backup.py +91 -0
  180. package/src/superlocalmemory/server/routes/behavioral.py +127 -0
  181. package/src/superlocalmemory/server/routes/compliance.py +160 -0
  182. package/src/superlocalmemory/server/routes/data_io.py +188 -0
  183. package/src/superlocalmemory/server/routes/events.py +183 -0
  184. package/src/superlocalmemory/server/routes/helpers.py +85 -0
  185. package/src/superlocalmemory/server/routes/learning.py +273 -0
  186. package/src/superlocalmemory/server/routes/lifecycle.py +116 -0
  187. package/src/superlocalmemory/server/routes/memories.py +399 -0
  188. package/src/superlocalmemory/server/routes/profiles.py +219 -0
  189. package/src/superlocalmemory/server/routes/stats.py +346 -0
  190. package/src/superlocalmemory/server/routes/v3_api.py +365 -0
  191. package/src/superlocalmemory/server/routes/ws.py +82 -0
  192. package/src/superlocalmemory/server/security_middleware.py +57 -0
  193. package/src/superlocalmemory/server/ui.py +245 -0
  194. package/src/superlocalmemory/storage/__init__.py +0 -0
  195. package/src/superlocalmemory/storage/access_control.py +182 -0
  196. package/src/superlocalmemory/storage/database.py +594 -0
  197. package/src/superlocalmemory/storage/migrations.py +303 -0
  198. package/src/superlocalmemory/storage/models.py +406 -0
  199. package/src/superlocalmemory/storage/schema.py +726 -0
  200. package/src/superlocalmemory/storage/v2_migrator.py +317 -0
  201. package/src/superlocalmemory/trust/__init__.py +0 -0
  202. package/src/superlocalmemory/trust/gate.py +130 -0
  203. package/src/superlocalmemory/trust/provenance.py +124 -0
  204. package/src/superlocalmemory/trust/scorer.py +347 -0
  205. package/src/superlocalmemory/trust/signals.py +153 -0
  206. package/ui/index.html +278 -5
  207. package/ui/js/auto-settings.js +70 -0
  208. package/ui/js/dashboard.js +90 -0
  209. package/ui/js/fact-detail.js +92 -0
  210. package/ui/js/feedback.js +2 -2
  211. package/ui/js/ide-status.js +102 -0
  212. package/ui/js/math-health.js +98 -0
  213. package/ui/js/recall-lab.js +127 -0
  214. package/ui/js/settings.js +2 -2
  215. package/ui/js/trust-dashboard.js +73 -0
  216. package/api_server.py +0 -724
  217. package/bin/aider-smart +0 -72
  218. package/bin/superlocalmemoryv2-learning +0 -4
  219. package/bin/superlocalmemoryv2-list +0 -3
  220. package/bin/superlocalmemoryv2-patterns +0 -4
  221. package/bin/superlocalmemoryv2-profile +0 -3
  222. package/bin/superlocalmemoryv2-recall +0 -3
  223. package/bin/superlocalmemoryv2-remember +0 -3
  224. package/bin/superlocalmemoryv2-reset +0 -3
  225. package/bin/superlocalmemoryv2-status +0 -3
  226. package/configs/chatgpt-desktop-mcp.json +0 -16
  227. package/configs/cursor-mcp.json +0 -15
  228. package/docs/SECURITY-QUICK-REFERENCE.md +0 -214
  229. package/hooks/memory-list-skill.js +0 -139
  230. package/hooks/memory-profile-skill.js +0 -273
  231. package/hooks/memory-recall-skill.js +0 -114
  232. package/hooks/memory-remember-skill.js +0 -127
  233. package/hooks/memory-reset-skill.js +0 -274
  234. package/mcp_server.py +0 -1800
  235. package/requirements-core.txt +0 -22
  236. package/requirements-learning.txt +0 -12
  237. package/requirements.txt +0 -12
  238. package/src/agent_registry.py +0 -411
  239. package/src/auth_middleware.py +0 -61
  240. package/src/auto_backup.py +0 -459
  241. package/src/behavioral/__init__.py +0 -49
  242. package/src/behavioral/behavioral_listener.py +0 -203
  243. package/src/behavioral/behavioral_patterns.py +0 -275
  244. package/src/behavioral/cross_project_transfer.py +0 -206
  245. package/src/behavioral/outcome_inference.py +0 -194
  246. package/src/behavioral/outcome_tracker.py +0 -193
  247. package/src/behavioral/tests/__init__.py +0 -4
  248. package/src/behavioral/tests/test_behavioral_integration.py +0 -108
  249. package/src/behavioral/tests/test_behavioral_patterns.py +0 -150
  250. package/src/behavioral/tests/test_cross_project_transfer.py +0 -142
  251. package/src/behavioral/tests/test_mcp_behavioral.py +0 -139
  252. package/src/behavioral/tests/test_mcp_report_outcome.py +0 -117
  253. package/src/behavioral/tests/test_outcome_inference.py +0 -107
  254. package/src/behavioral/tests/test_outcome_tracker.py +0 -96
  255. package/src/cache_manager.py +0 -518
  256. package/src/compliance/__init__.py +0 -48
  257. package/src/compliance/abac_engine.py +0 -149
  258. package/src/compliance/abac_middleware.py +0 -116
  259. package/src/compliance/audit_db.py +0 -215
  260. package/src/compliance/audit_logger.py +0 -148
  261. package/src/compliance/retention_manager.py +0 -289
  262. package/src/compliance/retention_scheduler.py +0 -186
  263. package/src/compliance/tests/__init__.py +0 -4
  264. package/src/compliance/tests/test_abac_enforcement.py +0 -95
  265. package/src/compliance/tests/test_abac_engine.py +0 -124
  266. package/src/compliance/tests/test_abac_mcp_integration.py +0 -118
  267. package/src/compliance/tests/test_audit_db.py +0 -123
  268. package/src/compliance/tests/test_audit_logger.py +0 -98
  269. package/src/compliance/tests/test_mcp_audit.py +0 -128
  270. package/src/compliance/tests/test_mcp_retention_policy.py +0 -125
  271. package/src/compliance/tests/test_retention_manager.py +0 -131
  272. package/src/compliance/tests/test_retention_scheduler.py +0 -99
  273. package/src/compression/__init__.py +0 -25
  274. package/src/compression/cli.py +0 -150
  275. package/src/compression/cold_storage.py +0 -217
  276. package/src/compression/config.py +0 -72
  277. package/src/compression/orchestrator.py +0 -133
  278. package/src/compression/tier2_compressor.py +0 -228
  279. package/src/compression/tier3_compressor.py +0 -153
  280. package/src/compression/tier_classifier.py +0 -148
  281. package/src/db_connection_manager.py +0 -536
  282. package/src/embedding_engine.py +0 -63
  283. package/src/embeddings/__init__.py +0 -47
  284. package/src/embeddings/cache.py +0 -70
  285. package/src/embeddings/cli.py +0 -113
  286. package/src/embeddings/constants.py +0 -47
  287. package/src/embeddings/database.py +0 -91
  288. package/src/embeddings/engine.py +0 -247
  289. package/src/embeddings/model_loader.py +0 -145
  290. package/src/event_bus.py +0 -562
  291. package/src/graph/__init__.py +0 -36
  292. package/src/graph/build_helpers.py +0 -74
  293. package/src/graph/cli.py +0 -87
  294. package/src/graph/cluster_builder.py +0 -188
  295. package/src/graph/cluster_summary.py +0 -148
  296. package/src/graph/constants.py +0 -47
  297. package/src/graph/edge_builder.py +0 -162
  298. package/src/graph/entity_extractor.py +0 -95
  299. package/src/graph/graph_core.py +0 -226
  300. package/src/graph/graph_search.py +0 -231
  301. package/src/graph/hierarchical.py +0 -207
  302. package/src/graph/schema.py +0 -99
  303. package/src/graph_engine.py +0 -52
  304. package/src/hnsw_index.py +0 -628
  305. package/src/hybrid_search.py +0 -46
  306. package/src/learning/__init__.py +0 -217
  307. package/src/learning/adaptive_ranker.py +0 -682
  308. package/src/learning/bootstrap/__init__.py +0 -69
  309. package/src/learning/bootstrap/constants.py +0 -93
  310. package/src/learning/bootstrap/db_queries.py +0 -316
  311. package/src/learning/bootstrap/sampling.py +0 -82
  312. package/src/learning/bootstrap/text_utils.py +0 -71
  313. package/src/learning/cross_project_aggregator.py +0 -857
  314. package/src/learning/db/__init__.py +0 -40
  315. package/src/learning/db/constants.py +0 -44
  316. package/src/learning/db/schema.py +0 -279
  317. package/src/learning/engagement_tracker.py +0 -628
  318. package/src/learning/feature_extractor.py +0 -708
  319. package/src/learning/feedback_collector.py +0 -806
  320. package/src/learning/learning_db.py +0 -915
  321. package/src/learning/project_context_manager.py +0 -572
  322. package/src/learning/ranking/__init__.py +0 -33
  323. package/src/learning/ranking/constants.py +0 -84
  324. package/src/learning/ranking/helpers.py +0 -278
  325. package/src/learning/source_quality_scorer.py +0 -676
  326. package/src/learning/synthetic_bootstrap.py +0 -755
  327. package/src/learning/tests/test_adaptive_ranker.py +0 -325
  328. package/src/learning/tests/test_adaptive_ranker_v28.py +0 -60
  329. package/src/learning/tests/test_aggregator.py +0 -306
  330. package/src/learning/tests/test_auto_retrain_v28.py +0 -35
  331. package/src/learning/tests/test_e2e_ranking_v28.py +0 -82
  332. package/src/learning/tests/test_feature_extractor_v28.py +0 -93
  333. package/src/learning/tests/test_feedback_collector.py +0 -294
  334. package/src/learning/tests/test_learning_db.py +0 -602
  335. package/src/learning/tests/test_learning_db_v28.py +0 -110
  336. package/src/learning/tests/test_learning_init_v28.py +0 -48
  337. package/src/learning/tests/test_outcome_signals.py +0 -48
  338. package/src/learning/tests/test_project_context.py +0 -292
  339. package/src/learning/tests/test_schema_migration.py +0 -319
  340. package/src/learning/tests/test_signal_inference.py +0 -397
  341. package/src/learning/tests/test_source_quality.py +0 -351
  342. package/src/learning/tests/test_synthetic_bootstrap.py +0 -429
  343. package/src/learning/tests/test_workflow_miner.py +0 -318
  344. package/src/learning/workflow_pattern_miner.py +0 -655
  345. package/src/lifecycle/__init__.py +0 -54
  346. package/src/lifecycle/bounded_growth.py +0 -239
  347. package/src/lifecycle/compaction_engine.py +0 -226
  348. package/src/lifecycle/lifecycle_engine.py +0 -355
  349. package/src/lifecycle/lifecycle_evaluator.py +0 -257
  350. package/src/lifecycle/lifecycle_scheduler.py +0 -130
  351. package/src/lifecycle/retention_policy.py +0 -285
  352. package/src/lifecycle/tests/test_bounded_growth.py +0 -193
  353. package/src/lifecycle/tests/test_compaction.py +0 -179
  354. package/src/lifecycle/tests/test_lifecycle_engine.py +0 -137
  355. package/src/lifecycle/tests/test_lifecycle_evaluation.py +0 -177
  356. package/src/lifecycle/tests/test_lifecycle_scheduler.py +0 -127
  357. package/src/lifecycle/tests/test_lifecycle_search.py +0 -109
  358. package/src/lifecycle/tests/test_mcp_compact.py +0 -149
  359. package/src/lifecycle/tests/test_mcp_lifecycle_status.py +0 -114
  360. package/src/lifecycle/tests/test_retention_policy.py +0 -162
  361. package/src/mcp_tools_v28.py +0 -281
  362. package/src/memory/__init__.py +0 -36
  363. package/src/memory/cli.py +0 -205
  364. package/src/memory/constants.py +0 -39
  365. package/src/memory/helpers.py +0 -28
  366. package/src/memory/schema.py +0 -166
  367. package/src/memory-profiles.py +0 -595
  368. package/src/memory-reset.py +0 -491
  369. package/src/memory_compression.py +0 -989
  370. package/src/memory_store_v2.py +0 -1155
  371. package/src/migrate_v1_to_v2.py +0 -629
  372. package/src/pattern_learner.py +0 -34
  373. package/src/patterns/__init__.py +0 -24
  374. package/src/patterns/analyzers.py +0 -251
  375. package/src/patterns/learner.py +0 -271
  376. package/src/patterns/scoring.py +0 -171
  377. package/src/patterns/store.py +0 -225
  378. package/src/patterns/terminology.py +0 -140
  379. package/src/provenance_tracker.py +0 -312
  380. package/src/qualixar_attribution.py +0 -139
  381. package/src/qualixar_watermark.py +0 -78
  382. package/src/query_optimizer.py +0 -511
  383. package/src/rate_limiter.py +0 -83
  384. package/src/search/__init__.py +0 -20
  385. package/src/search/cli.py +0 -77
  386. package/src/search/constants.py +0 -26
  387. package/src/search/engine.py +0 -241
  388. package/src/search/fusion.py +0 -122
  389. package/src/search/index_loader.py +0 -114
  390. package/src/search/methods.py +0 -162
  391. package/src/search_engine_v2.py +0 -401
  392. package/src/setup_validator.py +0 -482
  393. package/src/subscription_manager.py +0 -391
  394. package/src/tree/__init__.py +0 -59
  395. package/src/tree/builder.py +0 -185
  396. package/src/tree/nodes.py +0 -202
  397. package/src/tree/queries.py +0 -257
  398. package/src/tree/schema.py +0 -80
  399. package/src/tree_manager.py +0 -19
  400. package/src/trust/__init__.py +0 -45
  401. package/src/trust/constants.py +0 -66
  402. package/src/trust/queries.py +0 -157
  403. package/src/trust/schema.py +0 -95
  404. package/src/trust/scorer.py +0 -299
  405. package/src/trust/signals.py +0 -95
  406. package/src/trust_scorer.py +0 -44
  407. package/ui/app.js +0 -1588
  408. package/ui/js/graph-cytoscape-monolithic-backup.js +0 -1168
  409. package/ui/js/graph-cytoscape.js +0 -1168
  410. package/ui/js/graph-d3-backup.js +0 -32
  411. package/ui/js/graph.js +0 -32
  412. package/ui_server.py +0 -266
  413. /package/docs/{ACCESSIBILITY.md → v2-archive/ACCESSIBILITY.md} +0 -0
  414. /package/docs/{ARCHITECTURE.md → v2-archive/ARCHITECTURE.md} +0 -0
  415. /package/docs/{CLI-COMMANDS-REFERENCE.md → v2-archive/CLI-COMMANDS-REFERENCE.md} +0 -0
  416. /package/docs/{COMPRESSION-README.md → v2-archive/COMPRESSION-README.md} +0 -0
  417. /package/docs/{FRAMEWORK-INTEGRATIONS.md → v2-archive/FRAMEWORK-INTEGRATIONS.md} +0 -0
  418. /package/docs/{MCP-MANUAL-SETUP.md → v2-archive/MCP-MANUAL-SETUP.md} +0 -0
  419. /package/docs/{MCP-TROUBLESHOOTING.md → v2-archive/MCP-TROUBLESHOOTING.md} +0 -0
  420. /package/docs/{PATTERN-LEARNING.md → v2-archive/PATTERN-LEARNING.md} +0 -0
  421. /package/docs/{PROFILES-GUIDE.md → v2-archive/PROFILES-GUIDE.md} +0 -0
  422. /package/docs/{RESET-GUIDE.md → v2-archive/RESET-GUIDE.md} +0 -0
  423. /package/docs/{SEARCH-ENGINE-V2.2.0.md → v2-archive/SEARCH-ENGINE-V2.2.0.md} +0 -0
  424. /package/docs/{SEARCH-INTEGRATION-GUIDE.md → v2-archive/SEARCH-INTEGRATION-GUIDE.md} +0 -0
  425. /package/docs/{UI-SERVER.md → v2-archive/UI-SERVER.md} +0 -0
  426. /package/docs/{UNIVERSAL-INTEGRATION.md → v2-archive/UNIVERSAL-INTEGRATION.md} +0 -0
  427. /package/docs/{V2.2.0-OPTIONAL-SEARCH.md → v2-archive/V2.2.0-OPTIONAL-SEARCH.md} +0 -0
  428. /package/docs/{WINDOWS-INSTALL-README.txt → v2-archive/WINDOWS-INSTALL-README.txt} +0 -0
  429. /package/docs/{WINDOWS-POST-INSTALL.txt → v2-archive/WINDOWS-POST-INSTALL.txt} +0 -0
  430. /package/docs/{example_graph_usage.py → v2-archive/example_graph_usage.py} +0 -0
  431. /package/{completions → ide/completions}/slm.bash +0 -0
  432. /package/{completions → ide/completions}/slm.zsh +0 -0
  433. /package/{configs → ide/configs}/cody-commands.json +0 -0
  434. /package/{install-skills.sh → scripts/install-skills.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