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
@@ -1,70 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """LRU cache for embedding vectors.
5
- """
6
- import json
7
- import logging
8
- from pathlib import Path
9
- from typing import Optional
10
- from collections import OrderedDict
11
-
12
- import numpy as np
13
-
14
- from embeddings.constants import CACHE_MAX_SIZE
15
-
16
- logger = logging.getLogger(__name__)
17
-
18
-
19
- class LRUCache:
20
- """Simple LRU cache for embeddings."""
21
-
22
- def __init__(self, max_size: int = CACHE_MAX_SIZE):
23
- self.cache = OrderedDict()
24
- self.max_size = max_size
25
-
26
- def get(self, key: str) -> Optional[np.ndarray]:
27
- """Get item from cache, moving to end (most recent)."""
28
- if key not in self.cache:
29
- return None
30
-
31
- # Move to end (most recently used)
32
- self.cache.move_to_end(key)
33
- return np.array(self.cache[key])
34
-
35
- def set(self, key: str, value: np.ndarray):
36
- """Set item in cache, evicting oldest if full."""
37
- if key in self.cache:
38
- # Update existing
39
- self.cache.move_to_end(key)
40
- self.cache[key] = value.tolist()
41
- else:
42
- # Add new
43
- if len(self.cache) >= self.max_size:
44
- # Evict oldest
45
- self.cache.popitem(last=False)
46
- self.cache[key] = value.tolist()
47
-
48
- def save(self, path: Path):
49
- """Save cache to disk."""
50
- try:
51
- path.parent.mkdir(parents=True, exist_ok=True)
52
- with open(path, 'w') as f:
53
- json.dump(dict(self.cache), f)
54
- logger.debug(f"Saved {len(self.cache)} cached embeddings")
55
- except Exception as e:
56
- logger.error(f"Failed to save embedding cache: {e}")
57
-
58
- def load(self, path: Path):
59
- """Load cache from disk."""
60
- if not path.exists():
61
- return
62
-
63
- try:
64
- with open(path, 'r') as f:
65
- data = json.load(f)
66
- self.cache = OrderedDict(data)
67
- logger.info(f"Loaded {len(self.cache)} cached embeddings")
68
- except Exception as e:
69
- logger.error(f"Failed to load embedding cache: {e}")
70
- self.cache = OrderedDict()
@@ -1,113 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """CLI interface for testing the embedding engine.
5
- """
6
- import sys
7
- import json
8
- import time
9
- import logging
10
-
11
- from embeddings.constants import MEMORY_DIR
12
- from embeddings.engine import EmbeddingEngine
13
- from embeddings.database import add_embeddings_to_database
14
-
15
-
16
- def main():
17
- """Run the embedding engine CLI."""
18
- # Configure logging
19
- logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
20
-
21
- if len(sys.argv) < 2:
22
- print("EmbeddingEngine CLI - Local Embedding Generation")
23
- print("\nCommands:")
24
- print(" python embedding_engine.py stats # Show engine statistics")
25
- print(" python embedding_engine.py generate # Generate embeddings for database")
26
- print(" python embedding_engine.py test # Run performance test")
27
- print(" python embedding_engine.py clear-cache # Clear embedding cache")
28
- sys.exit(0)
29
-
30
- command = sys.argv[1]
31
-
32
- if command == "stats":
33
- engine = EmbeddingEngine()
34
- stats = engine.get_stats()
35
- print(json.dumps(stats, indent=2))
36
-
37
- elif command == "generate":
38
- db_path = MEMORY_DIR / "memory.db"
39
- if not db_path.exists():
40
- print(f"Database not found at {db_path}")
41
- sys.exit(1)
42
-
43
- print("Generating embeddings for all memories...")
44
- engine = EmbeddingEngine()
45
- add_embeddings_to_database(engine, db_path)
46
- print("Generation complete!")
47
- print(json.dumps(engine.get_stats(), indent=2))
48
-
49
- elif command == "clear-cache":
50
- engine = EmbeddingEngine()
51
- engine.clear_cache()
52
- engine.save_cache()
53
- print("Cache cleared!")
54
-
55
- elif command == "test":
56
- print("Running embedding performance test...")
57
-
58
- engine = EmbeddingEngine()
59
-
60
- # Test single encoding
61
- print("\nTest 1: Single text encoding")
62
- text = "This is a test sentence for embedding generation."
63
- start = time.time()
64
- embedding = engine.encode(text)
65
- elapsed = time.time() - start
66
- print(f" Time: {elapsed*1000:.2f}ms")
67
- print(f" Dimension: {len(embedding)}")
68
- print(f" Sample values: {embedding[:5]}")
69
-
70
- # Test batch encoding
71
- print("\nTest 2: Batch encoding (100 texts)")
72
- texts = [f"This is test sentence number {i} with some content." for i in range(100)]
73
- start = time.time()
74
- embeddings = engine.encode(texts, batch_size=32)
75
- elapsed = time.time() - start
76
- print(f" Time: {elapsed*1000:.2f}ms ({100/elapsed:.0f} texts/sec)")
77
- print(f" Shape: {embeddings.shape}")
78
-
79
- # Test cache
80
- print("\nTest 3: Cache performance")
81
- start = time.time()
82
- embedding_cached = engine.encode(text)
83
- elapsed = time.time() - start
84
- print(f" Cache hit time: {elapsed*1000:.4f}ms")
85
- print(f" Speedup: {(elapsed*1000):.0f}x faster")
86
-
87
- # Test similarity
88
- print("\nTest 4: Similarity computation")
89
- text1 = "The weather is nice today."
90
- text2 = "It's a beautiful day outside."
91
- text3 = "Python is a programming language."
92
-
93
- emb1 = engine.encode(text1)
94
- emb2 = engine.encode(text2)
95
- emb3 = engine.encode(text3)
96
-
97
- sim_12 = engine.similarity(emb1, emb2)
98
- sim_13 = engine.similarity(emb1, emb3)
99
-
100
- print(f" Similarity (weather vs beautiful day): {sim_12:.3f}")
101
- print(f" Similarity (weather vs programming): {sim_13:.3f}")
102
-
103
- # Print stats
104
- print("\nEngine statistics:")
105
- print(json.dumps(engine.get_stats(), indent=2))
106
-
107
- # Save cache
108
- engine.save_cache()
109
- print("\nCache saved!")
110
-
111
- else:
112
- print(f"Unknown command: {command}")
113
- print("Run without arguments to see available commands.")
@@ -1,47 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """Shared constants and feature-detection for the embeddings package.
5
- """
6
- import logging
7
- from pathlib import Path
8
-
9
- # SECURITY: Embedding generation limits to prevent resource exhaustion
10
- MAX_BATCH_SIZE = 128
11
- MAX_TEXT_LENGTH = 10_000
12
- CACHE_MAX_SIZE = 10_000
13
-
14
- # Optional sentence-transformers dependency
15
- SENTENCE_TRANSFORMERS_AVAILABLE = False
16
- try:
17
- from sentence_transformers import SentenceTransformer # noqa: F401
18
- SENTENCE_TRANSFORMERS_AVAILABLE = True
19
- except ImportError:
20
- SENTENCE_TRANSFORMERS_AVAILABLE = False
21
-
22
- # Fallback: TF-IDF vectorization
23
- SKLEARN_AVAILABLE = False
24
- try:
25
- from sklearn.feature_extraction.text import TfidfVectorizer # noqa: F401
26
- SKLEARN_AVAILABLE = True
27
- except ImportError:
28
- SKLEARN_AVAILABLE = False
29
-
30
- # GPU detection
31
- TORCH_AVAILABLE = False
32
- CUDA_AVAILABLE = False
33
- MPS_AVAILABLE = False # Apple Silicon
34
-
35
- try:
36
- import torch
37
- TORCH_AVAILABLE = True
38
- CUDA_AVAILABLE = torch.cuda.is_available()
39
- MPS_AVAILABLE = hasattr(torch.backends, 'mps') and torch.backends.mps.is_available()
40
- except ImportError:
41
- pass
42
-
43
- MEMORY_DIR = Path.home() / ".claude-memory"
44
- EMBEDDING_CACHE_PATH = MEMORY_DIR / "embedding_cache.json"
45
- MODEL_CACHE_PATH = MEMORY_DIR / "models" # Local model storage
46
-
47
- logger = logging.getLogger(__name__)
@@ -1,91 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """Database integration for batch embedding generation.
5
- """
6
- import json
7
- import sqlite3
8
- import logging
9
- from pathlib import Path
10
-
11
- logger = logging.getLogger(__name__)
12
-
13
-
14
- def add_embeddings_to_database(
15
- engine,
16
- db_path: Path,
17
- embedding_column: str = 'embedding',
18
- batch_size: int = 32
19
- ):
20
- """
21
- Generate embeddings for all memories in database.
22
-
23
- Args:
24
- engine: An EmbeddingEngine instance
25
- db_path: Path to SQLite database
26
- embedding_column: Column name to store embeddings
27
- batch_size: Batch size for processing
28
- """
29
- conn = sqlite3.connect(db_path)
30
- cursor = conn.cursor()
31
-
32
- try:
33
- # Check if embedding column exists
34
- cursor.execute("PRAGMA table_info(memories)")
35
- columns = {row[1] for row in cursor.fetchall()}
36
-
37
- if embedding_column not in columns:
38
- # Add column
39
- logger.info(f"Adding '{embedding_column}' column to database")
40
- cursor.execute(f'ALTER TABLE memories ADD COLUMN {embedding_column} TEXT')
41
- conn.commit()
42
-
43
- # Get memories without embeddings
44
- cursor.execute(f'''
45
- SELECT id, content, summary
46
- FROM memories
47
- WHERE {embedding_column} IS NULL OR {embedding_column} = ''
48
- ''')
49
- rows = cursor.fetchall()
50
-
51
- if not rows:
52
- logger.info("All memories already have embeddings")
53
- conn.close()
54
- return
55
-
56
- logger.info(f"Generating embeddings for {len(rows)} memories...")
57
-
58
- # Process in batches
59
- for i in range(0, len(rows), batch_size):
60
- batch = rows[i:i+batch_size]
61
- memory_ids = [row[0] for row in batch]
62
-
63
- # Combine content and summary
64
- texts = []
65
- for row in batch:
66
- content = row[1] or ""
67
- summary = row[2] or ""
68
- text = f"{content} {summary}".strip()
69
- texts.append(text)
70
-
71
- # Generate embeddings
72
- embeddings = engine.encode(texts, batch_size=batch_size)
73
-
74
- # Store in database
75
- for mem_id, embedding in zip(memory_ids, embeddings):
76
- embedding_json = json.dumps(embedding.tolist())
77
- cursor.execute(
78
- f'UPDATE memories SET {embedding_column} = ? WHERE id = ?',
79
- (embedding_json, mem_id)
80
- )
81
-
82
- conn.commit()
83
- logger.info(f"Processed {min(i+batch_size, len(rows))}/{len(rows)} memories")
84
-
85
- # Save cache
86
- engine.save_cache()
87
-
88
- logger.info(f"Successfully generated embeddings for {len(rows)} memories")
89
-
90
- finally:
91
- conn.close()
@@ -1,247 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """EmbeddingEngine - Core encoding logic for local embedding generation.
5
- """
6
- import hashlib
7
- import logging
8
- from pathlib import Path
9
- from typing import Any, Dict, List, Optional, Union
10
-
11
- import numpy as np
12
-
13
- from embeddings.constants import (
14
- MAX_BATCH_SIZE,
15
- MAX_TEXT_LENGTH,
16
- CACHE_MAX_SIZE,
17
- SENTENCE_TRANSFORMERS_AVAILABLE,
18
- SKLEARN_AVAILABLE,
19
- TORCH_AVAILABLE,
20
- CUDA_AVAILABLE,
21
- MPS_AVAILABLE,
22
- EMBEDDING_CACHE_PATH,
23
- MODEL_CACHE_PATH,
24
- )
25
- from embeddings.cache import LRUCache
26
- from embeddings.model_loader import ModelLoaderMixin
27
-
28
- logger = logging.getLogger(__name__)
29
-
30
-
31
- class EmbeddingEngine(ModelLoaderMixin):
32
- """
33
- Local embedding generation using sentence-transformers.
34
-
35
- Features:
36
- - all-MiniLM-L6-v2 model (384 dimensions, 80MB, fast)
37
- - Batch processing for efficiency (up to 128 texts)
38
- - GPU acceleration (CUDA/MPS) with automatic detection
39
- - LRU cache for repeated queries (10K entries)
40
- - Graceful fallback to TF-IDF if dependencies unavailable
41
-
42
- Performance:
43
- - CPU: ~100 embeddings/sec
44
- - GPU (CUDA): ~1000 embeddings/sec
45
- - Apple Silicon (MPS): ~500 embeddings/sec
46
- - Cache hit: ~0.001ms
47
- """
48
-
49
- def __init__(
50
- self,
51
- model_name: str = "all-MiniLM-L6-v2",
52
- device: Optional[str] = None,
53
- cache_path: Optional[Path] = None,
54
- model_cache_path: Optional[Path] = None,
55
- use_cache: bool = True
56
- ):
57
- """
58
- Initialize embedding engine.
59
-
60
- Args:
61
- model_name: Sentence transformer model name
62
- device: Device to use ('cuda', 'mps', 'cpu', or None for auto)
63
- cache_path: Custom path for embedding cache
64
- model_cache_path: Custom path for model storage
65
- use_cache: Whether to use LRU cache
66
- """
67
- self.model_name = model_name
68
- self.cache_path = cache_path or EMBEDDING_CACHE_PATH
69
- self.model_cache_path = model_cache_path or MODEL_CACHE_PATH
70
- self.use_cache = use_cache
71
-
72
- # Auto-detect device
73
- if device is None:
74
- if CUDA_AVAILABLE:
75
- device = 'cuda'
76
- logger.info("Using CUDA GPU acceleration")
77
- elif MPS_AVAILABLE:
78
- device = 'mps'
79
- logger.info("Using Apple Silicon (MPS) GPU acceleration")
80
- else:
81
- device = 'cpu'
82
- logger.info("Using CPU (consider GPU for faster processing)")
83
- self.device = device
84
-
85
- # Initialize model
86
- self.model = None
87
- self.dimension = 384 # Default for all-MiniLM-L6-v2
88
- self.use_transformers = SENTENCE_TRANSFORMERS_AVAILABLE
89
-
90
- # Initialize cache
91
- self.cache = LRUCache(max_size=CACHE_MAX_SIZE) if use_cache else None
92
- if self.cache:
93
- self.cache.load(self.cache_path)
94
-
95
- # Fallback: TF-IDF vectorizer
96
- self.tfidf_vectorizer = None
97
- self.tfidf_fitted = False
98
-
99
- # Load model (from ModelLoaderMixin)
100
- self._load_model()
101
-
102
- def _get_cache_key(self, text: str) -> str:
103
- """Generate cache key for text."""
104
- return hashlib.sha256(text.encode('utf-8')).hexdigest()[:32]
105
-
106
- def encode(
107
- self,
108
- texts: Union[str, List[str]],
109
- batch_size: int = 32,
110
- show_progress: bool = False,
111
- normalize: bool = True
112
- ) -> np.ndarray:
113
- """
114
- Generate embeddings for text(s).
115
-
116
- Args:
117
- texts: Single text or list of texts
118
- batch_size: Batch size for processing (max: 128)
119
- show_progress: Show progress bar for large batches
120
- normalize: Normalize embeddings to unit length
121
-
122
- Returns:
123
- Array of shape (n_texts, dimension) or (dimension,) for single text
124
- """
125
- single_input = isinstance(texts, str)
126
- if single_input:
127
- texts = [texts]
128
-
129
- if len(texts) == 0:
130
- return np.array([])
131
-
132
- batch_size = min(batch_size, MAX_BATCH_SIZE)
133
-
134
- # Validate text length
135
- for i, text in enumerate(texts):
136
- if not isinstance(text, str):
137
- raise ValueError(f"Text at index {i} is not a string")
138
- if len(text) > MAX_TEXT_LENGTH:
139
- logger.warning(f"Text {i} truncated from {len(text)} to {MAX_TEXT_LENGTH} chars")
140
- texts[i] = text[:MAX_TEXT_LENGTH]
141
-
142
- # Check cache for hits
143
- embeddings = []
144
- uncached_texts = []
145
- uncached_indices = []
146
-
147
- if self.cache:
148
- for i, text in enumerate(texts):
149
- cache_key = self._get_cache_key(text)
150
- cached = self.cache.get(cache_key)
151
- if cached is not None:
152
- embeddings.append((i, cached))
153
- else:
154
- uncached_texts.append(text)
155
- uncached_indices.append(i)
156
- else:
157
- uncached_texts = texts
158
- uncached_indices = list(range(len(texts)))
159
-
160
- # Generate embeddings for uncached texts
161
- if uncached_texts:
162
- if self.use_transformers and self.model:
163
- uncached_embeddings = self._encode_transformer(
164
- uncached_texts, batch_size=batch_size, show_progress=show_progress
165
- )
166
- elif self.tfidf_vectorizer:
167
- uncached_embeddings = self._encode_tfidf(uncached_texts)
168
- else:
169
- raise RuntimeError("No embedding method available")
170
-
171
- for i, text, embedding in zip(uncached_indices, uncached_texts, uncached_embeddings):
172
- if self.cache:
173
- cache_key = self._get_cache_key(text)
174
- self.cache.set(cache_key, embedding)
175
- embeddings.append((i, embedding))
176
-
177
- # Sort by original index and extract embeddings
178
- embeddings.sort(key=lambda x: x[0])
179
- result = np.array([emb for _, emb in embeddings])
180
-
181
- if normalize and len(result) > 0:
182
- norms = np.linalg.norm(result, axis=1, keepdims=True)
183
- norms[norms == 0] = 1
184
- result = result / norms
185
-
186
- if single_input:
187
- return result[0]
188
- return result
189
-
190
- def encode_batch(
191
- self,
192
- texts: List[str],
193
- batch_size: int = 32,
194
- show_progress: bool = True
195
- ) -> np.ndarray:
196
- """Convenience method for batch encoding with progress."""
197
- return self.encode(texts, batch_size=batch_size, show_progress=show_progress)
198
-
199
- def similarity(self, embedding1: np.ndarray, embedding2: np.ndarray) -> float:
200
- """Compute cosine similarity between two embeddings. Returns [0, 1]."""
201
- emb1 = embedding1 / (np.linalg.norm(embedding1) + 1e-8)
202
- emb2 = embedding2 / (np.linalg.norm(embedding2) + 1e-8)
203
- similarity = np.dot(emb1, emb2)
204
- return float(max(0.0, min(1.0, similarity)))
205
-
206
- def save_cache(self):
207
- """Save embedding cache to disk."""
208
- if self.cache:
209
- self.cache.save(self.cache_path)
210
-
211
- def clear_cache(self):
212
- """Clear embedding cache."""
213
- if self.cache:
214
- self.cache.cache.clear()
215
- logger.info("Cleared embedding cache")
216
-
217
- def get_stats(self) -> Dict[str, Any]:
218
- """Get embedding engine statistics."""
219
- return {
220
- 'sentence_transformers_available': SENTENCE_TRANSFORMERS_AVAILABLE,
221
- 'use_transformers': self.use_transformers,
222
- 'sklearn_available': SKLEARN_AVAILABLE,
223
- 'torch_available': TORCH_AVAILABLE,
224
- 'cuda_available': CUDA_AVAILABLE,
225
- 'mps_available': MPS_AVAILABLE,
226
- 'device': self.device,
227
- 'model_name': self.model_name,
228
- 'dimension': self.dimension,
229
- 'cache_enabled': self.cache is not None,
230
- 'cache_size': len(self.cache.cache) if self.cache else 0,
231
- 'cache_max_size': CACHE_MAX_SIZE,
232
- 'model_loaded': self.model is not None or self.tfidf_vectorizer is not None
233
- }
234
-
235
- def add_to_database(
236
- self,
237
- db_path,
238
- embedding_column: str = 'embedding',
239
- batch_size: int = 32
240
- ):
241
- """
242
- Generate embeddings for all memories in database.
243
-
244
- Delegates to :func:`embeddings.database.add_embeddings_to_database`.
245
- """
246
- from embeddings.database import add_embeddings_to_database
247
- add_embeddings_to_database(self, db_path, embedding_column, batch_size)