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,902 @@
|
|
|
1
|
+
"""
|
|
2
|
+
LangChain Integration for Self-Correcting Agent Kernel (SCAK).
|
|
3
|
+
|
|
4
|
+
This module provides three core components for integrating SCAK with LangChain:
|
|
5
|
+
1. SCAKMemory: Memory adapter for SCAK's 3-Tier memory hierarchy
|
|
6
|
+
2. SCAKCallbackHandler: Background auditor for laziness detection
|
|
7
|
+
3. SelfCorrectingRunnable: Runtime guard for failure handling
|
|
8
|
+
|
|
9
|
+
Architecture follows SCAK's Dual-Loop pattern:
|
|
10
|
+
- Loop 1 (Runtime Safety): SelfCorrectingRunnable + FailureTriage
|
|
11
|
+
- Loop 2 (Quality/Efficiency): SCAKCallbackHandler + CompletenessAuditor
|
|
12
|
+
|
|
13
|
+
All implementations follow SCAK principles:
|
|
14
|
+
- Type safety with Pydantic models
|
|
15
|
+
- Async-first design
|
|
16
|
+
- Structured telemetry (no print statements)
|
|
17
|
+
- Scale by subtraction
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import logging
|
|
21
|
+
import asyncio
|
|
22
|
+
from typing import Dict, Any, List, Optional, Union
|
|
23
|
+
from datetime import datetime
|
|
24
|
+
|
|
25
|
+
# Pydantic for type safety
|
|
26
|
+
from pydantic import BaseModel, Field
|
|
27
|
+
|
|
28
|
+
# LangChain imports (these are optional dependencies)
|
|
29
|
+
try:
|
|
30
|
+
from langchain.schema import BaseMemory, BaseMessage, SystemMessage, HumanMessage, AIMessage
|
|
31
|
+
from langchain.callbacks.base import BaseCallbackHandler, AsyncCallbackHandler
|
|
32
|
+
from langchain.schema.runnable import Runnable, RunnableConfig
|
|
33
|
+
from langchain.schema.agent import AgentFinish, AgentAction
|
|
34
|
+
LANGCHAIN_AVAILABLE = True
|
|
35
|
+
except ImportError:
|
|
36
|
+
LANGCHAIN_AVAILABLE = False
|
|
37
|
+
# Define minimal stubs for type hints
|
|
38
|
+
BaseMemory = object
|
|
39
|
+
BaseCallbackHandler = object
|
|
40
|
+
AsyncCallbackHandler = object
|
|
41
|
+
Runnable = object
|
|
42
|
+
RunnableConfig = object # Add stub for RunnableConfig
|
|
43
|
+
BaseMessage = object
|
|
44
|
+
SystemMessage = object
|
|
45
|
+
AIMessage = object
|
|
46
|
+
AgentFinish = object
|
|
47
|
+
|
|
48
|
+
# SCAK imports
|
|
49
|
+
from src.kernel.memory import MemoryController
|
|
50
|
+
from src.kernel.auditor import CompletenessAuditor
|
|
51
|
+
from src.kernel.triage import FailureTriage, FixStrategy
|
|
52
|
+
from src.kernel.patcher import AgentPatcher
|
|
53
|
+
from src.interfaces.telemetry import AuditLog, EventType
|
|
54
|
+
|
|
55
|
+
# Models
|
|
56
|
+
from agent_kernel.models import (
|
|
57
|
+
AgentOutcome, GiveUpSignal, OutcomeType, AgentFailure,
|
|
58
|
+
FailureType, FailureSeverity
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
logger = logging.getLogger(__name__)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# ============================================================================
|
|
65
|
+
# COMPONENT 1: SCAKMemory - The Prompt Manager
|
|
66
|
+
# ============================================================================
|
|
67
|
+
|
|
68
|
+
class SCAKMemory(BaseMemory if LANGCHAIN_AVAILABLE else object):
|
|
69
|
+
"""
|
|
70
|
+
LangChain memory adapter for SCAK's 3-Tier Memory Hierarchy.
|
|
71
|
+
|
|
72
|
+
This replaces standard buffer memory with SCAK's systematic memory routing:
|
|
73
|
+
- Tier 1 (Kernel): Safety-critical rules always in system prompt
|
|
74
|
+
- Tier 2 (Skill Cache): Tool-specific rules injected conditionally
|
|
75
|
+
- Tier 3 (Archive): Long-tail wisdom retrieved on-demand
|
|
76
|
+
|
|
77
|
+
Usage:
|
|
78
|
+
```python
|
|
79
|
+
from scak.integrations.langchain import SCAKMemory
|
|
80
|
+
|
|
81
|
+
scak_memory = SCAKMemory()
|
|
82
|
+
|
|
83
|
+
# Use in LangChain agent
|
|
84
|
+
prompt = ChatPromptTemplate.from_messages([
|
|
85
|
+
("system", "{system_patch}"),
|
|
86
|
+
("user", "{input}"),
|
|
87
|
+
("placeholder", "{agent_scratchpad}"),
|
|
88
|
+
])
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
This enables "Scale by Subtraction" - only relevant context is injected,
|
|
92
|
+
reducing latency and improving accuracy.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
# Instance attributes (initialized in __init__)
|
|
96
|
+
memory_key: str
|
|
97
|
+
system_patch_key: str
|
|
98
|
+
controller: MemoryController
|
|
99
|
+
return_messages: bool
|
|
100
|
+
chat_history: List[BaseMessage]
|
|
101
|
+
|
|
102
|
+
def __init__(
|
|
103
|
+
self,
|
|
104
|
+
memory_key: str = "history",
|
|
105
|
+
system_patch_key: str = "system_patch",
|
|
106
|
+
controller: Optional[MemoryController] = None,
|
|
107
|
+
return_messages: bool = True
|
|
108
|
+
):
|
|
109
|
+
"""
|
|
110
|
+
Initialize SCAKMemory.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
memory_key: Key for chat history in memory
|
|
114
|
+
system_patch_key: Key for system prompt patches
|
|
115
|
+
controller: MemoryController instance (creates new if None)
|
|
116
|
+
return_messages: Whether to return messages or strings
|
|
117
|
+
"""
|
|
118
|
+
if not LANGCHAIN_AVAILABLE:
|
|
119
|
+
raise ImportError(
|
|
120
|
+
"LangChain is required for SCAKMemory. "
|
|
121
|
+
"Install with: pip install langchain langchain-core"
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
self.memory_key = memory_key
|
|
125
|
+
self.system_patch_key = system_patch_key
|
|
126
|
+
self.controller = controller or MemoryController()
|
|
127
|
+
self.return_messages = return_messages
|
|
128
|
+
|
|
129
|
+
# Store chat history
|
|
130
|
+
self.chat_history: List[BaseMessage] = []
|
|
131
|
+
|
|
132
|
+
# Emit telemetry
|
|
133
|
+
AuditLog(
|
|
134
|
+
event_type=EventType.AGENT_EXECUTION,
|
|
135
|
+
agent_id="scak_memory",
|
|
136
|
+
data={
|
|
137
|
+
"action": "initialized",
|
|
138
|
+
"tiers_active": ["kernel", "skill_cache", "archive"]
|
|
139
|
+
},
|
|
140
|
+
severity="INFO"
|
|
141
|
+
).emit()
|
|
142
|
+
|
|
143
|
+
logger.info("SCAKMemory initialized with 3-tier architecture")
|
|
144
|
+
|
|
145
|
+
@property
|
|
146
|
+
def memory_variables(self) -> List[str]:
|
|
147
|
+
"""Return the list of memory variables."""
|
|
148
|
+
return [self.memory_key, self.system_patch_key]
|
|
149
|
+
|
|
150
|
+
def load_memory_variables(self, inputs: Dict[str, Any]) -> Dict[str, Any]:
|
|
151
|
+
"""
|
|
152
|
+
Load memory variables for the agent.
|
|
153
|
+
|
|
154
|
+
This is where SCAK's magic happens:
|
|
155
|
+
1. Extract current task and active tools from inputs
|
|
156
|
+
2. Call MemoryController.retrieve_context() to get dynamic context
|
|
157
|
+
3. Format as SystemMessage for LangChain
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
inputs: Input dictionary from LangChain chain
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
Dict with memory variables including system_patch and history
|
|
164
|
+
"""
|
|
165
|
+
# 1. Extract task and tools
|
|
166
|
+
current_task = inputs.get("input", "")
|
|
167
|
+
active_tools = inputs.get("tools", [])
|
|
168
|
+
|
|
169
|
+
# Handle tool objects (extract names)
|
|
170
|
+
if active_tools and hasattr(active_tools[0], "name"):
|
|
171
|
+
active_tools = [tool.name for tool in active_tools]
|
|
172
|
+
|
|
173
|
+
# 2. Retrieve dynamic context from SCAK Memory Controller
|
|
174
|
+
# This injects Tier 1 (always) + Tier 2 (conditionally) + Tier 3 (on-demand)
|
|
175
|
+
dynamic_context = self.controller.retrieve_context(
|
|
176
|
+
current_task=current_task,
|
|
177
|
+
active_tools=active_tools
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
# 3. Format as SystemMessage
|
|
181
|
+
system_patch = dynamic_context if dynamic_context else ""
|
|
182
|
+
|
|
183
|
+
# Emit telemetry
|
|
184
|
+
AuditLog(
|
|
185
|
+
event_type=EventType.AGENT_EXECUTION,
|
|
186
|
+
agent_id="scak_memory",
|
|
187
|
+
data={
|
|
188
|
+
"action": "context_loaded",
|
|
189
|
+
"task_length": len(current_task),
|
|
190
|
+
"active_tools_count": len(active_tools),
|
|
191
|
+
"context_length": len(system_patch),
|
|
192
|
+
"tiers_used": {
|
|
193
|
+
"kernel": bool(self.controller.kernel_rules),
|
|
194
|
+
"skill_cache": len(active_tools) > 0,
|
|
195
|
+
"archive": len(current_task.split()) > 5
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
severity="INFO"
|
|
199
|
+
).emit()
|
|
200
|
+
|
|
201
|
+
logger.info(
|
|
202
|
+
f"Loaded SCAK context: {len(system_patch)} chars for {len(active_tools)} tools"
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
# Return both system patch and chat history
|
|
206
|
+
result = {
|
|
207
|
+
self.system_patch_key: system_patch,
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if self.return_messages:
|
|
211
|
+
result[self.memory_key] = self.chat_history
|
|
212
|
+
else:
|
|
213
|
+
result[self.memory_key] = self._format_history_as_string()
|
|
214
|
+
|
|
215
|
+
return result
|
|
216
|
+
|
|
217
|
+
def save_context(self, inputs: Dict[str, Any], outputs: Dict[str, str]) -> None:
|
|
218
|
+
"""
|
|
219
|
+
Save context to memory.
|
|
220
|
+
|
|
221
|
+
Standard LangChain memory interface for saving conversation history.
|
|
222
|
+
|
|
223
|
+
Args:
|
|
224
|
+
inputs: Input dictionary with user message
|
|
225
|
+
outputs: Output dictionary with agent response
|
|
226
|
+
"""
|
|
227
|
+
# Save user message
|
|
228
|
+
if "input" in inputs:
|
|
229
|
+
self.chat_history.append(HumanMessage(content=inputs["input"]))
|
|
230
|
+
|
|
231
|
+
# Save agent response
|
|
232
|
+
if "output" in outputs:
|
|
233
|
+
# Determine message type based on output
|
|
234
|
+
# In LangChain, agent responses are typically in "output" key
|
|
235
|
+
self.chat_history.append(AIMessage(content=outputs["output"]))
|
|
236
|
+
|
|
237
|
+
logger.debug(f"Saved context to memory. History length: {len(self.chat_history)}")
|
|
238
|
+
|
|
239
|
+
def clear(self) -> None:
|
|
240
|
+
"""Clear chat history."""
|
|
241
|
+
self.chat_history = []
|
|
242
|
+
logger.info("Cleared SCAK memory")
|
|
243
|
+
|
|
244
|
+
def _format_history_as_string(self) -> str:
|
|
245
|
+
"""Format chat history as string."""
|
|
246
|
+
return "\n".join([f"{msg.type}: {msg.content}" for msg in self.chat_history])
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
# ============================================================================
|
|
250
|
+
# COMPONENT 2: SCAKCallbackHandler - The Lazy Auditor
|
|
251
|
+
# ============================================================================
|
|
252
|
+
|
|
253
|
+
class SCAKCallbackHandler(AsyncCallbackHandler if LANGCHAIN_AVAILABLE else object):
|
|
254
|
+
"""
|
|
255
|
+
Background auditor that checks for agent laziness.
|
|
256
|
+
|
|
257
|
+
This implements SCAK's "Alignment Loop" (Loop 2) by:
|
|
258
|
+
1. Listening to agent_finish events
|
|
259
|
+
2. Detecting "give-up signals" (cheap check)
|
|
260
|
+
3. Triggering Shadow Teacher audit (async, non-blocking)
|
|
261
|
+
|
|
262
|
+
Key Features:
|
|
263
|
+
- Async execution: Does not block agent response
|
|
264
|
+
- Differential auditing: Only audits give-up signals (5-10% of interactions)
|
|
265
|
+
- Structured telemetry: All events are logged as JSON
|
|
266
|
+
|
|
267
|
+
Usage:
|
|
268
|
+
```python
|
|
269
|
+
from scak.integrations.langchain import SCAKCallbackHandler
|
|
270
|
+
|
|
271
|
+
scak_handler = SCAKCallbackHandler()
|
|
272
|
+
|
|
273
|
+
agent_executor = AgentExecutor(
|
|
274
|
+
agent=agent,
|
|
275
|
+
tools=tools,
|
|
276
|
+
callbacks=[scak_handler] # Add SCAK monitoring
|
|
277
|
+
)
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
This enables detection of "soft failures" where the agent complies with
|
|
281
|
+
safety constraints but fails to deliver value.
|
|
282
|
+
"""
|
|
283
|
+
|
|
284
|
+
# Instance attributes (initialized in __init__)
|
|
285
|
+
auditor: CompletenessAuditor
|
|
286
|
+
agent_id: str
|
|
287
|
+
total_executions: int
|
|
288
|
+
give_up_count: int
|
|
289
|
+
audit_count: int
|
|
290
|
+
|
|
291
|
+
# Give-up signal patterns (aligned with GiveUpSignal enum)
|
|
292
|
+
GIVE_UP_PATTERNS = [
|
|
293
|
+
"no data found",
|
|
294
|
+
"cannot answer",
|
|
295
|
+
"no results",
|
|
296
|
+
"not available",
|
|
297
|
+
"insufficient info",
|
|
298
|
+
"i couldn't find",
|
|
299
|
+
"i was unable to",
|
|
300
|
+
"no information",
|
|
301
|
+
"not able to",
|
|
302
|
+
"unable to find"
|
|
303
|
+
]
|
|
304
|
+
|
|
305
|
+
def __init__(
|
|
306
|
+
self,
|
|
307
|
+
auditor: Optional[CompletenessAuditor] = None,
|
|
308
|
+
agent_id: str = "langchain_agent"
|
|
309
|
+
):
|
|
310
|
+
"""
|
|
311
|
+
Initialize SCAKCallbackHandler.
|
|
312
|
+
|
|
313
|
+
Args:
|
|
314
|
+
auditor: CompletenessAuditor instance (creates new if None)
|
|
315
|
+
agent_id: Identifier for the agent being monitored
|
|
316
|
+
"""
|
|
317
|
+
if not LANGCHAIN_AVAILABLE:
|
|
318
|
+
raise ImportError(
|
|
319
|
+
"LangChain is required for SCAKCallbackHandler. "
|
|
320
|
+
"Install with: pip install langchain langchain-core"
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
self.auditor = auditor or CompletenessAuditor()
|
|
324
|
+
self.agent_id = agent_id
|
|
325
|
+
|
|
326
|
+
# Statistics
|
|
327
|
+
self.total_executions = 0
|
|
328
|
+
self.give_up_count = 0
|
|
329
|
+
self.audit_count = 0
|
|
330
|
+
|
|
331
|
+
# Emit telemetry
|
|
332
|
+
AuditLog(
|
|
333
|
+
event_type=EventType.AGENT_EXECUTION,
|
|
334
|
+
agent_id=agent_id,
|
|
335
|
+
data={
|
|
336
|
+
"action": "callback_handler_initialized",
|
|
337
|
+
"teacher_model": self.auditor.teacher_model
|
|
338
|
+
},
|
|
339
|
+
severity="INFO"
|
|
340
|
+
).emit()
|
|
341
|
+
|
|
342
|
+
logger.info(f"SCAKCallbackHandler initialized for {agent_id}")
|
|
343
|
+
|
|
344
|
+
async def on_agent_finish(
|
|
345
|
+
self,
|
|
346
|
+
finish: AgentFinish,
|
|
347
|
+
*,
|
|
348
|
+
run_id,
|
|
349
|
+
parent_run_id = None,
|
|
350
|
+
**kwargs: Any
|
|
351
|
+
) -> None:
|
|
352
|
+
"""
|
|
353
|
+
Callback when agent finishes execution.
|
|
354
|
+
|
|
355
|
+
This is where laziness detection happens:
|
|
356
|
+
1. Extract agent response
|
|
357
|
+
2. Check for give-up signals (cheap)
|
|
358
|
+
3. If detected, trigger async audit (fire & forget)
|
|
359
|
+
|
|
360
|
+
Args:
|
|
361
|
+
finish: AgentFinish object with return values
|
|
362
|
+
run_id: Unique run identifier
|
|
363
|
+
parent_run_id: Parent run identifier
|
|
364
|
+
**kwargs: Additional keyword arguments
|
|
365
|
+
"""
|
|
366
|
+
self.total_executions += 1
|
|
367
|
+
|
|
368
|
+
# Extract response
|
|
369
|
+
response = finish.return_values.get("output", "")
|
|
370
|
+
|
|
371
|
+
# Extract inputs if available
|
|
372
|
+
inputs = kwargs.get("inputs", {})
|
|
373
|
+
user_prompt = inputs.get("input", "")
|
|
374
|
+
|
|
375
|
+
# 1. Cheap check: Is this a potential give-up?
|
|
376
|
+
if self.is_give_up_signal(response):
|
|
377
|
+
self.give_up_count += 1
|
|
378
|
+
|
|
379
|
+
# Emit telemetry
|
|
380
|
+
AuditLog(
|
|
381
|
+
event_type=EventType.LAZINESS_DETECTED,
|
|
382
|
+
agent_id=self.agent_id,
|
|
383
|
+
data={
|
|
384
|
+
"run_id": str(run_id),
|
|
385
|
+
"user_prompt": user_prompt[:100],
|
|
386
|
+
"agent_response": response[:100],
|
|
387
|
+
"give_up_ratio": f"{self.give_up_count}/{self.total_executions}"
|
|
388
|
+
},
|
|
389
|
+
severity="WARNING"
|
|
390
|
+
).emit()
|
|
391
|
+
|
|
392
|
+
logger.warning(
|
|
393
|
+
f"Give-up signal detected ({self.give_up_count}/{self.total_executions}): "
|
|
394
|
+
f"'{response[:60]}...'"
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
# 2. Trigger Async Audit (Fire & Forget)
|
|
398
|
+
# This does not block the agent response
|
|
399
|
+
asyncio.create_task(self._audit_give_up(user_prompt, response, str(run_id)))
|
|
400
|
+
|
|
401
|
+
def is_give_up_signal(self, response: str) -> bool:
|
|
402
|
+
"""
|
|
403
|
+
Check if response contains a give-up signal.
|
|
404
|
+
|
|
405
|
+
This is a cheap pattern matching check that runs on every response.
|
|
406
|
+
If matched, we trigger the expensive Shadow Teacher audit.
|
|
407
|
+
|
|
408
|
+
Args:
|
|
409
|
+
response: Agent response text
|
|
410
|
+
|
|
411
|
+
Returns:
|
|
412
|
+
True if give-up signal detected
|
|
413
|
+
"""
|
|
414
|
+
response_lower = response.lower()
|
|
415
|
+
return any(pattern in response_lower for pattern in self.GIVE_UP_PATTERNS)
|
|
416
|
+
|
|
417
|
+
async def _audit_give_up(
|
|
418
|
+
self,
|
|
419
|
+
user_prompt: str,
|
|
420
|
+
agent_response: str,
|
|
421
|
+
run_id: str
|
|
422
|
+
) -> None:
|
|
423
|
+
"""
|
|
424
|
+
Trigger async audit using Shadow Teacher.
|
|
425
|
+
|
|
426
|
+
This is the expensive operation that runs in the background
|
|
427
|
+
without blocking the agent response to the user.
|
|
428
|
+
|
|
429
|
+
Args:
|
|
430
|
+
user_prompt: Original user prompt
|
|
431
|
+
agent_response: Agent's give-up response
|
|
432
|
+
run_id: Unique run identifier
|
|
433
|
+
"""
|
|
434
|
+
self.audit_count += 1
|
|
435
|
+
|
|
436
|
+
# Emit telemetry
|
|
437
|
+
AuditLog(
|
|
438
|
+
event_type=EventType.AUDIT_TRIGGERED,
|
|
439
|
+
agent_id=self.agent_id,
|
|
440
|
+
data={
|
|
441
|
+
"run_id": run_id,
|
|
442
|
+
"audit_number": self.audit_count,
|
|
443
|
+
"user_prompt": user_prompt[:100],
|
|
444
|
+
"agent_response": agent_response[:100]
|
|
445
|
+
},
|
|
446
|
+
severity="INFO"
|
|
447
|
+
).emit()
|
|
448
|
+
|
|
449
|
+
logger.info(f"🔍 Triggering audit #{self.audit_count} for run {run_id}")
|
|
450
|
+
|
|
451
|
+
# Create AgentOutcome for auditing
|
|
452
|
+
outcome = AgentOutcome(
|
|
453
|
+
agent_id=self.agent_id,
|
|
454
|
+
outcome_type=OutcomeType.GIVE_UP,
|
|
455
|
+
user_prompt=user_prompt,
|
|
456
|
+
agent_response=agent_response,
|
|
457
|
+
give_up_signal=self._detect_give_up_type(agent_response),
|
|
458
|
+
context={
|
|
459
|
+
"run_id": run_id,
|
|
460
|
+
"timestamp": datetime.utcnow().isoformat()
|
|
461
|
+
}
|
|
462
|
+
)
|
|
463
|
+
|
|
464
|
+
# Run audit (this calls Shadow Teacher)
|
|
465
|
+
try:
|
|
466
|
+
audit = self.auditor.audit_give_up(outcome)
|
|
467
|
+
|
|
468
|
+
# Emit audit completion
|
|
469
|
+
AuditLog(
|
|
470
|
+
event_type=EventType.AUDIT_COMPLETED,
|
|
471
|
+
agent_id=self.agent_id,
|
|
472
|
+
data={
|
|
473
|
+
"run_id": run_id,
|
|
474
|
+
"audit_id": audit.audit_id,
|
|
475
|
+
"teacher_found_data": audit.teacher_found_data,
|
|
476
|
+
"confidence": audit.confidence,
|
|
477
|
+
"laziness_detected": audit.teacher_found_data
|
|
478
|
+
},
|
|
479
|
+
severity="WARNING" if audit.teacher_found_data else "INFO"
|
|
480
|
+
).emit()
|
|
481
|
+
|
|
482
|
+
logger.info(
|
|
483
|
+
f"✓ Audit complete: teacher_found_data={audit.teacher_found_data}, "
|
|
484
|
+
f"confidence={audit.confidence:.2f}"
|
|
485
|
+
)
|
|
486
|
+
|
|
487
|
+
except Exception as e:
|
|
488
|
+
# Never let audit failure break the main flow
|
|
489
|
+
AuditLog(
|
|
490
|
+
event_type=EventType.AUDIT_COMPLETED,
|
|
491
|
+
agent_id=self.agent_id,
|
|
492
|
+
data={
|
|
493
|
+
"run_id": run_id,
|
|
494
|
+
"error": str(e),
|
|
495
|
+
"audit_failed": True
|
|
496
|
+
},
|
|
497
|
+
severity="ERROR"
|
|
498
|
+
).emit()
|
|
499
|
+
|
|
500
|
+
logger.error(f"Audit failed for run {run_id}: {e}")
|
|
501
|
+
|
|
502
|
+
def _detect_give_up_type(self, response: str) -> GiveUpSignal:
|
|
503
|
+
"""
|
|
504
|
+
Detect the specific type of give-up signal.
|
|
505
|
+
|
|
506
|
+
Args:
|
|
507
|
+
response: Agent response
|
|
508
|
+
|
|
509
|
+
Returns:
|
|
510
|
+
GiveUpSignal enum value
|
|
511
|
+
"""
|
|
512
|
+
response_lower = response.lower()
|
|
513
|
+
|
|
514
|
+
if "no data found" in response_lower or "no results" in response_lower:
|
|
515
|
+
return GiveUpSignal.NO_DATA_FOUND
|
|
516
|
+
elif "cannot answer" in response_lower or "unable to" in response_lower:
|
|
517
|
+
return GiveUpSignal.CANNOT_ANSWER
|
|
518
|
+
elif "not available" in response_lower:
|
|
519
|
+
return GiveUpSignal.NOT_AVAILABLE
|
|
520
|
+
elif "insufficient" in response_lower:
|
|
521
|
+
return GiveUpSignal.INSUFFICIENT_INFO
|
|
522
|
+
else:
|
|
523
|
+
return GiveUpSignal.UNKNOWN
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
# ============================================================================
|
|
527
|
+
# COMPONENT 3: SelfCorrectingRunnable - The Runtime Guard
|
|
528
|
+
# ============================================================================
|
|
529
|
+
|
|
530
|
+
class SelfCorrectingRunnable(Runnable if LANGCHAIN_AVAILABLE else object):
|
|
531
|
+
"""
|
|
532
|
+
Runtime guard that wraps LangChain agents for self-correction.
|
|
533
|
+
|
|
534
|
+
This implements SCAK's "Runtime Loop" (Loop 1) by:
|
|
535
|
+
1. Intercepting exceptions and tool errors
|
|
536
|
+
2. Running FailureTriage to decide sync vs async correction
|
|
537
|
+
3. Applying patches in real-time for critical failures
|
|
538
|
+
|
|
539
|
+
Key Features:
|
|
540
|
+
- Transparent wrapping: Works with any Runnable
|
|
541
|
+
- Smart routing: SYNC_JIT for critical, ASYNC_BATCH for non-critical
|
|
542
|
+
- Patch application: Auto-fixes failures without manual intervention
|
|
543
|
+
|
|
544
|
+
Usage:
|
|
545
|
+
```python
|
|
546
|
+
from scak.integrations.langchain import SelfCorrectingRunnable
|
|
547
|
+
|
|
548
|
+
# Wrap your agent
|
|
549
|
+
base_agent = AgentExecutor(agent=agent, tools=tools)
|
|
550
|
+
correcting_agent = SelfCorrectingRunnable(base_agent)
|
|
551
|
+
|
|
552
|
+
# Use as normal
|
|
553
|
+
result = correcting_agent.invoke({"input": "Find logs"})
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
This enables "self-healing" - the agent automatically recovers from
|
|
557
|
+
failures without requiring manual debugging or prompt engineering.
|
|
558
|
+
"""
|
|
559
|
+
|
|
560
|
+
# Instance attributes (initialized in __init__)
|
|
561
|
+
agent: Runnable
|
|
562
|
+
triage: FailureTriage
|
|
563
|
+
patcher: AgentPatcher
|
|
564
|
+
agent_id: str
|
|
565
|
+
execution_count: int
|
|
566
|
+
failure_count: int
|
|
567
|
+
correction_count: int
|
|
568
|
+
|
|
569
|
+
def __init__(
|
|
570
|
+
self,
|
|
571
|
+
agent: Runnable,
|
|
572
|
+
triage: Optional[FailureTriage] = None,
|
|
573
|
+
patcher: Optional[AgentPatcher] = None,
|
|
574
|
+
agent_id: str = "langchain_agent"
|
|
575
|
+
):
|
|
576
|
+
"""
|
|
577
|
+
Initialize SelfCorrectingRunnable.
|
|
578
|
+
|
|
579
|
+
Args:
|
|
580
|
+
agent: The base agent/runnable to wrap
|
|
581
|
+
triage: FailureTriage instance (creates new if None)
|
|
582
|
+
patcher: AgentPatcher instance (creates new if None)
|
|
583
|
+
agent_id: Identifier for the agent
|
|
584
|
+
"""
|
|
585
|
+
if not LANGCHAIN_AVAILABLE:
|
|
586
|
+
raise ImportError(
|
|
587
|
+
"LangChain is required for SelfCorrectingRunnable. "
|
|
588
|
+
"Install with: pip install langchain langchain-core"
|
|
589
|
+
)
|
|
590
|
+
|
|
591
|
+
self.agent = agent
|
|
592
|
+
self.triage = triage or FailureTriage()
|
|
593
|
+
self.patcher = patcher or AgentPatcher()
|
|
594
|
+
self.agent_id = agent_id
|
|
595
|
+
|
|
596
|
+
# Statistics
|
|
597
|
+
self.execution_count = 0
|
|
598
|
+
self.failure_count = 0
|
|
599
|
+
self.correction_count = 0
|
|
600
|
+
|
|
601
|
+
# Emit telemetry
|
|
602
|
+
AuditLog(
|
|
603
|
+
event_type=EventType.AGENT_EXECUTION,
|
|
604
|
+
agent_id=agent_id,
|
|
605
|
+
data={
|
|
606
|
+
"action": "self_correcting_wrapper_initialized",
|
|
607
|
+
"triage_enabled": True,
|
|
608
|
+
"patcher_enabled": True
|
|
609
|
+
},
|
|
610
|
+
severity="INFO"
|
|
611
|
+
).emit()
|
|
612
|
+
|
|
613
|
+
logger.info(f"SelfCorrectingRunnable initialized for {agent_id}")
|
|
614
|
+
|
|
615
|
+
def invoke(
|
|
616
|
+
self,
|
|
617
|
+
input: Dict[str, Any],
|
|
618
|
+
config: Optional[RunnableConfig] = None
|
|
619
|
+
) -> Dict[str, Any]:
|
|
620
|
+
"""
|
|
621
|
+
Invoke the agent with self-correction.
|
|
622
|
+
|
|
623
|
+
This is the synchronous entry point that:
|
|
624
|
+
1. Tries to run the agent normally
|
|
625
|
+
2. Catches failures and runs triage
|
|
626
|
+
3. Applies correction if SYNC_JIT
|
|
627
|
+
4. Retries with corrected context
|
|
628
|
+
|
|
629
|
+
Args:
|
|
630
|
+
input: Input dictionary for the agent
|
|
631
|
+
config: Optional runnable config
|
|
632
|
+
|
|
633
|
+
Returns:
|
|
634
|
+
Output dictionary from the agent
|
|
635
|
+
"""
|
|
636
|
+
self.execution_count += 1
|
|
637
|
+
|
|
638
|
+
try:
|
|
639
|
+
# Try normal execution
|
|
640
|
+
result = self.agent.invoke(input, config)
|
|
641
|
+
|
|
642
|
+
# Success - emit telemetry
|
|
643
|
+
AuditLog(
|
|
644
|
+
event_type=EventType.AGENT_EXECUTION,
|
|
645
|
+
agent_id=self.agent_id,
|
|
646
|
+
data={
|
|
647
|
+
"execution_number": self.execution_count,
|
|
648
|
+
"status": "success",
|
|
649
|
+
"failures_total": self.failure_count,
|
|
650
|
+
"corrections_total": self.correction_count
|
|
651
|
+
},
|
|
652
|
+
severity="INFO"
|
|
653
|
+
).emit()
|
|
654
|
+
|
|
655
|
+
return result
|
|
656
|
+
|
|
657
|
+
except Exception as e:
|
|
658
|
+
self.failure_count += 1
|
|
659
|
+
|
|
660
|
+
# Emit failure detection
|
|
661
|
+
AuditLog(
|
|
662
|
+
event_type=EventType.FAILURE_DETECTED,
|
|
663
|
+
agent_id=self.agent_id,
|
|
664
|
+
data={
|
|
665
|
+
"execution_number": self.execution_count,
|
|
666
|
+
"error_type": type(e).__name__,
|
|
667
|
+
"error_message": str(e),
|
|
668
|
+
"input": str(input)[:100]
|
|
669
|
+
},
|
|
670
|
+
severity="ERROR"
|
|
671
|
+
).emit()
|
|
672
|
+
|
|
673
|
+
logger.error(f"Agent failure detected: {type(e).__name__}: {e}")
|
|
674
|
+
|
|
675
|
+
# Run triage to decide correction strategy
|
|
676
|
+
user_prompt = input.get("input", "")
|
|
677
|
+
tool_name = self._extract_tool_from_error(e)
|
|
678
|
+
|
|
679
|
+
strategy = self.triage.decide_strategy(
|
|
680
|
+
prompt=user_prompt,
|
|
681
|
+
tool_name=tool_name,
|
|
682
|
+
context={"error": str(e), "error_type": type(e).__name__}
|
|
683
|
+
)
|
|
684
|
+
|
|
685
|
+
# Emit triage decision
|
|
686
|
+
AuditLog(
|
|
687
|
+
event_type=EventType.TRIAGE_DECISION,
|
|
688
|
+
agent_id=self.agent_id,
|
|
689
|
+
data={
|
|
690
|
+
"strategy": strategy.value,
|
|
691
|
+
"reason": "critical_operation" if strategy == FixStrategy.SYNC_JIT else "defer_to_background"
|
|
692
|
+
},
|
|
693
|
+
severity="INFO"
|
|
694
|
+
).emit()
|
|
695
|
+
|
|
696
|
+
logger.info(f"Triage decision: {strategy.value}")
|
|
697
|
+
|
|
698
|
+
if strategy == FixStrategy.SYNC_JIT:
|
|
699
|
+
# SYNC: Fix now and retry
|
|
700
|
+
return self._synchronous_correction(input, e, config)
|
|
701
|
+
else:
|
|
702
|
+
# ASYNC: Log and re-raise
|
|
703
|
+
# In production, this would queue for background processing
|
|
704
|
+
logger.info("Failure queued for async correction")
|
|
705
|
+
raise e
|
|
706
|
+
|
|
707
|
+
def _synchronous_correction(
|
|
708
|
+
self,
|
|
709
|
+
input: Dict[str, Any],
|
|
710
|
+
error: Exception,
|
|
711
|
+
config: Optional[RunnableConfig] = None
|
|
712
|
+
) -> Dict[str, Any]:
|
|
713
|
+
"""
|
|
714
|
+
Apply synchronous correction and retry.
|
|
715
|
+
|
|
716
|
+
This is the "JIT retry" path where we:
|
|
717
|
+
1. Create a failure analysis
|
|
718
|
+
2. Generate a patch
|
|
719
|
+
3. Apply the patch to modify input
|
|
720
|
+
4. Retry with corrected input
|
|
721
|
+
|
|
722
|
+
Args:
|
|
723
|
+
input: Original input
|
|
724
|
+
error: The error that occurred
|
|
725
|
+
config: Optional runnable config
|
|
726
|
+
|
|
727
|
+
Returns:
|
|
728
|
+
Result from retried execution
|
|
729
|
+
"""
|
|
730
|
+
self.correction_count += 1
|
|
731
|
+
|
|
732
|
+
logger.info(f"🔧 Applying synchronous correction #{self.correction_count}")
|
|
733
|
+
|
|
734
|
+
# Create AgentFailure for analysis
|
|
735
|
+
failure = AgentFailure(
|
|
736
|
+
agent_id=self.agent_id,
|
|
737
|
+
failure_type=self._classify_failure_type(error),
|
|
738
|
+
severity=FailureSeverity.HIGH, # SYNC_JIT implies high severity
|
|
739
|
+
error_message=str(error),
|
|
740
|
+
context={
|
|
741
|
+
"input": str(input)[:200],
|
|
742
|
+
"correction_attempt": self.correction_count
|
|
743
|
+
}
|
|
744
|
+
)
|
|
745
|
+
|
|
746
|
+
# In a real implementation, this would:
|
|
747
|
+
# 1. Run shadow teacher to diagnose
|
|
748
|
+
# 2. Generate competence patch
|
|
749
|
+
# 3. Inject hint into system prompt
|
|
750
|
+
|
|
751
|
+
# For now, we apply a simple correction:
|
|
752
|
+
# Add error context to the input to guide retry
|
|
753
|
+
corrected_input = input.copy()
|
|
754
|
+
if "input" in corrected_input:
|
|
755
|
+
corrected_input["input"] = (
|
|
756
|
+
f"{corrected_input['input']}\n\n"
|
|
757
|
+
f"[SCAK NOTE: Previous attempt failed with: {str(error)[:100]}. "
|
|
758
|
+
f"Please try an alternative approach.]"
|
|
759
|
+
)
|
|
760
|
+
|
|
761
|
+
# Emit patch creation
|
|
762
|
+
AuditLog(
|
|
763
|
+
event_type=EventType.PATCH_CREATED,
|
|
764
|
+
agent_id=self.agent_id,
|
|
765
|
+
data={
|
|
766
|
+
"patch_type": "hint_injection",
|
|
767
|
+
"correction_number": self.correction_count,
|
|
768
|
+
"original_error": str(error)[:100]
|
|
769
|
+
},
|
|
770
|
+
severity="INFO"
|
|
771
|
+
).emit()
|
|
772
|
+
|
|
773
|
+
# Retry with corrected input
|
|
774
|
+
try:
|
|
775
|
+
result = self.agent.invoke(corrected_input, config)
|
|
776
|
+
|
|
777
|
+
# Success after correction!
|
|
778
|
+
AuditLog(
|
|
779
|
+
event_type=EventType.PATCH_APPLIED,
|
|
780
|
+
agent_id=self.agent_id,
|
|
781
|
+
data={
|
|
782
|
+
"patch_successful": True,
|
|
783
|
+
"correction_number": self.correction_count
|
|
784
|
+
},
|
|
785
|
+
severity="INFO"
|
|
786
|
+
).emit()
|
|
787
|
+
|
|
788
|
+
logger.info(f"✓ Correction successful!")
|
|
789
|
+
return result
|
|
790
|
+
|
|
791
|
+
except Exception as retry_error:
|
|
792
|
+
# Correction failed - log and re-raise original error
|
|
793
|
+
AuditLog(
|
|
794
|
+
event_type=EventType.PATCH_APPLIED,
|
|
795
|
+
agent_id=self.agent_id,
|
|
796
|
+
data={
|
|
797
|
+
"patch_successful": False,
|
|
798
|
+
"retry_error": str(retry_error)[:100],
|
|
799
|
+
"correction_number": self.correction_count
|
|
800
|
+
},
|
|
801
|
+
severity="ERROR"
|
|
802
|
+
).emit()
|
|
803
|
+
|
|
804
|
+
logger.error(f"✗ Correction failed: {retry_error}")
|
|
805
|
+
raise error # Re-raise original error
|
|
806
|
+
|
|
807
|
+
def _extract_tool_from_error(self, error: Exception) -> Optional[str]:
|
|
808
|
+
"""Extract tool name from error message if possible."""
|
|
809
|
+
error_str = str(error).lower()
|
|
810
|
+
|
|
811
|
+
# Check for critical tool names in error message
|
|
812
|
+
for tool in self.triage.critical_tools:
|
|
813
|
+
if tool in error_str:
|
|
814
|
+
return tool
|
|
815
|
+
|
|
816
|
+
# Common tool patterns (fallback)
|
|
817
|
+
tool_patterns = [
|
|
818
|
+
"sql", "database", "file", "api", "http", "search"
|
|
819
|
+
]
|
|
820
|
+
|
|
821
|
+
for pattern in tool_patterns:
|
|
822
|
+
if pattern in error_str:
|
|
823
|
+
return pattern
|
|
824
|
+
|
|
825
|
+
return None
|
|
826
|
+
|
|
827
|
+
def _classify_failure_type(self, error: Exception) -> FailureType:
|
|
828
|
+
"""Classify the type of failure from exception."""
|
|
829
|
+
error_type = type(error).__name__.lower()
|
|
830
|
+
error_msg = str(error).lower()
|
|
831
|
+
|
|
832
|
+
if "timeout" in error_type or "timeout" in error_msg:
|
|
833
|
+
return FailureType.TIMEOUT
|
|
834
|
+
elif "permission" in error_msg or "access" in error_msg:
|
|
835
|
+
return FailureType.BLOCKED_BY_CONTROL_PLANE
|
|
836
|
+
elif "invalid" in error_msg or "validation" in error_msg:
|
|
837
|
+
return FailureType.INVALID_ACTION
|
|
838
|
+
else:
|
|
839
|
+
return FailureType.UNKNOWN
|
|
840
|
+
|
|
841
|
+
|
|
842
|
+
# ============================================================================
|
|
843
|
+
# Convenience function for easy setup
|
|
844
|
+
# ============================================================================
|
|
845
|
+
|
|
846
|
+
def create_scak_agent(
|
|
847
|
+
base_agent: Runnable,
|
|
848
|
+
memory: Optional[SCAKMemory] = None,
|
|
849
|
+
callback_handler: Optional[SCAKCallbackHandler] = None,
|
|
850
|
+
enable_correction: bool = True,
|
|
851
|
+
agent_id: str = "langchain_agent"
|
|
852
|
+
) -> Union[Runnable, SelfCorrectingRunnable]:
|
|
853
|
+
"""
|
|
854
|
+
Convenience function to create a SCAK-enabled LangChain agent.
|
|
855
|
+
|
|
856
|
+
This wraps a base agent with SCAK components in one call.
|
|
857
|
+
|
|
858
|
+
Args:
|
|
859
|
+
base_agent: The LangChain agent to wrap
|
|
860
|
+
memory: Optional SCAKMemory instance
|
|
861
|
+
callback_handler: Optional SCAKCallbackHandler instance
|
|
862
|
+
enable_correction: Whether to enable SelfCorrectingRunnable
|
|
863
|
+
agent_id: Identifier for the agent
|
|
864
|
+
|
|
865
|
+
Returns:
|
|
866
|
+
SCAK-enabled agent
|
|
867
|
+
|
|
868
|
+
Example:
|
|
869
|
+
```python
|
|
870
|
+
from langchain.agents import AgentExecutor
|
|
871
|
+
from scak.integrations.langchain import create_scak_agent
|
|
872
|
+
|
|
873
|
+
base_agent = AgentExecutor(agent=agent, tools=tools)
|
|
874
|
+
scak_agent = create_scak_agent(base_agent)
|
|
875
|
+
|
|
876
|
+
result = scak_agent.invoke({"input": "Find logs"})
|
|
877
|
+
```
|
|
878
|
+
"""
|
|
879
|
+
if not LANGCHAIN_AVAILABLE:
|
|
880
|
+
raise ImportError(
|
|
881
|
+
"LangChain is required for SCAK integration. "
|
|
882
|
+
"Install with: pip install langchain langchain-core"
|
|
883
|
+
)
|
|
884
|
+
|
|
885
|
+
# Add callback handler if provided
|
|
886
|
+
if callback_handler and hasattr(base_agent, 'callbacks'):
|
|
887
|
+
if base_agent.callbacks is None:
|
|
888
|
+
base_agent.callbacks = []
|
|
889
|
+
base_agent.callbacks.append(callback_handler)
|
|
890
|
+
|
|
891
|
+
# Wrap with self-correction if enabled
|
|
892
|
+
if enable_correction:
|
|
893
|
+
agent = SelfCorrectingRunnable(
|
|
894
|
+
agent=base_agent,
|
|
895
|
+
agent_id=agent_id
|
|
896
|
+
)
|
|
897
|
+
else:
|
|
898
|
+
agent = base_agent
|
|
899
|
+
|
|
900
|
+
logger.info(f"Created SCAK agent: correction={enable_correction}, callbacks={callback_handler is not None}")
|
|
901
|
+
|
|
902
|
+
return agent
|