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,116 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
3
- """ABAC middleware for MCP tool integration.
4
-
5
- Provides a simple interface for MCP tools to check access before
6
- executing memory operations. Delegates to ABACEngine for policy
7
- evaluation.
8
- """
9
- import threading
10
- from pathlib import Path
11
- from typing import Any, Dict, Optional
12
-
13
- from .abac_engine import ABACEngine
14
-
15
-
16
- class ABACMiddleware:
17
- """Thin middleware between MCP tools and ABAC policy engine.
18
-
19
- Usage from MCP tools:
20
- mw = ABACMiddleware(db_path)
21
- result = mw.check_access(agent_id="agent_1", action="read",
22
- resource={"access_level": "private"})
23
- if not result["allowed"]:
24
- return error_response(result["reason"])
25
- """
26
-
27
- def __init__(
28
- self,
29
- db_path: Optional[str] = None,
30
- policy_path: Optional[str] = None,
31
- ) -> None:
32
- if db_path is None:
33
- db_path = str(Path.home() / ".claude-memory" / "memory.db")
34
- self._db_path = str(db_path)
35
-
36
- if policy_path is None:
37
- policy_path = str(
38
- Path(self._db_path).parent / "abac_policies.json"
39
- )
40
-
41
- self._lock = threading.Lock()
42
- self.denied_count = 0
43
- self.allowed_count = 0
44
-
45
- try:
46
- self._engine = ABACEngine(config_path=policy_path)
47
- except Exception:
48
- self._engine = None
49
-
50
- def check_access(
51
- self,
52
- agent_id: str,
53
- action: str,
54
- resource: Optional[Dict[str, Any]] = None,
55
- ) -> Dict[str, Any]:
56
- """Check if an agent has access to perform an action.
57
-
58
- Args:
59
- agent_id: Identifier for the requesting agent.
60
- action: The action being performed (read, write, delete).
61
- resource: Resource attributes (access_level, project, tags).
62
-
63
- Returns:
64
- Dict with ``allowed`` (bool), ``reason`` (str), and
65
- optionally ``policy_name``.
66
- """
67
- if self._engine is None:
68
- return {
69
- "allowed": True,
70
- "reason": "ABAC engine unavailable — default allow",
71
- }
72
-
73
- subject = {"agent_id": agent_id}
74
- result = self._engine.evaluate(
75
- subject=subject,
76
- resource=resource or {},
77
- action=action,
78
- )
79
-
80
- with self._lock:
81
- if result["allowed"]:
82
- self.allowed_count += 1
83
- else:
84
- self.denied_count += 1
85
-
86
- return result
87
-
88
- def build_agent_context(
89
- self,
90
- agent_id: str = "user",
91
- protocol: str = "mcp",
92
- ) -> Dict[str, Any]:
93
- """Build an agent context dict for passing to MemoryStoreV2.
94
-
95
- Args:
96
- agent_id: Agent identifier.
97
- protocol: Access protocol (mcp, cli, dashboard).
98
-
99
- Returns:
100
- Dict suitable for ``MemoryStoreV2.search(agent_context=...)``.
101
- """
102
- return {
103
- "agent_id": agent_id,
104
- "protocol": protocol,
105
- }
106
-
107
- def get_status(self) -> Dict[str, Any]:
108
- """Return middleware status."""
109
- return {
110
- "engine_available": self._engine is not None,
111
- "policies_loaded": (
112
- len(self._engine.policies) if self._engine else 0
113
- ),
114
- "allowed_count": self.allowed_count,
115
- "denied_count": self.denied_count,
116
- }
@@ -1,215 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
3
- """Audit database management with hash chain tamper detection.
4
-
5
- Provides a tamper-evident audit trail stored in a separate audit.db.
6
- Each entry's hash incorporates the previous entry's hash, forming a
7
- chain that can detect any modification to historical records.
8
- """
9
- import hashlib
10
- import json
11
- import sqlite3
12
- import threading
13
- from datetime import datetime, timezone
14
- from typing import Any, Dict, List, Optional
15
-
16
-
17
- _GENESIS = "genesis"
18
-
19
- _SCHEMA = """
20
- CREATE TABLE IF NOT EXISTS audit_events (
21
- id INTEGER PRIMARY KEY AUTOINCREMENT,
22
- event_type TEXT NOT NULL,
23
- actor TEXT NOT NULL,
24
- resource_id INTEGER,
25
- details TEXT DEFAULT '{}',
26
- prev_hash TEXT NOT NULL,
27
- entry_hash TEXT NOT NULL,
28
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
29
- )
30
- """
31
-
32
-
33
- def _compute_hash(
34
- event_type: str,
35
- actor: str,
36
- resource_id: Optional[int],
37
- details: str,
38
- prev_hash: str,
39
- created_at: str,
40
- ) -> str:
41
- """Compute SHA-256 hash for an audit entry."""
42
- payload = (
43
- f"{event_type}{actor}{resource_id}{details}{prev_hash}{created_at}"
44
- )
45
- return hashlib.sha256(payload.encode("utf-8")).hexdigest()
46
-
47
-
48
- class AuditDB:
49
- """Manages audit.db -- tamper-evident compliance audit trail.
50
-
51
- The hash chain guarantees that any modification to a stored event
52
- will be detected by verify_chain(). The first entry uses a fixed
53
- genesis value as its previous hash.
54
- """
55
-
56
- def __init__(self, db_path: Optional[str] = None):
57
- self._db_path = db_path
58
- self._lock = threading.Lock()
59
- if db_path:
60
- self._init_db()
61
-
62
- # ------------------------------------------------------------------
63
- # Internal helpers
64
- # ------------------------------------------------------------------
65
-
66
- def _get_conn(self) -> sqlite3.Connection:
67
- conn = sqlite3.connect(self._db_path)
68
- conn.execute("PRAGMA journal_mode=WAL")
69
- conn.execute("PRAGMA foreign_keys=ON")
70
- conn.row_factory = sqlite3.Row
71
- return conn
72
-
73
- def _init_db(self) -> None:
74
- conn = self._get_conn()
75
- try:
76
- conn.executescript(_SCHEMA)
77
- conn.commit()
78
- finally:
79
- conn.close()
80
-
81
- # ------------------------------------------------------------------
82
- # Public API
83
- # ------------------------------------------------------------------
84
-
85
- def log_event(
86
- self,
87
- event_type: str,
88
- actor: str = "system",
89
- resource_id: Optional[int] = None,
90
- details: Optional[Dict[str, Any]] = None,
91
- ) -> int:
92
- """Append an event to the audit trail and return its row id."""
93
- details_str = json.dumps(details or {}, sort_keys=True)
94
- created_at = datetime.now(timezone.utc).isoformat()
95
-
96
- with self._lock:
97
- conn = self._get_conn()
98
- try:
99
- # Fetch the hash of the most recent entry (or genesis)
100
- row = conn.execute(
101
- "SELECT entry_hash FROM audit_events "
102
- "ORDER BY id DESC LIMIT 1"
103
- ).fetchone()
104
- prev_hash = row["entry_hash"] if row else _GENESIS
105
-
106
- entry_hash = _compute_hash(
107
- event_type, actor, resource_id,
108
- details_str, prev_hash, created_at,
109
- )
110
-
111
- cursor = conn.execute(
112
- "INSERT INTO audit_events "
113
- "(event_type, actor, resource_id, details, "
114
- " prev_hash, entry_hash, created_at) "
115
- "VALUES (?, ?, ?, ?, ?, ?, ?)",
116
- (
117
- event_type, actor, resource_id,
118
- details_str, prev_hash, entry_hash, created_at,
119
- ),
120
- )
121
- conn.commit()
122
- return cursor.lastrowid
123
- finally:
124
- conn.close()
125
-
126
- def query_events(
127
- self,
128
- event_type: Optional[str] = None,
129
- actor: Optional[str] = None,
130
- resource_id: Optional[int] = None,
131
- limit: int = 100,
132
- ) -> List[Dict[str, Any]]:
133
- """Query audit events with optional filters."""
134
- clauses: List[str] = []
135
- params: List[Any] = []
136
-
137
- if event_type is not None:
138
- clauses.append("event_type = ?")
139
- params.append(event_type)
140
- if actor is not None:
141
- clauses.append("actor = ?")
142
- params.append(actor)
143
- if resource_id is not None:
144
- clauses.append("resource_id = ?")
145
- params.append(resource_id)
146
-
147
- where = f"WHERE {' AND '.join(clauses)}" if clauses else ""
148
- sql = (
149
- f"SELECT id, event_type, actor, resource_id, details, "
150
- f"prev_hash, entry_hash, created_at "
151
- f"FROM audit_events {where} "
152
- f"ORDER BY id DESC LIMIT ?"
153
- )
154
- params.append(limit)
155
-
156
- conn = self._get_conn()
157
- try:
158
- rows = conn.execute(sql, params).fetchall()
159
- return [dict(r) for r in rows]
160
- finally:
161
- conn.close()
162
-
163
- def verify_chain(self) -> Dict[str, Any]:
164
- """Verify the integrity of the entire hash chain.
165
-
166
- Returns a dict with:
167
- valid -- bool, True if chain is intact
168
- entries_checked -- int, number of entries verified
169
- error -- str or None, description of first failure
170
- """
171
- conn = self._get_conn()
172
- try:
173
- rows = conn.execute(
174
- "SELECT id, event_type, actor, resource_id, details, "
175
- "prev_hash, entry_hash, created_at "
176
- "FROM audit_events ORDER BY id"
177
- ).fetchall()
178
- finally:
179
- conn.close()
180
-
181
- if not rows:
182
- return {"valid": True, "entries_checked": 0, "error": None}
183
-
184
- expected_prev = _GENESIS
185
- for row in rows:
186
- row = dict(row)
187
- # Check the prev_hash link
188
- if row["prev_hash"] != expected_prev:
189
- return {
190
- "valid": False,
191
- "entries_checked": row["id"],
192
- "error": f"prev_hash mismatch at entry {row['id']}",
193
- }
194
- # Recompute the entry hash
195
- computed = _compute_hash(
196
- row["event_type"],
197
- row["actor"],
198
- row["resource_id"],
199
- row["details"],
200
- row["prev_hash"],
201
- row["created_at"],
202
- )
203
- if computed != row["entry_hash"]:
204
- return {
205
- "valid": False,
206
- "entries_checked": row["id"],
207
- "error": f"entry_hash mismatch at entry {row['id']}",
208
- }
209
- expected_prev = row["entry_hash"]
210
-
211
- return {
212
- "valid": True,
213
- "entries_checked": len(rows),
214
- "error": None,
215
- }
@@ -1,148 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
3
- """EventBus listener that writes all events to audit.db.
4
-
5
- Bridges the EventBus (real-time event emission) with AuditDB (tamper-evident
6
- audit trail). Every event that passes through the EventBus gets persisted
7
- into audit.db with full hash-chain integrity.
8
-
9
- Thread-safe: handle_event() runs on the emitter's thread and must be fast.
10
- Graceful: malformed events are logged defensively, never crash the caller.
11
- """
12
- import json
13
- import logging
14
- import threading
15
- from typing import Any, Dict, Optional
16
-
17
- from .audit_db import AuditDB
18
-
19
- logger = logging.getLogger("superlocalmemory.compliance.audit_logger")
20
-
21
-
22
- class AuditLogger:
23
- """Listens to EventBus events and writes them to audit.db.
24
-
25
- Usage:
26
- audit_logger = AuditLogger("/path/to/audit.db")
27
- audit_logger.register_with_eventbus() # auto-subscribe
28
-
29
- Or manually:
30
- event_bus.add_listener(audit_logger.handle_event)
31
- """
32
-
33
- def __init__(self, audit_db_path: str):
34
- self._audit_db = AuditDB(audit_db_path)
35
- self._lock = threading.Lock()
36
- self._events_logged: int = 0
37
- self._errors: int = 0
38
- self._registered: bool = False
39
-
40
- # ------------------------------------------------------------------
41
- # Public API
42
- # ------------------------------------------------------------------
43
-
44
- @property
45
- def events_logged(self) -> int:
46
- """Total number of events successfully written to audit.db."""
47
- return self._events_logged
48
-
49
- def handle_event(self, event: Dict[str, Any]) -> None:
50
- """Process a single EventBus event and write it to audit.db.
51
-
52
- Extracts event_type, source_agent (actor), memory_id (resource_id),
53
- and payload (details) from the event dict, then delegates to
54
- AuditDB.log_event().
55
-
56
- This method MUST NOT raise — it runs on the emitter's thread.
57
- Any failure is caught, logged, and counted in self._errors.
58
-
59
- Args:
60
- event: Dict emitted by EventBus. Expected keys:
61
- event_type, source_agent, memory_id, payload, timestamp.
62
- All keys are optional for graceful degradation.
63
- """
64
- try:
65
- if not isinstance(event, dict):
66
- logger.warning("AuditLogger received non-dict event: %s", type(event))
67
- return
68
-
69
- event_type = event.get("event_type", "unknown")
70
- actor = event.get("source_agent", "system")
71
- resource_id = event.get("memory_id")
72
- payload = event.get("payload", {})
73
-
74
- # Build details dict including any extra context
75
- details = {}
76
- if isinstance(payload, dict):
77
- details.update(payload)
78
- else:
79
- details["raw_payload"] = str(payload)
80
-
81
- # Include timestamp from event if present
82
- ts = event.get("timestamp")
83
- if ts:
84
- details["event_timestamp"] = ts
85
-
86
- with self._lock:
87
- self._audit_db.log_event(
88
- event_type=event_type,
89
- actor=actor,
90
- resource_id=resource_id,
91
- details=details,
92
- )
93
- self._events_logged += 1
94
-
95
- except Exception as exc:
96
- self._errors += 1
97
- logger.error(
98
- "AuditLogger failed to log event: %s (event=%s)",
99
- exc,
100
- _safe_repr(event),
101
- )
102
-
103
- def register_with_eventbus(self) -> bool:
104
- """Register this logger as an EventBus listener.
105
-
106
- Attempts to find the EventBus singleton and subscribe
107
- handle_event as a listener. Returns True on success,
108
- False if EventBus is unavailable.
109
-
110
- Graceful: never raises; returns False on any failure.
111
- """
112
- try:
113
- from event_bus import EventBus as EB
114
-
115
- bus = EB.get_instance()
116
- bus.add_listener(self.handle_event)
117
- self._registered = True
118
- logger.info("AuditLogger registered with EventBus")
119
- return True
120
- except Exception as exc:
121
- logger.warning("AuditLogger could not register with EventBus: %s", exc)
122
- self._registered = False
123
- return False
124
-
125
- def get_status(self) -> Dict[str, Any]:
126
- """Return diagnostic status of this audit logger.
127
-
128
- Returns:
129
- Dict with keys: events_logged, errors, registered.
130
- """
131
- return {
132
- "events_logged": self._events_logged,
133
- "errors": self._errors,
134
- "registered": self._registered,
135
- }
136
-
137
-
138
- # ------------------------------------------------------------------
139
- # Internal helpers
140
- # ------------------------------------------------------------------
141
-
142
- def _safe_repr(obj: Any, max_len: int = 200) -> str:
143
- """Safe repr that truncates and never raises."""
144
- try:
145
- r = repr(obj)
146
- return r[:max_len] + "..." if len(r) > max_len else r
147
- except Exception:
148
- return "<unrepresentable>"