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,318 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- import pytest
5
-
6
-
7
- # ---------------------------------------------------------------------------
8
- # Fixtures
9
- # ---------------------------------------------------------------------------
10
-
11
- @pytest.fixture(autouse=True)
12
- def reset_singleton():
13
- from src.learning.learning_db import LearningDB
14
- LearningDB.reset_instance()
15
- yield
16
- LearningDB.reset_instance()
17
-
18
-
19
- @pytest.fixture
20
- def learning_db(tmp_path):
21
- from src.learning.learning_db import LearningDB
22
- db_path = tmp_path / "learning.db"
23
- return LearningDB(db_path=db_path)
24
-
25
-
26
- @pytest.fixture
27
- def miner(learning_db):
28
- from src.learning.workflow_pattern_miner import WorkflowPatternMiner
29
- return WorkflowPatternMiner(learning_db=learning_db)
30
-
31
-
32
- @pytest.fixture
33
- def miner_no_db():
34
- from src.learning.workflow_pattern_miner import WorkflowPatternMiner
35
- return WorkflowPatternMiner(learning_db=None)
36
-
37
-
38
- # ---------------------------------------------------------------------------
39
- # Activity Classification
40
- # ---------------------------------------------------------------------------
41
-
42
- class TestClassifyActivity:
43
- """Test _classify_activity for all 7 types + unknown."""
44
-
45
- def test_docs(self, miner):
46
- assert miner._classify_activity("Updated the documentation for API") == "docs"
47
- assert miner._classify_activity("Added README and wiki pages") == "docs"
48
-
49
- def test_architecture(self, miner):
50
- assert miner._classify_activity("Designed the system architecture") == "architecture"
51
- assert miner._classify_activity("Created ERD for data model") == "architecture"
52
-
53
- def test_code(self, miner):
54
- assert miner._classify_activity("Implemented the new function for parsing") == "code"
55
- assert miner._classify_activity("Refactored the module structure") == "code"
56
-
57
- def test_test(self, miner):
58
- assert miner._classify_activity("Added pytest fixtures and assertions") == "test"
59
- assert miner._classify_activity("Wrote unit test for the parser") == "test"
60
-
61
- def test_debug(self, miner):
62
- assert miner._classify_activity("Fixed the bug in authentication") == "debug"
63
- assert miner._classify_activity("Analyzed error traceback in production") == "debug"
64
-
65
- def test_deploy(self, miner):
66
- assert miner._classify_activity("Deployed via Docker to production") == "deploy"
67
- assert miner._classify_activity("Updated the CI/CD pipeline") == "deploy"
68
-
69
- def test_config(self, miner):
70
- assert miner._classify_activity("Updated config settings and env variables") == "config"
71
- assert miner._classify_activity("Added package dependency to requirements") == "config"
72
-
73
- def test_unknown(self, miner):
74
- assert miner._classify_activity("Had a meeting about the roadmap") == "unknown"
75
- assert miner._classify_activity("") == "unknown"
76
- assert miner._classify_activity("random unrelated text") == "unknown"
77
-
78
- def test_word_boundary_matching(self, miner):
79
- """'test' should match 'test' but not 'latest'."""
80
- assert miner._classify_activity("ran the test suite") == "test"
81
- # "latest" contains "test" but word boundary prevents match
82
- # However, 'release' is a deploy keyword
83
- result = miner._classify_activity("checked the latest version of release")
84
- assert result == "deploy" # 'release' is deploy keyword
85
-
86
-
87
- # ---------------------------------------------------------------------------
88
- # Hour to Bucket Mapping
89
- # ---------------------------------------------------------------------------
90
-
91
- class TestHourToBucket:
92
- def test_night_hours(self, miner):
93
- for hour in [0, 1, 2, 3, 4, 5]:
94
- assert miner._hour_to_bucket(hour) == "night", f"hour={hour}"
95
-
96
- def test_morning_hours(self, miner):
97
- for hour in [6, 7, 8, 9, 10, 11]:
98
- assert miner._hour_to_bucket(hour) == "morning", f"hour={hour}"
99
-
100
- def test_afternoon_hours(self, miner):
101
- for hour in [12, 13, 14, 15, 16, 17]:
102
- assert miner._hour_to_bucket(hour) == "afternoon", f"hour={hour}"
103
-
104
- def test_evening_hours(self, miner):
105
- for hour in [18, 19, 20, 21, 22, 23]:
106
- assert miner._hour_to_bucket(hour) == "evening", f"hour={hour}"
107
-
108
- def test_boundary_cases(self, miner):
109
- assert miner._hour_to_bucket(0) == "night"
110
- assert miner._hour_to_bucket(5) == "night"
111
- assert miner._hour_to_bucket(6) == "morning"
112
- assert miner._hour_to_bucket(11) == "morning"
113
- assert miner._hour_to_bucket(12) == "afternoon"
114
- assert miner._hour_to_bucket(17) == "afternoon"
115
- assert miner._hour_to_bucket(18) == "evening"
116
- assert miner._hour_to_bucket(23) == "evening"
117
-
118
-
119
- # ---------------------------------------------------------------------------
120
- # Sequence Mining
121
- # ---------------------------------------------------------------------------
122
-
123
- class TestMineSequences:
124
- def test_basic_sequence(self, miner):
125
- """A repeating pattern should be detected."""
126
- memories = []
127
- # Repeat: docs -> code -> test, 5 times
128
- activity_words = {
129
- "docs": "Updated the documentation",
130
- "code": "Implemented new feature function",
131
- "test": "Added pytest coverage",
132
- }
133
- for _ in range(5):
134
- for act in ["docs", "code", "test"]:
135
- memories.append({
136
- "content": activity_words[act],
137
- "created_at": "2026-02-16 10:00:00",
138
- })
139
-
140
- results = miner.mine_sequences(memories=memories, min_support=0.1)
141
- assert len(results) > 0
142
- # The docs->code->test pattern should appear
143
- sequences_as_tuples = [tuple(r["sequence"]) for r in results]
144
- assert ("docs", "code") in sequences_as_tuples or \
145
- ("code", "test") in sequences_as_tuples or \
146
- ("docs", "code", "test") in sequences_as_tuples
147
-
148
- def test_min_support_filter(self, miner):
149
- """High min_support should filter out rare 2-gram patterns.
150
-
151
- With 4 distinct activities (docs, code, deploy, debug), each 2-gram
152
- has support 1/3 ~ 0.33. Setting min_support=0.5 should exclude them.
153
- Note: longer n-grams (4-gram) may have support=1.0 because there is
154
- only 1 window of that length, so we specifically check 2-grams.
155
- """
156
- memories = [
157
- {"content": "Updated documentation", "created_at": "2026-02-16 10:00:00"},
158
- {"content": "Implemented function code", "created_at": "2026-02-16 11:00:00"},
159
- {"content": "Deployed to production", "created_at": "2026-02-16 12:00:00"},
160
- {"content": "Fixed the error bug", "created_at": "2026-02-16 13:00:00"},
161
- ]
162
- results = miner.mine_sequences(memories=memories, min_support=0.5)
163
- # Filter results to only 2-grams (which cannot reach 0.5 support)
164
- bigram_results = [r for r in results if r["length"] == 2]
165
- assert len(bigram_results) == 0
166
-
167
- def test_empty_memories(self, miner):
168
- results = miner.mine_sequences(memories=[], min_support=0.1)
169
- assert results == []
170
-
171
- def test_single_memory(self, miner):
172
- """Need at least 2 classified activities for sequence mining."""
173
- memories = [{"content": "one code function", "created_at": "2026-02-16 10:00:00"}]
174
- results = miner.mine_sequences(memories=memories, min_support=0.1)
175
- assert results == []
176
-
177
- def test_consecutive_identical_filtered(self, miner):
178
- """N-grams with consecutive identical activities are filtered as noise."""
179
- memories = [
180
- {"content": "code function", "created_at": "2026-02-16 10:00:00"},
181
- {"content": "code function", "created_at": "2026-02-16 11:00:00"},
182
- {"content": "code function", "created_at": "2026-02-16 12:00:00"},
183
- ]
184
- results = miner.mine_sequences(memories=memories, min_support=0.1)
185
- # All n-grams would be (code, code) or (code, code, code) -> filtered
186
- assert len(results) == 0
187
-
188
- def test_top_20_limit(self, miner):
189
- """Results should be capped at 20."""
190
- memories = []
191
- types = ["docs", "code", "test", "debug", "deploy", "config"]
192
- for i in range(100):
193
- memories.append({
194
- "content": f"Working on {types[i % len(types)]} implementation",
195
- "created_at": f"2026-02-16 {i % 24:02d}:00:00",
196
- })
197
- results = miner.mine_sequences(memories=memories, min_support=0.01)
198
- assert len(results) <= 20
199
-
200
-
201
- # ---------------------------------------------------------------------------
202
- # Temporal Pattern Mining
203
- # ---------------------------------------------------------------------------
204
-
205
- class TestMineTemporalPatterns:
206
- def test_morning_coding(self, miner):
207
- """Memories at morning hours with code content -> morning=code."""
208
- memories = []
209
- for hour in range(6, 12):
210
- memories.append({
211
- "content": "Implemented new function in the module",
212
- "created_at": f"2026-02-16 {hour:02d}:30:00",
213
- })
214
- result = miner.mine_temporal_patterns(memories=memories)
215
- assert "morning" in result
216
- assert result["morning"]["dominant_activity"] == "code"
217
- assert result["morning"]["evidence_count"] >= 5
218
-
219
- def test_minimum_evidence_threshold(self, miner):
220
- """Buckets with fewer than 5 evidence memories are omitted."""
221
- memories = [
222
- {"content": "Wrote code function", "created_at": "2026-02-16 09:00:00"},
223
- {"content": "Wrote code class", "created_at": "2026-02-16 10:00:00"},
224
- ]
225
- result = miner.mine_temporal_patterns(memories=memories)
226
- assert "morning" not in result # Only 2 morning memories, need 5+
227
-
228
- def test_time_bucketing(self, miner):
229
- """Verify that memories are assigned to the correct time bucket."""
230
- memories = []
231
- # 6 evening test activities (18-23)
232
- for i in range(6):
233
- memories.append({
234
- "content": f"Running pytest assertions {i}",
235
- "created_at": f"2026-02-16 {20 + (i % 4):02d}:00:00",
236
- })
237
- result = miner.mine_temporal_patterns(memories=memories)
238
- if "evening" in result:
239
- assert result["evening"]["dominant_activity"] == "test"
240
-
241
- def test_empty_memories(self, miner):
242
- result = miner.mine_temporal_patterns(memories=[])
243
- assert result == {}
244
-
245
- def test_only_unknown_activities(self, miner):
246
- """All unknown activities should produce empty result."""
247
- memories = [
248
- {"content": "random chat", "created_at": f"2026-02-16 {h:02d}:00:00"}
249
- for h in range(6, 12)
250
- ]
251
- result = miner.mine_temporal_patterns(memories=memories)
252
- assert "morning" not in result
253
-
254
-
255
- # ---------------------------------------------------------------------------
256
- # mine_all + persistence
257
- # ---------------------------------------------------------------------------
258
-
259
- class TestMineAll:
260
- def test_mine_all_persists(self, miner, learning_db):
261
- """mine_all should store patterns in learning_db."""
262
- memories = []
263
- for _ in range(3):
264
- memories.extend([
265
- {"content": "docs documentation wiki", "created_at": "2026-02-16 09:00:00"},
266
- {"content": "code implement function", "created_at": "2026-02-16 10:00:00"},
267
- {"content": "test pytest assertion", "created_at": "2026-02-16 11:00:00"},
268
- ])
269
-
270
- results = miner.mine_all(memories=memories)
271
- assert "sequences" in results
272
- assert "temporal" in results
273
-
274
- # Check that patterns were stored
275
- stored_seq = learning_db.get_workflow_patterns(pattern_type="sequence")
276
- stored_temp = learning_db.get_workflow_patterns(pattern_type="temporal")
277
- total_stored = len(stored_seq) + len(stored_temp)
278
- assert total_stored >= 0 # At least attempted storage
279
-
280
- def test_mine_all_no_db(self, miner_no_db):
281
- """mine_all without DB should still return results, just not persist."""
282
- memories = [
283
- {"content": "docs documentation", "created_at": "2026-02-16 09:00:00"},
284
- {"content": "code function", "created_at": "2026-02-16 10:00:00"},
285
- ]
286
- results = miner_no_db.mine_all(memories=memories)
287
- assert "sequences" in results
288
- assert "temporal" in results
289
-
290
-
291
- # ---------------------------------------------------------------------------
292
- # Parse Hour
293
- # ---------------------------------------------------------------------------
294
-
295
- class TestParseHour:
296
- def test_iso_format(self, miner):
297
- assert miner._parse_hour("2026-02-16T09:30:00") == 9
298
-
299
- def test_sqlite_format(self, miner):
300
- assert miner._parse_hour("2026-02-16 14:45:00") == 14
301
-
302
- def test_with_microseconds(self, miner):
303
- assert miner._parse_hour("2026-02-16 23:59:59.123456") == 23
304
-
305
- def test_date_only_returns_none(self, miner):
306
- # fromisoformat may or may not parse date-only; if it does, hour=0
307
- result = miner._parse_hour("2026-02-16")
308
- # Either None or 0 is acceptable
309
- assert result is None or result == 0
310
-
311
- def test_none_input(self, miner):
312
- assert miner._parse_hour(None) is None
313
-
314
- def test_empty_string(self, miner):
315
- assert miner._parse_hour("") is None
316
-
317
- def test_invalid_string(self, miner):
318
- assert miner._parse_hour("not-a-timestamp") is None