agent-os-kernel 1.1.0__py3-none-any.whl → 1.2.0__py3-none-any.whl
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.
- agent_os/__init__.py +66 -4
- agent_os/agents_compat.py +286 -0
- agent_os/base_agent.py +308 -0
- agent_os/cli.py +1079 -19
- agent_os/integrations/__init__.py +37 -2
- agent_os/integrations/openai_adapter.py +502 -0
- agent_os/integrations/semantic_kernel_adapter.py +569 -0
- agent_os/stateless.py +349 -0
- agent_os_kernel-1.2.0.dist-info/METADATA +676 -0
- agent_os_kernel-1.2.0.dist-info/RECORD +1053 -0
- {agent_os_kernel-1.1.0.dist-info → agent_os_kernel-1.2.0.dist-info}/entry_points.txt +0 -1
- modules/amb/.github/workflows/ci.yml +102 -0
- modules/amb/.github/workflows/publish.yml +146 -0
- modules/amb/.gitignore +134 -0
- modules/amb/CHANGELOG.md +118 -0
- modules/amb/CONTRIBUTING.md +141 -0
- modules/amb/LICENSE +21 -0
- modules/amb/README.md +188 -0
- modules/amb/amb_core/__init__.py +175 -0
- modules/amb/amb_core/adapters/__init__.py +55 -0
- modules/amb/amb_core/adapters/aws_sqs_broker.py +374 -0
- modules/amb/amb_core/adapters/azure_servicebus_broker.py +338 -0
- modules/amb/amb_core/adapters/kafka_broker.py +258 -0
- modules/amb/amb_core/adapters/nats_broker.py +283 -0
- modules/amb/amb_core/adapters/rabbitmq_broker.py +233 -0
- modules/amb/amb_core/adapters/redis_broker.py +260 -0
- modules/amb/amb_core/broker.py +143 -0
- modules/amb/amb_core/bus.py +479 -0
- modules/amb/amb_core/cloudevents.py +507 -0
- modules/amb/amb_core/dlq.py +343 -0
- modules/amb/amb_core/hf_utils.py +534 -0
- modules/amb/amb_core/memory_broker.py +408 -0
- modules/amb/amb_core/models.py +139 -0
- modules/amb/amb_core/persistence.py +527 -0
- modules/amb/amb_core/schema.py +292 -0
- modules/amb/amb_core/tracing.py +356 -0
- modules/amb/examples/advanced_features.py +223 -0
- modules/amb/examples/backpressure_demo.py +225 -0
- modules/amb/examples/basic_usage.py +117 -0
- modules/amb/examples/tracing_demo.py +104 -0
- modules/amb/experiments/README.md +52 -0
- modules/amb/experiments/reproduce_results.py +467 -0
- modules/amb/experiments/results.json +324 -0
- modules/amb/paper/README.md +40 -0
- modules/amb/paper/paper.tex +365 -0
- modules/amb/paper/whitepaper.md +377 -0
- modules/amb/pyproject.toml +117 -0
- modules/amb/tests/__init__.py +1 -0
- modules/amb/tests/test_backpressure_priority.py +280 -0
- modules/amb/tests/test_bus.py +198 -0
- modules/amb/tests/test_cloudevents.py +443 -0
- modules/amb/tests/test_features.py +531 -0
- modules/amb/tests/test_models.py +74 -0
- modules/amb/tests/test_tracing.py +254 -0
- modules/atr/.github/workflows/ci.yml +101 -0
- modules/atr/.github/workflows/publish.yml +140 -0
- modules/atr/.gitignore +134 -0
- modules/atr/.pre-commit-config.yaml +37 -0
- modules/atr/CHANGELOG.md +39 -0
- modules/atr/CONTRIBUTING.md +96 -0
- modules/atr/IMPLEMENTATION_SUMMARY.md +143 -0
- modules/atr/README.md +180 -0
- modules/atr/atr/__init__.py +638 -0
- modules/atr/atr/access.py +346 -0
- modules/atr/atr/composition.py +643 -0
- modules/atr/atr/decorator.py +355 -0
- modules/atr/atr/executor.py +382 -0
- modules/atr/atr/health.py +555 -0
- modules/atr/atr/hf_utils.py +447 -0
- modules/atr/atr/injection.py +420 -0
- modules/atr/atr/metrics.py +438 -0
- modules/atr/atr/policies.py +401 -0
- modules/atr/atr/py.typed +2 -0
- modules/atr/atr/registry.py +450 -0
- modules/atr/atr/schema.py +478 -0
- modules/atr/atr/tools/safe/__init__.py +73 -0
- modules/atr/atr/tools/safe/calculator.py +380 -0
- modules/atr/atr/tools/safe/datetime_tool.py +441 -0
- modules/atr/atr/tools/safe/file_reader.py +400 -0
- modules/atr/atr/tools/safe/http_client.py +314 -0
- modules/atr/atr/tools/safe/json_parser.py +372 -0
- modules/atr/atr/tools/safe/text_tool.py +526 -0
- modules/atr/atr/tools/safe/toolkit.py +173 -0
- modules/atr/docs/PYPI_SETUP.md +113 -0
- modules/atr/examples/README.md +27 -0
- modules/atr/examples/demo.py +144 -0
- modules/atr/examples/sandbox_demo.py +218 -0
- modules/atr/experiments/README.md +69 -0
- modules/atr/experiments/reproduce_results.py +509 -0
- modules/atr/experiments/results/.gitkeep +0 -0
- modules/atr/experiments/results/results_20260123_140334.json +71 -0
- modules/atr/paper/README.md +36 -0
- modules/atr/paper/figures/.gitkeep +0 -0
- modules/atr/paper/references.bib +84 -0
- modules/atr/paper/structure.tex +293 -0
- modules/atr/paper/whitepaper.md +234 -0
- modules/atr/pyproject.toml +148 -0
- modules/atr/requirements.txt +1 -0
- modules/atr/setup.py +30 -0
- modules/atr/tests/__init__.py +1 -0
- modules/atr/tests/test_decorator.py +317 -0
- modules/atr/tests/test_executor.py +245 -0
- modules/atr/tests/test_integration_executor.py +184 -0
- modules/atr/tests/test_registry.py +312 -0
- modules/atr/tests/test_schema.py +182 -0
- modules/atr/tests/test_v2_features.py +708 -0
- modules/caas/.dockerignore +63 -0
- modules/caas/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
- modules/caas/.github/ISSUE_TEMPLATE/custom.md +10 -0
- modules/caas/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- modules/caas/.github/workflows/ci.yml +100 -0
- modules/caas/.github/workflows/lint.yml +39 -0
- modules/caas/.github/workflows/publish-pypi.yml +124 -0
- modules/caas/.gitignore +73 -0
- modules/caas/.pre-commit-config.yaml +33 -0
- modules/caas/CHANGELOG.md +58 -0
- modules/caas/CONTRIBUTING.md +346 -0
- modules/caas/Dockerfile +41 -0
- modules/caas/LICENSE +21 -0
- modules/caas/MANIFEST.in +11 -0
- modules/caas/README.md +158 -0
- modules/caas/benchmarks/README.md +255 -0
- modules/caas/benchmarks/create_hf_dataset.py +502 -0
- modules/caas/benchmarks/data/sample_corpus/README.md +86 -0
- modules/caas/benchmarks/data/sample_corpus/auth_module.py +211 -0
- modules/caas/benchmarks/data/sample_corpus/contribution_guide.md +185 -0
- modules/caas/benchmarks/data/sample_corpus/remote_work_policy.html +57 -0
- modules/caas/benchmarks/hf_dataset/README.md +214 -0
- modules/caas/benchmarks/hf_dataset/caas_benchmark_corpus.py +73 -0
- modules/caas/benchmarks/hf_dataset/corpus_preview.json +193 -0
- modules/caas/benchmarks/results/README.md +66 -0
- modules/caas/benchmarks/results/evaluation_2026-01-20.json +121 -0
- modules/caas/benchmarks/run_evaluation.py +561 -0
- modules/caas/benchmarks/statistical_tests.py +289 -0
- modules/caas/benchmarks/verify_sample_corpus.py +83 -0
- modules/caas/docker-compose.yml +38 -0
- modules/caas/docs/CONTEXT_TRIAD.md +462 -0
- modules/caas/docs/CONTRIBUTING.md +346 -0
- modules/caas/docs/ETHICS_AND_LIMITATIONS.md +336 -0
- modules/caas/docs/HEURISTIC_ROUTER.md +442 -0
- modules/caas/docs/IMPLEMENTATION_SUMMARY.md +363 -0
- modules/caas/docs/IMPLEMENTATION_SUMMARY_CONTEXT_TRIAD.md +277 -0
- modules/caas/docs/IMPLEMENTATION_SUMMARY_HEURISTIC_ROUTER.md +231 -0
- modules/caas/docs/IMPLEMENTATION_SUMMARY_METADATA_INJECTION.md +258 -0
- modules/caas/docs/IMPLEMENTATION_SUMMARY_PRAGMATIC_TRUTH.md +212 -0
- modules/caas/docs/IMPLEMENTATION_SUMMARY_TRUST_GATEWAY.md +319 -0
- modules/caas/docs/LAYER_1_PRIMITIVE.md +202 -0
- modules/caas/docs/METADATA_INJECTION.md +404 -0
- modules/caas/docs/PRAGMATIC_TRUTH.md +431 -0
- modules/caas/docs/RELATED_WORK.md +312 -0
- modules/caas/docs/RELEASE_CHECKLIST.md +219 -0
- modules/caas/docs/RELEASE_GUIDE.md +285 -0
- modules/caas/docs/REPRODUCIBILITY.md +386 -0
- modules/caas/docs/SLIDING_WINDOW.md +387 -0
- modules/caas/docs/STRUCTURE_AWARE_INDEXING.md +158 -0
- modules/caas/docs/TESTING.md +259 -0
- modules/caas/docs/THREAT_MODEL.md +247 -0
- modules/caas/docs/TRUST_GATEWAY.md +575 -0
- modules/caas/docs/VFS.md +298 -0
- modules/caas/examples/agents/enterprise_security_agent.py +414 -0
- modules/caas/examples/agents/intelligent_document_analyzer.py +380 -0
- modules/caas/examples/demos/demo.py +309 -0
- modules/caas/examples/demos/demo_context_triad.py +225 -0
- modules/caas/examples/demos/demo_conversation_manager.py +285 -0
- modules/caas/examples/demos/demo_heuristic_router.py +133 -0
- modules/caas/examples/demos/demo_metadata_injection.py +198 -0
- modules/caas/examples/demos/demo_pragmatic_truth.py +303 -0
- modules/caas/examples/demos/demo_structure_aware.py +140 -0
- modules/caas/examples/demos/demo_time_decay.py +247 -0
- modules/caas/examples/demos/demo_trust_gateway.py +383 -0
- modules/caas/examples/multi_agent/README.md +159 -0
- modules/caas/examples/multi_agent/research_team.py +369 -0
- modules/caas/examples/multi_agent/vfs_collaboration.py +393 -0
- modules/caas/examples/usage/auth_module.py +142 -0
- modules/caas/examples/usage/usage_example.py +173 -0
- modules/caas/experiments/README.md +42 -0
- modules/caas/experiments/reproduce_results.py +462 -0
- modules/caas/paper/ARXIV_METADATA.md +145 -0
- modules/caas/paper/ARXIV_README.md +47 -0
- modules/caas/paper/CHECKLIST.md +103 -0
- modules/caas/paper/GITHUB_RELEASE_NOTES.md +105 -0
- modules/caas/paper/README.md +71 -0
- modules/caas/paper/abstract.md +24 -0
- modules/caas/paper/arxiv_submission.tar +0 -0
- modules/caas/paper/arxiv_submission.zip +0 -0
- modules/caas/paper/build_pdf.py +355 -0
- modules/caas/paper/experiments.md +149 -0
- modules/caas/paper/figures/.gitkeep +0 -0
- modules/caas/paper/figures/README.md +237 -0
- modules/caas/paper/figures/fig1_system_architecture.png +0 -0
- modules/caas/paper/figures/fig1_system_architecture.svg +198 -0
- modules/caas/paper/figures/fig2_context_triad.png +0 -0
- modules/caas/paper/figures/fig2_context_triad.svg +105 -0
- modules/caas/paper/figures/fig3_ablation_results.png +0 -0
- modules/caas/paper/figures/fig3_ablation_results.svg +113 -0
- modules/caas/paper/figures/fig4_routing_latency.png +0 -0
- modules/caas/paper/figures/fig4_routing_latency.svg +97 -0
- modules/caas/paper/intro.md +103 -0
- modules/caas/paper/latex/figures/fig1_system_architecture.png +0 -0
- modules/caas/paper/latex/figures/fig2_context_triad.png +0 -0
- modules/caas/paper/latex/figures/fig3_ablation_results.png +0 -0
- modules/caas/paper/latex/figures/fig4_routing_latency.png +0 -0
- modules/caas/paper/latex/main.tex +468 -0
- modules/caas/paper/latex/references.bib +140 -0
- modules/caas/paper/method.md +350 -0
- modules/caas/paper/outline.md +123 -0
- modules/caas/paper/related_work.md +101 -0
- modules/caas/paper/tables/.gitkeep +0 -0
- modules/caas/paper/tables/results_tables.md +50 -0
- modules/caas/pyproject.toml +172 -0
- modules/caas/requirements.txt +11 -0
- modules/caas/src/caas/__init__.py +232 -0
- modules/caas/src/caas/api/__init__.py +7 -0
- modules/caas/src/caas/api/server.py +1326 -0
- modules/caas/src/caas/caching.py +832 -0
- modules/caas/src/caas/cli.py +208 -0
- modules/caas/src/caas/conversation.py +221 -0
- modules/caas/src/caas/decay.py +118 -0
- modules/caas/src/caas/detection/__init__.py +7 -0
- modules/caas/src/caas/detection/detector.py +236 -0
- modules/caas/src/caas/enrichment.py +127 -0
- modules/caas/src/caas/gateway/__init__.py +24 -0
- modules/caas/src/caas/gateway/trust_gateway.py +471 -0
- modules/caas/src/caas/hf_utils.py +477 -0
- modules/caas/src/caas/ingestion/__init__.py +21 -0
- modules/caas/src/caas/ingestion/processors.py +251 -0
- modules/caas/src/caas/ingestion/structure_parser.py +185 -0
- modules/caas/src/caas/models.py +354 -0
- modules/caas/src/caas/pragmatic_truth.py +441 -0
- modules/caas/src/caas/routing/__init__.py +8 -0
- modules/caas/src/caas/routing/heuristic_router.py +242 -0
- modules/caas/src/caas/storage/__init__.py +7 -0
- modules/caas/src/caas/storage/store.py +450 -0
- modules/caas/src/caas/triad.py +472 -0
- modules/caas/src/caas/tuning/__init__.py +7 -0
- modules/caas/src/caas/tuning/tuner.py +322 -0
- modules/caas/src/caas/vfs/__init__.py +12 -0
- modules/caas/src/caas/vfs/filesystem.py +450 -0
- modules/caas/tests/__init__.py +3 -0
- modules/caas/tests/conftest.py +8 -0
- modules/caas/tests/test_caching.py +628 -0
- modules/caas/tests/test_context_triad.py +385 -0
- modules/caas/tests/test_conversation_manager.py +289 -0
- modules/caas/tests/test_functionality.py +215 -0
- modules/caas/tests/test_heuristic_router.py +370 -0
- modules/caas/tests/test_metadata_injection.py +328 -0
- modules/caas/tests/test_pragmatic_truth.py +322 -0
- modules/caas/tests/test_structure_aware_indexing.py +283 -0
- modules/caas/tests/test_time_decay.py +268 -0
- modules/caas/tests/test_trust_gateway.py +445 -0
- modules/caas/tests/test_vfs.py +298 -0
- modules/cmvk/.github/FUNDING.yml +9 -0
- modules/cmvk/.github/dependabot.yml +54 -0
- modules/cmvk/.github/workflows/ci.yml +205 -0
- modules/cmvk/.github/workflows/publish.yml +143 -0
- modules/cmvk/.gitignore +147 -0
- modules/cmvk/.pre-commit-config.yaml +58 -0
- modules/cmvk/CHANGELOG.md +146 -0
- modules/cmvk/CITATION.cff +48 -0
- modules/cmvk/CONTRIBUTING.md +229 -0
- modules/cmvk/Dockerfile +87 -0
- modules/cmvk/HF_MODEL_CARD.md +185 -0
- modules/cmvk/LICENSE +21 -0
- modules/cmvk/README.md +149 -0
- modules/cmvk/SECURITY.md +114 -0
- modules/cmvk/config/prompts/generator_v1.txt +23 -0
- modules/cmvk/config/prompts/verifier_hostile.txt +32 -0
- modules/cmvk/config/settings.yaml +40 -0
- modules/cmvk/coverage_html/.gitignore +2 -0
- modules/cmvk/coverage_html/class_index.html +658 -0
- modules/cmvk/coverage_html/coverage_html_cb_188fc9a4.js +735 -0
- modules/cmvk/coverage_html/favicon_32_cb_c827f16f.png +0 -0
- modules/cmvk/coverage_html/function_index.html +1978 -0
- modules/cmvk/coverage_html/index.html +255 -0
- modules/cmvk/coverage_html/keybd_closed_cb_900cfef5.png +0 -0
- modules/cmvk/coverage_html/status.json +1 -0
- modules/cmvk/coverage_html/style_cb_5c747636.css +389 -0
- modules/cmvk/coverage_html/z_2c49bd2ed3e01e38___init___py.html +315 -0
- modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_audit_py.html +499 -0
- modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_benchmarks_py.html +575 -0
- modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_constitutional_py.html +1001 -0
- modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_hf_utils_py.html +398 -0
- modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_metrics_py.html +570 -0
- modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_profiles_py.html +397 -0
- modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_types_py.html +109 -0
- modules/cmvk/coverage_html/z_2c49bd2ed3e01e38_verification_py.html +1053 -0
- modules/cmvk/docs/DIAGRAMS.md +325 -0
- modules/cmvk/docs/architecture.md +345 -0
- modules/cmvk/docs/features.md +308 -0
- modules/cmvk/docs/getting_started.md +279 -0
- modules/cmvk/docs/innovation_layer.md +377 -0
- modules/cmvk/docs/safety.md +281 -0
- modules/cmvk/docs/traceability.md +150 -0
- modules/cmvk/examples/basic_example.py +62 -0
- modules/cmvk/examples/demo_complete_pipeline.py +209 -0
- modules/cmvk/examples/demo_innovation_layer.py +197 -0
- modules/cmvk/examples/example.py +112 -0
- modules/cmvk/examples/model_diversity_comparison.py +110 -0
- modules/cmvk/examples/real_api_integration.py +121 -0
- modules/cmvk/examples/test_full_pipeline.py +303 -0
- modules/cmvk/experiments/FEATURE_2_LATERAL_THINKING.md +187 -0
- modules/cmvk/experiments/README.md +216 -0
- modules/cmvk/experiments/ablation_runner.py +666 -0
- modules/cmvk/experiments/baseline_runner.py +158 -0
- modules/cmvk/experiments/blind_spot_benchmark.py +364 -0
- modules/cmvk/experiments/datasets/README.md +85 -0
- modules/cmvk/experiments/datasets/humaneval_50.json +352 -0
- modules/cmvk/experiments/datasets/humaneval_full.json +1150 -0
- modules/cmvk/experiments/datasets/humaneval_sample.json +32 -0
- modules/cmvk/experiments/datasets/sabotage.json +262 -0
- modules/cmvk/experiments/datasets/sample.json +40 -0
- modules/cmvk/experiments/demo_with_traces.py +110 -0
- modules/cmvk/experiments/efficiency_curve.py +259 -0
- modules/cmvk/experiments/experiment_runner.py +243 -0
- modules/cmvk/experiments/paper_data_generator.py +183 -0
- modules/cmvk/experiments/reproduce_results.py +407 -0
- modules/cmvk/experiments/reproducible_runner.py +352 -0
- modules/cmvk/experiments/sabotage_stress_test.py +311 -0
- modules/cmvk/experiments/test_lateral_thinking.py +116 -0
- modules/cmvk/experiments/test_prosecutor.py +41 -0
- modules/cmvk/experiments/visualize_results.py +735 -0
- modules/cmvk/logs/traces/demo_HumanEval_0_20260121-204900.json +36 -0
- modules/cmvk/notebooks/analysis.ipynb +124 -0
- modules/cmvk/paper/PAPER.md +561 -0
- modules/cmvk/paper/arxiv_checklist.md +230 -0
- modules/cmvk/paper/cmvk_neurips.aux +77 -0
- modules/cmvk/paper/cmvk_neurips.bbl +81 -0
- modules/cmvk/paper/cmvk_neurips.blg +48 -0
- modules/cmvk/paper/cmvk_neurips.out +16 -0
- modules/cmvk/paper/cmvk_neurips.pdf +0 -0
- modules/cmvk/paper/cmvk_neurips.tex +309 -0
- modules/cmvk/paper/figures/ablation.png +0 -0
- modules/cmvk/paper/figures/ablation.svg +39 -0
- modules/cmvk/paper/figures/architecture.png +0 -0
- modules/cmvk/paper/figures/architecture.svg +115 -0
- modules/cmvk/paper/figures/results_bar.png +0 -0
- modules/cmvk/paper/figures/results_bar.svg +70 -0
- modules/cmvk/paper/generate_figures.py +383 -0
- modules/cmvk/paper/neurips_2024.sty +101 -0
- modules/cmvk/paper/references.bib +98 -0
- modules/cmvk/paper/structure.tex +200 -0
- modules/cmvk/pyproject.toml +189 -0
- modules/cmvk/requirements-dev.txt +19 -0
- modules/cmvk/requirements.txt +14 -0
- modules/cmvk/src/cmvk/__init__.py +216 -0
- modules/cmvk/src/cmvk/audit.py +400 -0
- modules/cmvk/src/cmvk/benchmarks.py +476 -0
- modules/cmvk/src/cmvk/constitutional.py +902 -0
- modules/cmvk/src/cmvk/hf_utils.py +299 -0
- modules/cmvk/src/cmvk/metrics.py +471 -0
- modules/cmvk/src/cmvk/profiles.py +298 -0
- modules/cmvk/src/cmvk/py.typed +0 -0
- modules/cmvk/src/cmvk/types.py +10 -0
- modules/cmvk/src/cmvk/verification.py +954 -0
- modules/cmvk/src/cross_model_verification_kernel/__init__.py +91 -0
- modules/cmvk/src/cross_model_verification_kernel/__main__.py +10 -0
- modules/cmvk/src/cross_model_verification_kernel/agents/__init__.py +16 -0
- modules/cmvk/src/cross_model_verification_kernel/agents/base_agent.py +142 -0
- modules/cmvk/src/cross_model_verification_kernel/agents/generator_openai.py +223 -0
- modules/cmvk/src/cross_model_verification_kernel/agents/verifier_anthropic.py +448 -0
- modules/cmvk/src/cross_model_verification_kernel/agents/verifier_gemini.py +481 -0
- modules/cmvk/src/cross_model_verification_kernel/cli.py +570 -0
- modules/cmvk/src/cross_model_verification_kernel/core/__init__.py +26 -0
- modules/cmvk/src/cross_model_verification_kernel/core/graph_memory.py +308 -0
- modules/cmvk/src/cross_model_verification_kernel/core/kernel.py +413 -0
- modules/cmvk/src/cross_model_verification_kernel/core/trace_logger.py +75 -0
- modules/cmvk/src/cross_model_verification_kernel/core/types.py +121 -0
- modules/cmvk/src/cross_model_verification_kernel/datasets/__init__.py +20 -0
- modules/cmvk/src/cross_model_verification_kernel/datasets/humaneval_loader.py +271 -0
- modules/cmvk/src/cross_model_verification_kernel/generator.py +118 -0
- modules/cmvk/src/cross_model_verification_kernel/kernel.py +292 -0
- modules/cmvk/src/cross_model_verification_kernel/models.py +111 -0
- modules/cmvk/src/cross_model_verification_kernel/py.typed +1 -0
- modules/cmvk/src/cross_model_verification_kernel/simple_kernel.py +185 -0
- modules/cmvk/src/cross_model_verification_kernel/tools/__init__.py +94 -0
- modules/cmvk/src/cross_model_verification_kernel/tools/huggingface_upload.py +394 -0
- modules/cmvk/src/cross_model_verification_kernel/tools/sandbox.py +159 -0
- modules/cmvk/src/cross_model_verification_kernel/tools/statistics.py +468 -0
- modules/cmvk/src/cross_model_verification_kernel/tools/visualizer.py +312 -0
- modules/cmvk/src/cross_model_verification_kernel/tools/web_search.py +86 -0
- modules/cmvk/src/cross_model_verification_kernel/verifier.py +257 -0
- modules/cmvk/tests/__init__.py +3 -0
- modules/cmvk/tests/conftest.py +61 -0
- modules/cmvk/tests/integration/__init__.py +1 -0
- modules/cmvk/tests/integration/test_anthropic_verifier.py +269 -0
- modules/cmvk/tests/integration/test_integration.py +53 -0
- modules/cmvk/tests/integration/test_lateral_thinking_integration.py +199 -0
- modules/cmvk/tests/integration/test_lateral_thinking_witness.py +208 -0
- modules/cmvk/tests/integration/test_prosecutor_mode.py +131 -0
- modules/cmvk/tests/test_constitutional.py +611 -0
- modules/cmvk/tests/test_enhanced_features.py +603 -0
- modules/cmvk/tests/test_verification.py +255 -0
- modules/cmvk/tests/unit/__init__.py +1 -0
- modules/cmvk/tests/unit/test_agents.py +64 -0
- modules/cmvk/tests/unit/test_cli.py +224 -0
- modules/cmvk/tests/unit/test_core.py +126 -0
- modules/cmvk/tests/unit/test_humaneval_loader.py +197 -0
- modules/cmvk/tests/unit/test_kernel.py +255 -0
- modules/cmvk/tests/unit/test_reproducibility.py +160 -0
- modules/cmvk/tests/unit/test_trace_logger.py +115 -0
- modules/cmvk/tests/unit/test_visualizer.py +218 -0
- modules/control-plane/.github/ISSUE_TEMPLATE/bug_report.yml +82 -0
- modules/control-plane/.github/ISSUE_TEMPLATE/config.yml +11 -0
- modules/control-plane/.github/ISSUE_TEMPLATE/feature_request.yml +104 -0
- modules/control-plane/.github/ISSUE_TEMPLATE/question.yml +70 -0
- modules/control-plane/.github/ISSUE_TEMPLATE/security_vulnerability.yml +84 -0
- modules/control-plane/.github/discussions.yml +73 -0
- modules/control-plane/.github/pull_request_template.md +82 -0
- modules/control-plane/.github/workflows/publish.yml +146 -0
- modules/control-plane/.github/workflows/release.yml +39 -0
- modules/control-plane/.github/workflows/tests.yml +58 -0
- modules/control-plane/.gitignore +55 -0
- modules/control-plane/CHANGELOG.md +203 -0
- modules/control-plane/CONTRIBUTING.md +311 -0
- modules/control-plane/CONTRIBUTORS.md +88 -0
- modules/control-plane/Dockerfile +82 -0
- modules/control-plane/LICENSE +21 -0
- modules/control-plane/MANIFEST.in +17 -0
- modules/control-plane/README.md +1264 -0
- modules/control-plane/ROADMAP.md +228 -0
- modules/control-plane/SECURITY.md +210 -0
- modules/control-plane/SUPPORT.md +106 -0
- modules/control-plane/acp-cli.py +212 -0
- modules/control-plane/benchmark/README.md +257 -0
- modules/control-plane/benchmark/__init__.py +19 -0
- modules/control-plane/benchmark/red_team_dataset.py +517 -0
- modules/control-plane/benchmark.py +563 -0
- modules/control-plane/build_and_publish.sh +130 -0
- modules/control-plane/docker-compose.yml +74 -0
- modules/control-plane/docs/ABLATION_STUDIES.md +528 -0
- modules/control-plane/docs/ADAPTER_GUIDE.md +544 -0
- modules/control-plane/docs/ADVANCED_FEATURES.md +543 -0
- modules/control-plane/docs/AIOS_COMPARISON.md +296 -0
- modules/control-plane/docs/BIBLIOGRAPHY.md +367 -0
- modules/control-plane/docs/CASE_STUDIES.md +645 -0
- modules/control-plane/docs/DOCKER_DEPLOYMENT.md +184 -0
- modules/control-plane/docs/ECOSYSTEM_STATUS.md +98 -0
- modules/control-plane/docs/HF_MODEL_CARD.md +168 -0
- modules/control-plane/docs/KERNEL_V1_RELEASE.md +454 -0
- modules/control-plane/docs/LAYER3_FRAMEWORK.md +227 -0
- modules/control-plane/docs/LIMITATIONS.md +523 -0
- modules/control-plane/docs/PYPI_PUBLISHING.md +195 -0
- modules/control-plane/docs/README.md +58 -0
- modules/control-plane/docs/RELATED_WORK.md +319 -0
- modules/control-plane/docs/RELEASE_v1.1.0.md +252 -0
- modules/control-plane/docs/REPRODUCIBILITY.md +540 -0
- modules/control-plane/docs/RESEARCH_FOUNDATION.md +197 -0
- modules/control-plane/docs/api/CORE.md +270 -0
- modules/control-plane/docs/architecture/architecture.md +120 -0
- modules/control-plane/docs/community/ANNOUNCEMENT_TEMPLATES.md +52 -0
- modules/control-plane/docs/guides/IMPLEMENTATION.md +225 -0
- modules/control-plane/docs/guides/PHILOSOPHY.md +354 -0
- modules/control-plane/docs/guides/QUICKSTART.md +217 -0
- modules/control-plane/examples/README.md +138 -0
- modules/control-plane/examples/a2a_demo.py +410 -0
- modules/control-plane/examples/adapter_demo.py +347 -0
- modules/control-plane/examples/advanced_features.py +403 -0
- modules/control-plane/examples/basic_usage.py +261 -0
- modules/control-plane/examples/benchmark_demo.py +186 -0
- modules/control-plane/examples/compliance_demo.py +333 -0
- modules/control-plane/examples/configuration.py +265 -0
- modules/control-plane/examples/getting_started.py +178 -0
- modules/control-plane/examples/hibernation_and_time_travel_demo.py +406 -0
- modules/control-plane/examples/interactive_tutorial.ipynb +497 -0
- modules/control-plane/examples/kernel_interceptor_demo.py +202 -0
- modules/control-plane/examples/kernel_v1_demo.py +273 -0
- modules/control-plane/examples/langchain_demo.py +281 -0
- modules/control-plane/examples/lifecycle_demo.py +724 -0
- modules/control-plane/examples/mcp_demo.py +378 -0
- modules/control-plane/examples/ml_safety_demo.py +157 -0
- modules/control-plane/examples/multimodal_demo.py +347 -0
- modules/control-plane/examples/observability_demo.py +370 -0
- modules/control-plane/examples/use_cases.py +336 -0
- modules/control-plane/experiments/long_horizon_purge.py +235 -0
- modules/control-plane/experiments/multi_agent_rag.py +165 -0
- modules/control-plane/experiments/reproduce_results.py +667 -0
- modules/control-plane/paper/ARXIV_SUBMISSION_INFO.txt +122 -0
- modules/control-plane/paper/ETHICS_STATEMENT.md +248 -0
- modules/control-plane/paper/PAPER_CHECKLIST.md +72 -0
- modules/control-plane/paper/Paper.pdf +0 -0
- modules/control-plane/paper/README.md +71 -0
- modules/control-plane/paper/appendix.md +152 -0
- modules/control-plane/paper/architecture.md +15 -0
- modules/control-plane/paper/arxiv/figures/ablation_chart.png +0 -0
- modules/control-plane/paper/arxiv/figures/architecture.png +0 -0
- modules/control-plane/paper/arxiv/figures/constraint_graphs.png +0 -0
- modules/control-plane/paper/arxiv/figures/results_chart.png +0 -0
- modules/control-plane/paper/arxiv/main.aux +97 -0
- modules/control-plane/paper/arxiv/main.bbl +112 -0
- modules/control-plane/paper/arxiv/main.blg +48 -0
- modules/control-plane/paper/arxiv/main.out +33 -0
- modules/control-plane/paper/arxiv/main.pdf +0 -0
- modules/control-plane/paper/arxiv/main.tex +479 -0
- modules/control-plane/paper/arxiv/references.bib +234 -0
- modules/control-plane/paper/arxiv_submission.tar +0 -0
- modules/control-plane/paper/arxiv_submission.zip +0 -0
- modules/control-plane/paper/build.sh +68 -0
- modules/control-plane/paper/figures/README.md +47 -0
- modules/control-plane/paper/figures/ablation_chart.pdf +0 -0
- modules/control-plane/paper/figures/ablation_chart.png +0 -0
- modules/control-plane/paper/figures/architecture.pdf +0 -0
- modules/control-plane/paper/figures/architecture.png +0 -0
- modules/control-plane/paper/figures/constraint_graphs.pdf +0 -0
- modules/control-plane/paper/figures/constraint_graphs.png +0 -0
- modules/control-plane/paper/figures/generate_figures.py +252 -0
- modules/control-plane/paper/figures/results_chart.pdf +0 -0
- modules/control-plane/paper/figures/results_chart.png +0 -0
- modules/control-plane/paper/main.md +273 -0
- modules/control-plane/paper/main.tex +214 -0
- modules/control-plane/paper/main_arxiv.aux +53 -0
- modules/control-plane/paper/main_arxiv.out +17 -0
- modules/control-plane/paper/main_arxiv.pdf +0 -0
- modules/control-plane/paper/main_arxiv.tex +264 -0
- modules/control-plane/paper/references.bib +234 -0
- modules/control-plane/pyproject.toml +124 -0
- modules/control-plane/reproducibility/ABLATIONS.md +136 -0
- modules/control-plane/reproducibility/README.md +288 -0
- modules/control-plane/reproducibility/commands.md +467 -0
- modules/control-plane/reproducibility/docker_config/Dockerfile +39 -0
- modules/control-plane/reproducibility/experiment_configs/purge_config.json +46 -0
- modules/control-plane/reproducibility/experiment_configs/rag_config.json +36 -0
- modules/control-plane/reproducibility/hardware_specs.md +317 -0
- modules/control-plane/reproducibility/requirements_frozen.txt +0 -0
- modules/control-plane/reproducibility/run_all_experiments.sh +45 -0
- modules/control-plane/reproducibility/seeds.json +106 -0
- modules/control-plane/scripts/prepare_pypi.py +46 -0
- modules/control-plane/scripts/prepare_release.py +176 -0
- modules/control-plane/scripts/upload_dataset_to_hf.py +316 -0
- modules/control-plane/setup.py +69 -0
- modules/control-plane/src/agent_control_plane/__init__.py +639 -0
- modules/control-plane/src/agent_control_plane/a2a_adapter.py +541 -0
- modules/control-plane/src/agent_control_plane/adapter.py +415 -0
- modules/control-plane/src/agent_control_plane/agent_hibernation.py +364 -0
- modules/control-plane/src/agent_control_plane/agent_kernel.py +464 -0
- modules/control-plane/src/agent_control_plane/compliance.py +718 -0
- modules/control-plane/src/agent_control_plane/constraint_graphs.py +475 -0
- modules/control-plane/src/agent_control_plane/control_plane.py +848 -0
- modules/control-plane/src/agent_control_plane/example_executors.py +193 -0
- modules/control-plane/src/agent_control_plane/execution_engine.py +229 -0
- modules/control-plane/src/agent_control_plane/flight_recorder.py +600 -0
- modules/control-plane/src/agent_control_plane/governance_layer.py +432 -0
- modules/control-plane/src/agent_control_plane/hf_utils.py +561 -0
- modules/control-plane/src/agent_control_plane/interfaces/__init__.py +53 -0
- modules/control-plane/src/agent_control_plane/interfaces/kernel_interface.py +359 -0
- modules/control-plane/src/agent_control_plane/interfaces/plugin_interface.py +495 -0
- modules/control-plane/src/agent_control_plane/interfaces/protocol_interfaces.py +385 -0
- modules/control-plane/src/agent_control_plane/kernel_space.py +707 -0
- modules/control-plane/src/agent_control_plane/langchain_adapter.py +422 -0
- modules/control-plane/src/agent_control_plane/lifecycle.py +3111 -0
- modules/control-plane/src/agent_control_plane/mcp_adapter.py +517 -0
- modules/control-plane/src/agent_control_plane/ml_safety.py +560 -0
- modules/control-plane/src/agent_control_plane/multimodal.py +724 -0
- modules/control-plane/src/agent_control_plane/mute_agent.py +419 -0
- modules/control-plane/src/agent_control_plane/observability.py +785 -0
- modules/control-plane/src/agent_control_plane/orchestrator.py +480 -0
- modules/control-plane/src/agent_control_plane/plugin_registry.py +748 -0
- modules/control-plane/src/agent_control_plane/policy_engine.py +525 -0
- modules/control-plane/src/agent_control_plane/shadow_mode.py +307 -0
- modules/control-plane/src/agent_control_plane/signals.py +491 -0
- modules/control-plane/src/agent_control_plane/supervisor_agents.py +427 -0
- modules/control-plane/src/agent_control_plane/time_travel_debugger.py +554 -0
- modules/control-plane/src/agent_control_plane/tool_registry.py +350 -0
- modules/control-plane/src/agent_control_plane/vfs.py +695 -0
- modules/control-plane/tests/README.md +33 -0
- modules/control-plane/tests/test_a2a_adapter.py +336 -0
- modules/control-plane/tests/test_adapter.py +422 -0
- modules/control-plane/tests/test_advanced_features.py +389 -0
- modules/control-plane/tests/test_benchmark.py +223 -0
- modules/control-plane/tests/test_compliance.py +214 -0
- modules/control-plane/tests/test_control_plane.py +295 -0
- modules/control-plane/tests/test_hibernation.py +274 -0
- modules/control-plane/tests/test_kernel_interception.py +284 -0
- modules/control-plane/tests/test_langchain_adapter.py +258 -0
- modules/control-plane/tests/test_lifecycle.py +1174 -0
- modules/control-plane/tests/test_mcp_adapter.py +293 -0
- modules/control-plane/tests/test_ml_safety.py +142 -0
- modules/control-plane/tests/test_multimodal.py +317 -0
- modules/control-plane/tests/test_new_features.py +435 -0
- modules/control-plane/tests/test_observability.py +338 -0
- modules/control-plane/tests/test_time_travel.py +387 -0
- modules/emk/.github/workflows/ci.yml +105 -0
- modules/emk/.github/workflows/publish.yml +144 -0
- modules/emk/.gitignore +74 -0
- modules/emk/CHANGELOG.md +41 -0
- modules/emk/CONTRIBUTING.md +295 -0
- modules/emk/IMPLEMENTATION.md +174 -0
- modules/emk/LICENSE +21 -0
- modules/emk/MANIFEST.in +8 -0
- modules/emk/README.md +135 -0
- modules/emk/RELEASE_NOTES.md +82 -0
- modules/emk/SECURITY.md +52 -0
- modules/emk/codecov.yml +39 -0
- modules/emk/docs/MEMORY_MANAGEMENT.md +285 -0
- modules/emk/emk/__init__.py +106 -0
- modules/emk/emk/hf_utils.py +419 -0
- modules/emk/emk/indexer.py +144 -0
- modules/emk/emk/py.typed +0 -0
- modules/emk/emk/schema.py +204 -0
- modules/emk/emk/sleep_cycle.py +345 -0
- modules/emk/emk/store.py +479 -0
- modules/emk/examples/basic_usage.py +123 -0
- modules/emk/examples/memory_features_demo.py +154 -0
- modules/emk/experiments/README.md +59 -0
- modules/emk/experiments/reproduce_results.py +461 -0
- modules/emk/experiments/results.json +61 -0
- modules/emk/paper/structure.tex +192 -0
- modules/emk/paper/whitepaper.md +273 -0
- modules/emk/pyproject.toml +91 -0
- modules/emk/setup.py +5 -0
- modules/emk/tests/test_file_adapter.py +195 -0
- modules/emk/tests/test_indexer.py +174 -0
- modules/emk/tests/test_init.py +55 -0
- modules/emk/tests/test_negative_memory.py +83 -0
- modules/emk/tests/test_schema.py +150 -0
- modules/emk/tests/test_semantic_rules.py +175 -0
- modules/emk/tests/test_sleep_cycle.py +335 -0
- modules/emk/tests/test_store_anti_patterns.py +239 -0
- modules/iatp/.github/workflows/docker-build.yml +124 -0
- modules/iatp/.github/workflows/publish.yml +174 -0
- modules/iatp/.github/workflows/python-package.yml +121 -0
- modules/iatp/.gitignore +67 -0
- modules/iatp/.pre-commit-config.yaml +64 -0
- modules/iatp/CHANGELOG.md +120 -0
- modules/iatp/Dockerfile +91 -0
- modules/iatp/IMPLEMENTATION_SUMMARY.md +218 -0
- modules/iatp/MANIFEST.in +9 -0
- modules/iatp/README.md +180 -0
- modules/iatp/docker/Dockerfile.agent +27 -0
- modules/iatp/docker/Dockerfile.sidecar-python +86 -0
- modules/iatp/docker/README.md +258 -0
- modules/iatp/docker-compose.yml +194 -0
- modules/iatp/docs/ARCHITECTURE.md +243 -0
- modules/iatp/docs/CLI_GUIDE.md +220 -0
- modules/iatp/docs/DEPLOYMENT.md +304 -0
- modules/iatp/examples/README.md +132 -0
- modules/iatp/examples/backend_agent.py +39 -0
- modules/iatp/examples/client.py +168 -0
- modules/iatp/examples/demo_attestation_reputation.py +274 -0
- modules/iatp/examples/demo_client.py +240 -0
- modules/iatp/examples/demo_rbac.py +143 -0
- modules/iatp/examples/integration_demo.py +245 -0
- modules/iatp/examples/manifests/coder_agent.json +20 -0
- modules/iatp/examples/manifests/reviewer_agent.json +19 -0
- modules/iatp/examples/manifests/secure_bank.json +14 -0
- modules/iatp/examples/manifests/standard_agent.json +14 -0
- modules/iatp/examples/manifests/untrusted_honeypot.json +14 -0
- modules/iatp/examples/run_secure_bank_sidecar.py +85 -0
- modules/iatp/examples/run_sidecar.py +105 -0
- modules/iatp/examples/run_untrusted_sidecar.py +77 -0
- modules/iatp/examples/secure_bank_agent.py +138 -0
- modules/iatp/examples/test_untrusted.py +82 -0
- modules/iatp/examples/untrusted_agent.py +119 -0
- modules/iatp/experiments/README.md +58 -0
- modules/iatp/experiments/cascading_hallucination/README.md +149 -0
- modules/iatp/experiments/cascading_hallucination/agent_a_user.py +41 -0
- modules/iatp/experiments/cascading_hallucination/agent_b_summarizer.py +54 -0
- modules/iatp/experiments/cascading_hallucination/agent_c_database.py +47 -0
- modules/iatp/experiments/cascading_hallucination/proof_of_concept.py +290 -0
- modules/iatp/experiments/cascading_hallucination/run_experiment.py +226 -0
- modules/iatp/experiments/cascading_hallucination/sidecar_c.py +61 -0
- modules/iatp/experiments/reproduce_results.py +574 -0
- modules/iatp/experiments/results.json +2336 -0
- modules/iatp/iatp/__init__.py +164 -0
- modules/iatp/iatp/attestation.py +401 -0
- modules/iatp/iatp/cli.py +253 -0
- modules/iatp/iatp/hf_utils.py +469 -0
- modules/iatp/iatp/ipc_pipes.py +578 -0
- modules/iatp/iatp/main.py +410 -0
- modules/iatp/iatp/models/__init__.py +445 -0
- modules/iatp/iatp/policy_engine.py +335 -0
- modules/iatp/iatp/py.typed +2 -0
- modules/iatp/iatp/recovery.py +319 -0
- modules/iatp/iatp/security/__init__.py +268 -0
- modules/iatp/iatp/sidecar/__init__.py +517 -0
- modules/iatp/iatp/telemetry/__init__.py +162 -0
- modules/iatp/iatp/tests/__init__.py +1 -0
- modules/iatp/iatp/tests/test_attestation.py +368 -0
- modules/iatp/iatp/tests/test_cli.py +129 -0
- modules/iatp/iatp/tests/test_models.py +128 -0
- modules/iatp/iatp/tests/test_policy_engine.py +345 -0
- modules/iatp/iatp/tests/test_recovery.py +279 -0
- modules/iatp/iatp/tests/test_security.py +220 -0
- modules/iatp/iatp/tests/test_sidecar.py +165 -0
- modules/iatp/iatp/tests/test_telemetry.py +173 -0
- modules/iatp/paper/BLOG.md +307 -0
- modules/iatp/paper/PAPER.md +236 -0
- modules/iatp/paper/RFC_SUBMISSION.md +299 -0
- modules/iatp/paper/whitepaper.md +369 -0
- modules/iatp/proto/README.md +200 -0
- modules/iatp/proto/generate_stubs.py +81 -0
- modules/iatp/proto/iatp.proto +552 -0
- modules/iatp/pyproject.toml +180 -0
- modules/iatp/requirements-dev.txt +2 -0
- modules/iatp/requirements.txt +6 -0
- modules/iatp/setup.py +60 -0
- modules/iatp/sidecar/README.md +487 -0
- modules/iatp/sidecar/go/Dockerfile +32 -0
- modules/iatp/sidecar/go/README.md +237 -0
- modules/iatp/sidecar/go/go.mod +8 -0
- modules/iatp/sidecar/go/main.go +488 -0
- modules/iatp/spec/001-handshake.md +436 -0
- modules/iatp/spec/002-reversibility.md +394 -0
- modules/iatp/spec/schema/capability_manifest.json +266 -0
- modules/iatp/test_integration.py +310 -0
- modules/mcp-kernel-server/README.md +261 -0
- modules/mcp-kernel-server/pyproject.toml +60 -0
- modules/mcp-kernel-server/src/mcp_kernel_server/__init__.py +26 -0
- modules/mcp-kernel-server/src/mcp_kernel_server/cli.py +229 -0
- modules/mcp-kernel-server/src/mcp_kernel_server/resources.py +215 -0
- modules/mcp-kernel-server/src/mcp_kernel_server/server.py +562 -0
- modules/mcp-kernel-server/src/mcp_kernel_server/tools.py +1172 -0
- modules/mute-agent/.github/workflows/safety_check.yml +45 -0
- modules/mute-agent/.gitignore +53 -0
- modules/mute-agent/ARCHITECTURE.md +531 -0
- modules/mute-agent/BENCHMARK_GUIDE.md +384 -0
- modules/mute-agent/COMPLETION_SUMMARY.md +293 -0
- modules/mute-agent/EXPERIMENT_SUMMARY.md +318 -0
- modules/mute-agent/IMPLEMENTATION_SUMMARY.md +212 -0
- modules/mute-agent/LICENSE +21 -0
- modules/mute-agent/PHASE3_SUMMARY.md +297 -0
- modules/mute-agent/README.md +360 -0
- modules/mute-agent/STEEL_MAN_RESULTS.md +353 -0
- modules/mute-agent/USAGE.md +505 -0
- modules/mute-agent/V2_IMPLEMENTATION_SUMMARY.md +253 -0
- modules/mute-agent/V2_STEEL_MAN_IMPLEMENTATION.md +274 -0
- modules/mute-agent/VERIFICATION_REPORT.md +435 -0
- modules/mute-agent/charts/cost_comparison.png +0 -0
- modules/mute-agent/charts/cost_vs_ambiguity.png +0 -0
- modules/mute-agent/charts/metrics_comparison.png +0 -0
- modules/mute-agent/charts/scenario_breakdown.png +0 -0
- modules/mute-agent/charts/trace_attack_blocked.html +140 -0
- modules/mute-agent/charts/trace_attack_blocked.png +0 -0
- modules/mute-agent/charts/trace_failure.html +140 -0
- modules/mute-agent/charts/trace_failure.png +0 -0
- modules/mute-agent/charts/trace_success.html +140 -0
- modules/mute-agent/charts/trace_success.png +0 -0
- modules/mute-agent/examples/__init__.py +1 -0
- modules/mute-agent/examples/advanced_example.py +384 -0
- modules/mute-agent/examples/graph_debugger_demo.py +241 -0
- modules/mute-agent/examples/listener_example.py +297 -0
- modules/mute-agent/examples/simple_example.py +242 -0
- modules/mute-agent/examples/steel_man_demo.py +297 -0
- modules/mute-agent/experiments/README.md +135 -0
- modules/mute-agent/experiments/__init__.py +3 -0
- modules/mute-agent/experiments/agent_comparison.csv +6 -0
- modules/mute-agent/experiments/agent_comparison_50runs.csv +6 -0
- modules/mute-agent/experiments/ambiguity_test.py +335 -0
- modules/mute-agent/experiments/ambiguity_test_results.csv +31 -0
- modules/mute-agent/experiments/ambiguity_test_results_50runs.csv +51 -0
- modules/mute-agent/experiments/baseline_agent.py +189 -0
- modules/mute-agent/experiments/benchmark.py +402 -0
- modules/mute-agent/experiments/demo.py +172 -0
- modules/mute-agent/experiments/generate_cost_curve.py +474 -0
- modules/mute-agent/experiments/jailbreak_test.py +137 -0
- modules/mute-agent/experiments/latent_state_scenario.py +361 -0
- modules/mute-agent/experiments/mute_agent_experiment.py +349 -0
- modules/mute-agent/experiments/run_extended_experiment.py +40 -0
- modules/mute-agent/experiments/run_v2_experiments.py +266 -0
- modules/mute-agent/experiments/run_v2_experiments_auto.py +247 -0
- modules/mute-agent/experiments/v2_scenarios/README.md +214 -0
- modules/mute-agent/experiments/v2_scenarios/__init__.py +4 -0
- modules/mute-agent/experiments/v2_scenarios/scenario_1_deep_dependency.py +325 -0
- modules/mute-agent/experiments/v2_scenarios/scenario_2_adversarial.py +328 -0
- modules/mute-agent/experiments/v2_scenarios/scenario_3_false_positive.py +303 -0
- modules/mute-agent/experiments/v2_scenarios/scenario_4_performance.py +319 -0
- modules/mute-agent/experiments/visualize.py +400 -0
- modules/mute-agent/mute_agent/__init__.py +66 -0
- modules/mute-agent/mute_agent/core/__init__.py +1 -0
- modules/mute-agent/mute_agent/core/execution_agent.py +164 -0
- modules/mute-agent/mute_agent/core/handshake_protocol.py +199 -0
- modules/mute-agent/mute_agent/core/reasoning_agent.py +236 -0
- modules/mute-agent/mute_agent/knowledge_graph/__init__.py +1 -0
- modules/mute-agent/mute_agent/knowledge_graph/graph_elements.py +63 -0
- modules/mute-agent/mute_agent/knowledge_graph/multidimensional_graph.py +168 -0
- modules/mute-agent/mute_agent/knowledge_graph/subgraph.py +222 -0
- modules/mute-agent/mute_agent/listener/__init__.py +41 -0
- modules/mute-agent/mute_agent/listener/adapters/__init__.py +29 -0
- modules/mute-agent/mute_agent/listener/adapters/base_adapter.py +187 -0
- modules/mute-agent/mute_agent/listener/adapters/caas_adapter.py +342 -0
- modules/mute-agent/mute_agent/listener/adapters/control_plane_adapter.py +434 -0
- modules/mute-agent/mute_agent/listener/adapters/iatp_adapter.py +330 -0
- modules/mute-agent/mute_agent/listener/adapters/scak_adapter.py +249 -0
- modules/mute-agent/mute_agent/listener/listener.py +608 -0
- modules/mute-agent/mute_agent/listener/state_observer.py +434 -0
- modules/mute-agent/mute_agent/listener/threshold_config.py +311 -0
- modules/mute-agent/mute_agent/super_system/__init__.py +1 -0
- modules/mute-agent/mute_agent/super_system/router.py +202 -0
- modules/mute-agent/mute_agent/visualization/__init__.py +8 -0
- modules/mute-agent/mute_agent/visualization/graph_debugger.py +495 -0
- modules/mute-agent/requirements-dev.txt +6 -0
- modules/mute-agent/requirements.txt +9 -0
- modules/mute-agent/setup.py +64 -0
- modules/mute-agent/src/__init__.py +0 -0
- modules/mute-agent/src/agents/__init__.py +0 -0
- modules/mute-agent/src/agents/baseline_agent.py +524 -0
- modules/mute-agent/src/agents/interactive_agent.py +113 -0
- modules/mute-agent/src/agents/mute_agent.py +622 -0
- modules/mute-agent/src/benchmarks/__init__.py +0 -0
- modules/mute-agent/src/benchmarks/evaluator.py +481 -0
- modules/mute-agent/src/benchmarks/scenarios.json +985 -0
- modules/mute-agent/src/core/__init__.py +0 -0
- modules/mute-agent/src/core/mock_state.py +320 -0
- modules/mute-agent/src/core/tools.py +441 -0
- modules/nexus/__init__.py +49 -0
- modules/nexus/arbiter.py +357 -0
- modules/nexus/client.py +464 -0
- modules/nexus/dmz.py +417 -0
- modules/nexus/escrow.py +428 -0
- modules/nexus/exceptions.py +284 -0
- modules/nexus/registry.py +391 -0
- modules/nexus/reputation.py +423 -0
- modules/nexus/schemas/__init__.py +49 -0
- modules/nexus/schemas/compliance.py +274 -0
- modules/nexus/schemas/escrow.py +249 -0
- modules/nexus/schemas/manifest.py +223 -0
- modules/nexus/schemas/receipt.py +206 -0
- modules/observability/README.md +192 -0
- modules/observability/alertmanager/alertmanager.yml +116 -0
- modules/observability/alerts/agent-os-alerts.yaml +197 -0
- modules/observability/docker-compose.yml +128 -0
- modules/observability/grafana/dashboards/agent-os-amb.json +448 -0
- modules/observability/grafana/dashboards/agent-os-cmvk.json +441 -0
- modules/observability/grafana/dashboards/agent-os-overview.json +268 -0
- modules/observability/grafana/dashboards/agent-os-performance.json +15 -0
- modules/observability/grafana/dashboards/agent-os-safety.json +50 -0
- modules/observability/grafana/provisioning/dashboards/dashboards.yml +15 -0
- modules/observability/grafana/provisioning/datasources/datasources.yml +33 -0
- modules/observability/otel/otel-collector-config.yml +61 -0
- modules/observability/prometheus/prometheus.yml +63 -0
- modules/observability/pyproject.toml +53 -0
- modules/observability/scripts/export_dashboards.py +55 -0
- modules/observability/src/agent_os_observability/__init__.py +25 -0
- modules/observability/src/agent_os_observability/dashboards.py +896 -0
- modules/observability/src/agent_os_observability/metrics.py +396 -0
- modules/observability/src/agent_os_observability/server.py +221 -0
- modules/observability/src/agent_os_observability/tracer.py +226 -0
- modules/primitives/.gitignore +8 -0
- modules/primitives/README.md +62 -0
- modules/primitives/agent_primitives/__init__.py +22 -0
- modules/primitives/agent_primitives/failures.py +82 -0
- modules/primitives/agent_primitives/py.typed +0 -0
- modules/primitives/pyproject.toml +68 -0
- modules/scak/.github/copilot-instructions.md +396 -0
- modules/scak/.github/workflows/release.yml +117 -0
- modules/scak/.gitignore +32 -0
- modules/scak/CHANGELOG.md +173 -0
- modules/scak/CITATION.cff +62 -0
- modules/scak/CONTRIBUTING.md +429 -0
- modules/scak/Dockerfile +58 -0
- modules/scak/ENTERPRISE_FEATURES.md +518 -0
- modules/scak/IMPLEMENTATION_SUMMARY.md +206 -0
- modules/scak/LIMITATIONS.md +565 -0
- modules/scak/MANIFEST.in +16 -0
- modules/scak/NOVELTY.md +535 -0
- modules/scak/README.md +928 -0
- modules/scak/RESEARCH.md +670 -0
- modules/scak/agent_kernel/__init__.py +66 -0
- modules/scak/agent_kernel/analyzer.py +432 -0
- modules/scak/agent_kernel/auditor.py +31 -0
- modules/scak/agent_kernel/completeness_auditor.py +234 -0
- modules/scak/agent_kernel/detector.py +200 -0
- modules/scak/agent_kernel/kernel.py +741 -0
- modules/scak/agent_kernel/memory_manager.py +82 -0
- modules/scak/agent_kernel/models.py +372 -0
- modules/scak/agent_kernel/nudge_mechanism.py +260 -0
- modules/scak/agent_kernel/outcome_analyzer.py +335 -0
- modules/scak/agent_kernel/patcher.py +579 -0
- modules/scak/agent_kernel/semantic_analyzer.py +313 -0
- modules/scak/agent_kernel/semantic_purge.py +346 -0
- modules/scak/agent_kernel/simulator.py +447 -0
- modules/scak/agent_kernel/teacher.py +82 -0
- modules/scak/agent_kernel/triage.py +149 -0
- modules/scak/build_and_publish.ps1 +74 -0
- modules/scak/build_and_publish.sh +74 -0
- modules/scak/cli.py +471 -0
- modules/scak/dashboard.py +462 -0
- modules/scak/datasets/DATASET_CARD.md +219 -0
- modules/scak/datasets/README.md +143 -0
- modules/scak/datasets/gaia_vague_queries/vague_queries.json +262 -0
- modules/scak/datasets/hf_upload/README.md +219 -0
- modules/scak/datasets/hf_upload/scak_gaia_laziness.jsonl +50 -0
- modules/scak/datasets/prepare_hf_datasets.py +145 -0
- modules/scak/datasets/red_team/jailbreak_patterns.json +202 -0
- modules/scak/docker-compose.yml +99 -0
- modules/scak/docs/Adaptive-Memory-Hierarchy.md +319 -0
- modules/scak/docs/Data-Contracts-and-Schemas.md +285 -0
- modules/scak/docs/Dual-Loop-Architecture.md +344 -0
- modules/scak/docs/Enhanced-Features.md +612 -0
- modules/scak/docs/LANGCHAIN_INTEGRATION.md +572 -0
- modules/scak/docs/README.md +128 -0
- modules/scak/docs/Reference-Implementations.md +163 -0
- modules/scak/docs/SCAK_V2.md +374 -0
- modules/scak/docs/Three-Failure-Types.md +178 -0
- modules/scak/examples/basic_example.py +155 -0
- modules/scak/examples/circuit_breaker_lazy_eval_demo.py +243 -0
- modules/scak/examples/langchain_integration_example.py +339 -0
- modules/scak/examples/layer4_demo.py +243 -0
- modules/scak/examples/production_features_demo.py +353 -0
- modules/scak/examples/quick_demo.py +79 -0
- modules/scak/examples/scak_v2_demo.py +252 -0
- modules/scak/experiments/README.md +438 -0
- modules/scak/experiments/ablation_studies/README.md +192 -0
- modules/scak/experiments/ablation_studies/ablation_no_audit.py +116 -0
- modules/scak/experiments/ablation_studies/ablation_no_purge.py +133 -0
- modules/scak/experiments/chaos_engineering/README.md +332 -0
- modules/scak/experiments/context_efficiency_test.py +328 -0
- modules/scak/experiments/gaia_benchmark/README.md +208 -0
- modules/scak/experiments/laziness_benchmark.py +179 -0
- modules/scak/experiments/long_horizon_task_experiment.py +252 -0
- modules/scak/experiments/multi_agent_rag_experiment.py +284 -0
- modules/scak/experiments/results/ablation_table.md +12 -0
- modules/scak/experiments/results/long_horizon.json +36 -0
- modules/scak/experiments/results/multi_agent_rag.json +66 -0
- modules/scak/experiments/run_comprehensive_ablations.py +332 -0
- modules/scak/experiments/test_auditor_patcher_integration.py +251 -0
- modules/scak/notebooks/getting_started.ipynb +33 -0
- modules/scak/paper/ARXIV_SUBMISSION_METADATA.txt +109 -0
- modules/scak/paper/PAPER_CHECKLIST.md +304 -0
- modules/scak/paper/Paper.pdf +0 -0
- modules/scak/paper/README.md +113 -0
- modules/scak/paper/appendix.md +351 -0
- modules/scak/paper/arxiv/bibliography.bib +284 -0
- modules/scak/paper/arxiv/fig1_ooda_architecture.pdf +0 -0
- modules/scak/paper/arxiv/fig2_memory_hierarchy.pdf +0 -0
- modules/scak/paper/arxiv/fig3_gaia_results.pdf +0 -0
- modules/scak/paper/arxiv/fig4_ablation_heatmap.pdf +0 -0
- modules/scak/paper/arxiv/fig5_context_reduction.pdf +0 -0
- modules/scak/paper/arxiv/fig6_mttr_boxplot.pdf +0 -0
- modules/scak/paper/arxiv/main.aux +103 -0
- modules/scak/paper/arxiv/main.bbl +113 -0
- modules/scak/paper/arxiv/main.blg +55 -0
- modules/scak/paper/arxiv/main.out +31 -0
- modules/scak/paper/arxiv/main.pdf +0 -0
- modules/scak/paper/arxiv/main.tex +482 -0
- modules/scak/paper/arxiv_submission/bibliography.bib +284 -0
- modules/scak/paper/arxiv_submission/fig1_ooda_architecture.pdf +0 -0
- modules/scak/paper/arxiv_submission/fig2_memory_hierarchy.pdf +0 -0
- modules/scak/paper/arxiv_submission/fig3_gaia_results.pdf +0 -0
- modules/scak/paper/arxiv_submission/fig4_ablation_heatmap.pdf +0 -0
- modules/scak/paper/arxiv_submission/fig5_context_reduction.pdf +0 -0
- modules/scak/paper/arxiv_submission/fig6_mttr_boxplot.pdf +0 -0
- modules/scak/paper/arxiv_submission/main.aux +103 -0
- modules/scak/paper/arxiv_submission/main.bbl +113 -0
- modules/scak/paper/arxiv_submission/main.blg +55 -0
- modules/scak/paper/arxiv_submission/main.out +31 -0
- modules/scak/paper/arxiv_submission/main.pdf +0 -0
- modules/scak/paper/arxiv_submission/main.tex +482 -0
- modules/scak/paper/arxiv_submission.tar.gz +0 -0
- modules/scak/paper/bibliography.bib +284 -0
- modules/scak/paper/build.sh +55 -0
- modules/scak/paper/figures/README.md +32 -0
- modules/scak/paper/figures/fig1_ooda_architecture.md +75 -0
- modules/scak/paper/figures/fig1_ooda_architecture.pdf +0 -0
- modules/scak/paper/figures/fig1_ooda_architecture.png +0 -0
- modules/scak/paper/figures/fig2_memory_hierarchy.md +83 -0
- modules/scak/paper/figures/fig2_memory_hierarchy.pdf +0 -0
- modules/scak/paper/figures/fig2_memory_hierarchy.png +0 -0
- modules/scak/paper/figures/fig3_gaia_results.md +64 -0
- modules/scak/paper/figures/fig3_gaia_results.pdf +0 -0
- modules/scak/paper/figures/fig3_gaia_results.png +0 -0
- modules/scak/paper/figures/fig4_ablation_heatmap.md +64 -0
- modules/scak/paper/figures/fig4_ablation_heatmap.pdf +0 -0
- modules/scak/paper/figures/fig4_ablation_heatmap.png +0 -0
- modules/scak/paper/figures/fig5_context_reduction.md +71 -0
- modules/scak/paper/figures/fig5_context_reduction.pdf +0 -0
- modules/scak/paper/figures/fig5_context_reduction.png +0 -0
- modules/scak/paper/figures/fig6_mttr_boxplot.md +80 -0
- modules/scak/paper/figures/fig6_mttr_boxplot.pdf +0 -0
- modules/scak/paper/figures/fig6_mttr_boxplot.png +0 -0
- modules/scak/paper/figures/generate_figures.py +463 -0
- modules/scak/paper/main.aux +103 -0
- modules/scak/paper/main.bbl +113 -0
- modules/scak/paper/main.blg +55 -0
- modules/scak/paper/main.md +192 -0
- modules/scak/paper/main.out +31 -0
- modules/scak/paper/main.pdf +0 -0
- modules/scak/paper/main.tex +482 -0
- modules/scak/reproducibility/ABLATIONS.md +225 -0
- modules/scak/reproducibility/Dockerfile.reproducibility +34 -0
- modules/scak/reproducibility/README.md +421 -0
- modules/scak/reproducibility/requirements-pinned.txt +32 -0
- modules/scak/reproducibility/run_all_experiments.py +395 -0
- modules/scak/reproducibility/seed_control.py +53 -0
- modules/scak/reproducibility/statistical_analysis.py +302 -0
- modules/scak/requirements.txt +50 -0
- modules/scak/setup.py +93 -0
- modules/scak/src/__init__.py +124 -0
- modules/scak/src/agents/__init__.py +13 -0
- modules/scak/src/agents/conflict_resolution.py +732 -0
- modules/scak/src/agents/orchestrator.py +761 -0
- modules/scak/src/agents/pubsub.py +484 -0
- modules/scak/src/agents/shadow_teacher.py +344 -0
- modules/scak/src/agents/swarm.py +661 -0
- modules/scak/src/agents/worker.py +357 -0
- modules/scak/src/integrations/__init__.py +81 -0
- modules/scak/src/integrations/cmvk_adapter.py +430 -0
- modules/scak/src/integrations/control_plane_adapter.py +601 -0
- modules/scak/src/integrations/langchain_integration.py +902 -0
- modules/scak/src/interfaces/__init__.py +59 -0
- modules/scak/src/interfaces/llm_clients.py +505 -0
- modules/scak/src/interfaces/openapi_tools.py +611 -0
- modules/scak/src/interfaces/plugin_system.py +605 -0
- modules/scak/src/interfaces/protocols.py +365 -0
- modules/scak/src/interfaces/telemetry.py +464 -0
- modules/scak/src/interfaces/tool_registry.py +547 -0
- modules/scak/src/kernel/__init__.py +100 -0
- modules/scak/src/kernel/auditor.py +305 -0
- modules/scak/src/kernel/circuit_breaker.py +398 -0
- modules/scak/src/kernel/core.py +724 -0
- modules/scak/src/kernel/distributed.py +667 -0
- modules/scak/src/kernel/evolution.py +455 -0
- modules/scak/src/kernel/failover.py +621 -0
- modules/scak/src/kernel/governance.py +710 -0
- modules/scak/src/kernel/governance_v2.py +603 -0
- modules/scak/src/kernel/lazy_evaluator.py +514 -0
- modules/scak/src/kernel/load_testing.py +633 -0
- modules/scak/src/kernel/memory.py +945 -0
- modules/scak/src/kernel/patcher.py +581 -0
- modules/scak/src/kernel/rubric.py +419 -0
- modules/scak/src/kernel/schemas.py +390 -0
- modules/scak/src/kernel/skill_mapper.py +309 -0
- modules/scak/src/kernel/triage.py +149 -0
- modules/scak/src/mocks/__init__.py +99 -0
- modules/scak/tests/__init__.py +1 -0
- modules/scak/tests/test_circuit_breaker.py +403 -0
- modules/scak/tests/test_conflict_resolution.py +287 -0
- modules/scak/tests/test_dual_loop.py +463 -0
- modules/scak/tests/test_enhanced_features.py +421 -0
- modules/scak/tests/test_failover_and_load.py +438 -0
- modules/scak/tests/test_governance.py +185 -0
- modules/scak/tests/test_kernel.py +359 -0
- modules/scak/tests/test_langchain_integration.py +451 -0
- modules/scak/tests/test_lazy_evaluator.py +465 -0
- modules/scak/tests/test_llm_clients.py +122 -0
- modules/scak/tests/test_memory_controller.py +528 -0
- modules/scak/tests/test_orchestrator.py +181 -0
- modules/scak/tests/test_phase3_integration.py +265 -0
- modules/scak/tests/test_pubsub_swarm.py +203 -0
- modules/scak/tests/test_reference_implementations.py +240 -0
- modules/scak/tests/test_rubric.py +363 -0
- modules/scak/tests/test_scak_v2.py +651 -0
- modules/scak/tests/test_skill_mapper.py +217 -0
- modules/scak/tests/test_specific_failures.py +393 -0
- modules/scak/tests/test_tool_registry.py +264 -0
- modules/scak/tests/test_tools_and_plugins.py +303 -0
- modules/scak/tests/test_triage.py +596 -0
- modules/scak/tests/test_write_through.py +319 -0
- agent_os_kernel-1.1.0.dist-info/METADATA +0 -400
- agent_os_kernel-1.1.0.dist-info/RECORD +0 -12
- {agent_os_kernel-1.1.0.dist-info → agent_os_kernel-1.2.0.dist-info}/WHEEL +0 -0
- {agent_os_kernel-1.1.0.dist-info → agent_os_kernel-1.2.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,945 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Memory - Adaptive Memory Hierarchy & Semantic Purge.
|
|
3
|
+
|
|
4
|
+
This module implements the "Adaptive Memory Hierarchy" with deterministic three-tier
|
|
5
|
+
storage, replacing probabilistic RAG-based memory with systematic routing based on
|
|
6
|
+
criticality and frequency.
|
|
7
|
+
|
|
8
|
+
The Three Tiers:
|
|
9
|
+
1. Tier 1 (Kernel): Safety-critical rules in system_prompt (zero latency)
|
|
10
|
+
2. Tier 2 (Skill Cache): Tool-specific rules injected conditionally (low latency)
|
|
11
|
+
3. Tier 3 (Archive): Long-tail wisdom retrieved via semantic search (high latency)
|
|
12
|
+
|
|
13
|
+
Key Components:
|
|
14
|
+
1. MemoryController: Routes lessons to appropriate tier and constructs dynamic context
|
|
15
|
+
2. Promotion/Demotion: Hot Tier 3 lessons promoted to Tier 2, cold Tier 1 demoted
|
|
16
|
+
3. Patch Classifier: Type A vs Type B classification for Semantic Purge
|
|
17
|
+
4. Semantic Purge: Model upgrade triggered cleanup ("Scale by Subtraction")
|
|
18
|
+
|
|
19
|
+
Promotion Logic:
|
|
20
|
+
- Tier 3 → Tier 2: Retrieved > 5 times in 24 hours (hot path optimization)
|
|
21
|
+
|
|
22
|
+
Demotion Logic:
|
|
23
|
+
- Tier 1 → Tier 2: No triggers in 30 days (keep kernel lean)
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
import logging
|
|
27
|
+
from enum import Enum
|
|
28
|
+
from typing import List, Dict, Optional
|
|
29
|
+
from datetime import datetime, timedelta
|
|
30
|
+
from collections import Counter
|
|
31
|
+
import json
|
|
32
|
+
import re
|
|
33
|
+
|
|
34
|
+
logger = logging.getLogger(__name__)
|
|
35
|
+
|
|
36
|
+
# Import models from agent_kernel for backward compatibility
|
|
37
|
+
import sys
|
|
38
|
+
import os
|
|
39
|
+
|
|
40
|
+
# Add parent directory to path for imports
|
|
41
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../..'))
|
|
42
|
+
|
|
43
|
+
from agent_kernel.models import (
|
|
44
|
+
CorrectionPatch, ClassifiedPatch, PatchDecayType,
|
|
45
|
+
CognitiveGlitch, CompletenessAudit
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
# Import from local schemas
|
|
49
|
+
from src.kernel.schemas import Lesson, PatchRequest, MemoryTier
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class MockRedisCache:
|
|
53
|
+
"""
|
|
54
|
+
Mock Redis cache for Tier 2 (Skill Cache).
|
|
55
|
+
In production, replace with actual Redis client.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
def __init__(self):
|
|
59
|
+
self.store: Dict[str, List[str]] = {}
|
|
60
|
+
|
|
61
|
+
def rpush(self, key: str, value: str) -> None:
|
|
62
|
+
"""Append value to list."""
|
|
63
|
+
if key not in self.store:
|
|
64
|
+
self.store[key] = []
|
|
65
|
+
self.store[key].append(value)
|
|
66
|
+
|
|
67
|
+
def lrange(self, key: str, start: int, end: int) -> List[Dict]:
|
|
68
|
+
"""Get list range."""
|
|
69
|
+
if key not in self.store:
|
|
70
|
+
return []
|
|
71
|
+
items = self.store[key][start:end+1] if end >= 0 else self.store[key][start:]
|
|
72
|
+
return [json.loads(item) for item in items]
|
|
73
|
+
|
|
74
|
+
def incr(self, key: str) -> int:
|
|
75
|
+
"""Increment counter."""
|
|
76
|
+
if key not in self.store:
|
|
77
|
+
self.store[key] = ["0"]
|
|
78
|
+
count = int(self.store[key][0]) + 1
|
|
79
|
+
self.store[key] = [str(count)]
|
|
80
|
+
return count
|
|
81
|
+
|
|
82
|
+
def get(self, key: str) -> Optional[str]:
|
|
83
|
+
"""Get value."""
|
|
84
|
+
if key not in self.store:
|
|
85
|
+
return None
|
|
86
|
+
return self.store[key][0] if self.store[key] else None
|
|
87
|
+
|
|
88
|
+
def delete(self, key: str) -> None:
|
|
89
|
+
"""Delete key."""
|
|
90
|
+
if key in self.store:
|
|
91
|
+
del self.store[key]
|
|
92
|
+
|
|
93
|
+
def clear(self) -> None:
|
|
94
|
+
"""Clear all keys from cache."""
|
|
95
|
+
self.store.clear()
|
|
96
|
+
|
|
97
|
+
def keys(self, pattern: Optional[str] = None) -> List[str]:
|
|
98
|
+
"""
|
|
99
|
+
Get all keys, optionally filtered by pattern.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
pattern: Optional pattern to filter keys (e.g., "skill:*")
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
List of matching keys
|
|
106
|
+
"""
|
|
107
|
+
if pattern is None:
|
|
108
|
+
return list(self.store.keys())
|
|
109
|
+
|
|
110
|
+
# Simple pattern matching (only supports "*" wildcard)
|
|
111
|
+
if pattern.endswith("*"):
|
|
112
|
+
prefix = pattern[:-1]
|
|
113
|
+
return [k for k in self.store.keys() if k.startswith(prefix)]
|
|
114
|
+
|
|
115
|
+
return [k for k in self.store.keys() if k == pattern]
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class MockVectorStore:
|
|
119
|
+
"""
|
|
120
|
+
Mock Vector DB for Tier 3 (Archive).
|
|
121
|
+
In production, replace with Chroma/Pinecone/etc.
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
def __init__(self):
|
|
125
|
+
self.documents: List[Dict] = []
|
|
126
|
+
|
|
127
|
+
def add(self, documents: List[str], metadatas: List[Dict], ids: List[str]) -> None:
|
|
128
|
+
"""Add documents to vector store."""
|
|
129
|
+
for doc, meta, doc_id in zip(documents, metadatas, ids):
|
|
130
|
+
self.documents.append({
|
|
131
|
+
"id": doc_id,
|
|
132
|
+
"text": doc,
|
|
133
|
+
"metadata": meta
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
def similarity_search(self, query: str, k: int = 2) -> List[Dict]:
|
|
137
|
+
"""
|
|
138
|
+
Mock similarity search using simple keyword matching.
|
|
139
|
+
In production, this would use embeddings and vector similarity.
|
|
140
|
+
"""
|
|
141
|
+
query_lower = query.lower()
|
|
142
|
+
scores = []
|
|
143
|
+
|
|
144
|
+
for doc in self.documents:
|
|
145
|
+
# Simple scoring: count matching words
|
|
146
|
+
doc_text = doc["text"].lower()
|
|
147
|
+
query_words = set(query_lower.split())
|
|
148
|
+
doc_words = set(doc_text.split())
|
|
149
|
+
score = len(query_words & doc_words)
|
|
150
|
+
|
|
151
|
+
if score > 0:
|
|
152
|
+
scores.append((score, doc))
|
|
153
|
+
|
|
154
|
+
# Sort by score and return top k
|
|
155
|
+
scores.sort(reverse=True, key=lambda x: x[0])
|
|
156
|
+
return [{"page_content": doc["text"], "metadata": doc["metadata"]}
|
|
157
|
+
for _, doc in scores[:k]]
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
class MemoryController:
|
|
161
|
+
"""
|
|
162
|
+
The systematic router for the Adaptive Memory Hierarchy.
|
|
163
|
+
|
|
164
|
+
This implements deterministic tiering based on criticality and frequency,
|
|
165
|
+
replacing probabilistic RAG-based approaches with systematic rules.
|
|
166
|
+
|
|
167
|
+
Architecture:
|
|
168
|
+
- Tier 1 (Kernel): Safety-critical rules always in system_prompt
|
|
169
|
+
- Tier 2 (Skill Cache): Tool-specific rules injected conditionally
|
|
170
|
+
- Tier 3 (Archive): Long-tail wisdom retrieved on-demand
|
|
171
|
+
|
|
172
|
+
Responsibilities:
|
|
173
|
+
1. Route new lessons to appropriate tier
|
|
174
|
+
2. Inject context dynamically based on active tools
|
|
175
|
+
3. Track retrieval frequency for promotion
|
|
176
|
+
4. Track usage for demotion (keeping Kernel lean)
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
def __init__(self, vector_store=None, redis_cache=None):
|
|
180
|
+
"""
|
|
181
|
+
Initialize MemoryController with storage backends.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
vector_store: Vector DB for Tier 3 (defaults to mock)
|
|
185
|
+
redis_cache: Redis cache for Tier 2 (defaults to mock)
|
|
186
|
+
"""
|
|
187
|
+
self.vector_store = vector_store or MockVectorStore()
|
|
188
|
+
self.redis_cache = redis_cache or MockRedisCache()
|
|
189
|
+
|
|
190
|
+
# Tier 1 is loaded from config/code at startup
|
|
191
|
+
self.kernel_rules: List[Lesson] = []
|
|
192
|
+
|
|
193
|
+
# Tracking for promotion/demotion
|
|
194
|
+
self.retrieval_window = timedelta(hours=24)
|
|
195
|
+
self.promotion_threshold = 5 # 5 retrievals in 24h
|
|
196
|
+
self.demotion_window = timedelta(days=30)
|
|
197
|
+
|
|
198
|
+
logger.info("MemoryController initialized with 3-tier architecture")
|
|
199
|
+
|
|
200
|
+
def route_lesson(self, patch: PatchRequest) -> MemoryTier:
|
|
201
|
+
"""
|
|
202
|
+
The systematic logic to decide where a new lesson goes.
|
|
203
|
+
|
|
204
|
+
This is the core of "Deterministic Tiering" - no guesswork, just rules:
|
|
205
|
+
1. Security/Safety → Tier 1 (Kernel)
|
|
206
|
+
2. Tool-specific syntax → Tier 2 (Skill Cache)
|
|
207
|
+
3. Business logic/edge cases → Tier 3 (Archive)
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
patch: The patch request containing the lesson to route
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
MemoryTier: The tier where this lesson should be stored
|
|
214
|
+
"""
|
|
215
|
+
lesson = patch.proposed_lesson
|
|
216
|
+
|
|
217
|
+
# 1. Critical Safety → Tier 1 (Kernel)
|
|
218
|
+
# These must ALWAYS be active (e.g., "Never delete root")
|
|
219
|
+
if lesson.lesson_type == "security":
|
|
220
|
+
logger.info(f"Routing lesson to Tier 1 (security): {lesson.rule_text[:50]}")
|
|
221
|
+
return MemoryTier.TIER_1_KERNEL
|
|
222
|
+
|
|
223
|
+
if patch.diagnosis and "critical" in patch.diagnosis.lower():
|
|
224
|
+
logger.info(f"Routing lesson to Tier 1 (critical failure): {lesson.rule_text[:50]}")
|
|
225
|
+
return MemoryTier.TIER_1_KERNEL
|
|
226
|
+
|
|
227
|
+
# 2. Tool-Specific Syntax → Tier 2 (Skill Cache)
|
|
228
|
+
# Pattern: "tool:sql_query" or "when using <tool>"
|
|
229
|
+
if self._is_tool_specific(lesson):
|
|
230
|
+
tool_name = self._extract_tool_name(lesson.trigger_pattern)
|
|
231
|
+
logger.info(f"Routing lesson to Tier 2 (tool: {tool_name}): {lesson.rule_text[:50]}")
|
|
232
|
+
return MemoryTier.TIER_2_SKILL_CACHE
|
|
233
|
+
|
|
234
|
+
# 3. Everything else (Business logic, edge cases) → Tier 3 (Archive)
|
|
235
|
+
logger.info(f"Routing lesson to Tier 3 (archive): {lesson.rule_text[:50]}")
|
|
236
|
+
return MemoryTier.TIER_3_ARCHIVE
|
|
237
|
+
|
|
238
|
+
def _is_tool_specific(self, lesson: Lesson) -> bool:
|
|
239
|
+
"""Check if lesson is tool-specific."""
|
|
240
|
+
trigger = lesson.trigger_pattern.lower()
|
|
241
|
+
rule = lesson.rule_text.lower()
|
|
242
|
+
|
|
243
|
+
# Explicit tool prefix
|
|
244
|
+
if "tool:" in trigger:
|
|
245
|
+
return True
|
|
246
|
+
|
|
247
|
+
# Common tool-related patterns
|
|
248
|
+
tool_indicators = [
|
|
249
|
+
"when using", "with tool", "for tool",
|
|
250
|
+
"sql", "query", "database", "api call",
|
|
251
|
+
"file operation", "http request"
|
|
252
|
+
]
|
|
253
|
+
|
|
254
|
+
return any(indicator in trigger or indicator in rule
|
|
255
|
+
for indicator in tool_indicators)
|
|
256
|
+
|
|
257
|
+
def _extract_tool_name(self, trigger_pattern: str) -> str:
|
|
258
|
+
"""
|
|
259
|
+
Extract tool name from trigger pattern.
|
|
260
|
+
|
|
261
|
+
Examples:
|
|
262
|
+
- "tool:sql_query" → "sql_query"
|
|
263
|
+
- "when using file_reader" → "file_reader"
|
|
264
|
+
"""
|
|
265
|
+
# Check for explicit "tool:" prefix
|
|
266
|
+
match = re.search(r'tool:(\w+)', trigger_pattern.lower())
|
|
267
|
+
if match:
|
|
268
|
+
return match.group(1)
|
|
269
|
+
|
|
270
|
+
# Check for "when using <tool>" pattern
|
|
271
|
+
match = re.search(r'when using (\w+)', trigger_pattern.lower())
|
|
272
|
+
if match:
|
|
273
|
+
return match.group(1)
|
|
274
|
+
|
|
275
|
+
# Check for common tool names
|
|
276
|
+
common_tools = ["sql", "api", "file", "http", "database"]
|
|
277
|
+
for tool in common_tools:
|
|
278
|
+
if tool in trigger_pattern.lower():
|
|
279
|
+
return tool
|
|
280
|
+
|
|
281
|
+
return "general"
|
|
282
|
+
|
|
283
|
+
def commit_lesson(self, patch: PatchRequest) -> Dict[str, str]:
|
|
284
|
+
"""
|
|
285
|
+
Commit a lesson using Write-Through Architecture.
|
|
286
|
+
|
|
287
|
+
The Write-Through Pattern:
|
|
288
|
+
1. ALWAYS write to Vector DB (Tier 3) - Permanent storage (Truth)
|
|
289
|
+
2. CONDITIONALLY write to Redis (Tier 2) - Hot cache (Speed)
|
|
290
|
+
3. CONDITIONALLY add to Kernel (Tier 1) - Always-active rules
|
|
291
|
+
|
|
292
|
+
This ensures we never "lose" knowledge even if Redis crashes.
|
|
293
|
+
The tier tag in Vector DB determines active tier, but data always
|
|
294
|
+
exists in the permanent store.
|
|
295
|
+
|
|
296
|
+
Args:
|
|
297
|
+
patch: The patch request containing the lesson
|
|
298
|
+
|
|
299
|
+
Returns:
|
|
300
|
+
dict: Status information about the commit
|
|
301
|
+
"""
|
|
302
|
+
tier = self.route_lesson(patch)
|
|
303
|
+
lesson = patch.proposed_lesson
|
|
304
|
+
|
|
305
|
+
# Update lesson metadata
|
|
306
|
+
lesson.tier = tier
|
|
307
|
+
lesson.created_at = datetime.now()
|
|
308
|
+
|
|
309
|
+
logger.info(f"💾 Write-Through: Committing '{lesson.rule_text[:50]}...' to {tier.value}")
|
|
310
|
+
|
|
311
|
+
# STEP 1: Always write to Vector DB (permanent storage)
|
|
312
|
+
self.vector_store.add(
|
|
313
|
+
documents=[lesson.rule_text],
|
|
314
|
+
metadatas=[{
|
|
315
|
+
**lesson.model_dump(),
|
|
316
|
+
"active_tier": tier.value # Tag for tier tracking
|
|
317
|
+
}],
|
|
318
|
+
ids=[lesson.id]
|
|
319
|
+
)
|
|
320
|
+
logger.debug(f" ✓ Written to Vector DB (permanent) with active_tier={tier.value}")
|
|
321
|
+
|
|
322
|
+
# STEP 2: Conditionally add to tier-specific storage
|
|
323
|
+
if tier == MemoryTier.TIER_1_KERNEL:
|
|
324
|
+
# Append to kernel rules (in production, write to system_prompt file)
|
|
325
|
+
self.kernel_rules.append(lesson)
|
|
326
|
+
logger.debug(f" ✓ Added to Kernel (always active)")
|
|
327
|
+
return {
|
|
328
|
+
"status": "committed",
|
|
329
|
+
"tier": tier.value,
|
|
330
|
+
"location": "kernel+vector_db",
|
|
331
|
+
"write_through": True
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
elif tier == MemoryTier.TIER_2_SKILL_CACHE:
|
|
335
|
+
# Write to Redis cache for fast access
|
|
336
|
+
tool_name = self._extract_tool_name(lesson.trigger_pattern)
|
|
337
|
+
self.redis_cache.rpush(f"skill:{tool_name}", lesson.model_dump_json())
|
|
338
|
+
logger.debug(f" ✓ Written to Redis cache (tool: {tool_name})")
|
|
339
|
+
return {
|
|
340
|
+
"status": "committed",
|
|
341
|
+
"tier": tier.value,
|
|
342
|
+
"tool": tool_name,
|
|
343
|
+
"location": "redis+vector_db",
|
|
344
|
+
"write_through": True
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
elif tier == MemoryTier.TIER_3_ARCHIVE:
|
|
348
|
+
# Already in Vector DB, no additional storage needed
|
|
349
|
+
logger.debug(f" ✓ Archive-only (Vector DB)")
|
|
350
|
+
return {
|
|
351
|
+
"status": "committed",
|
|
352
|
+
"tier": tier.value,
|
|
353
|
+
"location": "vector_db",
|
|
354
|
+
"write_through": True
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
return {"status": "error", "message": "Unknown tier"}
|
|
358
|
+
|
|
359
|
+
def retrieve_context(
|
|
360
|
+
self,
|
|
361
|
+
current_task: str,
|
|
362
|
+
active_tools: List[str]
|
|
363
|
+
) -> str:
|
|
364
|
+
"""
|
|
365
|
+
Constructs the Dynamic System Prompt using the three-tier hierarchy.
|
|
366
|
+
|
|
367
|
+
This is the "injection efficiency" mechanism that keeps context minimal:
|
|
368
|
+
- Always includes Tier 1 (Kernel) rules
|
|
369
|
+
- Conditionally injects Tier 2 rules (only for active tools)
|
|
370
|
+
- Retrieves Tier 3 rules on-demand (semantic search)
|
|
371
|
+
|
|
372
|
+
Args:
|
|
373
|
+
current_task: The current user task/prompt
|
|
374
|
+
active_tools: List of tools the agent has access to
|
|
375
|
+
|
|
376
|
+
Returns:
|
|
377
|
+
str: The constructed context block to inject into system prompt
|
|
378
|
+
"""
|
|
379
|
+
context_block = []
|
|
380
|
+
|
|
381
|
+
# 1. Always add Kernel Rules (Tier 1)
|
|
382
|
+
# These are safety-critical and must always be active
|
|
383
|
+
if self.kernel_rules:
|
|
384
|
+
context_block.append("=== CRITICAL SAFETY RULES ===")
|
|
385
|
+
for rule in self.kernel_rules:
|
|
386
|
+
context_block.append(f"- {rule.rule_text}")
|
|
387
|
+
context_block.append("")
|
|
388
|
+
|
|
389
|
+
# 2. Inject Skill Rules (Tier 2) - ONLY for active tools
|
|
390
|
+
# This is the key optimization: SQL rules only when SQL is available
|
|
391
|
+
for tool in active_tools:
|
|
392
|
+
cached_lessons = self.redis_cache.lrange(f"skill:{tool}", 0, -1)
|
|
393
|
+
if cached_lessons:
|
|
394
|
+
context_block.append(f"=== Guidelines for {tool.upper()} ===")
|
|
395
|
+
for lesson_dict in cached_lessons:
|
|
396
|
+
context_block.append(f"- {lesson_dict['rule_text']}")
|
|
397
|
+
context_block.append("")
|
|
398
|
+
|
|
399
|
+
# 3. RAG Search (Tier 3) - Only if task is complex
|
|
400
|
+
# Only retrieve if the prompt suggests complexity or ambiguity
|
|
401
|
+
if len(current_task.split()) > 5: # Simple heuristic
|
|
402
|
+
relevant_docs = self.vector_store.similarity_search(current_task, k=2)
|
|
403
|
+
if relevant_docs:
|
|
404
|
+
context_block.append("=== Relevant Past Lessons ===")
|
|
405
|
+
for doc in relevant_docs:
|
|
406
|
+
context_block.append(f"- {doc['page_content']}")
|
|
407
|
+
# Track retrieval for promotion logic
|
|
408
|
+
self._track_retrieval(doc['metadata']['id'])
|
|
409
|
+
context_block.append("")
|
|
410
|
+
|
|
411
|
+
return "\n".join(context_block)
|
|
412
|
+
|
|
413
|
+
def _track_retrieval(self, lesson_id: str) -> None:
|
|
414
|
+
"""
|
|
415
|
+
Track retrieval count for promotion logic.
|
|
416
|
+
|
|
417
|
+
If a Tier 3 lesson is retrieved > 5 times in 24 hours,
|
|
418
|
+
it should be promoted to Tier 2 (hot path optimization).
|
|
419
|
+
"""
|
|
420
|
+
key = f"retrieval:{lesson_id}"
|
|
421
|
+
count = self.redis_cache.incr(key)
|
|
422
|
+
|
|
423
|
+
logger.debug(f"Tracked retrieval for lesson {lesson_id}: {count} times")
|
|
424
|
+
|
|
425
|
+
# Check if promotion threshold reached
|
|
426
|
+
if count >= self.promotion_threshold:
|
|
427
|
+
logger.info(f"🔥 Lesson {lesson_id} is HOT ({count} retrievals) - candidate for promotion")
|
|
428
|
+
|
|
429
|
+
def promote_hot_lessons(self) -> Dict[str, int]:
|
|
430
|
+
"""
|
|
431
|
+
Promote frequently retrieved Tier 3 lessons to Tier 2.
|
|
432
|
+
|
|
433
|
+
This is the "hot path optimization" - lessons that are retrieved
|
|
434
|
+
often enough should be moved to the skill cache for faster access.
|
|
435
|
+
|
|
436
|
+
Returns:
|
|
437
|
+
dict: Statistics about promotions
|
|
438
|
+
"""
|
|
439
|
+
# In production, this would scan retrieval counters
|
|
440
|
+
# For now, this is a placeholder
|
|
441
|
+
logger.info("🚀 Scanning for hot Tier 3 lessons to promote...")
|
|
442
|
+
return {"promoted_count": 0}
|
|
443
|
+
|
|
444
|
+
def demote_cold_kernel_rules(self) -> Dict[str, int]:
|
|
445
|
+
"""
|
|
446
|
+
Demote Tier 1 rules that haven't triggered in 30 days.
|
|
447
|
+
|
|
448
|
+
This keeps the Kernel lean - only truly critical rules stay in Tier 1.
|
|
449
|
+
Rules that aren't being used can be demoted to Tier 2.
|
|
450
|
+
|
|
451
|
+
Returns:
|
|
452
|
+
dict: Statistics about demotions
|
|
453
|
+
"""
|
|
454
|
+
now = datetime.now()
|
|
455
|
+
demoted = 0
|
|
456
|
+
|
|
457
|
+
for rule in self.kernel_rules[:]: # Copy list to avoid modification during iteration
|
|
458
|
+
# Check if rule has triggered recently
|
|
459
|
+
if rule.last_triggered_at is None:
|
|
460
|
+
# Never triggered - candidate for demotion
|
|
461
|
+
if (now - rule.created_at) > self.demotion_window:
|
|
462
|
+
logger.info(f"❄️ Demoting cold Tier 1 rule: {rule.rule_text[:50]}")
|
|
463
|
+
self.kernel_rules.remove(rule)
|
|
464
|
+
demoted += 1
|
|
465
|
+
elif (now - rule.last_triggered_at) > self.demotion_window:
|
|
466
|
+
logger.info(f"❄️ Demoting cold Tier 1 rule: {rule.rule_text[:50]}")
|
|
467
|
+
self.kernel_rules.remove(rule)
|
|
468
|
+
demoted += 1
|
|
469
|
+
|
|
470
|
+
logger.info(f"Demoted {demoted} cold Tier 1 rules")
|
|
471
|
+
return {"demoted_count": demoted}
|
|
472
|
+
|
|
473
|
+
def evict_from_cache(self, unused_days: int = 30) -> Dict[str, int]:
|
|
474
|
+
"""
|
|
475
|
+
Evict lessons from Redis cache that haven't been used in N days.
|
|
476
|
+
|
|
477
|
+
This implements the "Safe Demotion" pattern:
|
|
478
|
+
1. Delete from Redis (cache)
|
|
479
|
+
2. Update active_tier tag in Vector DB to 'archive'
|
|
480
|
+
3. Lesson remains retrievable via semantic search
|
|
481
|
+
|
|
482
|
+
The Rule: We never "move" data. We just change the tier tag.
|
|
483
|
+
If Redis crashes, we rebuild it from Vector DB. If we need the
|
|
484
|
+
lesson later, RAG finds it in the archive.
|
|
485
|
+
|
|
486
|
+
Args:
|
|
487
|
+
unused_days: Number of days without usage before eviction (default: 30)
|
|
488
|
+
|
|
489
|
+
Returns:
|
|
490
|
+
dict: Statistics about evictions
|
|
491
|
+
"""
|
|
492
|
+
logger.info(f"🧹 Evicting unused cache entries (threshold: {unused_days} days)")
|
|
493
|
+
|
|
494
|
+
cutoff_date = datetime.now() - timedelta(days=unused_days)
|
|
495
|
+
evicted = 0
|
|
496
|
+
|
|
497
|
+
# Scan all skill cache keys
|
|
498
|
+
# In production, this would iterate over all Redis keys with pattern "skill:*"
|
|
499
|
+
keys_to_check = []
|
|
500
|
+
if hasattr(self.redis_cache, 'keys'):
|
|
501
|
+
keys_to_check = self.redis_cache.keys('skill:*')
|
|
502
|
+
elif hasattr(self.redis_cache, 'store'):
|
|
503
|
+
keys_to_check = [k for k in self.redis_cache.store.keys() if k.startswith('skill:')]
|
|
504
|
+
|
|
505
|
+
for key in keys_to_check:
|
|
506
|
+
lessons = self.redis_cache.lrange(key, 0, -1)
|
|
507
|
+
updated_lessons = []
|
|
508
|
+
|
|
509
|
+
for lesson_dict in lessons:
|
|
510
|
+
# Check last retrieval time
|
|
511
|
+
last_retrieved = lesson_dict.get('last_retrieved_at')
|
|
512
|
+
|
|
513
|
+
if last_retrieved:
|
|
514
|
+
last_retrieved_dt = self._parse_datetime(last_retrieved)
|
|
515
|
+
|
|
516
|
+
if last_retrieved_dt and last_retrieved_dt < cutoff_date:
|
|
517
|
+
# Evict this lesson
|
|
518
|
+
lesson_id = lesson_dict.get('id')
|
|
519
|
+
logger.debug(f" ❄️ Evicting lesson {lesson_id} from {key}")
|
|
520
|
+
evicted += 1
|
|
521
|
+
|
|
522
|
+
# Update tier tag in Vector DB (safe demotion)
|
|
523
|
+
self._update_tier_tag_in_vector_db(lesson_id, MemoryTier.TIER_3_ARCHIVE)
|
|
524
|
+
else:
|
|
525
|
+
# Keep this lesson
|
|
526
|
+
updated_lessons.append(lesson_dict)
|
|
527
|
+
else:
|
|
528
|
+
# No retrieval time - keep it for now
|
|
529
|
+
updated_lessons.append(lesson_dict)
|
|
530
|
+
|
|
531
|
+
# Update the cache with filtered lessons
|
|
532
|
+
if len(updated_lessons) < len(lessons):
|
|
533
|
+
# Re-populate the key with remaining lessons
|
|
534
|
+
self.redis_cache.delete(key)
|
|
535
|
+
for lesson_dict in updated_lessons:
|
|
536
|
+
self.redis_cache.rpush(key, json.dumps(lesson_dict))
|
|
537
|
+
|
|
538
|
+
logger.info(f"✨ Evicted {evicted} cold cache entries")
|
|
539
|
+
return {"evicted_count": evicted, "threshold_days": unused_days}
|
|
540
|
+
|
|
541
|
+
def _parse_datetime(self, value) -> Optional[datetime]:
|
|
542
|
+
"""
|
|
543
|
+
Parse datetime from various formats.
|
|
544
|
+
|
|
545
|
+
Args:
|
|
546
|
+
value: Value to parse (datetime object or ISO string)
|
|
547
|
+
|
|
548
|
+
Returns:
|
|
549
|
+
Optional[datetime]: Parsed datetime or None if parsing fails
|
|
550
|
+
"""
|
|
551
|
+
if isinstance(value, datetime):
|
|
552
|
+
return value
|
|
553
|
+
if isinstance(value, str):
|
|
554
|
+
try:
|
|
555
|
+
return datetime.fromisoformat(value)
|
|
556
|
+
except (ValueError, TypeError):
|
|
557
|
+
return None
|
|
558
|
+
return None
|
|
559
|
+
|
|
560
|
+
def _update_tier_tag_in_vector_db(self, lesson_id: str, new_tier: MemoryTier) -> None:
|
|
561
|
+
"""
|
|
562
|
+
Update the active_tier tag in Vector DB.
|
|
563
|
+
|
|
564
|
+
This is the "safe demotion" mechanism - we don't delete data,
|
|
565
|
+
we just update its tier classification.
|
|
566
|
+
|
|
567
|
+
Args:
|
|
568
|
+
lesson_id: The lesson ID to update
|
|
569
|
+
new_tier: The new tier to assign
|
|
570
|
+
"""
|
|
571
|
+
# In production, this would update the metadata in the vector DB
|
|
572
|
+
# For the mock implementation, we'll update the document metadata
|
|
573
|
+
if hasattr(self.vector_store, 'documents'):
|
|
574
|
+
for doc in self.vector_store.documents:
|
|
575
|
+
if doc['id'] == lesson_id:
|
|
576
|
+
doc['metadata']['active_tier'] = new_tier.value
|
|
577
|
+
logger.debug(f" 📝 Updated {lesson_id} tier tag to {new_tier.value}")
|
|
578
|
+
break
|
|
579
|
+
|
|
580
|
+
def rebuild_cache_from_db(self) -> Dict[str, int]:
|
|
581
|
+
"""
|
|
582
|
+
Rebuild Redis cache from Vector DB.
|
|
583
|
+
|
|
584
|
+
This is the disaster recovery mechanism. If Redis crashes or
|
|
585
|
+
is flushed, we can rebuild the Tier 2 cache from the permanent
|
|
586
|
+
Vector DB storage.
|
|
587
|
+
|
|
588
|
+
Process:
|
|
589
|
+
1. Query Vector DB for all lessons with active_tier='skill_cache'
|
|
590
|
+
2. Group by tool name
|
|
591
|
+
3. Repopulate Redis
|
|
592
|
+
|
|
593
|
+
Returns:
|
|
594
|
+
dict: Statistics about rebuild
|
|
595
|
+
"""
|
|
596
|
+
logger.info("🔄 Rebuilding cache from Vector DB...")
|
|
597
|
+
|
|
598
|
+
rebuilt_count = 0
|
|
599
|
+
tools_rebuilt = set()
|
|
600
|
+
|
|
601
|
+
# Query Vector DB for Tier 2 lessons
|
|
602
|
+
if hasattr(self.vector_store, 'documents'):
|
|
603
|
+
tier2_docs = [
|
|
604
|
+
doc for doc in self.vector_store.documents
|
|
605
|
+
if doc['metadata'].get('active_tier') == MemoryTier.TIER_2_SKILL_CACHE.value
|
|
606
|
+
]
|
|
607
|
+
|
|
608
|
+
# Group by tool
|
|
609
|
+
tools: Dict[str, List[Dict]] = {}
|
|
610
|
+
for doc in tier2_docs:
|
|
611
|
+
# Extract tool from trigger_pattern
|
|
612
|
+
trigger = doc['metadata'].get('trigger_pattern', '')
|
|
613
|
+
tool_name = self._extract_tool_name(trigger)
|
|
614
|
+
|
|
615
|
+
if tool_name not in tools:
|
|
616
|
+
tools[tool_name] = []
|
|
617
|
+
tools[tool_name].append(doc['metadata'])
|
|
618
|
+
|
|
619
|
+
# Repopulate Redis
|
|
620
|
+
for tool_name, lessons in tools.items():
|
|
621
|
+
# Clear existing cache for this tool
|
|
622
|
+
self.redis_cache.delete(f"skill:{tool_name}")
|
|
623
|
+
|
|
624
|
+
# Add all lessons
|
|
625
|
+
for lesson_meta in lessons:
|
|
626
|
+
# Convert datetime objects to ISO format strings for JSON serialization
|
|
627
|
+
serialized_meta = self._serialize_metadata(lesson_meta)
|
|
628
|
+
self.redis_cache.rpush(
|
|
629
|
+
f"skill:{tool_name}",
|
|
630
|
+
json.dumps(serialized_meta)
|
|
631
|
+
)
|
|
632
|
+
rebuilt_count += 1
|
|
633
|
+
|
|
634
|
+
tools_rebuilt.add(tool_name)
|
|
635
|
+
logger.debug(f" ✓ Rebuilt {len(lessons)} lessons for tool: {tool_name}")
|
|
636
|
+
|
|
637
|
+
logger.info(f"✨ Cache rebuilt: {rebuilt_count} lessons across {len(tools_rebuilt)} tools")
|
|
638
|
+
return {
|
|
639
|
+
"rebuilt_count": rebuilt_count,
|
|
640
|
+
"tools_rebuilt": len(tools_rebuilt),
|
|
641
|
+
"tool_list": list(tools_rebuilt)
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
def _serialize_metadata(self, metadata: Dict) -> Dict:
|
|
645
|
+
"""
|
|
646
|
+
Serialize metadata for JSON storage, converting datetime to ISO format.
|
|
647
|
+
|
|
648
|
+
Args:
|
|
649
|
+
metadata: The metadata dictionary to serialize
|
|
650
|
+
|
|
651
|
+
Returns:
|
|
652
|
+
dict: Serialized metadata with datetime objects converted to strings
|
|
653
|
+
"""
|
|
654
|
+
serialized = {}
|
|
655
|
+
for key, value in metadata.items():
|
|
656
|
+
if isinstance(value, datetime):
|
|
657
|
+
serialized[key] = value.isoformat()
|
|
658
|
+
elif isinstance(value, dict):
|
|
659
|
+
serialized[key] = self._serialize_metadata(value)
|
|
660
|
+
elif isinstance(value, list):
|
|
661
|
+
serialized[key] = [
|
|
662
|
+
self._serialize_metadata(item) if isinstance(item, dict) else item
|
|
663
|
+
for item in value
|
|
664
|
+
]
|
|
665
|
+
else:
|
|
666
|
+
serialized[key] = value
|
|
667
|
+
return serialized
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
class LessonType(Enum):
|
|
671
|
+
"""Types of lessons for lifecycle management."""
|
|
672
|
+
SYNTAX = "syntax" # Expire on model upgrade (e.g. "Output JSON")
|
|
673
|
+
BUSINESS = "business" # Never expire (e.g. "Fiscal year starts Oct")
|
|
674
|
+
ONE_OFF = "one_off" # Delete immediately (Transient error)
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
class MemoryManager:
|
|
678
|
+
"""
|
|
679
|
+
Lesson lifecycle manager implementing Semantic Purge.
|
|
680
|
+
|
|
681
|
+
This is the simplified reference implementation showing the core concept
|
|
682
|
+
of tagging lessons by type so syntax lessons can be deleted on model upgrades.
|
|
683
|
+
"""
|
|
684
|
+
|
|
685
|
+
def __init__(self):
|
|
686
|
+
self.vector_store = [] # Simplified in-memory storage
|
|
687
|
+
|
|
688
|
+
def add_lesson(self, lesson_text: str, lesson_type: LessonType, model_version: str = "gpt-4-0125"):
|
|
689
|
+
"""
|
|
690
|
+
Add a lesson with lifecycle metadata.
|
|
691
|
+
|
|
692
|
+
Args:
|
|
693
|
+
lesson_text: The lesson content
|
|
694
|
+
lesson_type: Type of lesson (SYNTAX, BUSINESS, or ONE_OFF)
|
|
695
|
+
model_version: Model version when lesson was created
|
|
696
|
+
"""
|
|
697
|
+
entry = {
|
|
698
|
+
"text": lesson_text,
|
|
699
|
+
"type": lesson_type,
|
|
700
|
+
"model_version": model_version,
|
|
701
|
+
"created_at": datetime.now()
|
|
702
|
+
}
|
|
703
|
+
self.vector_store.append(entry)
|
|
704
|
+
|
|
705
|
+
def run_upgrade_purge(self, new_model_version: str) -> dict:
|
|
706
|
+
"""
|
|
707
|
+
Called when you switch from GPT-4 to GPT-5.
|
|
708
|
+
Deletes all 'SYNTAX' lessons (Type A patches).
|
|
709
|
+
|
|
710
|
+
This is "Scale by Subtraction" - removing complexity, not adding it.
|
|
711
|
+
|
|
712
|
+
Args:
|
|
713
|
+
new_model_version: The new model version
|
|
714
|
+
|
|
715
|
+
Returns:
|
|
716
|
+
dict: Statistics about the purge
|
|
717
|
+
"""
|
|
718
|
+
# Filter out SYNTAX lessons
|
|
719
|
+
original_count = len(self.vector_store)
|
|
720
|
+
self.vector_store = [
|
|
721
|
+
entry for entry in self.vector_store
|
|
722
|
+
if entry["type"] != LessonType.SYNTAX
|
|
723
|
+
]
|
|
724
|
+
purged_count = original_count - len(self.vector_store)
|
|
725
|
+
|
|
726
|
+
logger.info(f"🗑️ Semantic Purge: {purged_count} Type A lessons removed on upgrade to {new_model_version}")
|
|
727
|
+
|
|
728
|
+
return {
|
|
729
|
+
"purged_count": purged_count,
|
|
730
|
+
"retained_count": len(self.vector_store),
|
|
731
|
+
"new_model_version": new_model_version,
|
|
732
|
+
"reduction_percentage": (purged_count / original_count * 100) if original_count > 0 else 0
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
def get_lessons_by_type(self, lesson_type: LessonType) -> List[dict]:
|
|
736
|
+
"""
|
|
737
|
+
Get all lessons of a specific type.
|
|
738
|
+
|
|
739
|
+
Args:
|
|
740
|
+
lesson_type: The type of lessons to retrieve
|
|
741
|
+
|
|
742
|
+
Returns:
|
|
743
|
+
list: Lessons matching the type
|
|
744
|
+
"""
|
|
745
|
+
return [
|
|
746
|
+
entry for entry in self.vector_store
|
|
747
|
+
if entry["type"] == lesson_type
|
|
748
|
+
]
|
|
749
|
+
|
|
750
|
+
def get_lesson_count(self) -> dict:
|
|
751
|
+
"""Get count of lessons by type."""
|
|
752
|
+
type_counts = Counter(entry["type"] for entry in self.vector_store)
|
|
753
|
+
return dict(type_counts)
|
|
754
|
+
|
|
755
|
+
|
|
756
|
+
class PatchClassifier:
|
|
757
|
+
"""
|
|
758
|
+
Classifies patches into Type A (Syntax) vs Type B (Business).
|
|
759
|
+
|
|
760
|
+
This is the "Taxonomy of Lessons" that determines lifecycle.
|
|
761
|
+
Production-grade classifier with sophisticated heuristics.
|
|
762
|
+
"""
|
|
763
|
+
|
|
764
|
+
def __init__(self):
|
|
765
|
+
self.syntax_indicators = [
|
|
766
|
+
"output json", "format", "syntax", "parse", "validation error",
|
|
767
|
+
"type mismatch", "parameter type", "limit 10", "use uuid",
|
|
768
|
+
"tool definition", "schema injection", "parameter checking",
|
|
769
|
+
"encoding", "serialization", "casting"
|
|
770
|
+
]
|
|
771
|
+
|
|
772
|
+
self.business_indicators = [
|
|
773
|
+
"fiscal year", "project", "entity", "business rule", "policy",
|
|
774
|
+
"archived", "deprecated", "does not exist", "negative constraint",
|
|
775
|
+
"company", "organization", "domain", "customer", "workflow",
|
|
776
|
+
"regulation", "compliance", "privacy"
|
|
777
|
+
]
|
|
778
|
+
|
|
779
|
+
def classify_patch(
|
|
780
|
+
self,
|
|
781
|
+
patch: CorrectionPatch,
|
|
782
|
+
current_model_version: str
|
|
783
|
+
) -> ClassifiedPatch:
|
|
784
|
+
"""
|
|
785
|
+
Classify a patch as Type A or Type B.
|
|
786
|
+
|
|
787
|
+
Args:
|
|
788
|
+
patch: The correction patch to classify
|
|
789
|
+
current_model_version: Current model version (e.g., "gpt-4o", "gpt-5")
|
|
790
|
+
|
|
791
|
+
Returns:
|
|
792
|
+
ClassifiedPatch with decay type and metadata
|
|
793
|
+
"""
|
|
794
|
+
logger.info(f"Classifying patch {patch.patch_id}")
|
|
795
|
+
|
|
796
|
+
# Analyze patch content to determine type
|
|
797
|
+
decay_type = self._determine_decay_type(patch)
|
|
798
|
+
|
|
799
|
+
# Determine if should purge on upgrade
|
|
800
|
+
should_purge = (decay_type == PatchDecayType.SYNTAX_CAPABILITY)
|
|
801
|
+
|
|
802
|
+
# Build metadata
|
|
803
|
+
metadata = self._build_decay_metadata(patch, decay_type)
|
|
804
|
+
|
|
805
|
+
classified = ClassifiedPatch(
|
|
806
|
+
base_patch=patch,
|
|
807
|
+
decay_type=decay_type,
|
|
808
|
+
created_at_model_version=current_model_version,
|
|
809
|
+
decay_metadata=metadata,
|
|
810
|
+
should_purge_on_upgrade=should_purge
|
|
811
|
+
)
|
|
812
|
+
|
|
813
|
+
logger.info(f"Classified as {decay_type.value} (purge on upgrade: {should_purge})")
|
|
814
|
+
|
|
815
|
+
return classified
|
|
816
|
+
|
|
817
|
+
def _determine_decay_type(self, patch: CorrectionPatch) -> PatchDecayType:
|
|
818
|
+
"""
|
|
819
|
+
Determine if patch is Type A (Syntax) or Type B (Business).
|
|
820
|
+
|
|
821
|
+
Type A - Syntax/Capability (HIGH DECAY):
|
|
822
|
+
- Model-specific issues (JSON formatting, type errors)
|
|
823
|
+
- Tool usage errors (wrong parameter types)
|
|
824
|
+
- Syntax errors, validation issues
|
|
825
|
+
- These are likely fixed in newer model versions
|
|
826
|
+
|
|
827
|
+
Type B - Business/Context (ZERO DECAY):
|
|
828
|
+
- Company-specific rules ("Fiscal year starts in July")
|
|
829
|
+
- Entity existence ("Project_Alpha is deprecated")
|
|
830
|
+
- Policy violations (medical advice restrictions)
|
|
831
|
+
- These are world truths that models can't learn
|
|
832
|
+
"""
|
|
833
|
+
# Check diagnosis first (most reliable indicator)
|
|
834
|
+
if patch.diagnosis:
|
|
835
|
+
glitch = patch.diagnosis.cognitive_glitch
|
|
836
|
+
|
|
837
|
+
# Tool misuse is almost always Type A
|
|
838
|
+
if glitch == CognitiveGlitch.TOOL_MISUSE:
|
|
839
|
+
return PatchDecayType.SYNTAX_CAPABILITY
|
|
840
|
+
|
|
841
|
+
# Policy violations are Type B
|
|
842
|
+
if glitch == CognitiveGlitch.POLICY_VIOLATION:
|
|
843
|
+
return PatchDecayType.BUSINESS_CONTEXT
|
|
844
|
+
|
|
845
|
+
# Hallucinations about entities are Type B
|
|
846
|
+
if glitch == CognitiveGlitch.HALLUCINATION:
|
|
847
|
+
return PatchDecayType.BUSINESS_CONTEXT
|
|
848
|
+
|
|
849
|
+
# Analyze patch content
|
|
850
|
+
content_str = str(patch.patch_content).lower()
|
|
851
|
+
|
|
852
|
+
# Count indicators
|
|
853
|
+
syntax_score = sum(1 for ind in self.syntax_indicators if ind in content_str)
|
|
854
|
+
business_score = sum(1 for ind in self.business_indicators if ind in content_str)
|
|
855
|
+
|
|
856
|
+
# Decide based on scores
|
|
857
|
+
if business_score > syntax_score:
|
|
858
|
+
return PatchDecayType.BUSINESS_CONTEXT
|
|
859
|
+
elif syntax_score > 0:
|
|
860
|
+
return PatchDecayType.SYNTAX_CAPABILITY
|
|
861
|
+
else:
|
|
862
|
+
# Default to business context if uncertain
|
|
863
|
+
return PatchDecayType.BUSINESS_CONTEXT
|
|
864
|
+
|
|
865
|
+
def _build_decay_metadata(self, patch: CorrectionPatch, decay_type: PatchDecayType) -> dict:
|
|
866
|
+
"""Build metadata for patch lifecycle tracking."""
|
|
867
|
+
return {
|
|
868
|
+
"decay_type": decay_type.value,
|
|
869
|
+
"created_at": datetime.now().isoformat(),
|
|
870
|
+
"failure_type": patch.failure_type.value if hasattr(patch.failure_type, 'value') else str(patch.failure_type),
|
|
871
|
+
"cognitive_glitch": patch.diagnosis.cognitive_glitch.value if patch.diagnosis else None,
|
|
872
|
+
"estimated_tokens": len(str(patch.patch_content).split()) * 1.3 # Rough estimate
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
class SemanticPurge:
|
|
877
|
+
"""
|
|
878
|
+
Orchestrates the Semantic Purge process on model upgrades.
|
|
879
|
+
|
|
880
|
+
This is the "Scale by Subtraction" engine that prevents unbounded growth.
|
|
881
|
+
"""
|
|
882
|
+
|
|
883
|
+
def __init__(self):
|
|
884
|
+
self.classifier = PatchClassifier()
|
|
885
|
+
self.memory_manager = MemoryManager()
|
|
886
|
+
self.purge_history: List[dict] = []
|
|
887
|
+
|
|
888
|
+
def execute_purge(
|
|
889
|
+
self,
|
|
890
|
+
patches: List[CorrectionPatch],
|
|
891
|
+
old_model_version: str,
|
|
892
|
+
new_model_version: str
|
|
893
|
+
) -> dict:
|
|
894
|
+
"""
|
|
895
|
+
Execute semantic purge on model upgrade.
|
|
896
|
+
|
|
897
|
+
Args:
|
|
898
|
+
patches: List of patches to evaluate
|
|
899
|
+
old_model_version: Current model version
|
|
900
|
+
new_model_version: Upgraded model version
|
|
901
|
+
|
|
902
|
+
Returns:
|
|
903
|
+
dict: Purge statistics
|
|
904
|
+
"""
|
|
905
|
+
logger.info(f"🔄 Starting Semantic Purge: {old_model_version} → {new_model_version}")
|
|
906
|
+
|
|
907
|
+
# Classify all patches
|
|
908
|
+
classified_patches = [
|
|
909
|
+
self.classifier.classify_patch(p, old_model_version)
|
|
910
|
+
for p in patches
|
|
911
|
+
]
|
|
912
|
+
|
|
913
|
+
# Separate purgeable (Type A) from permanent (Type B)
|
|
914
|
+
purgeable = [p for p in classified_patches if p.should_purge_on_upgrade]
|
|
915
|
+
permanent = [p for p in classified_patches if not p.should_purge_on_upgrade]
|
|
916
|
+
|
|
917
|
+
# Calculate token savings
|
|
918
|
+
tokens_reclaimed = sum(
|
|
919
|
+
p.decay_metadata.get("estimated_tokens", 0)
|
|
920
|
+
for p in purgeable
|
|
921
|
+
)
|
|
922
|
+
|
|
923
|
+
stats = {
|
|
924
|
+
"old_model_version": old_model_version,
|
|
925
|
+
"new_model_version": new_model_version,
|
|
926
|
+
"total_patches": len(patches),
|
|
927
|
+
"purged_count": len(purgeable),
|
|
928
|
+
"retained_count": len(permanent),
|
|
929
|
+
"tokens_reclaimed": int(tokens_reclaimed),
|
|
930
|
+
"reduction_percentage": (len(purgeable) / len(patches) * 100) if patches else 0
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
self.purge_history.append({
|
|
934
|
+
"timestamp": datetime.now(),
|
|
935
|
+
"stats": stats
|
|
936
|
+
})
|
|
937
|
+
|
|
938
|
+
logger.info(f"✨ Purge complete: {stats['purged_count']} Type A patches removed ({stats['reduction_percentage']:.1f}%)")
|
|
939
|
+
logger.info(f"💾 Tokens reclaimed: {stats['tokens_reclaimed']}")
|
|
940
|
+
|
|
941
|
+
return stats
|
|
942
|
+
|
|
943
|
+
def get_purge_history(self) -> List[dict]:
|
|
944
|
+
"""Get history of purge operations."""
|
|
945
|
+
return self.purge_history
|