agent-os-kernel 1.1.0__py3-none-any.whl → 1.3.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.3.0.dist-info/METADATA +676 -0
- agent_os_kernel-1.3.0.dist-info/RECORD +1053 -0
- {agent_os_kernel-1.1.0.dist-info → agent_os_kernel-1.3.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.3.0.dist-info}/WHEEL +0 -0
- {agent_os_kernel-1.1.0.dist-info → agent_os_kernel-1.3.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Test suite for the Context Triad (Hot, Warm, Cold) implementation.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from caas.triad import ContextTriadManager
|
|
6
|
+
from caas.models import ContextLayer
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def test_hot_context():
|
|
10
|
+
"""Test hot context management (The Situation)."""
|
|
11
|
+
print("\n=== Testing Hot Context (The Situation) ===")
|
|
12
|
+
|
|
13
|
+
manager = ContextTriadManager()
|
|
14
|
+
|
|
15
|
+
# Add hot context items
|
|
16
|
+
id1 = manager.add_hot_context(
|
|
17
|
+
"User is debugging a NullPointerException in the authentication module",
|
|
18
|
+
metadata={"source": "error_log", "type": "exception"},
|
|
19
|
+
priority=2.0
|
|
20
|
+
)
|
|
21
|
+
print(f"✓ Added hot context item: {id1}")
|
|
22
|
+
|
|
23
|
+
id2 = manager.add_hot_context(
|
|
24
|
+
"Currently viewing auth_service.py lines 145-200",
|
|
25
|
+
metadata={"source": "vscode", "type": "open_file"},
|
|
26
|
+
priority=1.5
|
|
27
|
+
)
|
|
28
|
+
print(f"✓ Added hot context item: {id2}")
|
|
29
|
+
|
|
30
|
+
id3 = manager.add_hot_context(
|
|
31
|
+
"Current conversation: How to fix authentication issues?",
|
|
32
|
+
metadata={"source": "conversation", "type": "user_message"},
|
|
33
|
+
priority=3.0
|
|
34
|
+
)
|
|
35
|
+
print(f"✓ Added hot context item: {id3}")
|
|
36
|
+
|
|
37
|
+
# Get hot context
|
|
38
|
+
hot_context = manager.get_hot_context(max_tokens=500, include_metadata=True)
|
|
39
|
+
print(f"\n--- Hot Context (prioritized) ---\n{hot_context}")
|
|
40
|
+
|
|
41
|
+
# Verify hot context items are included
|
|
42
|
+
assert "authentication" in hot_context.lower()
|
|
43
|
+
assert "Hot Context" in hot_context
|
|
44
|
+
print("✓ Hot context retrieved successfully")
|
|
45
|
+
|
|
46
|
+
# Test clearing hot context
|
|
47
|
+
manager.clear_hot_context()
|
|
48
|
+
hot_context_after_clear = manager.get_hot_context()
|
|
49
|
+
assert hot_context_after_clear == ""
|
|
50
|
+
print("✓ Hot context cleared successfully")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_warm_context():
|
|
54
|
+
"""Test warm context management (The Persona)."""
|
|
55
|
+
print("\n=== Testing Warm Context (The Persona) ===")
|
|
56
|
+
|
|
57
|
+
manager = ContextTriadManager()
|
|
58
|
+
|
|
59
|
+
# Add warm context items (user persona)
|
|
60
|
+
id1 = manager.add_warm_context(
|
|
61
|
+
"Senior Python developer with 8 years of experience",
|
|
62
|
+
metadata={"category": "Experience", "source": "linkedin"},
|
|
63
|
+
priority=1.5
|
|
64
|
+
)
|
|
65
|
+
print(f"✓ Added warm context item: {id1}")
|
|
66
|
+
|
|
67
|
+
id2 = manager.add_warm_context(
|
|
68
|
+
"Prefers type hints and comprehensive docstrings",
|
|
69
|
+
metadata={"category": "Coding Style", "source": "preferences"},
|
|
70
|
+
priority=2.0
|
|
71
|
+
)
|
|
72
|
+
print(f"✓ Added warm context item: {id2}")
|
|
73
|
+
|
|
74
|
+
id3 = manager.add_warm_context(
|
|
75
|
+
"Interested in AI/ML and distributed systems",
|
|
76
|
+
metadata={"category": "Interests", "source": "github_bio"},
|
|
77
|
+
priority=1.0
|
|
78
|
+
)
|
|
79
|
+
print(f"✓ Added warm context item: {id3}")
|
|
80
|
+
|
|
81
|
+
id4 = manager.add_warm_context(
|
|
82
|
+
"Prefers FastAPI over Flask, uses pytest for testing",
|
|
83
|
+
metadata={"category": "Tech Stack", "source": "preferences"},
|
|
84
|
+
priority=1.8
|
|
85
|
+
)
|
|
86
|
+
print(f"✓ Added warm context item: {id4}")
|
|
87
|
+
|
|
88
|
+
# Get warm context
|
|
89
|
+
warm_context = manager.get_warm_context(max_tokens=500, include_metadata=True)
|
|
90
|
+
print(f"\n--- Warm Context (User Persona) ---\n{warm_context}")
|
|
91
|
+
|
|
92
|
+
# Verify warm context items are included
|
|
93
|
+
assert "Python" in warm_context or "python" in warm_context
|
|
94
|
+
assert "Warm Context" in warm_context
|
|
95
|
+
print("✓ Warm context retrieved successfully")
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_cold_context():
|
|
99
|
+
"""Test cold context management (The Archive)."""
|
|
100
|
+
print("\n=== Testing Cold Context (The Archive) ===")
|
|
101
|
+
|
|
102
|
+
manager = ContextTriadManager()
|
|
103
|
+
|
|
104
|
+
# Add cold context items (historical data)
|
|
105
|
+
id1 = manager.add_cold_context(
|
|
106
|
+
"Ticket #1234: Fixed authentication bug in v1.2.0 (closed 2023-06-15)",
|
|
107
|
+
metadata={"date": "2023-06-15", "type": "ticket", "status": "closed"},
|
|
108
|
+
priority=1.0
|
|
109
|
+
)
|
|
110
|
+
print(f"✓ Added cold context item: {id1}")
|
|
111
|
+
|
|
112
|
+
id2 = manager.add_cold_context(
|
|
113
|
+
"PR #567: Refactored authentication module (merged 2023-08-20)",
|
|
114
|
+
metadata={"date": "2023-08-20", "type": "pr", "status": "merged"},
|
|
115
|
+
priority=1.2
|
|
116
|
+
)
|
|
117
|
+
print(f"✓ Added cold context item: {id2}")
|
|
118
|
+
|
|
119
|
+
id3 = manager.add_cold_context(
|
|
120
|
+
"Design doc: Legacy authentication flow (2022-01-10)",
|
|
121
|
+
metadata={"date": "2022-01-10", "type": "design_doc"},
|
|
122
|
+
priority=0.8
|
|
123
|
+
)
|
|
124
|
+
print(f"✓ Added cold context item: {id3}")
|
|
125
|
+
|
|
126
|
+
# Cold context without query should return empty
|
|
127
|
+
cold_context_no_query = manager.get_cold_context()
|
|
128
|
+
assert cold_context_no_query == ""
|
|
129
|
+
print("✓ Cold context correctly returns empty without query")
|
|
130
|
+
|
|
131
|
+
# Cold context with query
|
|
132
|
+
cold_context = manager.get_cold_context(
|
|
133
|
+
query="authentication",
|
|
134
|
+
max_tokens=500,
|
|
135
|
+
include_metadata=True
|
|
136
|
+
)
|
|
137
|
+
print(f"\n--- Cold Context (with query='authentication') ---\n{cold_context}")
|
|
138
|
+
|
|
139
|
+
# Verify cold context items are included
|
|
140
|
+
assert "authentication" in cold_context.lower()
|
|
141
|
+
assert "Cold Context" in cold_context
|
|
142
|
+
assert "Query: authentication" in cold_context
|
|
143
|
+
print("✓ Cold context retrieved successfully with query")
|
|
144
|
+
|
|
145
|
+
# Query that doesn't match should return minimal context
|
|
146
|
+
cold_context_no_match = manager.get_cold_context(
|
|
147
|
+
query="unrelated_topic",
|
|
148
|
+
max_tokens=500
|
|
149
|
+
)
|
|
150
|
+
# Should still have header but no content
|
|
151
|
+
assert cold_context_no_match == "" or "Cold Context" in cold_context_no_match
|
|
152
|
+
print("✓ Cold context correctly handles non-matching query")
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def test_full_context_triad():
|
|
156
|
+
"""Test the complete context triad."""
|
|
157
|
+
print("\n=== Testing Full Context Triad ===")
|
|
158
|
+
|
|
159
|
+
manager = ContextTriadManager()
|
|
160
|
+
|
|
161
|
+
# Add hot context
|
|
162
|
+
manager.add_hot_context(
|
|
163
|
+
"Current error: AuthenticationError at line 145",
|
|
164
|
+
metadata={"source": "error_log"},
|
|
165
|
+
priority=2.0
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# Add warm context
|
|
169
|
+
manager.add_warm_context(
|
|
170
|
+
"Senior developer, prefers detailed error messages",
|
|
171
|
+
metadata={"category": "Profile"},
|
|
172
|
+
priority=1.5
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
# Add cold context
|
|
176
|
+
manager.add_cold_context(
|
|
177
|
+
"Previous authentication bug fixed in 2023",
|
|
178
|
+
metadata={"date": "2023-06-15"},
|
|
179
|
+
priority=1.0
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
# Test 1: Hot + Warm only (default behavior)
|
|
183
|
+
print("\n--- Test 1: Hot + Warm Context (Default) ---")
|
|
184
|
+
result = manager.get_full_context(
|
|
185
|
+
include_hot=True,
|
|
186
|
+
include_warm=True,
|
|
187
|
+
include_cold=False
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
assert "hot" in result["layers_included"]
|
|
191
|
+
assert "warm" in result["layers_included"]
|
|
192
|
+
assert "cold" not in result["layers_included"]
|
|
193
|
+
assert "AuthenticationError" in result["hot_context"]
|
|
194
|
+
assert "developer" in result["warm_context"].lower()
|
|
195
|
+
assert result["cold_context"] == ""
|
|
196
|
+
print("✓ Hot + Warm context retrieved (Cold excluded as expected)")
|
|
197
|
+
|
|
198
|
+
# Test 2: Hot + Warm + Cold with query
|
|
199
|
+
print("\n--- Test 2: Hot + Warm + Cold Context (with query) ---")
|
|
200
|
+
result = manager.get_full_context(
|
|
201
|
+
include_hot=True,
|
|
202
|
+
include_warm=True,
|
|
203
|
+
include_cold=True,
|
|
204
|
+
cold_query="authentication"
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
assert "hot" in result["layers_included"]
|
|
208
|
+
assert "warm" in result["layers_included"]
|
|
209
|
+
assert "cold" in result["layers_included"]
|
|
210
|
+
assert "AuthenticationError" in result["hot_context"]
|
|
211
|
+
assert "authentication" in result["cold_context"].lower()
|
|
212
|
+
print("✓ All three layers retrieved successfully")
|
|
213
|
+
|
|
214
|
+
# Test 3: Cold without query (should not include cold)
|
|
215
|
+
print("\n--- Test 3: Cold Context without query ---")
|
|
216
|
+
result = manager.get_full_context(
|
|
217
|
+
include_hot=False,
|
|
218
|
+
include_warm=False,
|
|
219
|
+
include_cold=True,
|
|
220
|
+
cold_query=None
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
assert "cold" not in result["layers_included"]
|
|
224
|
+
assert result["cold_context"] == ""
|
|
225
|
+
print("✓ Cold context correctly excluded without query")
|
|
226
|
+
|
|
227
|
+
# Test 4: Only Hot context
|
|
228
|
+
print("\n--- Test 4: Only Hot Context ---")
|
|
229
|
+
result = manager.get_full_context(
|
|
230
|
+
include_hot=True,
|
|
231
|
+
include_warm=False,
|
|
232
|
+
include_cold=False
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
assert result["layers_included"] == ["hot"]
|
|
236
|
+
assert "AuthenticationError" in result["hot_context"]
|
|
237
|
+
print("✓ Only Hot context retrieved")
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def test_context_policies():
|
|
241
|
+
"""Test that context triad follows its policies."""
|
|
242
|
+
print("\n=== Testing Context Triad Policies ===")
|
|
243
|
+
|
|
244
|
+
manager = ContextTriadManager()
|
|
245
|
+
|
|
246
|
+
# Add items to all layers
|
|
247
|
+
manager.add_hot_context("Hot: Current debugging session")
|
|
248
|
+
manager.add_warm_context("Warm: User prefers Python")
|
|
249
|
+
manager.add_cold_context("Cold: Old ticket from 2022")
|
|
250
|
+
|
|
251
|
+
# Policy 1: Hot context ALWAYS included by default
|
|
252
|
+
result = manager.get_full_context()
|
|
253
|
+
assert "hot" in result["layers_included"]
|
|
254
|
+
print("✓ Policy 1: Hot context included by default (Attention Head)")
|
|
255
|
+
|
|
256
|
+
# Policy 2: Warm context ALWAYS ON by default
|
|
257
|
+
assert "warm" in result["layers_included"]
|
|
258
|
+
print("✓ Policy 2: Warm context included by default (Always On Filter)")
|
|
259
|
+
|
|
260
|
+
# Policy 3: Cold context ON DEMAND ONLY (not included without query)
|
|
261
|
+
assert "cold" not in result["layers_included"]
|
|
262
|
+
print("✓ Policy 3: Cold context excluded by default (On Demand Only)")
|
|
263
|
+
|
|
264
|
+
# Policy 4: Cold context only with explicit query
|
|
265
|
+
result = manager.get_full_context(include_cold=True, cold_query="ticket")
|
|
266
|
+
assert "cold" in result["layers_included"]
|
|
267
|
+
print("✓ Policy 4: Cold context included when explicitly queried")
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def test_priority_ordering():
|
|
271
|
+
"""Test that items are ordered by priority."""
|
|
272
|
+
print("\n=== Testing Priority Ordering ===")
|
|
273
|
+
|
|
274
|
+
manager = ContextTriadManager()
|
|
275
|
+
|
|
276
|
+
# Add hot context with different priorities
|
|
277
|
+
manager.add_hot_context("Low priority item", priority=1.0)
|
|
278
|
+
manager.add_hot_context("High priority item", priority=3.0)
|
|
279
|
+
manager.add_hot_context("Medium priority item", priority=2.0)
|
|
280
|
+
|
|
281
|
+
hot_context = manager.get_hot_context()
|
|
282
|
+
|
|
283
|
+
# High priority should appear first
|
|
284
|
+
high_pos = hot_context.find("High priority")
|
|
285
|
+
medium_pos = hot_context.find("Medium priority")
|
|
286
|
+
low_pos = hot_context.find("Low priority")
|
|
287
|
+
|
|
288
|
+
assert high_pos < medium_pos < low_pos
|
|
289
|
+
print("✓ Items correctly ordered by priority (high to low)")
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def test_token_limits():
|
|
293
|
+
"""Test that token limits are respected."""
|
|
294
|
+
print("\n=== Testing Token Limits ===")
|
|
295
|
+
|
|
296
|
+
manager = ContextTriadManager()
|
|
297
|
+
|
|
298
|
+
# Add multiple hot context items
|
|
299
|
+
for i in range(10):
|
|
300
|
+
manager.add_hot_context(
|
|
301
|
+
f"Item {i}: " + ("Long content " * 50), # Make it long
|
|
302
|
+
priority=1.0
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
# Get with small token limit
|
|
306
|
+
hot_context = manager.get_hot_context(max_tokens=100)
|
|
307
|
+
|
|
308
|
+
# Should be truncated
|
|
309
|
+
assert len(hot_context) < 100 * 6 # Rough estimate (4-6 chars per token)
|
|
310
|
+
print("✓ Token limits respected")
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def test_item_removal():
|
|
314
|
+
"""Test removing items from context."""
|
|
315
|
+
print("\n=== Testing Item Removal ===")
|
|
316
|
+
|
|
317
|
+
manager = ContextTriadManager()
|
|
318
|
+
|
|
319
|
+
# Add items
|
|
320
|
+
hot_id = manager.add_hot_context("Hot item")
|
|
321
|
+
warm_id = manager.add_warm_context("Warm item")
|
|
322
|
+
cold_id = manager.add_cold_context("Cold item")
|
|
323
|
+
|
|
324
|
+
# Check initial state
|
|
325
|
+
state = manager.get_state()
|
|
326
|
+
assert len(state.hot_context) == 1
|
|
327
|
+
assert len(state.warm_context) == 1
|
|
328
|
+
assert len(state.cold_context) == 1
|
|
329
|
+
|
|
330
|
+
# Remove items
|
|
331
|
+
assert manager.remove_item(hot_id, ContextLayer.HOT)
|
|
332
|
+
assert manager.remove_item(warm_id, ContextLayer.WARM)
|
|
333
|
+
assert manager.remove_item(cold_id, ContextLayer.COLD)
|
|
334
|
+
|
|
335
|
+
# Check final state
|
|
336
|
+
state = manager.get_state()
|
|
337
|
+
assert len(state.hot_context) == 0
|
|
338
|
+
assert len(state.warm_context) == 0
|
|
339
|
+
assert len(state.cold_context) == 0
|
|
340
|
+
|
|
341
|
+
print("✓ Items successfully removed from all layers")
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
def test_hot_context_limit():
|
|
345
|
+
"""Test that hot context is limited to keep it fresh."""
|
|
346
|
+
print("\n=== Testing Hot Context Auto-Limit ===")
|
|
347
|
+
|
|
348
|
+
manager = ContextTriadManager()
|
|
349
|
+
|
|
350
|
+
# Add many hot context items (more than limit)
|
|
351
|
+
for i in range(60):
|
|
352
|
+
manager.add_hot_context(f"Hot item {i}")
|
|
353
|
+
|
|
354
|
+
state = manager.get_state()
|
|
355
|
+
|
|
356
|
+
# Should be limited to 50 most recent items
|
|
357
|
+
assert len(state.hot_context) <= 50
|
|
358
|
+
print(f"✓ Hot context limited to {len(state.hot_context)} items (max 50)")
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
if __name__ == "__main__":
|
|
362
|
+
print("============================================================")
|
|
363
|
+
print("Context Triad Test Suite")
|
|
364
|
+
print("============================================================")
|
|
365
|
+
|
|
366
|
+
try:
|
|
367
|
+
test_hot_context()
|
|
368
|
+
test_warm_context()
|
|
369
|
+
test_cold_context()
|
|
370
|
+
test_full_context_triad()
|
|
371
|
+
test_context_policies()
|
|
372
|
+
test_priority_ordering()
|
|
373
|
+
test_token_limits()
|
|
374
|
+
test_item_removal()
|
|
375
|
+
test_hot_context_limit()
|
|
376
|
+
|
|
377
|
+
print("\n============================================================")
|
|
378
|
+
print("✅ All Context Triad tests passed successfully!")
|
|
379
|
+
print("============================================================")
|
|
380
|
+
except AssertionError as e:
|
|
381
|
+
print(f"\n❌ Test failed: {e}")
|
|
382
|
+
raise
|
|
383
|
+
except Exception as e:
|
|
384
|
+
print(f"\n❌ Unexpected error: {e}")
|
|
385
|
+
raise
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Test suite for the Conversation Manager (Sliding Window / FIFO) implementation.
|
|
3
|
+
|
|
4
|
+
The Brutal Squeeze Philosophy:
|
|
5
|
+
Testing that Chopping (FIFO) is better than Summarizing.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from caas.conversation import ConversationManager
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_basic_sliding_window():
|
|
12
|
+
"""Test basic sliding window functionality."""
|
|
13
|
+
print("\n=== Testing Basic Sliding Window (FIFO) ===")
|
|
14
|
+
|
|
15
|
+
# Create manager with small window for testing
|
|
16
|
+
manager = ConversationManager(max_turns=3)
|
|
17
|
+
|
|
18
|
+
# Add 3 turns (should all fit)
|
|
19
|
+
id1 = manager.add_turn("Hello, how are you?", "I'm doing well, thanks!")
|
|
20
|
+
print(f"✓ Added turn 1: {id1[:8]}...")
|
|
21
|
+
|
|
22
|
+
id2 = manager.add_turn("Can you help me with Python?", "Of course! What do you need?")
|
|
23
|
+
print(f"✓ Added turn 2: {id2[:8]}...")
|
|
24
|
+
|
|
25
|
+
id3 = manager.add_turn("How do I read a file?", "Use open('file.txt', 'r')")
|
|
26
|
+
print(f"✓ Added turn 3: {id3[:8]}...")
|
|
27
|
+
|
|
28
|
+
# Check we have 3 turns
|
|
29
|
+
state = manager.get_state()
|
|
30
|
+
assert len(state.turns) == 3
|
|
31
|
+
assert state.total_turns_ever == 3
|
|
32
|
+
print("✓ All 3 turns stored (window not exceeded)")
|
|
33
|
+
|
|
34
|
+
# Add 4th turn - should trigger FIFO deletion
|
|
35
|
+
print("\n--- Adding 4th turn (should delete oldest) ---")
|
|
36
|
+
id4 = manager.add_turn("What about writing?", "Use open('file.txt', 'w')")
|
|
37
|
+
print(f"✓ Added turn 4: {id4[:8]}...")
|
|
38
|
+
|
|
39
|
+
# Check we still have 3 turns, but turn 1 is gone
|
|
40
|
+
state = manager.get_state()
|
|
41
|
+
assert len(state.turns) == 3
|
|
42
|
+
assert state.total_turns_ever == 4
|
|
43
|
+
assert state.turns[0].id == id2 # Turn 1 deleted, turn 2 is now oldest
|
|
44
|
+
assert state.turns[-1].id == id4 # Turn 4 is newest
|
|
45
|
+
print("✓ FIFO worked: Turn 1 deleted, turns 2-4 kept intact")
|
|
46
|
+
print(f"✓ Total turns ever: {state.total_turns_ever} (1 deleted, 3 kept)")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_no_summarization_loss():
|
|
50
|
+
"""Test that no information is lost through summarization."""
|
|
51
|
+
print("\n=== Testing No Summarization Loss ===")
|
|
52
|
+
|
|
53
|
+
manager = ConversationManager(max_turns=2)
|
|
54
|
+
|
|
55
|
+
# Add turn with specific error code
|
|
56
|
+
specific_message = "I tried X and it failed with error code 500"
|
|
57
|
+
specific_response = "Error 500 is an internal server error. Check your logs at /var/log/app.log"
|
|
58
|
+
manager.add_turn(specific_message, specific_response)
|
|
59
|
+
print(f"✓ Added turn with specific error code: 500")
|
|
60
|
+
|
|
61
|
+
# Get history - should have EXACT message
|
|
62
|
+
history = manager.get_conversation_history(format_as_text=False)
|
|
63
|
+
assert history[0].user_message == specific_message
|
|
64
|
+
assert "500" in history[0].user_message
|
|
65
|
+
assert "/var/log/app.log" in history[0].ai_response
|
|
66
|
+
print("✓ Exact message preserved (no lossy summarization)")
|
|
67
|
+
print(f" Original: '{specific_message}'")
|
|
68
|
+
print(f" Retrieved: '{history[0].user_message}'")
|
|
69
|
+
print(" ✅ Perfect match! No detail lost!")
|
|
70
|
+
|
|
71
|
+
# Add 2 more turns to push the first one out
|
|
72
|
+
manager.add_turn("Another question", "Another answer")
|
|
73
|
+
manager.add_turn("Yet another question", "Yet another answer")
|
|
74
|
+
|
|
75
|
+
# First turn should be gone, but recent turns are PERFECTLY intact
|
|
76
|
+
history = manager.get_conversation_history(format_as_text=False)
|
|
77
|
+
assert len(history) == 2
|
|
78
|
+
assert history[0].user_message == "Another question"
|
|
79
|
+
assert history[1].user_message == "Yet another question"
|
|
80
|
+
print("\n✓ After FIFO deletion:")
|
|
81
|
+
print(f" - First turn (with error 500) is deleted")
|
|
82
|
+
print(f" - Recent 2 turns are PERFECTLY intact")
|
|
83
|
+
print(f" - No summarization = No information loss")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def test_recent_turns_priority():
|
|
87
|
+
"""Test that recent turns take priority."""
|
|
88
|
+
print("\n=== Testing Recent Turns Priority ===")
|
|
89
|
+
|
|
90
|
+
manager = ConversationManager(max_turns=5)
|
|
91
|
+
|
|
92
|
+
# Simulate conversation over time
|
|
93
|
+
turns = [
|
|
94
|
+
("20 minutes ago: Old question", "Old answer"),
|
|
95
|
+
("15 minutes ago: Another old question", "Another old answer"),
|
|
96
|
+
("10 minutes ago: Yet another old", "Yet another old answer"),
|
|
97
|
+
("5 minutes ago: Getting recent", "Recent answer"),
|
|
98
|
+
("1 minute ago: Very recent", "Very recent answer"),
|
|
99
|
+
("30 seconds ago: Code snippet: def foo():", "That's a function definition"),
|
|
100
|
+
]
|
|
101
|
+
|
|
102
|
+
for user_msg, ai_msg in turns:
|
|
103
|
+
manager.add_turn(user_msg, ai_msg)
|
|
104
|
+
|
|
105
|
+
# Should have last 5 turns
|
|
106
|
+
history = manager.get_conversation_history(format_as_text=False)
|
|
107
|
+
assert len(history) == 5
|
|
108
|
+
assert "Old question" not in history[0].user_message # First turn deleted
|
|
109
|
+
assert "Code snippet" in history[-1].user_message # Most recent kept
|
|
110
|
+
print("✓ Recent precision maintained")
|
|
111
|
+
print(f" - Oldest turn kept: '{history[0].user_message[:30]}...'")
|
|
112
|
+
print(f" - Newest turn kept: '{history[-1].user_message[:30]}...'")
|
|
113
|
+
print(" ✅ User can still see their exact code snippet from 30 seconds ago!")
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def test_get_recent_turns():
|
|
117
|
+
"""Test getting N most recent turns."""
|
|
118
|
+
print("\n=== Testing Get Recent Turns ===")
|
|
119
|
+
|
|
120
|
+
manager = ConversationManager(max_turns=10)
|
|
121
|
+
|
|
122
|
+
# Add 10 turns
|
|
123
|
+
for i in range(10):
|
|
124
|
+
manager.add_turn(f"Question {i+1}", f"Answer {i+1}")
|
|
125
|
+
|
|
126
|
+
# Get last 3 turns
|
|
127
|
+
recent = manager.get_recent_turns(n=3)
|
|
128
|
+
assert len(recent) == 3
|
|
129
|
+
assert "Question 8" in recent[0].user_message
|
|
130
|
+
assert "Question 9" in recent[1].user_message
|
|
131
|
+
assert "Question 10" in recent[2].user_message
|
|
132
|
+
print("✓ Got last 3 turns correctly")
|
|
133
|
+
|
|
134
|
+
# Get recent turns when we have fewer than requested
|
|
135
|
+
manager.clear_conversation()
|
|
136
|
+
manager.add_turn("Only one", "Only one answer")
|
|
137
|
+
recent = manager.get_recent_turns(n=5)
|
|
138
|
+
assert len(recent) == 1
|
|
139
|
+
print("✓ Handles case where we have fewer turns than requested")
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def test_update_turn_response():
|
|
143
|
+
"""Test updating a turn's AI response."""
|
|
144
|
+
print("\n=== Testing Update Turn Response ===")
|
|
145
|
+
|
|
146
|
+
manager = ConversationManager(max_turns=5)
|
|
147
|
+
|
|
148
|
+
# Add turn without AI response
|
|
149
|
+
turn_id = manager.add_turn("What is Python?")
|
|
150
|
+
print(f"✓ Added turn without AI response: {turn_id[:8]}...")
|
|
151
|
+
|
|
152
|
+
# Update with AI response
|
|
153
|
+
success = manager.update_turn_response(turn_id, "Python is a programming language")
|
|
154
|
+
assert success
|
|
155
|
+
print("✓ Updated turn with AI response")
|
|
156
|
+
|
|
157
|
+
# Verify update
|
|
158
|
+
history = manager.get_conversation_history(format_as_text=False)
|
|
159
|
+
assert history[0].ai_response == "Python is a programming language"
|
|
160
|
+
print("✓ AI response correctly updated")
|
|
161
|
+
|
|
162
|
+
# Try updating non-existent turn
|
|
163
|
+
success = manager.update_turn_response("fake-id", "Fake response")
|
|
164
|
+
assert not success
|
|
165
|
+
print("✓ Correctly handles non-existent turn ID")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def test_conversation_statistics():
|
|
169
|
+
"""Test conversation statistics."""
|
|
170
|
+
print("\n=== Testing Conversation Statistics ===")
|
|
171
|
+
|
|
172
|
+
manager = ConversationManager(max_turns=3)
|
|
173
|
+
|
|
174
|
+
# Add 5 turns (2 should be deleted)
|
|
175
|
+
for i in range(5):
|
|
176
|
+
manager.add_turn(f"Question {i+1}", f"Answer {i+1}")
|
|
177
|
+
|
|
178
|
+
stats = manager.get_statistics()
|
|
179
|
+
assert stats["current_turns"] == 3
|
|
180
|
+
assert stats["max_turns"] == 3
|
|
181
|
+
assert stats["total_turns_ever"] == 5
|
|
182
|
+
assert stats["deleted_turns"] == 2
|
|
183
|
+
print("✓ Statistics correctly calculated:")
|
|
184
|
+
print(f" - Current turns: {stats['current_turns']}")
|
|
185
|
+
print(f" - Max turns: {stats['max_turns']}")
|
|
186
|
+
print(f" - Total turns ever: {stats['total_turns_ever']}")
|
|
187
|
+
print(f" - Deleted turns: {stats['deleted_turns']}")
|
|
188
|
+
print(f" ✅ Sliding window deleted {stats['deleted_turns']} old turns, kept {stats['current_turns']} recent!")
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def test_formatted_output():
|
|
192
|
+
"""Test formatted text output."""
|
|
193
|
+
print("\n=== Testing Formatted Output ===")
|
|
194
|
+
|
|
195
|
+
manager = ConversationManager(max_turns=3)
|
|
196
|
+
|
|
197
|
+
# Add some turns
|
|
198
|
+
manager.add_turn("Hello", "Hi there!", {"source": "user"})
|
|
199
|
+
manager.add_turn("How are you?", "I'm great!", {"source": "user"})
|
|
200
|
+
|
|
201
|
+
# Get formatted text
|
|
202
|
+
text = manager.get_conversation_history(format_as_text=True, include_metadata=True)
|
|
203
|
+
assert "Conversation History" in text
|
|
204
|
+
assert "Sliding Window" in text
|
|
205
|
+
assert "Hello" in text
|
|
206
|
+
assert "Hi there!" in text
|
|
207
|
+
assert "source" in text
|
|
208
|
+
print("✓ Formatted output looks good:")
|
|
209
|
+
print(text)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def test_clear_conversation():
|
|
213
|
+
"""Test clearing conversation."""
|
|
214
|
+
print("\n=== Testing Clear Conversation ===")
|
|
215
|
+
|
|
216
|
+
manager = ConversationManager(max_turns=5)
|
|
217
|
+
|
|
218
|
+
# Add some turns
|
|
219
|
+
for i in range(3):
|
|
220
|
+
manager.add_turn(f"Question {i+1}", f"Answer {i+1}")
|
|
221
|
+
|
|
222
|
+
assert len(manager.get_state().turns) == 3
|
|
223
|
+
print("✓ Added 3 turns")
|
|
224
|
+
|
|
225
|
+
# Clear
|
|
226
|
+
manager.clear_conversation()
|
|
227
|
+
assert len(manager.get_state().turns) == 0
|
|
228
|
+
print("✓ Conversation cleared")
|
|
229
|
+
|
|
230
|
+
# Total turns ever should still be 3
|
|
231
|
+
assert manager.get_state().total_turns_ever == 3
|
|
232
|
+
print("✓ Total turns ever counter preserved")
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def test_state_management():
|
|
236
|
+
"""Test state get/set."""
|
|
237
|
+
print("\n=== Testing State Management ===")
|
|
238
|
+
|
|
239
|
+
manager1 = ConversationManager(max_turns=5)
|
|
240
|
+
manager1.add_turn("Question 1", "Answer 1")
|
|
241
|
+
manager1.add_turn("Question 2", "Answer 2")
|
|
242
|
+
|
|
243
|
+
# Get state
|
|
244
|
+
state = manager1.get_state()
|
|
245
|
+
assert len(state.turns) == 2
|
|
246
|
+
print("✓ Got state from manager 1")
|
|
247
|
+
|
|
248
|
+
# Create new manager and set state
|
|
249
|
+
manager2 = ConversationManager(max_turns=5)
|
|
250
|
+
manager2.set_state(state)
|
|
251
|
+
assert len(manager2.get_state().turns) == 2
|
|
252
|
+
print("✓ Set state on manager 2")
|
|
253
|
+
|
|
254
|
+
# Verify turns are the same
|
|
255
|
+
assert manager2.get_state().turns[0].user_message == "Question 1"
|
|
256
|
+
print("✓ State correctly transferred between managers")
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def run_all_tests():
|
|
260
|
+
"""Run all conversation manager tests."""
|
|
261
|
+
print("\n" + "="*70)
|
|
262
|
+
print("CONVERSATION MANAGER TEST SUITE")
|
|
263
|
+
print("Testing: The Brutal Squeeze (Chopping > Summarizing)")
|
|
264
|
+
print("="*70)
|
|
265
|
+
|
|
266
|
+
test_basic_sliding_window()
|
|
267
|
+
test_no_summarization_loss()
|
|
268
|
+
test_recent_turns_priority()
|
|
269
|
+
test_get_recent_turns()
|
|
270
|
+
test_update_turn_response()
|
|
271
|
+
test_conversation_statistics()
|
|
272
|
+
test_formatted_output()
|
|
273
|
+
test_clear_conversation()
|
|
274
|
+
test_state_management()
|
|
275
|
+
|
|
276
|
+
print("\n" + "="*70)
|
|
277
|
+
print("✅ ALL TESTS PASSED!")
|
|
278
|
+
print("="*70)
|
|
279
|
+
print("\nKey Takeaways:")
|
|
280
|
+
print("1. ✅ Sliding Window (FIFO) keeps recent turns PERFECTLY intact")
|
|
281
|
+
print("2. ✅ No summarization = No information loss")
|
|
282
|
+
print("3. ✅ Users can see exact code snippets from 30 seconds ago")
|
|
283
|
+
print("4. ✅ Zero AI cost for context management")
|
|
284
|
+
print("5. ✅ Predictable behavior: Always know what's in context")
|
|
285
|
+
print("\n🎯 Recent Precision > Vague History!")
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
if __name__ == "__main__":
|
|
289
|
+
run_all_tests()
|