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
package/src/mcp_tools_v28.py
DELETED
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
# SPDX-License-Identifier: MIT
|
|
2
|
-
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
3
|
-
"""v2.8 MCP tool handlers — lifecycle, behavioral, compliance tools.
|
|
4
|
-
|
|
5
|
-
These functions implement the 6 new MCP tools added in v2.8.
|
|
6
|
-
They are registered with the MCP server in mcp_server.py.
|
|
7
|
-
Each function is a thin wrapper around the appropriate engine.
|
|
8
|
-
|
|
9
|
-
Tool list:
|
|
10
|
-
1. report_outcome — Record action outcomes for behavioral learning
|
|
11
|
-
2. get_lifecycle_status — View memory lifecycle states
|
|
12
|
-
3. set_retention_policy — Configure compliance retention policies
|
|
13
|
-
4. compact_memories — Trigger lifecycle transitions
|
|
14
|
-
5. get_behavioral_patterns — View learned behavioral patterns
|
|
15
|
-
6. audit_trail — Query compliance audit trail
|
|
16
|
-
"""
|
|
17
|
-
import json
|
|
18
|
-
import sys
|
|
19
|
-
from pathlib import Path
|
|
20
|
-
from typing import Optional, Dict, Any
|
|
21
|
-
|
|
22
|
-
# Default database paths — overridable for testing
|
|
23
|
-
DEFAULT_MEMORY_DB = str(Path.home() / ".claude-memory" / "memory.db")
|
|
24
|
-
DEFAULT_LEARNING_DB = str(Path.home() / ".claude-memory" / "learning.db")
|
|
25
|
-
DEFAULT_AUDIT_DB = str(Path.home() / ".claude-memory" / "audit.db")
|
|
26
|
-
|
|
27
|
-
# Ensure src/ is on the path so subpackage imports work
|
|
28
|
-
_SRC_DIR = str(Path(__file__).resolve().parent)
|
|
29
|
-
if _SRC_DIR not in sys.path:
|
|
30
|
-
sys.path.insert(0, _SRC_DIR)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
async def report_outcome(
|
|
34
|
-
memory_ids: list,
|
|
35
|
-
outcome: str,
|
|
36
|
-
action_type: str = "other",
|
|
37
|
-
context: Optional[str] = None,
|
|
38
|
-
agent_id: str = "user",
|
|
39
|
-
project: Optional[str] = None,
|
|
40
|
-
) -> Dict[str, Any]:
|
|
41
|
-
"""Record an action outcome for behavioral learning.
|
|
42
|
-
|
|
43
|
-
Args:
|
|
44
|
-
memory_ids: List of memory IDs involved in the action.
|
|
45
|
-
outcome: One of 'success', 'failure', or 'partial'.
|
|
46
|
-
action_type: Category (code_written, decision_made, debug_resolved, etc.).
|
|
47
|
-
context: Optional JSON string with additional context metadata.
|
|
48
|
-
agent_id: Identifier for the reporting agent.
|
|
49
|
-
project: Project name for scoping outcomes.
|
|
50
|
-
|
|
51
|
-
Returns:
|
|
52
|
-
Dict with success status and outcome_id on success.
|
|
53
|
-
"""
|
|
54
|
-
try:
|
|
55
|
-
from behavioral.outcome_tracker import OutcomeTracker
|
|
56
|
-
|
|
57
|
-
tracker = OutcomeTracker(DEFAULT_LEARNING_DB)
|
|
58
|
-
ctx = json.loads(context) if context else {}
|
|
59
|
-
outcome_id = tracker.record_outcome(
|
|
60
|
-
memory_ids=memory_ids,
|
|
61
|
-
outcome=outcome,
|
|
62
|
-
action_type=action_type,
|
|
63
|
-
context=ctx,
|
|
64
|
-
agent_id=agent_id,
|
|
65
|
-
project=project,
|
|
66
|
-
)
|
|
67
|
-
if outcome_id is None:
|
|
68
|
-
return {
|
|
69
|
-
"success": False,
|
|
70
|
-
"error": f"Invalid outcome: {outcome}. Use success/failure/partial.",
|
|
71
|
-
}
|
|
72
|
-
return {
|
|
73
|
-
"success": True,
|
|
74
|
-
"outcome_id": outcome_id,
|
|
75
|
-
"outcome": outcome,
|
|
76
|
-
"memory_ids": memory_ids,
|
|
77
|
-
}
|
|
78
|
-
except Exception as e:
|
|
79
|
-
return {"success": False, "error": str(e)}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
async def get_lifecycle_status(
|
|
83
|
-
memory_id: Optional[int] = None,
|
|
84
|
-
) -> Dict[str, Any]:
|
|
85
|
-
"""Get lifecycle status — distribution across states or single memory state.
|
|
86
|
-
|
|
87
|
-
Args:
|
|
88
|
-
memory_id: Optional specific memory ID. If None, returns full distribution.
|
|
89
|
-
|
|
90
|
-
Returns:
|
|
91
|
-
Dict with state distribution or single memory lifecycle state.
|
|
92
|
-
"""
|
|
93
|
-
try:
|
|
94
|
-
from lifecycle.lifecycle_engine import LifecycleEngine
|
|
95
|
-
|
|
96
|
-
engine = LifecycleEngine(DEFAULT_MEMORY_DB)
|
|
97
|
-
if memory_id is not None:
|
|
98
|
-
state = engine.get_memory_state(memory_id)
|
|
99
|
-
if state is None:
|
|
100
|
-
return {"success": False, "error": f"Memory {memory_id} not found"}
|
|
101
|
-
return {
|
|
102
|
-
"success": True,
|
|
103
|
-
"memory_id": memory_id,
|
|
104
|
-
"lifecycle_state": state,
|
|
105
|
-
}
|
|
106
|
-
else:
|
|
107
|
-
dist = engine.get_state_distribution()
|
|
108
|
-
total = sum(dist.values())
|
|
109
|
-
return {
|
|
110
|
-
"success": True,
|
|
111
|
-
"distribution": dist,
|
|
112
|
-
"total_memories": total,
|
|
113
|
-
}
|
|
114
|
-
except Exception as e:
|
|
115
|
-
return {"success": False, "error": str(e)}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
async def set_retention_policy(
|
|
119
|
-
name: str,
|
|
120
|
-
framework: str,
|
|
121
|
-
retention_days: int,
|
|
122
|
-
action: str = "retain",
|
|
123
|
-
applies_to_tags: Optional[list] = None,
|
|
124
|
-
applies_to_project: Optional[str] = None,
|
|
125
|
-
) -> Dict[str, Any]:
|
|
126
|
-
"""Create a retention policy for compliance.
|
|
127
|
-
|
|
128
|
-
Args:
|
|
129
|
-
name: Policy name (e.g., 'GDPR Erasure', 'HIPAA Retention').
|
|
130
|
-
framework: Regulatory framework (gdpr, hipaa, eu_ai_act, internal).
|
|
131
|
-
retention_days: Days to retain (0 = immediate action).
|
|
132
|
-
action: Policy action (retain, tombstone, archive).
|
|
133
|
-
applies_to_tags: Tags that trigger this policy.
|
|
134
|
-
applies_to_project: Project name that triggers this policy.
|
|
135
|
-
|
|
136
|
-
Returns:
|
|
137
|
-
Dict with policy_id on success.
|
|
138
|
-
"""
|
|
139
|
-
try:
|
|
140
|
-
from lifecycle.retention_policy import RetentionPolicyManager
|
|
141
|
-
|
|
142
|
-
mgr = RetentionPolicyManager(DEFAULT_MEMORY_DB)
|
|
143
|
-
applies_to: Dict[str, Any] = {}
|
|
144
|
-
if applies_to_tags:
|
|
145
|
-
applies_to["tags"] = applies_to_tags
|
|
146
|
-
if applies_to_project:
|
|
147
|
-
applies_to["project_name"] = applies_to_project
|
|
148
|
-
policy_id = mgr.create_policy(
|
|
149
|
-
name=name,
|
|
150
|
-
retention_days=retention_days,
|
|
151
|
-
framework=framework,
|
|
152
|
-
action=action,
|
|
153
|
-
applies_to=applies_to,
|
|
154
|
-
)
|
|
155
|
-
return {
|
|
156
|
-
"success": True,
|
|
157
|
-
"policy_id": policy_id,
|
|
158
|
-
"name": name,
|
|
159
|
-
"framework": framework,
|
|
160
|
-
}
|
|
161
|
-
except Exception as e:
|
|
162
|
-
return {"success": False, "error": str(e)}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
async def compact_memories(
|
|
166
|
-
dry_run: bool = True,
|
|
167
|
-
profile: Optional[str] = None,
|
|
168
|
-
) -> Dict[str, Any]:
|
|
169
|
-
"""Evaluate and compact memories — transition stale ones through lifecycle.
|
|
170
|
-
|
|
171
|
-
Args:
|
|
172
|
-
dry_run: If True (default), show what would happen without changes.
|
|
173
|
-
profile: Optional profile filter to scope compaction.
|
|
174
|
-
|
|
175
|
-
Returns:
|
|
176
|
-
Dict with recommendations (dry_run=True) or transition counts (dry_run=False).
|
|
177
|
-
"""
|
|
178
|
-
active_profile = profile
|
|
179
|
-
try:
|
|
180
|
-
from lifecycle.lifecycle_evaluator import LifecycleEvaluator
|
|
181
|
-
from lifecycle.lifecycle_engine import LifecycleEngine
|
|
182
|
-
|
|
183
|
-
evaluator = LifecycleEvaluator(DEFAULT_MEMORY_DB)
|
|
184
|
-
recommendations = evaluator.evaluate_memories(profile=active_profile)
|
|
185
|
-
|
|
186
|
-
if dry_run:
|
|
187
|
-
return {
|
|
188
|
-
"success": True,
|
|
189
|
-
"dry_run": True,
|
|
190
|
-
"recommendations": len(recommendations),
|
|
191
|
-
"details": [
|
|
192
|
-
{
|
|
193
|
-
"memory_id": r["memory_id"],
|
|
194
|
-
"from": r["from_state"],
|
|
195
|
-
"to": r["to_state"],
|
|
196
|
-
"reason": r["reason"],
|
|
197
|
-
}
|
|
198
|
-
for r in recommendations[:20]
|
|
199
|
-
],
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
engine = LifecycleEngine(DEFAULT_MEMORY_DB)
|
|
203
|
-
transitioned = 0
|
|
204
|
-
for rec in recommendations:
|
|
205
|
-
result = engine.transition_memory(
|
|
206
|
-
rec["memory_id"], rec["to_state"], reason=rec["reason"]
|
|
207
|
-
)
|
|
208
|
-
if result.get("success"):
|
|
209
|
-
transitioned += 1
|
|
210
|
-
|
|
211
|
-
return {
|
|
212
|
-
"success": True,
|
|
213
|
-
"dry_run": False,
|
|
214
|
-
"evaluated": len(recommendations),
|
|
215
|
-
"transitioned": transitioned,
|
|
216
|
-
}
|
|
217
|
-
except Exception as e:
|
|
218
|
-
return {"success": False, "error": str(e)}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
async def get_behavioral_patterns(
|
|
222
|
-
min_confidence: float = 0.0,
|
|
223
|
-
project: Optional[str] = None,
|
|
224
|
-
) -> Dict[str, Any]:
|
|
225
|
-
"""Get learned behavioral patterns from outcome analysis.
|
|
226
|
-
|
|
227
|
-
Args:
|
|
228
|
-
min_confidence: Minimum confidence threshold (0.0-1.0).
|
|
229
|
-
project: Optional project filter.
|
|
230
|
-
|
|
231
|
-
Returns:
|
|
232
|
-
Dict with patterns list and count.
|
|
233
|
-
"""
|
|
234
|
-
try:
|
|
235
|
-
from behavioral.behavioral_patterns import BehavioralPatternExtractor
|
|
236
|
-
|
|
237
|
-
extractor = BehavioralPatternExtractor(DEFAULT_LEARNING_DB)
|
|
238
|
-
patterns = extractor.get_patterns(
|
|
239
|
-
min_confidence=min_confidence, project=project
|
|
240
|
-
)
|
|
241
|
-
return {"success": True, "patterns": patterns, "count": len(patterns)}
|
|
242
|
-
except Exception as e:
|
|
243
|
-
return {"success": False, "error": str(e)}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
async def audit_trail(
|
|
247
|
-
event_type: Optional[str] = None,
|
|
248
|
-
actor: Optional[str] = None,
|
|
249
|
-
limit: int = 50,
|
|
250
|
-
verify_chain: bool = False,
|
|
251
|
-
) -> Dict[str, Any]:
|
|
252
|
-
"""Query the compliance audit trail.
|
|
253
|
-
|
|
254
|
-
Args:
|
|
255
|
-
event_type: Filter by event type (memory.created, memory.recalled, etc.).
|
|
256
|
-
actor: Filter by actor (user, agent_id, etc.).
|
|
257
|
-
limit: Max events to return.
|
|
258
|
-
verify_chain: If True, verify hash chain integrity.
|
|
259
|
-
|
|
260
|
-
Returns:
|
|
261
|
-
Dict with events list, count, and optional chain verification result.
|
|
262
|
-
"""
|
|
263
|
-
try:
|
|
264
|
-
from compliance.audit_db import AuditDB
|
|
265
|
-
|
|
266
|
-
db = AuditDB(DEFAULT_AUDIT_DB)
|
|
267
|
-
result: Dict[str, Any] = {"success": True}
|
|
268
|
-
|
|
269
|
-
if verify_chain:
|
|
270
|
-
chain_result = db.verify_chain()
|
|
271
|
-
result["chain_valid"] = chain_result["valid"]
|
|
272
|
-
result["chain_entries"] = chain_result["entries_checked"]
|
|
273
|
-
|
|
274
|
-
events = db.query_events(
|
|
275
|
-
event_type=event_type, actor=actor, limit=limit
|
|
276
|
-
)
|
|
277
|
-
result["events"] = events
|
|
278
|
-
result["count"] = len(events)
|
|
279
|
-
return result
|
|
280
|
-
except Exception as e:
|
|
281
|
-
return {"success": False, "error": str(e)}
|
package/src/memory/__init__.py
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
-
"""
|
|
5
|
-
Memory package - Constants, schema, and utilities for MemoryStoreV2.
|
|
6
|
-
|
|
7
|
-
This package contains extracted utilities from memory_store_v2.py to keep
|
|
8
|
-
the main class focused and under the 800-line target.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
from .constants import (
|
|
12
|
-
MEMORY_DIR,
|
|
13
|
-
DB_PATH,
|
|
14
|
-
VECTORS_PATH,
|
|
15
|
-
MAX_CONTENT_SIZE,
|
|
16
|
-
MAX_SUMMARY_SIZE,
|
|
17
|
-
MAX_TAG_LENGTH,
|
|
18
|
-
MAX_TAGS,
|
|
19
|
-
CREATOR_METADATA,
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
from .helpers import format_content
|
|
23
|
-
from .cli import run_cli
|
|
24
|
-
|
|
25
|
-
__all__ = [
|
|
26
|
-
'MEMORY_DIR',
|
|
27
|
-
'DB_PATH',
|
|
28
|
-
'VECTORS_PATH',
|
|
29
|
-
'MAX_CONTENT_SIZE',
|
|
30
|
-
'MAX_SUMMARY_SIZE',
|
|
31
|
-
'MAX_TAG_LENGTH',
|
|
32
|
-
'MAX_TAGS',
|
|
33
|
-
'CREATOR_METADATA',
|
|
34
|
-
'format_content',
|
|
35
|
-
'run_cli',
|
|
36
|
-
]
|
package/src/memory/cli.py
DELETED
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
-
"""
|
|
5
|
-
Command-line interface for MemoryStoreV2.
|
|
6
|
-
|
|
7
|
-
This module contains the CLI implementation extracted from memory_store_v2.py
|
|
8
|
-
to reduce file size and improve maintainability.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
import sys
|
|
12
|
-
import json
|
|
13
|
-
from .helpers import format_content
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def run_cli():
|
|
17
|
-
"""Main CLI entry point for MemoryStoreV2."""
|
|
18
|
-
# Import here to avoid circular dependency
|
|
19
|
-
from memory_store_v2 import MemoryStoreV2
|
|
20
|
-
|
|
21
|
-
store = MemoryStoreV2()
|
|
22
|
-
|
|
23
|
-
if len(sys.argv) < 2:
|
|
24
|
-
print("MemoryStore V2 CLI")
|
|
25
|
-
print("\nV1 Compatible Commands:")
|
|
26
|
-
print(" python memory_store_v2.py add <content> [--project <path>] [--tags tag1,tag2]")
|
|
27
|
-
print(" python memory_store_v2.py search <query> [--full]")
|
|
28
|
-
print(" python memory_store_v2.py list [limit] [--full]")
|
|
29
|
-
print(" python memory_store_v2.py get <id>")
|
|
30
|
-
print(" python memory_store_v2.py recent [limit] [--full]")
|
|
31
|
-
print(" python memory_store_v2.py stats")
|
|
32
|
-
print(" python memory_store_v2.py context <query>")
|
|
33
|
-
print(" python memory_store_v2.py delete <id>")
|
|
34
|
-
print("\nV2 Extensions:")
|
|
35
|
-
print(" python memory_store_v2.py tree [parent_id]")
|
|
36
|
-
print(" python memory_store_v2.py cluster <cluster_id> [--full]")
|
|
37
|
-
print("\nOptions:")
|
|
38
|
-
print(" --full Show complete content (default: smart truncation at 5000 chars)")
|
|
39
|
-
sys.exit(0)
|
|
40
|
-
|
|
41
|
-
command = sys.argv[1]
|
|
42
|
-
|
|
43
|
-
if command == "tree":
|
|
44
|
-
parent_id = int(sys.argv[2]) if len(sys.argv) > 2 else None
|
|
45
|
-
results = store.get_tree(parent_id)
|
|
46
|
-
|
|
47
|
-
if not results:
|
|
48
|
-
print("No memories in tree.")
|
|
49
|
-
else:
|
|
50
|
-
for r in results:
|
|
51
|
-
indent = " " * r['depth']
|
|
52
|
-
print(f"{indent}[{r['id']}] {r['content'][:50]}...")
|
|
53
|
-
if r.get('category'):
|
|
54
|
-
print(f"{indent} Category: {r['category']}")
|
|
55
|
-
|
|
56
|
-
elif command == "cluster" and len(sys.argv) >= 3:
|
|
57
|
-
cluster_id = int(sys.argv[2])
|
|
58
|
-
show_full = '--full' in sys.argv
|
|
59
|
-
results = store.get_by_cluster(cluster_id)
|
|
60
|
-
|
|
61
|
-
if not results:
|
|
62
|
-
print(f"No memories in cluster {cluster_id}.")
|
|
63
|
-
else:
|
|
64
|
-
print(f"Cluster {cluster_id} - {len(results)} memories:")
|
|
65
|
-
for r in results:
|
|
66
|
-
print(f"\n[{r['id']}] Importance: {r['importance']}")
|
|
67
|
-
print(f" {format_content(r['content'], full=show_full)}")
|
|
68
|
-
|
|
69
|
-
elif command == "stats":
|
|
70
|
-
stats = store.get_stats()
|
|
71
|
-
print(json.dumps(stats, indent=2))
|
|
72
|
-
|
|
73
|
-
elif command == "add":
|
|
74
|
-
# Parse content and options
|
|
75
|
-
if len(sys.argv) < 3:
|
|
76
|
-
print("Error: Content required")
|
|
77
|
-
print("Usage: python memory_store_v2.py add <content> [--project <path>] [--tags tag1,tag2]")
|
|
78
|
-
sys.exit(1)
|
|
79
|
-
|
|
80
|
-
content = sys.argv[2]
|
|
81
|
-
project_path = None
|
|
82
|
-
tags = []
|
|
83
|
-
|
|
84
|
-
i = 3
|
|
85
|
-
while i < len(sys.argv):
|
|
86
|
-
if sys.argv[i] == '--project' and i + 1 < len(sys.argv):
|
|
87
|
-
project_path = sys.argv[i + 1]
|
|
88
|
-
i += 2
|
|
89
|
-
elif sys.argv[i] == '--tags' and i + 1 < len(sys.argv):
|
|
90
|
-
tags = [t.strip() for t in sys.argv[i + 1].split(',')]
|
|
91
|
-
i += 2
|
|
92
|
-
else:
|
|
93
|
-
i += 1
|
|
94
|
-
|
|
95
|
-
mem_id = store.add_memory(content, project_path=project_path, tags=tags)
|
|
96
|
-
print(f"Memory added with ID: {mem_id}")
|
|
97
|
-
|
|
98
|
-
elif command == "search":
|
|
99
|
-
if len(sys.argv) < 3:
|
|
100
|
-
print("Error: Search query required")
|
|
101
|
-
print("Usage: python memory_store_v2.py search <query> [--full]")
|
|
102
|
-
sys.exit(1)
|
|
103
|
-
|
|
104
|
-
query = sys.argv[2]
|
|
105
|
-
show_full = '--full' in sys.argv
|
|
106
|
-
results = store.search(query, limit=5)
|
|
107
|
-
|
|
108
|
-
if not results:
|
|
109
|
-
print("No results found.")
|
|
110
|
-
else:
|
|
111
|
-
for r in results:
|
|
112
|
-
print(f"\n[{r['id']}] Score: {r['score']:.2f}")
|
|
113
|
-
if r.get('project_name'):
|
|
114
|
-
print(f"Project: {r['project_name']}")
|
|
115
|
-
if r.get('tags'):
|
|
116
|
-
print(f"Tags: {', '.join(r['tags'])}")
|
|
117
|
-
print(f"Content: {format_content(r['content'], full=show_full)}")
|
|
118
|
-
print(f"Created: {r['created_at']}")
|
|
119
|
-
|
|
120
|
-
elif command == "recent":
|
|
121
|
-
show_full = '--full' in sys.argv
|
|
122
|
-
# Parse limit (skip --full flag)
|
|
123
|
-
limit = 10
|
|
124
|
-
for i, arg in enumerate(sys.argv[2:], start=2):
|
|
125
|
-
if arg != '--full' and arg.isdigit():
|
|
126
|
-
limit = int(arg)
|
|
127
|
-
break
|
|
128
|
-
|
|
129
|
-
results = store.get_recent(limit)
|
|
130
|
-
|
|
131
|
-
if not results:
|
|
132
|
-
print("No memories found.")
|
|
133
|
-
else:
|
|
134
|
-
for r in results:
|
|
135
|
-
print(f"\n[{r['id']}] {r['created_at']}")
|
|
136
|
-
if r.get('project_name'):
|
|
137
|
-
print(f"Project: {r['project_name']}")
|
|
138
|
-
if r.get('tags'):
|
|
139
|
-
print(f"Tags: {', '.join(r['tags'])}")
|
|
140
|
-
print(f"Content: {format_content(r['content'], full=show_full)}")
|
|
141
|
-
|
|
142
|
-
elif command == "list":
|
|
143
|
-
show_full = '--full' in sys.argv
|
|
144
|
-
# Parse limit (skip --full flag)
|
|
145
|
-
limit = 10
|
|
146
|
-
for i, arg in enumerate(sys.argv[2:], start=2):
|
|
147
|
-
if arg != '--full' and arg.isdigit():
|
|
148
|
-
limit = int(arg)
|
|
149
|
-
break
|
|
150
|
-
|
|
151
|
-
results = store.get_recent(limit)
|
|
152
|
-
|
|
153
|
-
if not results:
|
|
154
|
-
print("No memories found.")
|
|
155
|
-
else:
|
|
156
|
-
for r in results:
|
|
157
|
-
print(f"[{r['id']}] {format_content(r['content'], full=show_full)}")
|
|
158
|
-
|
|
159
|
-
elif command == "get":
|
|
160
|
-
if len(sys.argv) < 3:
|
|
161
|
-
print("Error: Memory ID required")
|
|
162
|
-
print("Usage: python memory_store_v2.py get <id>")
|
|
163
|
-
sys.exit(1)
|
|
164
|
-
|
|
165
|
-
mem_id = int(sys.argv[2])
|
|
166
|
-
memory = store.get_by_id(mem_id)
|
|
167
|
-
|
|
168
|
-
if not memory:
|
|
169
|
-
print(f"Memory {mem_id} not found.")
|
|
170
|
-
else:
|
|
171
|
-
print(f"\nID: {memory['id']}")
|
|
172
|
-
print(f"Content: {memory['content']}")
|
|
173
|
-
if memory.get('summary'):
|
|
174
|
-
print(f"Summary: {memory['summary']}")
|
|
175
|
-
if memory.get('project_name'):
|
|
176
|
-
print(f"Project: {memory['project_name']}")
|
|
177
|
-
if memory.get('tags'):
|
|
178
|
-
print(f"Tags: {', '.join(memory['tags'])}")
|
|
179
|
-
print(f"Created: {memory['created_at']}")
|
|
180
|
-
print(f"Importance: {memory['importance']}")
|
|
181
|
-
print(f"Access Count: {memory['access_count']}")
|
|
182
|
-
|
|
183
|
-
elif command == "context":
|
|
184
|
-
if len(sys.argv) < 3:
|
|
185
|
-
print("Error: Query required")
|
|
186
|
-
print("Usage: python memory_store_v2.py context <query>")
|
|
187
|
-
sys.exit(1)
|
|
188
|
-
|
|
189
|
-
query = sys.argv[2]
|
|
190
|
-
context = store.export_for_context(query)
|
|
191
|
-
print(context)
|
|
192
|
-
|
|
193
|
-
elif command == "delete":
|
|
194
|
-
if len(sys.argv) < 3:
|
|
195
|
-
print("Error: Memory ID required")
|
|
196
|
-
print("Usage: python memory_store_v2.py delete <id>")
|
|
197
|
-
sys.exit(1)
|
|
198
|
-
|
|
199
|
-
mem_id = int(sys.argv[2])
|
|
200
|
-
store.delete_memory(mem_id)
|
|
201
|
-
print(f"Memory {mem_id} deleted.")
|
|
202
|
-
|
|
203
|
-
else:
|
|
204
|
-
print(f"Unknown command: {command}")
|
|
205
|
-
print("Run without arguments to see available commands.")
|
package/src/memory/constants.py
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
-
"""
|
|
5
|
-
Constants and configuration values for MemoryStoreV2.
|
|
6
|
-
|
|
7
|
-
This module contains all module-level constants extracted from memory_store_v2.py
|
|
8
|
-
to reduce file size and improve maintainability.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
|
|
13
|
-
# Database paths
|
|
14
|
-
MEMORY_DIR = Path.home() / ".claude-memory"
|
|
15
|
-
DB_PATH = MEMORY_DIR / "memory.db"
|
|
16
|
-
VECTORS_PATH = MEMORY_DIR / "vectors"
|
|
17
|
-
|
|
18
|
-
# Security: Input validation limits
|
|
19
|
-
MAX_CONTENT_SIZE = 1_000_000 # 1MB max content
|
|
20
|
-
MAX_SUMMARY_SIZE = 10_000 # 10KB max summary
|
|
21
|
-
MAX_TAG_LENGTH = 50 # 50 chars per tag
|
|
22
|
-
MAX_TAGS = 20 # 20 tags max
|
|
23
|
-
|
|
24
|
-
# Creator Attribution Metadata (REQUIRED by MIT License)
|
|
25
|
-
# This data is embedded in the database creator_metadata table
|
|
26
|
-
CREATOR_METADATA = {
|
|
27
|
-
'creator_name': 'Varun Pratap Bhardwaj',
|
|
28
|
-
'creator_role': 'Solution Architect & Original Creator',
|
|
29
|
-
'creator_github': 'varun369',
|
|
30
|
-
'project_name': 'SuperLocalMemory V2',
|
|
31
|
-
'project_url': 'https://github.com/varun369/SuperLocalMemoryV2',
|
|
32
|
-
'license': 'MIT',
|
|
33
|
-
'attribution_required': 'yes',
|
|
34
|
-
'version': '2.5.0',
|
|
35
|
-
'architecture_date': '2026-01-15',
|
|
36
|
-
'release_date': '2026-02-07',
|
|
37
|
-
'signature': 'VBPB-SLM-V2-2026-ARCHITECT',
|
|
38
|
-
'verification_hash': 'sha256:c9f3d1a8b5e2f4c6d8a9b3e7f1c4d6a8b9c3e7f2d5a8c1b4e6f9d2a7c5b8e1'
|
|
39
|
-
}
|
package/src/memory/helpers.py
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2026 SuperLocalMemory (superlocalmemory.com)
|
|
4
|
-
"""
|
|
5
|
-
Helper utilities for MemoryStoreV2.
|
|
6
|
-
|
|
7
|
-
This module contains standalone utility functions extracted from memory_store_v2.py
|
|
8
|
-
to reduce file size and improve maintainability.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def format_content(content: str, full: bool = False, threshold: int = 5000, preview_len: int = 2000) -> str:
|
|
13
|
-
"""
|
|
14
|
-
Smart content formatting with optional truncation.
|
|
15
|
-
|
|
16
|
-
Args:
|
|
17
|
-
content: Content to format
|
|
18
|
-
full: If True, always show full content
|
|
19
|
-
threshold: Max length before truncation (default 5000)
|
|
20
|
-
preview_len: Preview length when truncating (default 2000)
|
|
21
|
-
|
|
22
|
-
Returns:
|
|
23
|
-
Formatted content string
|
|
24
|
-
"""
|
|
25
|
-
if full or len(content) < threshold:
|
|
26
|
-
return content
|
|
27
|
-
else:
|
|
28
|
-
return f"{content[:preview_len]}..."
|