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,1326 @@
|
|
|
1
|
+
"""
|
|
2
|
+
REST API for Context-as-a-Service.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import uuid
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
from typing import List, Optional
|
|
8
|
+
|
|
9
|
+
from fastapi import FastAPI, HTTPException, UploadFile, File, Form
|
|
10
|
+
from fastapi.responses import JSONResponse
|
|
11
|
+
|
|
12
|
+
from caas.models import (
|
|
13
|
+
Document,
|
|
14
|
+
DocumentType,
|
|
15
|
+
ContentFormat,
|
|
16
|
+
ContextRequest,
|
|
17
|
+
ContextResponse,
|
|
18
|
+
ContextLayer,
|
|
19
|
+
ContextTriadRequest,
|
|
20
|
+
ContextTriadResponse,
|
|
21
|
+
AddContextRequest,
|
|
22
|
+
RouteRequest,
|
|
23
|
+
RoutingDecision,
|
|
24
|
+
ModelTier,
|
|
25
|
+
AddTurnRequest,
|
|
26
|
+
UpdateTurnRequest,
|
|
27
|
+
ConversationHistoryResponse,
|
|
28
|
+
CreateFileRequest,
|
|
29
|
+
UpdateFileRequest,
|
|
30
|
+
ReadFileRequest,
|
|
31
|
+
DeleteFileRequest,
|
|
32
|
+
ListFilesRequest,
|
|
33
|
+
FileResponse,
|
|
34
|
+
FileListResponse,
|
|
35
|
+
)
|
|
36
|
+
from caas.ingestion import ProcessorFactory
|
|
37
|
+
from caas.detection import DocumentTypeDetector, StructureAnalyzer
|
|
38
|
+
from caas.tuning import WeightTuner, CorpusAnalyzer
|
|
39
|
+
from caas.storage import DocumentStore, ContextExtractor
|
|
40
|
+
from caas.triad import ContextTriadManager
|
|
41
|
+
from caas.routing import HeuristicRouter
|
|
42
|
+
from caas.conversation import ConversationManager
|
|
43
|
+
from caas.gateway import TrustGateway, SecurityPolicy, DeploymentMode
|
|
44
|
+
from caas.vfs import VirtualFileSystem
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# Initialize FastAPI app
|
|
48
|
+
app = FastAPI(
|
|
49
|
+
title="Context-as-a-Service",
|
|
50
|
+
description="Intelligent context extraction and serving",
|
|
51
|
+
version="0.1.0"
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# Initialize components
|
|
55
|
+
document_store = DocumentStore()
|
|
56
|
+
detector = DocumentTypeDetector()
|
|
57
|
+
structure_analyzer = StructureAnalyzer()
|
|
58
|
+
weight_tuner = WeightTuner()
|
|
59
|
+
corpus_analyzer = CorpusAnalyzer()
|
|
60
|
+
triad_manager = ContextTriadManager()
|
|
61
|
+
heuristic_router = HeuristicRouter()
|
|
62
|
+
conversation_manager = ConversationManager(max_turns=10) # Sliding window with 10 turns
|
|
63
|
+
# Virtual File System for SDLC agents
|
|
64
|
+
vfs = VirtualFileSystem()
|
|
65
|
+
# Trust Gateway with enterprise-grade security
|
|
66
|
+
trust_gateway = TrustGateway(
|
|
67
|
+
security_policy=SecurityPolicy(
|
|
68
|
+
deployment_mode=DeploymentMode.ON_PREM,
|
|
69
|
+
security_level="high"
|
|
70
|
+
),
|
|
71
|
+
audit_enabled=True
|
|
72
|
+
)
|
|
73
|
+
# Note: context_extractor is created per-request with user-specified decay settings
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@app.get("/")
|
|
77
|
+
async def root():
|
|
78
|
+
"""Root endpoint."""
|
|
79
|
+
return {
|
|
80
|
+
"service": "Context-as-a-Service",
|
|
81
|
+
"version": "0.1.0",
|
|
82
|
+
"status": "operational",
|
|
83
|
+
"endpoints": {
|
|
84
|
+
"ingest": "/ingest",
|
|
85
|
+
"documents": "/documents",
|
|
86
|
+
"context": "/context/{document_id}",
|
|
87
|
+
"analyze": "/analyze/{document_id}",
|
|
88
|
+
"corpus": "/corpus/analyze",
|
|
89
|
+
"route": "/route",
|
|
90
|
+
"triad": "/triad",
|
|
91
|
+
"triad_hot": "/triad/hot",
|
|
92
|
+
"triad_warm": "/triad/warm",
|
|
93
|
+
"triad_cold": "/triad/cold",
|
|
94
|
+
"conversation": "/conversation",
|
|
95
|
+
"conversation_add": "/conversation/turn",
|
|
96
|
+
"conversation_stats": "/conversation/stats",
|
|
97
|
+
"gateway": "/gateway",
|
|
98
|
+
"gateway_route": "/gateway/route",
|
|
99
|
+
"gateway_info": "/gateway/info",
|
|
100
|
+
"gateway_audit": "/gateway/audit",
|
|
101
|
+
"vfs_create": "/vfs/files (POST)",
|
|
102
|
+
"vfs_read": "/vfs/files (GET)",
|
|
103
|
+
"vfs_update": "/vfs/files (PUT)",
|
|
104
|
+
"vfs_delete": "/vfs/files (DELETE)",
|
|
105
|
+
"vfs_list": "/vfs/list",
|
|
106
|
+
"vfs_history": "/vfs/history",
|
|
107
|
+
"vfs_state": "/vfs/state",
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
@app.get("/health")
|
|
114
|
+
async def health_check():
|
|
115
|
+
"""Health check endpoint."""
|
|
116
|
+
return {"status": "healthy", "timestamp": datetime.utcnow().isoformat()}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
@app.post("/ingest")
|
|
120
|
+
async def ingest_document(
|
|
121
|
+
file: UploadFile = File(...),
|
|
122
|
+
format: ContentFormat = Form(...),
|
|
123
|
+
title: Optional[str] = Form(None),
|
|
124
|
+
source_type: Optional[str] = Form(None),
|
|
125
|
+
source_url: Optional[str] = Form(None)
|
|
126
|
+
):
|
|
127
|
+
"""
|
|
128
|
+
Ingest a document for processing.
|
|
129
|
+
|
|
130
|
+
The service will:
|
|
131
|
+
1. Process the raw content
|
|
132
|
+
2. Auto-detect the document type and structure
|
|
133
|
+
3. Auto-tune weights for sections
|
|
134
|
+
4. Detect or use provided source type for Pragmatic Truth tracking
|
|
135
|
+
5. Store the processed document
|
|
136
|
+
|
|
137
|
+
Pragmatic Truth Support:
|
|
138
|
+
- source_type: Explicitly specify source type (official_docs, team_chat, practical_logs, etc.)
|
|
139
|
+
- source_url: Optional URL to the original source
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
file: The file to ingest
|
|
143
|
+
format: The file format (pdf, html, code)
|
|
144
|
+
title: Optional title for the document
|
|
145
|
+
source_type: Optional source type for citation tracking
|
|
146
|
+
source_url: Optional URL to the original source
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
Processed document information
|
|
150
|
+
"""
|
|
151
|
+
try:
|
|
152
|
+
# Read file content
|
|
153
|
+
content = await file.read()
|
|
154
|
+
|
|
155
|
+
# Generate document ID
|
|
156
|
+
doc_id = str(uuid.uuid4())
|
|
157
|
+
|
|
158
|
+
# Process the document
|
|
159
|
+
processor = ProcessorFactory.get_processor(format)
|
|
160
|
+
metadata = {
|
|
161
|
+
"id": doc_id,
|
|
162
|
+
"title": title or file.filename,
|
|
163
|
+
"filename": file.filename,
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
# Add source metadata if provided
|
|
167
|
+
if source_type:
|
|
168
|
+
metadata['source_type'] = source_type
|
|
169
|
+
if source_url:
|
|
170
|
+
metadata['source_url'] = source_url
|
|
171
|
+
|
|
172
|
+
document = processor.process(content, metadata)
|
|
173
|
+
|
|
174
|
+
# Auto-detect document type
|
|
175
|
+
detected_type = detector.detect(document)
|
|
176
|
+
document.detected_type = detected_type
|
|
177
|
+
|
|
178
|
+
# Auto-tune weights
|
|
179
|
+
document = weight_tuner.tune(document)
|
|
180
|
+
|
|
181
|
+
# Add timestamp
|
|
182
|
+
document.ingestion_timestamp = datetime.utcnow().isoformat()
|
|
183
|
+
|
|
184
|
+
# Store document
|
|
185
|
+
document_store.add(document)
|
|
186
|
+
|
|
187
|
+
# Add to corpus analyzer
|
|
188
|
+
corpus_analyzer.add_document(document)
|
|
189
|
+
|
|
190
|
+
return {
|
|
191
|
+
"document_id": document.id,
|
|
192
|
+
"title": document.title,
|
|
193
|
+
"detected_type": document.detected_type,
|
|
194
|
+
"format": document.format,
|
|
195
|
+
"sections_found": len(document.sections),
|
|
196
|
+
"weights": document.weights,
|
|
197
|
+
"source_type": source_type or "auto-detected",
|
|
198
|
+
"status": "ingested"
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
except Exception as e:
|
|
202
|
+
raise HTTPException(status_code=500, detail=f"Ingestion failed: {str(e)}")
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
@app.get("/documents")
|
|
206
|
+
async def list_documents(doc_type: Optional[DocumentType] = None):
|
|
207
|
+
"""
|
|
208
|
+
List all documents or filter by type.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
doc_type: Optional document type filter
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
List of documents
|
|
215
|
+
"""
|
|
216
|
+
if doc_type:
|
|
217
|
+
documents = document_store.list_by_type(doc_type)
|
|
218
|
+
else:
|
|
219
|
+
documents = document_store.list_all()
|
|
220
|
+
|
|
221
|
+
return {
|
|
222
|
+
"total": len(documents),
|
|
223
|
+
"documents": [
|
|
224
|
+
{
|
|
225
|
+
"id": doc.id,
|
|
226
|
+
"title": doc.title,
|
|
227
|
+
"type": doc.detected_type,
|
|
228
|
+
"format": doc.format,
|
|
229
|
+
"sections": len(doc.sections),
|
|
230
|
+
"timestamp": doc.ingestion_timestamp,
|
|
231
|
+
}
|
|
232
|
+
for doc in documents
|
|
233
|
+
]
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
@app.get("/documents/{document_id}")
|
|
238
|
+
async def get_document(document_id: str):
|
|
239
|
+
"""
|
|
240
|
+
Get detailed information about a specific document.
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
document_id: The document ID
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
Document details
|
|
247
|
+
"""
|
|
248
|
+
document = document_store.get(document_id)
|
|
249
|
+
if not document:
|
|
250
|
+
raise HTTPException(status_code=404, detail="Document not found")
|
|
251
|
+
|
|
252
|
+
return {
|
|
253
|
+
"id": document.id,
|
|
254
|
+
"title": document.title,
|
|
255
|
+
"type": document.detected_type,
|
|
256
|
+
"format": document.format,
|
|
257
|
+
"sections": [
|
|
258
|
+
{
|
|
259
|
+
"title": s.title,
|
|
260
|
+
"weight": s.weight,
|
|
261
|
+
"importance": s.importance_score,
|
|
262
|
+
"length": len(s.content),
|
|
263
|
+
}
|
|
264
|
+
for s in document.sections
|
|
265
|
+
],
|
|
266
|
+
"metadata": document.metadata,
|
|
267
|
+
"weights": document.weights,
|
|
268
|
+
"timestamp": document.ingestion_timestamp,
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
@app.post("/context/{document_id}")
|
|
273
|
+
async def get_context(document_id: str, request: ContextRequest):
|
|
274
|
+
"""
|
|
275
|
+
Get optimized context from a document.
|
|
276
|
+
|
|
277
|
+
This endpoint returns the most relevant context based on:
|
|
278
|
+
- Auto-tuned section weights
|
|
279
|
+
- Time-based decay (prioritizes recent content)
|
|
280
|
+
- Optional query for focused extraction
|
|
281
|
+
- Token limits
|
|
282
|
+
- Source citations for transparency (Pragmatic Truth)
|
|
283
|
+
- Conflict detection between official and practical sources
|
|
284
|
+
|
|
285
|
+
Pragmatic Truth Philosophy:
|
|
286
|
+
- Provides REAL answers, not just OFFICIAL ones
|
|
287
|
+
- When official docs conflict with practical experience, shows both
|
|
288
|
+
- Includes transparent citations (e.g., "from Slack conversation")
|
|
289
|
+
- Example: "Officially, limit is 100. However, team reports crashes after 50."
|
|
290
|
+
|
|
291
|
+
Time Decay Formula: Score = Base_Weight * (1 / (1 + days_elapsed * decay_rate))
|
|
292
|
+
Result: Recent documents rank higher than old documents, even with lower similarity.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
document_id: The document ID
|
|
296
|
+
request: Context request parameters (includes enable_time_decay, decay_rate, enable_citations, detect_conflicts)
|
|
297
|
+
|
|
298
|
+
Returns:
|
|
299
|
+
Optimized context with time-weighted relevance, citations, and conflict detection
|
|
300
|
+
"""
|
|
301
|
+
document = document_store.get(document_id)
|
|
302
|
+
if not document:
|
|
303
|
+
raise HTTPException(status_code=404, detail="Document not found")
|
|
304
|
+
|
|
305
|
+
# Create context extractor with requested settings
|
|
306
|
+
extractor = ContextExtractor(
|
|
307
|
+
document_store,
|
|
308
|
+
enrich_metadata=request.include_metadata,
|
|
309
|
+
enable_time_decay=request.enable_time_decay,
|
|
310
|
+
decay_rate=request.decay_rate,
|
|
311
|
+
enable_citations=request.enable_citations,
|
|
312
|
+
detect_conflicts=request.detect_conflicts
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
# Extract context
|
|
316
|
+
context, metadata = extractor.extract_context(
|
|
317
|
+
document_id,
|
|
318
|
+
request.query,
|
|
319
|
+
request.max_tokens
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
# Estimate tokens (rough approximation)
|
|
323
|
+
estimated_tokens = len(context) // 4
|
|
324
|
+
|
|
325
|
+
response = ContextResponse(
|
|
326
|
+
document_id=document_id,
|
|
327
|
+
document_type=document.detected_type,
|
|
328
|
+
context=context,
|
|
329
|
+
sections_used=metadata.get("sections_used", []),
|
|
330
|
+
total_tokens=estimated_tokens,
|
|
331
|
+
weights_applied=metadata.get("weights_applied", {}),
|
|
332
|
+
metadata=metadata if request.include_metadata else {},
|
|
333
|
+
source_citations=metadata.get("citations", []),
|
|
334
|
+
source_conflicts=metadata.get("conflicts", [])
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
return response
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
@app.get("/analyze/{document_id}")
|
|
341
|
+
async def analyze_document(document_id: str):
|
|
342
|
+
"""
|
|
343
|
+
Analyze a document's structure and content.
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
document_id: The document ID
|
|
347
|
+
|
|
348
|
+
Returns:
|
|
349
|
+
Analysis results
|
|
350
|
+
"""
|
|
351
|
+
document = document_store.get(document_id)
|
|
352
|
+
if not document:
|
|
353
|
+
raise HTTPException(status_code=404, detail="Document not found")
|
|
354
|
+
|
|
355
|
+
# Perform structure analysis
|
|
356
|
+
structure = detector.detect_structure(document)
|
|
357
|
+
analysis = structure_analyzer.analyze(document)
|
|
358
|
+
|
|
359
|
+
return {
|
|
360
|
+
"document_id": document_id,
|
|
361
|
+
"structure": structure,
|
|
362
|
+
"analysis": analysis,
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
@app.get("/corpus/analyze")
|
|
367
|
+
async def analyze_corpus():
|
|
368
|
+
"""
|
|
369
|
+
Analyze the entire corpus of documents.
|
|
370
|
+
|
|
371
|
+
Returns insights about:
|
|
372
|
+
- Document type distribution
|
|
373
|
+
- Common section patterns
|
|
374
|
+
- Average weights
|
|
375
|
+
- Optimization suggestions
|
|
376
|
+
|
|
377
|
+
Returns:
|
|
378
|
+
Corpus analysis results
|
|
379
|
+
"""
|
|
380
|
+
analysis = corpus_analyzer.analyze_corpus()
|
|
381
|
+
return analysis
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
@app.delete("/documents/{document_id}")
|
|
385
|
+
async def delete_document(document_id: str):
|
|
386
|
+
"""
|
|
387
|
+
Delete a document.
|
|
388
|
+
|
|
389
|
+
Args:
|
|
390
|
+
document_id: The document ID
|
|
391
|
+
|
|
392
|
+
Returns:
|
|
393
|
+
Deletion status
|
|
394
|
+
"""
|
|
395
|
+
success = document_store.delete(document_id)
|
|
396
|
+
if not success:
|
|
397
|
+
raise HTTPException(status_code=404, detail="Document not found")
|
|
398
|
+
|
|
399
|
+
return {"status": "deleted", "document_id": document_id}
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
@app.get("/search")
|
|
403
|
+
async def search_documents(
|
|
404
|
+
q: str,
|
|
405
|
+
enable_time_decay: bool = True,
|
|
406
|
+
decay_rate: float = 1.0
|
|
407
|
+
):
|
|
408
|
+
"""
|
|
409
|
+
Search documents by content or metadata with time-based decay ranking.
|
|
410
|
+
|
|
411
|
+
When time decay is enabled (default):
|
|
412
|
+
- Recent documents are ranked higher than old documents
|
|
413
|
+
- Formula: relevance_score = match_score * decay_factor
|
|
414
|
+
- Example: Yesterday's 80% match beats Last Year's 95% match
|
|
415
|
+
|
|
416
|
+
Args:
|
|
417
|
+
q: The search query
|
|
418
|
+
enable_time_decay: Apply time-based decay to ranking (default: True)
|
|
419
|
+
decay_rate: Rate of decay, higher = faster decay (default: 1.0)
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
Matching documents sorted by time-weighted relevance
|
|
423
|
+
"""
|
|
424
|
+
results = document_store.search(
|
|
425
|
+
q,
|
|
426
|
+
enable_time_decay=enable_time_decay,
|
|
427
|
+
decay_rate=decay_rate
|
|
428
|
+
)
|
|
429
|
+
|
|
430
|
+
return {
|
|
431
|
+
"query": q,
|
|
432
|
+
"enable_time_decay": enable_time_decay,
|
|
433
|
+
"decay_rate": decay_rate,
|
|
434
|
+
"total_results": len(results),
|
|
435
|
+
"documents": [
|
|
436
|
+
{
|
|
437
|
+
"id": doc.id,
|
|
438
|
+
"title": doc.title,
|
|
439
|
+
"type": doc.detected_type,
|
|
440
|
+
"format": doc.format,
|
|
441
|
+
"search_score": doc.metadata.get('_search_score', 0),
|
|
442
|
+
"decay_factor": doc.metadata.get('_decay_factor', 1.0),
|
|
443
|
+
"ingestion_timestamp": doc.ingestion_timestamp,
|
|
444
|
+
}
|
|
445
|
+
for doc in results
|
|
446
|
+
]
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
@app.post("/route")
|
|
451
|
+
async def route_query(request: RouteRequest):
|
|
452
|
+
"""
|
|
453
|
+
Route a query to the appropriate model tier using deterministic heuristics.
|
|
454
|
+
|
|
455
|
+
The Heuristic Router Philosophy:
|
|
456
|
+
Use Deterministic Heuristics, not AI Classifiers. We can solve 80% of routing
|
|
457
|
+
with simple logic that takes 0ms. The goal isn't 100% routing accuracy.
|
|
458
|
+
The goal is instant response time for the trivial stuff, preserving the
|
|
459
|
+
"Big Brain" budget for the hard stuff.
|
|
460
|
+
|
|
461
|
+
Routing Rules (in priority order):
|
|
462
|
+
1. Greetings ("Hi", "Thanks") → CANNED response (zero cost, instant)
|
|
463
|
+
2. Smart keywords ("Summarize", "Analyze", "Compare") → SMART model (GPT-4o)
|
|
464
|
+
3. Short queries (< 50 chars) → FAST model (GPT-4o-mini)
|
|
465
|
+
4. Long queries → SMART model (better safe than sorry)
|
|
466
|
+
|
|
467
|
+
Model Tiers:
|
|
468
|
+
- CANNED: Pre-defined responses for greetings (zero cost, 0ms latency)
|
|
469
|
+
- FAST: Fast model like GPT-4o-mini (low cost, ~200ms latency)
|
|
470
|
+
- SMART: Smart model like GPT-4o (high cost, ~500ms+ latency)
|
|
471
|
+
|
|
472
|
+
Args:
|
|
473
|
+
request: RouteRequest with the query to route
|
|
474
|
+
|
|
475
|
+
Returns:
|
|
476
|
+
RoutingDecision with tier, reason, confidence, and suggested model
|
|
477
|
+
"""
|
|
478
|
+
try:
|
|
479
|
+
decision = heuristic_router.route(request.query)
|
|
480
|
+
|
|
481
|
+
# If it's a canned response, include the actual response
|
|
482
|
+
response_data = decision.model_dump()
|
|
483
|
+
if decision.model_tier == ModelTier.CANNED:
|
|
484
|
+
canned_response = heuristic_router.get_canned_response(request.query)
|
|
485
|
+
if canned_response:
|
|
486
|
+
response_data["canned_response"] = canned_response
|
|
487
|
+
|
|
488
|
+
return response_data
|
|
489
|
+
|
|
490
|
+
except Exception as e:
|
|
491
|
+
raise HTTPException(status_code=500, detail=f"Routing failed: {str(e)}")
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
# ===========================
|
|
496
|
+
# Context Triad Endpoints
|
|
497
|
+
# ===========================
|
|
498
|
+
|
|
499
|
+
@app.post("/triad/hot")
|
|
500
|
+
async def add_hot_context(request: AddContextRequest):
|
|
501
|
+
"""
|
|
502
|
+
Add hot context - the current situation.
|
|
503
|
+
|
|
504
|
+
Hot context represents what is happening RIGHT NOW:
|
|
505
|
+
- Current conversation messages
|
|
506
|
+
- Open VS Code tabs
|
|
507
|
+
- Error logs streaming in real-time
|
|
508
|
+
- Active debugging session
|
|
509
|
+
|
|
510
|
+
Policy: "Attention Head" - Hot context overrides everything.
|
|
511
|
+
|
|
512
|
+
Args:
|
|
513
|
+
request: AddContextRequest with content, metadata, and priority
|
|
514
|
+
|
|
515
|
+
Returns:
|
|
516
|
+
Created item ID
|
|
517
|
+
"""
|
|
518
|
+
try:
|
|
519
|
+
item_id = triad_manager.add_hot_context(
|
|
520
|
+
request.content,
|
|
521
|
+
request.metadata,
|
|
522
|
+
request.priority
|
|
523
|
+
)
|
|
524
|
+
return {
|
|
525
|
+
"status": "success",
|
|
526
|
+
"layer": "hot",
|
|
527
|
+
"item_id": item_id,
|
|
528
|
+
"message": "Hot context added successfully"
|
|
529
|
+
}
|
|
530
|
+
except Exception as e:
|
|
531
|
+
raise HTTPException(status_code=500, detail=f"Failed to add hot context: {str(e)}")
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
@app.post("/triad/warm")
|
|
535
|
+
async def add_warm_context(request: AddContextRequest):
|
|
536
|
+
"""
|
|
537
|
+
Add warm context - the user persona.
|
|
538
|
+
|
|
539
|
+
Warm context represents WHO THE USER IS:
|
|
540
|
+
- LinkedIn profile
|
|
541
|
+
- Medium articles
|
|
542
|
+
- GitHub bio
|
|
543
|
+
- Coding style preferences
|
|
544
|
+
- Favorite libraries
|
|
545
|
+
- Communication style
|
|
546
|
+
|
|
547
|
+
Policy: "Always On Filter" - Warm context is persistent and colors
|
|
548
|
+
how the AI speaks to you.
|
|
549
|
+
|
|
550
|
+
Args:
|
|
551
|
+
request: AddContextRequest with content, metadata, and priority
|
|
552
|
+
|
|
553
|
+
Returns:
|
|
554
|
+
Created item ID
|
|
555
|
+
"""
|
|
556
|
+
try:
|
|
557
|
+
item_id = triad_manager.add_warm_context(
|
|
558
|
+
request.content,
|
|
559
|
+
request.metadata,
|
|
560
|
+
request.priority
|
|
561
|
+
)
|
|
562
|
+
return {
|
|
563
|
+
"status": "success",
|
|
564
|
+
"layer": "warm",
|
|
565
|
+
"item_id": item_id,
|
|
566
|
+
"message": "Warm context added successfully"
|
|
567
|
+
}
|
|
568
|
+
except Exception as e:
|
|
569
|
+
raise HTTPException(status_code=500, detail=f"Failed to add warm context: {str(e)}")
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
@app.post("/triad/cold")
|
|
573
|
+
async def add_cold_context(request: AddContextRequest):
|
|
574
|
+
"""
|
|
575
|
+
Add cold context - the historical archive.
|
|
576
|
+
|
|
577
|
+
Cold context represents WHAT HAPPENED IN THE PAST:
|
|
578
|
+
- Old tickets from last year
|
|
579
|
+
- Closed PRs
|
|
580
|
+
- Historical design docs
|
|
581
|
+
- Legacy system documentation
|
|
582
|
+
- Archived meeting notes
|
|
583
|
+
|
|
584
|
+
Policy: "On Demand Only" - Cold context is NEVER automatically included.
|
|
585
|
+
It's only fetched when the user explicitly asks for history.
|
|
586
|
+
|
|
587
|
+
Args:
|
|
588
|
+
request: AddContextRequest with content, metadata, and priority
|
|
589
|
+
|
|
590
|
+
Returns:
|
|
591
|
+
Created item ID
|
|
592
|
+
"""
|
|
593
|
+
try:
|
|
594
|
+
item_id = triad_manager.add_cold_context(
|
|
595
|
+
request.content,
|
|
596
|
+
request.metadata,
|
|
597
|
+
request.priority
|
|
598
|
+
)
|
|
599
|
+
return {
|
|
600
|
+
"status": "success",
|
|
601
|
+
"layer": "cold",
|
|
602
|
+
"item_id": item_id,
|
|
603
|
+
"message": "Cold context added successfully"
|
|
604
|
+
}
|
|
605
|
+
except Exception as e:
|
|
606
|
+
raise HTTPException(status_code=500, detail=f"Failed to add cold context: {str(e)}")
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
@app.post("/triad")
|
|
610
|
+
async def get_context_triad(request: ContextTriadRequest):
|
|
611
|
+
"""
|
|
612
|
+
Get the complete context triad.
|
|
613
|
+
|
|
614
|
+
The Context Triad follows these policies:
|
|
615
|
+
1. Hot Context: ALWAYS included (unless explicitly disabled)
|
|
616
|
+
- The Situation: what's happening right now
|
|
617
|
+
- Policy: "Attention Head" - overrides everything
|
|
618
|
+
|
|
619
|
+
2. Warm Context: ALWAYS ON (unless explicitly disabled)
|
|
620
|
+
- The Persona: who you are
|
|
621
|
+
- Policy: "Filter" - colors how AI speaks to you
|
|
622
|
+
|
|
623
|
+
3. Cold Context: ON DEMAND ONLY (requires explicit query)
|
|
624
|
+
- The Archive: what happened last year
|
|
625
|
+
- Policy: Never let cold data pollute the hot window
|
|
626
|
+
|
|
627
|
+
Args:
|
|
628
|
+
request: Context triad request with layer flags and query
|
|
629
|
+
|
|
630
|
+
Returns:
|
|
631
|
+
Context from requested layers
|
|
632
|
+
"""
|
|
633
|
+
try:
|
|
634
|
+
result = triad_manager.get_full_context(
|
|
635
|
+
include_hot=request.include_hot,
|
|
636
|
+
include_warm=request.include_warm,
|
|
637
|
+
include_cold=request.include_cold,
|
|
638
|
+
cold_query=request.query,
|
|
639
|
+
max_tokens_per_layer=request.max_tokens_per_layer,
|
|
640
|
+
include_metadata=True
|
|
641
|
+
)
|
|
642
|
+
|
|
643
|
+
response = ContextTriadResponse(
|
|
644
|
+
hot_context=result["hot_context"],
|
|
645
|
+
warm_context=result["warm_context"],
|
|
646
|
+
cold_context=result["cold_context"],
|
|
647
|
+
total_tokens=result["total_tokens"],
|
|
648
|
+
layers_included=result["layers_included"],
|
|
649
|
+
metadata=result["metadata"]
|
|
650
|
+
)
|
|
651
|
+
|
|
652
|
+
return response
|
|
653
|
+
except Exception as e:
|
|
654
|
+
raise HTTPException(status_code=500, detail=f"Failed to get context triad: {str(e)}")
|
|
655
|
+
|
|
656
|
+
|
|
657
|
+
@app.get("/triad/state")
|
|
658
|
+
async def get_triad_state():
|
|
659
|
+
"""
|
|
660
|
+
Get the current state of the context triad.
|
|
661
|
+
|
|
662
|
+
Returns:
|
|
663
|
+
Current context triad state with item counts
|
|
664
|
+
"""
|
|
665
|
+
state = triad_manager.get_state()
|
|
666
|
+
return {
|
|
667
|
+
"hot_context_items": len(state.hot_context),
|
|
668
|
+
"warm_context_items": len(state.warm_context),
|
|
669
|
+
"cold_context_items": len(state.cold_context),
|
|
670
|
+
"total_items": len(state.hot_context) + len(state.warm_context) + len(state.cold_context)
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
|
|
674
|
+
@app.delete("/triad/hot")
|
|
675
|
+
async def clear_hot_context():
|
|
676
|
+
"""Clear all hot context items."""
|
|
677
|
+
triad_manager.clear_hot_context()
|
|
678
|
+
return {"status": "success", "message": "Hot context cleared"}
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
@app.delete("/triad/warm")
|
|
682
|
+
async def clear_warm_context():
|
|
683
|
+
"""Clear all warm context items."""
|
|
684
|
+
triad_manager.clear_warm_context()
|
|
685
|
+
return {"status": "success", "message": "Warm context cleared"}
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
@app.delete("/triad/cold")
|
|
689
|
+
async def clear_cold_context():
|
|
690
|
+
"""Clear all cold context items."""
|
|
691
|
+
triad_manager.clear_cold_context()
|
|
692
|
+
return {"status": "success", "message": "Cold context cleared"}
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
@app.delete("/triad")
|
|
696
|
+
async def clear_all_context():
|
|
697
|
+
"""Clear all context layers."""
|
|
698
|
+
triad_manager.clear_all()
|
|
699
|
+
return {"status": "success", "message": "All context cleared"}
|
|
700
|
+
|
|
701
|
+
|
|
702
|
+
# ===========================
|
|
703
|
+
# Conversation Manager Endpoints (Sliding Window / FIFO)
|
|
704
|
+
# ===========================
|
|
705
|
+
|
|
706
|
+
@app.post("/conversation/turn")
|
|
707
|
+
async def add_conversation_turn(request: AddTurnRequest):
|
|
708
|
+
"""
|
|
709
|
+
Add a conversation turn to the history using Sliding Window (FIFO).
|
|
710
|
+
|
|
711
|
+
The Brutal Squeeze Philosophy:
|
|
712
|
+
Instead of asking an AI to summarize conversation history (which costs money
|
|
713
|
+
and loses nuance), we use a brutal "Sliding Window" approach:
|
|
714
|
+
- Keep the last 10 turns perfectly intact
|
|
715
|
+
- Delete turn 11 (FIFO - First In First Out)
|
|
716
|
+
- No summarization = No lossy compression
|
|
717
|
+
|
|
718
|
+
Why this works:
|
|
719
|
+
- Users rarely refer back to what they said 20 minutes ago
|
|
720
|
+
- They constantly refer to the exact code snippet they pasted 30 seconds ago
|
|
721
|
+
- Summary = Lossy Compression (loses specific error codes, exact wording)
|
|
722
|
+
- Chopping = Lossless Compression (of the recent past)
|
|
723
|
+
|
|
724
|
+
Example:
|
|
725
|
+
Turn 1: "I tried X and it failed with error code 500"
|
|
726
|
+
With Summarization: "User attempted troubleshooting" (ERROR CODE LOST!)
|
|
727
|
+
With Chopping: After 10 new turns, this is deleted entirely
|
|
728
|
+
But turns 2-11 are perfectly intact with all details
|
|
729
|
+
|
|
730
|
+
Args:
|
|
731
|
+
request: AddTurnRequest with user_message, ai_response, and metadata
|
|
732
|
+
|
|
733
|
+
Returns:
|
|
734
|
+
Created turn ID and current conversation statistics
|
|
735
|
+
"""
|
|
736
|
+
try:
|
|
737
|
+
turn_id = conversation_manager.add_turn(
|
|
738
|
+
user_message=request.user_message,
|
|
739
|
+
ai_response=request.ai_response,
|
|
740
|
+
metadata=request.metadata
|
|
741
|
+
)
|
|
742
|
+
|
|
743
|
+
stats = conversation_manager.get_statistics()
|
|
744
|
+
|
|
745
|
+
return {
|
|
746
|
+
"status": "success",
|
|
747
|
+
"turn_id": turn_id,
|
|
748
|
+
"message": "Conversation turn added successfully",
|
|
749
|
+
"statistics": stats
|
|
750
|
+
}
|
|
751
|
+
except Exception as e:
|
|
752
|
+
raise HTTPException(status_code=500, detail=f"Failed to add turn: {str(e)}")
|
|
753
|
+
|
|
754
|
+
|
|
755
|
+
@app.get("/conversation")
|
|
756
|
+
async def get_conversation_history(
|
|
757
|
+
format_text: bool = True,
|
|
758
|
+
include_metadata: bool = False
|
|
759
|
+
):
|
|
760
|
+
"""
|
|
761
|
+
Get the conversation history (last N turns).
|
|
762
|
+
|
|
763
|
+
Returns the history in FIFO order (oldest to newest).
|
|
764
|
+
All turns are perfectly intact - no summarization, no loss.
|
|
765
|
+
|
|
766
|
+
The Sliding Window ensures:
|
|
767
|
+
1. Recent precision: Last N turns are perfectly intact
|
|
768
|
+
2. Zero summarization cost: No AI calls needed
|
|
769
|
+
3. No information loss: What's kept is lossless
|
|
770
|
+
4. Predictable behavior: Always know what's in context
|
|
771
|
+
|
|
772
|
+
Philosophy: In a frugal architecture, we value Recent Precision over Vague History.
|
|
773
|
+
|
|
774
|
+
Args:
|
|
775
|
+
format_text: If True, return formatted text; if False, return structured data
|
|
776
|
+
include_metadata: Whether to include metadata in text format
|
|
777
|
+
|
|
778
|
+
Returns:
|
|
779
|
+
Conversation history (formatted or structured)
|
|
780
|
+
"""
|
|
781
|
+
try:
|
|
782
|
+
if format_text:
|
|
783
|
+
history_text = conversation_manager.get_conversation_history(
|
|
784
|
+
include_metadata=include_metadata,
|
|
785
|
+
format_as_text=True
|
|
786
|
+
)
|
|
787
|
+
return {"history": history_text}
|
|
788
|
+
else:
|
|
789
|
+
turns = conversation_manager.get_conversation_history(format_as_text=False)
|
|
790
|
+
stats = conversation_manager.get_statistics()
|
|
791
|
+
|
|
792
|
+
return ConversationHistoryResponse(
|
|
793
|
+
turns=turns,
|
|
794
|
+
total_turns=len(turns),
|
|
795
|
+
max_turns=conversation_manager.state.max_turns,
|
|
796
|
+
total_turns_ever=conversation_manager.state.total_turns_ever,
|
|
797
|
+
oldest_turn_timestamp=turns[0].timestamp if turns else None,
|
|
798
|
+
newest_turn_timestamp=turns[-1].timestamp if turns else None
|
|
799
|
+
)
|
|
800
|
+
except Exception as e:
|
|
801
|
+
raise HTTPException(status_code=500, detail=f"Failed to get history: {str(e)}")
|
|
802
|
+
|
|
803
|
+
|
|
804
|
+
@app.get("/conversation/stats")
|
|
805
|
+
async def get_conversation_statistics():
|
|
806
|
+
"""
|
|
807
|
+
Get statistics about the conversation history.
|
|
808
|
+
|
|
809
|
+
Returns:
|
|
810
|
+
Statistics including current turns, deleted turns, and timestamps
|
|
811
|
+
"""
|
|
812
|
+
try:
|
|
813
|
+
stats = conversation_manager.get_statistics()
|
|
814
|
+
return {
|
|
815
|
+
"status": "success",
|
|
816
|
+
"statistics": stats,
|
|
817
|
+
"sliding_window_info": {
|
|
818
|
+
"max_turns": conversation_manager.state.max_turns,
|
|
819
|
+
"policy": "FIFO (First In First Out)",
|
|
820
|
+
"philosophy": "Chopping > Summarizing",
|
|
821
|
+
"benefits": [
|
|
822
|
+
"Recent precision: Last N turns perfectly intact",
|
|
823
|
+
"Zero AI cost: No summarization needed",
|
|
824
|
+
"No information loss: Lossless compression of recent past",
|
|
825
|
+
"Predictable: Always know what's in context"
|
|
826
|
+
]
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
except Exception as e:
|
|
830
|
+
raise HTTPException(status_code=500, detail=f"Failed to get stats: {str(e)}")
|
|
831
|
+
|
|
832
|
+
|
|
833
|
+
@app.get("/conversation/recent")
|
|
834
|
+
async def get_recent_turns(n: int = 5):
|
|
835
|
+
"""
|
|
836
|
+
Get the N most recent conversation turns.
|
|
837
|
+
|
|
838
|
+
Args:
|
|
839
|
+
n: Number of recent turns to retrieve (default: 5)
|
|
840
|
+
|
|
841
|
+
Returns:
|
|
842
|
+
Recent conversation turns
|
|
843
|
+
"""
|
|
844
|
+
try:
|
|
845
|
+
turns = conversation_manager.get_recent_turns(n=n)
|
|
846
|
+
return {
|
|
847
|
+
"status": "success",
|
|
848
|
+
"recent_turns": turns,
|
|
849
|
+
"count": len(turns),
|
|
850
|
+
"requested": n
|
|
851
|
+
}
|
|
852
|
+
except Exception as e:
|
|
853
|
+
raise HTTPException(status_code=500, detail=f"Failed to get recent turns: {str(e)}")
|
|
854
|
+
|
|
855
|
+
|
|
856
|
+
@app.patch("/conversation/turn/{turn_id}")
|
|
857
|
+
async def update_turn_response(turn_id: str, request: UpdateTurnRequest):
|
|
858
|
+
"""
|
|
859
|
+
Update the AI response for a specific turn.
|
|
860
|
+
|
|
861
|
+
Useful when you add a turn with just the user message
|
|
862
|
+
and want to update it with the AI response later.
|
|
863
|
+
|
|
864
|
+
Args:
|
|
865
|
+
turn_id: The ID of the turn to update
|
|
866
|
+
request: UpdateTurnRequest with the AI response
|
|
867
|
+
|
|
868
|
+
Returns:
|
|
869
|
+
Update status
|
|
870
|
+
"""
|
|
871
|
+
try:
|
|
872
|
+
success = conversation_manager.update_turn_response(turn_id, request.ai_response)
|
|
873
|
+
if success:
|
|
874
|
+
return {
|
|
875
|
+
"status": "success",
|
|
876
|
+
"turn_id": turn_id,
|
|
877
|
+
"message": "AI response updated successfully"
|
|
878
|
+
}
|
|
879
|
+
else:
|
|
880
|
+
raise HTTPException(status_code=404, detail="Turn not found")
|
|
881
|
+
except HTTPException:
|
|
882
|
+
raise
|
|
883
|
+
except Exception as e:
|
|
884
|
+
raise HTTPException(status_code=500, detail=f"Failed to update turn: {str(e)}")
|
|
885
|
+
|
|
886
|
+
|
|
887
|
+
@app.delete("/conversation")
|
|
888
|
+
async def clear_conversation():
|
|
889
|
+
"""
|
|
890
|
+
Clear all conversation history.
|
|
891
|
+
|
|
892
|
+
Note: The total_turns_ever counter is preserved to track
|
|
893
|
+
how many turns have been processed across the lifetime.
|
|
894
|
+
|
|
895
|
+
Returns:
|
|
896
|
+
Deletion status
|
|
897
|
+
"""
|
|
898
|
+
try:
|
|
899
|
+
conversation_manager.clear_conversation()
|
|
900
|
+
return {
|
|
901
|
+
"status": "success",
|
|
902
|
+
"message": "Conversation history cleared",
|
|
903
|
+
"total_turns_ever": conversation_manager.state.total_turns_ever
|
|
904
|
+
}
|
|
905
|
+
except Exception as e:
|
|
906
|
+
raise HTTPException(status_code=500, detail=f"Failed to clear conversation: {str(e)}")
|
|
907
|
+
|
|
908
|
+
|
|
909
|
+
# ===========================
|
|
910
|
+
# Trust Gateway Endpoints
|
|
911
|
+
# ===========================
|
|
912
|
+
|
|
913
|
+
@app.get("/gateway")
|
|
914
|
+
async def gateway_status():
|
|
915
|
+
"""
|
|
916
|
+
Get Trust Gateway status and deployment information.
|
|
917
|
+
|
|
918
|
+
The Trust Gateway addresses the "Middleware Gap" by providing an
|
|
919
|
+
enterprise-grade, on-premises / private cloud router that CISOs can trust.
|
|
920
|
+
|
|
921
|
+
Philosophy:
|
|
922
|
+
No Enterprise CISO will send proprietary data to a random middleware startup.
|
|
923
|
+
The Trust Gateway can be deployed within your own infrastructure, ensuring:
|
|
924
|
+
- Data never leaves your environment
|
|
925
|
+
- Full audit trail for compliance
|
|
926
|
+
- Zero third-party data sharing
|
|
927
|
+
- Enterprise-grade security controls
|
|
928
|
+
|
|
929
|
+
Returns:
|
|
930
|
+
Trust Gateway deployment information and security status
|
|
931
|
+
"""
|
|
932
|
+
try:
|
|
933
|
+
info = trust_gateway.get_deployment_info()
|
|
934
|
+
return {
|
|
935
|
+
"status": "operational",
|
|
936
|
+
"gateway_type": "Trust Gateway (Enterprise Private Cloud Router)",
|
|
937
|
+
"philosophy": "The winner won't be the one with the smartest routing; "
|
|
938
|
+
"it will be the one the Enterprise trusts with the keys to the kingdom.",
|
|
939
|
+
**info
|
|
940
|
+
}
|
|
941
|
+
except Exception as e:
|
|
942
|
+
raise HTTPException(status_code=500, detail=f"Failed to get gateway status: {str(e)}")
|
|
943
|
+
|
|
944
|
+
|
|
945
|
+
@app.post("/gateway/route")
|
|
946
|
+
async def gateway_route_request(
|
|
947
|
+
request: RouteRequest,
|
|
948
|
+
user_id: Optional[str] = None,
|
|
949
|
+
data_classification: Optional[str] = None
|
|
950
|
+
):
|
|
951
|
+
"""
|
|
952
|
+
Route a request through the Trust Gateway with enterprise security controls.
|
|
953
|
+
|
|
954
|
+
The Trust Gateway provides:
|
|
955
|
+
1. On-Premises / Private Cloud deployment
|
|
956
|
+
2. Zero data leakage (data never leaves your infrastructure)
|
|
957
|
+
3. Full audit trail for compliance
|
|
958
|
+
4. Configurable security policies
|
|
959
|
+
5. Authentication and authorization
|
|
960
|
+
6. Data classification and encryption
|
|
961
|
+
|
|
962
|
+
This endpoint validates the request against security policies, performs
|
|
963
|
+
heuristic routing, and logs all activity for compliance.
|
|
964
|
+
|
|
965
|
+
Example Use Case:
|
|
966
|
+
Enterprise CISO requirement: "We cannot send our proprietary financial data
|
|
967
|
+
to an external middleware service." Solution: Deploy Trust Gateway in your
|
|
968
|
+
own infrastructure. All routing decisions happen locally with zero external calls.
|
|
969
|
+
|
|
970
|
+
Args:
|
|
971
|
+
request: RouteRequest with the query to route
|
|
972
|
+
user_id: User ID making the request (for authentication)
|
|
973
|
+
data_classification: Classification level (public, internal, confidential, secret)
|
|
974
|
+
|
|
975
|
+
Returns:
|
|
976
|
+
Routing decision with security context and audit trail
|
|
977
|
+
"""
|
|
978
|
+
try:
|
|
979
|
+
result = trust_gateway.route_request(
|
|
980
|
+
query=request.query,
|
|
981
|
+
user_id=user_id,
|
|
982
|
+
data_classification=data_classification
|
|
983
|
+
)
|
|
984
|
+
return result
|
|
985
|
+
except Exception as e:
|
|
986
|
+
raise HTTPException(status_code=500, detail=f"Gateway routing failed: {str(e)}")
|
|
987
|
+
|
|
988
|
+
|
|
989
|
+
@app.get("/gateway/info")
|
|
990
|
+
async def gateway_deployment_info():
|
|
991
|
+
"""
|
|
992
|
+
Get detailed Trust Gateway deployment and security information.
|
|
993
|
+
|
|
994
|
+
Returns comprehensive information about:
|
|
995
|
+
- Deployment mode (on-prem, private cloud, hybrid, air-gapped)
|
|
996
|
+
- Security level and policies
|
|
997
|
+
- Data retention settings
|
|
998
|
+
- Encryption status
|
|
999
|
+
- Compliance mode
|
|
1000
|
+
- Trust guarantees
|
|
1001
|
+
|
|
1002
|
+
Returns:
|
|
1003
|
+
Detailed deployment and security configuration
|
|
1004
|
+
"""
|
|
1005
|
+
try:
|
|
1006
|
+
info = trust_gateway.get_deployment_info()
|
|
1007
|
+
return {
|
|
1008
|
+
"gateway_info": info,
|
|
1009
|
+
"deployment_modes": {
|
|
1010
|
+
"on_prem": "Deployed on customer's own servers (maximum control)",
|
|
1011
|
+
"private_cloud": "Deployed in customer's private cloud (AWS VPC, Azure VNet, GCP VPC)",
|
|
1012
|
+
"hybrid": "Hybrid deployment with local processing and cloud backup",
|
|
1013
|
+
"air_gapped": "Completely isolated from internet (maximum security)"
|
|
1014
|
+
},
|
|
1015
|
+
"security_levels": {
|
|
1016
|
+
"standard": "Basic security controls",
|
|
1017
|
+
"high": "Enhanced security (encryption at rest and in transit)",
|
|
1018
|
+
"maximum": "Maximum security (air-gapped, zero data retention)"
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
except Exception as e:
|
|
1022
|
+
raise HTTPException(status_code=500, detail=f"Failed to get deployment info: {str(e)}")
|
|
1023
|
+
|
|
1024
|
+
|
|
1025
|
+
@app.get("/gateway/audit")
|
|
1026
|
+
async def gateway_audit_logs(
|
|
1027
|
+
event_type: Optional[str] = None,
|
|
1028
|
+
user_id: Optional[str] = None,
|
|
1029
|
+
start_time: Optional[str] = None,
|
|
1030
|
+
end_time: Optional[str] = None
|
|
1031
|
+
):
|
|
1032
|
+
"""
|
|
1033
|
+
Retrieve Trust Gateway audit logs for compliance and security monitoring.
|
|
1034
|
+
|
|
1035
|
+
Audit logs include:
|
|
1036
|
+
- All routing decisions
|
|
1037
|
+
- Request validation events
|
|
1038
|
+
- Security policy changes
|
|
1039
|
+
- Data access events
|
|
1040
|
+
- User authentication attempts
|
|
1041
|
+
|
|
1042
|
+
This endpoint supports filtering by:
|
|
1043
|
+
- Event type (e.g., "request_routed", "policy_changed")
|
|
1044
|
+
- User ID
|
|
1045
|
+
- Time range (ISO format timestamps)
|
|
1046
|
+
|
|
1047
|
+
Example Use Cases:
|
|
1048
|
+
- Compliance audits (GDPR, HIPAA, SOC2)
|
|
1049
|
+
- Security incident investigation
|
|
1050
|
+
- User activity monitoring
|
|
1051
|
+
- Policy change tracking
|
|
1052
|
+
|
|
1053
|
+
Args:
|
|
1054
|
+
event_type: Filter by event type
|
|
1055
|
+
user_id: Filter by user ID
|
|
1056
|
+
start_time: Start of time range (ISO format)
|
|
1057
|
+
end_time: End of time range (ISO format)
|
|
1058
|
+
|
|
1059
|
+
Returns:
|
|
1060
|
+
Filtered audit log entries
|
|
1061
|
+
"""
|
|
1062
|
+
try:
|
|
1063
|
+
logs = trust_gateway.get_audit_logs(
|
|
1064
|
+
event_type=event_type,
|
|
1065
|
+
user_id=user_id,
|
|
1066
|
+
start_time=start_time,
|
|
1067
|
+
end_time=end_time
|
|
1068
|
+
)
|
|
1069
|
+
|
|
1070
|
+
return {
|
|
1071
|
+
"status": "success",
|
|
1072
|
+
"total_logs": len(logs),
|
|
1073
|
+
"filters_applied": {
|
|
1074
|
+
"event_type": event_type,
|
|
1075
|
+
"user_id": user_id,
|
|
1076
|
+
"start_time": start_time,
|
|
1077
|
+
"end_time": end_time
|
|
1078
|
+
},
|
|
1079
|
+
"audit_logs": logs
|
|
1080
|
+
}
|
|
1081
|
+
except Exception as e:
|
|
1082
|
+
raise HTTPException(status_code=500, detail=f"Failed to retrieve audit logs: {str(e)}")
|
|
1083
|
+
|
|
1084
|
+
|
|
1085
|
+
@app.post("/gateway/validate")
|
|
1086
|
+
async def gateway_validate_request(
|
|
1087
|
+
query: str,
|
|
1088
|
+
user_id: Optional[str] = None,
|
|
1089
|
+
ip_address: Optional[str] = None,
|
|
1090
|
+
data_classification: Optional[str] = None
|
|
1091
|
+
):
|
|
1092
|
+
"""
|
|
1093
|
+
Validate a request against Trust Gateway security policies.
|
|
1094
|
+
|
|
1095
|
+
This endpoint checks:
|
|
1096
|
+
- Authentication requirements
|
|
1097
|
+
- User authorization (allowed users list)
|
|
1098
|
+
- IP address restrictions
|
|
1099
|
+
- Data classification requirements
|
|
1100
|
+
- Encryption requirements
|
|
1101
|
+
|
|
1102
|
+
Useful for pre-flight validation before sending actual requests.
|
|
1103
|
+
|
|
1104
|
+
Args:
|
|
1105
|
+
query: The query to validate
|
|
1106
|
+
user_id: User ID making the request
|
|
1107
|
+
ip_address: IP address of the requester
|
|
1108
|
+
data_classification: Data classification level
|
|
1109
|
+
|
|
1110
|
+
Returns:
|
|
1111
|
+
Validation result with status, warnings, and violations
|
|
1112
|
+
"""
|
|
1113
|
+
try:
|
|
1114
|
+
validation = trust_gateway.validate_request(
|
|
1115
|
+
request_data={"query": query},
|
|
1116
|
+
user_id=user_id,
|
|
1117
|
+
ip_address=ip_address,
|
|
1118
|
+
data_classification=data_classification
|
|
1119
|
+
)
|
|
1120
|
+
|
|
1121
|
+
return {
|
|
1122
|
+
"status": "success" if validation["valid"] else "failed",
|
|
1123
|
+
"valid": validation["valid"],
|
|
1124
|
+
"warnings": validation["warnings"],
|
|
1125
|
+
"violations": validation["violations"],
|
|
1126
|
+
"timestamp": datetime.utcnow().isoformat()
|
|
1127
|
+
}
|
|
1128
|
+
except Exception as e:
|
|
1129
|
+
raise HTTPException(status_code=500, detail=f"Validation failed: {str(e)}")
|
|
1130
|
+
|
|
1131
|
+
|
|
1132
|
+
@app.delete("/gateway/audit")
|
|
1133
|
+
async def gateway_clear_audit_logs(user_id: Optional[str] = None):
|
|
1134
|
+
"""
|
|
1135
|
+
Clear Trust Gateway audit logs.
|
|
1136
|
+
|
|
1137
|
+
Note: This operation itself is logged before clearing.
|
|
1138
|
+
Requires proper authorization in production environments.
|
|
1139
|
+
|
|
1140
|
+
Args:
|
|
1141
|
+
user_id: User ID requesting the clear operation
|
|
1142
|
+
|
|
1143
|
+
Returns:
|
|
1144
|
+
Clear operation status
|
|
1145
|
+
"""
|
|
1146
|
+
try:
|
|
1147
|
+
result = trust_gateway.clear_audit_logs(user_id=user_id)
|
|
1148
|
+
return result
|
|
1149
|
+
except Exception as e:
|
|
1150
|
+
raise HTTPException(status_code=500, detail=f"Failed to clear audit logs: {str(e)}")
|
|
1151
|
+
|
|
1152
|
+
|
|
1153
|
+
# ============================================================================
|
|
1154
|
+
# Virtual File System Endpoints
|
|
1155
|
+
# ============================================================================
|
|
1156
|
+
|
|
1157
|
+
@app.post("/vfs/files", response_model=FileResponse, tags=["vfs"])
|
|
1158
|
+
async def create_vfs_file(request: CreateFileRequest):
|
|
1159
|
+
"""
|
|
1160
|
+
Create a new file in the Virtual File System.
|
|
1161
|
+
|
|
1162
|
+
Allows SDLC agents to create files in shared project state.
|
|
1163
|
+
All agents can see files created by other agents.
|
|
1164
|
+
"""
|
|
1165
|
+
try:
|
|
1166
|
+
file_node = vfs.create_file(
|
|
1167
|
+
path=request.path,
|
|
1168
|
+
content=request.content,
|
|
1169
|
+
agent_id=request.agent_id,
|
|
1170
|
+
metadata=request.metadata,
|
|
1171
|
+
)
|
|
1172
|
+
|
|
1173
|
+
return FileResponse(
|
|
1174
|
+
path=file_node.path,
|
|
1175
|
+
file_type=file_node.file_type,
|
|
1176
|
+
content=file_node.content,
|
|
1177
|
+
metadata=file_node.metadata,
|
|
1178
|
+
created_by=file_node.created_by,
|
|
1179
|
+
created_at=file_node.created_at,
|
|
1180
|
+
modified_by=file_node.modified_by,
|
|
1181
|
+
modified_at=file_node.modified_at,
|
|
1182
|
+
edit_count=len(file_node.edit_history),
|
|
1183
|
+
)
|
|
1184
|
+
except ValueError as e:
|
|
1185
|
+
raise HTTPException(status_code=400, detail=str(e))
|
|
1186
|
+
|
|
1187
|
+
|
|
1188
|
+
@app.get("/vfs/files", response_model=FileResponse, tags=["vfs"])
|
|
1189
|
+
async def read_vfs_file(path: str):
|
|
1190
|
+
"""
|
|
1191
|
+
Read a file from the Virtual File System.
|
|
1192
|
+
|
|
1193
|
+
Agents can read files created or modified by other agents,
|
|
1194
|
+
ensuring shared visibility of project state.
|
|
1195
|
+
"""
|
|
1196
|
+
try:
|
|
1197
|
+
content = vfs.read_file(path)
|
|
1198
|
+
info = vfs.get_file_info(path)
|
|
1199
|
+
return info
|
|
1200
|
+
except FileNotFoundError as e:
|
|
1201
|
+
raise HTTPException(status_code=404, detail=str(e))
|
|
1202
|
+
except ValueError as e:
|
|
1203
|
+
raise HTTPException(status_code=400, detail=str(e))
|
|
1204
|
+
|
|
1205
|
+
|
|
1206
|
+
@app.put("/vfs/files", response_model=FileResponse, tags=["vfs"])
|
|
1207
|
+
async def update_vfs_file(request: UpdateFileRequest):
|
|
1208
|
+
"""
|
|
1209
|
+
Update an existing file in the Virtual File System.
|
|
1210
|
+
|
|
1211
|
+
Agents can update files and other agents will immediately see
|
|
1212
|
+
the changes. Edit history is maintained for auditability.
|
|
1213
|
+
"""
|
|
1214
|
+
try:
|
|
1215
|
+
file_node = vfs.update_file(
|
|
1216
|
+
path=request.path,
|
|
1217
|
+
content=request.content,
|
|
1218
|
+
agent_id=request.agent_id,
|
|
1219
|
+
message=request.message,
|
|
1220
|
+
)
|
|
1221
|
+
|
|
1222
|
+
return FileResponse(
|
|
1223
|
+
path=file_node.path,
|
|
1224
|
+
file_type=file_node.file_type,
|
|
1225
|
+
content=file_node.content,
|
|
1226
|
+
metadata=file_node.metadata,
|
|
1227
|
+
created_by=file_node.created_by,
|
|
1228
|
+
created_at=file_node.created_at,
|
|
1229
|
+
modified_by=file_node.modified_by,
|
|
1230
|
+
modified_at=file_node.modified_at,
|
|
1231
|
+
edit_count=len(file_node.edit_history),
|
|
1232
|
+
)
|
|
1233
|
+
except FileNotFoundError as e:
|
|
1234
|
+
raise HTTPException(status_code=404, detail=str(e))
|
|
1235
|
+
except ValueError as e:
|
|
1236
|
+
raise HTTPException(status_code=400, detail=str(e))
|
|
1237
|
+
|
|
1238
|
+
|
|
1239
|
+
@app.delete("/vfs/files", tags=["vfs"])
|
|
1240
|
+
async def delete_vfs_file(path: str, agent_id: str):
|
|
1241
|
+
"""
|
|
1242
|
+
Delete a file from the Virtual File System.
|
|
1243
|
+
|
|
1244
|
+
Removes a file from the shared project state.
|
|
1245
|
+
"""
|
|
1246
|
+
try:
|
|
1247
|
+
vfs.delete_file(path, agent_id)
|
|
1248
|
+
return {"status": "deleted", "path": path}
|
|
1249
|
+
except FileNotFoundError as e:
|
|
1250
|
+
raise HTTPException(status_code=404, detail=str(e))
|
|
1251
|
+
except ValueError as e:
|
|
1252
|
+
raise HTTPException(status_code=400, detail=str(e))
|
|
1253
|
+
|
|
1254
|
+
|
|
1255
|
+
@app.get("/vfs/list", response_model=FileListResponse, tags=["vfs"])
|
|
1256
|
+
async def list_vfs_files(path: str = "/", recursive: bool = False):
|
|
1257
|
+
"""
|
|
1258
|
+
List files in a directory within the Virtual File System.
|
|
1259
|
+
|
|
1260
|
+
Agents can browse the project structure to understand
|
|
1261
|
+
what files exist and have been created by other agents.
|
|
1262
|
+
"""
|
|
1263
|
+
try:
|
|
1264
|
+
return vfs.list_files(path, recursive)
|
|
1265
|
+
except FileNotFoundError as e:
|
|
1266
|
+
raise HTTPException(status_code=404, detail=str(e))
|
|
1267
|
+
except ValueError as e:
|
|
1268
|
+
raise HTTPException(status_code=400, detail=str(e))
|
|
1269
|
+
|
|
1270
|
+
|
|
1271
|
+
@app.get("/vfs/history", tags=["vfs"])
|
|
1272
|
+
async def get_vfs_file_history(path: str):
|
|
1273
|
+
"""
|
|
1274
|
+
Get the edit history of a file.
|
|
1275
|
+
|
|
1276
|
+
Shows all edits made to a file, including which agents
|
|
1277
|
+
made changes and when. Useful for understanding how a
|
|
1278
|
+
file evolved through multi-agent collaboration.
|
|
1279
|
+
"""
|
|
1280
|
+
try:
|
|
1281
|
+
history = vfs.get_file_history(path)
|
|
1282
|
+
return {
|
|
1283
|
+
"path": path,
|
|
1284
|
+
"edit_count": len(history),
|
|
1285
|
+
"history": [
|
|
1286
|
+
{
|
|
1287
|
+
"agent_id": edit.agent_id,
|
|
1288
|
+
"timestamp": edit.timestamp,
|
|
1289
|
+
"message": edit.message,
|
|
1290
|
+
"content_preview": edit.content[:100] + "..." if len(edit.content) > 100 else edit.content,
|
|
1291
|
+
}
|
|
1292
|
+
for edit in history
|
|
1293
|
+
]
|
|
1294
|
+
}
|
|
1295
|
+
except FileNotFoundError as e:
|
|
1296
|
+
raise HTTPException(status_code=404, detail=str(e))
|
|
1297
|
+
|
|
1298
|
+
|
|
1299
|
+
@app.get("/vfs/state", tags=["vfs"])
|
|
1300
|
+
async def get_vfs_state():
|
|
1301
|
+
"""
|
|
1302
|
+
Get the complete Virtual File System state.
|
|
1303
|
+
|
|
1304
|
+
Returns the entire file system state, useful for debugging
|
|
1305
|
+
or snapshotting the current project state.
|
|
1306
|
+
"""
|
|
1307
|
+
state = vfs.get_state()
|
|
1308
|
+
return {
|
|
1309
|
+
"root_path": state.root_path,
|
|
1310
|
+
"file_count": len(state.files),
|
|
1311
|
+
"files": [
|
|
1312
|
+
{
|
|
1313
|
+
"path": node.path,
|
|
1314
|
+
"type": node.file_type,
|
|
1315
|
+
"created_by": node.created_by,
|
|
1316
|
+
"modified_by": node.modified_by,
|
|
1317
|
+
"edit_count": len(node.edit_history),
|
|
1318
|
+
}
|
|
1319
|
+
for node in state.files.values()
|
|
1320
|
+
]
|
|
1321
|
+
}
|
|
1322
|
+
|
|
1323
|
+
|
|
1324
|
+
if __name__ == "__main__":
|
|
1325
|
+
import uvicorn
|
|
1326
|
+
uvicorn.run(app, host="0.0.0.0", port=8000)
|