superlocalmemory 2.8.6 → 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 (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 +1 -1
  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,215 @@
1
+ #!/usr/bin/env python3
2
+ # SPDX-License-Identifier: MIT
3
+ # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
+ """SuperLocalMemory V2 - LangChain Chat Message History Tests
5
+
6
+ Functional tests for SuperLocalMemoryChatMessageHistory.
7
+ All tests use a temporary database -- the user's real memory is never touched.
8
+ """
9
+ import os
10
+ import tempfile
11
+
12
+ import pytest
13
+ from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
14
+
15
+ from langchain_superlocalmemory import SuperLocalMemoryChatMessageHistory
16
+
17
+
18
+ # ---------------------------------------------------------------------------
19
+ # Fixtures
20
+ # ---------------------------------------------------------------------------
21
+
22
+
23
+ @pytest.fixture
24
+ def tmp_db():
25
+ """Yield a path to a temporary SQLite database that is cleaned up after use."""
26
+ with tempfile.TemporaryDirectory() as d:
27
+ db = os.path.join(d, "test_memory.db")
28
+ yield db
29
+
30
+
31
+ @pytest.fixture
32
+ def history(tmp_db):
33
+ """Return a fresh history instance bound to the temp DB."""
34
+ return SuperLocalMemoryChatMessageHistory(session_id="test-session", db_path=tmp_db)
35
+
36
+
37
+ # ---------------------------------------------------------------------------
38
+ # Tests
39
+ # ---------------------------------------------------------------------------
40
+
41
+
42
+ def test_add_single_human_message(tmp_db):
43
+ """A single HumanMessage can be added and retrieved."""
44
+ h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
45
+ h.add_messages([HumanMessage(content="Hello, world!")])
46
+
47
+ msgs = h.messages
48
+ assert len(msgs) == 1
49
+ assert isinstance(msgs[0], HumanMessage)
50
+ assert msgs[0].content == "Hello, world!"
51
+
52
+
53
+ def test_add_single_ai_message(tmp_db):
54
+ """A single AIMessage can be added and retrieved."""
55
+ h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
56
+ h.add_messages([AIMessage(content="I am an AI.")])
57
+
58
+ msgs = h.messages
59
+ assert len(msgs) == 1
60
+ assert isinstance(msgs[0], AIMessage)
61
+ assert msgs[0].content == "I am an AI."
62
+
63
+
64
+ def test_add_multiple_messages(tmp_db):
65
+ """A batch of three messages is stored and all are retrievable."""
66
+ h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
67
+ h.add_messages([
68
+ HumanMessage(content="Hi"),
69
+ AIMessage(content="Hello"),
70
+ HumanMessage(content="How are you?"),
71
+ ])
72
+
73
+ msgs = h.messages
74
+ assert len(msgs) == 3
75
+ assert msgs[0].content == "Hi"
76
+ assert msgs[1].content == "Hello"
77
+ assert msgs[2].content == "How are you?"
78
+
79
+
80
+ def test_messages_order(tmp_db):
81
+ """Messages are returned in chronological (insertion) order."""
82
+ h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
83
+
84
+ h.add_messages([HumanMessage(content="first")])
85
+ h.add_messages([AIMessage(content="second")])
86
+ h.add_messages([HumanMessage(content="third")])
87
+
88
+ msgs = h.messages
89
+ assert [m.content for m in msgs] == ["first", "second", "third"]
90
+
91
+
92
+ def test_message_roundtrip(tmp_db):
93
+ """A HumanMessage with additional_kwargs survives serialization."""
94
+ h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
95
+
96
+ original = HumanMessage(
97
+ content="Test with kwargs",
98
+ additional_kwargs={"custom_key": "custom_value", "number": 42},
99
+ )
100
+ h.add_messages([original])
101
+
102
+ msgs = h.messages
103
+ assert len(msgs) == 1
104
+ assert msgs[0].content == "Test with kwargs"
105
+ assert msgs[0].additional_kwargs.get("custom_key") == "custom_value"
106
+ assert msgs[0].additional_kwargs.get("number") == 42
107
+
108
+
109
+ def test_system_message(tmp_db):
110
+ """A SystemMessage round-trips correctly."""
111
+ h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
112
+ h.add_messages([SystemMessage(content="You are a helpful assistant.")])
113
+
114
+ msgs = h.messages
115
+ assert len(msgs) == 1
116
+ assert isinstance(msgs[0], SystemMessage)
117
+ assert msgs[0].content == "You are a helpful assistant."
118
+
119
+
120
+ def test_clear(tmp_db):
121
+ """clear() removes all messages from the session."""
122
+ h = SuperLocalMemoryChatMessageHistory(session_id="s1", db_path=tmp_db)
123
+ h.add_messages([
124
+ HumanMessage(content="A"),
125
+ AIMessage(content="B"),
126
+ ])
127
+
128
+ assert len(h.messages) == 2
129
+ h.clear()
130
+ assert len(h.messages) == 0
131
+
132
+
133
+ def test_clear_only_affects_session(tmp_db):
134
+ """Clearing session A does not affect session B."""
135
+ ha = SuperLocalMemoryChatMessageHistory(session_id="session-a", db_path=tmp_db)
136
+ hb = SuperLocalMemoryChatMessageHistory(session_id="session-b", db_path=tmp_db)
137
+
138
+ ha.add_messages([HumanMessage(content="Message in A")])
139
+ hb.add_messages([HumanMessage(content="Message in B")])
140
+
141
+ ha.clear()
142
+
143
+ assert len(ha.messages) == 0
144
+ assert len(hb.messages) == 1
145
+ assert hb.messages[0].content == "Message in B"
146
+
147
+
148
+ def test_session_isolation(tmp_db):
149
+ """Two sessions with the same DB path do not see each other's messages."""
150
+ ha = SuperLocalMemoryChatMessageHistory(session_id="alpha", db_path=tmp_db)
151
+ hb = SuperLocalMemoryChatMessageHistory(session_id="beta", db_path=tmp_db)
152
+
153
+ ha.add_messages([HumanMessage(content="Alpha message")])
154
+ hb.add_messages([HumanMessage(content="Beta message")])
155
+
156
+ assert len(ha.messages) == 1
157
+ assert ha.messages[0].content == "Alpha message"
158
+
159
+ assert len(hb.messages) == 1
160
+ assert hb.messages[0].content == "Beta message"
161
+
162
+
163
+ def test_empty_session(tmp_db):
164
+ """A brand-new session returns an empty list."""
165
+ h = SuperLocalMemoryChatMessageHistory(session_id="empty", db_path=tmp_db)
166
+ assert h.messages == []
167
+
168
+
169
+ def test_persistence_across_instances(tmp_db):
170
+ """Messages persist when a new Python instance is created with the same session_id."""
171
+ h1 = SuperLocalMemoryChatMessageHistory(session_id="persist", db_path=tmp_db)
172
+ h1.add_messages([HumanMessage(content="Persisted message")])
173
+
174
+ # Create a completely new instance pointing at the same DB + session.
175
+ h2 = SuperLocalMemoryChatMessageHistory(session_id="persist", db_path=tmp_db)
176
+ msgs = h2.messages
177
+ assert len(msgs) == 1
178
+ assert msgs[0].content == "Persisted message"
179
+
180
+
181
+ def test_unicode_content(tmp_db):
182
+ """Unicode and emoji content round-trips correctly."""
183
+ h = SuperLocalMemoryChatMessageHistory(session_id="unicode", db_path=tmp_db)
184
+ text = "Bonjour le monde! Hola mundo! Konnichiwa sekai!"
185
+ h.add_messages([HumanMessage(content=text)])
186
+
187
+ msgs = h.messages
188
+ assert len(msgs) == 1
189
+ assert msgs[0].content == text
190
+
191
+
192
+ def test_long_content(tmp_db):
193
+ """A 10K character message is stored and retrieved intact."""
194
+ h = SuperLocalMemoryChatMessageHistory(session_id="long", db_path=tmp_db)
195
+ long_text = "A" * 10_000
196
+ h.add_messages([HumanMessage(content=long_text)])
197
+
198
+ msgs = h.messages
199
+ assert len(msgs) == 1
200
+ assert len(msgs[0].content) == 10_000
201
+ assert msgs[0].content == long_text
202
+
203
+
204
+ def test_special_chars_session_id(tmp_db):
205
+ """Session IDs with dots, dashes, and underscores work correctly."""
206
+ for sid in ["my.session.123", "my-session-456", "my_session_789", "a.b-c_d"]:
207
+ h = SuperLocalMemoryChatMessageHistory(session_id=sid, db_path=tmp_db)
208
+ h.add_messages([HumanMessage(content=f"msg for {sid}")])
209
+
210
+ msgs = h.messages
211
+ assert len(msgs) == 1, f"Failed for session_id={sid}"
212
+ assert msgs[0].content == f"msg for {sid}"
213
+
214
+ h.clear()
215
+ assert len(h.messages) == 0, f"clear() failed for session_id={sid}"
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env python3
2
+ # SPDX-License-Identifier: MIT
3
+ # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
+ """SuperLocalMemory V2 - LangChain Integration Security Tests
5
+
6
+ Security tests covering SQL injection, XSS payloads, oversized content,
7
+ and edge-case session identifiers. These mirror OWASP agentic-AI concerns
8
+ relevant to a local-first memory store.
9
+ """
10
+ import os
11
+ import tempfile
12
+
13
+ import pytest
14
+ from langchain_core.messages import HumanMessage
15
+
16
+ from langchain_superlocalmemory import SuperLocalMemoryChatMessageHistory
17
+
18
+
19
+ @pytest.fixture
20
+ def tmp_db():
21
+ """Yield a path to a temporary SQLite database that is cleaned up after use."""
22
+ with tempfile.TemporaryDirectory() as d:
23
+ db = os.path.join(d, "test_memory.db")
24
+ yield db
25
+
26
+
27
+ # ---------------------------------------------------------------------------
28
+ # SQL injection
29
+ # ---------------------------------------------------------------------------
30
+
31
+
32
+ def test_sql_injection_session_id(tmp_db):
33
+ """SQL injection in session_id should not work."""
34
+ history = SuperLocalMemoryChatMessageHistory(
35
+ session_id="'; DROP TABLE memories; --", db_path=tmp_db
36
+ )
37
+ history.add_messages([HumanMessage(content="test")])
38
+ assert len(history.messages) == 1 # Should work normally, not crash
39
+
40
+
41
+ def test_sql_injection_content(tmp_db):
42
+ """SQL injection in message content is safely stored and retrieved."""
43
+ history = SuperLocalMemoryChatMessageHistory(session_id="test", db_path=tmp_db)
44
+ payload = "'; DROP TABLE memories; --"
45
+ history.add_messages([HumanMessage(content=payload)])
46
+
47
+ msgs = history.messages
48
+ assert len(msgs) == 1
49
+ assert msgs[0].content == payload
50
+
51
+
52
+ # ---------------------------------------------------------------------------
53
+ # XSS
54
+ # ---------------------------------------------------------------------------
55
+
56
+
57
+ def test_xss_content(tmp_db):
58
+ """XSS payloads are stored verbatim (no sanitization needed for storage)."""
59
+ history = SuperLocalMemoryChatMessageHistory(session_id="test", db_path=tmp_db)
60
+ payload = "<script>alert('xss')</script>"
61
+ history.add_messages([HumanMessage(content=payload)])
62
+
63
+ msgs = history.messages
64
+ assert len(msgs) == 1
65
+ assert "<script>" in msgs[0].content
66
+
67
+
68
+ # ---------------------------------------------------------------------------
69
+ # Size limits
70
+ # ---------------------------------------------------------------------------
71
+
72
+
73
+ def test_large_content(tmp_db):
74
+ """A large message (near the SLM 1 MB limit) is stored and retrieved intact.
75
+
76
+ MemoryStoreV2 enforces MAX_CONTENT_SIZE = 1_000_000 on the *stored*
77
+ string, which is the JSON-serialized message (not the raw text). The
78
+ JSON envelope adds ~150 bytes of overhead, so we use 999_000 chars to
79
+ stay safely under the limit.
80
+ """
81
+ history = SuperLocalMemoryChatMessageHistory(session_id="test", db_path=tmp_db)
82
+ big_msg = "x" * 999_000
83
+ history.add_messages([HumanMessage(content=big_msg)])
84
+
85
+ msgs = history.messages
86
+ assert len(msgs) == 1
87
+ assert len(msgs[0].content) == 999_000
88
+
89
+
90
+ def test_oversized_content_raises(tmp_db):
91
+ """Content that exceeds SLM's 1 MB limit after serialization raises ValueError."""
92
+ history = SuperLocalMemoryChatMessageHistory(session_id="test", db_path=tmp_db)
93
+ # 1_000_000 chars + JSON overhead will exceed the 1 MB limit.
94
+ big_msg = "x" * 1_000_000
95
+ with pytest.raises(ValueError, match="exceeds maximum size"):
96
+ history.add_messages([HumanMessage(content=big_msg)])
97
+
98
+
99
+ # ---------------------------------------------------------------------------
100
+ # Edge-case session IDs
101
+ # ---------------------------------------------------------------------------
102
+
103
+
104
+ def test_empty_session_id(tmp_db):
105
+ """An empty string session_id still functions correctly."""
106
+ history = SuperLocalMemoryChatMessageHistory(session_id="", db_path=tmp_db)
107
+ history.add_messages([HumanMessage(content="test")])
108
+ assert len(history.messages) == 1
109
+
110
+
111
+ def test_null_bytes_session_id(tmp_db):
112
+ """Null bytes in session_id do not cause crashes."""
113
+ history = SuperLocalMemoryChatMessageHistory(
114
+ session_id="test\x00evil", db_path=tmp_db
115
+ )
116
+ history.add_messages([HumanMessage(content="test")])
117
+ assert len(history.messages) == 1
@@ -0,0 +1,81 @@
1
+ # LlamaIndex Chat Store — SuperLocalMemory V2
2
+
3
+ A LlamaIndex `BaseChatStore` implementation backed by [SuperLocalMemory V2](https://github.com/varun369/SuperLocalMemoryV2). All chat history stays **100% local** on your machine — zero cloud calls, zero telemetry, zero API keys.
4
+
5
+ ## Prerequisites
6
+
7
+ - Python 3.9+
8
+ - SuperLocalMemory V2 installed (`~/.claude-memory/` must exist)
9
+
10
+ ```bash
11
+ # Install SuperLocalMemory V2 (one-time)
12
+ curl -fsSL https://raw.githubusercontent.com/varun369/SuperLocalMemoryV2/main/install.sh | bash
13
+ ```
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ pip install llama-index-storage-chat-store-superlocalmemory
19
+ ```
20
+
21
+ ## Quick Start
22
+
23
+ ```python
24
+ from llama_index.core.memory import ChatMemoryBuffer
25
+ from llama_index.core.base.llms.types import ChatMessage, MessageRole
26
+ from llama_index.storage.chat_store.superlocalmemory import SuperLocalMemoryChatStore
27
+
28
+ # Create the chat store (uses default SLM database)
29
+ chat_store = SuperLocalMemoryChatStore()
30
+
31
+ # Use with ChatMemoryBuffer for automatic conversation management
32
+ memory = ChatMemoryBuffer.from_defaults(
33
+ chat_store=chat_store,
34
+ chat_store_key="user-123",
35
+ token_limit=3000,
36
+ )
37
+
38
+ # Or use directly for manual message management
39
+ chat_store.add_message("session-1", ChatMessage(role=MessageRole.USER, content="Hello!"))
40
+ chat_store.add_message("session-1", ChatMessage(role=MessageRole.ASSISTANT, content="Hi there!"))
41
+
42
+ messages = chat_store.get_messages("session-1")
43
+ print(messages) # [ChatMessage(role=user, content="Hello!"), ChatMessage(role=assistant, content="Hi there!")]
44
+
45
+ # List all session keys
46
+ keys = chat_store.get_keys()
47
+
48
+ # Delete a session
49
+ chat_store.delete_messages("session-1")
50
+ ```
51
+
52
+ ## Features
53
+
54
+ - **100% Local** — All data stored in SQLite at `~/.claude-memory/memory.db`
55
+ - **Zero Cloud** — No API keys, no subscriptions, no data leaves your machine
56
+ - **Shared Memory** — Chat history is accessible from Claude, Cursor, Windsurf, and 16+ other AI tools via SuperLocalMemory
57
+ - **Session Isolation** — Each chat key is cleanly isolated using SLM tags
58
+ - **Persistent** — Survives process restarts (SQLite-backed, not in-memory)
59
+ - **Full BaseChatStore API** — `set_messages`, `get_messages`, `add_message`, `delete_messages`, `delete_message`, `delete_last_message`, `get_keys`
60
+ - **Async Support** — Async methods inherited from BaseChatStore (delegates to sync via `asyncio.to_thread`)
61
+
62
+ ## How It Works
63
+
64
+ Each chat message is stored as a separate memory entry in SuperLocalMemory V2:
65
+ - **Content**: JSON-serialized `{role, content, additional_kwargs}`
66
+ - **Tag**: `llamaindex:chat:<session_key>` for session isolation
67
+ - **Project**: `llamaindex` for easy identification
68
+ - **Importance**: 3 (low, since chat messages are transient)
69
+
70
+ ## Custom Database Path
71
+
72
+ ```python
73
+ # Use a custom database file
74
+ chat_store = SuperLocalMemoryChatStore(db_path="/path/to/custom/memory.db")
75
+ ```
76
+
77
+ ## Links
78
+
79
+ - [SuperLocalMemory V2](https://github.com/varun369/SuperLocalMemoryV2)
80
+ - [LlamaIndex Documentation](https://docs.llamaindex.ai/)
81
+ - [LlamaIndex Chat Stores Guide](https://docs.llamaindex.ai/en/stable/module_guides/storing/chat_stores/)
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env python3
2
+ # SPDX-License-Identifier: MIT
3
+ # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
+ from llama_index.storage.chat_store.superlocalmemory.base import (
5
+ SuperLocalMemoryChatStore,
6
+ )
7
+
8
+ __all__ = ["SuperLocalMemoryChatStore"]
9
+ __version__ = "0.1.0"