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,22 +0,0 @@
1
- # SuperLocalMemory - Core Feature Dependencies
2
- # ============================================================================
3
- # Required for knowledge graph and web dashboard.
4
- # Core memory operations work without these (stdlib only).
5
- #
6
- # Download size: ~50MB | Install time: 1-2 minutes
7
- # Install: pip3 install -r requirements-core.txt
8
- # ============================================================================
9
-
10
- # Knowledge Graph
11
- python-igraph>=0.10.0,<2.0.0
12
- leidenalg>=0.9.0,<1.0.0
13
- scikit-learn>=1.3.0,<2.0.0
14
-
15
- # Web Dashboard
16
- fastapi>=0.109.0,<1.0.0
17
- uvicorn[standard]>=0.27.0,<1.0.0
18
- python-multipart>=0.0.6,<1.0.0
19
-
20
- # Performance
21
- orjson>=3.9.0,<4.0.0
22
- diskcache>=5.6.0,<6.0.0
@@ -1,12 +0,0 @@
1
- # SuperLocalMemory - Learning Dependencies
2
- # ============================================================================
3
- # Optional but recommended. Enables intelligent pattern learning
4
- # and personalized recall ranking.
5
- #
6
- # If installation fails, core features work normally.
7
- # Install: pip3 install -r requirements-learning.txt
8
- # Download size: ~30MB
9
- # ============================================================================
10
-
11
- lightgbm>=4.0.0,<5.0.0
12
- scipy>=1.9.0,<2.0.0
package/requirements.txt DELETED
@@ -1,12 +0,0 @@
1
- # SuperLocalMemory - Core Requirements
2
- # ============================================================================
3
- # Core memory operations (store, recall, search) work with Python 3.8+
4
- # standard library only — no required dependencies.
5
- #
6
- # Advanced features (knowledge graph, dashboard, semantic search) require
7
- # optional dependencies listed in the other requirements files:
8
- # - requirements-core.txt (graph + dashboard)
9
- # - requirements-search.txt (semantic search)
10
- # - requirements-learning.txt (ML-based ranking)
11
- # - requirements-full.txt (everything)
12
- # ============================================================================
@@ -1,411 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """
5
- AgentRegistry — Tracks which AI agents connect to SuperLocalMemory,
6
- what they write, when, and via which protocol.
7
-
8
- Every MCP client (Claude, Cursor, Windsurf), CLI call, and REST API request
9
- gets registered here. This powers:
10
- - Dashboard "Connected Agents" panel
11
- - Trust scoring input (v2.5 silent collection)
12
- - Provenance tracking (who created which memory)
13
- - Usage analytics
14
-
15
- Agent Identity:
16
- Each agent gets a unique agent_id derived from its protocol + name.
17
- Example: "mcp:claude-desktop", "cli:terminal", "rest:api-client"
18
-
19
- Protocols:
20
- mcp — Model Context Protocol (Claude Desktop, Cursor, Windsurf, etc.)
21
- cli — Command-line interface (slm command, bin/ scripts)
22
- rest — REST API (api_server.py)
23
- python — Direct Python import
24
- """
25
-
26
- import json
27
- import logging
28
- import threading
29
- from datetime import datetime
30
- from pathlib import Path
31
- from typing import Optional, List, Dict, Any
32
-
33
- logger = logging.getLogger("superlocalmemory.agents")
34
-
35
-
36
- class AgentRegistry:
37
- """
38
- Registry of all agents that interact with SuperLocalMemory.
39
-
40
- Singleton per database path. Thread-safe.
41
- """
42
-
43
- _instances: Dict[str, "AgentRegistry"] = {}
44
- _instances_lock = threading.Lock()
45
-
46
- @classmethod
47
- def get_instance(cls, db_path: Optional[Path] = None) -> "AgentRegistry":
48
- """Get or create the singleton AgentRegistry."""
49
- if db_path is None:
50
- db_path = Path.home() / ".claude-memory" / "memory.db"
51
- key = str(db_path)
52
- with cls._instances_lock:
53
- if key not in cls._instances:
54
- cls._instances[key] = cls(db_path)
55
- return cls._instances[key]
56
-
57
- @classmethod
58
- def reset_instance(cls, db_path: Optional[Path] = None):
59
- """Remove singleton. Used for testing."""
60
- with cls._instances_lock:
61
- if db_path is None:
62
- cls._instances.clear()
63
- else:
64
- key = str(db_path)
65
- if key in cls._instances:
66
- del cls._instances[key]
67
-
68
- def __init__(self, db_path: Path):
69
- self.db_path = Path(db_path)
70
- self._init_schema()
71
- logger.info("AgentRegistry initialized: db=%s", self.db_path)
72
-
73
- def _init_schema(self):
74
- """Create agent_registry table if it doesn't exist."""
75
- try:
76
- from db_connection_manager import DbConnectionManager
77
- mgr = DbConnectionManager.get_instance(self.db_path)
78
-
79
- def _create(conn):
80
- conn.execute('''
81
- CREATE TABLE IF NOT EXISTS agent_registry (
82
- id INTEGER PRIMARY KEY AUTOINCREMENT,
83
- agent_id TEXT NOT NULL UNIQUE,
84
- agent_name TEXT,
85
- protocol TEXT NOT NULL,
86
- first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
87
- last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
88
- memories_written INTEGER DEFAULT 0,
89
- memories_recalled INTEGER DEFAULT 0,
90
- trust_score REAL DEFAULT 0.667,
91
- metadata TEXT DEFAULT '{}'
92
- )
93
- ''')
94
- conn.execute('''
95
- CREATE INDEX IF NOT EXISTS idx_agent_protocol
96
- ON agent_registry(protocol)
97
- ''')
98
- conn.execute('''
99
- CREATE INDEX IF NOT EXISTS idx_agent_last_seen
100
- ON agent_registry(last_seen)
101
- ''')
102
- conn.commit()
103
-
104
- mgr.execute_write(_create)
105
- except ImportError:
106
- import sqlite3
107
- conn = sqlite3.connect(str(self.db_path))
108
- try:
109
- conn.execute('''
110
- CREATE TABLE IF NOT EXISTS agent_registry (
111
- id INTEGER PRIMARY KEY AUTOINCREMENT,
112
- agent_id TEXT NOT NULL UNIQUE,
113
- agent_name TEXT,
114
- protocol TEXT NOT NULL,
115
- first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
116
- last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
117
- memories_written INTEGER DEFAULT 0,
118
- memories_recalled INTEGER DEFAULT 0,
119
- trust_score REAL DEFAULT 0.667,
120
- metadata TEXT DEFAULT '{}'
121
- )
122
- ''')
123
- conn.execute('CREATE INDEX IF NOT EXISTS idx_agent_protocol ON agent_registry(protocol)')
124
- conn.execute('CREATE INDEX IF NOT EXISTS idx_agent_last_seen ON agent_registry(last_seen)')
125
- conn.commit()
126
- finally:
127
- conn.close()
128
-
129
- # =========================================================================
130
- # Agent Registration
131
- # =========================================================================
132
-
133
- def register_agent(
134
- self,
135
- agent_id: str,
136
- agent_name: Optional[str] = None,
137
- protocol: str = "cli",
138
- metadata: Optional[dict] = None,
139
- ) -> dict:
140
- """
141
- Register or update an agent in the registry.
142
-
143
- If the agent already exists, updates last_seen and metadata.
144
- If new, creates the entry with trust_score=0.667 (Beta(2,1) prior).
145
-
146
- Args:
147
- agent_id: Unique identifier (e.g., "mcp:claude-desktop")
148
- agent_name: Human-readable name (e.g., "Claude Desktop")
149
- protocol: Connection protocol (mcp, cli, rest, python)
150
- metadata: Additional agent info (version, capabilities, etc.)
151
-
152
- Returns:
153
- Agent record dict
154
- """
155
- if not agent_id or not isinstance(agent_id, str):
156
- raise ValueError("agent_id must be a non-empty string")
157
-
158
- valid_protocols = ("mcp", "cli", "rest", "python")
159
- if protocol not in valid_protocols:
160
- raise ValueError(f"Invalid protocol: {protocol}. Must be one of {valid_protocols}")
161
-
162
- now = datetime.now().isoformat()
163
- meta_json = json.dumps(metadata or {})
164
-
165
- try:
166
- from db_connection_manager import DbConnectionManager
167
- mgr = DbConnectionManager.get_instance(self.db_path)
168
-
169
- def _upsert(conn):
170
- conn.execute('''
171
- INSERT INTO agent_registry (agent_id, agent_name, protocol, first_seen, last_seen, metadata)
172
- VALUES (?, ?, ?, ?, ?, ?)
173
- ON CONFLICT(agent_id) DO UPDATE SET
174
- last_seen = excluded.last_seen,
175
- metadata = excluded.metadata,
176
- agent_name = COALESCE(excluded.agent_name, agent_registry.agent_name)
177
- ''', (agent_id, agent_name, protocol, now, now, meta_json))
178
- conn.commit()
179
-
180
- mgr.execute_write(_upsert)
181
- except ImportError:
182
- import sqlite3
183
- conn = sqlite3.connect(str(self.db_path))
184
- try:
185
- conn.execute('''
186
- INSERT INTO agent_registry (agent_id, agent_name, protocol, first_seen, last_seen, metadata)
187
- VALUES (?, ?, ?, ?, ?, ?)
188
- ON CONFLICT(agent_id) DO UPDATE SET
189
- last_seen = excluded.last_seen,
190
- metadata = excluded.metadata,
191
- agent_name = COALESCE(excluded.agent_name, agent_registry.agent_name)
192
- ''', (agent_id, agent_name, protocol, now, now, meta_json))
193
- conn.commit()
194
- finally:
195
- conn.close()
196
-
197
- # Emit agent.connected event
198
- try:
199
- from event_bus import EventBus
200
- bus = EventBus.get_instance(self.db_path)
201
- bus.emit("agent.connected", payload={
202
- "agent_id": agent_id,
203
- "agent_name": agent_name,
204
- "protocol": protocol,
205
- })
206
- except Exception:
207
- pass
208
-
209
- logger.info("Agent registered: id=%s, protocol=%s", agent_id, protocol)
210
- return self.get_agent(agent_id) or {"agent_id": agent_id}
211
-
212
- def record_write(self, agent_id: str):
213
- """Increment memories_written counter and update last_seen."""
214
- self._increment_counter(agent_id, "memories_written")
215
-
216
- def record_recall(self, agent_id: str):
217
- """Increment memories_recalled counter and update last_seen."""
218
- self._increment_counter(agent_id, "memories_recalled")
219
-
220
- def _increment_counter(self, agent_id: str, column: str):
221
- """Increment a counter column for an agent."""
222
- if column not in ("memories_written", "memories_recalled"):
223
- return
224
-
225
- now = datetime.now().isoformat()
226
-
227
- try:
228
- from db_connection_manager import DbConnectionManager
229
- mgr = DbConnectionManager.get_instance(self.db_path)
230
-
231
- def _inc(conn):
232
- conn.execute(
233
- f"UPDATE agent_registry SET {column} = {column} + 1, last_seen = ? WHERE agent_id = ?",
234
- (now, agent_id)
235
- )
236
- conn.commit()
237
-
238
- mgr.execute_write(_inc)
239
- except Exception as e:
240
- logger.error("Failed to increment %s for %s: %s", column, agent_id, e)
241
-
242
- # =========================================================================
243
- # Query Agents
244
- # =========================================================================
245
-
246
- def get_agent(self, agent_id: str) -> Optional[dict]:
247
- """Get a specific agent by ID."""
248
- try:
249
- from db_connection_manager import DbConnectionManager
250
- mgr = DbConnectionManager.get_instance(self.db_path)
251
-
252
- with mgr.read_connection() as conn:
253
- cursor = conn.cursor()
254
- cursor.execute("""
255
- SELECT agent_id, agent_name, protocol, first_seen, last_seen,
256
- memories_written, memories_recalled, trust_score, metadata
257
- FROM agent_registry WHERE agent_id = ?
258
- """, (agent_id,))
259
- row = cursor.fetchone()
260
-
261
- if not row:
262
- return None
263
-
264
- return self._row_to_dict(row)
265
- except Exception as e:
266
- logger.error("Failed to get agent %s: %s", agent_id, e)
267
- return None
268
-
269
- def list_agents(
270
- self,
271
- protocol: Optional[str] = None,
272
- limit: int = 50,
273
- active_since_hours: Optional[int] = None,
274
- ) -> List[dict]:
275
- """
276
- List registered agents with optional filtering.
277
-
278
- Args:
279
- protocol: Filter by protocol (mcp, cli, rest, python)
280
- limit: Max agents to return
281
- active_since_hours: Only agents seen within N hours
282
-
283
- Returns:
284
- List of agent dicts, ordered by last_seen descending
285
- """
286
- try:
287
- from db_connection_manager import DbConnectionManager
288
- mgr = DbConnectionManager.get_instance(self.db_path)
289
-
290
- with mgr.read_connection() as conn:
291
- cursor = conn.cursor()
292
-
293
- query = """
294
- SELECT agent_id, agent_name, protocol, first_seen, last_seen,
295
- memories_written, memories_recalled, trust_score, metadata
296
- FROM agent_registry WHERE 1=1
297
- """
298
- params = []
299
-
300
- if protocol:
301
- query += " AND protocol = ?"
302
- params.append(protocol)
303
-
304
- if active_since_hours:
305
- query += " AND last_seen >= datetime('now', '-' || ? || ' hours')"
306
- params.append(active_since_hours)
307
-
308
- query += " ORDER BY last_seen DESC LIMIT ?"
309
- params.append(limit)
310
-
311
- cursor.execute(query, params)
312
- rows = cursor.fetchall()
313
-
314
- return [self._row_to_dict(row) for row in rows]
315
- except Exception as e:
316
- logger.error("Failed to list agents: %s", e)
317
- return []
318
-
319
- def list_active_agents(self, timeout_minutes: int = 5) -> List[dict]:
320
- """
321
- List only active agents (seen within timeout_minutes).
322
-
323
- Used by dashboard to filter out ghost/disconnected agents.
324
- Default: agents seen within last 5 minutes are considered active.
325
-
326
- Args:
327
- timeout_minutes: Consider agents active if seen within this many minutes
328
-
329
- Returns:
330
- List of active agent dicts
331
- """
332
- try:
333
- from db_connection_manager import DbConnectionManager
334
- mgr = DbConnectionManager.get_instance(self.db_path)
335
-
336
- with mgr.read_connection() as conn:
337
- cursor = conn.cursor()
338
- cursor.execute("""
339
- SELECT agent_id, agent_name, protocol, first_seen, last_seen,
340
- memories_written, memories_recalled, trust_score, metadata
341
- FROM agent_registry
342
- WHERE last_seen >= datetime('now', '-' || ? || ' minutes')
343
- ORDER BY last_seen DESC
344
- """, (timeout_minutes,))
345
- rows = cursor.fetchall()
346
-
347
- return [self._row_to_dict(row) for row in rows]
348
- except Exception as e:
349
- logger.error("Failed to list active agents: %s", e)
350
- return []
351
-
352
- def get_stats(self) -> dict:
353
- """Get agent registry statistics."""
354
- try:
355
- from db_connection_manager import DbConnectionManager
356
- mgr = DbConnectionManager.get_instance(self.db_path)
357
-
358
- with mgr.read_connection() as conn:
359
- cursor = conn.cursor()
360
-
361
- cursor.execute("SELECT COUNT(*) FROM agent_registry")
362
- total = cursor.fetchone()[0]
363
-
364
- cursor.execute("""
365
- SELECT protocol, COUNT(*) FROM agent_registry
366
- GROUP BY protocol ORDER BY COUNT(*) DESC
367
- """)
368
- by_protocol = dict(cursor.fetchall())
369
-
370
- cursor.execute("""
371
- SELECT SUM(memories_written), SUM(memories_recalled)
372
- FROM agent_registry
373
- """)
374
- sums = cursor.fetchone()
375
-
376
- cursor.execute("""
377
- SELECT COUNT(*) FROM agent_registry
378
- WHERE last_seen >= datetime('now', '-24 hours')
379
- """)
380
- active_24h = cursor.fetchone()[0]
381
-
382
- return {
383
- "total_agents": total,
384
- "active_last_24h": active_24h,
385
- "by_protocol": by_protocol,
386
- "total_writes": sums[0] or 0,
387
- "total_recalls": sums[1] or 0,
388
- }
389
- except Exception as e:
390
- logger.error("Failed to get agent stats: %s", e)
391
- return {"total_agents": 0, "error": str(e)}
392
-
393
- def _row_to_dict(self, row: tuple) -> dict:
394
- """Convert a database row to an agent dict."""
395
- metadata = {}
396
- try:
397
- metadata = json.loads(row[8]) if row[8] else {}
398
- except (json.JSONDecodeError, TypeError):
399
- pass
400
-
401
- return {
402
- "agent_id": row[0],
403
- "agent_name": row[1],
404
- "protocol": row[2],
405
- "first_seen": row[3],
406
- "last_seen": row[4],
407
- "memories_written": row[5],
408
- "memories_recalled": row[6],
409
- "trust_score": row[7],
410
- "metadata": metadata,
411
- }
@@ -1,61 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """SuperLocalMemory V2 - Optional API Key Authentication
5
-
6
- Opt-in API key authentication for dashboard and API endpoints.
7
- When ~/.claude-memory/api_key file exists, write endpoints require
8
- X-SLM-API-Key header. Read endpoints remain open for backward compatibility.
9
- """
10
- import os
11
- import hashlib
12
- import logging
13
- from pathlib import Path
14
- from typing import Optional
15
-
16
- logger = logging.getLogger(__name__)
17
-
18
- MEMORY_DIR = Path.home() / ".claude-memory"
19
- API_KEY_FILE = MEMORY_DIR / "api_key"
20
-
21
-
22
- def _load_api_key_hash() -> Optional[str]:
23
- """Load API key hash from file. Returns None if auth is not configured."""
24
- if not API_KEY_FILE.exists():
25
- return None
26
- try:
27
- key = API_KEY_FILE.read_text().strip()
28
- if not key:
29
- return None
30
- return hashlib.sha256(key.encode()).hexdigest()
31
- except Exception as e:
32
- logger.warning("Failed to load API key: %s", e)
33
- return None
34
-
35
-
36
- def check_api_key(request_headers: dict, is_write: bool = False) -> bool:
37
- """
38
- Check if request is authorized.
39
-
40
- Returns True if:
41
- - No API key file exists (auth not configured — backward compatible)
42
- - Request is a read operation (reads always allowed)
43
- - Request has valid X-SLM-API-Key header matching the key file
44
- """
45
- key_hash = _load_api_key_hash()
46
-
47
- # No key file = auth not configured = allow all (backward compat)
48
- if key_hash is None:
49
- return True
50
-
51
- # Read operations always allowed
52
- if not is_write:
53
- return True
54
-
55
- # Write operations require valid key
56
- provided_key = request_headers.get("x-slm-api-key", "")
57
- if not provided_key:
58
- return False
59
-
60
- provided_hash = hashlib.sha256(provided_key.encode()).hexdigest()
61
- return provided_hash == key_hash