agent-framework-lib 0.8.7.post3__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.post3/agent_framework_lib.egg-info → agent_framework_lib-0.8.7.post5}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/agent_interface.py +16 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/base_agent.py +129 -49
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/model_router.py +0 -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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/shell_tool.py +70 -3
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/server.py +268 -55
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5/agent_framework_lib.egg-info}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/SOURCES.txt +3 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/pyproject.toml +1 -1
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/ARCHITECTURE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/LICENSE +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/MANIFEST.in +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/README.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/base.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/models.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/providers/postgres_provider.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/capabilities/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/capabilities/resolver.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/audit.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/config.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/git_provider.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/herdr_client.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/models.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/orchestrator.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/tools.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/activity_formatter.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/agent_provider.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/context_budget.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/context_summarizer.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/elasticsearch_config_provider.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/execution_controller.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/implementation_validator.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/interruption_message.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/knowledge_state.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/loop_detector.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/model_clients.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/model_config.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/models.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/prompt_builder.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/provider_calibration.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/scratchpad_compressor.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/scratchpad_serializer.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/state_manager.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/step_display_config.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/streaming_parts_accumulator.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/budget_aware_agent.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/llamaindex_agent.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/microsoft_agent.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/base.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/config.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/hypothesis_engine.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/implicit_feedback.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/manager.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/personalization.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/providers/graphiti_provider.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/providers/memori_provider.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/response_lessons.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/tools.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/work_patterns.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/api_timing_tracker.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/error_handling.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/error_logging.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/llm_metrics.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/llm_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/metrics_aggregator.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/metrics_config.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/observability_manager.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/otel_instrumentor.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/otel_logging_handler.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/otel_setup.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/performance_monitor.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/progress_tracker.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/resource_manager.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/timing_tracker.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/token_counter.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/tracing_context.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/notifications/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/notifications/hub.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/notifications/webhook_notifier.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/ai_content_management.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/markdown_converter.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/multimodal_integration.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/rich_content_validation.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/py.typed +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/session/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/session/elasticsearch_session_storage.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/session/session_storage.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/base.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/scripts/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/scripts/create_and_register.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/scripts/register_to_storage.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/chart/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/code_delivery/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/code_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/csv/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/csv/create_csv.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/csv/read_csv.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/csv/transform_csv.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/data_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/drawio/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/drawio/create_drawio.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/email_template/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/excel/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/excel/create_excel.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file/create_file.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file/list_files.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file/read_file.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file_access/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/form/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/image_display/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/image_gen/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/mermaid/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/multimodal/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/create_powerpoint.py +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → 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.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/templates/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/skill_creator/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/table/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → 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.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/word/SKILL.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/word/create_word.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/custom_skill_manager.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/discovery_prompt.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/markdown_loader.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/tools.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/storage/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/storage/file_storages.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/storage/file_system_management.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/storage/storage_optimizer.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/executor.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/message_injector.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/message_queue.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/retrigger.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/spawn_tool.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/activity_callback.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/adaptive_pdf_css.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/base.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/html_content_analyzer.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/multimodal_tools.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/pdf_image_scaler.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/sizing_config.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/web_fetch_tool.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/web_search_tool.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/path_utils.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/post_install.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/session_title_generator.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/source_detector.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/special_blocks.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/admin_auth.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/admin_models.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/admin_router.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/admin_services.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/api_timing_middleware.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/Dockerfile +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/README.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/docker-compose.yml +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
- {agent_framework_lib-0.8.7.post3 → 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.post3 → 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.post3 → 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.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/documentation_generator.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/gitnexus_client.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/helper_agent.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/helper_ui.html +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/modern_ui.html +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/otel_tracing_middleware.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/skills_router.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/test_app.html +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/__init__.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/artefacts.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/client.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/config.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/context.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/cursor.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/memory.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/models.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/poller.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/preferences.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/router.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/session.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/subscription.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/entry_points.txt +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/requires.txt +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/top_level.txt +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/ARCHITECTURE_DIAGRAM.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/CANCEL_AND_INTERRUPT_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/DEEPEVAL_TEST_REPORT.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/FILE_STORAGE_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/HISTORY_MESSAGE_FORMAT.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/MULTIMODAL_TOOLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/OBSERVABILITY_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/PYPI_PUBLISHING.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/QA_STREAMING_LATENCY.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/SCREENSHOTS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/SSE_NOTIFICATIONS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/STREAMING_EVENTS_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/framework_audit_remarques.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/helper_agent.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/index.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/README.md +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_context_budget_test.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_exemple_test.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_training_with_apo.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_custom_tools_file_storage.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_personalization.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/biagenttest.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/dependencies/docker-compose.yaml +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/pyproject.toml +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/test_work_patterns_live.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/workspace_test_agent.py +0 -0
- {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/setup.cfg +0 -0
- {agent_framework_lib-0.8.7.post3 → 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).
|
|
@@ -15,6 +15,7 @@ Subclasses must implement all abstract methods to provide framework-specific fun
|
|
|
15
15
|
|
|
16
16
|
from __future__ import annotations
|
|
17
17
|
|
|
18
|
+
import asyncio
|
|
18
19
|
import json
|
|
19
20
|
import logging
|
|
20
21
|
import os
|
|
@@ -28,6 +29,7 @@ if TYPE_CHECKING:
|
|
|
28
29
|
from collections.abc import AsyncGenerator
|
|
29
30
|
|
|
30
31
|
from ..capabilities.resolver import CapabilitySet
|
|
32
|
+
from ..security.secret_redactor import SecretRedactor
|
|
31
33
|
from ..subagents.executor import SubagentExecutor
|
|
32
34
|
from ..subagents.message_queue import SessionMessageQueue
|
|
33
35
|
from ..subagents.spawn_tool import SubagentSpawnTool
|
|
@@ -376,6 +378,41 @@ class BaseAgent(SkillsMixin, MemoryMixin, AgentInterface):
|
|
|
376
378
|
except Exception as e:
|
|
377
379
|
logger.warning(f"Could not propagate workspace secrets to live ShellTool: {e}")
|
|
378
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
|
+
|
|
379
416
|
def set_subagent_executor(self, executor: SubagentExecutor | None) -> None:
|
|
380
417
|
"""Inject or remove the shared SubagentExecutor.
|
|
381
418
|
|
|
@@ -640,7 +677,10 @@ class BaseAgent(SkillsMixin, MemoryMixin, AgentInterface):
|
|
|
640
677
|
try:
|
|
641
678
|
from ..tools.shell_tool import ShellTool
|
|
642
679
|
|
|
643
|
-
shell_tool = ShellTool(
|
|
680
|
+
shell_tool = ShellTool(
|
|
681
|
+
default_timeout=120,
|
|
682
|
+
skill_env_provider=self._loaded_skill_env_keys,
|
|
683
|
+
)
|
|
644
684
|
# Inject session context so that AGENT_USER_ID / AGENT_SESSION_ID are
|
|
645
685
|
# propagated to subprocesses (register_to_storage / create_and_register).
|
|
646
686
|
# Without this, generated files are uploaded without session_id and
|
|
@@ -849,13 +889,15 @@ class BaseAgent(SkillsMixin, MemoryMixin, AgentInterface):
|
|
|
849
889
|
user_id = session_configuration.get("user_id", "default_user")
|
|
850
890
|
provider = self._memory_manager.primary
|
|
851
891
|
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
892
|
+
# Les trois lectures mémoire (préférences, work patterns, response
|
|
893
|
+
# lessons) sont indépendantes et toutes I/O Graphiti : on les lance
|
|
894
|
+
# en parallèle pour réduire la latence du préprocessing. Le prompt
|
|
895
|
+
# résultant est identique au chemin séquentiel précédent.
|
|
896
|
+
facts, work_profile_block, lessons_block = await asyncio.gather(
|
|
897
|
+
self._recall_user_preferences(provider, user_id),
|
|
898
|
+
self._build_work_profile_block(provider, user_id),
|
|
899
|
+
self._build_lessons_block(provider, user_id),
|
|
857
900
|
)
|
|
858
|
-
facts = context.facts if context else []
|
|
859
901
|
|
|
860
902
|
if not facts:
|
|
861
903
|
# Replace placeholder with empty string if present
|
|
@@ -867,48 +909,6 @@ class BaseAgent(SkillsMixin, MemoryMixin, AgentInterface):
|
|
|
867
909
|
return
|
|
868
910
|
|
|
869
911
|
fact_lines = "\n".join(f"- {f.content}" for f in facts if f.content)
|
|
870
|
-
preference_block = f"[User Preferences]\n{fact_lines}"
|
|
871
|
-
|
|
872
|
-
# --- Work Pattern directives ---
|
|
873
|
-
work_profile_block = ""
|
|
874
|
-
try:
|
|
875
|
-
from ..memory.work_patterns import WorkPatternAnalyzer
|
|
876
|
-
|
|
877
|
-
wp_analyzer = WorkPatternAnalyzer(provider)
|
|
878
|
-
work_profile = await wp_analyzer.build_profile(
|
|
879
|
-
user_id=user_id,
|
|
880
|
-
agent_id=self.agent_id,
|
|
881
|
-
min_entries=3,
|
|
882
|
-
)
|
|
883
|
-
if work_profile.total_interactions >= 3:
|
|
884
|
-
directives = wp_analyzer.build_agent_directives(work_profile)
|
|
885
|
-
if directives:
|
|
886
|
-
work_profile_block = "\n\n[Directives de travail]\n" f"{directives}"
|
|
887
|
-
logger.info(
|
|
888
|
-
"Work pattern directives injected for user=%s: %d interactions",
|
|
889
|
-
user_id,
|
|
890
|
-
work_profile.total_interactions,
|
|
891
|
-
)
|
|
892
|
-
except Exception as e:
|
|
893
|
-
logger.debug("Work pattern injection skipped: %s", e)
|
|
894
|
-
|
|
895
|
-
# --- Response Lessons (the key part) ---
|
|
896
|
-
lessons_block = ""
|
|
897
|
-
try:
|
|
898
|
-
from ..memory.response_lessons import format_lessons_for_prompt, recall_lessons
|
|
899
|
-
|
|
900
|
-
lessons = await recall_lessons(provider, user_id, self.agent_id, limit=10)
|
|
901
|
-
if lessons:
|
|
902
|
-
formatted = format_lessons_for_prompt(lessons)
|
|
903
|
-
if formatted:
|
|
904
|
-
lessons_block = f"\n\n[Leçons apprises — compléments à inclure automatiquement]\n{formatted}"
|
|
905
|
-
logger.info(
|
|
906
|
-
"Response lessons injected for user=%s: %d lessons",
|
|
907
|
-
user_id,
|
|
908
|
-
len(lessons),
|
|
909
|
-
)
|
|
910
|
-
except Exception as e:
|
|
911
|
-
logger.debug("Response lessons injection skipped: %s", e)
|
|
912
912
|
|
|
913
913
|
preference_block = (
|
|
914
914
|
f"[User Preferences]\n{fact_lines}{work_profile_block}{lessons_block}"
|
|
@@ -927,6 +927,86 @@ class BaseAgent(SkillsMixin, MemoryMixin, AgentInterface):
|
|
|
927
927
|
except Exception as e:
|
|
928
928
|
logger.warning("Personalization injection skipped: %s", e)
|
|
929
929
|
|
|
930
|
+
async def _recall_user_preferences(self, provider: Any, user_id: str) -> list[Any]:
|
|
931
|
+
"""Recall les facts de préférences utilisateur depuis la mémoire.
|
|
932
|
+
|
|
933
|
+
Args:
|
|
934
|
+
provider: Provider mémoire primaire.
|
|
935
|
+
user_id: Identifiant utilisateur.
|
|
936
|
+
|
|
937
|
+
Returns:
|
|
938
|
+
Liste de facts de préférences (vide si aucun).
|
|
939
|
+
"""
|
|
940
|
+
context = await provider.recall(
|
|
941
|
+
user_id=user_id,
|
|
942
|
+
agent_id=self.agent_id,
|
|
943
|
+
query="préférences style réponse utilisateur",
|
|
944
|
+
limit=20,
|
|
945
|
+
)
|
|
946
|
+
return context.facts if context else []
|
|
947
|
+
|
|
948
|
+
async def _build_work_profile_block(self, provider: Any, user_id: str) -> str:
|
|
949
|
+
"""Construit le bloc de directives de travail depuis les work patterns.
|
|
950
|
+
|
|
951
|
+
Args:
|
|
952
|
+
provider: Provider mémoire primaire.
|
|
953
|
+
user_id: Identifiant utilisateur.
|
|
954
|
+
|
|
955
|
+
Returns:
|
|
956
|
+
Bloc texte à injecter (vide si pas assez de données ou en cas d'échec).
|
|
957
|
+
"""
|
|
958
|
+
try:
|
|
959
|
+
from ..memory.work_patterns import WorkPatternAnalyzer
|
|
960
|
+
|
|
961
|
+
wp_analyzer = WorkPatternAnalyzer(provider)
|
|
962
|
+
work_profile = await wp_analyzer.build_profile(
|
|
963
|
+
user_id=user_id,
|
|
964
|
+
agent_id=self.agent_id,
|
|
965
|
+
min_entries=3,
|
|
966
|
+
)
|
|
967
|
+
if work_profile.total_interactions >= 3:
|
|
968
|
+
directives = wp_analyzer.build_agent_directives(work_profile)
|
|
969
|
+
if directives:
|
|
970
|
+
logger.info(
|
|
971
|
+
"Work pattern directives injected for user=%s: %d interactions",
|
|
972
|
+
user_id,
|
|
973
|
+
work_profile.total_interactions,
|
|
974
|
+
)
|
|
975
|
+
return "\n\n[Directives de travail]\n" f"{directives}"
|
|
976
|
+
except Exception as e:
|
|
977
|
+
logger.debug("Work pattern injection skipped: %s", e)
|
|
978
|
+
return ""
|
|
979
|
+
|
|
980
|
+
async def _build_lessons_block(self, provider: Any, user_id: str) -> str:
|
|
981
|
+
"""Construit le bloc de leçons apprises depuis les response lessons.
|
|
982
|
+
|
|
983
|
+
Args:
|
|
984
|
+
provider: Provider mémoire primaire.
|
|
985
|
+
user_id: Identifiant utilisateur.
|
|
986
|
+
|
|
987
|
+
Returns:
|
|
988
|
+
Bloc texte à injecter (vide si aucune leçon ou en cas d'échec).
|
|
989
|
+
"""
|
|
990
|
+
try:
|
|
991
|
+
from ..memory.response_lessons import format_lessons_for_prompt, recall_lessons
|
|
992
|
+
|
|
993
|
+
lessons = await recall_lessons(provider, user_id, self.agent_id, limit=10)
|
|
994
|
+
if lessons:
|
|
995
|
+
formatted = format_lessons_for_prompt(lessons)
|
|
996
|
+
if formatted:
|
|
997
|
+
logger.info(
|
|
998
|
+
"Response lessons injected for user=%s: %d lessons",
|
|
999
|
+
user_id,
|
|
1000
|
+
len(lessons),
|
|
1001
|
+
)
|
|
1002
|
+
return (
|
|
1003
|
+
"\n\n[Leçons apprises — compléments à inclure automatiquement]\n"
|
|
1004
|
+
f"{formatted}"
|
|
1005
|
+
)
|
|
1006
|
+
except Exception as e:
|
|
1007
|
+
logger.debug("Response lessons injection skipped: %s", e)
|
|
1008
|
+
return ""
|
|
1009
|
+
|
|
930
1010
|
def _has_shell_tool(self) -> bool:
|
|
931
1011
|
"""Check whether a shell tool is available."""
|
|
932
1012
|
return self._live_shell_tool is not None
|
|
@@ -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"]
|