agent-framework-lib 0.8.6.post2__tar.gz → 0.8.7__tar.gz
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_framework_lib-0.8.6.post2/agent_framework_lib.egg-info → agent_framework_lib-0.8.7}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/__init__.py +36 -6
- agent_framework_lib-0.8.7/agent_framework/code_delivery/__init__.py +45 -0
- agent_framework_lib-0.8.7/agent_framework/code_delivery/audit.py +371 -0
- agent_framework_lib-0.8.7/agent_framework/code_delivery/config.py +146 -0
- agent_framework_lib-0.8.7/agent_framework/code_delivery/git_provider.py +267 -0
- agent_framework_lib-0.8.7/agent_framework/code_delivery/herdr_client.py +223 -0
- agent_framework_lib-0.8.7/agent_framework/code_delivery/models.py +163 -0
- agent_framework_lib-0.8.7/agent_framework/code_delivery/orchestrator.py +579 -0
- agent_framework_lib-0.8.7/agent_framework/code_delivery/tools.py +172 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/implementations/budget_aware_agent.py +37 -2
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/session/elasticsearch_session_storage.py +39 -4
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/session/session_storage.py +22 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/__init__.py +27 -0
- agent_framework_lib-0.8.7/agent_framework/skills/builtin/skills/code_delivery/SKILL.md +74 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/markdown_loader.py +48 -1
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/tools.py +22 -6
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7/agent_framework/web}/docs/CUSTOM_SKILLS_GUIDE.md +2 -1
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/server.py +155 -57
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/router.py +27 -3
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7/agent_framework_lib.egg-info}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework_lib.egg-info/SOURCES.txt +9 -0
- {agent_framework_lib-0.8.6.post2/agent_framework/web → agent_framework_lib-0.8.7}/docs/CUSTOM_SKILLS_GUIDE.md +2 -1
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/pyproject.toml +1 -1
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/ARCHITECTURE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/LICENSE +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/MANIFEST.in +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/README.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/base.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/endpoints/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/models.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/a2a/providers/postgres_provider.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/capabilities/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/capabilities/resolver.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/activity_formatter.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/agent_interface.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/agent_provider.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/base_agent.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/context_budget.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/context_summarizer.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/elasticsearch_config_provider.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/execution_controller.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/implementation_validator.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/interruption_message.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/knowledge_state.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/loop_detector.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/model_clients.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/model_config.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/model_router.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/models.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/prompt_builder.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/provider_calibration.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/scratchpad_compressor.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/scratchpad_serializer.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/state_manager.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/step_display_config.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/core/streaming_parts_accumulator.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/implementations/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/implementations/llamaindex_agent.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/implementations/microsoft_agent.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/base.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/config.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/hypothesis_engine.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/implicit_feedback.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/manager.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/personalization.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/providers/graphiti_provider.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/providers/memori_provider.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/response_lessons.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/tools.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/memory/work_patterns.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/api_timing_tracker.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/error_handling.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/error_logging.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/llm_metrics.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/llm_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/metrics_aggregator.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/metrics_config.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/observability_manager.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/otel_instrumentor.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/otel_logging_handler.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/otel_setup.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/performance_monitor.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/progress_tracker.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/resource_manager.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/timing_tracker.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/token_counter.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/monitoring/tracing_context.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/notifications/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/notifications/hub.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/notifications/webhook_notifier.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/processing/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/processing/ai_content_management.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/processing/markdown_converter.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/processing/multimodal_integration.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/processing/rich_content_validation.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/py.typed +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/session/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/base.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/scripts/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/scripts/create_and_register.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/scripts/register_to_storage.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/chart/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/chart/chart_to_image.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/code_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/code_format/format_python.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/csv/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/csv/create_csv.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/csv/read_csv.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/csv/transform_csv.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/data_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/data_format/json_to_yaml.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/data_format/yaml_to_json.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/drawio/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/drawio/create_drawio.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/email_template/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/excel/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/excel/create_excel.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/file/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/file/create_file.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/file/list_files.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/file/read_file.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/file_access/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/file_access/download_to_local.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/file_access/get_file_path.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/form/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/image_display/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/image_gen/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/image_gen/create_image.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/image_gen/generate_image.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/mermaid/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/mermaid/mermaid_to_image.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/multimodal/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/powerpoint/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/powerpoint/create_powerpoint.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/powerpoint/templates/Big Data Infographics.pptx +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/powerpoint/templates/Executive Design Pitch Deck.pptx +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/powerpoint/templates/Management Consulting Toolkit.pptx +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/powerpoint/templates/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/powerpoint/templates/generate_templates.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/skill_creator/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/skill_creator/skill_api.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/table/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/table/table_to_image.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/unified_pdf/create_pdf.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/web_news_search/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/web_news_search/web_news_search.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/word/SKILL.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/builtin/skills/word/create_word.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/custom_skill_manager.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/skills/discovery_prompt.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/storage/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/storage/file_storages.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/storage/file_system_management.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/storage/storage_optimizer.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/subagents/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/subagents/executor.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/subagents/message_injector.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/subagents/message_queue.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/subagents/retrigger.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/subagents/spawn_tool.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/tools/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/tools/activity_callback.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/tools/adaptive_pdf_css.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/tools/base.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/tools/html_content_analyzer.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/tools/multimodal_tools.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/tools/pdf_image_scaler.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/tools/shell_tool.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/tools/sizing_config.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/tools/web_fetch_tool.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/tools/web_search_tool.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/utils/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/utils/path_utils.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/utils/post_install.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/utils/session_title_generator.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/utils/source_detector.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/utils/special_blocks.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/admin_auth.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/admin_models.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/admin_router.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/admin_services.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/api_timing_middleware.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/Dockerfile +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/README.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/docker-compose.yml +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/documentation_generator.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/gitnexus_client.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/helper_agent.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/helper_ui.html +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/modern_ui.html +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/otel_tracing_middleware.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/skills_router.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/web/test_app.html +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/__init__.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/artefacts.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/client.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/config.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/context.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/cursor.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/memory.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/models.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/poller.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/preferences.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/session.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework/workspace/subscription.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework_lib.egg-info/entry_points.txt +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework_lib.egg-info/requires.txt +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/agent_framework_lib.egg-info/top_level.txt +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/ARCHITECTURE_DIAGRAM.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/CANCEL_AND_INTERRUPT_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/DEEPEVAL_TEST_REPORT.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/FILE_STORAGE_GUIDE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/HISTORY_MESSAGE_FORMAT.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/MULTIMODAL_TOOLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/OBSERVABILITY_GUIDE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/PYPI_PUBLISHING.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/QA_STREAMING_LATENCY.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/SCREENSHOTS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/SSE_NOTIFICATIONS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/STREAMING_EVENTS_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/framework_audit_remarques.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/helper_agent.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/index.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/README.md +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/agent_context_budget_test.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/agent_exemple_test.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/agent_training_with_apo.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/agent_with_custom_tools_file_storage.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/agent_with_personalization.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/biagenttest.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/dependencies/docker-compose.yaml +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/pyproject.toml +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/test_work_patterns_live.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/examples/workspace_test_agent.py +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/setup.cfg +0 -0
- {agent_framework_lib-0.8.6.post2 → agent_framework_lib-0.8.7}/setup.py +0 -0
{agent_framework_lib-0.8.6.post2/agent_framework_lib.egg-info → agent_framework_lib-0.8.7}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-framework-lib
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.7
|
|
4
4
|
Summary: A comprehensive Python framework for building and serving conversational AI agents with FastAPI
|
|
5
5
|
Author-email: Sebastian Pavel <sebastian@cinco.ai>, Elliott Girard <elliott.girard@icloud.com>
|
|
6
6
|
Maintainer-email: Sebastian Pavel <sebastian@cinco.ai>
|
|
@@ -32,7 +32,7 @@ Example Usage:
|
|
|
32
32
|
create_basic_agent_server(MyAgent, port=8000)
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
Version: 0.8.
|
|
35
|
+
Version: 0.8.7
|
|
36
36
|
Author: Cinco AI Team
|
|
37
37
|
License: MIT
|
|
38
38
|
"""
|
|
@@ -48,22 +48,52 @@ logger = logging.getLogger(__name__)
|
|
|
48
48
|
|
|
49
49
|
def _auto_setup_dependencies() -> None:
|
|
50
50
|
"""
|
|
51
|
-
|
|
51
|
+
Check and install required dependencies (Playwright browsers, Deno).
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
Behaviour is controlled by ``AGENT_FRAMEWORK_AUTO_SETUP`` (default
|
|
54
|
+
``background``):
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
- ``skip`` / ``0`` / ``false`` / ``no``: do nothing. Dependencies are still
|
|
57
|
+
installed lazily on first tool use (Playwright) or first MCP run (Deno).
|
|
58
|
+
- ``background`` (default): run the setup in a daemon thread so importing
|
|
59
|
+
the package and starting the server are never blocked. The lazy paths
|
|
60
|
+
remain the safety net if a tool is used before the thread finishes.
|
|
61
|
+
- ``blocking`` / ``1`` / ``true`` / ``yes``: run synchronously at import
|
|
62
|
+
time (legacy behaviour).
|
|
63
|
+
|
|
64
|
+
``AGENT_FRAMEWORK_SKIP_AUTO_SETUP`` is still honoured for backward
|
|
65
|
+
compatibility and forces ``skip``.
|
|
57
66
|
"""
|
|
67
|
+
# Backward-compatible hard skip flag.
|
|
58
68
|
if os.environ.get("AGENT_FRAMEWORK_SKIP_AUTO_SETUP", "").lower() in ("1", "true", "yes"):
|
|
59
69
|
return
|
|
60
70
|
|
|
71
|
+
mode = os.environ.get("AGENT_FRAMEWORK_AUTO_SETUP", "background").lower()
|
|
72
|
+
if mode in ("skip", "0", "false", "no", "off"):
|
|
73
|
+
return
|
|
74
|
+
|
|
61
75
|
# Only run once per process
|
|
62
76
|
global _AUTO_SETUP_DONE
|
|
63
77
|
if "_AUTO_SETUP_DONE" in globals() and _AUTO_SETUP_DONE:
|
|
64
78
|
return
|
|
65
79
|
_AUTO_SETUP_DONE = True
|
|
66
80
|
|
|
81
|
+
if mode in ("blocking", "1", "true", "yes", "sync"):
|
|
82
|
+
_run_auto_setup()
|
|
83
|
+
return
|
|
84
|
+
|
|
85
|
+
# Default: run in a background daemon thread so import/startup is not blocked.
|
|
86
|
+
import threading
|
|
87
|
+
|
|
88
|
+
threading.Thread(
|
|
89
|
+
target=_run_auto_setup,
|
|
90
|
+
name="agent-framework-auto-setup",
|
|
91
|
+
daemon=True,
|
|
92
|
+
).start()
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _run_auto_setup() -> None:
|
|
96
|
+
"""Perform the actual dependency checks/installs (idempotent, cached)."""
|
|
67
97
|
try:
|
|
68
98
|
from .utils.post_install import ensure_deno, ensure_playwright_browsers
|
|
69
99
|
|
|
@@ -89,7 +119,7 @@ def _auto_setup_dependencies() -> None:
|
|
|
89
119
|
# Track if auto-setup has been done
|
|
90
120
|
_AUTO_SETUP_DONE = False
|
|
91
121
|
|
|
92
|
-
__version__ = "0.8.
|
|
122
|
+
__version__ = "0.8.7"
|
|
93
123
|
__author__ = "Cinco AI Team"
|
|
94
124
|
__license__ = "MIT"
|
|
95
125
|
__email__ = "sebastian@cinco.ai"
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""Code-delivery skill — launch coding runs via Herdr and deliver PRs.
|
|
2
|
+
|
|
3
|
+
This module provides:
|
|
4
|
+
- Domain models (RunState, CodingSpec, CodingRun)
|
|
5
|
+
- Configuration (CodeDeliveryConfig, load_config)
|
|
6
|
+
- Herdr client (HerdrClient)
|
|
7
|
+
- Git provider (GitProvider, GitHubCLIProvider)
|
|
8
|
+
- ES audit logger (CodeDeliveryAuditLogger)
|
|
9
|
+
- Orchestrator (CodeDeliveryOrchestrator)
|
|
10
|
+
- Tool factory (create_code_delivery_tools)
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from agent_framework.code_delivery.audit import CodeDeliveryAuditLogger
|
|
14
|
+
from agent_framework.code_delivery.config import CodeDeliveryConfig, load_config
|
|
15
|
+
from agent_framework.code_delivery.git_provider import (
|
|
16
|
+
GitHubCLIProvider,
|
|
17
|
+
GitProvider,
|
|
18
|
+
)
|
|
19
|
+
from agent_framework.code_delivery.herdr_client import HerdrClient
|
|
20
|
+
from agent_framework.code_delivery.models import (
|
|
21
|
+
CodingRun,
|
|
22
|
+
CodingSpec,
|
|
23
|
+
RunState,
|
|
24
|
+
StateTransition,
|
|
25
|
+
VALID_TRANSITIONS,
|
|
26
|
+
)
|
|
27
|
+
from agent_framework.code_delivery.orchestrator import CodeDeliveryOrchestrator
|
|
28
|
+
from agent_framework.code_delivery.tools import create_code_delivery_tools
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
__all__ = [
|
|
32
|
+
"CodeDeliveryAuditLogger",
|
|
33
|
+
"CodeDeliveryConfig",
|
|
34
|
+
"CodeDeliveryOrchestrator",
|
|
35
|
+
"CodingRun",
|
|
36
|
+
"CodingSpec",
|
|
37
|
+
"GitHubCLIProvider",
|
|
38
|
+
"GitProvider",
|
|
39
|
+
"HerdrClient",
|
|
40
|
+
"RunState",
|
|
41
|
+
"StateTransition",
|
|
42
|
+
"VALID_TRANSITIONS",
|
|
43
|
+
"create_code_delivery_tools",
|
|
44
|
+
"load_config",
|
|
45
|
+
]
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
"""Elasticsearch audit logger for code-delivery runs.
|
|
2
|
+
|
|
3
|
+
Provides end-to-end traceability from human request through Herdr actions,
|
|
4
|
+
coding agent work, git operations, and PR delivery. Every event is indexed
|
|
5
|
+
in a daily-rotated ES index (``code-delivery-runs-{date}``).
|
|
6
|
+
|
|
7
|
+
If Elasticsearch is unavailable the logger falls back to the Python logging
|
|
8
|
+
system at DEBUG level — the main flow is never blocked or disrupted by audit
|
|
9
|
+
failures.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
import traceback
|
|
16
|
+
import uuid
|
|
17
|
+
from datetime import datetime, timezone
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
20
|
+
from .models import CodingRun, RunState
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
_INDEX_PREFIX_DEFAULT = "code-delivery-runs"
|
|
26
|
+
|
|
27
|
+
#: Elasticsearch index mapping for code-delivery audit events.
|
|
28
|
+
_INDEX_MAPPING: dict[str, Any] = {
|
|
29
|
+
"mappings": {
|
|
30
|
+
"properties": {
|
|
31
|
+
# Identity & correlation
|
|
32
|
+
"run_id": {"type": "keyword"},
|
|
33
|
+
"event_id": {"type": "keyword"},
|
|
34
|
+
"event_type": {"type": "keyword"},
|
|
35
|
+
"timestamp": {"type": "date"},
|
|
36
|
+
"phase": {"type": "keyword"},
|
|
37
|
+
# Origin tracing
|
|
38
|
+
"session_id": {"type": "keyword"},
|
|
39
|
+
"user_id": {"type": "keyword"},
|
|
40
|
+
"agent_id": {"type": "keyword"},
|
|
41
|
+
"correlation_id": {"type": "keyword"},
|
|
42
|
+
"trace_id": {"type": "keyword"},
|
|
43
|
+
"span_id": {"type": "keyword"},
|
|
44
|
+
# Run context
|
|
45
|
+
"repo_id": {"type": "keyword"},
|
|
46
|
+
"backend": {"type": "keyword"},
|
|
47
|
+
"branch_name": {"type": "keyword"},
|
|
48
|
+
"base_branch": {"type": "keyword"},
|
|
49
|
+
"pr_url": {"type": "keyword"},
|
|
50
|
+
# Event payload
|
|
51
|
+
"detail": {"type": "text"},
|
|
52
|
+
"spec_snapshot": {"type": "object", "enabled": False},
|
|
53
|
+
"herdr_request": {"type": "object", "enabled": False},
|
|
54
|
+
"herdr_response": {"type": "object", "enabled": False},
|
|
55
|
+
"git_command": {"type": "keyword"},
|
|
56
|
+
"git_stdout": {"type": "text"},
|
|
57
|
+
"git_exit_code": {"type": "integer"},
|
|
58
|
+
"blocked_question": {"type": "text"},
|
|
59
|
+
"answer_provided": {"type": "text"},
|
|
60
|
+
"error_message": {"type": "text"},
|
|
61
|
+
"error_type": {"type": "keyword"},
|
|
62
|
+
"error_traceback": {"type": "text", "index": False},
|
|
63
|
+
# Metrics
|
|
64
|
+
"duration_ms": {"type": "long"},
|
|
65
|
+
"cumulative_ms": {"type": "long"},
|
|
66
|
+
"tokens_used": {"type": "object", "enabled": False},
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"settings": {
|
|
70
|
+
"number_of_shards": 1,
|
|
71
|
+
"number_of_replicas": 1,
|
|
72
|
+
},
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _now_iso() -> str:
|
|
77
|
+
return datetime.now(timezone.utc).isoformat()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _get_otel_context() -> tuple[str | None, str | None]:
|
|
81
|
+
"""Extract trace_id and span_id from the current OTel context, if any."""
|
|
82
|
+
try:
|
|
83
|
+
from opentelemetry import trace as otel_trace
|
|
84
|
+
|
|
85
|
+
span = otel_trace.get_current_span()
|
|
86
|
+
ctx = span.get_span_context()
|
|
87
|
+
if ctx and ctx.trace_id:
|
|
88
|
+
return (
|
|
89
|
+
format(ctx.trace_id, "032x"),
|
|
90
|
+
format(ctx.span_id, "016x"),
|
|
91
|
+
)
|
|
92
|
+
except Exception:
|
|
93
|
+
pass
|
|
94
|
+
return None, None
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class CodeDeliveryAuditLogger:
|
|
98
|
+
"""Indexes every code-delivery event into Elasticsearch.
|
|
99
|
+
|
|
100
|
+
Safe to use even when ES is disabled or unavailable — all public methods
|
|
101
|
+
swallow exceptions and fall back to Python logging.
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
def __init__(self, index_prefix: str = _INDEX_PREFIX_DEFAULT) -> None:
|
|
105
|
+
self._index_prefix = index_prefix
|
|
106
|
+
self._es_client: Any | None = None
|
|
107
|
+
self._available = False
|
|
108
|
+
|
|
109
|
+
# ------------------------------------------------------------------
|
|
110
|
+
# Lifecycle
|
|
111
|
+
# ------------------------------------------------------------------
|
|
112
|
+
|
|
113
|
+
async def initialize(self) -> bool:
|
|
114
|
+
"""Create the index template if needed.
|
|
115
|
+
|
|
116
|
+
Returns True if ES is available, False otherwise.
|
|
117
|
+
"""
|
|
118
|
+
try:
|
|
119
|
+
from agent_framework.session.session_storage import (
|
|
120
|
+
get_shared_elasticsearch_client,
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
self._es_client = await get_shared_elasticsearch_client()
|
|
124
|
+
if self._es_client is None:
|
|
125
|
+
logger.info(
|
|
126
|
+
"Elasticsearch not available — code-delivery audit will use Python logging"
|
|
127
|
+
)
|
|
128
|
+
self._available = False
|
|
129
|
+
return False
|
|
130
|
+
|
|
131
|
+
# Create today's index if it doesn't exist (idempotent)
|
|
132
|
+
index_name = self._today_index()
|
|
133
|
+
exists = await self._es_client.indices.exists(index=index_name)
|
|
134
|
+
if not exists:
|
|
135
|
+
await self._es_client.indices.create(
|
|
136
|
+
index=index_name, body=_INDEX_MAPPING
|
|
137
|
+
)
|
|
138
|
+
logger.info("Created code-delivery audit index: %s", index_name)
|
|
139
|
+
|
|
140
|
+
self._available = True
|
|
141
|
+
return True
|
|
142
|
+
|
|
143
|
+
except Exception as exc:
|
|
144
|
+
logger.warning("Failed to initialize code-delivery audit: %s", exc)
|
|
145
|
+
self._available = False
|
|
146
|
+
return False
|
|
147
|
+
|
|
148
|
+
# ------------------------------------------------------------------
|
|
149
|
+
# Core logging
|
|
150
|
+
# ------------------------------------------------------------------
|
|
151
|
+
|
|
152
|
+
async def log_event(
|
|
153
|
+
self,
|
|
154
|
+
run: CodingRun,
|
|
155
|
+
event_type: str,
|
|
156
|
+
**kwargs: Any,
|
|
157
|
+
) -> None:
|
|
158
|
+
"""Log a single audit event.
|
|
159
|
+
|
|
160
|
+
Auto-populates run context fields. Extra kwargs are merged into the
|
|
161
|
+
document (e.g. ``spec_snapshot``, ``herdr_request``, ``duration_ms``).
|
|
162
|
+
"""
|
|
163
|
+
trace_id, span_id = _get_otel_context()
|
|
164
|
+
|
|
165
|
+
doc: dict[str, Any] = {
|
|
166
|
+
"run_id": run.run_id,
|
|
167
|
+
"event_id": str(uuid.uuid4()),
|
|
168
|
+
"event_type": event_type,
|
|
169
|
+
"timestamp": _now_iso(),
|
|
170
|
+
"phase": run.state.value,
|
|
171
|
+
# Origin tracing
|
|
172
|
+
"session_id": run.session_id,
|
|
173
|
+
"user_id": run.user_id,
|
|
174
|
+
"agent_id": run.agent_id,
|
|
175
|
+
"correlation_id": run.correlation_id,
|
|
176
|
+
"trace_id": trace_id,
|
|
177
|
+
"span_id": span_id,
|
|
178
|
+
# Run context
|
|
179
|
+
"repo_id": run.repo_id,
|
|
180
|
+
"backend": run.backend,
|
|
181
|
+
"branch_name": run.branch_name,
|
|
182
|
+
"base_branch": run.spec.base_branch if run.spec else None,
|
|
183
|
+
"pr_url": run.pr_url,
|
|
184
|
+
}
|
|
185
|
+
doc.update(kwargs)
|
|
186
|
+
|
|
187
|
+
await self._index(doc, event_type)
|
|
188
|
+
|
|
189
|
+
# ------------------------------------------------------------------
|
|
190
|
+
# Convenience methods
|
|
191
|
+
# ------------------------------------------------------------------
|
|
192
|
+
|
|
193
|
+
async def log_herdr_call(
|
|
194
|
+
self,
|
|
195
|
+
run: CodingRun,
|
|
196
|
+
event_type: str,
|
|
197
|
+
request: dict[str, Any] | None,
|
|
198
|
+
response: dict[str, Any] | None,
|
|
199
|
+
duration_ms: int,
|
|
200
|
+
) -> None:
|
|
201
|
+
"""Log a Herdr API call with request/response payloads."""
|
|
202
|
+
await self.log_event(
|
|
203
|
+
run,
|
|
204
|
+
event_type,
|
|
205
|
+
herdr_request=request,
|
|
206
|
+
herdr_response=response,
|
|
207
|
+
duration_ms=duration_ms,
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
async def log_git_call(
|
|
211
|
+
self,
|
|
212
|
+
run: CodingRun,
|
|
213
|
+
event_type: str,
|
|
214
|
+
command: str,
|
|
215
|
+
stdout: str,
|
|
216
|
+
exit_code: int,
|
|
217
|
+
duration_ms: int,
|
|
218
|
+
) -> None:
|
|
219
|
+
"""Log a git/gh CLI call."""
|
|
220
|
+
await self.log_event(
|
|
221
|
+
run,
|
|
222
|
+
event_type,
|
|
223
|
+
git_command=command,
|
|
224
|
+
git_stdout=stdout,
|
|
225
|
+
git_exit_code=exit_code,
|
|
226
|
+
duration_ms=duration_ms,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
async def log_transition(
|
|
230
|
+
self,
|
|
231
|
+
run: CodingRun,
|
|
232
|
+
from_state: RunState,
|
|
233
|
+
to_state: RunState,
|
|
234
|
+
detail: str | None = None,
|
|
235
|
+
) -> None:
|
|
236
|
+
"""Log a state transition."""
|
|
237
|
+
await self.log_event(
|
|
238
|
+
run,
|
|
239
|
+
"transition",
|
|
240
|
+
detail=detail or f"{from_state.value} -> {to_state.value}",
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
async def log_error(
|
|
244
|
+
self,
|
|
245
|
+
run: CodingRun,
|
|
246
|
+
event_type: str,
|
|
247
|
+
error: Exception,
|
|
248
|
+
) -> None:
|
|
249
|
+
"""Log an error event with exception details."""
|
|
250
|
+
await self.log_event(
|
|
251
|
+
run,
|
|
252
|
+
event_type,
|
|
253
|
+
error_message=str(error),
|
|
254
|
+
error_type=type(error).__name__,
|
|
255
|
+
error_traceback=traceback.format_exc(),
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
# ------------------------------------------------------------------
|
|
259
|
+
# Query methods
|
|
260
|
+
# ------------------------------------------------------------------
|
|
261
|
+
|
|
262
|
+
async def get_run_timeline(self, run_id: str) -> list[dict[str, Any]]:
|
|
263
|
+
"""Return all events for a run, sorted chronologically."""
|
|
264
|
+
return await self._search(
|
|
265
|
+
query={"term": {"run_id": run_id}},
|
|
266
|
+
sort=[{"timestamp": "asc"}],
|
|
267
|
+
size=500,
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
async def get_runs_by_session(self, session_id: str) -> list[dict[str, Any]]:
|
|
271
|
+
"""Return events for all runs initiated from a session."""
|
|
272
|
+
return await self._search(
|
|
273
|
+
query={"term": {"session_id": session_id}},
|
|
274
|
+
sort=[{"timestamp": "desc"}],
|
|
275
|
+
size=200,
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
async def get_runs_by_user(
|
|
279
|
+
self, user_id: str, limit: int = 50
|
|
280
|
+
) -> list[dict[str, Any]]:
|
|
281
|
+
"""Return recent events for runs by a user."""
|
|
282
|
+
return await self._search(
|
|
283
|
+
query={"term": {"user_id": user_id}},
|
|
284
|
+
sort=[{"timestamp": "desc"}],
|
|
285
|
+
size=limit,
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
async def search_runs(
|
|
289
|
+
self, query_text: str, limit: int = 20
|
|
290
|
+
) -> list[dict[str, Any]]:
|
|
291
|
+
"""Full-text search across detail, questions, errors, and specs."""
|
|
292
|
+
return await self._search(
|
|
293
|
+
query={
|
|
294
|
+
"multi_match": {
|
|
295
|
+
"query": query_text,
|
|
296
|
+
"fields": [
|
|
297
|
+
"detail",
|
|
298
|
+
"blocked_question",
|
|
299
|
+
"answer_provided",
|
|
300
|
+
"error_message",
|
|
301
|
+
"git_stdout",
|
|
302
|
+
],
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
sort=[{"timestamp": "desc"}],
|
|
306
|
+
size=limit,
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
# ------------------------------------------------------------------
|
|
310
|
+
# Internal helpers
|
|
311
|
+
# ------------------------------------------------------------------
|
|
312
|
+
|
|
313
|
+
def _today_index(self) -> str:
|
|
314
|
+
date_str = datetime.now(timezone.utc).strftime("%Y.%m.%d")
|
|
315
|
+
return f"{self._index_prefix}-{date_str}"
|
|
316
|
+
|
|
317
|
+
async def _index(self, doc: dict[str, Any], event_type: str) -> None:
|
|
318
|
+
"""Index a document. Falls back to Python logging on failure."""
|
|
319
|
+
if self._available and self._es_client:
|
|
320
|
+
try:
|
|
321
|
+
await self._es_client.index(
|
|
322
|
+
index=self._today_index(),
|
|
323
|
+
document=doc,
|
|
324
|
+
refresh=False,
|
|
325
|
+
)
|
|
326
|
+
return
|
|
327
|
+
except Exception as exc:
|
|
328
|
+
logger.debug(
|
|
329
|
+
"ES audit index failed (%s), falling back to logging: %s",
|
|
330
|
+
event_type,
|
|
331
|
+
exc,
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
# Fallback: log the event at DEBUG level
|
|
335
|
+
logger.debug(
|
|
336
|
+
"AUDIT [%s] run=%s phase=%s %s",
|
|
337
|
+
event_type,
|
|
338
|
+
doc.get("run_id"),
|
|
339
|
+
doc.get("phase"),
|
|
340
|
+
{k: v for k, v in doc.items() if v is not None and k not in (
|
|
341
|
+
"run_id", "event_id", "event_type", "timestamp", "phase",
|
|
342
|
+
"trace_id", "span_id",
|
|
343
|
+
)},
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
async def _search(
|
|
347
|
+
self,
|
|
348
|
+
query: dict[str, Any],
|
|
349
|
+
sort: list[dict[str, str]],
|
|
350
|
+
size: int = 100,
|
|
351
|
+
) -> list[dict[str, Any]]:
|
|
352
|
+
"""Execute an ES search. Returns empty list on any failure."""
|
|
353
|
+
if not self._available or not self._es_client:
|
|
354
|
+
return []
|
|
355
|
+
|
|
356
|
+
try:
|
|
357
|
+
resp = await self._es_client.search(
|
|
358
|
+
index=f"{self._index_prefix}-*",
|
|
359
|
+
query=query,
|
|
360
|
+
sort=sort,
|
|
361
|
+
size=size,
|
|
362
|
+
)
|
|
363
|
+
return [hit["_source"] for hit in resp["hits"]["hits"]]
|
|
364
|
+
except Exception as exc:
|
|
365
|
+
logger.debug("ES audit search failed: %s", exc)
|
|
366
|
+
return []
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
__all__ = [
|
|
370
|
+
"CodeDeliveryAuditLogger",
|
|
371
|
+
]
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"""Configuration for the code-delivery skill.
|
|
2
|
+
|
|
3
|
+
Loads from a YAML file (``.code-delivery.yml``) or falls back to environment
|
|
4
|
+
variables.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
import os
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Any, Literal
|
|
13
|
+
|
|
14
|
+
import yaml
|
|
15
|
+
from pydantic import BaseModel, Field
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class HerdrConfig(BaseModel):
|
|
22
|
+
"""Connection settings for the Herdr substrate."""
|
|
23
|
+
|
|
24
|
+
base_url: str = Field("http://127.0.0.1:9876", description="Herdr API base URL")
|
|
25
|
+
timeout: float = Field(120.0, description="Default request timeout in seconds")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class GitHubConfig(BaseModel):
|
|
29
|
+
"""GitHub provider settings."""
|
|
30
|
+
|
|
31
|
+
default_base_branch: str = Field("main", description="Default base branch for PRs")
|
|
32
|
+
branch_prefix: str = Field("agent/", description="Prefix for run branches")
|
|
33
|
+
protected_branches: list[str] = Field(
|
|
34
|
+
default_factory=lambda: ["main", "master", "develop", "release/*"],
|
|
35
|
+
description="Branch patterns that must never be pushed to",
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class BackendConfig(BaseModel):
|
|
40
|
+
"""Coding backend settings."""
|
|
41
|
+
|
|
42
|
+
provider: Literal["claude", "codex", "opencode"] = Field(
|
|
43
|
+
"claude", description="Which coding backend to use"
|
|
44
|
+
)
|
|
45
|
+
model: str = Field(
|
|
46
|
+
"claude-sonnet-4-20250514", description="Model to use in the backend"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class CodeDeliveryConfig(BaseModel):
|
|
51
|
+
"""Top-level code-delivery configuration."""
|
|
52
|
+
|
|
53
|
+
herdr: HerdrConfig = Field(default_factory=HerdrConfig)
|
|
54
|
+
github: GitHubConfig = Field(default_factory=GitHubConfig)
|
|
55
|
+
backend: BackendConfig = Field(default_factory=BackendConfig)
|
|
56
|
+
max_concurrent_runs: int = Field(2, description="Max parallel runs")
|
|
57
|
+
verify_command: str = Field("", description="Gate command (empty = no gate)")
|
|
58
|
+
retry_on_verify_fail: int = Field(0, description="Retries on verify failure")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _config_from_env() -> dict[str, Any]:
|
|
62
|
+
"""Build a config dict from environment variables."""
|
|
63
|
+
cfg: dict[str, Any] = {}
|
|
64
|
+
|
|
65
|
+
# Herdr
|
|
66
|
+
herdr: dict[str, Any] = {}
|
|
67
|
+
if v := os.environ.get("HERDR_BASE_URL"):
|
|
68
|
+
herdr["base_url"] = v
|
|
69
|
+
if v := os.environ.get("HERDR_TIMEOUT"):
|
|
70
|
+
herdr["timeout"] = float(v)
|
|
71
|
+
if herdr:
|
|
72
|
+
cfg["herdr"] = herdr
|
|
73
|
+
|
|
74
|
+
# GitHub
|
|
75
|
+
github: dict[str, Any] = {}
|
|
76
|
+
if v := os.environ.get("CODE_DELIVERY_BASE_BRANCH"):
|
|
77
|
+
github["default_base_branch"] = v
|
|
78
|
+
if v := os.environ.get("CODE_DELIVERY_BRANCH_PREFIX"):
|
|
79
|
+
github["branch_prefix"] = v
|
|
80
|
+
if v := os.environ.get("CODE_DELIVERY_PROTECTED_BRANCHES"):
|
|
81
|
+
github["protected_branches"] = [b.strip() for b in v.split(",")]
|
|
82
|
+
if github:
|
|
83
|
+
cfg["github"] = github
|
|
84
|
+
|
|
85
|
+
# Backend
|
|
86
|
+
backend: dict[str, Any] = {}
|
|
87
|
+
if v := os.environ.get("CODE_DELIVERY_BACKEND"):
|
|
88
|
+
backend["provider"] = v
|
|
89
|
+
if v := os.environ.get("CODE_DELIVERY_MODEL"):
|
|
90
|
+
backend["model"] = v
|
|
91
|
+
if backend:
|
|
92
|
+
cfg["backend"] = backend
|
|
93
|
+
|
|
94
|
+
# Top-level
|
|
95
|
+
if v := os.environ.get("CODE_DELIVERY_MAX_CONCURRENT"):
|
|
96
|
+
cfg["max_concurrent_runs"] = int(v)
|
|
97
|
+
if v := os.environ.get("CODE_DELIVERY_VERIFY_COMMAND"):
|
|
98
|
+
cfg["verify_command"] = v
|
|
99
|
+
if v := os.environ.get("CODE_DELIVERY_RETRY_ON_VERIFY_FAIL"):
|
|
100
|
+
cfg["retry_on_verify_fail"] = int(v)
|
|
101
|
+
|
|
102
|
+
return cfg
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def load_config(path: Path | None = None) -> CodeDeliveryConfig:
|
|
106
|
+
"""Load code-delivery configuration.
|
|
107
|
+
|
|
108
|
+
Resolution order:
|
|
109
|
+
1. Explicit *path* (YAML file).
|
|
110
|
+
2. ``.code-delivery.yml`` in the current working directory.
|
|
111
|
+
3. Environment variables.
|
|
112
|
+
|
|
113
|
+
YAML keys and env vars are merged (env wins on conflict).
|
|
114
|
+
"""
|
|
115
|
+
yaml_data: dict[str, Any] = {}
|
|
116
|
+
|
|
117
|
+
candidates = [path] if path else [Path.cwd() / ".code-delivery.yml"]
|
|
118
|
+
for candidate in candidates:
|
|
119
|
+
if candidate and candidate.is_file():
|
|
120
|
+
try:
|
|
121
|
+
yaml_data = yaml.safe_load(candidate.read_text(encoding="utf-8")) or {}
|
|
122
|
+
logger.info("Loaded code-delivery config from %s", candidate)
|
|
123
|
+
except Exception as exc:
|
|
124
|
+
logger.warning("Failed to parse %s: %s", candidate, exc)
|
|
125
|
+
break
|
|
126
|
+
|
|
127
|
+
env_data = _config_from_env()
|
|
128
|
+
|
|
129
|
+
# Shallow merge: env overrides YAML at section level
|
|
130
|
+
merged: dict[str, Any] = {**yaml_data}
|
|
131
|
+
for key, value in env_data.items():
|
|
132
|
+
if isinstance(value, dict) and key in merged and isinstance(merged[key], dict):
|
|
133
|
+
merged[key] = {**merged[key], **value}
|
|
134
|
+
else:
|
|
135
|
+
merged[key] = value
|
|
136
|
+
|
|
137
|
+
return CodeDeliveryConfig(**merged)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
__all__ = [
|
|
141
|
+
"BackendConfig",
|
|
142
|
+
"CodeDeliveryConfig",
|
|
143
|
+
"GitHubConfig",
|
|
144
|
+
"HerdrConfig",
|
|
145
|
+
"load_config",
|
|
146
|
+
]
|