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,54 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
3
- """SLM v2.8 Lifecycle Engine — Memory State Machine + Bounded Growth.
4
-
5
- Manages memory states: ACTIVE → WARM → COLD → ARCHIVED → TOMBSTONED.
6
- Layers on top of existing tier-based compression.
7
- All features opt-in: absent config = v2.7 behavior.
8
-
9
- Graceful degradation: if this module fails to import,
10
- core memory operations continue unchanged.
11
- """
12
- import threading
13
- from pathlib import Path
14
- from typing import Optional, Dict, Any
15
-
16
- # Feature flags
17
- LIFECYCLE_AVAILABLE = False
18
- _init_error = None
19
-
20
- try:
21
- from .lifecycle_engine import LifecycleEngine
22
- from .lifecycle_evaluator import LifecycleEvaluator
23
- from .retention_policy import RetentionPolicyManager
24
- from .bounded_growth import BoundedGrowthEnforcer
25
- LIFECYCLE_AVAILABLE = True
26
- except ImportError as e:
27
- _init_error = str(e)
28
-
29
- # Lazy singletons
30
- _lifecycle_engine: Optional["LifecycleEngine"] = None
31
- _lifecycle_lock = threading.Lock()
32
-
33
-
34
- def get_lifecycle_engine(db_path: Optional[Path] = None) -> Optional["LifecycleEngine"]:
35
- """Get or create the lifecycle engine singleton. Returns None if unavailable."""
36
- global _lifecycle_engine
37
- if not LIFECYCLE_AVAILABLE:
38
- return None
39
- with _lifecycle_lock:
40
- if _lifecycle_engine is None:
41
- try:
42
- _lifecycle_engine = LifecycleEngine(db_path)
43
- except Exception:
44
- return None
45
- return _lifecycle_engine
46
-
47
-
48
- def get_status() -> Dict[str, Any]:
49
- """Return lifecycle engine status."""
50
- return {
51
- "lifecycle_available": LIFECYCLE_AVAILABLE,
52
- "init_error": _init_error,
53
- "engine_active": _lifecycle_engine is not None,
54
- }
@@ -1,239 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
3
- """Bounded growth enforcement — ensures memory counts stay within limits.
4
-
5
- When the count of memories in a given lifecycle state exceeds configurable
6
- bounds, the lowest-scoring memories are transitioned to the next state.
7
-
8
- Scoring formula: importance_norm * recency_factor * frequency_factor * behavioral_value
9
- - importance_norm: importance / 10.0 (0.1 to 1.0)
10
- - recency_factor: 1.0 / (1.0 + days_stale / 30.0) (exponential decay)
11
- - frequency_factor: 0.5 + 0.5 * min(access_count / age_days, 1.0)
12
- - behavioral_value: 1.0 (placeholder for Phase 2 integration)
13
-
14
- Lower score = evict first.
15
- """
16
- import sqlite3
17
- import json
18
- from datetime import datetime
19
- from pathlib import Path
20
- from typing import Optional, Dict, Any, List
21
-
22
- from .lifecycle_engine import LifecycleEngine
23
-
24
-
25
- # Default bounds — generous defaults, configurable via lifecycle_config.json
26
- DEFAULT_BOUNDS: Dict[str, int] = {
27
- "max_active": 10000,
28
- "max_warm": 5000,
29
- }
30
-
31
-
32
- class BoundedGrowthEnforcer:
33
- """Enforces memory count limits by transitioning lowest-scoring memories.
34
-
35
- When active memories exceed max_active, the lowest-scoring transition to warm.
36
- When warm memories exceed max_warm, the lowest-scoring transition to cold.
37
- """
38
-
39
- def __init__(
40
- self,
41
- db_path: Optional[str] = None,
42
- config_path: Optional[str] = None,
43
- ):
44
- if db_path is None:
45
- db_path = str(Path.home() / ".claude-memory" / "memory.db")
46
- self._db_path = str(db_path)
47
- self._config_path = config_path
48
- self._engine = LifecycleEngine(self._db_path)
49
-
50
- def _get_connection(self) -> sqlite3.Connection:
51
- """Get a SQLite connection to memory.db."""
52
- conn = sqlite3.connect(self._db_path)
53
- conn.row_factory = sqlite3.Row
54
- return conn
55
-
56
- def enforce_bounds(self, profile: Optional[str] = None) -> Dict[str, Any]:
57
- """Check memory counts and transition excess memories.
58
-
59
- Args:
60
- profile: Filter by profile (None = all)
61
-
62
- Returns:
63
- Dict with enforced status, counts, limits, and transitions list
64
- """
65
- bounds = self._load_bounds()
66
- max_active = bounds.get("max_active", DEFAULT_BOUNDS["max_active"])
67
- max_warm = bounds.get("max_warm", DEFAULT_BOUNDS["max_warm"])
68
-
69
- transitions: List[Dict[str, Any]] = []
70
-
71
- # Enforce active limit
72
- active_transitions = self._enforce_state_limit(
73
- state="active",
74
- target_state="warm",
75
- max_count=max_active,
76
- profile=profile,
77
- )
78
- transitions.extend(active_transitions)
79
-
80
- # Enforce warm limit
81
- warm_transitions = self._enforce_state_limit(
82
- state="warm",
83
- target_state="cold",
84
- max_count=max_warm,
85
- profile=profile,
86
- )
87
- transitions.extend(warm_transitions)
88
-
89
- # Build result
90
- dist = self._engine.get_state_distribution()
91
- return {
92
- "enforced": len(transitions) > 0,
93
- "active_count": dist.get("active", 0),
94
- "active_limit": max_active,
95
- "warm_count": dist.get("warm", 0),
96
- "warm_limit": max_warm,
97
- "transitions": transitions,
98
- }
99
-
100
- def _enforce_state_limit(
101
- self,
102
- state: str,
103
- target_state: str,
104
- max_count: int,
105
- profile: Optional[str] = None,
106
- ) -> List[Dict[str, Any]]:
107
- """Enforce a single state's count limit.
108
-
109
- Scores all memories in the given state, evicts the lowest-scoring
110
- excess memories to target_state.
111
- """
112
- scored = self.score_all_memories(state=state, profile=profile)
113
- current_count = len(scored)
114
-
115
- if current_count <= max_count:
116
- return []
117
-
118
- excess = current_count - max_count
119
- # Sort ascending by score — lowest scores evicted first
120
- scored.sort(key=lambda s: s["score"])
121
- to_evict = scored[:excess]
122
-
123
- # Batch transition for performance — single connection, single commit
124
- mem_ids = [e["memory_id"] for e in to_evict]
125
- reasons = [f"bounded_growth_score_{e['score']:.4f}" for e in to_evict]
126
- score_map = {e["memory_id"]: e["score"] for e in to_evict}
127
-
128
- result = self._engine.batch_transition(mem_ids, target_state, reasons)
129
-
130
- transitions = []
131
- for entry in result.get("succeeded", []):
132
- transitions.append({
133
- "memory_id": entry["memory_id"],
134
- "from_state": state,
135
- "to_state": target_state,
136
- "score": score_map.get(entry["memory_id"], 0.0),
137
- })
138
- return transitions
139
-
140
- def score_all_memories(
141
- self,
142
- state: Optional[str] = None,
143
- profile: Optional[str] = None,
144
- ) -> List[Dict[str, Any]]:
145
- """Score all memories in a given state.
146
-
147
- Args:
148
- state: Lifecycle state to filter (None = all non-terminal states)
149
- profile: Filter by profile
150
-
151
- Returns:
152
- List of dicts with memory_id and score, sorted descending by score
153
- """
154
- conn = self._get_connection()
155
- try:
156
- if state:
157
- query = (
158
- "SELECT id, importance, last_accessed, created_at, access_count "
159
- "FROM memories WHERE lifecycle_state = ?"
160
- )
161
- params: list = [state]
162
- else:
163
- query = (
164
- "SELECT id, importance, last_accessed, created_at, access_count "
165
- "FROM memories WHERE lifecycle_state IN ('active', 'warm', 'cold')"
166
- )
167
- params = []
168
-
169
- if profile:
170
- query += " AND profile = ?"
171
- params.append(profile)
172
-
173
- rows = conn.execute(query, params).fetchall()
174
- now = datetime.now()
175
-
176
- scores = []
177
- for row in rows:
178
- score = self._score_row(row, now)
179
- scores.append({"memory_id": row["id"], "score": score})
180
-
181
- scores.sort(key=lambda s: s["score"], reverse=True)
182
- return scores
183
- finally:
184
- conn.close()
185
-
186
- def _score_row(self, row: sqlite3.Row, now: datetime) -> float:
187
- """Compute composite lifecycle score for a memory.
188
-
189
- Score = importance_norm * recency_factor * frequency_factor * behavioral_value
190
-
191
- Higher score = more valuable = keep longer.
192
- """
193
- # Importance: normalize to 0.1-1.0
194
- importance = max(row["importance"] or 5, 1)
195
- importance_norm = importance / 10.0
196
-
197
- # Recency: exponential decay, halves every ~30 days
198
- last_access_str = row["last_accessed"] or row["created_at"]
199
- days_stale = 0
200
- if last_access_str:
201
- try:
202
- last_access = datetime.fromisoformat(str(last_access_str))
203
- days_stale = max((now - last_access).days, 0)
204
- except (ValueError, TypeError):
205
- days_stale = 0
206
- recency_factor = 1.0 / (1.0 + days_stale / 30.0)
207
-
208
- # Access frequency: normalized by age
209
- access_count = row["access_count"] or 0
210
- created_str = row["created_at"]
211
- age_days = 1
212
- if created_str:
213
- try:
214
- created = datetime.fromisoformat(str(created_str))
215
- age_days = max((now - created).days, 1)
216
- except (ValueError, TypeError):
217
- age_days = 1
218
- frequency_factor = 0.5 + 0.5 * min(access_count / age_days, 1.0)
219
-
220
- # Behavioral value: placeholder for Phase 2 integration
221
- behavioral_value = 1.0
222
-
223
- return importance_norm * recency_factor * frequency_factor * behavioral_value
224
-
225
- def _load_bounds(self) -> Dict[str, int]:
226
- """Load bounds config from lifecycle_config.json. Returns defaults if missing."""
227
- try:
228
- if self._config_path:
229
- config_path = Path(self._config_path)
230
- else:
231
- config_path = Path(self._db_path).parent / "lifecycle_config.json"
232
- if config_path.exists():
233
- with open(config_path) as f:
234
- user_config = json.load(f)
235
- bounds = user_config.get("bounds", {})
236
- return {**DEFAULT_BOUNDS, **bounds}
237
- except Exception:
238
- pass
239
- return dict(DEFAULT_BOUNDS)
@@ -1,226 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
3
- """Formal memory compaction with information preservation guarantees.
4
-
5
- Archives full content before compaction, replaces with compressed summary
6
- containing key entities. Supports lossless restoration from archive.
7
- """
8
- import re
9
- import sqlite3
10
- from datetime import datetime, timezone
11
- from typing import Dict, List, Optional
12
-
13
-
14
- # Common English stopwords for entity extraction (no external dependencies)
15
- _STOPWORDS = frozenset(
16
- "a an the is are was were be been being have has had do does did will would "
17
- "shall should may might can could am not no nor and but or if then else when "
18
- "at by for with about against between through during before after above below "
19
- "to from up down in out on off over under again further once here there all "
20
- "each every both few more most other some such only own same so than too very "
21
- "just don doesn didn won wouldn isn aren wasn weren hasn haven hadn it its "
22
- "i me my myself we our ours ourselves you your yours yourself yourselves he "
23
- "him his himself she her hers herself they them their theirs themselves what "
24
- "which who whom this that these those of as into how also many use used uses "
25
- "using like make makes made includes include including provides provide "
26
- "widely ideal rapid many".split()
27
- )
28
-
29
- # Minimum word length for entity candidates
30
- _MIN_WORD_LEN = 3
31
- # Maximum number of entities to extract
32
- _MAX_ENTITIES = 8
33
-
34
-
35
- class CompactionEngine:
36
- """Manages content compaction and restoration for memory lifecycle.
37
-
38
- When a memory transitions to ARCHIVED state, this engine:
39
- 1. Saves the full content to memory_archive (lossless backup)
40
- 2. Replaces content with a compact summary + key entities
41
- 3. Can restore full content if memory is reactivated
42
- """
43
-
44
- def __init__(self, db_path: str) -> None:
45
- self.db_path = db_path
46
- self._ensure_archive_table()
47
-
48
- def _get_conn(self) -> sqlite3.Connection:
49
- """Create a new connection with row factory."""
50
- conn = sqlite3.connect(self.db_path)
51
- conn.row_factory = sqlite3.Row
52
- return conn
53
-
54
- def _ensure_archive_table(self) -> None:
55
- """Ensure the memory_archive table exists."""
56
- conn = self._get_conn()
57
- try:
58
- conn.execute("""
59
- CREATE TABLE IF NOT EXISTS memory_archive (
60
- id INTEGER PRIMARY KEY AUTOINCREMENT,
61
- memory_id INTEGER UNIQUE NOT NULL,
62
- full_content TEXT NOT NULL,
63
- archived_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
64
- FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
65
- )
66
- """)
67
- conn.execute(
68
- "CREATE INDEX IF NOT EXISTS idx_archive_memory "
69
- "ON memory_archive(memory_id)"
70
- )
71
- conn.commit()
72
- finally:
73
- conn.close()
74
-
75
- # ------------------------------------------------------------------
76
- # Public API
77
- # ------------------------------------------------------------------
78
-
79
- def compact_memory(
80
- self, memory_id: int, dry_run: bool = False
81
- ) -> Dict:
82
- """Compact a memory: archive full content, replace with summary.
83
-
84
- Args:
85
- memory_id: ID of the memory to compact.
86
- dry_run: If True, compute result but do not modify the database.
87
-
88
- Returns:
89
- Dict with keys: success, entities, summary, original_length,
90
- and optionally dry_run, error.
91
- """
92
- conn = self._get_conn()
93
- try:
94
- row = conn.execute(
95
- "SELECT id, content, tags FROM memories WHERE id = ?",
96
- (memory_id,),
97
- ).fetchone()
98
-
99
- if row is None:
100
- return {"success": False, "error": "Memory not found"}
101
-
102
- content = row["content"]
103
- original_length = len(content)
104
-
105
- # Extract key entities (pure-Python TF-IDF-like approach)
106
- entities = self._extract_entities(content)
107
- summary = self._build_summary(content, entities, original_length)
108
-
109
- if dry_run:
110
- return {
111
- "success": True,
112
- "dry_run": True,
113
- "entities": entities,
114
- "summary": summary,
115
- "original_length": original_length,
116
- }
117
-
118
- # Archive the full content (lossless backup)
119
- now = datetime.now(timezone.utc).isoformat()
120
- conn.execute(
121
- "INSERT OR REPLACE INTO memory_archive "
122
- "(memory_id, full_content, archived_at) VALUES (?, ?, ?)",
123
- (memory_id, content, now),
124
- )
125
-
126
- # Replace memory content with compacted version
127
- conn.execute(
128
- "UPDATE memories SET content = ? WHERE id = ?",
129
- (summary, memory_id),
130
- )
131
- conn.commit()
132
-
133
- return {
134
- "success": True,
135
- "entities": entities,
136
- "summary": summary,
137
- "original_length": original_length,
138
- }
139
- finally:
140
- conn.close()
141
-
142
- def restore_memory(self, memory_id: int) -> Dict:
143
- """Restore a compacted memory from its archive.
144
-
145
- Args:
146
- memory_id: ID of the memory to restore.
147
-
148
- Returns:
149
- Dict with keys: success, and optionally restored_length, error.
150
- """
151
- conn = self._get_conn()
152
- try:
153
- archive = conn.execute(
154
- "SELECT full_content FROM memory_archive WHERE memory_id = ?",
155
- (memory_id,),
156
- ).fetchone()
157
-
158
- if archive is None:
159
- return {"success": False, "error": "No archive found for memory"}
160
-
161
- full_content = archive["full_content"]
162
-
163
- # Restore original content
164
- conn.execute(
165
- "UPDATE memories SET content = ? WHERE id = ?",
166
- (full_content, memory_id),
167
- )
168
-
169
- # Remove the archive entry (content is back in main table)
170
- conn.execute(
171
- "DELETE FROM memory_archive WHERE memory_id = ?",
172
- (memory_id,),
173
- )
174
- conn.commit()
175
-
176
- return {
177
- "success": True,
178
- "restored_length": len(full_content),
179
- }
180
- finally:
181
- conn.close()
182
-
183
- # ------------------------------------------------------------------
184
- # Internal helpers
185
- # ------------------------------------------------------------------
186
-
187
- @staticmethod
188
- def _extract_entities(text: str) -> List[str]:
189
- """Extract key entities using word-frequency ranking.
190
-
191
- Pure Python implementation — no sklearn or external NLP deps.
192
- Tokenizes, removes stopwords, counts frequency, returns top terms.
193
- """
194
- # Tokenize: split on non-alphanumeric, lowercase
195
- tokens = re.findall(r"[a-zA-Z]+", text.lower())
196
-
197
- # Filter: remove stopwords and short tokens
198
- meaningful = [
199
- t for t in tokens
200
- if t not in _STOPWORDS and len(t) >= _MIN_WORD_LEN
201
- ]
202
-
203
- # Count frequencies
204
- freq: Dict[str, int] = {}
205
- for token in meaningful:
206
- freq[token] = freq.get(token, 0) + 1
207
-
208
- # Sort by frequency descending, then alphabetically for stability
209
- ranked = sorted(freq.items(), key=lambda x: (-x[1], x[0]))
210
-
211
- # Return top N entities
212
- return [word for word, _ in ranked[:_MAX_ENTITIES]]
213
-
214
- @staticmethod
215
- def _build_summary(
216
- text: str, entities: List[str], original_length: int
217
- ) -> str:
218
- """Build the compacted content string.
219
-
220
- Format: [COMPACTED] Key entities: e1, e2, ... Original length: N chars.
221
- """
222
- entity_str = ", ".join(entities) if entities else "none"
223
- return (
224
- f"[COMPACTED] Key entities: {entity_str}. "
225
- f"Original length: {original_length} chars."
226
- )