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,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"