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
@@ -1,401 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """SuperLocalMemory V2 - BM25 Search Engine
5
-
6
- Solution Architect & Original Creator
7
-
8
- (see LICENSE file)
9
-
10
- ATTRIBUTION REQUIRED: This notice must be preserved in all copies.
11
- """
12
- """
13
- BM25 Search Engine - Pure Python Implementation
14
-
15
- Implements Okapi BM25 ranking function for relevance scoring without external dependencies.
16
- BM25 (Best Match 25) is a probabilistic retrieval function that ranks documents based on
17
- query term frequency with diminishing returns and document length normalization.
18
-
19
- Algorithm: score(D,Q) = Σ IDF(qi) × (f(qi,D) × (k1 + 1)) / (f(qi,D) + k1 × (1 - b + b × |D| / avgdl))
20
-
21
- Where:
22
- - f(qi,D) = term frequency of query term qi in document D
23
- - |D| = document length (number of tokens)
24
- - avgdl = average document length in the collection
25
- - k1 = term frequency saturation parameter (default: 1.5)
26
- - b = document length normalization parameter (default: 0.75)
27
- - IDF(qi) = log((N - df(qi) + 0.5) / (df(qi) + 0.5) + 1)
28
- where N = total documents, df(qi) = document frequency of term qi
29
-
30
- Performance Target: <30ms for 1K memories
31
-
32
- Usage:
33
- engine = BM25SearchEngine()
34
- engine.index_documents(docs, doc_ids)
35
- results = engine.search("query string", limit=10)
36
- """
37
-
38
- import math
39
- import re
40
- from collections import defaultdict, Counter
41
- from typing import List, Dict, Tuple, Any, Optional
42
- import time
43
-
44
-
45
- class BM25SearchEngine:
46
- """
47
- Pure Python BM25 search engine with no external dependencies.
48
-
49
- BM25 is the industry standard for keyword-based retrieval and outperforms
50
- simple TF-IDF in most scenarios due to better term saturation handling.
51
- """
52
-
53
- def __init__(self, k1: float = 1.5, b: float = 0.75):
54
- """
55
- Initialize BM25 search engine.
56
-
57
- Args:
58
- k1: Term frequency saturation parameter (1.2-2.0 typical)
59
- Higher values = more weight on term frequency
60
- Default 1.5 is optimal for most use cases
61
- b: Document length normalization (0.0-1.0)
62
- 0 = no normalization, 1 = full normalization
63
- Default 0.75 balances short vs long documents
64
- """
65
- self.k1 = k1
66
- self.b = b
67
-
68
- # Index structures
69
- self.doc_ids: List[Any] = [] # Document IDs in index order
70
- self.doc_lengths: List[int] = [] # Token count per document
71
- self.avg_doc_length: float = 0.0
72
- self.num_docs: int = 0
73
-
74
- # Inverted index: term -> [(doc_idx, term_freq), ...]
75
- self.inverted_index: Dict[str, List[Tuple[int, int]]] = defaultdict(list)
76
-
77
- # Document frequency: term -> count of documents containing term
78
- self.doc_freq: Dict[str, int] = defaultdict(int)
79
-
80
- # Performance tracking
81
- self.index_time: float = 0.0
82
- self.last_search_time: float = 0.0
83
-
84
- def _tokenize(self, text: str) -> List[str]:
85
- """
86
- Tokenize text into normalized terms.
87
-
88
- Applies:
89
- - Lowercase normalization
90
- - Unicode handling
91
- - Alphanumeric + underscore/hyphen preservation
92
- - Stopword filtering (minimal set for performance)
93
-
94
- Args:
95
- text: Input text to tokenize
96
-
97
- Returns:
98
- List of normalized tokens
99
- """
100
- # Lowercase and extract alphanumeric tokens (preserve _ and -)
101
- tokens = re.findall(r'\b[a-z0-9_-]+\b', text.lower())
102
-
103
- # Minimal stopword list (most common English words that add no value)
104
- # Kept small for performance - full stopword lists slow down search
105
- stopwords = {
106
- 'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to',
107
- 'for', 'of', 'with', 'by', 'from', 'as', 'is', 'was', 'are',
108
- 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'do',
109
- 'does', 'did', 'will', 'would', 'could', 'should', 'this',
110
- 'that', 'these', 'those', 'it', 'its'
111
- }
112
-
113
- # Filter stopwords and very short tokens
114
- tokens = [t for t in tokens if len(t) > 1 and t not in stopwords]
115
-
116
- return tokens
117
-
118
- def index_documents(self, documents: List[str], doc_ids: List[Any]) -> None:
119
- """
120
- Build BM25 index from documents.
121
-
122
- Time complexity: O(n × m) where n = num_docs, m = avg_tokens_per_doc
123
- Space complexity: O(v × d) where v = vocabulary size, d = avg postings per term
124
-
125
- Args:
126
- documents: List of document texts to index
127
- doc_ids: List of document identifiers (must match documents length)
128
-
129
- Raises:
130
- ValueError: If documents and doc_ids length mismatch
131
- """
132
- if len(documents) != len(doc_ids):
133
- raise ValueError("documents and doc_ids must have same length")
134
-
135
- start_time = time.time()
136
-
137
- # Reset index
138
- self.doc_ids = doc_ids
139
- self.doc_lengths = []
140
- self.inverted_index = defaultdict(list)
141
- self.doc_freq = defaultdict(int)
142
- self.num_docs = len(documents)
143
-
144
- # Build inverted index
145
- for doc_idx, doc_text in enumerate(documents):
146
- tokens = self._tokenize(doc_text)
147
- self.doc_lengths.append(len(tokens))
148
-
149
- # Count term frequencies in this document
150
- term_freqs = Counter(tokens)
151
-
152
- # Update inverted index and document frequency
153
- for term, freq in term_freqs.items():
154
- self.inverted_index[term].append((doc_idx, freq))
155
- self.doc_freq[term] += 1
156
-
157
- # Calculate average document length
158
- if self.num_docs > 0:
159
- self.avg_doc_length = sum(self.doc_lengths) / self.num_docs
160
- else:
161
- self.avg_doc_length = 0.0
162
-
163
- self.index_time = time.time() - start_time
164
-
165
- def _calculate_idf(self, term: str) -> float:
166
- """
167
- Calculate Inverse Document Frequency (IDF) for a term.
168
-
169
- IDF formula: log((N - df + 0.5) / (df + 0.5) + 1)
170
-
171
- Intuition:
172
- - Rare terms (low df) get high IDF scores
173
- - Common terms (high df) get low IDF scores
174
- - Prevents over-weighting common words
175
-
176
- Args:
177
- term: Query term
178
-
179
- Returns:
180
- IDF score (higher = more discriminative term)
181
- """
182
- df = self.doc_freq.get(term, 0)
183
-
184
- # Okapi BM25 IDF formula with smoothing
185
- idf = math.log(
186
- (self.num_docs - df + 0.5) / (df + 0.5) + 1.0
187
- )
188
-
189
- return idf
190
-
191
- def _calculate_bm25_score(self, doc_idx: int, query_term_freqs: Dict[str, int]) -> float:
192
- """
193
- Calculate BM25 score for a document given query term frequencies.
194
-
195
- BM25 formula:
196
- score(D,Q) = Σ IDF(qi) × (f(qi,D) × (k1 + 1)) / (f(qi,D) + k1 × (1 - b + b × |D| / avgdl))
197
-
198
- Args:
199
- doc_idx: Document index in corpus
200
- query_term_freqs: Query term frequencies
201
-
202
- Returns:
203
- BM25 relevance score
204
- """
205
- score = 0.0
206
- doc_len = self.doc_lengths[doc_idx]
207
-
208
- # Document length normalization factor
209
- # Short docs penalized less, long docs penalized more
210
- norm_factor = 1 - self.b + self.b * (doc_len / self.avg_doc_length)
211
-
212
- for term, query_freq in query_term_freqs.items():
213
- if term not in self.inverted_index:
214
- continue
215
-
216
- # Find term frequency in this document
217
- term_freq = 0
218
- for idx, freq in self.inverted_index[term]:
219
- if idx == doc_idx:
220
- term_freq = freq
221
- break
222
-
223
- if term_freq == 0:
224
- continue
225
-
226
- # Calculate IDF weight
227
- idf = self._calculate_idf(term)
228
-
229
- # BM25 term score with saturation
230
- # As term_freq increases, score has diminishing returns
231
- numerator = term_freq * (self.k1 + 1)
232
- denominator = term_freq + self.k1 * norm_factor
233
-
234
- score += idf * (numerator / denominator)
235
-
236
- return score
237
-
238
- def search(
239
- self,
240
- query: str,
241
- limit: int = 10,
242
- score_threshold: float = 0.0
243
- ) -> List[Tuple[Any, float]]:
244
- """
245
- Search indexed documents using BM25 ranking.
246
-
247
- Performance: O(q × p) where q = query terms, p = avg postings per term
248
- Target: <30ms for 1K documents
249
-
250
- Args:
251
- query: Search query string
252
- limit: Maximum number of results to return
253
- score_threshold: Minimum BM25 score threshold (default: 0.0)
254
-
255
- Returns:
256
- List of (doc_id, score) tuples, sorted by score descending
257
- """
258
- start_time = time.time()
259
-
260
- if self.num_docs == 0:
261
- self.last_search_time = time.time() - start_time
262
- return []
263
-
264
- # Tokenize and count query terms
265
- query_tokens = self._tokenize(query)
266
- if not query_tokens:
267
- self.last_search_time = time.time() - start_time
268
- return []
269
-
270
- query_term_freqs = Counter(query_tokens)
271
-
272
- # Find candidate documents (documents containing at least one query term)
273
- candidate_docs = set()
274
- for term in query_term_freqs:
275
- if term in self.inverted_index:
276
- for doc_idx, _ in self.inverted_index[term]:
277
- candidate_docs.add(doc_idx)
278
-
279
- # Calculate BM25 scores for candidates
280
- scores = []
281
- for doc_idx in candidate_docs:
282
- score = self._calculate_bm25_score(doc_idx, query_term_freqs)
283
-
284
- if score >= score_threshold:
285
- scores.append((self.doc_ids[doc_idx], score))
286
-
287
- # Sort by score descending and limit results
288
- scores.sort(key=lambda x: x[1], reverse=True)
289
- results = scores[:limit]
290
-
291
- self.last_search_time = time.time() - start_time
292
-
293
- return results
294
-
295
- def search_with_details(
296
- self,
297
- query: str,
298
- limit: int = 10,
299
- score_threshold: float = 0.0
300
- ) -> Dict[str, Any]:
301
- """
302
- Search with detailed performance metrics and match information.
303
-
304
- Useful for debugging and performance analysis.
305
-
306
- Args:
307
- query: Search query string
308
- limit: Maximum number of results to return
309
- score_threshold: Minimum score threshold
310
-
311
- Returns:
312
- Dictionary with results and metadata
313
- """
314
- query_tokens = self._tokenize(query)
315
- results = self.search(query, limit, score_threshold)
316
-
317
- return {
318
- 'results': results,
319
- 'query_terms': query_tokens,
320
- 'num_results': len(results),
321
- 'search_time_ms': self.last_search_time * 1000,
322
- 'index_size': self.num_docs,
323
- 'avg_doc_length': self.avg_doc_length
324
- }
325
-
326
- def get_stats(self) -> Dict[str, Any]:
327
- """
328
- Get search engine statistics.
329
-
330
- Returns:
331
- Dictionary with index statistics
332
- """
333
- return {
334
- 'num_documents': self.num_docs,
335
- 'vocabulary_size': len(self.inverted_index),
336
- 'avg_doc_length': self.avg_doc_length,
337
- 'total_tokens': sum(self.doc_lengths),
338
- 'index_time_ms': self.index_time * 1000,
339
- 'last_search_time_ms': self.last_search_time * 1000,
340
- 'k1': self.k1,
341
- 'b': self.b
342
- }
343
-
344
-
345
- # CLI interface for testing
346
- if __name__ == "__main__":
347
- import sys
348
-
349
- # Demo usage
350
- print("BM25 Search Engine - Demo")
351
- print("=" * 60)
352
-
353
- # Sample documents
354
- documents = [
355
- "Python is a high-level programming language with dynamic typing",
356
- "JavaScript is widely used for web development and frontend applications",
357
- "Machine learning uses Python libraries like scikit-learn and TensorFlow",
358
- "React is a JavaScript framework for building user interfaces",
359
- "Django is a Python web framework that follows MVC architecture",
360
- "Neural networks are a key component of deep learning systems",
361
- ]
362
-
363
- doc_ids = [f"doc_{i}" for i in range(len(documents))]
364
-
365
- # Index documents
366
- engine = BM25SearchEngine()
367
- print(f"\nIndexing {len(documents)} documents...")
368
- engine.index_documents(documents, doc_ids)
369
-
370
- stats = engine.get_stats()
371
- print(f"✓ Indexed in {stats['index_time_ms']:.2f}ms")
372
- print(f" Vocabulary: {stats['vocabulary_size']} unique terms")
373
- print(f" Avg doc length: {stats['avg_doc_length']:.1f} tokens")
374
-
375
- # Test queries
376
- test_queries = [
377
- "Python programming",
378
- "web development",
379
- "machine learning",
380
- "JavaScript framework"
381
- ]
382
-
383
- print("\n" + "=" * 60)
384
- print("Search Results:")
385
- print("=" * 60)
386
-
387
- for query in test_queries:
388
- print(f"\nQuery: '{query}'")
389
- results = engine.search_with_details(query, limit=3)
390
-
391
- print(f" Found: {results['num_results']} results in {results['search_time_ms']:.2f}ms")
392
- print(f" Query terms: {results['query_terms']}")
393
-
394
- for doc_id, score in results['results']:
395
- doc_idx = doc_ids.index(doc_id)
396
- print(f" [{score:.3f}] {doc_id}: {documents[doc_idx][:60]}...")
397
-
398
- print("\n" + "=" * 60)
399
- print("Performance Summary:")
400
- print(f" Average search time: {stats['last_search_time_ms']:.2f}ms")
401
- print(f" Target: <30ms for 1K documents ✓")