superlocalmemory 2.8.6 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/LICENSE +9 -1
  2. package/NOTICE +63 -0
  3. package/README.md +165 -480
  4. package/bin/slm +17 -449
  5. package/bin/slm-npm +62 -48
  6. package/conftest.py +5 -0
  7. package/docs/api-reference.md +284 -0
  8. package/docs/architecture.md +149 -0
  9. package/docs/auto-memory.md +150 -0
  10. package/docs/cli-reference.md +276 -0
  11. package/docs/compliance.md +191 -0
  12. package/docs/configuration.md +182 -0
  13. package/docs/getting-started.md +102 -0
  14. package/docs/ide-setup.md +261 -0
  15. package/docs/mcp-tools.md +220 -0
  16. package/docs/migration-from-v2.md +170 -0
  17. package/docs/profiles.md +173 -0
  18. package/docs/troubleshooting.md +310 -0
  19. package/{configs → ide/configs}/antigravity-mcp.json +3 -3
  20. package/ide/configs/chatgpt-desktop-mcp.json +16 -0
  21. package/{configs → ide/configs}/claude-desktop-mcp.json +3 -3
  22. package/{configs → ide/configs}/codex-mcp.toml +4 -4
  23. package/{configs → ide/configs}/continue-mcp.yaml +4 -3
  24. package/{configs → ide/configs}/continue-skills.yaml +6 -6
  25. package/ide/configs/cursor-mcp.json +15 -0
  26. package/{configs → ide/configs}/gemini-cli-mcp.json +2 -2
  27. package/{configs → ide/configs}/jetbrains-mcp.json +2 -2
  28. package/{configs → ide/configs}/opencode-mcp.json +2 -2
  29. package/{configs → ide/configs}/perplexity-mcp.json +2 -2
  30. package/{configs → ide/configs}/vscode-copilot-mcp.json +2 -2
  31. package/{configs → ide/configs}/windsurf-mcp.json +3 -3
  32. package/{configs → ide/configs}/zed-mcp.json +2 -2
  33. package/{hooks → ide/hooks}/context-hook.js +9 -20
  34. package/ide/hooks/memory-list-skill.js +70 -0
  35. package/ide/hooks/memory-profile-skill.js +101 -0
  36. package/ide/hooks/memory-recall-skill.js +62 -0
  37. package/ide/hooks/memory-remember-skill.js +68 -0
  38. package/ide/hooks/memory-reset-skill.js +160 -0
  39. package/{hooks → ide/hooks}/post-recall-hook.js +2 -2
  40. package/ide/integrations/langchain/README.md +106 -0
  41. package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +9 -0
  42. package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +201 -0
  43. package/ide/integrations/langchain/pyproject.toml +38 -0
  44. package/{src/learning → ide/integrations/langchain}/tests/__init__.py +1 -0
  45. package/ide/integrations/langchain/tests/test_chat_message_history.py +215 -0
  46. package/ide/integrations/langchain/tests/test_security.py +117 -0
  47. package/ide/integrations/llamaindex/README.md +81 -0
  48. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +9 -0
  49. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +316 -0
  50. package/ide/integrations/llamaindex/pyproject.toml +43 -0
  51. package/{src/lifecycle → ide/integrations/llamaindex}/tests/__init__.py +1 -2
  52. package/ide/integrations/llamaindex/tests/test_chat_store.py +294 -0
  53. package/ide/integrations/llamaindex/tests/test_security.py +241 -0
  54. package/{skills → ide/skills}/slm-build-graph/SKILL.md +6 -6
  55. package/{skills → ide/skills}/slm-list-recent/SKILL.md +5 -5
  56. package/{skills → ide/skills}/slm-recall/SKILL.md +5 -5
  57. package/{skills → ide/skills}/slm-remember/SKILL.md +6 -6
  58. package/{skills → ide/skills}/slm-show-patterns/SKILL.md +7 -7
  59. package/{skills → ide/skills}/slm-status/SKILL.md +9 -9
  60. package/{skills → ide/skills}/slm-switch-profile/SKILL.md +9 -9
  61. package/package.json +13 -22
  62. package/pyproject.toml +85 -0
  63. package/scripts/build-dmg.sh +417 -0
  64. package/scripts/install-skills.ps1 +334 -0
  65. package/scripts/postinstall.js +2 -2
  66. package/scripts/start-dashboard.ps1 +52 -0
  67. package/scripts/start-dashboard.sh +41 -0
  68. package/scripts/sync-wiki.ps1 +127 -0
  69. package/scripts/sync-wiki.sh +82 -0
  70. package/scripts/test-dmg.sh +161 -0
  71. package/scripts/test-npm-package.ps1 +252 -0
  72. package/scripts/test-npm-package.sh +207 -0
  73. package/scripts/verify-install.ps1 +294 -0
  74. package/scripts/verify-install.sh +266 -0
  75. package/src/superlocalmemory/__init__.py +0 -0
  76. package/src/superlocalmemory/attribution/__init__.py +9 -0
  77. package/src/superlocalmemory/attribution/mathematical_dna.py +235 -0
  78. package/src/superlocalmemory/attribution/signer.py +153 -0
  79. package/src/superlocalmemory/attribution/watermark.py +189 -0
  80. package/src/superlocalmemory/cli/__init__.py +5 -0
  81. package/src/superlocalmemory/cli/commands.py +245 -0
  82. package/src/superlocalmemory/cli/main.py +89 -0
  83. package/src/superlocalmemory/cli/migrate_cmd.py +55 -0
  84. package/src/superlocalmemory/cli/post_install.py +99 -0
  85. package/src/superlocalmemory/cli/setup_wizard.py +129 -0
  86. package/src/superlocalmemory/compliance/__init__.py +0 -0
  87. package/src/superlocalmemory/compliance/abac.py +204 -0
  88. package/src/superlocalmemory/compliance/audit.py +314 -0
  89. package/src/superlocalmemory/compliance/eu_ai_act.py +131 -0
  90. package/src/superlocalmemory/compliance/gdpr.py +294 -0
  91. package/src/superlocalmemory/compliance/lifecycle.py +158 -0
  92. package/src/superlocalmemory/compliance/retention.py +232 -0
  93. package/src/superlocalmemory/compliance/scheduler.py +148 -0
  94. package/src/superlocalmemory/core/__init__.py +0 -0
  95. package/src/superlocalmemory/core/config.py +391 -0
  96. package/src/superlocalmemory/core/embeddings.py +293 -0
  97. package/src/superlocalmemory/core/engine.py +701 -0
  98. package/src/superlocalmemory/core/hooks.py +65 -0
  99. package/src/superlocalmemory/core/maintenance.py +172 -0
  100. package/src/superlocalmemory/core/modes.py +140 -0
  101. package/src/superlocalmemory/core/profiles.py +234 -0
  102. package/src/superlocalmemory/core/registry.py +117 -0
  103. package/src/superlocalmemory/dynamics/__init__.py +0 -0
  104. package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +223 -0
  105. package/src/superlocalmemory/encoding/__init__.py +0 -0
  106. package/src/superlocalmemory/encoding/consolidator.py +485 -0
  107. package/src/superlocalmemory/encoding/emotional.py +125 -0
  108. package/src/superlocalmemory/encoding/entity_resolver.py +525 -0
  109. package/src/superlocalmemory/encoding/entropy_gate.py +104 -0
  110. package/src/superlocalmemory/encoding/fact_extractor.py +775 -0
  111. package/src/superlocalmemory/encoding/foresight.py +91 -0
  112. package/src/superlocalmemory/encoding/graph_builder.py +302 -0
  113. package/src/superlocalmemory/encoding/observation_builder.py +160 -0
  114. package/src/superlocalmemory/encoding/scene_builder.py +183 -0
  115. package/src/superlocalmemory/encoding/signal_inference.py +90 -0
  116. package/src/superlocalmemory/encoding/temporal_parser.py +426 -0
  117. package/src/superlocalmemory/encoding/type_router.py +235 -0
  118. package/src/superlocalmemory/hooks/__init__.py +3 -0
  119. package/src/superlocalmemory/hooks/auto_capture.py +111 -0
  120. package/src/superlocalmemory/hooks/auto_recall.py +93 -0
  121. package/src/superlocalmemory/hooks/ide_connector.py +204 -0
  122. package/src/superlocalmemory/hooks/rules_engine.py +99 -0
  123. package/src/superlocalmemory/infra/__init__.py +3 -0
  124. package/src/superlocalmemory/infra/auth_middleware.py +82 -0
  125. package/src/superlocalmemory/infra/backup.py +317 -0
  126. package/src/superlocalmemory/infra/cache_manager.py +267 -0
  127. package/src/superlocalmemory/infra/event_bus.py +381 -0
  128. package/src/superlocalmemory/infra/rate_limiter.py +135 -0
  129. package/src/{webhook_dispatcher.py → superlocalmemory/infra/webhook_dispatcher.py} +104 -101
  130. package/src/superlocalmemory/learning/__init__.py +0 -0
  131. package/src/superlocalmemory/learning/adaptive.py +172 -0
  132. package/src/superlocalmemory/learning/behavioral.py +490 -0
  133. package/src/superlocalmemory/learning/behavioral_listener.py +94 -0
  134. package/src/superlocalmemory/learning/bootstrap.py +298 -0
  135. package/src/superlocalmemory/learning/cross_project.py +399 -0
  136. package/src/superlocalmemory/learning/database.py +376 -0
  137. package/src/superlocalmemory/learning/engagement.py +323 -0
  138. package/src/superlocalmemory/learning/features.py +138 -0
  139. package/src/superlocalmemory/learning/feedback.py +316 -0
  140. package/src/superlocalmemory/learning/outcomes.py +255 -0
  141. package/src/superlocalmemory/learning/project_context.py +366 -0
  142. package/src/superlocalmemory/learning/ranker.py +155 -0
  143. package/src/superlocalmemory/learning/source_quality.py +303 -0
  144. package/src/superlocalmemory/learning/workflows.py +309 -0
  145. package/src/superlocalmemory/llm/__init__.py +0 -0
  146. package/src/superlocalmemory/llm/backbone.py +316 -0
  147. package/src/superlocalmemory/math/__init__.py +0 -0
  148. package/src/superlocalmemory/math/fisher.py +356 -0
  149. package/src/superlocalmemory/math/langevin.py +398 -0
  150. package/src/superlocalmemory/math/sheaf.py +257 -0
  151. package/src/superlocalmemory/mcp/__init__.py +0 -0
  152. package/src/superlocalmemory/mcp/resources.py +245 -0
  153. package/src/superlocalmemory/mcp/server.py +61 -0
  154. package/src/superlocalmemory/mcp/tools.py +18 -0
  155. package/src/superlocalmemory/mcp/tools_core.py +305 -0
  156. package/src/superlocalmemory/mcp/tools_v28.py +223 -0
  157. package/src/superlocalmemory/mcp/tools_v3.py +286 -0
  158. package/src/superlocalmemory/retrieval/__init__.py +0 -0
  159. package/src/superlocalmemory/retrieval/agentic.py +295 -0
  160. package/src/superlocalmemory/retrieval/ann_index.py +223 -0
  161. package/src/superlocalmemory/retrieval/bm25_channel.py +185 -0
  162. package/src/superlocalmemory/retrieval/bridge_discovery.py +170 -0
  163. package/src/superlocalmemory/retrieval/engine.py +390 -0
  164. package/src/superlocalmemory/retrieval/entity_channel.py +179 -0
  165. package/src/superlocalmemory/retrieval/fusion.py +78 -0
  166. package/src/superlocalmemory/retrieval/profile_channel.py +105 -0
  167. package/src/superlocalmemory/retrieval/reranker.py +154 -0
  168. package/src/superlocalmemory/retrieval/semantic_channel.py +232 -0
  169. package/src/superlocalmemory/retrieval/strategy.py +96 -0
  170. package/src/superlocalmemory/retrieval/temporal_channel.py +175 -0
  171. package/src/superlocalmemory/server/__init__.py +1 -0
  172. package/src/superlocalmemory/server/api.py +248 -0
  173. package/src/superlocalmemory/server/routes/__init__.py +4 -0
  174. package/src/superlocalmemory/server/routes/agents.py +107 -0
  175. package/src/superlocalmemory/server/routes/backup.py +91 -0
  176. package/src/superlocalmemory/server/routes/behavioral.py +127 -0
  177. package/src/superlocalmemory/server/routes/compliance.py +160 -0
  178. package/src/superlocalmemory/server/routes/data_io.py +188 -0
  179. package/src/superlocalmemory/server/routes/events.py +183 -0
  180. package/src/superlocalmemory/server/routes/helpers.py +85 -0
  181. package/src/superlocalmemory/server/routes/learning.py +273 -0
  182. package/src/superlocalmemory/server/routes/lifecycle.py +116 -0
  183. package/src/superlocalmemory/server/routes/memories.py +399 -0
  184. package/src/superlocalmemory/server/routes/profiles.py +219 -0
  185. package/src/superlocalmemory/server/routes/stats.py +346 -0
  186. package/src/superlocalmemory/server/routes/v3_api.py +365 -0
  187. package/src/superlocalmemory/server/routes/ws.py +82 -0
  188. package/src/superlocalmemory/server/security_middleware.py +57 -0
  189. package/src/superlocalmemory/server/ui.py +245 -0
  190. package/src/superlocalmemory/storage/__init__.py +0 -0
  191. package/src/superlocalmemory/storage/access_control.py +182 -0
  192. package/src/superlocalmemory/storage/database.py +594 -0
  193. package/src/superlocalmemory/storage/migrations.py +303 -0
  194. package/src/superlocalmemory/storage/models.py +406 -0
  195. package/src/superlocalmemory/storage/schema.py +726 -0
  196. package/src/superlocalmemory/storage/v2_migrator.py +317 -0
  197. package/src/superlocalmemory/trust/__init__.py +0 -0
  198. package/src/superlocalmemory/trust/gate.py +130 -0
  199. package/src/superlocalmemory/trust/provenance.py +124 -0
  200. package/src/superlocalmemory/trust/scorer.py +347 -0
  201. package/src/superlocalmemory/trust/signals.py +153 -0
  202. package/ui/index.html +278 -5
  203. package/ui/js/auto-settings.js +70 -0
  204. package/ui/js/dashboard.js +90 -0
  205. package/ui/js/fact-detail.js +92 -0
  206. package/ui/js/feedback.js +2 -2
  207. package/ui/js/ide-status.js +102 -0
  208. package/ui/js/math-health.js +98 -0
  209. package/ui/js/recall-lab.js +127 -0
  210. package/ui/js/settings.js +2 -2
  211. package/ui/js/trust-dashboard.js +73 -0
  212. package/api_server.py +0 -724
  213. package/bin/aider-smart +0 -72
  214. package/bin/superlocalmemoryv2-learning +0 -4
  215. package/bin/superlocalmemoryv2-list +0 -3
  216. package/bin/superlocalmemoryv2-patterns +0 -4
  217. package/bin/superlocalmemoryv2-profile +0 -3
  218. package/bin/superlocalmemoryv2-recall +0 -3
  219. package/bin/superlocalmemoryv2-remember +0 -3
  220. package/bin/superlocalmemoryv2-reset +0 -3
  221. package/bin/superlocalmemoryv2-status +0 -3
  222. package/configs/chatgpt-desktop-mcp.json +0 -16
  223. package/configs/cursor-mcp.json +0 -15
  224. package/hooks/memory-list-skill.js +0 -139
  225. package/hooks/memory-profile-skill.js +0 -273
  226. package/hooks/memory-recall-skill.js +0 -114
  227. package/hooks/memory-remember-skill.js +0 -127
  228. package/hooks/memory-reset-skill.js +0 -274
  229. package/mcp_server.py +0 -1808
  230. package/requirements-core.txt +0 -22
  231. package/requirements-learning.txt +0 -12
  232. package/requirements.txt +0 -12
  233. package/src/agent_registry.py +0 -411
  234. package/src/auth_middleware.py +0 -61
  235. package/src/auto_backup.py +0 -459
  236. package/src/behavioral/__init__.py +0 -49
  237. package/src/behavioral/behavioral_listener.py +0 -203
  238. package/src/behavioral/behavioral_patterns.py +0 -275
  239. package/src/behavioral/cross_project_transfer.py +0 -206
  240. package/src/behavioral/outcome_inference.py +0 -194
  241. package/src/behavioral/outcome_tracker.py +0 -193
  242. package/src/behavioral/tests/__init__.py +0 -4
  243. package/src/behavioral/tests/test_behavioral_integration.py +0 -108
  244. package/src/behavioral/tests/test_behavioral_patterns.py +0 -150
  245. package/src/behavioral/tests/test_cross_project_transfer.py +0 -142
  246. package/src/behavioral/tests/test_mcp_behavioral.py +0 -139
  247. package/src/behavioral/tests/test_mcp_report_outcome.py +0 -117
  248. package/src/behavioral/tests/test_outcome_inference.py +0 -107
  249. package/src/behavioral/tests/test_outcome_tracker.py +0 -96
  250. package/src/cache_manager.py +0 -518
  251. package/src/compliance/__init__.py +0 -48
  252. package/src/compliance/abac_engine.py +0 -149
  253. package/src/compliance/abac_middleware.py +0 -116
  254. package/src/compliance/audit_db.py +0 -215
  255. package/src/compliance/audit_logger.py +0 -148
  256. package/src/compliance/retention_manager.py +0 -289
  257. package/src/compliance/retention_scheduler.py +0 -186
  258. package/src/compliance/tests/__init__.py +0 -4
  259. package/src/compliance/tests/test_abac_enforcement.py +0 -95
  260. package/src/compliance/tests/test_abac_engine.py +0 -124
  261. package/src/compliance/tests/test_abac_mcp_integration.py +0 -118
  262. package/src/compliance/tests/test_audit_db.py +0 -123
  263. package/src/compliance/tests/test_audit_logger.py +0 -98
  264. package/src/compliance/tests/test_mcp_audit.py +0 -128
  265. package/src/compliance/tests/test_mcp_retention_policy.py +0 -125
  266. package/src/compliance/tests/test_retention_manager.py +0 -131
  267. package/src/compliance/tests/test_retention_scheduler.py +0 -99
  268. package/src/compression/__init__.py +0 -25
  269. package/src/compression/cli.py +0 -150
  270. package/src/compression/cold_storage.py +0 -217
  271. package/src/compression/config.py +0 -72
  272. package/src/compression/orchestrator.py +0 -133
  273. package/src/compression/tier2_compressor.py +0 -228
  274. package/src/compression/tier3_compressor.py +0 -153
  275. package/src/compression/tier_classifier.py +0 -148
  276. package/src/db_connection_manager.py +0 -536
  277. package/src/embedding_engine.py +0 -63
  278. package/src/embeddings/__init__.py +0 -47
  279. package/src/embeddings/cache.py +0 -70
  280. package/src/embeddings/cli.py +0 -113
  281. package/src/embeddings/constants.py +0 -47
  282. package/src/embeddings/database.py +0 -91
  283. package/src/embeddings/engine.py +0 -247
  284. package/src/embeddings/model_loader.py +0 -145
  285. package/src/event_bus.py +0 -562
  286. package/src/graph/__init__.py +0 -36
  287. package/src/graph/build_helpers.py +0 -74
  288. package/src/graph/cli.py +0 -87
  289. package/src/graph/cluster_builder.py +0 -188
  290. package/src/graph/cluster_summary.py +0 -148
  291. package/src/graph/constants.py +0 -47
  292. package/src/graph/edge_builder.py +0 -162
  293. package/src/graph/entity_extractor.py +0 -95
  294. package/src/graph/graph_core.py +0 -226
  295. package/src/graph/graph_search.py +0 -231
  296. package/src/graph/hierarchical.py +0 -207
  297. package/src/graph/schema.py +0 -99
  298. package/src/graph_engine.py +0 -52
  299. package/src/hnsw_index.py +0 -628
  300. package/src/hybrid_search.py +0 -46
  301. package/src/learning/__init__.py +0 -217
  302. package/src/learning/adaptive_ranker.py +0 -682
  303. package/src/learning/bootstrap/__init__.py +0 -69
  304. package/src/learning/bootstrap/constants.py +0 -93
  305. package/src/learning/bootstrap/db_queries.py +0 -316
  306. package/src/learning/bootstrap/sampling.py +0 -82
  307. package/src/learning/bootstrap/text_utils.py +0 -71
  308. package/src/learning/cross_project_aggregator.py +0 -857
  309. package/src/learning/db/__init__.py +0 -40
  310. package/src/learning/db/constants.py +0 -44
  311. package/src/learning/db/schema.py +0 -279
  312. package/src/learning/engagement_tracker.py +0 -628
  313. package/src/learning/feature_extractor.py +0 -708
  314. package/src/learning/feedback_collector.py +0 -806
  315. package/src/learning/learning_db.py +0 -915
  316. package/src/learning/project_context_manager.py +0 -572
  317. package/src/learning/ranking/__init__.py +0 -33
  318. package/src/learning/ranking/constants.py +0 -84
  319. package/src/learning/ranking/helpers.py +0 -278
  320. package/src/learning/source_quality_scorer.py +0 -676
  321. package/src/learning/synthetic_bootstrap.py +0 -755
  322. package/src/learning/tests/test_adaptive_ranker.py +0 -325
  323. package/src/learning/tests/test_adaptive_ranker_v28.py +0 -60
  324. package/src/learning/tests/test_aggregator.py +0 -306
  325. package/src/learning/tests/test_auto_retrain_v28.py +0 -35
  326. package/src/learning/tests/test_e2e_ranking_v28.py +0 -82
  327. package/src/learning/tests/test_feature_extractor_v28.py +0 -93
  328. package/src/learning/tests/test_feedback_collector.py +0 -294
  329. package/src/learning/tests/test_learning_db.py +0 -602
  330. package/src/learning/tests/test_learning_db_v28.py +0 -110
  331. package/src/learning/tests/test_learning_init_v28.py +0 -48
  332. package/src/learning/tests/test_outcome_signals.py +0 -48
  333. package/src/learning/tests/test_project_context.py +0 -292
  334. package/src/learning/tests/test_schema_migration.py +0 -319
  335. package/src/learning/tests/test_signal_inference.py +0 -397
  336. package/src/learning/tests/test_source_quality.py +0 -351
  337. package/src/learning/tests/test_synthetic_bootstrap.py +0 -429
  338. package/src/learning/tests/test_workflow_miner.py +0 -318
  339. package/src/learning/workflow_pattern_miner.py +0 -655
  340. package/src/lifecycle/__init__.py +0 -54
  341. package/src/lifecycle/bounded_growth.py +0 -239
  342. package/src/lifecycle/compaction_engine.py +0 -226
  343. package/src/lifecycle/lifecycle_engine.py +0 -355
  344. package/src/lifecycle/lifecycle_evaluator.py +0 -257
  345. package/src/lifecycle/lifecycle_scheduler.py +0 -130
  346. package/src/lifecycle/retention_policy.py +0 -285
  347. package/src/lifecycle/tests/test_bounded_growth.py +0 -193
  348. package/src/lifecycle/tests/test_compaction.py +0 -179
  349. package/src/lifecycle/tests/test_lifecycle_engine.py +0 -137
  350. package/src/lifecycle/tests/test_lifecycle_evaluation.py +0 -177
  351. package/src/lifecycle/tests/test_lifecycle_scheduler.py +0 -127
  352. package/src/lifecycle/tests/test_lifecycle_search.py +0 -109
  353. package/src/lifecycle/tests/test_mcp_compact.py +0 -149
  354. package/src/lifecycle/tests/test_mcp_lifecycle_status.py +0 -114
  355. package/src/lifecycle/tests/test_retention_policy.py +0 -162
  356. package/src/mcp_tools_v28.py +0 -281
  357. package/src/memory/__init__.py +0 -36
  358. package/src/memory/cli.py +0 -205
  359. package/src/memory/constants.py +0 -39
  360. package/src/memory/helpers.py +0 -28
  361. package/src/memory/schema.py +0 -166
  362. package/src/memory-profiles.py +0 -595
  363. package/src/memory-reset.py +0 -491
  364. package/src/memory_compression.py +0 -989
  365. package/src/memory_store_v2.py +0 -1155
  366. package/src/migrate_v1_to_v2.py +0 -629
  367. package/src/pattern_learner.py +0 -34
  368. package/src/patterns/__init__.py +0 -24
  369. package/src/patterns/analyzers.py +0 -251
  370. package/src/patterns/learner.py +0 -271
  371. package/src/patterns/scoring.py +0 -171
  372. package/src/patterns/store.py +0 -225
  373. package/src/patterns/terminology.py +0 -140
  374. package/src/provenance_tracker.py +0 -312
  375. package/src/qualixar_attribution.py +0 -139
  376. package/src/qualixar_watermark.py +0 -78
  377. package/src/query_optimizer.py +0 -511
  378. package/src/rate_limiter.py +0 -83
  379. package/src/search/__init__.py +0 -20
  380. package/src/search/cli.py +0 -77
  381. package/src/search/constants.py +0 -26
  382. package/src/search/engine.py +0 -241
  383. package/src/search/fusion.py +0 -122
  384. package/src/search/index_loader.py +0 -114
  385. package/src/search/methods.py +0 -162
  386. package/src/search_engine_v2.py +0 -401
  387. package/src/setup_validator.py +0 -482
  388. package/src/subscription_manager.py +0 -391
  389. package/src/tree/__init__.py +0 -59
  390. package/src/tree/builder.py +0 -185
  391. package/src/tree/nodes.py +0 -202
  392. package/src/tree/queries.py +0 -257
  393. package/src/tree/schema.py +0 -80
  394. package/src/tree_manager.py +0 -19
  395. package/src/trust/__init__.py +0 -45
  396. package/src/trust/constants.py +0 -66
  397. package/src/trust/queries.py +0 -157
  398. package/src/trust/schema.py +0 -95
  399. package/src/trust/scorer.py +0 -299
  400. package/src/trust/signals.py +0 -95
  401. package/src/trust_scorer.py +0 -44
  402. package/ui/app.js +0 -1588
  403. package/ui/js/graph-cytoscape-monolithic-backup.js +0 -1168
  404. package/ui/js/graph-cytoscape.js +0 -1168
  405. package/ui/js/graph-d3-backup.js +0 -32
  406. package/ui/js/graph.js +0 -32
  407. package/ui_server.py +0 -286
  408. /package/docs/{ACCESSIBILITY.md → v2-archive/ACCESSIBILITY.md} +0 -0
  409. /package/docs/{ARCHITECTURE.md → v2-archive/ARCHITECTURE.md} +0 -0
  410. /package/docs/{CLI-COMMANDS-REFERENCE.md → v2-archive/CLI-COMMANDS-REFERENCE.md} +0 -0
  411. /package/docs/{COMPRESSION-README.md → v2-archive/COMPRESSION-README.md} +0 -0
  412. /package/docs/{FRAMEWORK-INTEGRATIONS.md → v2-archive/FRAMEWORK-INTEGRATIONS.md} +0 -0
  413. /package/docs/{MCP-MANUAL-SETUP.md → v2-archive/MCP-MANUAL-SETUP.md} +0 -0
  414. /package/docs/{MCP-TROUBLESHOOTING.md → v2-archive/MCP-TROUBLESHOOTING.md} +0 -0
  415. /package/docs/{PATTERN-LEARNING.md → v2-archive/PATTERN-LEARNING.md} +0 -0
  416. /package/docs/{PROFILES-GUIDE.md → v2-archive/PROFILES-GUIDE.md} +0 -0
  417. /package/docs/{RESET-GUIDE.md → v2-archive/RESET-GUIDE.md} +0 -0
  418. /package/docs/{SEARCH-ENGINE-V2.2.0.md → v2-archive/SEARCH-ENGINE-V2.2.0.md} +0 -0
  419. /package/docs/{SEARCH-INTEGRATION-GUIDE.md → v2-archive/SEARCH-INTEGRATION-GUIDE.md} +0 -0
  420. /package/docs/{UI-SERVER.md → v2-archive/UI-SERVER.md} +0 -0
  421. /package/docs/{UNIVERSAL-INTEGRATION.md → v2-archive/UNIVERSAL-INTEGRATION.md} +0 -0
  422. /package/docs/{V2.2.0-OPTIONAL-SEARCH.md → v2-archive/V2.2.0-OPTIONAL-SEARCH.md} +0 -0
  423. /package/docs/{WINDOWS-INSTALL-README.txt → v2-archive/WINDOWS-INSTALL-README.txt} +0 -0
  424. /package/docs/{WINDOWS-POST-INSTALL.txt → v2-archive/WINDOWS-POST-INSTALL.txt} +0 -0
  425. /package/docs/{example_graph_usage.py → v2-archive/example_graph_usage.py} +0 -0
  426. /package/{completions → ide/completions}/slm.bash +0 -0
  427. /package/{completions → ide/completions}/slm.zsh +0 -0
  428. /package/{configs → ide/configs}/cody-commands.json +0 -0
  429. /package/{install-skills.sh → scripts/install-skills.sh} +0 -0
  430. /package/{install.ps1 → scripts/install.ps1} +0 -0
  431. /package/{install.sh → scripts/install.sh} +0 -0
@@ -0,0 +1,366 @@
1
+ # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
+ # Licensed under the MIT License - see LICENSE file
3
+ # Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
4
+
5
+ """Project context detection via filesystem analysis.
6
+
7
+ Scans a directory for project manifest files (package.json, pyproject.toml,
8
+ Cargo.toml, etc.) and extracts project metadata: name, languages, frameworks,
9
+ build tools. No database access -- pure filesystem analysis.
10
+
11
+ Ported from V2 ProjectContextManager. V2 memory.db multi-signal detection
12
+ replaced with direct filesystem scanning (the DB-based signals are handled
13
+ by the retrieval layer in V3).
14
+
15
+ Part of Qualixar | Author: Varun Pratap Bhardwaj
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import json
21
+ import logging
22
+ import re
23
+ from pathlib import Path
24
+ from typing import Any, Optional
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+
29
+ # ---------------------------------------------------------------------------
30
+ # Manifest definitions
31
+ # ---------------------------------------------------------------------------
32
+
33
+ # Each manifest maps a filename to a parser function name.
34
+ # The parser extracts (project_name, languages, frameworks) from the file.
35
+
36
+ _MANIFEST_FILES: list[dict[str, Any]] = [
37
+ {
38
+ "filename": "package.json",
39
+ "languages": ["javascript", "typescript"],
40
+ "parser": "_parse_package_json",
41
+ },
42
+ {
43
+ "filename": "pyproject.toml",
44
+ "languages": ["python"],
45
+ "parser": "_parse_pyproject_toml",
46
+ },
47
+ {
48
+ "filename": "Cargo.toml",
49
+ "languages": ["rust"],
50
+ "parser": "_parse_cargo_toml",
51
+ },
52
+ {
53
+ "filename": "go.mod",
54
+ "languages": ["go"],
55
+ "parser": "_parse_go_mod",
56
+ },
57
+ {
58
+ "filename": "pom.xml",
59
+ "languages": ["java"],
60
+ "parser": "_parse_pom_xml",
61
+ },
62
+ {
63
+ "filename": "build.gradle",
64
+ "languages": ["java", "kotlin"],
65
+ "parser": "_parse_gradle",
66
+ },
67
+ {
68
+ "filename": "build.gradle.kts",
69
+ "languages": ["kotlin"],
70
+ "parser": "_parse_gradle",
71
+ },
72
+ {
73
+ "filename": "Gemfile",
74
+ "languages": ["ruby"],
75
+ "parser": "_parse_gemfile",
76
+ },
77
+ {
78
+ "filename": "composer.json",
79
+ "languages": ["php"],
80
+ "parser": "_parse_composer_json",
81
+ },
82
+ {
83
+ "filename": "pubspec.yaml",
84
+ "languages": ["dart"],
85
+ "parser": "_parse_pubspec_yaml",
86
+ },
87
+ ]
88
+
89
+ # Framework detection via dependency names
90
+ _FRAMEWORK_HINTS: dict[str, str] = {
91
+ "react": "React",
92
+ "react-dom": "React",
93
+ "vue": "Vue",
94
+ "next": "Next.js",
95
+ "nuxt": "Nuxt",
96
+ "angular": "Angular",
97
+ "svelte": "Svelte",
98
+ "@sveltejs/kit": "SvelteKit",
99
+ "express": "Express",
100
+ "fastapi": "FastAPI",
101
+ "django": "Django",
102
+ "flask": "Flask",
103
+ "fastify": "Fastify",
104
+ "spring-boot": "Spring Boot",
105
+ "rails": "Rails",
106
+ "nestjs": "NestJS",
107
+ "@nestjs/core": "NestJS",
108
+ "tailwindcss": "Tailwind CSS",
109
+ "pytest": "pytest",
110
+ "jest": "Jest",
111
+ "vitest": "Vitest",
112
+ "torch": "PyTorch",
113
+ "tensorflow": "TensorFlow",
114
+ "transformers": "Hugging Face",
115
+ }
116
+
117
+
118
+ class ProjectContextManager:
119
+ """Detect project context from the filesystem.
120
+
121
+ No database needed -- scans the target directory for manifest files
122
+ and extracts project metadata.
123
+ """
124
+
125
+ def detect(self, path: Path | str) -> dict[str, Any]:
126
+ """Detect project context from a directory.
127
+
128
+ Args:
129
+ path: Directory to scan.
130
+
131
+ Returns:
132
+ Dict with keys: project_name, languages, frameworks,
133
+ build_tool, manifest_file. All values may be None/empty
134
+ when no manifest is found.
135
+ """
136
+ directory = Path(path)
137
+ if not directory.is_dir():
138
+ return _empty_context()
139
+
140
+ # Try each manifest file
141
+ for manifest_def in _MANIFEST_FILES:
142
+ manifest_path = directory / manifest_def["filename"]
143
+ if not manifest_path.exists():
144
+ continue
145
+
146
+ parser_name = manifest_def["parser"]
147
+ parser = _PARSERS.get(parser_name)
148
+ if parser is None:
149
+ continue
150
+
151
+ try:
152
+ info = parser(manifest_path)
153
+ except Exception as exc:
154
+ logger.debug(
155
+ "Failed to parse %s: %s", manifest_path, exc
156
+ )
157
+ continue
158
+
159
+ # Merge manifest-defined languages
160
+ languages = list(
161
+ set(info.get("languages", []) + manifest_def["languages"])
162
+ )
163
+ return {
164
+ "project_name": info.get("project_name") or directory.name,
165
+ "languages": languages,
166
+ "frameworks": info.get("frameworks", []),
167
+ "build_tool": info.get("build_tool"),
168
+ "manifest_file": manifest_def["filename"],
169
+ }
170
+
171
+ # Fallback: infer from file extensions
172
+ return self._infer_from_extensions(directory)
173
+
174
+ # ------------------------------------------------------------------
175
+ # Fallback extension scanning
176
+ # ------------------------------------------------------------------
177
+
178
+ @staticmethod
179
+ def _infer_from_extensions(directory: Path) -> dict[str, Any]:
180
+ """Scan for source files and infer language from extensions."""
181
+ ext_map: dict[str, str] = {
182
+ ".py": "python",
183
+ ".js": "javascript",
184
+ ".ts": "typescript",
185
+ ".tsx": "typescript",
186
+ ".jsx": "javascript",
187
+ ".rs": "rust",
188
+ ".go": "go",
189
+ ".java": "java",
190
+ ".kt": "kotlin",
191
+ ".rb": "ruby",
192
+ ".php": "php",
193
+ ".dart": "dart",
194
+ ".swift": "swift",
195
+ ".cs": "csharp",
196
+ ".cpp": "cpp",
197
+ ".c": "c",
198
+ }
199
+ detected: set[str] = set()
200
+ try:
201
+ for child in directory.iterdir():
202
+ if child.is_file() and child.suffix in ext_map:
203
+ detected.add(ext_map[child.suffix])
204
+ except PermissionError:
205
+ pass
206
+
207
+ return {
208
+ "project_name": directory.name,
209
+ "languages": sorted(detected),
210
+ "frameworks": [],
211
+ "build_tool": None,
212
+ "manifest_file": None,
213
+ }
214
+
215
+
216
+ # ----------------------------------------------------------------------
217
+ # Parsers (one per manifest type)
218
+ # ----------------------------------------------------------------------
219
+
220
+
221
+ def _parse_package_json(path: Path) -> dict[str, Any]:
222
+ with open(path, "r", encoding="utf-8") as f:
223
+ data = json.load(f)
224
+ deps = set(data.get("dependencies", {}).keys())
225
+ deps |= set(data.get("devDependencies", {}).keys())
226
+ frameworks = [
227
+ _FRAMEWORK_HINTS[d] for d in deps if d in _FRAMEWORK_HINTS
228
+ ]
229
+ lang = ["typescript"] if "typescript" in deps else ["javascript"]
230
+ return {
231
+ "project_name": data.get("name", ""),
232
+ "languages": lang,
233
+ "frameworks": sorted(set(frameworks)),
234
+ "build_tool": "npm",
235
+ }
236
+
237
+
238
+ def _parse_pyproject_toml(path: Path) -> dict[str, Any]:
239
+ text = path.read_text(encoding="utf-8")
240
+ name = ""
241
+ # Simple TOML name extraction (no toml library required)
242
+ m = re.search(r'name\s*=\s*["\']([^"\']+)["\']', text)
243
+ if m:
244
+ name = m.group(1)
245
+
246
+ # Detect frameworks from dependencies section
247
+ frameworks: list[str] = []
248
+ for hint_key, hint_name in _FRAMEWORK_HINTS.items():
249
+ if hint_key in text.lower():
250
+ frameworks.append(hint_name)
251
+
252
+ build_tool = "poetry" if "[tool.poetry]" in text else "setuptools"
253
+ if "[tool.hatch]" in text:
254
+ build_tool = "hatch"
255
+
256
+ return {
257
+ "project_name": name,
258
+ "languages": ["python"],
259
+ "frameworks": sorted(set(frameworks)),
260
+ "build_tool": build_tool,
261
+ }
262
+
263
+
264
+ def _parse_cargo_toml(path: Path) -> dict[str, Any]:
265
+ text = path.read_text(encoding="utf-8")
266
+ m = re.search(r'name\s*=\s*"([^"]+)"', text)
267
+ return {
268
+ "project_name": m.group(1) if m else "",
269
+ "languages": ["rust"],
270
+ "frameworks": [],
271
+ "build_tool": "cargo",
272
+ }
273
+
274
+
275
+ def _parse_go_mod(path: Path) -> dict[str, Any]:
276
+ text = path.read_text(encoding="utf-8")
277
+ m = re.search(r"^module\s+(\S+)", text, re.MULTILINE)
278
+ module_name = m.group(1) if m else ""
279
+ project_name = module_name.split("/")[-1] if module_name else ""
280
+ return {
281
+ "project_name": project_name,
282
+ "languages": ["go"],
283
+ "frameworks": [],
284
+ "build_tool": "go",
285
+ }
286
+
287
+
288
+ def _parse_pom_xml(path: Path) -> dict[str, Any]:
289
+ text = path.read_text(encoding="utf-8")
290
+ m = re.search(r"<artifactId>([^<]+)</artifactId>", text)
291
+ frameworks = []
292
+ if "spring-boot" in text.lower():
293
+ frameworks.append("Spring Boot")
294
+ return {
295
+ "project_name": m.group(1) if m else "",
296
+ "languages": ["java"],
297
+ "frameworks": frameworks,
298
+ "build_tool": "maven",
299
+ }
300
+
301
+
302
+ def _parse_gradle(path: Path) -> dict[str, Any]:
303
+ return {
304
+ "project_name": path.parent.name,
305
+ "languages": ["java", "kotlin"],
306
+ "frameworks": [],
307
+ "build_tool": "gradle",
308
+ }
309
+
310
+
311
+ def _parse_gemfile(path: Path) -> dict[str, Any]:
312
+ text = path.read_text(encoding="utf-8")
313
+ frameworks = ["Rails"] if "rails" in text.lower() else []
314
+ return {
315
+ "project_name": path.parent.name,
316
+ "languages": ["ruby"],
317
+ "frameworks": frameworks,
318
+ "build_tool": "bundler",
319
+ }
320
+
321
+
322
+ def _parse_composer_json(path: Path) -> dict[str, Any]:
323
+ with open(path, "r", encoding="utf-8") as f:
324
+ data = json.load(f)
325
+ return {
326
+ "project_name": data.get("name", "").split("/")[-1],
327
+ "languages": ["php"],
328
+ "frameworks": [],
329
+ "build_tool": "composer",
330
+ }
331
+
332
+
333
+ def _parse_pubspec_yaml(path: Path) -> dict[str, Any]:
334
+ text = path.read_text(encoding="utf-8")
335
+ m = re.search(r"^name:\s*(\S+)", text, re.MULTILINE)
336
+ frameworks = ["Flutter"] if "flutter" in text.lower() else []
337
+ return {
338
+ "project_name": m.group(1) if m else "",
339
+ "languages": ["dart"],
340
+ "frameworks": frameworks,
341
+ "build_tool": "pub",
342
+ }
343
+
344
+
345
+ # Parser dispatch table
346
+ _PARSERS: dict[str, Any] = {
347
+ "_parse_package_json": _parse_package_json,
348
+ "_parse_pyproject_toml": _parse_pyproject_toml,
349
+ "_parse_cargo_toml": _parse_cargo_toml,
350
+ "_parse_go_mod": _parse_go_mod,
351
+ "_parse_pom_xml": _parse_pom_xml,
352
+ "_parse_gradle": _parse_gradle,
353
+ "_parse_gemfile": _parse_gemfile,
354
+ "_parse_composer_json": _parse_composer_json,
355
+ "_parse_pubspec_yaml": _parse_pubspec_yaml,
356
+ }
357
+
358
+
359
+ def _empty_context() -> dict[str, Any]:
360
+ return {
361
+ "project_name": None,
362
+ "languages": [],
363
+ "frameworks": [],
364
+ "build_tool": None,
365
+ "manifest_file": None,
366
+ }
@@ -0,0 +1,155 @@
1
+ # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
+ # Licensed under the MIT License - see LICENSE file
3
+ # Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
4
+
5
+ """3-phase adaptive ranker — from heuristic to ML.
6
+
7
+ Phase 1: cross-encoder score only (cold start)
8
+ Phase 2: heuristic boosts (some data)
9
+ Phase 3: LightGBM model (enough training data)
10
+
11
+ Transitions are automatic based on accumulated training data.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import logging
17
+ import math
18
+ from typing import Any
19
+
20
+ from superlocalmemory.learning.features import FeatureExtractor, FeatureVector, FEATURE_DIM
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+ # Phase thresholds
25
+ PHASE_2_THRESHOLD = 50 # signals needed to enter Phase 2
26
+ PHASE_3_THRESHOLD = 200 # signals needed to enter Phase 3
27
+
28
+
29
+ class AdaptiveRanker:
30
+ """3-phase adaptive re-ranker for V3 retrieval results."""
31
+
32
+ def __init__(self, signal_count: int = 0, model_state: bytes | None = None) -> None:
33
+ self._signal_count = signal_count
34
+ self._model = None
35
+ if model_state:
36
+ self._load_model(model_state)
37
+
38
+ @property
39
+ def phase(self) -> int:
40
+ if self._signal_count >= PHASE_3_THRESHOLD and self._model is not None:
41
+ return 3
42
+ if self._signal_count >= PHASE_2_THRESHOLD:
43
+ return 2
44
+ return 1
45
+
46
+ @property
47
+ def signal_count(self) -> int:
48
+ return self._signal_count
49
+
50
+ @signal_count.setter
51
+ def signal_count(self, value: int) -> None:
52
+ self._signal_count = value
53
+
54
+ def rerank(self, results: list[dict], query_context: dict) -> list[dict]:
55
+ """Re-rank retrieval results based on current phase."""
56
+ if not results:
57
+ return results
58
+
59
+ if self.phase == 3:
60
+ return self._rerank_ml(results, query_context)
61
+ elif self.phase == 2:
62
+ return self._rerank_heuristic(results, query_context)
63
+ else:
64
+ return self._rerank_baseline(results)
65
+
66
+ def train(self, training_data: list[dict]) -> bool:
67
+ """Train LightGBM model on labeled data. Returns True if model was trained."""
68
+ if len(training_data) < PHASE_3_THRESHOLD:
69
+ return False
70
+
71
+ try:
72
+ import lightgbm as lgb
73
+ except ImportError:
74
+ logger.warning("LightGBM not installed. Phase 3 ranking unavailable.")
75
+ return False
76
+
77
+ features_list = []
78
+ labels = []
79
+ for item in training_data:
80
+ fv = item.get("features", {})
81
+ label = item.get("label", 0.0)
82
+ # Convert feature dict to ordered list
83
+ vec = [fv.get(name, 0.0) for name in FeatureExtractor.extract(
84
+ {"channel_scores": {}, "fact": {}}, {"query_type": ""}
85
+ ).features.keys()]
86
+ # Simpler: just use the feature values in order
87
+ from superlocalmemory.learning.features import FEATURE_NAMES
88
+ vec = [float(fv.get(name, 0.0)) for name in FEATURE_NAMES]
89
+ features_list.append(vec)
90
+ labels.append(float(label))
91
+
92
+ if not features_list:
93
+ return False
94
+
95
+ dataset = lgb.Dataset(features_list, label=labels)
96
+ params = {
97
+ "objective": "binary",
98
+ "metric": "binary_logloss",
99
+ "num_leaves": 15,
100
+ "learning_rate": 0.1,
101
+ "verbose": -1,
102
+ }
103
+ self._model = lgb.train(params, dataset, num_boost_round=50)
104
+ logger.info("LightGBM model trained with %d examples", len(features_list))
105
+ return True
106
+
107
+ def get_model_state(self) -> bytes | None:
108
+ """Serialize model for persistence."""
109
+ if self._model is None:
110
+ return None
111
+ return self._model.model_to_string().encode("utf-8")
112
+
113
+ # -- Phase implementations --
114
+
115
+ def _rerank_baseline(self, results: list[dict]) -> list[dict]:
116
+ """Phase 1: rank by cross-encoder score."""
117
+ return sorted(results, key=lambda r: r.get("cross_encoder_score", r.get("score", 0)), reverse=True)
118
+
119
+ def _rerank_heuristic(self, results: list[dict], query_context: dict) -> list[dict]:
120
+ """Phase 2: heuristic boosts on top of cross-encoder."""
121
+ scored = []
122
+ for r in results:
123
+ base = r.get("cross_encoder_score", r.get("score", 0))
124
+ # Boosts
125
+ recency_boost = 0.1 * math.exp(-r.get("fact", {}).get("age_days", 30) / 30)
126
+ access_boost = 0.05 * min(r.get("fact", {}).get("access_count", 0) / 10, 1.0)
127
+ trust_boost = 0.1 * (r.get("trust_score", 0.5) - 0.5)
128
+ final = base + recency_boost + access_boost + trust_boost
129
+ scored.append({**r, "_adaptive_score": final})
130
+ return sorted(scored, key=lambda r: r["_adaptive_score"], reverse=True)
131
+
132
+ def _rerank_ml(self, results: list[dict], query_context: dict) -> list[dict]:
133
+ """Phase 3: LightGBM prediction."""
134
+ if self._model is None:
135
+ return self._rerank_heuristic(results, query_context)
136
+
137
+ feature_vectors = FeatureExtractor.extract_batch(results, query_context)
138
+ predictions = []
139
+ for fv in feature_vectors:
140
+ vec = [fv.to_list()]
141
+ pred = self._model.predict(vec)[0]
142
+ predictions.append(pred)
143
+
144
+ paired = list(zip(results, predictions))
145
+ paired.sort(key=lambda x: x[1], reverse=True)
146
+ return [r for r, _ in paired]
147
+
148
+ def _load_model(self, state: bytes) -> None:
149
+ """Load model from serialized state."""
150
+ try:
151
+ import lightgbm as lgb
152
+ self._model = lgb.Booster(model_str=state.decode("utf-8"))
153
+ except (ImportError, Exception) as exc:
154
+ logger.warning("Could not load LightGBM model: %s", exc)
155
+ self._model = None