superlocalmemory 2.8.6 → 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.
- package/LICENSE +9 -1
- package/NOTICE +63 -0
- package/README.md +165 -480
- package/bin/slm +17 -449
- package/bin/slm-npm +1 -1
- package/conftest.py +5 -0
- package/docs/api-reference.md +284 -0
- package/docs/architecture.md +149 -0
- package/docs/auto-memory.md +150 -0
- package/docs/cli-reference.md +276 -0
- package/docs/compliance.md +191 -0
- package/docs/configuration.md +182 -0
- package/docs/getting-started.md +102 -0
- package/docs/ide-setup.md +261 -0
- package/docs/mcp-tools.md +220 -0
- package/docs/migration-from-v2.md +170 -0
- package/docs/profiles.md +173 -0
- package/docs/troubleshooting.md +310 -0
- package/{configs → ide/configs}/antigravity-mcp.json +3 -3
- package/ide/configs/chatgpt-desktop-mcp.json +16 -0
- package/{configs → ide/configs}/claude-desktop-mcp.json +3 -3
- package/{configs → ide/configs}/codex-mcp.toml +4 -4
- package/{configs → ide/configs}/continue-mcp.yaml +4 -3
- package/{configs → ide/configs}/continue-skills.yaml +6 -6
- package/ide/configs/cursor-mcp.json +15 -0
- package/{configs → ide/configs}/gemini-cli-mcp.json +2 -2
- package/{configs → ide/configs}/jetbrains-mcp.json +2 -2
- package/{configs → ide/configs}/opencode-mcp.json +2 -2
- package/{configs → ide/configs}/perplexity-mcp.json +2 -2
- package/{configs → ide/configs}/vscode-copilot-mcp.json +2 -2
- package/{configs → ide/configs}/windsurf-mcp.json +3 -3
- package/{configs → ide/configs}/zed-mcp.json +2 -2
- package/{hooks → ide/hooks}/context-hook.js +9 -20
- package/ide/hooks/memory-list-skill.js +70 -0
- package/ide/hooks/memory-profile-skill.js +101 -0
- package/ide/hooks/memory-recall-skill.js +62 -0
- package/ide/hooks/memory-remember-skill.js +68 -0
- package/ide/hooks/memory-reset-skill.js +160 -0
- package/{hooks → ide/hooks}/post-recall-hook.js +2 -2
- package/ide/integrations/langchain/README.md +106 -0
- package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +9 -0
- package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +201 -0
- package/ide/integrations/langchain/pyproject.toml +38 -0
- package/{src/learning → ide/integrations/langchain}/tests/__init__.py +1 -0
- package/ide/integrations/langchain/tests/test_chat_message_history.py +215 -0
- package/ide/integrations/langchain/tests/test_security.py +117 -0
- package/ide/integrations/llamaindex/README.md +81 -0
- package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +9 -0
- package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +316 -0
- package/ide/integrations/llamaindex/pyproject.toml +43 -0
- package/{src/lifecycle → ide/integrations/llamaindex}/tests/__init__.py +1 -2
- package/ide/integrations/llamaindex/tests/test_chat_store.py +294 -0
- package/ide/integrations/llamaindex/tests/test_security.py +241 -0
- package/{skills → ide/skills}/slm-build-graph/SKILL.md +6 -6
- package/{skills → ide/skills}/slm-list-recent/SKILL.md +5 -5
- package/{skills → ide/skills}/slm-recall/SKILL.md +5 -5
- package/{skills → ide/skills}/slm-remember/SKILL.md +6 -6
- package/{skills → ide/skills}/slm-show-patterns/SKILL.md +7 -7
- package/{skills → ide/skills}/slm-status/SKILL.md +9 -9
- package/{skills → ide/skills}/slm-switch-profile/SKILL.md +9 -9
- package/package.json +13 -22
- package/pyproject.toml +85 -0
- package/scripts/build-dmg.sh +417 -0
- package/scripts/install-skills.ps1 +334 -0
- package/scripts/postinstall.js +2 -2
- package/scripts/start-dashboard.ps1 +52 -0
- package/scripts/start-dashboard.sh +41 -0
- package/scripts/sync-wiki.ps1 +127 -0
- package/scripts/sync-wiki.sh +82 -0
- package/scripts/test-dmg.sh +161 -0
- package/scripts/test-npm-package.ps1 +252 -0
- package/scripts/test-npm-package.sh +207 -0
- package/scripts/verify-install.ps1 +294 -0
- package/scripts/verify-install.sh +266 -0
- package/src/superlocalmemory/__init__.py +0 -0
- package/src/superlocalmemory/attribution/__init__.py +9 -0
- package/src/superlocalmemory/attribution/mathematical_dna.py +235 -0
- package/src/superlocalmemory/attribution/signer.py +153 -0
- package/src/superlocalmemory/attribution/watermark.py +189 -0
- package/src/superlocalmemory/cli/__init__.py +5 -0
- package/src/superlocalmemory/cli/commands.py +245 -0
- package/src/superlocalmemory/cli/main.py +89 -0
- package/src/superlocalmemory/cli/migrate_cmd.py +55 -0
- package/src/superlocalmemory/cli/post_install.py +99 -0
- package/src/superlocalmemory/cli/setup_wizard.py +129 -0
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +204 -0
- package/src/superlocalmemory/compliance/audit.py +314 -0
- package/src/superlocalmemory/compliance/eu_ai_act.py +131 -0
- package/src/superlocalmemory/compliance/gdpr.py +294 -0
- package/src/superlocalmemory/compliance/lifecycle.py +158 -0
- package/src/superlocalmemory/compliance/retention.py +232 -0
- package/src/superlocalmemory/compliance/scheduler.py +148 -0
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/config.py +391 -0
- package/src/superlocalmemory/core/embeddings.py +293 -0
- package/src/superlocalmemory/core/engine.py +701 -0
- package/src/superlocalmemory/core/hooks.py +65 -0
- package/src/superlocalmemory/core/maintenance.py +172 -0
- package/src/superlocalmemory/core/modes.py +140 -0
- package/src/superlocalmemory/core/profiles.py +234 -0
- package/src/superlocalmemory/core/registry.py +117 -0
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +223 -0
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/consolidator.py +485 -0
- package/src/superlocalmemory/encoding/emotional.py +125 -0
- package/src/superlocalmemory/encoding/entity_resolver.py +525 -0
- package/src/superlocalmemory/encoding/entropy_gate.py +104 -0
- package/src/superlocalmemory/encoding/fact_extractor.py +775 -0
- package/src/superlocalmemory/encoding/foresight.py +91 -0
- package/src/superlocalmemory/encoding/graph_builder.py +302 -0
- package/src/superlocalmemory/encoding/observation_builder.py +160 -0
- package/src/superlocalmemory/encoding/scene_builder.py +183 -0
- package/src/superlocalmemory/encoding/signal_inference.py +90 -0
- package/src/superlocalmemory/encoding/temporal_parser.py +426 -0
- package/src/superlocalmemory/encoding/type_router.py +235 -0
- package/src/superlocalmemory/hooks/__init__.py +3 -0
- package/src/superlocalmemory/hooks/auto_capture.py +111 -0
- package/src/superlocalmemory/hooks/auto_recall.py +93 -0
- package/src/superlocalmemory/hooks/ide_connector.py +204 -0
- package/src/superlocalmemory/hooks/rules_engine.py +99 -0
- package/src/superlocalmemory/infra/__init__.py +3 -0
- package/src/superlocalmemory/infra/auth_middleware.py +82 -0
- package/src/superlocalmemory/infra/backup.py +317 -0
- package/src/superlocalmemory/infra/cache_manager.py +267 -0
- package/src/superlocalmemory/infra/event_bus.py +381 -0
- package/src/superlocalmemory/infra/rate_limiter.py +135 -0
- package/src/{webhook_dispatcher.py → superlocalmemory/infra/webhook_dispatcher.py} +104 -101
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +172 -0
- package/src/superlocalmemory/learning/behavioral.py +490 -0
- package/src/superlocalmemory/learning/behavioral_listener.py +94 -0
- package/src/superlocalmemory/learning/bootstrap.py +298 -0
- package/src/superlocalmemory/learning/cross_project.py +399 -0
- package/src/superlocalmemory/learning/database.py +376 -0
- package/src/superlocalmemory/learning/engagement.py +323 -0
- package/src/superlocalmemory/learning/features.py +138 -0
- package/src/superlocalmemory/learning/feedback.py +316 -0
- package/src/superlocalmemory/learning/outcomes.py +255 -0
- package/src/superlocalmemory/learning/project_context.py +366 -0
- package/src/superlocalmemory/learning/ranker.py +155 -0
- package/src/superlocalmemory/learning/source_quality.py +303 -0
- package/src/superlocalmemory/learning/workflows.py +309 -0
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +316 -0
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/fisher.py +356 -0
- package/src/superlocalmemory/math/langevin.py +398 -0
- package/src/superlocalmemory/math/sheaf.py +257 -0
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/resources.py +245 -0
- package/src/superlocalmemory/mcp/server.py +61 -0
- package/src/superlocalmemory/mcp/tools.py +18 -0
- package/src/superlocalmemory/mcp/tools_core.py +305 -0
- package/src/superlocalmemory/mcp/tools_v28.py +223 -0
- package/src/superlocalmemory/mcp/tools_v3.py +286 -0
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +295 -0
- package/src/superlocalmemory/retrieval/ann_index.py +223 -0
- package/src/superlocalmemory/retrieval/bm25_channel.py +185 -0
- package/src/superlocalmemory/retrieval/bridge_discovery.py +170 -0
- package/src/superlocalmemory/retrieval/engine.py +390 -0
- package/src/superlocalmemory/retrieval/entity_channel.py +179 -0
- package/src/superlocalmemory/retrieval/fusion.py +78 -0
- package/src/superlocalmemory/retrieval/profile_channel.py +105 -0
- package/src/superlocalmemory/retrieval/reranker.py +154 -0
- package/src/superlocalmemory/retrieval/semantic_channel.py +232 -0
- package/src/superlocalmemory/retrieval/strategy.py +96 -0
- package/src/superlocalmemory/retrieval/temporal_channel.py +175 -0
- package/src/superlocalmemory/server/__init__.py +1 -0
- package/src/superlocalmemory/server/api.py +248 -0
- package/src/superlocalmemory/server/routes/__init__.py +4 -0
- package/src/superlocalmemory/server/routes/agents.py +107 -0
- package/src/superlocalmemory/server/routes/backup.py +91 -0
- package/src/superlocalmemory/server/routes/behavioral.py +127 -0
- package/src/superlocalmemory/server/routes/compliance.py +160 -0
- package/src/superlocalmemory/server/routes/data_io.py +188 -0
- package/src/superlocalmemory/server/routes/events.py +183 -0
- package/src/superlocalmemory/server/routes/helpers.py +85 -0
- package/src/superlocalmemory/server/routes/learning.py +273 -0
- package/src/superlocalmemory/server/routes/lifecycle.py +116 -0
- package/src/superlocalmemory/server/routes/memories.py +399 -0
- package/src/superlocalmemory/server/routes/profiles.py +219 -0
- package/src/superlocalmemory/server/routes/stats.py +346 -0
- package/src/superlocalmemory/server/routes/v3_api.py +365 -0
- package/src/superlocalmemory/server/routes/ws.py +82 -0
- package/src/superlocalmemory/server/security_middleware.py +57 -0
- package/src/superlocalmemory/server/ui.py +245 -0
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/access_control.py +182 -0
- package/src/superlocalmemory/storage/database.py +594 -0
- package/src/superlocalmemory/storage/migrations.py +303 -0
- package/src/superlocalmemory/storage/models.py +406 -0
- package/src/superlocalmemory/storage/schema.py +726 -0
- package/src/superlocalmemory/storage/v2_migrator.py +317 -0
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +130 -0
- package/src/superlocalmemory/trust/provenance.py +124 -0
- package/src/superlocalmemory/trust/scorer.py +347 -0
- package/src/superlocalmemory/trust/signals.py +153 -0
- package/ui/index.html +278 -5
- package/ui/js/auto-settings.js +70 -0
- package/ui/js/dashboard.js +90 -0
- package/ui/js/fact-detail.js +92 -0
- package/ui/js/feedback.js +2 -2
- package/ui/js/ide-status.js +102 -0
- package/ui/js/math-health.js +98 -0
- package/ui/js/recall-lab.js +127 -0
- package/ui/js/settings.js +2 -2
- package/ui/js/trust-dashboard.js +73 -0
- package/api_server.py +0 -724
- package/bin/aider-smart +0 -72
- package/bin/superlocalmemoryv2-learning +0 -4
- package/bin/superlocalmemoryv2-list +0 -3
- package/bin/superlocalmemoryv2-patterns +0 -4
- package/bin/superlocalmemoryv2-profile +0 -3
- package/bin/superlocalmemoryv2-recall +0 -3
- package/bin/superlocalmemoryv2-remember +0 -3
- package/bin/superlocalmemoryv2-reset +0 -3
- package/bin/superlocalmemoryv2-status +0 -3
- package/configs/chatgpt-desktop-mcp.json +0 -16
- package/configs/cursor-mcp.json +0 -15
- package/hooks/memory-list-skill.js +0 -139
- package/hooks/memory-profile-skill.js +0 -273
- package/hooks/memory-recall-skill.js +0 -114
- package/hooks/memory-remember-skill.js +0 -127
- package/hooks/memory-reset-skill.js +0 -274
- package/mcp_server.py +0 -1808
- package/requirements-core.txt +0 -22
- package/requirements-learning.txt +0 -12
- package/requirements.txt +0 -12
- package/src/agent_registry.py +0 -411
- package/src/auth_middleware.py +0 -61
- package/src/auto_backup.py +0 -459
- package/src/behavioral/__init__.py +0 -49
- package/src/behavioral/behavioral_listener.py +0 -203
- package/src/behavioral/behavioral_patterns.py +0 -275
- package/src/behavioral/cross_project_transfer.py +0 -206
- package/src/behavioral/outcome_inference.py +0 -194
- package/src/behavioral/outcome_tracker.py +0 -193
- package/src/behavioral/tests/__init__.py +0 -4
- package/src/behavioral/tests/test_behavioral_integration.py +0 -108
- package/src/behavioral/tests/test_behavioral_patterns.py +0 -150
- package/src/behavioral/tests/test_cross_project_transfer.py +0 -142
- package/src/behavioral/tests/test_mcp_behavioral.py +0 -139
- package/src/behavioral/tests/test_mcp_report_outcome.py +0 -117
- package/src/behavioral/tests/test_outcome_inference.py +0 -107
- package/src/behavioral/tests/test_outcome_tracker.py +0 -96
- package/src/cache_manager.py +0 -518
- package/src/compliance/__init__.py +0 -48
- package/src/compliance/abac_engine.py +0 -149
- package/src/compliance/abac_middleware.py +0 -116
- package/src/compliance/audit_db.py +0 -215
- package/src/compliance/audit_logger.py +0 -148
- package/src/compliance/retention_manager.py +0 -289
- package/src/compliance/retention_scheduler.py +0 -186
- package/src/compliance/tests/__init__.py +0 -4
- package/src/compliance/tests/test_abac_enforcement.py +0 -95
- package/src/compliance/tests/test_abac_engine.py +0 -124
- package/src/compliance/tests/test_abac_mcp_integration.py +0 -118
- package/src/compliance/tests/test_audit_db.py +0 -123
- package/src/compliance/tests/test_audit_logger.py +0 -98
- package/src/compliance/tests/test_mcp_audit.py +0 -128
- package/src/compliance/tests/test_mcp_retention_policy.py +0 -125
- package/src/compliance/tests/test_retention_manager.py +0 -131
- package/src/compliance/tests/test_retention_scheduler.py +0 -99
- package/src/compression/__init__.py +0 -25
- package/src/compression/cli.py +0 -150
- package/src/compression/cold_storage.py +0 -217
- package/src/compression/config.py +0 -72
- package/src/compression/orchestrator.py +0 -133
- package/src/compression/tier2_compressor.py +0 -228
- package/src/compression/tier3_compressor.py +0 -153
- package/src/compression/tier_classifier.py +0 -148
- package/src/db_connection_manager.py +0 -536
- package/src/embedding_engine.py +0 -63
- package/src/embeddings/__init__.py +0 -47
- package/src/embeddings/cache.py +0 -70
- package/src/embeddings/cli.py +0 -113
- package/src/embeddings/constants.py +0 -47
- package/src/embeddings/database.py +0 -91
- package/src/embeddings/engine.py +0 -247
- package/src/embeddings/model_loader.py +0 -145
- package/src/event_bus.py +0 -562
- package/src/graph/__init__.py +0 -36
- package/src/graph/build_helpers.py +0 -74
- package/src/graph/cli.py +0 -87
- package/src/graph/cluster_builder.py +0 -188
- package/src/graph/cluster_summary.py +0 -148
- package/src/graph/constants.py +0 -47
- package/src/graph/edge_builder.py +0 -162
- package/src/graph/entity_extractor.py +0 -95
- package/src/graph/graph_core.py +0 -226
- package/src/graph/graph_search.py +0 -231
- package/src/graph/hierarchical.py +0 -207
- package/src/graph/schema.py +0 -99
- package/src/graph_engine.py +0 -52
- package/src/hnsw_index.py +0 -628
- package/src/hybrid_search.py +0 -46
- package/src/learning/__init__.py +0 -217
- package/src/learning/adaptive_ranker.py +0 -682
- package/src/learning/bootstrap/__init__.py +0 -69
- package/src/learning/bootstrap/constants.py +0 -93
- package/src/learning/bootstrap/db_queries.py +0 -316
- package/src/learning/bootstrap/sampling.py +0 -82
- package/src/learning/bootstrap/text_utils.py +0 -71
- package/src/learning/cross_project_aggregator.py +0 -857
- package/src/learning/db/__init__.py +0 -40
- package/src/learning/db/constants.py +0 -44
- package/src/learning/db/schema.py +0 -279
- package/src/learning/engagement_tracker.py +0 -628
- package/src/learning/feature_extractor.py +0 -708
- package/src/learning/feedback_collector.py +0 -806
- package/src/learning/learning_db.py +0 -915
- package/src/learning/project_context_manager.py +0 -572
- package/src/learning/ranking/__init__.py +0 -33
- package/src/learning/ranking/constants.py +0 -84
- package/src/learning/ranking/helpers.py +0 -278
- package/src/learning/source_quality_scorer.py +0 -676
- package/src/learning/synthetic_bootstrap.py +0 -755
- package/src/learning/tests/test_adaptive_ranker.py +0 -325
- package/src/learning/tests/test_adaptive_ranker_v28.py +0 -60
- package/src/learning/tests/test_aggregator.py +0 -306
- package/src/learning/tests/test_auto_retrain_v28.py +0 -35
- package/src/learning/tests/test_e2e_ranking_v28.py +0 -82
- package/src/learning/tests/test_feature_extractor_v28.py +0 -93
- package/src/learning/tests/test_feedback_collector.py +0 -294
- package/src/learning/tests/test_learning_db.py +0 -602
- package/src/learning/tests/test_learning_db_v28.py +0 -110
- package/src/learning/tests/test_learning_init_v28.py +0 -48
- package/src/learning/tests/test_outcome_signals.py +0 -48
- package/src/learning/tests/test_project_context.py +0 -292
- package/src/learning/tests/test_schema_migration.py +0 -319
- package/src/learning/tests/test_signal_inference.py +0 -397
- package/src/learning/tests/test_source_quality.py +0 -351
- package/src/learning/tests/test_synthetic_bootstrap.py +0 -429
- package/src/learning/tests/test_workflow_miner.py +0 -318
- package/src/learning/workflow_pattern_miner.py +0 -655
- package/src/lifecycle/__init__.py +0 -54
- package/src/lifecycle/bounded_growth.py +0 -239
- package/src/lifecycle/compaction_engine.py +0 -226
- package/src/lifecycle/lifecycle_engine.py +0 -355
- package/src/lifecycle/lifecycle_evaluator.py +0 -257
- package/src/lifecycle/lifecycle_scheduler.py +0 -130
- package/src/lifecycle/retention_policy.py +0 -285
- package/src/lifecycle/tests/test_bounded_growth.py +0 -193
- package/src/lifecycle/tests/test_compaction.py +0 -179
- package/src/lifecycle/tests/test_lifecycle_engine.py +0 -137
- package/src/lifecycle/tests/test_lifecycle_evaluation.py +0 -177
- package/src/lifecycle/tests/test_lifecycle_scheduler.py +0 -127
- package/src/lifecycle/tests/test_lifecycle_search.py +0 -109
- package/src/lifecycle/tests/test_mcp_compact.py +0 -149
- package/src/lifecycle/tests/test_mcp_lifecycle_status.py +0 -114
- package/src/lifecycle/tests/test_retention_policy.py +0 -162
- package/src/mcp_tools_v28.py +0 -281
- package/src/memory/__init__.py +0 -36
- package/src/memory/cli.py +0 -205
- package/src/memory/constants.py +0 -39
- package/src/memory/helpers.py +0 -28
- package/src/memory/schema.py +0 -166
- package/src/memory-profiles.py +0 -595
- package/src/memory-reset.py +0 -491
- package/src/memory_compression.py +0 -989
- package/src/memory_store_v2.py +0 -1155
- package/src/migrate_v1_to_v2.py +0 -629
- package/src/pattern_learner.py +0 -34
- package/src/patterns/__init__.py +0 -24
- package/src/patterns/analyzers.py +0 -251
- package/src/patterns/learner.py +0 -271
- package/src/patterns/scoring.py +0 -171
- package/src/patterns/store.py +0 -225
- package/src/patterns/terminology.py +0 -140
- package/src/provenance_tracker.py +0 -312
- package/src/qualixar_attribution.py +0 -139
- package/src/qualixar_watermark.py +0 -78
- package/src/query_optimizer.py +0 -511
- package/src/rate_limiter.py +0 -83
- package/src/search/__init__.py +0 -20
- package/src/search/cli.py +0 -77
- package/src/search/constants.py +0 -26
- package/src/search/engine.py +0 -241
- package/src/search/fusion.py +0 -122
- package/src/search/index_loader.py +0 -114
- package/src/search/methods.py +0 -162
- package/src/search_engine_v2.py +0 -401
- package/src/setup_validator.py +0 -482
- package/src/subscription_manager.py +0 -391
- package/src/tree/__init__.py +0 -59
- package/src/tree/builder.py +0 -185
- package/src/tree/nodes.py +0 -202
- package/src/tree/queries.py +0 -257
- package/src/tree/schema.py +0 -80
- package/src/tree_manager.py +0 -19
- package/src/trust/__init__.py +0 -45
- package/src/trust/constants.py +0 -66
- package/src/trust/queries.py +0 -157
- package/src/trust/schema.py +0 -95
- package/src/trust/scorer.py +0 -299
- package/src/trust/signals.py +0 -95
- package/src/trust_scorer.py +0 -44
- package/ui/app.js +0 -1588
- package/ui/js/graph-cytoscape-monolithic-backup.js +0 -1168
- package/ui/js/graph-cytoscape.js +0 -1168
- package/ui/js/graph-d3-backup.js +0 -32
- package/ui/js/graph.js +0 -32
- package/ui_server.py +0 -286
- /package/docs/{ACCESSIBILITY.md → v2-archive/ACCESSIBILITY.md} +0 -0
- /package/docs/{ARCHITECTURE.md → v2-archive/ARCHITECTURE.md} +0 -0
- /package/docs/{CLI-COMMANDS-REFERENCE.md → v2-archive/CLI-COMMANDS-REFERENCE.md} +0 -0
- /package/docs/{COMPRESSION-README.md → v2-archive/COMPRESSION-README.md} +0 -0
- /package/docs/{FRAMEWORK-INTEGRATIONS.md → v2-archive/FRAMEWORK-INTEGRATIONS.md} +0 -0
- /package/docs/{MCP-MANUAL-SETUP.md → v2-archive/MCP-MANUAL-SETUP.md} +0 -0
- /package/docs/{MCP-TROUBLESHOOTING.md → v2-archive/MCP-TROUBLESHOOTING.md} +0 -0
- /package/docs/{PATTERN-LEARNING.md → v2-archive/PATTERN-LEARNING.md} +0 -0
- /package/docs/{PROFILES-GUIDE.md → v2-archive/PROFILES-GUIDE.md} +0 -0
- /package/docs/{RESET-GUIDE.md → v2-archive/RESET-GUIDE.md} +0 -0
- /package/docs/{SEARCH-ENGINE-V2.2.0.md → v2-archive/SEARCH-ENGINE-V2.2.0.md} +0 -0
- /package/docs/{SEARCH-INTEGRATION-GUIDE.md → v2-archive/SEARCH-INTEGRATION-GUIDE.md} +0 -0
- /package/docs/{UI-SERVER.md → v2-archive/UI-SERVER.md} +0 -0
- /package/docs/{UNIVERSAL-INTEGRATION.md → v2-archive/UNIVERSAL-INTEGRATION.md} +0 -0
- /package/docs/{V2.2.0-OPTIONAL-SEARCH.md → v2-archive/V2.2.0-OPTIONAL-SEARCH.md} +0 -0
- /package/docs/{WINDOWS-INSTALL-README.txt → v2-archive/WINDOWS-INSTALL-README.txt} +0 -0
- /package/docs/{WINDOWS-POST-INSTALL.txt → v2-archive/WINDOWS-POST-INSTALL.txt} +0 -0
- /package/docs/{example_graph_usage.py → v2-archive/example_graph_usage.py} +0 -0
- /package/{completions → ide/completions}/slm.bash +0 -0
- /package/{completions → ide/completions}/slm.zsh +0 -0
- /package/{configs → ide/configs}/cody-commands.json +0 -0
- /package/{install-skills.sh → scripts/install-skills.sh} +0 -0
- /package/{install.ps1 → scripts/install.ps1} +0 -0
- /package/{install.sh → scripts/install.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
|
-
]
|
package/src/compression/cli.py
DELETED
|
@@ -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()
|