agent-framework-lib 0.8.7.post5__tar.gz → 0.8.7.post7__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.7.post5/agent_framework_lib.egg-info → agent_framework_lib-0.8.7.post7}/PKG-INFO +2 -1
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/code_delivery/__init__.py +9 -1
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/code_delivery/audit.py +22 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/code_delivery/config.py +99 -3
- agent_framework_lib-0.8.7.post7/agent_framework/code_delivery/crypto.py +149 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/code_delivery/git_provider.py +44 -1
- agent_framework_lib-0.8.7.post7/agent_framework/code_delivery/herdr_client.py +355 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/code_delivery/orchestrator.py +352 -9
- agent_framework_lib-0.8.7.post7/agent_framework/code_delivery/store.py +408 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/code_delivery/tools.py +31 -2
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/base_agent.py +52 -1
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/__init__.py +9 -2
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/scripts/create_and_register.py +7 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/chart/SKILL.md +27 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/chart/chart_to_image.py +18 -1
- agent_framework_lib-0.8.7.post7/agent_framework/skills/builtin/skills/chart/vendor_chart.umd.min.js +20 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/code_delivery/SKILL.md +21 -8
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/image_gen/SKILL.md +60 -27
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/image_gen/create_image.py +92 -19
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +33 -5
- agent_framework_lib-0.8.7.post7/agent_framework/skills/builtin/skills/unified_pdf/create_pdf.py +437 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/tools/shell_tool.py +68 -7
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/configuration.md +75 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/server.py +224 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7/agent_framework_lib.egg-info}/PKG-INFO +2 -1
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework_lib.egg-info/SOURCES.txt +3 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework_lib.egg-info/requires.txt +1 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/configuration.md +75 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/pyproject.toml +4 -1
- agent_framework_lib-0.8.7.post5/agent_framework/code_delivery/herdr_client.py +0 -215
- agent_framework_lib-0.8.7.post5/agent_framework/skills/builtin/skills/unified_pdf/create_pdf.py +0 -179
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/ARCHITECTURE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/LICENSE +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/MANIFEST.in +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/README.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/base.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/endpoints/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/models.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/a2a/providers/postgres_provider.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/capabilities/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/capabilities/resolver.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/code_delivery/models.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/activity_formatter.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/agent_interface.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/agent_provider.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/context_budget.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/context_summarizer.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/elasticsearch_config_provider.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/execution_controller.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/implementation_validator.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/interruption_message.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/knowledge_state.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/loop_detector.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/model_clients.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/model_config.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/model_router.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/models.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/prompt_builder.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/provider_calibration.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/scratchpad_compressor.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/scratchpad_serializer.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/state_manager.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/step_display_config.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/core/streaming_parts_accumulator.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/implementations/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/implementations/budget_aware_agent.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/implementations/llamaindex_agent.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/implementations/microsoft_agent.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/base.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/config.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/hypothesis_engine.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/implicit_feedback.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/manager.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/personalization.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/providers/graphiti_provider.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/providers/memori_provider.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/response_lessons.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/tools.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/memory/work_patterns.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/api_timing_tracker.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/error_handling.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/error_logging.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/llm_metrics.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/llm_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/metrics_aggregator.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/metrics_config.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/observability_manager.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/otel_instrumentor.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/otel_logging_handler.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/otel_setup.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/performance_monitor.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/progress_tracker.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/resource_manager.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/timing_tracker.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/token_counter.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/monitoring/tracing_context.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/notifications/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/notifications/hub.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/notifications/webhook_notifier.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/processing/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/processing/ai_content_management.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/processing/markdown_converter.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/processing/multimodal_integration.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/processing/rich_content_validation.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/py.typed +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/security/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/security/secret_redactor.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/security/shell_env.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/session/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/session/elasticsearch_session_storage.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/session/session_storage.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/base.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/scripts/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/scripts/register_to_storage.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/code_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/code_format/format_python.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/csv/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/csv/create_csv.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/csv/read_csv.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/csv/transform_csv.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/data_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/data_format/json_to_yaml.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/data_format/yaml_to_json.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/drawio/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/drawio/create_drawio.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/email_template/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/excel/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/excel/create_excel.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/file/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/file/create_file.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/file/list_files.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/file/read_file.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/file_access/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/file_access/download_to_local.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/file_access/get_file_path.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/form/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/image_display/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/image_gen/generate_image.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/mermaid/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/mermaid/mermaid_to_image.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/multimodal/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/powerpoint/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/powerpoint/create_powerpoint.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/powerpoint/templates/Big Data Infographics.pptx +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/powerpoint/templates/Executive Design Pitch Deck.pptx +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/powerpoint/templates/Management Consulting Toolkit.pptx +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/powerpoint/templates/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/powerpoint/templates/generate_templates.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/skill_creator/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/skill_creator/skill_api.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/table/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/table/table_to_image.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/web_news_search/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/web_news_search/web_news_search.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/word/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/builtin/skills/word/create_word.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/custom_skill_manager.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/discovery_prompt.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/markdown_loader.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/skills/tools.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/storage/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/storage/file_storages.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/storage/file_system_management.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/storage/storage_optimizer.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/subagents/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/subagents/executor.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/subagents/message_injector.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/subagents/message_queue.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/subagents/retrigger.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/subagents/spawn_tool.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/tools/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/tools/activity_callback.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/tools/adaptive_pdf_css.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/tools/base.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/tools/html_content_analyzer.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/tools/multimodal_tools.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/tools/pdf_image_scaler.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/tools/sizing_config.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/tools/web_fetch_tool.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/tools/web_search_tool.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/utils/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/utils/path_utils.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/utils/post_install.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/utils/session_title_generator.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/utils/source_detector.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/utils/special_blocks.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/admin_auth.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/admin_models.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/admin_router.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/admin_services.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/api_timing_middleware.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/Dockerfile +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/README.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/docker-compose.yml +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/documentation_generator.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/gitnexus_client.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/helper_agent.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/helper_ui.html +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/modern_ui.html +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/otel_tracing_middleware.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/skills_router.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/web/test_app.html +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/artefacts.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/client.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/config.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/context.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/cursor.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/memory.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/models.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/poller.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/preferences.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/router.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/session.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework/workspace/subscription.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework_lib.egg-info/entry_points.txt +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/agent_framework_lib.egg-info/top_level.txt +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/ARCHITECTURE_DIAGRAM.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/CANCEL_AND_INTERRUPT_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/DEEPEVAL_TEST_REPORT.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/FILE_STORAGE_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/HISTORY_MESSAGE_FORMAT.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/MULTIMODAL_TOOLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/OBSERVABILITY_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/PYPI_PUBLISHING.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/QA_STREAMING_LATENCY.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/SCREENSHOTS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/SSE_NOTIFICATIONS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/STREAMING_EVENTS_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/framework_audit_remarques.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/helper_agent.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/index.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/README.md +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/agent_context_budget_test.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/agent_exemple_test.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/agent_training_with_apo.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/agent_with_custom_tools_file_storage.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/agent_with_personalization.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/biagenttest.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/dependencies/docker-compose.yaml +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/pyproject.toml +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/test_work_patterns_live.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/examples/workspace_test_agent.py +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/setup.cfg +0 -0
- {agent_framework_lib-0.8.7.post5 → agent_framework_lib-0.8.7.post7}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-framework-lib
|
|
3
|
-
Version: 0.8.7.
|
|
3
|
+
Version: 0.8.7.post7
|
|
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>
|
|
@@ -54,6 +54,7 @@ Requires-Dist: playwright>=1.56.0
|
|
|
54
54
|
Requires-Dist: elasticsearch<9.0.0,>=8.11.0
|
|
55
55
|
Requires-Dist: ddgs>=9.9.3
|
|
56
56
|
Requires-Dist: httpx>=0.28.1
|
|
57
|
+
Requires-Dist: cryptography>=42.0.0
|
|
57
58
|
Requires-Dist: beautifulsoup4>=4.12.0
|
|
58
59
|
Requires-Dist: llama-index>=0.14.16
|
|
59
60
|
Requires-Dist: llama-index-core>=0.14.16
|
|
@@ -16,7 +16,12 @@ from agent_framework.code_delivery.git_provider import (
|
|
|
16
16
|
GitHubCLIProvider,
|
|
17
17
|
GitProvider,
|
|
18
18
|
)
|
|
19
|
-
from agent_framework.code_delivery.herdr_client import
|
|
19
|
+
from agent_framework.code_delivery.herdr_client import (
|
|
20
|
+
HerdrClient,
|
|
21
|
+
HerdrLocalClient,
|
|
22
|
+
HerdrRemoteClient,
|
|
23
|
+
create_herdr_client,
|
|
24
|
+
)
|
|
20
25
|
from agent_framework.code_delivery.models import (
|
|
21
26
|
VALID_TRANSITIONS,
|
|
22
27
|
CodingRun,
|
|
@@ -37,6 +42,9 @@ __all__ = [
|
|
|
37
42
|
"GitHubCLIProvider",
|
|
38
43
|
"GitProvider",
|
|
39
44
|
"HerdrClient",
|
|
45
|
+
"HerdrLocalClient",
|
|
46
|
+
"HerdrRemoteClient",
|
|
47
|
+
"create_herdr_client",
|
|
40
48
|
"RunState",
|
|
41
49
|
"StateTransition",
|
|
42
50
|
"VALID_TRANSITIONS",
|
|
@@ -105,6 +105,24 @@ class CodeDeliveryAuditLogger:
|
|
|
105
105
|
self._index_prefix = index_prefix
|
|
106
106
|
self._es_client: Any | None = None
|
|
107
107
|
self._available = False
|
|
108
|
+
self._redactor: Any | None = None
|
|
109
|
+
|
|
110
|
+
def set_secret_values(self, values: list[str]) -> None:
|
|
111
|
+
"""Install a redactor so secret values (e.g. the GitHub token) are masked
|
|
112
|
+
in every indexed document — git stdout, herdr payloads, errors, etc.
|
|
113
|
+
|
|
114
|
+
Called by the orchestrator whenever the per-session credential changes.
|
|
115
|
+
"""
|
|
116
|
+
cleaned = [v for v in values if v]
|
|
117
|
+
if not cleaned:
|
|
118
|
+
self._redactor = None
|
|
119
|
+
return
|
|
120
|
+
try:
|
|
121
|
+
from agent_framework.security.secret_redactor import SecretRedactor
|
|
122
|
+
|
|
123
|
+
self._redactor = SecretRedactor(cleaned)
|
|
124
|
+
except Exception: # noqa: BLE001 — never break audit on redactor setup
|
|
125
|
+
self._redactor = None
|
|
108
126
|
|
|
109
127
|
# ------------------------------------------------------------------
|
|
110
128
|
# Lifecycle
|
|
@@ -310,6 +328,10 @@ class CodeDeliveryAuditLogger:
|
|
|
310
328
|
|
|
311
329
|
async def _index(self, doc: dict[str, Any], event_type: str) -> None:
|
|
312
330
|
"""Index a document. Falls back to Python logging on failure."""
|
|
331
|
+
# Mask any secret values (GitHub token) before the doc leaves the process.
|
|
332
|
+
if self._redactor is not None and getattr(self._redactor, "active", False):
|
|
333
|
+
doc = self._redactor.redact_obj(doc)
|
|
334
|
+
|
|
313
335
|
if self._available and self._es_client:
|
|
314
336
|
try:
|
|
315
337
|
await self._es_client.index(
|
|
@@ -19,10 +19,21 @@ logger = logging.getLogger(__name__)
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class HerdrConfig(BaseModel):
|
|
22
|
-
"""Connection settings for the Herdr substrate.
|
|
22
|
+
"""Connection settings for the Herdr substrate.
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
Two modes:
|
|
25
|
+
- ``local`` (default): Uses the ``herdr`` CLI on PATH. Zero config.
|
|
26
|
+
- ``remote``: Uses HTTP when ``base_url`` is explicitly provided.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
mode: Literal["local", "remote"] = Field(
|
|
30
|
+
"local", description="'local' uses herdr CLI, 'remote' uses HTTP API"
|
|
31
|
+
)
|
|
32
|
+
base_url: str = Field(
|
|
33
|
+
"http://127.0.0.1:9876",
|
|
34
|
+
description="Herdr HTTP API URL (only used in remote mode)",
|
|
35
|
+
)
|
|
36
|
+
timeout: float = Field(120.0, description="Timeout in seconds (CLI or HTTP)")
|
|
26
37
|
|
|
27
38
|
|
|
28
39
|
class GitHubConfig(BaseModel):
|
|
@@ -56,6 +67,85 @@ class CodeDeliveryConfig(BaseModel):
|
|
|
56
67
|
retry_on_verify_fail: int = Field(0, description="Retries on verify failure")
|
|
57
68
|
|
|
58
69
|
|
|
70
|
+
class RepoEntry(BaseModel):
|
|
71
|
+
"""A single repository the agent is allowed (or not) to deliver to.
|
|
72
|
+
|
|
73
|
+
``repo`` is the canonical ``owner/name`` slug. ``enabled`` is the per-repo
|
|
74
|
+
on/off toggle enforced by the orchestrator before any push/PR.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
repo: str = Field(..., description="Repository slug, e.g. 'octocat/hello-world'")
|
|
78
|
+
enabled: bool = Field(True, description="Whether code delivery to this repo is allowed")
|
|
79
|
+
default_base_branch: str = Field(
|
|
80
|
+
"", description="Base branch override for this repo (empty = use github default)"
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class GitHubAuthMeta(BaseModel):
|
|
85
|
+
"""Non-secret metadata about a stored GitHub credential.
|
|
86
|
+
|
|
87
|
+
The token itself is never carried here — only what is safe to display.
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
login: str = Field("", description="Authenticated GitHub login")
|
|
91
|
+
scopes: list[str] = Field(default_factory=list, description="Token scopes")
|
|
92
|
+
token_suffix: str = Field("", description="Last 4 chars of the token, for recognition")
|
|
93
|
+
validated_at: str = Field("", description="ISO timestamp of last successful validation")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class ResolvedCodeDeliveryConfig(BaseModel):
|
|
97
|
+
"""Per-session, fully-resolved code-delivery configuration.
|
|
98
|
+
|
|
99
|
+
Produced by ``CodeDeliveryStore.resolve(user_id, session_id)`` after merging
|
|
100
|
+
env defaults < user config < session override. Unlike ``CodeDeliveryConfig``
|
|
101
|
+
this carries the *decrypted* GitHub token and the repo allowlist, so it is a
|
|
102
|
+
short-lived in-memory object that must never be logged or persisted as-is.
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
# Identity
|
|
106
|
+
user_id: str | None = None
|
|
107
|
+
session_id: str | None = None
|
|
108
|
+
|
|
109
|
+
# Master feature toggle (default-deny friendly: feature can be turned off)
|
|
110
|
+
enabled: bool = Field(True, description="Master on/off for code delivery")
|
|
111
|
+
|
|
112
|
+
# Resolved sub-configs (reuse existing models)
|
|
113
|
+
herdr: HerdrConfig = Field(default_factory=HerdrConfig)
|
|
114
|
+
github: GitHubConfig = Field(default_factory=GitHubConfig)
|
|
115
|
+
backend: BackendConfig = Field(default_factory=BackendConfig)
|
|
116
|
+
max_concurrent_runs: int = 2
|
|
117
|
+
verify_command: str = ""
|
|
118
|
+
retry_on_verify_fail: int = 0
|
|
119
|
+
|
|
120
|
+
# Credentials + allowlist (sensitive)
|
|
121
|
+
github_token: str | None = Field(
|
|
122
|
+
None, description="Decrypted GitHub token (transient — never persist/log)"
|
|
123
|
+
)
|
|
124
|
+
github_auth: GitHubAuthMeta | None = Field(
|
|
125
|
+
None, description="Non-secret metadata about the stored credential"
|
|
126
|
+
)
|
|
127
|
+
repos: list[RepoEntry] = Field(default_factory=list, description="Repo allowlist")
|
|
128
|
+
|
|
129
|
+
def base_config(self) -> CodeDeliveryConfig:
|
|
130
|
+
"""Return the non-secret ``CodeDeliveryConfig`` slice for orchestrator infra."""
|
|
131
|
+
return CodeDeliveryConfig(
|
|
132
|
+
herdr=self.herdr,
|
|
133
|
+
github=self.github,
|
|
134
|
+
backend=self.backend,
|
|
135
|
+
max_concurrent_runs=self.max_concurrent_runs,
|
|
136
|
+
verify_command=self.verify_command,
|
|
137
|
+
retry_on_verify_fail=self.retry_on_verify_fail,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
def find_repo(self, repo_slug: str) -> RepoEntry | None:
|
|
141
|
+
"""Look up an allowlist entry by slug (case-insensitive)."""
|
|
142
|
+
target = repo_slug.lower()
|
|
143
|
+
for entry in self.repos:
|
|
144
|
+
if entry.repo.lower() == target:
|
|
145
|
+
return entry
|
|
146
|
+
return None
|
|
147
|
+
|
|
148
|
+
|
|
59
149
|
def _config_from_env() -> dict[str, Any]:
|
|
60
150
|
"""Build a config dict from environment variables."""
|
|
61
151
|
cfg: dict[str, Any] = {}
|
|
@@ -64,6 +154,9 @@ def _config_from_env() -> dict[str, Any]:
|
|
|
64
154
|
herdr: dict[str, Any] = {}
|
|
65
155
|
if v := os.environ.get("HERDR_BASE_URL"):
|
|
66
156
|
herdr["base_url"] = v
|
|
157
|
+
herdr["mode"] = "remote" # explicit URL → remote mode
|
|
158
|
+
if v := os.environ.get("HERDR_MODE"):
|
|
159
|
+
herdr["mode"] = v # explicit override
|
|
67
160
|
if v := os.environ.get("HERDR_TIMEOUT"):
|
|
68
161
|
herdr["timeout"] = float(v)
|
|
69
162
|
if herdr:
|
|
@@ -138,7 +231,10 @@ def load_config(path: Path | None = None) -> CodeDeliveryConfig:
|
|
|
138
231
|
__all__ = [
|
|
139
232
|
"BackendConfig",
|
|
140
233
|
"CodeDeliveryConfig",
|
|
234
|
+
"GitHubAuthMeta",
|
|
141
235
|
"GitHubConfig",
|
|
142
236
|
"HerdrConfig",
|
|
237
|
+
"RepoEntry",
|
|
238
|
+
"ResolvedCodeDeliveryConfig",
|
|
143
239
|
"load_config",
|
|
144
240
|
]
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"""Token-at-rest encryption for code-delivery credentials.
|
|
2
|
+
|
|
3
|
+
GitHub tokens (PAT / fine-grained) are stored encrypted in the per-user/session
|
|
4
|
+
config store. Encryption is symmetric (Fernet, AES-128-CBC + HMAC) with a key
|
|
5
|
+
read from ``CODE_DELIVERY_SECRET_KEY``.
|
|
6
|
+
|
|
7
|
+
Security posture — **fail closed**:
|
|
8
|
+
- Storing a token without a valid key raises ``TokenCryptoError`` so a plaintext
|
|
9
|
+
secret is never persisted.
|
|
10
|
+
- Reading a value that is not a valid ciphertext (e.g. legacy plaintext) raises
|
|
11
|
+
``TokenCryptoError`` rather than returning the unverified bytes.
|
|
12
|
+
|
|
13
|
+
The key is a url-safe base64 32-byte Fernet key. Generate one with::
|
|
14
|
+
|
|
15
|
+
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import logging
|
|
21
|
+
import os
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
_ENV_KEY = "CODE_DELIVERY_SECRET_KEY"
|
|
26
|
+
|
|
27
|
+
#: Prefix marking a value as code-delivery Fernet ciphertext. Lets us detect
|
|
28
|
+
#: (and refuse) accidental plaintext without attempting a decrypt.
|
|
29
|
+
_CIPHER_PREFIX = "cdf1:"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class TokenCryptoError(Exception):
|
|
33
|
+
"""Raised when encryption/decryption cannot be performed safely."""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _load_key() -> bytes | None:
|
|
37
|
+
"""Return the raw Fernet key from the environment, or None if unset."""
|
|
38
|
+
raw = os.environ.get(_ENV_KEY, "").strip()
|
|
39
|
+
if not raw:
|
|
40
|
+
return None
|
|
41
|
+
return raw.encode("utf-8")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def encryption_available() -> bool:
|
|
45
|
+
"""True if a usable encryption key is configured.
|
|
46
|
+
|
|
47
|
+
Endpoints can surface this so operators know the feature is disabled when
|
|
48
|
+
no key is set, instead of failing only at write time.
|
|
49
|
+
"""
|
|
50
|
+
key = _load_key()
|
|
51
|
+
if not key:
|
|
52
|
+
return False
|
|
53
|
+
try:
|
|
54
|
+
from cryptography.fernet import Fernet
|
|
55
|
+
|
|
56
|
+
Fernet(key) # validates key shape
|
|
57
|
+
return True
|
|
58
|
+
except Exception as exc: # noqa: BLE001 — invalid key == unavailable
|
|
59
|
+
logger.warning("%s is set but invalid: %s", _ENV_KEY, exc)
|
|
60
|
+
return False
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def encrypt_token(plaintext: str) -> str:
|
|
64
|
+
"""Encrypt a token for storage.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
plaintext: The raw GitHub token.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
A prefixed, url-safe ciphertext string safe to persist.
|
|
71
|
+
|
|
72
|
+
Raises:
|
|
73
|
+
TokenCryptoError: If no valid key is configured (fail closed) or the
|
|
74
|
+
input is empty.
|
|
75
|
+
"""
|
|
76
|
+
if not plaintext:
|
|
77
|
+
raise TokenCryptoError("Refusing to encrypt an empty token")
|
|
78
|
+
|
|
79
|
+
key = _load_key()
|
|
80
|
+
if not key:
|
|
81
|
+
raise TokenCryptoError(
|
|
82
|
+
f"{_ENV_KEY} is not set — cannot store GitHub credentials encrypted. "
|
|
83
|
+
"Generate a key with `python -c \"from cryptography.fernet import Fernet; "
|
|
84
|
+
'print(Fernet.generate_key().decode())"` and set it in the environment.'
|
|
85
|
+
)
|
|
86
|
+
try:
|
|
87
|
+
from cryptography.fernet import Fernet
|
|
88
|
+
|
|
89
|
+
token = Fernet(key).encrypt(plaintext.encode("utf-8")).decode("utf-8")
|
|
90
|
+
except TokenCryptoError:
|
|
91
|
+
raise
|
|
92
|
+
except Exception as exc: # noqa: BLE001
|
|
93
|
+
raise TokenCryptoError(f"Encryption failed: {exc}") from exc
|
|
94
|
+
return f"{_CIPHER_PREFIX}{token}"
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def decrypt_token(ciphertext: str) -> str:
|
|
98
|
+
"""Decrypt a stored token.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
ciphertext: A value produced by :func:`encrypt_token`.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
The original plaintext token.
|
|
105
|
+
|
|
106
|
+
Raises:
|
|
107
|
+
TokenCryptoError: If no key is configured, the value is not recognised
|
|
108
|
+
ciphertext (e.g. legacy plaintext), or decryption/verification fails.
|
|
109
|
+
"""
|
|
110
|
+
if not ciphertext:
|
|
111
|
+
raise TokenCryptoError("Refusing to decrypt an empty value")
|
|
112
|
+
if not ciphertext.startswith(_CIPHER_PREFIX):
|
|
113
|
+
raise TokenCryptoError(
|
|
114
|
+
"Stored value is not code-delivery ciphertext — refusing to use it "
|
|
115
|
+
"(plaintext or foreign format). Re-save the credential."
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
key = _load_key()
|
|
119
|
+
if not key:
|
|
120
|
+
raise TokenCryptoError(f"{_ENV_KEY} is not set — cannot decrypt credentials")
|
|
121
|
+
|
|
122
|
+
payload = ciphertext[len(_CIPHER_PREFIX) :]
|
|
123
|
+
try:
|
|
124
|
+
from cryptography.fernet import Fernet, InvalidToken
|
|
125
|
+
|
|
126
|
+
try:
|
|
127
|
+
return Fernet(key).decrypt(payload.encode("utf-8")).decode("utf-8")
|
|
128
|
+
except InvalidToken as exc:
|
|
129
|
+
raise TokenCryptoError(
|
|
130
|
+
"Decryption failed — key mismatch or corrupted ciphertext"
|
|
131
|
+
) from exc
|
|
132
|
+
except TokenCryptoError:
|
|
133
|
+
raise
|
|
134
|
+
except Exception as exc: # noqa: BLE001
|
|
135
|
+
raise TokenCryptoError(f"Decryption failed: {exc}") from exc
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def is_ciphertext(value: str | None) -> bool:
|
|
139
|
+
"""True if *value* looks like code-delivery ciphertext."""
|
|
140
|
+
return bool(value) and value.startswith(_CIPHER_PREFIX)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
__all__ = [
|
|
144
|
+
"TokenCryptoError",
|
|
145
|
+
"decrypt_token",
|
|
146
|
+
"encrypt_token",
|
|
147
|
+
"encryption_available",
|
|
148
|
+
"is_ciphertext",
|
|
149
|
+
]
|
|
@@ -10,6 +10,8 @@ import asyncio
|
|
|
10
10
|
import fnmatch
|
|
11
11
|
import json
|
|
12
12
|
import logging
|
|
13
|
+
import os
|
|
14
|
+
import re
|
|
13
15
|
import shutil
|
|
14
16
|
from abc import ABC, abstractmethod
|
|
15
17
|
from typing import Any
|
|
@@ -21,6 +23,27 @@ logger = logging.getLogger(__name__)
|
|
|
21
23
|
|
|
22
24
|
_DEFAULT_TIMEOUT = 30 # seconds per subprocess call
|
|
23
25
|
|
|
26
|
+
# owner/repo extraction from common remote URL shapes:
|
|
27
|
+
# git@github.com:owner/repo.git
|
|
28
|
+
# https://github.com/owner/repo.git
|
|
29
|
+
# ssh://git@github.com/owner/repo
|
|
30
|
+
_REMOTE_SLUG_RE = re.compile(
|
|
31
|
+
r"[:/](?P<owner>[^/:]+)/(?P<repo>[^/]+?)(?:\.git)?/?$"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def parse_repo_slug(remote_url: str) -> str | None:
|
|
36
|
+
"""Extract the canonical ``owner/repo`` slug from a git remote URL.
|
|
37
|
+
|
|
38
|
+
Returns ``None`` if the URL cannot be parsed.
|
|
39
|
+
"""
|
|
40
|
+
if not remote_url:
|
|
41
|
+
return None
|
|
42
|
+
match = _REMOTE_SLUG_RE.search(remote_url.strip())
|
|
43
|
+
if not match:
|
|
44
|
+
return None
|
|
45
|
+
return f"{match.group('owner')}/{match.group('repo')}"
|
|
46
|
+
|
|
24
47
|
|
|
25
48
|
class GitProviderError(Exception):
|
|
26
49
|
"""Raised when a git/provider operation fails."""
|
|
@@ -76,10 +99,21 @@ class GitProvider(ABC):
|
|
|
76
99
|
class GitHubCLIProvider(GitProvider):
|
|
77
100
|
"""GitHub provider using the ``gh`` and ``git`` CLIs."""
|
|
78
101
|
|
|
79
|
-
def __init__(
|
|
102
|
+
def __init__(
|
|
103
|
+
self, config: GitHubConfig, extra_env: dict[str, str] | None = None
|
|
104
|
+
) -> None:
|
|
80
105
|
self._config = config
|
|
106
|
+
self._extra_env: dict[str, str] = dict(extra_env or {})
|
|
81
107
|
self._ensure_binaries()
|
|
82
108
|
|
|
109
|
+
def set_extra_env(self, extra_env: dict[str, str] | None) -> None:
|
|
110
|
+
"""Set env vars (e.g. ``GH_TOKEN``) injected into every git/gh subprocess.
|
|
111
|
+
|
|
112
|
+
Called per session by the orchestrator so each user's GitHub credential
|
|
113
|
+
scopes only their own runs.
|
|
114
|
+
"""
|
|
115
|
+
self._extra_env = dict(extra_env or {})
|
|
116
|
+
|
|
83
117
|
# ------------------------------------------------------------------
|
|
84
118
|
# Public API
|
|
85
119
|
# ------------------------------------------------------------------
|
|
@@ -207,12 +241,20 @@ class GitHubCLIProvider(GitProvider):
|
|
|
207
241
|
cmd_str = " ".join(cmd)
|
|
208
242
|
logger.debug("Running: %s (cwd=%s)", cmd_str, cwd)
|
|
209
243
|
|
|
244
|
+
# Inject the per-session credential env (GH_TOKEN/GITHUB_TOKEN) and
|
|
245
|
+
# disable interactive prompts so a missing/bad token fails fast.
|
|
246
|
+
env = {**os.environ}
|
|
247
|
+
if self._extra_env:
|
|
248
|
+
env.update(self._extra_env)
|
|
249
|
+
env.setdefault("GIT_TERMINAL_PROMPT", "0")
|
|
250
|
+
|
|
210
251
|
try:
|
|
211
252
|
proc = await asyncio.create_subprocess_exec(
|
|
212
253
|
*cmd,
|
|
213
254
|
cwd=cwd,
|
|
214
255
|
stdout=asyncio.subprocess.PIPE,
|
|
215
256
|
stderr=asyncio.subprocess.PIPE,
|
|
257
|
+
env=env,
|
|
216
258
|
)
|
|
217
259
|
stdout_bytes, stderr_bytes = await asyncio.wait_for(proc.communicate(), timeout=timeout)
|
|
218
260
|
except asyncio.TimeoutError:
|
|
@@ -258,4 +300,5 @@ __all__ = [
|
|
|
258
300
|
"GitHubCLIProvider",
|
|
259
301
|
"GitProvider",
|
|
260
302
|
"GitProviderError",
|
|
303
|
+
"parse_repo_slug",
|
|
261
304
|
]
|