agent-framework-lib 0.8.7.post4__tar.gz → 0.8.7.post5__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.post4/agent_framework_lib.egg-info → agent_framework_lib-0.8.7.post5}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/agent_interface.py +16 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/base_agent.py +40 -1
- agent_framework_lib-0.8.7.post5/agent_framework/security/__init__.py +17 -0
- agent_framework_lib-0.8.7.post5/agent_framework/security/secret_redactor.py +291 -0
- agent_framework_lib-0.8.7.post5/agent_framework/security/shell_env.py +195 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/shell_tool.py +70 -3
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/server.py +141 -16
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5/agent_framework_lib.egg-info}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/SOURCES.txt +3 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/pyproject.toml +1 -1
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/ARCHITECTURE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/LICENSE +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/MANIFEST.in +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/README.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/base.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/models.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/providers/postgres_provider.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/capabilities/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/capabilities/resolver.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/audit.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/config.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/git_provider.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/herdr_client.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/models.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/orchestrator.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/tools.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/activity_formatter.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/agent_provider.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/context_budget.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/context_summarizer.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/elasticsearch_config_provider.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/execution_controller.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/implementation_validator.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/interruption_message.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/knowledge_state.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/loop_detector.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/model_clients.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/model_config.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/model_router.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/models.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/prompt_builder.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/provider_calibration.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/scratchpad_compressor.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/scratchpad_serializer.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/state_manager.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/step_display_config.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/core/streaming_parts_accumulator.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/budget_aware_agent.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/llamaindex_agent.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/microsoft_agent.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/base.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/config.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/hypothesis_engine.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/implicit_feedback.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/manager.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/personalization.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/providers/graphiti_provider.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/providers/memori_provider.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/response_lessons.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/tools.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/work_patterns.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/api_timing_tracker.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/error_handling.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/error_logging.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/llm_metrics.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/llm_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/metrics_aggregator.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/metrics_config.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/observability_manager.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/otel_instrumentor.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/otel_logging_handler.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/otel_setup.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/performance_monitor.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/progress_tracker.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/resource_manager.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/timing_tracker.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/token_counter.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/tracing_context.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/notifications/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/notifications/hub.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/notifications/webhook_notifier.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/ai_content_management.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/markdown_converter.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/multimodal_integration.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/rich_content_validation.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/py.typed +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/session/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/session/elasticsearch_session_storage.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/session/session_storage.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/base.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/scripts/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/scripts/create_and_register.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/scripts/register_to_storage.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/chart/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/chart/chart_to_image.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/code_delivery/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/code_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/code_format/format_python.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/csv/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/csv/create_csv.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/csv/read_csv.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/csv/transform_csv.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/data_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/data_format/json_to_yaml.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/data_format/yaml_to_json.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/drawio/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/drawio/create_drawio.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/email_template/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/excel/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/excel/create_excel.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file/create_file.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file/list_files.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file/read_file.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file_access/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file_access/download_to_local.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file_access/get_file_path.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/form/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/image_display/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/image_gen/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/image_gen/create_image.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/image_gen/generate_image.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/mermaid/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/mermaid/mermaid_to_image.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/multimodal/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/create_powerpoint.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/templates/Big Data Infographics.pptx +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/templates/Executive Design Pitch Deck.pptx +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/templates/Management Consulting Toolkit.pptx +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/templates/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/templates/generate_templates.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/skill_creator/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/skill_creator/skill_api.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/table/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/table/table_to_image.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/unified_pdf/create_pdf.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/web_news_search/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/web_news_search/web_news_search.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/word/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/word/create_word.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/custom_skill_manager.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/discovery_prompt.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/markdown_loader.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/tools.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/storage/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/storage/file_storages.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/storage/file_system_management.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/storage/storage_optimizer.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/executor.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/message_injector.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/message_queue.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/retrigger.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/spawn_tool.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/activity_callback.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/adaptive_pdf_css.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/base.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/html_content_analyzer.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/multimodal_tools.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/pdf_image_scaler.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/sizing_config.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/web_fetch_tool.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/web_search_tool.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/path_utils.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/post_install.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/session_title_generator.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/source_detector.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/special_blocks.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/admin_auth.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/admin_models.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/admin_router.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/admin_services.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/api_timing_middleware.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/Dockerfile +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/README.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/docker-compose.yml +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/documentation_generator.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/gitnexus_client.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/helper_agent.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/helper_ui.html +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/modern_ui.html +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/otel_tracing_middleware.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/skills_router.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/web/test_app.html +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/artefacts.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/client.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/config.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/context.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/cursor.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/memory.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/models.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/poller.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/preferences.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/router.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/session.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/subscription.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/entry_points.txt +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/requires.txt +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/top_level.txt +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/ARCHITECTURE_DIAGRAM.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/CANCEL_AND_INTERRUPT_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/DEEPEVAL_TEST_REPORT.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/FILE_STORAGE_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/HISTORY_MESSAGE_FORMAT.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/MULTIMODAL_TOOLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/OBSERVABILITY_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/PYPI_PUBLISHING.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/QA_STREAMING_LATENCY.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/SCREENSHOTS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/SSE_NOTIFICATIONS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/STREAMING_EVENTS_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/framework_audit_remarques.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/helper_agent.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/index.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/README.md +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/agent_context_budget_test.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/agent_exemple_test.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/agent_training_with_apo.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/agent_with_custom_tools_file_storage.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/agent_with_personalization.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/biagenttest.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/dependencies/docker-compose.yaml +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/pyproject.toml +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/test_work_patterns_live.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/examples/workspace_test_agent.py +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/setup.cfg +0 -0
- {agent_framework_lib-0.8.7.post4 → agent_framework_lib-0.8.7.post5}/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.post5
|
|
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>
|
|
@@ -892,6 +892,22 @@ class AgentInterface(abc.ABC):
|
|
|
892
892
|
"memory_adapter": None,
|
|
893
893
|
}
|
|
894
894
|
|
|
895
|
+
def get_secret_redactor(self) -> Any:
|
|
896
|
+
"""Return a redactor used to mask secret values in outgoing data.
|
|
897
|
+
|
|
898
|
+
The redactor exposes ``redact_text``, ``redact_parts``, ``feed`` and
|
|
899
|
+
``flush`` and is used by the server as a last-line defense to strip
|
|
900
|
+
secret values (container env keys, workspace secrets) from responses,
|
|
901
|
+
persisted data, and logs.
|
|
902
|
+
|
|
903
|
+
The default implementation returns an inert redactor (nothing to mask).
|
|
904
|
+
``BaseAgent`` overrides this to build a redactor from the sensitive
|
|
905
|
+
environment values and the current workspace secrets.
|
|
906
|
+
"""
|
|
907
|
+
from ..security.secret_redactor import SecretRedactor
|
|
908
|
+
|
|
909
|
+
return SecretRedactor([])
|
|
910
|
+
|
|
895
911
|
def get_custom_tool_display_info(self) -> dict[str, Any]:
|
|
896
912
|
"""
|
|
897
913
|
Returns custom display info for agent-specific tools (e.g., MCP tools).
|
|
@@ -29,6 +29,7 @@ if TYPE_CHECKING:
|
|
|
29
29
|
from collections.abc import AsyncGenerator
|
|
30
30
|
|
|
31
31
|
from ..capabilities.resolver import CapabilitySet
|
|
32
|
+
from ..security.secret_redactor import SecretRedactor
|
|
32
33
|
from ..subagents.executor import SubagentExecutor
|
|
33
34
|
from ..subagents.message_queue import SessionMessageQueue
|
|
34
35
|
from ..subagents.spawn_tool import SubagentSpawnTool
|
|
@@ -377,6 +378,41 @@ class BaseAgent(SkillsMixin, MemoryMixin, AgentInterface):
|
|
|
377
378
|
except Exception as e:
|
|
378
379
|
logger.warning(f"Could not propagate workspace secrets to live ShellTool: {e}")
|
|
379
380
|
|
|
381
|
+
def _loaded_skill_env_keys(self) -> set[str]:
|
|
382
|
+
"""Return env-var names declared by currently loaded skills.
|
|
383
|
+
|
|
384
|
+
Reads ``requires_env`` from the metadata of every loaded skill so that
|
|
385
|
+
``ShellTool`` can expose those variables to the shell while everything
|
|
386
|
+
else is scrubbed. Returns an empty set if skills are unavailable.
|
|
387
|
+
"""
|
|
388
|
+
if not SKILLS_AVAILABLE or not getattr(self, "_enable_skills", False):
|
|
389
|
+
return set()
|
|
390
|
+
keys: set[str] = set()
|
|
391
|
+
try:
|
|
392
|
+
registry = self._skill_registry
|
|
393
|
+
for name in registry.list_loaded():
|
|
394
|
+
skill = registry.get(name)
|
|
395
|
+
if skill is not None:
|
|
396
|
+
keys.update(skill.metadata.requires_env)
|
|
397
|
+
except Exception as e: # noqa: BLE001 — never break shell wiring
|
|
398
|
+
logger.warning(f"Could not collect loaded skill env keys: {e}")
|
|
399
|
+
return keys
|
|
400
|
+
|
|
401
|
+
def get_secret_redactor(self) -> SecretRedactor:
|
|
402
|
+
"""Build a redactor masking sensitive env values + workspace secrets.
|
|
403
|
+
|
|
404
|
+
The returned redactor masks any occurrence of a sensitive container
|
|
405
|
+
environment value (LLM keys, infra creds, ``API_KEYS``) or workspace
|
|
406
|
+
secret in outgoing text, parts, persisted data, and logs. Rebuilt on
|
|
407
|
+
demand so it always reflects the current environment and workspace.
|
|
408
|
+
"""
|
|
409
|
+
from ..security.secret_redactor import SecretRedactor
|
|
410
|
+
from ..security.shell_env import sensitive_env_values
|
|
411
|
+
|
|
412
|
+
env_values = sensitive_env_values(os.environ)
|
|
413
|
+
workspace_values = list(self._workspace_secrets.values())
|
|
414
|
+
return SecretRedactor(env_values + workspace_values)
|
|
415
|
+
|
|
380
416
|
def set_subagent_executor(self, executor: SubagentExecutor | None) -> None:
|
|
381
417
|
"""Inject or remove the shared SubagentExecutor.
|
|
382
418
|
|
|
@@ -641,7 +677,10 @@ class BaseAgent(SkillsMixin, MemoryMixin, AgentInterface):
|
|
|
641
677
|
try:
|
|
642
678
|
from ..tools.shell_tool import ShellTool
|
|
643
679
|
|
|
644
|
-
shell_tool = ShellTool(
|
|
680
|
+
shell_tool = ShellTool(
|
|
681
|
+
default_timeout=120,
|
|
682
|
+
skill_env_provider=self._loaded_skill_env_keys,
|
|
683
|
+
)
|
|
645
684
|
# Inject session context so that AGENT_USER_ID / AGENT_SESSION_ID are
|
|
646
685
|
# propagated to subprocesses (register_to_storage / create_and_register).
|
|
647
686
|
# Without this, generated files are uploaded without session_id and
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Security utilities for the agent framework.
|
|
2
|
+
|
|
3
|
+
Provides secret redaction (masking secret values in any output reaching the
|
|
4
|
+
client, persistence, or logs) and the shell environment allowlist used to
|
|
5
|
+
prevent the shell sandbox from reading container secrets it does not need.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .secret_redactor import SecretRedactor, build_redaction_value_set
|
|
9
|
+
from .shell_env import build_shell_env, sensitive_env_values
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"SecretRedactor",
|
|
14
|
+
"build_redaction_value_set",
|
|
15
|
+
"build_shell_env",
|
|
16
|
+
"sensitive_env_values",
|
|
17
|
+
]
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"""Masquage des valeurs de secrets dans les chaînes et les output parts.
|
|
2
|
+
|
|
3
|
+
Le ``SecretRedactor`` remplace toute occurrence d'une valeur secrète connue par
|
|
4
|
+
un masque fixe (``********``), avant que la donnée n'atteigne le client, le
|
|
5
|
+
stockage de session/Elasticsearch ou les logs.
|
|
6
|
+
|
|
7
|
+
Deux sources de valeurs à masquer :
|
|
8
|
+
- les variables d'environnement sensibles du conteneur (clés LLM, creds infra) ;
|
|
9
|
+
- les secrets workspace injectés dans le shell.
|
|
10
|
+
|
|
11
|
+
Le masquage est littéral (pas de regex sur la valeur), insensible à rien
|
|
12
|
+
d'autre que la casse exacte, et trie les valeurs par longueur décroissante pour
|
|
13
|
+
éviter qu'un secret court inclus dans un secret long ne soit masqué de façon
|
|
14
|
+
incohérente.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import os
|
|
20
|
+
from typing import TYPE_CHECKING, Any
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from collections.abc import Iterable, Sequence
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
MASK = "********"
|
|
28
|
+
|
|
29
|
+
DEFAULT_MIN_LEN = 4
|
|
30
|
+
"""Longueur minimale d'une valeur pour être masquée (sous ce seuil = bruit)."""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _redaction_min_len() -> int:
|
|
34
|
+
"""Lit le seuil de longueur minimale depuis l'environnement."""
|
|
35
|
+
raw = os.environ.get("SECRET_REDACTION_MIN_LEN", "")
|
|
36
|
+
try:
|
|
37
|
+
value = int(raw)
|
|
38
|
+
except (TypeError, ValueError):
|
|
39
|
+
return DEFAULT_MIN_LEN
|
|
40
|
+
return value if value > 0 else DEFAULT_MIN_LEN
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def build_redaction_value_set(
|
|
44
|
+
*value_groups: Iterable[str] | None,
|
|
45
|
+
min_len: int | None = None,
|
|
46
|
+
) -> list[str]:
|
|
47
|
+
"""Construit la liste triée des valeurs à masquer.
|
|
48
|
+
|
|
49
|
+
Fusionne plusieurs groupes de valeurs, retire les doublons, ignore les
|
|
50
|
+
valeurs vides ou trop courtes, puis trie par longueur décroissante.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
*value_groups: Itérables de valeurs candidates (env sensibles,
|
|
54
|
+
secrets workspace, etc.). Les ``None`` sont tolérés.
|
|
55
|
+
min_len: Longueur minimale d'une valeur pour être retenue. Si ``None``,
|
|
56
|
+
lit ``SECRET_REDACTION_MIN_LEN`` (défaut 4).
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
Liste de valeurs uniques triées par longueur décroissante.
|
|
60
|
+
"""
|
|
61
|
+
threshold = min_len if min_len is not None else _redaction_min_len()
|
|
62
|
+
seen: set[str] = set()
|
|
63
|
+
for group in value_groups:
|
|
64
|
+
if not group:
|
|
65
|
+
continue
|
|
66
|
+
for raw in group:
|
|
67
|
+
if raw is None:
|
|
68
|
+
continue
|
|
69
|
+
value = str(raw)
|
|
70
|
+
if len(value) < threshold:
|
|
71
|
+
continue
|
|
72
|
+
seen.add(value)
|
|
73
|
+
return sorted(seen, key=len, reverse=True)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class SecretRedactor:
|
|
77
|
+
"""Masque des valeurs secrètes dans des chaînes et des output parts.
|
|
78
|
+
|
|
79
|
+
Stateless vis-à-vis de la session, sauf pour le buffer de ``feed()`` utilisé
|
|
80
|
+
en streaming. Construire un nouveau redacteur par session (ou réutiliser tant
|
|
81
|
+
que l'ensemble des secrets ne change pas).
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
def __init__(self, secret_values: Iterable[str] | None = None) -> None:
|
|
85
|
+
"""Initialise le redacteur.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
secret_values: Valeurs à masquer. Filtrées/triées via
|
|
89
|
+
``build_redaction_value_set``.
|
|
90
|
+
"""
|
|
91
|
+
self._values: list[str] = build_redaction_value_set(secret_values)
|
|
92
|
+
self._max_len: int = self._values[0].__len__() if self._values else 0
|
|
93
|
+
self._buffer: str = ""
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def active(self) -> bool:
|
|
97
|
+
"""``True`` si au moins une valeur est à masquer."""
|
|
98
|
+
return bool(self._values)
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def secret_values(self) -> list[str]:
|
|
102
|
+
"""Copie de la liste des valeurs masquées (triée par longueur décr.)."""
|
|
103
|
+
return list(self._values)
|
|
104
|
+
|
|
105
|
+
def redact_text(self, text: str | None) -> str | None:
|
|
106
|
+
"""Masque toutes les occurrences des valeurs secrètes dans ``text``.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
text: Texte à nettoyer. ``None`` est renvoyé tel quel.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
Le texte avec chaque valeur secrète remplacée par ``********``.
|
|
113
|
+
"""
|
|
114
|
+
if text is None or not self._values:
|
|
115
|
+
return text
|
|
116
|
+
if not text:
|
|
117
|
+
return text
|
|
118
|
+
result = text
|
|
119
|
+
for value in self._values:
|
|
120
|
+
if value in result:
|
|
121
|
+
result = result.replace(value, MASK)
|
|
122
|
+
return result
|
|
123
|
+
|
|
124
|
+
def redact_obj(self, obj: Any) -> Any:
|
|
125
|
+
"""Masque récursivement les valeurs secrètes dans une structure JSON.
|
|
126
|
+
|
|
127
|
+
Gère str, dict, list, tuple. Les autres types sont renvoyés tels quels.
|
|
128
|
+
"""
|
|
129
|
+
if not self._values:
|
|
130
|
+
return obj
|
|
131
|
+
if isinstance(obj, str):
|
|
132
|
+
return self.redact_text(obj)
|
|
133
|
+
if isinstance(obj, dict):
|
|
134
|
+
return {k: self.redact_obj(v) for k, v in obj.items()}
|
|
135
|
+
if isinstance(obj, list):
|
|
136
|
+
return [self.redact_obj(v) for v in obj]
|
|
137
|
+
if isinstance(obj, tuple):
|
|
138
|
+
return tuple(self.redact_obj(v) for v in obj)
|
|
139
|
+
return obj
|
|
140
|
+
|
|
141
|
+
def redact_parts(self, parts: Sequence[Any] | None) -> list[Any]:
|
|
142
|
+
"""Masque les champs textuels de chaque output part.
|
|
143
|
+
|
|
144
|
+
Couvre ``TextOutputPart.text``, ``TextOutputStreamPart.text``,
|
|
145
|
+
``ActivityOutputPart.content``/``results``/``tools``, et
|
|
146
|
+
``TechnicalDetails.raw_result``/``error_message``. Retourne de nouvelles
|
|
147
|
+
instances (immutabilité) — les parts non concernées sont conservées.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
parts: Liste d'output parts (modèles Pydantic) ou de dicts.
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
Nouvelle liste avec les valeurs secrètes masquées.
|
|
154
|
+
"""
|
|
155
|
+
if not parts:
|
|
156
|
+
return list(parts) if parts is not None else []
|
|
157
|
+
if not self._values:
|
|
158
|
+
return list(parts)
|
|
159
|
+
return [self._redact_part(part) for part in parts]
|
|
160
|
+
|
|
161
|
+
def _redact_part(self, part: Any) -> Any:
|
|
162
|
+
"""Masque une seule part (dict ou modèle Pydantic)."""
|
|
163
|
+
if isinstance(part, dict):
|
|
164
|
+
return self.redact_obj(part)
|
|
165
|
+
|
|
166
|
+
part_type = getattr(part, "type", None)
|
|
167
|
+
|
|
168
|
+
if part_type in ("text_output", "text_output_stream"):
|
|
169
|
+
text = getattr(part, "text", None)
|
|
170
|
+
redacted = self.redact_text(text)
|
|
171
|
+
if redacted != text:
|
|
172
|
+
return part.model_copy(update={"text": redacted})
|
|
173
|
+
return part
|
|
174
|
+
|
|
175
|
+
if part_type == "activity":
|
|
176
|
+
return self._redact_activity_part(part)
|
|
177
|
+
|
|
178
|
+
return part
|
|
179
|
+
|
|
180
|
+
def _redact_activity_part(self, part: Any) -> Any:
|
|
181
|
+
"""Masque le contenu textuel et les détails techniques d'une activité."""
|
|
182
|
+
updates: dict[str, Any] = {}
|
|
183
|
+
|
|
184
|
+
content = getattr(part, "content", None)
|
|
185
|
+
redacted_content = self.redact_text(content)
|
|
186
|
+
if redacted_content != content:
|
|
187
|
+
updates["content"] = redacted_content
|
|
188
|
+
|
|
189
|
+
for field in ("results", "tools"):
|
|
190
|
+
value = getattr(part, field, None)
|
|
191
|
+
if value:
|
|
192
|
+
redacted = self.redact_obj(value)
|
|
193
|
+
if redacted != value:
|
|
194
|
+
updates[field] = redacted
|
|
195
|
+
|
|
196
|
+
td = getattr(part, "technical_details", None)
|
|
197
|
+
if td is not None:
|
|
198
|
+
td_updates: dict[str, Any] = {}
|
|
199
|
+
raw_result = getattr(td, "raw_result", None)
|
|
200
|
+
redacted_raw = self.redact_text(raw_result)
|
|
201
|
+
if redacted_raw != raw_result:
|
|
202
|
+
td_updates["raw_result"] = redacted_raw
|
|
203
|
+
err = getattr(td, "error_message", None)
|
|
204
|
+
redacted_err = self.redact_text(err)
|
|
205
|
+
if redacted_err != err:
|
|
206
|
+
td_updates["error_message"] = redacted_err
|
|
207
|
+
args = getattr(td, "arguments", None)
|
|
208
|
+
if args:
|
|
209
|
+
redacted_args = self.redact_obj(args)
|
|
210
|
+
if redacted_args != args:
|
|
211
|
+
td_updates["arguments"] = redacted_args
|
|
212
|
+
if td_updates:
|
|
213
|
+
updates["technical_details"] = td.model_copy(update=td_updates)
|
|
214
|
+
|
|
215
|
+
if updates:
|
|
216
|
+
return part.model_copy(update=updates)
|
|
217
|
+
return part
|
|
218
|
+
|
|
219
|
+
def feed(self, delta: str) -> str:
|
|
220
|
+
"""Masquage incrémental pour le streaming.
|
|
221
|
+
|
|
222
|
+
Conserve un buffer brut et n'émet que le préfixe qui ne peut plus être
|
|
223
|
+
affecté par les caractères futurs. On retient au minimum
|
|
224
|
+
``max_len - 1`` caractères (longueur du plus long secret moins un), puis
|
|
225
|
+
on abaisse la coupure pour ne jamais scinder une occurrence présente
|
|
226
|
+
dans le buffer. Le préfixe émis est masqué ; le reste est conservé.
|
|
227
|
+
|
|
228
|
+
Args:
|
|
229
|
+
delta: Nouveau fragment de texte.
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
Portion masquée et sûre à émettre immédiatement (peut être vide).
|
|
233
|
+
"""
|
|
234
|
+
if not self._values:
|
|
235
|
+
return delta
|
|
236
|
+
self._buffer += delta
|
|
237
|
+
buf = self._buffer
|
|
238
|
+
margin = self._max_len - 1
|
|
239
|
+
cut = len(buf) - margin
|
|
240
|
+
if cut <= 0:
|
|
241
|
+
return ""
|
|
242
|
+
|
|
243
|
+
cut = self._safe_cut(buf, cut)
|
|
244
|
+
if cut <= 0:
|
|
245
|
+
return ""
|
|
246
|
+
|
|
247
|
+
emitted = self.redact_text(buf[:cut]) or ""
|
|
248
|
+
self._buffer = buf[cut:]
|
|
249
|
+
return emitted
|
|
250
|
+
|
|
251
|
+
def _safe_cut(self, buf: str, cut: int) -> int:
|
|
252
|
+
"""Abaisse ``cut`` jusqu'à ce qu'aucune occurrence ne le chevauche.
|
|
253
|
+
|
|
254
|
+
Une occurrence ``buf[start:start+len(v)]`` chevauche ``cut`` si
|
|
255
|
+
``start < cut < start + len(v)``. On ramène ``cut`` au début de la
|
|
256
|
+
première occurrence chevauchante, en itérant jusqu'au point fixe car
|
|
257
|
+
abaisser ``cut`` peut révéler des occurrences plus précoces.
|
|
258
|
+
"""
|
|
259
|
+
changed = True
|
|
260
|
+
while changed and cut > 0:
|
|
261
|
+
changed = False
|
|
262
|
+
for value in self._values:
|
|
263
|
+
lv = len(value)
|
|
264
|
+
start = 0
|
|
265
|
+
while True:
|
|
266
|
+
idx = buf.find(value, start)
|
|
267
|
+
if idx == -1 or idx >= cut:
|
|
268
|
+
break
|
|
269
|
+
if idx + lv > cut:
|
|
270
|
+
cut = idx
|
|
271
|
+
changed = True
|
|
272
|
+
break
|
|
273
|
+
start = idx + 1
|
|
274
|
+
if cut <= 0:
|
|
275
|
+
return 0
|
|
276
|
+
return cut
|
|
277
|
+
|
|
278
|
+
def flush(self) -> str:
|
|
279
|
+
"""Vide le buffer de streaming en masquant le résidu.
|
|
280
|
+
|
|
281
|
+
Returns:
|
|
282
|
+
Le reste du buffer, masqué.
|
|
283
|
+
"""
|
|
284
|
+
if not self._buffer:
|
|
285
|
+
return ""
|
|
286
|
+
remaining = self.redact_text(self._buffer) or ""
|
|
287
|
+
self._buffer = ""
|
|
288
|
+
return remaining
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
__all__ = ["SecretRedactor", "build_redaction_value_set", "MASK"]
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"""Construction de l'environnement exposé à la sandbox ``shell_exec``.
|
|
2
|
+
|
|
3
|
+
Le shell ne doit voir que les variables dont il a réellement besoin :
|
|
4
|
+
- un socle système (PATH, HOME, locale, runtime ``uv``…) ;
|
|
5
|
+
- le wiring framework (``AGENT_*``) injecté explicitement ailleurs ;
|
|
6
|
+
- l'auth requise par les scripts d'upload (``REQUIRE_AUTH``/``API_KEYS``) ;
|
|
7
|
+
- les variables déclarées par les skills chargées (``requires_env``) ;
|
|
8
|
+
- les secrets workspace (injectés volontairement pour usage) ;
|
|
9
|
+
- un override d'exploitation (``SHELL_ENV_ALLOWLIST``).
|
|
10
|
+
|
|
11
|
+
Toute autre variable de ``os.environ`` (clés LLM, creds DB/cloud, mots de passe)
|
|
12
|
+
est retirée : ``echo $OPENAI_API_KEY`` renvoie une chaîne vide en conversation
|
|
13
|
+
normale. Les valeurs qui restent exposées mais sensibles (``API_KEYS``,
|
|
14
|
+
``OPENAI_API_KEY`` quand ``image_gen`` est chargée) sont masquées en sortie par
|
|
15
|
+
le ``SecretRedactor``.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import os
|
|
21
|
+
from typing import TYPE_CHECKING
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from collections.abc import Iterable
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# Socle système toujours exposé. Préfixes via _ALLOW_PREFIXES.
|
|
29
|
+
_BASE_ALLOW: frozenset[str] = frozenset(
|
|
30
|
+
{
|
|
31
|
+
"PATH",
|
|
32
|
+
"HOME",
|
|
33
|
+
"USER",
|
|
34
|
+
"LOGNAME",
|
|
35
|
+
"SHELL",
|
|
36
|
+
"PWD",
|
|
37
|
+
"OLDPWD",
|
|
38
|
+
"TERM",
|
|
39
|
+
"TZ",
|
|
40
|
+
"TMPDIR",
|
|
41
|
+
"TEMP",
|
|
42
|
+
"TMP",
|
|
43
|
+
"HOSTNAME",
|
|
44
|
+
"LANG",
|
|
45
|
+
"LANGUAGE",
|
|
46
|
+
"PYTHONPATH",
|
|
47
|
+
"PYTHONHOME",
|
|
48
|
+
"PYTHONUNBUFFERED",
|
|
49
|
+
"PYTHONDONTWRITEBYTECODE",
|
|
50
|
+
"PYTHONIOENCODING",
|
|
51
|
+
"VIRTUAL_ENV",
|
|
52
|
+
"CONDA_PREFIX",
|
|
53
|
+
"NODE_PATH",
|
|
54
|
+
"SSL_CERT_FILE",
|
|
55
|
+
"SSL_CERT_DIR",
|
|
56
|
+
"REQUESTS_CA_BUNDLE",
|
|
57
|
+
"CURL_CA_BUNDLE",
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# Préfixes système exposés en bloc (locale + chaînes d'outils courantes).
|
|
62
|
+
_ALLOW_PREFIXES: tuple[str, ...] = (
|
|
63
|
+
"LC_",
|
|
64
|
+
"UV_",
|
|
65
|
+
"XDG_",
|
|
66
|
+
"DENO_",
|
|
67
|
+
"NODE_",
|
|
68
|
+
"NPM_",
|
|
69
|
+
"PLAYWRIGHT_",
|
|
70
|
+
"NODEENV_",
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# Wiring framework + auth requise par les scripts d'upload (process séparés qui
|
|
74
|
+
# lisent ces variables depuis l'environnement). API_KEYS reste exposé mais sa
|
|
75
|
+
# valeur est masquée en sortie par le SecretRedactor.
|
|
76
|
+
_FRAMEWORK_ALLOW: frozenset[str] = frozenset(
|
|
77
|
+
{
|
|
78
|
+
"AGENT_USER_ID",
|
|
79
|
+
"AGENT_SESSION_ID",
|
|
80
|
+
"AGENT_HOST",
|
|
81
|
+
"AGENT_PORT",
|
|
82
|
+
"AGENT_OUTPUT_DIR",
|
|
83
|
+
"AGENT_CLEANUP_LOCAL",
|
|
84
|
+
"REQUIRE_AUTH",
|
|
85
|
+
"API_KEYS",
|
|
86
|
+
}
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _allow_prefixes() -> tuple[str, ...]:
|
|
91
|
+
return tuple(p for p in _ALLOW_PREFIXES if p)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def shell_env_mode() -> str:
|
|
95
|
+
"""Mode de filtrage de l'environnement shell.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
``"allowlist"`` (défaut), ``"passthrough"`` (legacy, debug uniquement).
|
|
99
|
+
"""
|
|
100
|
+
mode = os.environ.get("SHELL_ENV_MODE", "allowlist").strip().lower()
|
|
101
|
+
return mode if mode in ("allowlist", "passthrough") else "allowlist"
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _extra_allowlist() -> set[str]:
|
|
105
|
+
"""Clés additionnelles exposées via ``SHELL_ENV_ALLOWLIST`` (CSV)."""
|
|
106
|
+
raw = os.environ.get("SHELL_ENV_ALLOWLIST", "")
|
|
107
|
+
return {k.strip() for k in raw.split(",") if k.strip()}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _is_allowed(key: str, allow_exact: frozenset[str] | set[str]) -> bool:
|
|
111
|
+
if key in allow_exact:
|
|
112
|
+
return True
|
|
113
|
+
return any(key.startswith(prefix) for prefix in _allow_prefixes())
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def build_shell_env(
|
|
117
|
+
source_env: dict[str, str] | None = None,
|
|
118
|
+
*,
|
|
119
|
+
skill_env_keys: Iterable[str] | None = None,
|
|
120
|
+
extra_keys: Iterable[str] | None = None,
|
|
121
|
+
) -> dict[str, str]:
|
|
122
|
+
"""Construit l'environnement filtré pour le sous-processus shell.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
source_env: Environnement source (défaut ``os.environ``).
|
|
126
|
+
skill_env_keys: Variables déclarées par les skills chargées
|
|
127
|
+
(``requires_env``). Exposées car nécessaires à l'exécution des skills.
|
|
128
|
+
extra_keys: Clés additionnelles à exposer (override programmatique).
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
Dictionnaire d'environnement ne contenant que les clés autorisées.
|
|
132
|
+
En mode ``passthrough``, renvoie une copie complète de ``source_env``.
|
|
133
|
+
"""
|
|
134
|
+
src = dict(source_env if source_env is not None else os.environ)
|
|
135
|
+
|
|
136
|
+
if shell_env_mode() == "passthrough":
|
|
137
|
+
return src
|
|
138
|
+
|
|
139
|
+
allow_exact: set[str] = set(_BASE_ALLOW) | set(_FRAMEWORK_ALLOW)
|
|
140
|
+
allow_exact |= _extra_allowlist()
|
|
141
|
+
if skill_env_keys:
|
|
142
|
+
allow_exact |= {str(k).strip() for k in skill_env_keys if str(k).strip()}
|
|
143
|
+
if extra_keys:
|
|
144
|
+
allow_exact |= {str(k).strip() for k in extra_keys if str(k).strip()}
|
|
145
|
+
|
|
146
|
+
return {key: value for key, value in src.items() if _is_allowed(key, allow_exact)}
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def sensitive_env_values(
|
|
150
|
+
source_env: dict[str, str] | None = None,
|
|
151
|
+
*,
|
|
152
|
+
extra_allowed: Iterable[str] | None = None,
|
|
153
|
+
) -> list[str]:
|
|
154
|
+
"""Renvoie les valeurs des variables d'env considérées sensibles.
|
|
155
|
+
|
|
156
|
+
Utilisé pour alimenter le ``SecretRedactor`` : toute variable qui n'est pas
|
|
157
|
+
dans le socle système / wiring framework est considérée comme potentiellement
|
|
158
|
+
secrète, plus les variables sensibles qui restent exposées au shell
|
|
159
|
+
(``API_KEYS`` notamment).
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
source_env: Environnement source (défaut ``os.environ``).
|
|
163
|
+
extra_allowed: Clés exposées au shell (skills chargées) dont la valeur
|
|
164
|
+
doit malgré tout être masquée si elle ressemble à un secret.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
Liste de valeurs (chaînes) à masquer. Doublons et vides inclus — le
|
|
168
|
+
``SecretRedactor`` les filtre et déduplique.
|
|
169
|
+
"""
|
|
170
|
+
src = dict(source_env if source_env is not None else os.environ)
|
|
171
|
+
allow_exact: set[str] = set(_BASE_ALLOW)
|
|
172
|
+
values: list[str] = []
|
|
173
|
+
for key, value in src.items():
|
|
174
|
+
if not value:
|
|
175
|
+
continue
|
|
176
|
+
# Variables système non sensibles: ignorées.
|
|
177
|
+
if _is_allowed(key, allow_exact):
|
|
178
|
+
continue
|
|
179
|
+
# Wiring framework non secret: ne pas masquer (sinon on masque host/port,
|
|
180
|
+
# session_id, etc.). Seul API_KEYS du framework est secret.
|
|
181
|
+
if key in _FRAMEWORK_ALLOW and key != "API_KEYS":
|
|
182
|
+
continue
|
|
183
|
+
values.append(value)
|
|
184
|
+
# API_KEYS peut contenir plusieurs clés séparées par des virgules.
|
|
185
|
+
api_keys = src.get("API_KEYS", "").strip()
|
|
186
|
+
if api_keys:
|
|
187
|
+
values.extend(k.strip() for k in api_keys.split(",") if k.strip())
|
|
188
|
+
return values
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
__all__ = [
|
|
192
|
+
"build_shell_env",
|
|
193
|
+
"sensitive_env_values",
|
|
194
|
+
"shell_env_mode",
|
|
195
|
+
]
|