superlocalmemory 2.8.5 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/LICENSE +9 -1
- package/NOTICE +63 -0
- package/README.md +165 -480
- package/bin/slm +17 -449
- package/bin/slm-npm +2 -2
- package/bin/slm.bat +4 -2
- 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/{install.ps1 → scripts/install.ps1} +36 -4
- package/{install.sh → scripts/install.sh} +14 -13
- 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/docs/SECURITY-QUICK-REFERENCE.md +0 -214
- 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 -1800
- 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 -266
- /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
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
+
# Licensed under the MIT License - see LICENSE file
|
|
3
|
+
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
+
|
|
5
|
+
"""SuperLocalMemory V3 — V2.8 Ported MCP Tools (6 tools).
|
|
6
|
+
|
|
7
|
+
report_outcome, get_lifecycle_status, set_retention_policy,
|
|
8
|
+
compact_memories, get_behavioral_patterns, audit_trail.
|
|
9
|
+
|
|
10
|
+
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import logging
|
|
16
|
+
from typing import Callable
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def register_v28_tools(server, get_engine: Callable) -> None:
|
|
22
|
+
"""Register 6 V2.8-ported tools on *server*."""
|
|
23
|
+
|
|
24
|
+
# ------------------------------------------------------------------
|
|
25
|
+
# 1. report_outcome
|
|
26
|
+
# ------------------------------------------------------------------
|
|
27
|
+
@server.tool()
|
|
28
|
+
async def report_outcome(
|
|
29
|
+
memory_ids: str,
|
|
30
|
+
outcome: str,
|
|
31
|
+
context: str = "",
|
|
32
|
+
) -> dict:
|
|
33
|
+
"""Report outcome of using recalled memories.
|
|
34
|
+
|
|
35
|
+
Feeds into the adaptive learning loop to improve future retrieval.
|
|
36
|
+
Valid outcomes: success, failure, partial.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
memory_ids: Comma-separated list of fact/memory IDs.
|
|
40
|
+
outcome: One of 'success', 'failure', 'partial'.
|
|
41
|
+
context: Optional freetext context about the outcome.
|
|
42
|
+
"""
|
|
43
|
+
try:
|
|
44
|
+
engine = get_engine()
|
|
45
|
+
from superlocalmemory.learning.outcomes import OutcomeTracker
|
|
46
|
+
tracker = OutcomeTracker(engine._db)
|
|
47
|
+
ids = [mid.strip() for mid in memory_ids.split(",") if mid.strip()]
|
|
48
|
+
ctx = {"note": context} if context else None
|
|
49
|
+
ao = tracker.record_outcome(
|
|
50
|
+
query="[mcp_feedback]",
|
|
51
|
+
fact_ids=ids,
|
|
52
|
+
outcome=outcome,
|
|
53
|
+
profile_id=engine.profile_id,
|
|
54
|
+
context=ctx,
|
|
55
|
+
)
|
|
56
|
+
return {"success": True, "outcome_id": ao.outcome_id, "outcome": outcome}
|
|
57
|
+
except Exception as exc:
|
|
58
|
+
logger.exception("report_outcome failed")
|
|
59
|
+
return {"success": False, "error": str(exc)}
|
|
60
|
+
|
|
61
|
+
# ------------------------------------------------------------------
|
|
62
|
+
# 2. get_lifecycle_status
|
|
63
|
+
# ------------------------------------------------------------------
|
|
64
|
+
@server.tool()
|
|
65
|
+
async def get_lifecycle_status(limit: int = 50) -> dict:
|
|
66
|
+
"""Get lifecycle state distribution for stored memories.
|
|
67
|
+
|
|
68
|
+
Shows counts per lifecycle state (active, warm, cold, archived)
|
|
69
|
+
and the most recent facts in each state.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
limit: Maximum facts to inspect (default 50).
|
|
73
|
+
"""
|
|
74
|
+
try:
|
|
75
|
+
engine = get_engine()
|
|
76
|
+
pid = engine.profile_id
|
|
77
|
+
facts = engine._db.get_all_facts(pid)[:limit]
|
|
78
|
+
states: dict[str, list[dict]] = {
|
|
79
|
+
"active": [], "warm": [], "cold": [], "archived": [],
|
|
80
|
+
}
|
|
81
|
+
for f in facts:
|
|
82
|
+
state = f.lifecycle.value
|
|
83
|
+
if state in states and len(states[state]) < 10:
|
|
84
|
+
states[state].append({
|
|
85
|
+
"fact_id": f.fact_id,
|
|
86
|
+
"content": f.content[:80],
|
|
87
|
+
"access_count": f.access_count,
|
|
88
|
+
"created_at": f.created_at,
|
|
89
|
+
})
|
|
90
|
+
counts = {k: len(v) for k, v in states.items()}
|
|
91
|
+
return {"success": True, "counts": counts, "samples": states}
|
|
92
|
+
except Exception as exc:
|
|
93
|
+
logger.exception("get_lifecycle_status failed")
|
|
94
|
+
return {"success": False, "error": str(exc)}
|
|
95
|
+
|
|
96
|
+
# ------------------------------------------------------------------
|
|
97
|
+
# 3. set_retention_policy
|
|
98
|
+
# ------------------------------------------------------------------
|
|
99
|
+
@server.tool()
|
|
100
|
+
async def set_retention_policy(
|
|
101
|
+
cold_after_days: int = 30,
|
|
102
|
+
archive_after_days: int = 90,
|
|
103
|
+
) -> dict:
|
|
104
|
+
"""Set memory retention policy thresholds.
|
|
105
|
+
|
|
106
|
+
Controls when memories transition from active to warm, cold,
|
|
107
|
+
and archived states. Coupled with Langevin dynamics when available.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
cold_after_days: Days of inactivity before cold state (default 30).
|
|
111
|
+
archive_after_days: Days before archival (default 90).
|
|
112
|
+
"""
|
|
113
|
+
try:
|
|
114
|
+
engine = get_engine()
|
|
115
|
+
engine._db.set_config("retention_cold_days", str(cold_after_days))
|
|
116
|
+
engine._db.set_config("retention_archive_days", str(archive_after_days))
|
|
117
|
+
return {
|
|
118
|
+
"success": True,
|
|
119
|
+
"cold_after_days": cold_after_days,
|
|
120
|
+
"archive_after_days": archive_after_days,
|
|
121
|
+
}
|
|
122
|
+
except Exception as exc:
|
|
123
|
+
logger.exception("set_retention_policy failed")
|
|
124
|
+
return {"success": False, "error": str(exc)}
|
|
125
|
+
|
|
126
|
+
# ------------------------------------------------------------------
|
|
127
|
+
# 4. compact_memories
|
|
128
|
+
# ------------------------------------------------------------------
|
|
129
|
+
@server.tool()
|
|
130
|
+
async def compact_memories(dry_run: bool = True) -> dict:
|
|
131
|
+
"""Compact memory store by archiving cold/stale facts.
|
|
132
|
+
|
|
133
|
+
Transitions eligible memories from cold to archived state.
|
|
134
|
+
Run with dry_run=True first to preview changes.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
dry_run: If True, only preview without making changes (default True).
|
|
138
|
+
"""
|
|
139
|
+
try:
|
|
140
|
+
engine = get_engine()
|
|
141
|
+
pid = engine.profile_id
|
|
142
|
+
from superlocalmemory.compliance.lifecycle import LifecycleManager
|
|
143
|
+
mgr = LifecycleManager(engine._db)
|
|
144
|
+
facts = engine._db.get_all_facts(pid)
|
|
145
|
+
candidates = []
|
|
146
|
+
for f in facts:
|
|
147
|
+
new_state = mgr.get_lifecycle_state(f)
|
|
148
|
+
if new_state != f.lifecycle:
|
|
149
|
+
candidates.append({
|
|
150
|
+
"fact_id": f.fact_id,
|
|
151
|
+
"current": f.lifecycle.value,
|
|
152
|
+
"proposed": new_state.value,
|
|
153
|
+
})
|
|
154
|
+
if not dry_run:
|
|
155
|
+
for c in candidates:
|
|
156
|
+
engine._db.update_fact(
|
|
157
|
+
c["fact_id"], {"lifecycle": c["proposed"]},
|
|
158
|
+
)
|
|
159
|
+
return {
|
|
160
|
+
"success": True,
|
|
161
|
+
"dry_run": dry_run,
|
|
162
|
+
"candidates": len(candidates),
|
|
163
|
+
"transitions": candidates[:20],
|
|
164
|
+
}
|
|
165
|
+
except Exception as exc:
|
|
166
|
+
logger.exception("compact_memories failed")
|
|
167
|
+
return {"success": False, "error": str(exc)}
|
|
168
|
+
|
|
169
|
+
# ------------------------------------------------------------------
|
|
170
|
+
# 5. get_behavioral_patterns
|
|
171
|
+
# ------------------------------------------------------------------
|
|
172
|
+
@server.tool()
|
|
173
|
+
async def get_behavioral_patterns(limit: int = 20) -> dict:
|
|
174
|
+
"""Get detected behavioral patterns for the active profile.
|
|
175
|
+
|
|
176
|
+
Returns patterns such as topic interests, refinement habits,
|
|
177
|
+
and time-of-day usage with confidence scores.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
limit: Maximum patterns to return (default 20).
|
|
181
|
+
"""
|
|
182
|
+
try:
|
|
183
|
+
engine = get_engine()
|
|
184
|
+
from superlocalmemory.learning.behavioral import BehavioralStore
|
|
185
|
+
store = BehavioralStore(engine._db.db_path)
|
|
186
|
+
patterns = store.get_patterns(engine.profile_id, limit=limit)
|
|
187
|
+
summary = store.get_summary(engine.profile_id)
|
|
188
|
+
return {
|
|
189
|
+
"success": True,
|
|
190
|
+
"patterns": patterns,
|
|
191
|
+
"summary": summary,
|
|
192
|
+
"count": len(patterns),
|
|
193
|
+
}
|
|
194
|
+
except Exception as exc:
|
|
195
|
+
logger.exception("get_behavioral_patterns failed")
|
|
196
|
+
return {"success": False, "error": str(exc)}
|
|
197
|
+
|
|
198
|
+
# ------------------------------------------------------------------
|
|
199
|
+
# 6. audit_trail
|
|
200
|
+
# ------------------------------------------------------------------
|
|
201
|
+
@server.tool()
|
|
202
|
+
async def audit_trail(limit: int = 50) -> dict:
|
|
203
|
+
"""Get compliance audit trail for the active profile.
|
|
204
|
+
|
|
205
|
+
Returns logged operations (store, retrieve, delete, export)
|
|
206
|
+
for GDPR and EU AI Act compliance reporting.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
limit: Maximum audit entries to return (default 50).
|
|
210
|
+
"""
|
|
211
|
+
try:
|
|
212
|
+
engine = get_engine()
|
|
213
|
+
from superlocalmemory.compliance.gdpr import GDPRCompliance
|
|
214
|
+
gdpr = GDPRCompliance(engine._db)
|
|
215
|
+
entries = gdpr.get_audit_trail(engine.profile_id, limit=limit)
|
|
216
|
+
return {
|
|
217
|
+
"success": True,
|
|
218
|
+
"entries": entries,
|
|
219
|
+
"count": len(entries),
|
|
220
|
+
}
|
|
221
|
+
except Exception as exc:
|
|
222
|
+
logger.exception("audit_trail failed")
|
|
223
|
+
return {"success": False, "error": str(exc)}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
+
# Licensed under the MIT License - see LICENSE file
|
|
3
|
+
# Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
|
|
4
|
+
|
|
5
|
+
"""SuperLocalMemory V3 — V3-Only MCP Tools (5 tools).
|
|
6
|
+
|
|
7
|
+
set_mode, get_mode, health, consistency_check, recall_trace.
|
|
8
|
+
|
|
9
|
+
Part of Qualixar | Author: Varun Pratap Bhardwaj
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from typing import Callable
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def register_v3_tools(server, get_engine: Callable) -> None:
|
|
21
|
+
"""Register 5 V3-exclusive tools on *server*."""
|
|
22
|
+
|
|
23
|
+
# ------------------------------------------------------------------
|
|
24
|
+
# 1. set_mode
|
|
25
|
+
# ------------------------------------------------------------------
|
|
26
|
+
@server.tool()
|
|
27
|
+
async def set_mode(mode: str) -> dict:
|
|
28
|
+
"""Switch operating mode (a, b, or c).
|
|
29
|
+
|
|
30
|
+
Mode A: Local Guardian (zero LLM, EU AI Act full compliance).
|
|
31
|
+
Mode B: Smart Local (local Ollama LLM, EU AI Act full).
|
|
32
|
+
Mode C: Full Power (cloud LLM, best accuracy).
|
|
33
|
+
|
|
34
|
+
Resets the engine to apply the new mode configuration.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
mode: Target mode - 'a', 'b', or 'c'.
|
|
38
|
+
"""
|
|
39
|
+
try:
|
|
40
|
+
mode_lower = mode.strip().lower()
|
|
41
|
+
if mode_lower not in ("a", "b", "c"):
|
|
42
|
+
return {
|
|
43
|
+
"success": False,
|
|
44
|
+
"error": f"Invalid mode '{mode}'. Use 'a', 'b', or 'c'.",
|
|
45
|
+
}
|
|
46
|
+
from superlocalmemory.core.config import SLMConfig
|
|
47
|
+
from superlocalmemory.storage.models import Mode
|
|
48
|
+
from superlocalmemory.mcp.server import reset_engine
|
|
49
|
+
|
|
50
|
+
mode_enum = Mode(mode_lower)
|
|
51
|
+
config = SLMConfig.for_mode(mode_enum)
|
|
52
|
+
config.save()
|
|
53
|
+
reset_engine()
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
"success": True,
|
|
57
|
+
"mode": mode_lower,
|
|
58
|
+
"description": _mode_description(mode_lower),
|
|
59
|
+
}
|
|
60
|
+
except Exception as exc:
|
|
61
|
+
logger.exception("set_mode failed")
|
|
62
|
+
return {"success": False, "error": str(exc)}
|
|
63
|
+
|
|
64
|
+
# ------------------------------------------------------------------
|
|
65
|
+
# 2. get_mode
|
|
66
|
+
# ------------------------------------------------------------------
|
|
67
|
+
@server.tool()
|
|
68
|
+
async def get_mode() -> dict:
|
|
69
|
+
"""Get current operating mode and its capabilities.
|
|
70
|
+
|
|
71
|
+
Returns mode identifier, description, and feature flags
|
|
72
|
+
(LLM availability, cross-encoder, agentic retrieval).
|
|
73
|
+
"""
|
|
74
|
+
try:
|
|
75
|
+
engine = get_engine()
|
|
76
|
+
m = engine._config.mode.value
|
|
77
|
+
caps = {
|
|
78
|
+
"llm_available": engine._llm is not None,
|
|
79
|
+
"cross_encoder": engine._config.retrieval.use_cross_encoder,
|
|
80
|
+
"agentic_rounds": engine._config.retrieval.agentic_max_rounds,
|
|
81
|
+
"sheaf_at_encoding": engine._config.math.sheaf_at_encoding,
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
"success": True,
|
|
85
|
+
"mode": m,
|
|
86
|
+
"description": _mode_description(m),
|
|
87
|
+
"capabilities": caps,
|
|
88
|
+
}
|
|
89
|
+
except Exception as exc:
|
|
90
|
+
logger.exception("get_mode failed")
|
|
91
|
+
return {"success": False, "error": str(exc)}
|
|
92
|
+
|
|
93
|
+
# ------------------------------------------------------------------
|
|
94
|
+
# 3. health
|
|
95
|
+
# ------------------------------------------------------------------
|
|
96
|
+
@server.tool()
|
|
97
|
+
async def health() -> dict:
|
|
98
|
+
"""Get system health including math layer status.
|
|
99
|
+
|
|
100
|
+
Reports on Fisher-Rao, Sheaf consistency, and Langevin dynamics
|
|
101
|
+
health. Also includes database integrity and component status.
|
|
102
|
+
"""
|
|
103
|
+
try:
|
|
104
|
+
engine = get_engine()
|
|
105
|
+
pid = engine.profile_id
|
|
106
|
+
|
|
107
|
+
status: dict = {
|
|
108
|
+
"success": True,
|
|
109
|
+
"mode": engine._config.mode.value,
|
|
110
|
+
"profile": pid,
|
|
111
|
+
"components": {},
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
# Database health
|
|
115
|
+
fact_count = engine._db.get_fact_count(pid)
|
|
116
|
+
status["components"]["database"] = {
|
|
117
|
+
"status": "ok",
|
|
118
|
+
"fact_count": fact_count,
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
# Embedding service
|
|
122
|
+
status["components"]["embedder"] = {
|
|
123
|
+
"status": "ok" if engine._embedder else "unavailable",
|
|
124
|
+
"model": engine._config.embedding.model_name,
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
# LLM
|
|
128
|
+
status["components"]["llm"] = {
|
|
129
|
+
"status": "ok" if engine._llm else "disabled",
|
|
130
|
+
"provider": engine._config.llm.provider or "none",
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
# Fisher-Rao (math layer 1)
|
|
134
|
+
fisher_facts = 0
|
|
135
|
+
if fact_count > 0:
|
|
136
|
+
rows = engine._db.execute(
|
|
137
|
+
"SELECT COUNT(*) AS c FROM atomic_facts "
|
|
138
|
+
"WHERE profile_id = ? AND fisher_mean IS NOT NULL",
|
|
139
|
+
(pid,),
|
|
140
|
+
)
|
|
141
|
+
fisher_facts = int(dict(rows[0])["c"]) if rows else 0
|
|
142
|
+
status["components"]["fisher_rao"] = {
|
|
143
|
+
"status": "ok" if fisher_facts > 0 else "no_data",
|
|
144
|
+
"indexed_facts": fisher_facts,
|
|
145
|
+
"temperature": engine._config.math.fisher_temperature,
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
# Sheaf consistency (math layer 2)
|
|
149
|
+
status["components"]["sheaf"] = {
|
|
150
|
+
"status": "active" if engine._sheaf_checker else "disabled",
|
|
151
|
+
"threshold": engine._config.math.sheaf_contradiction_threshold,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
# Langevin dynamics (math layer 3)
|
|
155
|
+
langevin_facts = 0
|
|
156
|
+
if fact_count > 0:
|
|
157
|
+
rows = engine._db.execute(
|
|
158
|
+
"SELECT COUNT(*) AS c FROM atomic_facts "
|
|
159
|
+
"WHERE profile_id = ? AND langevin_position IS NOT NULL",
|
|
160
|
+
(pid,),
|
|
161
|
+
)
|
|
162
|
+
langevin_facts = int(dict(rows[0])["c"]) if rows else 0
|
|
163
|
+
status["components"]["langevin"] = {
|
|
164
|
+
"status": "ok" if langevin_facts > 0 else "no_data",
|
|
165
|
+
"positioned_facts": langevin_facts,
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return status
|
|
169
|
+
except Exception as exc:
|
|
170
|
+
logger.exception("health failed")
|
|
171
|
+
return {"success": False, "error": str(exc)}
|
|
172
|
+
|
|
173
|
+
# ------------------------------------------------------------------
|
|
174
|
+
# 4. consistency_check
|
|
175
|
+
# ------------------------------------------------------------------
|
|
176
|
+
@server.tool()
|
|
177
|
+
async def consistency_check(limit: int = 100) -> dict:
|
|
178
|
+
"""Run sheaf consistency check on stored memories.
|
|
179
|
+
|
|
180
|
+
Detects contradictions between facts using algebraic topology
|
|
181
|
+
(sheaf cohomology). Returns pairs of contradicting facts with
|
|
182
|
+
severity scores.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
limit: Maximum facts to check (default 100).
|
|
186
|
+
"""
|
|
187
|
+
try:
|
|
188
|
+
engine = get_engine()
|
|
189
|
+
pid = engine.profile_id
|
|
190
|
+
|
|
191
|
+
if not engine._sheaf_checker:
|
|
192
|
+
return {
|
|
193
|
+
"success": True,
|
|
194
|
+
"contradictions": [],
|
|
195
|
+
"note": "Sheaf checker is disabled in current configuration.",
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
facts = engine._db.get_all_facts(pid)[:limit]
|
|
199
|
+
all_contradictions: list[dict] = []
|
|
200
|
+
for fact in facts:
|
|
201
|
+
if not fact.embedding or not fact.canonical_entities:
|
|
202
|
+
continue
|
|
203
|
+
try:
|
|
204
|
+
contradictions = engine._sheaf_checker.check_consistency(
|
|
205
|
+
fact, pid,
|
|
206
|
+
)
|
|
207
|
+
for c in contradictions:
|
|
208
|
+
all_contradictions.append({
|
|
209
|
+
"fact_a": fact.fact_id,
|
|
210
|
+
"fact_b": c.fact_id_b,
|
|
211
|
+
"severity": round(c.severity, 3),
|
|
212
|
+
"content_a": fact.content[:80],
|
|
213
|
+
})
|
|
214
|
+
except Exception:
|
|
215
|
+
continue
|
|
216
|
+
|
|
217
|
+
return {
|
|
218
|
+
"success": True,
|
|
219
|
+
"facts_checked": len(facts),
|
|
220
|
+
"contradictions": all_contradictions[:50],
|
|
221
|
+
"total_contradictions": len(all_contradictions),
|
|
222
|
+
}
|
|
223
|
+
except Exception as exc:
|
|
224
|
+
logger.exception("consistency_check failed")
|
|
225
|
+
return {"success": False, "error": str(exc)}
|
|
226
|
+
|
|
227
|
+
# ------------------------------------------------------------------
|
|
228
|
+
# 5. recall_trace
|
|
229
|
+
# ------------------------------------------------------------------
|
|
230
|
+
@server.tool()
|
|
231
|
+
async def recall_trace(query: str, limit: int = 10) -> dict:
|
|
232
|
+
"""Recall with per-channel score breakdown.
|
|
233
|
+
|
|
234
|
+
Like recall, but returns detailed channel-by-channel scores
|
|
235
|
+
for debugging retrieval quality.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
query: Natural-language search query.
|
|
239
|
+
limit: Maximum results (default 10).
|
|
240
|
+
"""
|
|
241
|
+
try:
|
|
242
|
+
engine = get_engine()
|
|
243
|
+
response = engine.recall(query, limit=limit)
|
|
244
|
+
results = []
|
|
245
|
+
for r in response.results[:limit]:
|
|
246
|
+
results.append({
|
|
247
|
+
"fact_id": r.fact.fact_id,
|
|
248
|
+
"content": r.fact.content,
|
|
249
|
+
"final_score": round(r.score, 4),
|
|
250
|
+
"confidence": round(r.confidence, 3),
|
|
251
|
+
"trust_score": round(r.trust_score, 3),
|
|
252
|
+
"channel_scores": {
|
|
253
|
+
k: round(v, 4) for k, v in r.channel_scores.items()
|
|
254
|
+
},
|
|
255
|
+
"evidence_chain": r.evidence_chain,
|
|
256
|
+
"fact_type": r.fact.fact_type.value,
|
|
257
|
+
"lifecycle": r.fact.lifecycle.value,
|
|
258
|
+
"access_count": r.fact.access_count,
|
|
259
|
+
})
|
|
260
|
+
return {
|
|
261
|
+
"success": True,
|
|
262
|
+
"results": results,
|
|
263
|
+
"count": len(results),
|
|
264
|
+
"query_type": response.query_type,
|
|
265
|
+
"channel_weights": {
|
|
266
|
+
k: round(v, 3)
|
|
267
|
+
for k, v in response.channel_weights.items()
|
|
268
|
+
},
|
|
269
|
+
"total_candidates": response.total_candidates,
|
|
270
|
+
"retrieval_time_ms": round(response.retrieval_time_ms, 1),
|
|
271
|
+
}
|
|
272
|
+
except Exception as exc:
|
|
273
|
+
logger.exception("recall_trace failed")
|
|
274
|
+
return {"success": False, "error": str(exc)}
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
# -- Helpers ------------------------------------------------------------------
|
|
278
|
+
|
|
279
|
+
def _mode_description(mode: str) -> str:
|
|
280
|
+
"""Human-readable description for a mode."""
|
|
281
|
+
descriptions = {
|
|
282
|
+
"a": "Local Guardian: zero LLM, full EU AI Act compliance",
|
|
283
|
+
"b": "Smart Local: local Ollama LLM, full EU AI Act compliance",
|
|
284
|
+
"c": "Full Power: cloud LLM, best accuracy, partial EU AI Act",
|
|
285
|
+
}
|
|
286
|
+
return descriptions.get(mode, "Unknown mode")
|
|
File without changes
|