superlocalmemory 2.8.6 → 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 (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 +1 -1
  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
@@ -1,536 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """
5
- DbConnectionManager — Thread-safe SQLite connection management with WAL mode.
6
-
7
- Solves the "database is locked" bug when multiple agents (CLI + MCP from Claude +
8
- MCP from Cursor + API) try to write or recall simultaneously.
9
-
10
- Architecture:
11
- - WAL mode (Write-Ahead Logging): Concurrent reads OK during writes
12
- - Busy timeout (5s): Connections wait instead of failing immediately
13
- - Connection pool: Reusable read connections via thread-local storage
14
- - Write queue: Single dedicated writer thread serializes all writes
15
- - Singleton: One manager per database path per process
16
-
17
- This is a PREREQUISITE for the Event Bus (v2.5). The write queue guarantees:
18
- 1. Every write succeeds (queued, not dropped)
19
- 2. Events fire after commit, not before (consistency)
20
- 3. Events arrive in correct order (queue preserves order)
21
- 4. Multiple agents can write simultaneously without conflict
22
-
23
- Usage:
24
- from db_connection_manager import DbConnectionManager
25
-
26
- mgr = DbConnectionManager.get_instance(db_path)
27
-
28
- # Reads — concurrent, non-blocking
29
- conn = mgr.get_read_connection()
30
- try:
31
- cursor = conn.cursor()
32
- cursor.execute("SELECT ...")
33
- rows = cursor.fetchall()
34
- finally:
35
- mgr.release_read_connection(conn)
36
-
37
- # Writes — serialized through queue
38
- def do_insert(conn):
39
- cursor = conn.cursor()
40
- cursor.execute("INSERT INTO ...", (...))
41
- conn.commit()
42
- return cursor.lastrowid
43
-
44
- result = mgr.execute_write(do_insert)
45
-
46
- # Context manager for reads (preferred)
47
- with mgr.read_connection() as conn:
48
- cursor = conn.cursor()
49
- cursor.execute("SELECT ...")
50
- """
51
-
52
- import sqlite3
53
- import threading
54
- import logging
55
- from pathlib import Path
56
- from typing import Optional, Callable, Any, Dict
57
- from contextlib import contextmanager
58
- from queue import Queue
59
-
60
- logger = logging.getLogger("superlocalmemory.db")
61
-
62
- # Default configuration
63
- DEFAULT_BUSY_TIMEOUT_MS = 5000
64
- DEFAULT_READ_POOL_SIZE = 4
65
- WRITE_QUEUE_SENTINEL = None # Signals the writer thread to stop
66
- MAX_READ_CONNECTIONS = 50 # Maximum concurrent read connections
67
-
68
-
69
- class DbConnectionManager:
70
- """
71
- Thread-safe SQLite connection manager with WAL mode and serialized writes.
72
-
73
- Singleton per database path — all callers in the same process share one manager.
74
- This prevents the "database is locked" errors that occur when multiple agents
75
- (CLI, MCP, API, Dashboard) write simultaneously.
76
-
77
- Key features:
78
- - WAL mode: Multiple readers + one writer concurrently
79
- - Busy timeout: Wait up to 5s instead of failing immediately
80
- - Read pool: Thread-local read connections, reused across calls
81
- - Write queue: All writes serialized through a single thread
82
- - Post-write hooks: Callback after each successful commit (for Event Bus)
83
- """
84
-
85
- # Singleton registry: db_path -> instance
86
- _instances: Dict[str, "DbConnectionManager"] = {}
87
- _instances_lock = threading.Lock()
88
-
89
- @classmethod
90
- def get_instance(cls, db_path: Optional[Path] = None) -> "DbConnectionManager":
91
- """
92
- Get or create the singleton DbConnectionManager for a database path.
93
-
94
- Args:
95
- db_path: Path to SQLite database. Defaults to ~/.claude-memory/memory.db
96
-
97
- Returns:
98
- Shared DbConnectionManager instance for this db_path
99
- """
100
- if db_path is None:
101
- db_path = Path.home() / ".claude-memory" / "memory.db"
102
-
103
- key = str(db_path)
104
-
105
- with cls._instances_lock:
106
- if key not in cls._instances:
107
- instance = cls(db_path)
108
- cls._instances[key] = instance
109
- return cls._instances[key]
110
-
111
- @classmethod
112
- def reset_instance(cls, db_path: Optional[Path] = None) -> None:
113
- """
114
- Remove and close a singleton instance. Used for testing and cleanup.
115
-
116
- Args:
117
- db_path: Path to the database. If None, resets all instances.
118
- """
119
- with cls._instances_lock:
120
- if db_path is None:
121
- # Reset all
122
- for instance in cls._instances.values():
123
- instance.close()
124
- cls._instances.clear()
125
- else:
126
- key = str(db_path)
127
- if key in cls._instances:
128
- cls._instances[key].close()
129
- del cls._instances[key]
130
-
131
- def __init__(self, db_path: Path):
132
- """
133
- Initialize the connection manager. Do NOT call directly — use get_instance().
134
-
135
- Args:
136
- db_path: Path to SQLite database file
137
- """
138
- self.db_path = Path(db_path)
139
- self._closed = False
140
-
141
- # Thread-local storage for read connections
142
- self._local = threading.local()
143
-
144
- # Read pool tracking (for cleanup)
145
- self._read_connections: list = []
146
- self._read_connections_lock = threading.Lock()
147
-
148
- # Write queue and dedicated writer thread
149
- self._write_queue: Queue = Queue(maxsize=1000)
150
- self._writer_thread = threading.Thread(
151
- target=self._writer_loop,
152
- name="slm-db-writer",
153
- daemon=True # Dies when main process exits
154
- )
155
- self._write_connection: Optional[sqlite3.Connection] = None
156
-
157
- # Post-write hooks (for Event Bus integration)
158
- self._post_write_hooks: list = []
159
- self._post_write_hooks_lock = threading.Lock()
160
-
161
- # Initialize WAL mode and start writer
162
- self._init_wal_mode()
163
- self._writer_thread.start()
164
-
165
- logger.info(
166
- "DbConnectionManager initialized: db=%s, WAL=enabled, busy_timeout=%dms",
167
- self.db_path, DEFAULT_BUSY_TIMEOUT_MS
168
- )
169
-
170
- def _init_wal_mode(self):
171
- """
172
- Enable WAL mode and set pragmas on a temporary connection.
173
-
174
- WAL (Write-Ahead Logging) allows concurrent reads during writes.
175
- This is the single most impactful fix for the "database is locked" bug.
176
- Once set, WAL mode persists across all connections to this database.
177
- """
178
- conn = sqlite3.connect(str(self.db_path))
179
- try:
180
- conn.execute("PRAGMA journal_mode=WAL")
181
- conn.execute(f"PRAGMA busy_timeout={DEFAULT_BUSY_TIMEOUT_MS}")
182
- # Sync mode NORMAL is safe with WAL and faster than FULL
183
- conn.execute("PRAGMA synchronous=NORMAL")
184
- # Incremental auto-vacuum reclaims space without full rebuild (v2.6)
185
- conn.execute("PRAGMA auto_vacuum=INCREMENTAL")
186
- conn.close()
187
- except Exception:
188
- conn.close()
189
- raise
190
-
191
- def _create_connection(self, readonly: bool = False) -> sqlite3.Connection:
192
- """
193
- Create a new SQLite connection with proper pragmas.
194
-
195
- Args:
196
- readonly: If True, opens in read-only mode (SQLite URI)
197
-
198
- Returns:
199
- Configured sqlite3.Connection
200
- """
201
- if readonly:
202
- # URI mode for read-only — prevents accidental writes from read connections
203
- uri = f"file:{self.db_path}?mode=ro"
204
- conn = sqlite3.connect(uri, uri=True, check_same_thread=False)
205
- else:
206
- conn = sqlite3.connect(str(self.db_path), check_same_thread=False)
207
-
208
- # Apply pragmas to every connection
209
- conn.execute(f"PRAGMA busy_timeout={DEFAULT_BUSY_TIMEOUT_MS}")
210
- # WAL mode is database-level (persists), but set it here for safety
211
- conn.execute("PRAGMA journal_mode=WAL")
212
- conn.execute("PRAGMA synchronous=NORMAL")
213
-
214
- return conn
215
-
216
- # =========================================================================
217
- # Read connections — thread-local pool, concurrent access OK
218
- # =========================================================================
219
-
220
- def get_read_connection(self) -> sqlite3.Connection:
221
- """
222
- Get a read connection for the current thread.
223
-
224
- Uses thread-local storage so each thread reuses its own connection.
225
- Read connections are safe to use concurrently with WAL mode.
226
-
227
- Returns:
228
- sqlite3.Connection configured for reading
229
-
230
- Raises:
231
- RuntimeError: If the manager has been closed
232
- """
233
- if self._closed:
234
- raise RuntimeError("DbConnectionManager is closed")
235
-
236
- # Check thread-local for existing connection
237
- conn = getattr(self._local, 'read_conn', None)
238
- if conn is not None:
239
- try:
240
- # Verify connection is still alive
241
- conn.execute("SELECT 1")
242
- return conn
243
- except sqlite3.Error:
244
- # Connection is dead, create a new one
245
- self._remove_from_pool(conn)
246
- conn = None
247
-
248
- # Create new read connection for this thread (with pool limit)
249
- with self._read_connections_lock:
250
- if len(self._read_connections) >= MAX_READ_CONNECTIONS:
251
- logger.warning(
252
- "Read connection pool at capacity (%d). Reusing oldest connection.",
253
- MAX_READ_CONNECTIONS
254
- )
255
- # Reuse the least recently used connection
256
- conn = self._read_connections[0]
257
- self._local.read_conn = conn
258
- return conn
259
-
260
- conn = self._create_connection(readonly=True)
261
- self._local.read_conn = conn
262
-
263
- with self._read_connections_lock:
264
- self._read_connections.append(conn)
265
-
266
- return conn
267
-
268
- def release_read_connection(self, conn: sqlite3.Connection) -> None:
269
- """
270
- Release a read connection back to the pool.
271
-
272
- With thread-local storage, this is a no-op — the connection stays
273
- assigned to the thread. Call this for API compatibility and future
274
- pool expansion.
275
-
276
- Args:
277
- conn: The connection to release
278
- """
279
- # No-op with thread-local strategy — connection stays with thread.
280
- # Explicit close happens in close() or when thread dies.
281
- pass
282
-
283
- @contextmanager
284
- def read_connection(self):
285
- """
286
- Context manager for read connections. Preferred API.
287
-
288
- Usage:
289
- with mgr.read_connection() as conn:
290
- cursor = conn.cursor()
291
- cursor.execute("SELECT ...")
292
- rows = cursor.fetchall()
293
- """
294
- conn = self.get_read_connection()
295
- try:
296
- yield conn
297
- finally:
298
- self.release_read_connection(conn)
299
-
300
- def _remove_from_pool(self, conn: sqlite3.Connection):
301
- """Remove a dead connection from the tracking list."""
302
- with self._read_connections_lock:
303
- try:
304
- self._read_connections.remove(conn)
305
- except ValueError:
306
- pass
307
- try:
308
- conn.close()
309
- except Exception:
310
- pass
311
-
312
- # =========================================================================
313
- # Write connection — single writer thread, serialized queue
314
- # =========================================================================
315
-
316
- def execute_write(self, callback: Callable[[sqlite3.Connection], Any]) -> Any:
317
- """
318
- Execute a write operation through the serialized write queue.
319
-
320
- The callback receives a sqlite3.Connection and should perform its
321
- write operations (INSERT/UPDATE/DELETE) and call conn.commit().
322
- The callback runs on the dedicated writer thread — never on the caller's thread.
323
-
324
- Args:
325
- callback: Function that takes a sqlite3.Connection and returns a result.
326
- The callback MUST call conn.commit() for changes to persist.
327
-
328
- Returns:
329
- Whatever the callback returns
330
-
331
- Raises:
332
- RuntimeError: If the manager is closed
333
- Exception: Re-raises any exception from the callback
334
- """
335
- if self._closed:
336
- raise RuntimeError("DbConnectionManager is closed")
337
-
338
- # Create a future-like result holder
339
- result_event = threading.Event()
340
- result_holder = {"value": None, "error": None}
341
-
342
- def wrapped_callback(conn):
343
- try:
344
- result_holder["value"] = callback(conn)
345
- except Exception as e:
346
- result_holder["error"] = e
347
-
348
- result_event.set()
349
-
350
- # Enqueue the work
351
- self._write_queue.put(wrapped_callback)
352
-
353
- # Wait for completion
354
- result_event.wait()
355
-
356
- # Re-raise if callback failed
357
- if result_holder["error"] is not None:
358
- raise result_holder["error"]
359
-
360
- return result_holder["value"]
361
-
362
- def _writer_loop(self):
363
- """
364
- Writer thread main loop. Processes write callbacks sequentially.
365
-
366
- This is the heart of the concurrency fix. All writes go through this
367
- single thread, eliminating write-write collisions entirely.
368
- """
369
- # Create the dedicated write connection
370
- self._write_connection = self._create_connection(readonly=False)
371
-
372
- while True:
373
- callback = self._write_queue.get()
374
-
375
- # Sentinel value means shutdown
376
- if callback is WRITE_QUEUE_SENTINEL:
377
- self._write_queue.task_done()
378
- break
379
-
380
- try:
381
- callback(self._write_connection)
382
-
383
- # Fire post-write hooks (for Event Bus)
384
- self._fire_post_write_hooks()
385
-
386
- except Exception as e:
387
- # Log but don't crash the writer thread
388
- logger.error("Write callback failed: %s", e)
389
-
390
- self._write_queue.task_done()
391
-
392
- # Cleanup
393
- if self._write_connection:
394
- try:
395
- self._write_connection.close()
396
- except Exception:
397
- pass
398
- self._write_connection = None
399
-
400
- # =========================================================================
401
- # Post-write hooks (Event Bus integration point)
402
- # =========================================================================
403
-
404
- def register_post_write_hook(self, hook: Callable[[], None]) -> None:
405
- """
406
- Register a callback that fires after every successful write commit.
407
-
408
- This is the integration point for the Event Bus (Phase A).
409
- Hooks run on the writer thread, so they should be fast and non-blocking.
410
- For heavy work, hooks should enqueue to their own async queue.
411
-
412
- Args:
413
- hook: Zero-argument callable invoked after each write
414
- """
415
- with self._post_write_hooks_lock:
416
- self._post_write_hooks.append(hook)
417
-
418
- def unregister_post_write_hook(self, hook: Callable[[], None]) -> None:
419
- """
420
- Remove a previously registered post-write hook.
421
-
422
- Args:
423
- hook: The hook to remove
424
- """
425
- with self._post_write_hooks_lock:
426
- try:
427
- self._post_write_hooks.remove(hook)
428
- except ValueError:
429
- pass
430
-
431
- def _fire_post_write_hooks(self):
432
- """Fire all registered post-write hooks. Errors are logged, not raised."""
433
- with self._post_write_hooks_lock:
434
- hooks = list(self._post_write_hooks)
435
-
436
- for hook in hooks:
437
- try:
438
- hook()
439
- except Exception as e:
440
- logger.error("Post-write hook failed: %s", e)
441
-
442
- # =========================================================================
443
- # Direct write connection access (for DDL / schema init)
444
- # =========================================================================
445
-
446
- def execute_ddl(self, callback: Callable[[sqlite3.Connection], Any]) -> Any:
447
- """
448
- Execute DDL (CREATE TABLE, ALTER TABLE, etc.) through the write queue.
449
-
450
- Identical to execute_write() but named separately for clarity.
451
- DDL operations like schema initialization must go through the writer
452
- to prevent "database is locked" during table creation.
453
-
454
- Args:
455
- callback: Function that takes a sqlite3.Connection and performs DDL
456
-
457
- Returns:
458
- Whatever the callback returns
459
- """
460
- return self.execute_write(callback)
461
-
462
- # =========================================================================
463
- # Lifecycle management
464
- # =========================================================================
465
-
466
- def close(self) -> None:
467
- """
468
- Shut down the connection manager. Drains the write queue and closes
469
- all connections.
470
-
471
- Safe to call multiple times. After close(), all operations raise RuntimeError.
472
- """
473
- if self._closed:
474
- return
475
-
476
- self._closed = True
477
-
478
- # Signal writer thread to stop
479
- self._write_queue.put(WRITE_QUEUE_SENTINEL)
480
-
481
- # Wait for writer to finish (with timeout to prevent hanging)
482
- if self._writer_thread.is_alive():
483
- self._writer_thread.join(timeout=10)
484
-
485
- # Close all read connections
486
- with self._read_connections_lock:
487
- for conn in self._read_connections:
488
- try:
489
- conn.close()
490
- except Exception:
491
- pass
492
- self._read_connections.clear()
493
-
494
- logger.info("DbConnectionManager closed: db=%s", self.db_path)
495
-
496
- @property
497
- def is_closed(self) -> bool:
498
- """Check if the manager has been shut down."""
499
- return self._closed
500
-
501
- @property
502
- def write_queue_size(self) -> int:
503
- """Current number of pending write operations. Useful for monitoring."""
504
- return self._write_queue.qsize()
505
-
506
- def get_diagnostics(self) -> dict:
507
- """
508
- Get diagnostic information about the connection manager state.
509
-
510
- Returns:
511
- Dictionary with connection pool stats, queue depth, WAL status
512
- """
513
- diagnostics = {
514
- "db_path": str(self.db_path),
515
- "closed": self._closed,
516
- "write_queue_depth": self._write_queue.qsize(),
517
- "writer_thread_alive": self._writer_thread.is_alive(),
518
- "read_connections_count": len(self._read_connections),
519
- "post_write_hooks_count": len(self._post_write_hooks),
520
- }
521
-
522
- # Check WAL mode
523
- try:
524
- with self.read_connection() as conn:
525
- cursor = conn.execute("PRAGMA journal_mode")
526
- diagnostics["journal_mode"] = cursor.fetchone()[0]
527
- cursor = conn.execute("PRAGMA busy_timeout")
528
- diagnostics["busy_timeout_ms"] = cursor.fetchone()[0]
529
- except Exception as e:
530
- diagnostics["pragma_check_error"] = str(e)
531
-
532
- return diagnostics
533
-
534
- def __repr__(self) -> str:
535
- status = "closed" if self._closed else "active"
536
- return f"<DbConnectionManager db={self.db_path} status={status}>"
@@ -1,63 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """EmbeddingEngine - Local Embedding Generation for SuperLocalMemory V2
5
-
6
- BACKWARD-COMPATIBILITY SHIM
7
- ----------------------------
8
- This file re-exports every public symbol from the ``embeddings`` package so
9
- that existing code using ``from embedding_engine import EmbeddingEngine``
10
- continues to work without modification.
11
-
12
- The actual implementation now lives in:
13
- src/embeddings/constants.py - Feature detection, constants, logger
14
- src/embeddings/cache.py - LRUCache for embedding vectors
15
- src/embeddings/engine.py - EmbeddingEngine core encode logic
16
- src/embeddings/database.py - Batch embedding generation for SQLite
17
- src/embeddings/cli.py - CLI interface
18
- """
19
- # Re-export everything from the embeddings package
20
- from embeddings import (
21
- # Constants
22
- MAX_BATCH_SIZE,
23
- MAX_TEXT_LENGTH,
24
- CACHE_MAX_SIZE,
25
- SENTENCE_TRANSFORMERS_AVAILABLE,
26
- SKLEARN_AVAILABLE,
27
- TORCH_AVAILABLE,
28
- CUDA_AVAILABLE,
29
- MPS_AVAILABLE,
30
- MEMORY_DIR,
31
- EMBEDDING_CACHE_PATH,
32
- MODEL_CACHE_PATH,
33
- # Classes
34
- LRUCache,
35
- EmbeddingEngine,
36
- # Functions
37
- add_embeddings_to_database,
38
- main,
39
- )
40
-
41
- __all__ = [
42
- # Constants
43
- "MAX_BATCH_SIZE",
44
- "MAX_TEXT_LENGTH",
45
- "CACHE_MAX_SIZE",
46
- "SENTENCE_TRANSFORMERS_AVAILABLE",
47
- "SKLEARN_AVAILABLE",
48
- "TORCH_AVAILABLE",
49
- "CUDA_AVAILABLE",
50
- "MPS_AVAILABLE",
51
- "MEMORY_DIR",
52
- "EMBEDDING_CACHE_PATH",
53
- "MODEL_CACHE_PATH",
54
- # Classes
55
- "LRUCache",
56
- "EmbeddingEngine",
57
- # Functions
58
- "add_embeddings_to_database",
59
- "main",
60
- ]
61
-
62
- if __name__ == '__main__':
63
- main()
@@ -1,47 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
3
- """embeddings package - Local Embedding Generation for SuperLocalMemory V2
4
-
5
- Re-exports all public classes and constants so that
6
- ``from embeddings import EmbeddingEngine`` works.
7
- """
8
- from embeddings.constants import (
9
- MAX_BATCH_SIZE,
10
- MAX_TEXT_LENGTH,
11
- CACHE_MAX_SIZE,
12
- SENTENCE_TRANSFORMERS_AVAILABLE,
13
- SKLEARN_AVAILABLE,
14
- TORCH_AVAILABLE,
15
- CUDA_AVAILABLE,
16
- MPS_AVAILABLE,
17
- MEMORY_DIR,
18
- EMBEDDING_CACHE_PATH,
19
- MODEL_CACHE_PATH,
20
- )
21
- from embeddings.cache import LRUCache
22
- from embeddings.model_loader import ModelLoaderMixin
23
- from embeddings.engine import EmbeddingEngine
24
- from embeddings.database import add_embeddings_to_database
25
- from embeddings.cli import main
26
-
27
- __all__ = [
28
- # Constants
29
- "MAX_BATCH_SIZE",
30
- "MAX_TEXT_LENGTH",
31
- "CACHE_MAX_SIZE",
32
- "SENTENCE_TRANSFORMERS_AVAILABLE",
33
- "SKLEARN_AVAILABLE",
34
- "TORCH_AVAILABLE",
35
- "CUDA_AVAILABLE",
36
- "MPS_AVAILABLE",
37
- "MEMORY_DIR",
38
- "EMBEDDING_CACHE_PATH",
39
- "MODEL_CACHE_PATH",
40
- # Classes
41
- "LRUCache",
42
- "ModelLoaderMixin",
43
- "EmbeddingEngine",
44
- # Functions
45
- "add_embeddings_to_database",
46
- "main",
47
- ]