superlocalmemory 2.8.5 → 3.0.0

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