superlocalmemory 2.8.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +9 -1
  3. package/NOTICE +63 -0
  4. package/README.md +165 -480
  5. package/bin/slm +17 -449
  6. package/bin/slm-npm +2 -2
  7. package/bin/slm.bat +4 -2
  8. package/conftest.py +5 -0
  9. package/docs/api-reference.md +284 -0
  10. package/docs/architecture.md +149 -0
  11. package/docs/auto-memory.md +150 -0
  12. package/docs/cli-reference.md +276 -0
  13. package/docs/compliance.md +191 -0
  14. package/docs/configuration.md +182 -0
  15. package/docs/getting-started.md +102 -0
  16. package/docs/ide-setup.md +261 -0
  17. package/docs/mcp-tools.md +220 -0
  18. package/docs/migration-from-v2.md +170 -0
  19. package/docs/profiles.md +173 -0
  20. package/docs/troubleshooting.md +310 -0
  21. package/{configs → ide/configs}/antigravity-mcp.json +3 -3
  22. package/ide/configs/chatgpt-desktop-mcp.json +16 -0
  23. package/{configs → ide/configs}/claude-desktop-mcp.json +3 -3
  24. package/{configs → ide/configs}/codex-mcp.toml +4 -4
  25. package/{configs → ide/configs}/continue-mcp.yaml +4 -3
  26. package/{configs → ide/configs}/continue-skills.yaml +6 -6
  27. package/ide/configs/cursor-mcp.json +15 -0
  28. package/{configs → ide/configs}/gemini-cli-mcp.json +2 -2
  29. package/{configs → ide/configs}/jetbrains-mcp.json +2 -2
  30. package/{configs → ide/configs}/opencode-mcp.json +2 -2
  31. package/{configs → ide/configs}/perplexity-mcp.json +2 -2
  32. package/{configs → ide/configs}/vscode-copilot-mcp.json +2 -2
  33. package/{configs → ide/configs}/windsurf-mcp.json +3 -3
  34. package/{configs → ide/configs}/zed-mcp.json +2 -2
  35. package/{hooks → ide/hooks}/context-hook.js +9 -20
  36. package/ide/hooks/memory-list-skill.js +70 -0
  37. package/ide/hooks/memory-profile-skill.js +101 -0
  38. package/ide/hooks/memory-recall-skill.js +62 -0
  39. package/ide/hooks/memory-remember-skill.js +68 -0
  40. package/ide/hooks/memory-reset-skill.js +160 -0
  41. package/{hooks → ide/hooks}/post-recall-hook.js +2 -2
  42. package/ide/integrations/langchain/README.md +106 -0
  43. package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +9 -0
  44. package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +201 -0
  45. package/ide/integrations/langchain/pyproject.toml +38 -0
  46. package/{src/learning → ide/integrations/langchain}/tests/__init__.py +1 -0
  47. package/ide/integrations/langchain/tests/test_chat_message_history.py +215 -0
  48. package/ide/integrations/langchain/tests/test_security.py +117 -0
  49. package/ide/integrations/llamaindex/README.md +81 -0
  50. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +9 -0
  51. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +316 -0
  52. package/ide/integrations/llamaindex/pyproject.toml +43 -0
  53. package/{src/lifecycle → ide/integrations/llamaindex}/tests/__init__.py +1 -2
  54. package/ide/integrations/llamaindex/tests/test_chat_store.py +294 -0
  55. package/ide/integrations/llamaindex/tests/test_security.py +241 -0
  56. package/{skills → ide/skills}/slm-build-graph/SKILL.md +6 -6
  57. package/{skills → ide/skills}/slm-list-recent/SKILL.md +5 -5
  58. package/{skills → ide/skills}/slm-recall/SKILL.md +5 -5
  59. package/{skills → ide/skills}/slm-remember/SKILL.md +6 -6
  60. package/{skills → ide/skills}/slm-show-patterns/SKILL.md +7 -7
  61. package/{skills → ide/skills}/slm-status/SKILL.md +9 -9
  62. package/{skills → ide/skills}/slm-switch-profile/SKILL.md +9 -9
  63. package/package.json +13 -22
  64. package/pyproject.toml +85 -0
  65. package/scripts/build-dmg.sh +417 -0
  66. package/scripts/install-skills.ps1 +334 -0
  67. package/{install.ps1 → scripts/install.ps1} +36 -4
  68. package/{install.sh → scripts/install.sh} +14 -13
  69. package/scripts/postinstall.js +2 -2
  70. package/scripts/start-dashboard.ps1 +52 -0
  71. package/scripts/start-dashboard.sh +41 -0
  72. package/scripts/sync-wiki.ps1 +127 -0
  73. package/scripts/sync-wiki.sh +82 -0
  74. package/scripts/test-dmg.sh +161 -0
  75. package/scripts/test-npm-package.ps1 +252 -0
  76. package/scripts/test-npm-package.sh +207 -0
  77. package/scripts/verify-install.ps1 +294 -0
  78. package/scripts/verify-install.sh +266 -0
  79. package/src/superlocalmemory/__init__.py +0 -0
  80. package/src/superlocalmemory/attribution/__init__.py +9 -0
  81. package/src/superlocalmemory/attribution/mathematical_dna.py +235 -0
  82. package/src/superlocalmemory/attribution/signer.py +153 -0
  83. package/src/superlocalmemory/attribution/watermark.py +189 -0
  84. package/src/superlocalmemory/cli/__init__.py +5 -0
  85. package/src/superlocalmemory/cli/commands.py +245 -0
  86. package/src/superlocalmemory/cli/main.py +89 -0
  87. package/src/superlocalmemory/cli/migrate_cmd.py +55 -0
  88. package/src/superlocalmemory/cli/post_install.py +99 -0
  89. package/src/superlocalmemory/cli/setup_wizard.py +129 -0
  90. package/src/superlocalmemory/compliance/__init__.py +0 -0
  91. package/src/superlocalmemory/compliance/abac.py +204 -0
  92. package/src/superlocalmemory/compliance/audit.py +314 -0
  93. package/src/superlocalmemory/compliance/eu_ai_act.py +131 -0
  94. package/src/superlocalmemory/compliance/gdpr.py +294 -0
  95. package/src/superlocalmemory/compliance/lifecycle.py +158 -0
  96. package/src/superlocalmemory/compliance/retention.py +232 -0
  97. package/src/superlocalmemory/compliance/scheduler.py +148 -0
  98. package/src/superlocalmemory/core/__init__.py +0 -0
  99. package/src/superlocalmemory/core/config.py +391 -0
  100. package/src/superlocalmemory/core/embeddings.py +293 -0
  101. package/src/superlocalmemory/core/engine.py +701 -0
  102. package/src/superlocalmemory/core/hooks.py +65 -0
  103. package/src/superlocalmemory/core/maintenance.py +172 -0
  104. package/src/superlocalmemory/core/modes.py +140 -0
  105. package/src/superlocalmemory/core/profiles.py +234 -0
  106. package/src/superlocalmemory/core/registry.py +117 -0
  107. package/src/superlocalmemory/dynamics/__init__.py +0 -0
  108. package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +223 -0
  109. package/src/superlocalmemory/encoding/__init__.py +0 -0
  110. package/src/superlocalmemory/encoding/consolidator.py +485 -0
  111. package/src/superlocalmemory/encoding/emotional.py +125 -0
  112. package/src/superlocalmemory/encoding/entity_resolver.py +525 -0
  113. package/src/superlocalmemory/encoding/entropy_gate.py +104 -0
  114. package/src/superlocalmemory/encoding/fact_extractor.py +775 -0
  115. package/src/superlocalmemory/encoding/foresight.py +91 -0
  116. package/src/superlocalmemory/encoding/graph_builder.py +302 -0
  117. package/src/superlocalmemory/encoding/observation_builder.py +160 -0
  118. package/src/superlocalmemory/encoding/scene_builder.py +183 -0
  119. package/src/superlocalmemory/encoding/signal_inference.py +90 -0
  120. package/src/superlocalmemory/encoding/temporal_parser.py +426 -0
  121. package/src/superlocalmemory/encoding/type_router.py +235 -0
  122. package/src/superlocalmemory/hooks/__init__.py +3 -0
  123. package/src/superlocalmemory/hooks/auto_capture.py +111 -0
  124. package/src/superlocalmemory/hooks/auto_recall.py +93 -0
  125. package/src/superlocalmemory/hooks/ide_connector.py +204 -0
  126. package/src/superlocalmemory/hooks/rules_engine.py +99 -0
  127. package/src/superlocalmemory/infra/__init__.py +3 -0
  128. package/src/superlocalmemory/infra/auth_middleware.py +82 -0
  129. package/src/superlocalmemory/infra/backup.py +317 -0
  130. package/src/superlocalmemory/infra/cache_manager.py +267 -0
  131. package/src/superlocalmemory/infra/event_bus.py +381 -0
  132. package/src/superlocalmemory/infra/rate_limiter.py +135 -0
  133. package/src/{webhook_dispatcher.py → superlocalmemory/infra/webhook_dispatcher.py} +104 -101
  134. package/src/superlocalmemory/learning/__init__.py +0 -0
  135. package/src/superlocalmemory/learning/adaptive.py +172 -0
  136. package/src/superlocalmemory/learning/behavioral.py +490 -0
  137. package/src/superlocalmemory/learning/behavioral_listener.py +94 -0
  138. package/src/superlocalmemory/learning/bootstrap.py +298 -0
  139. package/src/superlocalmemory/learning/cross_project.py +399 -0
  140. package/src/superlocalmemory/learning/database.py +376 -0
  141. package/src/superlocalmemory/learning/engagement.py +323 -0
  142. package/src/superlocalmemory/learning/features.py +138 -0
  143. package/src/superlocalmemory/learning/feedback.py +316 -0
  144. package/src/superlocalmemory/learning/outcomes.py +255 -0
  145. package/src/superlocalmemory/learning/project_context.py +366 -0
  146. package/src/superlocalmemory/learning/ranker.py +155 -0
  147. package/src/superlocalmemory/learning/source_quality.py +303 -0
  148. package/src/superlocalmemory/learning/workflows.py +309 -0
  149. package/src/superlocalmemory/llm/__init__.py +0 -0
  150. package/src/superlocalmemory/llm/backbone.py +316 -0
  151. package/src/superlocalmemory/math/__init__.py +0 -0
  152. package/src/superlocalmemory/math/fisher.py +356 -0
  153. package/src/superlocalmemory/math/langevin.py +398 -0
  154. package/src/superlocalmemory/math/sheaf.py +257 -0
  155. package/src/superlocalmemory/mcp/__init__.py +0 -0
  156. package/src/superlocalmemory/mcp/resources.py +245 -0
  157. package/src/superlocalmemory/mcp/server.py +61 -0
  158. package/src/superlocalmemory/mcp/tools.py +18 -0
  159. package/src/superlocalmemory/mcp/tools_core.py +305 -0
  160. package/src/superlocalmemory/mcp/tools_v28.py +223 -0
  161. package/src/superlocalmemory/mcp/tools_v3.py +286 -0
  162. package/src/superlocalmemory/retrieval/__init__.py +0 -0
  163. package/src/superlocalmemory/retrieval/agentic.py +295 -0
  164. package/src/superlocalmemory/retrieval/ann_index.py +223 -0
  165. package/src/superlocalmemory/retrieval/bm25_channel.py +185 -0
  166. package/src/superlocalmemory/retrieval/bridge_discovery.py +170 -0
  167. package/src/superlocalmemory/retrieval/engine.py +390 -0
  168. package/src/superlocalmemory/retrieval/entity_channel.py +179 -0
  169. package/src/superlocalmemory/retrieval/fusion.py +78 -0
  170. package/src/superlocalmemory/retrieval/profile_channel.py +105 -0
  171. package/src/superlocalmemory/retrieval/reranker.py +154 -0
  172. package/src/superlocalmemory/retrieval/semantic_channel.py +232 -0
  173. package/src/superlocalmemory/retrieval/strategy.py +96 -0
  174. package/src/superlocalmemory/retrieval/temporal_channel.py +175 -0
  175. package/src/superlocalmemory/server/__init__.py +1 -0
  176. package/src/superlocalmemory/server/api.py +248 -0
  177. package/src/superlocalmemory/server/routes/__init__.py +4 -0
  178. package/src/superlocalmemory/server/routes/agents.py +107 -0
  179. package/src/superlocalmemory/server/routes/backup.py +91 -0
  180. package/src/superlocalmemory/server/routes/behavioral.py +127 -0
  181. package/src/superlocalmemory/server/routes/compliance.py +160 -0
  182. package/src/superlocalmemory/server/routes/data_io.py +188 -0
  183. package/src/superlocalmemory/server/routes/events.py +183 -0
  184. package/src/superlocalmemory/server/routes/helpers.py +85 -0
  185. package/src/superlocalmemory/server/routes/learning.py +273 -0
  186. package/src/superlocalmemory/server/routes/lifecycle.py +116 -0
  187. package/src/superlocalmemory/server/routes/memories.py +399 -0
  188. package/src/superlocalmemory/server/routes/profiles.py +219 -0
  189. package/src/superlocalmemory/server/routes/stats.py +346 -0
  190. package/src/superlocalmemory/server/routes/v3_api.py +365 -0
  191. package/src/superlocalmemory/server/routes/ws.py +82 -0
  192. package/src/superlocalmemory/server/security_middleware.py +57 -0
  193. package/src/superlocalmemory/server/ui.py +245 -0
  194. package/src/superlocalmemory/storage/__init__.py +0 -0
  195. package/src/superlocalmemory/storage/access_control.py +182 -0
  196. package/src/superlocalmemory/storage/database.py +594 -0
  197. package/src/superlocalmemory/storage/migrations.py +303 -0
  198. package/src/superlocalmemory/storage/models.py +406 -0
  199. package/src/superlocalmemory/storage/schema.py +726 -0
  200. package/src/superlocalmemory/storage/v2_migrator.py +317 -0
  201. package/src/superlocalmemory/trust/__init__.py +0 -0
  202. package/src/superlocalmemory/trust/gate.py +130 -0
  203. package/src/superlocalmemory/trust/provenance.py +124 -0
  204. package/src/superlocalmemory/trust/scorer.py +347 -0
  205. package/src/superlocalmemory/trust/signals.py +153 -0
  206. package/ui/index.html +278 -5
  207. package/ui/js/auto-settings.js +70 -0
  208. package/ui/js/dashboard.js +90 -0
  209. package/ui/js/fact-detail.js +92 -0
  210. package/ui/js/feedback.js +2 -2
  211. package/ui/js/ide-status.js +102 -0
  212. package/ui/js/math-health.js +98 -0
  213. package/ui/js/recall-lab.js +127 -0
  214. package/ui/js/settings.js +2 -2
  215. package/ui/js/trust-dashboard.js +73 -0
  216. package/api_server.py +0 -724
  217. package/bin/aider-smart +0 -72
  218. package/bin/superlocalmemoryv2-learning +0 -4
  219. package/bin/superlocalmemoryv2-list +0 -3
  220. package/bin/superlocalmemoryv2-patterns +0 -4
  221. package/bin/superlocalmemoryv2-profile +0 -3
  222. package/bin/superlocalmemoryv2-recall +0 -3
  223. package/bin/superlocalmemoryv2-remember +0 -3
  224. package/bin/superlocalmemoryv2-reset +0 -3
  225. package/bin/superlocalmemoryv2-status +0 -3
  226. package/configs/chatgpt-desktop-mcp.json +0 -16
  227. package/configs/cursor-mcp.json +0 -15
  228. package/docs/SECURITY-QUICK-REFERENCE.md +0 -214
  229. package/hooks/memory-list-skill.js +0 -139
  230. package/hooks/memory-profile-skill.js +0 -273
  231. package/hooks/memory-recall-skill.js +0 -114
  232. package/hooks/memory-remember-skill.js +0 -127
  233. package/hooks/memory-reset-skill.js +0 -274
  234. package/mcp_server.py +0 -1800
  235. package/requirements-core.txt +0 -22
  236. package/requirements-learning.txt +0 -12
  237. package/requirements.txt +0 -12
  238. package/src/agent_registry.py +0 -411
  239. package/src/auth_middleware.py +0 -61
  240. package/src/auto_backup.py +0 -459
  241. package/src/behavioral/__init__.py +0 -49
  242. package/src/behavioral/behavioral_listener.py +0 -203
  243. package/src/behavioral/behavioral_patterns.py +0 -275
  244. package/src/behavioral/cross_project_transfer.py +0 -206
  245. package/src/behavioral/outcome_inference.py +0 -194
  246. package/src/behavioral/outcome_tracker.py +0 -193
  247. package/src/behavioral/tests/__init__.py +0 -4
  248. package/src/behavioral/tests/test_behavioral_integration.py +0 -108
  249. package/src/behavioral/tests/test_behavioral_patterns.py +0 -150
  250. package/src/behavioral/tests/test_cross_project_transfer.py +0 -142
  251. package/src/behavioral/tests/test_mcp_behavioral.py +0 -139
  252. package/src/behavioral/tests/test_mcp_report_outcome.py +0 -117
  253. package/src/behavioral/tests/test_outcome_inference.py +0 -107
  254. package/src/behavioral/tests/test_outcome_tracker.py +0 -96
  255. package/src/cache_manager.py +0 -518
  256. package/src/compliance/__init__.py +0 -48
  257. package/src/compliance/abac_engine.py +0 -149
  258. package/src/compliance/abac_middleware.py +0 -116
  259. package/src/compliance/audit_db.py +0 -215
  260. package/src/compliance/audit_logger.py +0 -148
  261. package/src/compliance/retention_manager.py +0 -289
  262. package/src/compliance/retention_scheduler.py +0 -186
  263. package/src/compliance/tests/__init__.py +0 -4
  264. package/src/compliance/tests/test_abac_enforcement.py +0 -95
  265. package/src/compliance/tests/test_abac_engine.py +0 -124
  266. package/src/compliance/tests/test_abac_mcp_integration.py +0 -118
  267. package/src/compliance/tests/test_audit_db.py +0 -123
  268. package/src/compliance/tests/test_audit_logger.py +0 -98
  269. package/src/compliance/tests/test_mcp_audit.py +0 -128
  270. package/src/compliance/tests/test_mcp_retention_policy.py +0 -125
  271. package/src/compliance/tests/test_retention_manager.py +0 -131
  272. package/src/compliance/tests/test_retention_scheduler.py +0 -99
  273. package/src/compression/__init__.py +0 -25
  274. package/src/compression/cli.py +0 -150
  275. package/src/compression/cold_storage.py +0 -217
  276. package/src/compression/config.py +0 -72
  277. package/src/compression/orchestrator.py +0 -133
  278. package/src/compression/tier2_compressor.py +0 -228
  279. package/src/compression/tier3_compressor.py +0 -153
  280. package/src/compression/tier_classifier.py +0 -148
  281. package/src/db_connection_manager.py +0 -536
  282. package/src/embedding_engine.py +0 -63
  283. package/src/embeddings/__init__.py +0 -47
  284. package/src/embeddings/cache.py +0 -70
  285. package/src/embeddings/cli.py +0 -113
  286. package/src/embeddings/constants.py +0 -47
  287. package/src/embeddings/database.py +0 -91
  288. package/src/embeddings/engine.py +0 -247
  289. package/src/embeddings/model_loader.py +0 -145
  290. package/src/event_bus.py +0 -562
  291. package/src/graph/__init__.py +0 -36
  292. package/src/graph/build_helpers.py +0 -74
  293. package/src/graph/cli.py +0 -87
  294. package/src/graph/cluster_builder.py +0 -188
  295. package/src/graph/cluster_summary.py +0 -148
  296. package/src/graph/constants.py +0 -47
  297. package/src/graph/edge_builder.py +0 -162
  298. package/src/graph/entity_extractor.py +0 -95
  299. package/src/graph/graph_core.py +0 -226
  300. package/src/graph/graph_search.py +0 -231
  301. package/src/graph/hierarchical.py +0 -207
  302. package/src/graph/schema.py +0 -99
  303. package/src/graph_engine.py +0 -52
  304. package/src/hnsw_index.py +0 -628
  305. package/src/hybrid_search.py +0 -46
  306. package/src/learning/__init__.py +0 -217
  307. package/src/learning/adaptive_ranker.py +0 -682
  308. package/src/learning/bootstrap/__init__.py +0 -69
  309. package/src/learning/bootstrap/constants.py +0 -93
  310. package/src/learning/bootstrap/db_queries.py +0 -316
  311. package/src/learning/bootstrap/sampling.py +0 -82
  312. package/src/learning/bootstrap/text_utils.py +0 -71
  313. package/src/learning/cross_project_aggregator.py +0 -857
  314. package/src/learning/db/__init__.py +0 -40
  315. package/src/learning/db/constants.py +0 -44
  316. package/src/learning/db/schema.py +0 -279
  317. package/src/learning/engagement_tracker.py +0 -628
  318. package/src/learning/feature_extractor.py +0 -708
  319. package/src/learning/feedback_collector.py +0 -806
  320. package/src/learning/learning_db.py +0 -915
  321. package/src/learning/project_context_manager.py +0 -572
  322. package/src/learning/ranking/__init__.py +0 -33
  323. package/src/learning/ranking/constants.py +0 -84
  324. package/src/learning/ranking/helpers.py +0 -278
  325. package/src/learning/source_quality_scorer.py +0 -676
  326. package/src/learning/synthetic_bootstrap.py +0 -755
  327. package/src/learning/tests/test_adaptive_ranker.py +0 -325
  328. package/src/learning/tests/test_adaptive_ranker_v28.py +0 -60
  329. package/src/learning/tests/test_aggregator.py +0 -306
  330. package/src/learning/tests/test_auto_retrain_v28.py +0 -35
  331. package/src/learning/tests/test_e2e_ranking_v28.py +0 -82
  332. package/src/learning/tests/test_feature_extractor_v28.py +0 -93
  333. package/src/learning/tests/test_feedback_collector.py +0 -294
  334. package/src/learning/tests/test_learning_db.py +0 -602
  335. package/src/learning/tests/test_learning_db_v28.py +0 -110
  336. package/src/learning/tests/test_learning_init_v28.py +0 -48
  337. package/src/learning/tests/test_outcome_signals.py +0 -48
  338. package/src/learning/tests/test_project_context.py +0 -292
  339. package/src/learning/tests/test_schema_migration.py +0 -319
  340. package/src/learning/tests/test_signal_inference.py +0 -397
  341. package/src/learning/tests/test_source_quality.py +0 -351
  342. package/src/learning/tests/test_synthetic_bootstrap.py +0 -429
  343. package/src/learning/tests/test_workflow_miner.py +0 -318
  344. package/src/learning/workflow_pattern_miner.py +0 -655
  345. package/src/lifecycle/__init__.py +0 -54
  346. package/src/lifecycle/bounded_growth.py +0 -239
  347. package/src/lifecycle/compaction_engine.py +0 -226
  348. package/src/lifecycle/lifecycle_engine.py +0 -355
  349. package/src/lifecycle/lifecycle_evaluator.py +0 -257
  350. package/src/lifecycle/lifecycle_scheduler.py +0 -130
  351. package/src/lifecycle/retention_policy.py +0 -285
  352. package/src/lifecycle/tests/test_bounded_growth.py +0 -193
  353. package/src/lifecycle/tests/test_compaction.py +0 -179
  354. package/src/lifecycle/tests/test_lifecycle_engine.py +0 -137
  355. package/src/lifecycle/tests/test_lifecycle_evaluation.py +0 -177
  356. package/src/lifecycle/tests/test_lifecycle_scheduler.py +0 -127
  357. package/src/lifecycle/tests/test_lifecycle_search.py +0 -109
  358. package/src/lifecycle/tests/test_mcp_compact.py +0 -149
  359. package/src/lifecycle/tests/test_mcp_lifecycle_status.py +0 -114
  360. package/src/lifecycle/tests/test_retention_policy.py +0 -162
  361. package/src/mcp_tools_v28.py +0 -281
  362. package/src/memory/__init__.py +0 -36
  363. package/src/memory/cli.py +0 -205
  364. package/src/memory/constants.py +0 -39
  365. package/src/memory/helpers.py +0 -28
  366. package/src/memory/schema.py +0 -166
  367. package/src/memory-profiles.py +0 -595
  368. package/src/memory-reset.py +0 -491
  369. package/src/memory_compression.py +0 -989
  370. package/src/memory_store_v2.py +0 -1155
  371. package/src/migrate_v1_to_v2.py +0 -629
  372. package/src/pattern_learner.py +0 -34
  373. package/src/patterns/__init__.py +0 -24
  374. package/src/patterns/analyzers.py +0 -251
  375. package/src/patterns/learner.py +0 -271
  376. package/src/patterns/scoring.py +0 -171
  377. package/src/patterns/store.py +0 -225
  378. package/src/patterns/terminology.py +0 -140
  379. package/src/provenance_tracker.py +0 -312
  380. package/src/qualixar_attribution.py +0 -139
  381. package/src/qualixar_watermark.py +0 -78
  382. package/src/query_optimizer.py +0 -511
  383. package/src/rate_limiter.py +0 -83
  384. package/src/search/__init__.py +0 -20
  385. package/src/search/cli.py +0 -77
  386. package/src/search/constants.py +0 -26
  387. package/src/search/engine.py +0 -241
  388. package/src/search/fusion.py +0 -122
  389. package/src/search/index_loader.py +0 -114
  390. package/src/search/methods.py +0 -162
  391. package/src/search_engine_v2.py +0 -401
  392. package/src/setup_validator.py +0 -482
  393. package/src/subscription_manager.py +0 -391
  394. package/src/tree/__init__.py +0 -59
  395. package/src/tree/builder.py +0 -185
  396. package/src/tree/nodes.py +0 -202
  397. package/src/tree/queries.py +0 -257
  398. package/src/tree/schema.py +0 -80
  399. package/src/tree_manager.py +0 -19
  400. package/src/trust/__init__.py +0 -45
  401. package/src/trust/constants.py +0 -66
  402. package/src/trust/queries.py +0 -157
  403. package/src/trust/schema.py +0 -95
  404. package/src/trust/scorer.py +0 -299
  405. package/src/trust/signals.py +0 -95
  406. package/src/trust_scorer.py +0 -44
  407. package/ui/app.js +0 -1588
  408. package/ui/js/graph-cytoscape-monolithic-backup.js +0 -1168
  409. package/ui/js/graph-cytoscape.js +0 -1168
  410. package/ui/js/graph-d3-backup.js +0 -32
  411. package/ui/js/graph.js +0 -32
  412. package/ui_server.py +0 -266
  413. /package/docs/{ACCESSIBILITY.md → v2-archive/ACCESSIBILITY.md} +0 -0
  414. /package/docs/{ARCHITECTURE.md → v2-archive/ARCHITECTURE.md} +0 -0
  415. /package/docs/{CLI-COMMANDS-REFERENCE.md → v2-archive/CLI-COMMANDS-REFERENCE.md} +0 -0
  416. /package/docs/{COMPRESSION-README.md → v2-archive/COMPRESSION-README.md} +0 -0
  417. /package/docs/{FRAMEWORK-INTEGRATIONS.md → v2-archive/FRAMEWORK-INTEGRATIONS.md} +0 -0
  418. /package/docs/{MCP-MANUAL-SETUP.md → v2-archive/MCP-MANUAL-SETUP.md} +0 -0
  419. /package/docs/{MCP-TROUBLESHOOTING.md → v2-archive/MCP-TROUBLESHOOTING.md} +0 -0
  420. /package/docs/{PATTERN-LEARNING.md → v2-archive/PATTERN-LEARNING.md} +0 -0
  421. /package/docs/{PROFILES-GUIDE.md → v2-archive/PROFILES-GUIDE.md} +0 -0
  422. /package/docs/{RESET-GUIDE.md → v2-archive/RESET-GUIDE.md} +0 -0
  423. /package/docs/{SEARCH-ENGINE-V2.2.0.md → v2-archive/SEARCH-ENGINE-V2.2.0.md} +0 -0
  424. /package/docs/{SEARCH-INTEGRATION-GUIDE.md → v2-archive/SEARCH-INTEGRATION-GUIDE.md} +0 -0
  425. /package/docs/{UI-SERVER.md → v2-archive/UI-SERVER.md} +0 -0
  426. /package/docs/{UNIVERSAL-INTEGRATION.md → v2-archive/UNIVERSAL-INTEGRATION.md} +0 -0
  427. /package/docs/{V2.2.0-OPTIONAL-SEARCH.md → v2-archive/V2.2.0-OPTIONAL-SEARCH.md} +0 -0
  428. /package/docs/{WINDOWS-INSTALL-README.txt → v2-archive/WINDOWS-INSTALL-README.txt} +0 -0
  429. /package/docs/{WINDOWS-POST-INSTALL.txt → v2-archive/WINDOWS-POST-INSTALL.txt} +0 -0
  430. /package/docs/{example_graph_usage.py → v2-archive/example_graph_usage.py} +0 -0
  431. /package/{completions → ide/completions}/slm.bash +0 -0
  432. /package/{completions → ide/completions}/slm.zsh +0 -0
  433. /package/{configs → ide/configs}/cody-commands.json +0 -0
  434. /package/{install-skills.sh → scripts/install-skills.sh} +0 -0
@@ -0,0 +1,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