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,125 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
3
- """Tests for set_retention_policy MCP tool handler.
4
-
5
- Validates the MCP wrapper around RetentionPolicyManager — tests policy
6
- creation with tags, project scope, and various framework types.
7
- """
8
- import asyncio
9
- import os
10
- import shutil
11
- import sqlite3
12
- import sys
13
- import tempfile
14
- from pathlib import Path
15
-
16
- import pytest
17
-
18
- sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent))
19
-
20
-
21
- def _create_memory_db(db_path: str) -> None:
22
- """Create a minimal memory.db for RetentionPolicyManager."""
23
- conn = sqlite3.connect(db_path)
24
- conn.execute(
25
- """CREATE TABLE memories (
26
- id INTEGER PRIMARY KEY,
27
- content TEXT,
28
- tags TEXT DEFAULT '[]',
29
- project_name TEXT,
30
- lifecycle_state TEXT DEFAULT 'active',
31
- profile TEXT DEFAULT 'default'
32
- )"""
33
- )
34
- conn.commit()
35
- conn.close()
36
-
37
-
38
- class TestMCPRetentionPolicy:
39
- """Tests for the set_retention_policy tool handler."""
40
-
41
- def setup_method(self):
42
- self.tmp_dir = tempfile.mkdtemp()
43
- self.db_path = os.path.join(self.tmp_dir, "memory.db")
44
- _create_memory_db(self.db_path)
45
-
46
- def teardown_method(self):
47
- shutil.rmtree(self.tmp_dir, ignore_errors=True)
48
-
49
- def _run(self, coro):
50
- return asyncio.get_event_loop().run_until_complete(coro)
51
-
52
- def test_create_gdpr_policy(self):
53
- """Creating a GDPR tombstone policy should return success with policy_id."""
54
- import mcp_tools_v28 as tools
55
- tools.DEFAULT_MEMORY_DB = self.db_path
56
-
57
- result = self._run(
58
- tools.set_retention_policy(
59
- "GDPR Erasure", "gdpr", 0, "tombstone", ["gdpr"]
60
- )
61
- )
62
- assert result["success"] is True
63
- assert isinstance(result["policy_id"], int)
64
- assert result["policy_id"] > 0
65
- assert result["name"] == "GDPR Erasure"
66
- assert result["framework"] == "gdpr"
67
-
68
- def test_create_hipaa_policy(self):
69
- """Creating a HIPAA retention policy should succeed."""
70
- import mcp_tools_v28 as tools
71
- tools.DEFAULT_MEMORY_DB = self.db_path
72
-
73
- result = self._run(
74
- tools.set_retention_policy(
75
- "HIPAA Retention", "hipaa", 2190, "retain", ["medical"]
76
- )
77
- )
78
- assert result["success"] is True
79
- assert result["framework"] == "hipaa"
80
-
81
- def test_create_policy_with_project(self):
82
- """Policy scoped to a project should succeed."""
83
- import mcp_tools_v28 as tools
84
- tools.DEFAULT_MEMORY_DB = self.db_path
85
-
86
- result = self._run(
87
- tools.set_retention_policy(
88
- "Internal Retention",
89
- "internal",
90
- 365,
91
- "archive",
92
- applies_to_project="myproject",
93
- )
94
- )
95
- assert result["success"] is True
96
-
97
- def test_create_policy_with_tags_and_project(self):
98
- """Policy with both tags and project scope should succeed."""
99
- import mcp_tools_v28 as tools
100
- tools.DEFAULT_MEMORY_DB = self.db_path
101
-
102
- result = self._run(
103
- tools.set_retention_policy(
104
- "EU AI Act",
105
- "eu_ai_act",
106
- 1825,
107
- "retain",
108
- applies_to_tags=["ai-decision"],
109
- applies_to_project="ml-pipeline",
110
- )
111
- )
112
- assert result["success"] is True
113
-
114
- def test_multiple_policies_unique_ids(self):
115
- """Consecutive policies should get distinct IDs."""
116
- import mcp_tools_v28 as tools
117
- tools.DEFAULT_MEMORY_DB = self.db_path
118
-
119
- r1 = self._run(
120
- tools.set_retention_policy("Policy A", "gdpr", 0, "tombstone", ["a"])
121
- )
122
- r2 = self._run(
123
- tools.set_retention_policy("Policy B", "hipaa", 365, "retain", ["b"])
124
- )
125
- assert r1["policy_id"] != r2["policy_id"]
@@ -1,131 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
3
- """Tests for compliance retention manager.
4
- """
5
- import sqlite3
6
- import tempfile
7
- import os
8
- import sys
9
- import json
10
- from datetime import datetime, timedelta
11
- from pathlib import Path
12
-
13
- sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent))
14
-
15
-
16
- class TestComplianceRetentionManager:
17
- def setup_method(self):
18
- self.tmp_dir = tempfile.mkdtemp()
19
- self.memory_db_path = os.path.join(self.tmp_dir, "memory.db")
20
- self.audit_db_path = os.path.join(self.tmp_dir, "audit.db")
21
-
22
- # Create memory.db with test data
23
- conn = sqlite3.connect(self.memory_db_path)
24
- conn.execute("""
25
- CREATE TABLE memories (
26
- id INTEGER PRIMARY KEY AUTOINCREMENT,
27
- content TEXT NOT NULL,
28
- importance INTEGER DEFAULT 5,
29
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
30
- last_accessed TIMESTAMP,
31
- access_count INTEGER DEFAULT 0,
32
- lifecycle_state TEXT DEFAULT 'active',
33
- lifecycle_updated_at TIMESTAMP,
34
- lifecycle_history TEXT DEFAULT '[]',
35
- access_level TEXT DEFAULT 'public',
36
- profile TEXT DEFAULT 'default',
37
- tags TEXT DEFAULT '[]',
38
- project_name TEXT
39
- )
40
- """)
41
- conn.execute("INSERT INTO memories (content, tags, project_name) VALUES ('user PII data', '[\"gdpr\",\"pii\"]', 'eu-app')")
42
- conn.execute("INSERT INTO memories (content, tags, project_name) VALUES ('medical record', '[\"hipaa\"]', 'healthcare')")
43
- conn.execute("INSERT INTO memories (content, tags) VALUES ('general note', '[]')")
44
- conn.commit()
45
- conn.close()
46
-
47
- def teardown_method(self):
48
- import shutil
49
- shutil.rmtree(self.tmp_dir, ignore_errors=True)
50
-
51
- def test_creation(self):
52
- from compliance.retention_manager import ComplianceRetentionManager
53
- mgr = ComplianceRetentionManager(self.memory_db_path, self.audit_db_path)
54
- assert mgr is not None
55
-
56
- def test_create_gdpr_policy(self):
57
- from compliance.retention_manager import ComplianceRetentionManager
58
- mgr = ComplianceRetentionManager(self.memory_db_path, self.audit_db_path)
59
- pid = mgr.create_retention_rule(
60
- name="GDPR Right to Erasure",
61
- framework="gdpr",
62
- retention_days=0,
63
- action="tombstone",
64
- applies_to={"tags": ["gdpr"]},
65
- )
66
- assert isinstance(pid, int)
67
-
68
- def test_create_eu_ai_act_policy(self):
69
- from compliance.retention_manager import ComplianceRetentionManager
70
- mgr = ComplianceRetentionManager(self.memory_db_path, self.audit_db_path)
71
- pid = mgr.create_retention_rule(
72
- name="EU AI Act Audit Retention",
73
- framework="eu_ai_act",
74
- retention_days=3650,
75
- action="retain_audit",
76
- applies_to={"tags": ["gdpr"]},
77
- )
78
- assert pid > 0
79
-
80
- def test_gdpr_erasure_tombstones_memory(self):
81
- """GDPR erasure request tombstones the memory."""
82
- from compliance.retention_manager import ComplianceRetentionManager
83
- mgr = ComplianceRetentionManager(self.memory_db_path, self.audit_db_path)
84
- result = mgr.execute_erasure_request(memory_id=1, framework="gdpr", requested_by="data_subject")
85
- assert result["success"] is True
86
- assert result["action"] == "tombstoned"
87
- # Verify in DB
88
- conn = sqlite3.connect(self.memory_db_path)
89
- row = conn.execute("SELECT lifecycle_state FROM memories WHERE id=1").fetchone()
90
- conn.close()
91
- assert row[0] == "tombstoned"
92
-
93
- def test_gdpr_erasure_preserves_audit(self):
94
- """GDPR erasure logs the action to audit.db."""
95
- from compliance.retention_manager import ComplianceRetentionManager
96
- mgr = ComplianceRetentionManager(self.memory_db_path, self.audit_db_path)
97
- mgr.execute_erasure_request(memory_id=1, framework="gdpr", requested_by="data_subject")
98
- conn = sqlite3.connect(self.audit_db_path)
99
- rows = conn.execute("SELECT * FROM audit_events WHERE event_type='retention.erasure'").fetchall()
100
- conn.close()
101
- assert len(rows) >= 1
102
-
103
- def test_list_rules(self):
104
- from compliance.retention_manager import ComplianceRetentionManager
105
- mgr = ComplianceRetentionManager(self.memory_db_path, self.audit_db_path)
106
- mgr.create_retention_rule("GDPR", "gdpr", 0, "tombstone", {"tags": ["gdpr"]})
107
- mgr.create_retention_rule("HIPAA", "hipaa", 2555, "retain", {"tags": ["hipaa"]})
108
- rules = mgr.list_rules()
109
- assert len(rules) == 2
110
-
111
- def test_evaluate_memory_against_rules(self):
112
- from compliance.retention_manager import ComplianceRetentionManager
113
- mgr = ComplianceRetentionManager(self.memory_db_path, self.audit_db_path)
114
- mgr.create_retention_rule("HIPAA Retention", "hipaa", 2555, "retain", {"tags": ["hipaa"]})
115
- result = mgr.evaluate_memory(2) # Memory 2 has hipaa tag
116
- assert result is not None
117
- assert result["rule_name"] == "HIPAA Retention"
118
-
119
- def test_no_rule_match_returns_none(self):
120
- from compliance.retention_manager import ComplianceRetentionManager
121
- mgr = ComplianceRetentionManager(self.memory_db_path, self.audit_db_path)
122
- mgr.create_retention_rule("HIPAA", "hipaa", 2555, "retain", {"tags": ["hipaa"]})
123
- result = mgr.evaluate_memory(3) # Memory 3 has no hipaa tag
124
- assert result is None
125
-
126
- def test_get_compliance_status(self):
127
- from compliance.retention_manager import ComplianceRetentionManager
128
- mgr = ComplianceRetentionManager(self.memory_db_path, self.audit_db_path)
129
- status = mgr.get_compliance_status()
130
- assert "rules_count" in status
131
- assert "frameworks" in status
@@ -1,99 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
3
- """Tests for retention policy background scheduler.
4
- """
5
- import sqlite3, tempfile, os, sys, json, threading
6
- from datetime import datetime, timedelta
7
- from pathlib import Path
8
- sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent))
9
-
10
- class TestRetentionScheduler:
11
- def setup_method(self):
12
- self.tmp_dir = tempfile.mkdtemp()
13
- self.memory_db = os.path.join(self.tmp_dir, "memory.db")
14
- self.audit_db = os.path.join(self.tmp_dir, "audit.db")
15
- conn = sqlite3.connect(self.memory_db)
16
- conn.execute("""
17
- CREATE TABLE memories (
18
- id INTEGER PRIMARY KEY AUTOINCREMENT,
19
- content TEXT NOT NULL,
20
- importance INTEGER DEFAULT 5,
21
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
22
- last_accessed TIMESTAMP,
23
- access_count INTEGER DEFAULT 0,
24
- lifecycle_state TEXT DEFAULT 'active',
25
- lifecycle_updated_at TIMESTAMP,
26
- lifecycle_history TEXT DEFAULT '[]',
27
- access_level TEXT DEFAULT 'public',
28
- profile TEXT DEFAULT 'default',
29
- tags TEXT DEFAULT '[]',
30
- project_name TEXT
31
- )
32
- """)
33
- now = datetime.now()
34
- # Memory 1: old GDPR data (created 400 days ago)
35
- conn.execute("INSERT INTO memories (content, tags, created_at, lifecycle_state) VALUES (?, ?, ?, ?)",
36
- ("old PII data", '["gdpr"]', (now - timedelta(days=400)).isoformat(), "active"))
37
- # Memory 2: recent data
38
- conn.execute("INSERT INTO memories (content, tags) VALUES (?, ?)",
39
- ("fresh data", '[]'))
40
- # Memory 3: tombstoned (should be checked for final deletion)
41
- conn.execute("INSERT INTO memories (content, lifecycle_state, created_at) VALUES (?, ?, ?)",
42
- ("tombstoned data", "tombstoned", (now - timedelta(days=100)).isoformat()))
43
- conn.commit()
44
- conn.close()
45
-
46
- def teardown_method(self):
47
- import shutil
48
- shutil.rmtree(self.tmp_dir, ignore_errors=True)
49
-
50
- def test_creation(self):
51
- from compliance.retention_scheduler import RetentionScheduler
52
- sched = RetentionScheduler(self.memory_db, self.audit_db)
53
- assert sched is not None
54
-
55
- def test_default_interval(self):
56
- from compliance.retention_scheduler import RetentionScheduler
57
- sched = RetentionScheduler(self.memory_db, self.audit_db)
58
- assert sched.interval_seconds == 86400 # 24 hours
59
-
60
- def test_run_now(self):
61
- from compliance.retention_scheduler import RetentionScheduler
62
- sched = RetentionScheduler(self.memory_db, self.audit_db)
63
- result = sched.run_now()
64
- assert "timestamp" in result
65
- assert "actions" in result
66
-
67
- def test_start_and_stop(self):
68
- from compliance.retention_scheduler import RetentionScheduler
69
- sched = RetentionScheduler(self.memory_db, self.audit_db, interval_seconds=3600)
70
- sched.start()
71
- assert sched.is_running is True
72
- sched.stop()
73
- assert sched.is_running is False
74
-
75
- def test_thread_is_daemon(self):
76
- from compliance.retention_scheduler import RetentionScheduler
77
- sched = RetentionScheduler(self.memory_db, self.audit_db, interval_seconds=3600)
78
- sched.start()
79
- assert sched._timer.daemon is True
80
- sched.stop()
81
-
82
- def test_manual_trigger_works(self):
83
- from compliance.retention_scheduler import RetentionScheduler
84
- sched = RetentionScheduler(self.memory_db, self.audit_db)
85
- result = sched.run_now()
86
- assert isinstance(result["actions"], list)
87
-
88
- def test_configurable_interval(self):
89
- from compliance.retention_scheduler import RetentionScheduler
90
- sched = RetentionScheduler(self.memory_db, self.audit_db, interval_seconds=7200)
91
- assert sched.interval_seconds == 7200
92
-
93
- def test_result_structure(self):
94
- from compliance.retention_scheduler import RetentionScheduler
95
- sched = RetentionScheduler(self.memory_db, self.audit_db)
96
- result = sched.run_now()
97
- assert "timestamp" in result
98
- assert "actions" in result
99
- assert "rules_evaluated" in result
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """
5
- Compression sub-package for SuperLocalMemory.
6
- Provides tier-based progressive summarization and archival.
7
-
8
- Note: Uses relative imports to avoid collision with Python stdlib.
9
- """
10
-
11
- from .config import CompressionConfig
12
- from .tier_classifier import TierClassifier
13
- from .tier2_compressor import Tier2Compressor
14
- from .tier3_compressor import Tier3Compressor
15
- from .cold_storage import ColdStorageManager
16
- from .orchestrator import CompressionOrchestrator
17
-
18
- __all__ = [
19
- 'CompressionConfig',
20
- 'TierClassifier',
21
- 'Tier2Compressor',
22
- 'Tier3Compressor',
23
- 'ColdStorageManager',
24
- 'CompressionOrchestrator',
25
- ]
@@ -1,150 +0,0 @@
1
- #!/usr/bin/env python3
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
4
- """
5
- CLI interface for compression operations.
6
- """
7
-
8
- import sys
9
- import json
10
-
11
- from compression.config import CompressionConfig
12
- from compression.tier_classifier import TierClassifier
13
- from compression.tier2_compressor import Tier2Compressor
14
- from compression.tier3_compressor import Tier3Compressor
15
- from compression.cold_storage import ColdStorageManager
16
- from compression.orchestrator import CompressionOrchestrator
17
-
18
-
19
- def main():
20
- """Main CLI entry point."""
21
- if len(sys.argv) < 2:
22
- print("Progressive Summarization Compression for SuperLocalMemory\n")
23
- print("Usage:")
24
- print(" python compression.py classify # Classify memories into tiers")
25
- print(" python compression.py compress # Run full compression cycle")
26
- print(" python compression.py stats # Show compression statistics")
27
- print(" python compression.py tier2 <id> # Compress specific memory to Tier 2")
28
- print(" python compression.py tier3 <id> # Compress specific memory to Tier 3")
29
- print(" python compression.py cold-storage # Move old memories to cold storage")
30
- print(" python compression.py restore <id> # Restore memory from cold storage")
31
- print(" python compression.py init-config # Initialize compression config")
32
- sys.exit(0)
33
-
34
- command = sys.argv[1]
35
- orchestrator = CompressionOrchestrator()
36
-
37
- if command == "classify":
38
- classifier = TierClassifier()
39
- updates = classifier.classify_memories()
40
- print(f"Classified {len(updates)} memories")
41
-
42
- stats = classifier.get_tier_stats()
43
- print(f"\nTier breakdown:")
44
- print(f" Tier 1 (Full content): {stats['tier1']} memories")
45
- print(f" Tier 2 (Summary+excerpts): {stats['tier2']} memories")
46
- print(f" Tier 3 (Bullets only): {stats['tier3']} memories")
47
-
48
- elif command == "compress":
49
- print("Running full compression cycle...")
50
- stats = orchestrator.run_full_compression()
51
-
52
- print(f"\nCompression Results:")
53
- print(f" Tier updates: {stats['tier_updates']}")
54
- print(f" Tier 2 compressed: {stats['tier2_compressed']}")
55
- print(f" Tier 3 compressed: {stats['tier3_compressed']}")
56
- print(f" Moved to cold storage: {stats['cold_stored']}")
57
-
58
- if 'space_savings' in stats:
59
- savings = stats['space_savings']
60
- print(f"\nSpace Savings:")
61
- print(f" Original size: {savings['estimated_original_bytes']:,} bytes")
62
- print(f" Current size: {savings['current_size_bytes']:,} bytes")
63
- print(f" Savings: {savings['savings_bytes']:,} bytes ({savings['savings_percent']}%)")
64
-
65
- if stats.get('errors'):
66
- print(f"\nErrors: {stats['errors']}")
67
-
68
- elif command == "stats":
69
- classifier = TierClassifier()
70
- tier_stats = classifier.get_tier_stats()
71
-
72
- cold_storage = ColdStorageManager()
73
- cold_stats = cold_storage.get_cold_storage_stats()
74
-
75
- savings = orchestrator._calculate_space_savings()
76
-
77
- print("Compression Statistics\n")
78
- print("Tier Breakdown:")
79
- print(f" Tier 1 (Full content): {tier_stats['tier1']} memories")
80
- print(f" Tier 2 (Summary+excerpts): {tier_stats['tier2']} memories")
81
- print(f" Tier 3 (Bullets only): {tier_stats['tier3']} memories")
82
-
83
- print(f"\nCold Storage:")
84
- print(f" Archive files: {cold_stats['archive_count']}")
85
- print(f" Total memories: {cold_stats['total_memories']}")
86
- print(f" Total size: {cold_stats['total_size_bytes']:,} bytes")
87
-
88
- print(f"\nSpace Savings:")
89
- print(f" Estimated original: {savings['estimated_original_bytes']:,} bytes")
90
- print(f" Current size: {savings['current_size_bytes']:,} bytes")
91
- print(f" Savings: {savings['savings_bytes']:,} bytes ({savings['savings_percent']}%)")
92
-
93
- elif command == "tier2" and len(sys.argv) >= 3:
94
- try:
95
- memory_id = int(sys.argv[2])
96
- compressor = Tier2Compressor()
97
- if compressor.compress_to_tier2(memory_id):
98
- print(f"Memory #{memory_id} compressed to Tier 2")
99
- else:
100
- print(f"Failed to compress memory #{memory_id}")
101
- except ValueError:
102
- print("Error: Memory ID must be a number")
103
-
104
- elif command == "tier3" and len(sys.argv) >= 3:
105
- try:
106
- memory_id = int(sys.argv[2])
107
- compressor = Tier3Compressor()
108
- if compressor.compress_to_tier3(memory_id):
109
- print(f"Memory #{memory_id} compressed to Tier 3")
110
- else:
111
- print(f"Failed to compress memory #{memory_id}")
112
- except ValueError:
113
- print("Error: Memory ID must be a number")
114
-
115
- elif command == "cold-storage":
116
- cold_storage = ColdStorageManager()
117
- candidates = cold_storage.get_cold_storage_candidates()
118
-
119
- if not candidates:
120
- print("No memories ready for cold storage")
121
- else:
122
- print(f"Moving {len(candidates)} memories to cold storage...")
123
- count = cold_storage.move_to_cold_storage(candidates)
124
- print(f"Archived {count} memories")
125
-
126
- elif command == "restore" and len(sys.argv) >= 3:
127
- try:
128
- memory_id = int(sys.argv[2])
129
- cold_storage = ColdStorageManager()
130
- content = cold_storage.restore_from_cold_storage(memory_id)
131
-
132
- if content:
133
- print(f"Memory #{memory_id} restored from cold storage")
134
- else:
135
- print(f"Memory #{memory_id} not found in cold storage")
136
- except ValueError:
137
- print("Error: Memory ID must be a number")
138
-
139
- elif command == "init-config":
140
- config = CompressionConfig()
141
- config.initialize_defaults()
142
- print("Compression configuration initialized")
143
- print(json.dumps(config.compression_settings, indent=2))
144
-
145
- else:
146
- print(f"Unknown command: {command}")
147
-
148
-
149
- if __name__ == "__main__":
150
- main()