agent-framework-lib 0.8.9__tar.gz → 0.8.9.post2__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.9/agent_framework_lib.egg-info → agent_framework_lib-0.8.9.post2}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/security/authz.py +27 -9
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/utils/post_install.py +66 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/admin_auth.py +70 -1
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/modern_ui.html +26 -9
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/server.py +54 -18
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/skills_router.py +8 -5
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2/agent_framework_lib.egg-info}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/SECURITY_HARDENING.md +19 -2
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/pyproject.toml +1 -1
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/ARCHITECTURE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/LICENSE +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/MANIFEST.in +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/README.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/base.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/endpoints/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/models.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/providers/postgres_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/capabilities/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/capabilities/resolver.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/code_delivery/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/code_delivery/audit.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/code_delivery/config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/code_delivery/crypto.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/code_delivery/git_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/code_delivery/herdr_client.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/code_delivery/models.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/code_delivery/orchestrator.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/code_delivery/store.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/code_delivery/tools.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/activity_formatter.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/agent_interface.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/agent_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/base_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/context_budget.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/context_summarizer.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/elasticsearch_config_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/execution_controller.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/implementation_validator.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/interruption_message.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/knowledge_state.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/loop_detector.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/model_clients.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/model_config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/model_router.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/models.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/prompt_builder.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/provider_calibration.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/scratchpad_compressor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/scratchpad_serializer.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/state_manager.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/step_display_config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/core/streaming_parts_accumulator.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/implementations/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/implementations/budget_aware_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/implementations/llamaindex_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/implementations/microsoft_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/base.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/hypothesis_engine.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/implicit_feedback.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/manager.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/personalization.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/providers/graphiti_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/providers/memori_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/response_lessons.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/tools.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/memory/work_patterns.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/api_timing_tracker.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/error_handling.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/error_logging.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/llm_metrics.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/llm_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/metrics_aggregator.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/metrics_config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/observability_manager.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/otel_instrumentor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/otel_logging_handler.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/otel_setup.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/performance_monitor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/progress_tracker.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/resource_manager.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/timing_tracker.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/token_counter.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/monitoring/tracing_context.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/notifications/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/notifications/hub.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/notifications/webhook_notifier.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/processing/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/processing/ai_content_management.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/processing/markdown_converter.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/processing/multimodal_integration.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/processing/rich_content_validation.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/py.typed +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/security/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/security/file_view_token.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/security/input_guard.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/security/openshell_policy.yaml +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/security/pii_redactor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/security/sandbox.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/security/sandbox_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/security/secret_redactor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/security/shell_env.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/security/upload_token.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/session/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/session/elasticsearch_session_storage.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/session/session_storage.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/base.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/scripts/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/scripts/create_and_register.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/scripts/register_to_storage.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/chart/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/chart/chart_to_image.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/chart/vendor_chart.umd.min.js +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/code_delivery/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/code_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/code_format/format_python.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/csv/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/csv/create_csv.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/csv/read_csv.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/csv/transform_csv.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/data_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/data_format/json_to_yaml.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/data_format/yaml_to_json.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/drawio/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/drawio/create_drawio.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/email_template/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/excel/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/excel/create_excel.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/file/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/file/create_file.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/file/list_files.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/file/read_file.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/file_access/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/file_access/download_to_local.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/file_access/get_file_path.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/form/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/image_display/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/image_gen/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/image_gen/create_image.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/mermaid/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/mermaid/mermaid_to_image.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/mermaid/vendor_mermaid.umd.min.js +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/multimodal/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/powerpoint/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/powerpoint/create_powerpoint.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/powerpoint/templates/Big Data Infographics.pptx +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/powerpoint/templates/Executive Design Pitch Deck.pptx +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/powerpoint/templates/Management Consulting Toolkit.pptx +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/powerpoint/templates/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/powerpoint/templates/generate_templates.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/skill_creator/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/skill_creator/skill_api.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/table/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/table/table_to_image.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/unified_pdf/create_pdf.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/web_news_search/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/web_news_search/web_news_search.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/word/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/builtin/skills/word/create_word.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/custom_skill_manager.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/discovery_prompt.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/markdown_loader.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/skills/tools.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/storage/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/storage/file_storages.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/storage/file_system_management.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/storage/storage_optimizer.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/subagents/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/subagents/executor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/subagents/message_injector.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/subagents/message_queue.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/subagents/retrigger.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/subagents/spawn_tool.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/tools/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/tools/activity_callback.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/tools/adaptive_pdf_css.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/tools/base.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/tools/html_content_analyzer.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/tools/multimodal_tools.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/tools/pdf_image_scaler.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/tools/shell_tool.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/tools/sizing_config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/tools/web_fetch_tool.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/tools/web_search_tool.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/utils/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/utils/path_utils.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/utils/session_title_generator.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/utils/source_detector.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/utils/special_blocks.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/admin_models.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/admin_router.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/admin_services.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/api_timing_middleware.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/Dockerfile +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/README.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/docker-compose.yml +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/documentation_generator.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/gitnexus_client.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/helper_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/helper_ui.html +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/otel_tracing_middleware.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/test_app.html +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/core/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/core/builder.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/core/chat_completion.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/core/context.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/core/decorators.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/core/engine.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/core/errors.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/core/monitoring.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/core/runner.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/core/state.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/core/types.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/implementations/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/implementations/langgraph_engine.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/server/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/server/router.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workflow/server/schemas.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/artefacts.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/client.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/context.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/cursor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/memory.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/models.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/poller.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/preferences.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/router.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/session.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/workspace/subscription.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework_lib.egg-info/SOURCES.txt +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework_lib.egg-info/entry_points.txt +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework_lib.egg-info/requires.txt +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework_lib.egg-info/top_level.txt +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/ARCHITECTURE_DIAGRAM.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/CANCEL_AND_INTERRUPT_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/DEEPEVAL_TEST_REPORT.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/DIAGNOSTIC_SANDBOX_SKILLS.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/FILE_STORAGE_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/HISTORY_MESSAGE_FORMAT.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/MULTIMODAL_TOOLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/OBSERVABILITY_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/OPENSHELL_GATEWAY_HOST_SETUP.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/PYPI_PUBLISHING.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/QA_STREAMING_LATENCY.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/SCREENSHOTS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/SECRETS_MANAGEMENT.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/SSE_NOTIFICATIONS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/STREAMING_EVENTS_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/framework_audit_remarques.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/helper_agent.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/index.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/README.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/agent_context_budget_test.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/agent_exemple_test.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/agent_training_with_apo.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/agent_with_custom_tools_file_storage.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/agent_with_personalization.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/biagenttest.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/dependencies/docker-compose.yaml +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/pyproject.toml +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/test_work_patterns_live.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/workflow_engine_example.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/examples/workspace_test_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/setup.cfg +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/setup.py +0 -0
{agent_framework_lib-0.8.9/agent_framework_lib.egg-info → agent_framework_lib-0.8.9.post2}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-framework-lib
|
|
3
|
-
Version: 0.8.9
|
|
3
|
+
Version: 0.8.9.post2
|
|
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>
|
{agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/security/authz.py
RENAMED
|
@@ -86,26 +86,44 @@ def resolve_effective_user_id(current_user: str, requested_user_id: str | None)
|
|
|
86
86
|
return current_user
|
|
87
87
|
|
|
88
88
|
|
|
89
|
-
def is_owner(
|
|
90
|
-
|
|
89
|
+
def is_owner(
|
|
90
|
+
resource_user_id: str | None,
|
|
91
|
+
principal: str,
|
|
92
|
+
*,
|
|
93
|
+
is_admin: bool = False,
|
|
94
|
+
) -> bool:
|
|
95
|
+
"""Vérifie que ``principal`` possède la ressource (autorisation role-based).
|
|
96
|
+
|
|
97
|
+
Le ``principal`` passé DOIT être l'**utilisateur effectif** de la requête
|
|
98
|
+
(résolu via :func:`resolve_effective_user_id`), pas le pseudo-principal d'une
|
|
99
|
+
clé API partagée par un portail. L'accès cross-utilisateur n'est accordé que
|
|
100
|
+
via le **rôle admin** (``is_admin=True``), pas par la confiance accordée à
|
|
101
|
+
tout détenteur de clé.
|
|
102
|
+
|
|
103
|
+
Note (changement de modèle) : le court-circuit historique
|
|
104
|
+
``trust_client_user_id() -> True`` est **supprimé**. ``AUTH_TRUST_CLIENT_USER_ID``
|
|
105
|
+
ne sert plus qu'à *résoudre* l'utilisateur effectif (honorer le ``user_id``
|
|
106
|
+
fourni par un portail de confiance) dans :func:`resolve_effective_user_id` ;
|
|
107
|
+
il n'autorise plus, à lui seul, l'accès aux ressources d'autrui.
|
|
91
108
|
|
|
92
109
|
Args:
|
|
93
110
|
resource_user_id: Identifiant du propriétaire de la ressource
|
|
94
111
|
(``None`` si la ressource n'a pas de propriétaire connu).
|
|
95
|
-
principal: Identité
|
|
112
|
+
principal: Identité **effective** demandant l'accès.
|
|
113
|
+
is_admin: ``True`` si l'appelant est authentifié comme admin (rôle
|
|
114
|
+
privilégié QA/support) — court-circuite la vérification de propriété.
|
|
96
115
|
|
|
97
116
|
Returns:
|
|
98
|
-
``True`` si
|
|
99
|
-
est actif et que
|
|
100
|
-
|
|
101
|
-
de confiance peut accéder aux ressources de n'importe quel end-user).
|
|
117
|
+
``True`` si l'appelant est admin, si ``principal`` possède la ressource,
|
|
118
|
+
ou si le mode développement est actif et que ``principal`` est
|
|
119
|
+
``"anonymous"`` (compat mono-utilisateur). ``False`` sinon.
|
|
102
120
|
"""
|
|
121
|
+
if is_admin:
|
|
122
|
+
return True
|
|
103
123
|
if resource_user_id is not None and resource_user_id == principal:
|
|
104
124
|
return True
|
|
105
125
|
if dev_mode_enabled() and principal == ANONYMOUS_PRINCIPAL:
|
|
106
126
|
return True
|
|
107
|
-
if trust_client_user_id():
|
|
108
|
-
return True
|
|
109
127
|
return False
|
|
110
128
|
|
|
111
129
|
|
{agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/utils/post_install.py
RENAMED
|
@@ -1076,6 +1076,70 @@ def _find_local_wheel() -> Path | None:
|
|
|
1076
1076
|
return None
|
|
1077
1077
|
|
|
1078
1078
|
|
|
1079
|
+
_IMAGE_PIN_NAME = "sandbox-image-pin"
|
|
1080
|
+
|
|
1081
|
+
|
|
1082
|
+
def _ensure_image_pin(tag: str) -> None:
|
|
1083
|
+
"""Keep a tiny container running off the CURRENT sandbox image so an external
|
|
1084
|
+
``docker image prune`` / ``docker system prune`` cannot remove it.
|
|
1085
|
+
|
|
1086
|
+
A running container's image — AND its tag — survive a prune. The pin is
|
|
1087
|
+
(re)created whenever it is missing OR points at a different image id, because
|
|
1088
|
+
``docker build -t <tag>`` moves the tag to a NEW image and leaves a stale pin
|
|
1089
|
+
on the old one (then the new, unpinned, tagged image gets pruned → the tag
|
|
1090
|
+
vanishes → ``ImagePullFailed`` on the next sandbox). Re-pinning the freshly
|
|
1091
|
+
built/current image right here closes that window on every boot and rebuild.
|
|
1092
|
+
Best-effort: never fatal, never blocks the agent.
|
|
1093
|
+
"""
|
|
1094
|
+
if not _docker_ok():
|
|
1095
|
+
return
|
|
1096
|
+
try:
|
|
1097
|
+
tag_inspect = subprocess.run(
|
|
1098
|
+
["docker", "image", "inspect", "-f", "{{.Id}}", tag],
|
|
1099
|
+
capture_output=True,
|
|
1100
|
+
text=True,
|
|
1101
|
+
timeout=30,
|
|
1102
|
+
)
|
|
1103
|
+
if tag_inspect.returncode != 0:
|
|
1104
|
+
return # tag not present locally — nothing to pin
|
|
1105
|
+
want = (tag_inspect.stdout or "").strip()
|
|
1106
|
+
pin = subprocess.run(
|
|
1107
|
+
["docker", "inspect", "-f", "{{.State.Running}} {{.Image}}", _IMAGE_PIN_NAME],
|
|
1108
|
+
capture_output=True,
|
|
1109
|
+
text=True,
|
|
1110
|
+
timeout=30,
|
|
1111
|
+
)
|
|
1112
|
+
if pin.returncode == 0:
|
|
1113
|
+
running, _, img = (pin.stdout or "").strip().partition(" ")
|
|
1114
|
+
if running == "true" and img == want:
|
|
1115
|
+
return # already pinned to the current image — nothing to do
|
|
1116
|
+
subprocess.run(["docker", "rm", "-f", _IMAGE_PIN_NAME], capture_output=True, timeout=30)
|
|
1117
|
+
r = subprocess.run(
|
|
1118
|
+
[
|
|
1119
|
+
"docker",
|
|
1120
|
+
"run",
|
|
1121
|
+
"-d",
|
|
1122
|
+
"--name",
|
|
1123
|
+
_IMAGE_PIN_NAME,
|
|
1124
|
+
"--restart",
|
|
1125
|
+
"always",
|
|
1126
|
+
"--entrypoint",
|
|
1127
|
+
"sleep",
|
|
1128
|
+
tag,
|
|
1129
|
+
"infinity",
|
|
1130
|
+
],
|
|
1131
|
+
capture_output=True,
|
|
1132
|
+
text=True,
|
|
1133
|
+
timeout=60,
|
|
1134
|
+
)
|
|
1135
|
+
if r.returncode == 0:
|
|
1136
|
+
logger.info("[sandbox] pinned image %s (prune-proof) via %s", tag, _IMAGE_PIN_NAME)
|
|
1137
|
+
else:
|
|
1138
|
+
logger.warning("[sandbox] image pin failed: %s", (r.stderr or "")[-200:])
|
|
1139
|
+
except Exception as exc: # noqa: BLE001 — pinning must never break startup
|
|
1140
|
+
logger.warning("[sandbox] image pin error: %s", exc)
|
|
1141
|
+
|
|
1142
|
+
|
|
1079
1143
|
def _render_sandbox_dockerfile(install_line: str, version: str = "") -> str:
|
|
1080
1144
|
"""Self-contained Dockerfile for the per-session sandbox image.
|
|
1081
1145
|
|
|
@@ -1131,6 +1195,7 @@ def ensure_sandbox_image(tag: str = _SANDBOX_IMAGE_TAG) -> tuple[bool, str | Non
|
|
|
1131
1195
|
if _sandbox_image_exists(tag) and not force:
|
|
1132
1196
|
built_version = _sandbox_image_version(tag)
|
|
1133
1197
|
if built_version == _afl_version:
|
|
1198
|
+
_ensure_image_pin(tag) # keep it prune-proof even when no rebuild is needed
|
|
1134
1199
|
return True, None
|
|
1135
1200
|
logger.info(
|
|
1136
1201
|
"[sandbox] image %s built for version %r != package %r — rebuilding",
|
|
@@ -1173,6 +1238,7 @@ def ensure_sandbox_image(tag: str = _SANDBOX_IMAGE_TAG) -> tuple[bool, str | Non
|
|
|
1173
1238
|
finally:
|
|
1174
1239
|
shutil.rmtree(build_dir, ignore_errors=True)
|
|
1175
1240
|
if r.returncode == 0:
|
|
1241
|
+
_ensure_image_pin(tag) # pin the freshly built image so a prune can't drop the tag
|
|
1176
1242
|
return True, None
|
|
1177
1243
|
return False, f"sandbox image build failed: {r.stderr[-400:]}"
|
|
1178
1244
|
|
{agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/admin_auth.py
RENAMED
|
@@ -14,7 +14,12 @@ import secrets
|
|
|
14
14
|
from datetime import datetime, timedelta, timezone
|
|
15
15
|
|
|
16
16
|
from fastapi import Depends, HTTPException, status
|
|
17
|
-
from fastapi.security import
|
|
17
|
+
from fastapi.security import (
|
|
18
|
+
HTTPAuthorizationCredentials,
|
|
19
|
+
HTTPBasic,
|
|
20
|
+
HTTPBasicCredentials,
|
|
21
|
+
HTTPBearer,
|
|
22
|
+
)
|
|
18
23
|
|
|
19
24
|
from .admin_models import AdminAuthResponse
|
|
20
25
|
|
|
@@ -28,6 +33,10 @@ TOKEN_PREFIX = "admin_"
|
|
|
28
33
|
# Security scheme for admin endpoints
|
|
29
34
|
admin_bearer_security = HTTPBearer(auto_error=False)
|
|
30
35
|
|
|
36
|
+
# Basic-auth extraction for the unified admin role (``require_admin``). Optional so
|
|
37
|
+
# a request without Basic credentials is not rejected before the Bearer path runs.
|
|
38
|
+
admin_basic_security = HTTPBasic(auto_error=False)
|
|
39
|
+
|
|
31
40
|
# In-memory token store (in production, consider using Redis or similar)
|
|
32
41
|
# Format: {token_hash: {"expires_at": datetime, "created_at": datetime}}
|
|
33
42
|
_admin_tokens: dict[str, dict[str, datetime]] = {}
|
|
@@ -240,6 +249,66 @@ async def get_admin_user(
|
|
|
240
249
|
return "admin"
|
|
241
250
|
|
|
242
251
|
|
|
252
|
+
async def require_admin(
|
|
253
|
+
bearer_credentials: HTTPAuthorizationCredentials | None = Depends(admin_bearer_security),
|
|
254
|
+
basic_credentials: HTTPBasicCredentials | None = Depends(admin_basic_security),
|
|
255
|
+
) -> str:
|
|
256
|
+
"""Authorize an admin caller via EITHER channel of the single admin secret.
|
|
257
|
+
|
|
258
|
+
Two admin entry points exist in the UI: the admin-panel **Bearer** token
|
|
259
|
+
(minted from ``ADMIN_PASSWORD`` via ``/api/admin/auth/verify``) and HTTP
|
|
260
|
+
**Basic** credentials whose password is the admin password. Both ultimately
|
|
261
|
+
prove knowledge of ``ADMIN_PASSWORD``; this dependency accepts either so an
|
|
262
|
+
operator does not need a second, separate credential to mutate skills. No new
|
|
263
|
+
secret is introduced.
|
|
264
|
+
|
|
265
|
+
Args:
|
|
266
|
+
bearer_credentials: Optional Bearer token (admin session token).
|
|
267
|
+
basic_credentials: Optional HTTP Basic credentials.
|
|
268
|
+
|
|
269
|
+
Returns:
|
|
270
|
+
The string ``"admin"`` when authorized.
|
|
271
|
+
|
|
272
|
+
Raises:
|
|
273
|
+
HTTPException: 401 when neither channel proves admin authority.
|
|
274
|
+
"""
|
|
275
|
+
if bearer_credentials and validate_admin_token(bearer_credentials.credentials):
|
|
276
|
+
return "admin"
|
|
277
|
+
if basic_credentials and verify_admin_password(basic_credentials.password):
|
|
278
|
+
return "admin"
|
|
279
|
+
|
|
280
|
+
logger.warning(
|
|
281
|
+
"[ADMIN AUTH] Admin authorization refused: no valid admin token nor admin "
|
|
282
|
+
"Basic credential."
|
|
283
|
+
)
|
|
284
|
+
raise HTTPException(
|
|
285
|
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
286
|
+
detail="Admin authentication required",
|
|
287
|
+
headers={"WWW-Authenticate": "Bearer"},
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
async def get_optional_admin(
|
|
292
|
+
bearer_credentials: HTTPAuthorizationCredentials | None = Depends(admin_bearer_security),
|
|
293
|
+
basic_credentials: HTTPBasicCredentials | None = Depends(admin_basic_security),
|
|
294
|
+
) -> bool:
|
|
295
|
+
"""Non-raising admin probe: ``True`` iff the caller proves admin authority.
|
|
296
|
+
|
|
297
|
+
Same acceptance as :func:`require_admin` (admin Bearer token OR HTTP Basic
|
|
298
|
+
with the admin password) but returns a boolean instead of raising, so a
|
|
299
|
+
regular resource endpoint can grant the admin role (cross-user access) when
|
|
300
|
+
present while still serving non-admin owners normally.
|
|
301
|
+
|
|
302
|
+
Returns:
|
|
303
|
+
``True`` when a valid admin credential is present, ``False`` otherwise.
|
|
304
|
+
"""
|
|
305
|
+
if bearer_credentials and validate_admin_token(bearer_credentials.credentials):
|
|
306
|
+
return True
|
|
307
|
+
if basic_credentials and verify_admin_password(basic_credentials.password):
|
|
308
|
+
return True
|
|
309
|
+
return False
|
|
310
|
+
|
|
311
|
+
|
|
243
312
|
def authenticate_admin(password: str) -> AdminAuthResponse:
|
|
244
313
|
"""
|
|
245
314
|
Authenticate an admin user with password and return a session token.
|
{agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/modern_ui.html
RENAMED
|
@@ -4341,6 +4341,16 @@
|
|
|
4341
4341
|
}
|
|
4342
4342
|
},
|
|
4343
4343
|
|
|
4344
|
+
adminAuthHeader() {
|
|
4345
|
+
// Skill mutations require the admin role (backend: require_admin).
|
|
4346
|
+
// Prefer the admin-panel Bearer token; fall back to the Basic admin
|
|
4347
|
+
// credential. Either proves ADMIN_PASSWORD. Returns {} if neither is
|
|
4348
|
+
// present (the request will then be correctly rejected with 401).
|
|
4349
|
+
if (this.adminPanelToken) return { 'Authorization': 'Bearer ' + this.adminPanelToken };
|
|
4350
|
+
if (this.adminToken) return { 'Authorization': 'Basic ' + this.adminToken };
|
|
4351
|
+
return {};
|
|
4352
|
+
},
|
|
4353
|
+
|
|
4344
4354
|
async saveSkill() {
|
|
4345
4355
|
const splitList = (s) => s ? s.split(',').map(x => x.trim()).filter(Boolean) : [];
|
|
4346
4356
|
const body = {
|
|
@@ -4361,13 +4371,13 @@
|
|
|
4361
4371
|
if (this.skillsView === 'create') {
|
|
4362
4372
|
response = await fetch(BASE_PATH + '/api/skills', {
|
|
4363
4373
|
method: 'POST',
|
|
4364
|
-
headers: { 'Content-Type': 'application/json' },
|
|
4374
|
+
headers: { 'Content-Type': 'application/json', ...this.adminAuthHeader() },
|
|
4365
4375
|
body: JSON.stringify(body),
|
|
4366
4376
|
});
|
|
4367
4377
|
} else {
|
|
4368
4378
|
response = await fetch(BASE_PATH + '/api/skills/' + encodeURIComponent(this.skillEditName), {
|
|
4369
4379
|
method: 'PUT',
|
|
4370
|
-
headers: { 'Content-Type': 'application/json' },
|
|
4380
|
+
headers: { 'Content-Type': 'application/json', ...this.adminAuthHeader() },
|
|
4371
4381
|
body: JSON.stringify(body),
|
|
4372
4382
|
});
|
|
4373
4383
|
}
|
|
@@ -4383,7 +4393,7 @@
|
|
|
4383
4393
|
formData.append('file', pf.file);
|
|
4384
4394
|
const resp = await fetch(
|
|
4385
4395
|
BASE_PATH + '/api/skills/' + encodeURIComponent(skillName) + '/files',
|
|
4386
|
-
{ method: 'POST', body: formData }
|
|
4396
|
+
{ method: 'POST', headers: { ...this.adminAuthHeader() }, body: formData }
|
|
4387
4397
|
);
|
|
4388
4398
|
if (!resp.ok) {
|
|
4389
4399
|
const err = await resp.json().catch(() => ({}));
|
|
@@ -4411,7 +4421,7 @@
|
|
|
4411
4421
|
|
|
4412
4422
|
async deleteSkill(name) {
|
|
4413
4423
|
try {
|
|
4414
|
-
const response = await fetch(BASE_PATH + '/api/skills/' + encodeURIComponent(name), { method: 'DELETE' });
|
|
4424
|
+
const response = await fetch(BASE_PATH + '/api/skills/' + encodeURIComponent(name), { method: 'DELETE', headers: { ...this.adminAuthHeader() } });
|
|
4415
4425
|
if (response.ok) {
|
|
4416
4426
|
this.skillDeleteConfirm = null;
|
|
4417
4427
|
await this.loadSkills();
|
|
@@ -4479,7 +4489,7 @@
|
|
|
4479
4489
|
formData.append('file', file);
|
|
4480
4490
|
const resp = await fetch(
|
|
4481
4491
|
BASE_PATH + '/api/skills/' + encodeURIComponent(this.skillEditName) + '/files',
|
|
4482
|
-
{ method: 'POST', body: formData }
|
|
4492
|
+
{ method: 'POST', headers: { ...this.adminAuthHeader() }, body: formData }
|
|
4483
4493
|
);
|
|
4484
4494
|
if (!resp.ok) {
|
|
4485
4495
|
const err = await resp.json().catch(() => ({}));
|
|
@@ -4499,7 +4509,7 @@
|
|
|
4499
4509
|
try {
|
|
4500
4510
|
const resp = await fetch(
|
|
4501
4511
|
BASE_PATH + '/api/skills/' + encodeURIComponent(this.skillEditName) + '/files/' + encodeURIComponent(filename),
|
|
4502
|
-
{ method: 'DELETE' }
|
|
4512
|
+
{ method: 'DELETE', headers: { ...this.adminAuthHeader() } }
|
|
4503
4513
|
);
|
|
4504
4514
|
if (resp.ok) {
|
|
4505
4515
|
await this.refreshSkillFiles();
|
|
@@ -11979,8 +11989,12 @@
|
|
|
11979
11989
|
async downloadFile(fileId) {
|
|
11980
11990
|
console.log('[downloadFile] Downloading file:', fileId);
|
|
11981
11991
|
try {
|
|
11982
|
-
|
|
11983
|
-
|
|
11992
|
+
// Scope to the viewed end-user (honored by the server for a
|
|
11993
|
+
// trusted portal) + carry the admin credential so an admin can
|
|
11994
|
+
// download any user's file (role-based authz on the endpoint).
|
|
11995
|
+
const scope = this.selectedUserId ? `?user_id=${encodeURIComponent(this.selectedUserId)}` : '';
|
|
11996
|
+
const headers = { ...this.adminAuthHeader() };
|
|
11997
|
+
const response = await fetch(`${BASE_PATH}/files/${fileId}/download${scope}`, {
|
|
11984
11998
|
method: 'GET',
|
|
11985
11999
|
headers: headers
|
|
11986
12000
|
});
|
|
@@ -12299,7 +12313,10 @@
|
|
|
12299
12313
|
|
|
12300
12314
|
async downloadFileFromPanel(file) {
|
|
12301
12315
|
try {
|
|
12302
|
-
const
|
|
12316
|
+
const scope = this.selectedUserId ? `?user_id=${encodeURIComponent(this.selectedUserId)}` : '';
|
|
12317
|
+
const response = await fetch(`${BASE_PATH}/files/${file.file_id}/download${scope}`, {
|
|
12318
|
+
headers: { ...this.adminAuthHeader() },
|
|
12319
|
+
});
|
|
12303
12320
|
if (response.ok) {
|
|
12304
12321
|
const blob = await response.blob();
|
|
12305
12322
|
const url = window.URL.createObjectURL(blob);
|
|
@@ -1831,6 +1831,7 @@ if OTEL_TRACING_ENABLED:
|
|
|
1831
1831
|
# and configuration management. It requires Elasticsearch to be enabled.
|
|
1832
1832
|
# The router's endpoints handle ES availability through the require_elasticsearch dependency,
|
|
1833
1833
|
# returning HTTP 503 when ES is not available.
|
|
1834
|
+
from .admin_auth import get_optional_admin # noqa: E402 (admin role probe for file endpoints)
|
|
1834
1835
|
from .admin_router import admin_router
|
|
1835
1836
|
|
|
1836
1837
|
|
|
@@ -5368,12 +5369,17 @@ async def upload_file(
|
|
|
5368
5369
|
async def download_file(
|
|
5369
5370
|
file_id: str,
|
|
5370
5371
|
inline: bool = Query(False, description="If true, display inline instead of forcing download"),
|
|
5372
|
+
user_id: str | None = Query(
|
|
5373
|
+
None, description="End-user the request acts for (honored from a trusted portal)"
|
|
5374
|
+
),
|
|
5371
5375
|
current_user: str = Depends(get_current_user),
|
|
5376
|
+
is_admin: bool = Depends(get_optional_admin),
|
|
5372
5377
|
):
|
|
5373
5378
|
"""Download file from storage. Use ?inline=true to display in browser instead of downloading."""
|
|
5374
5379
|
try:
|
|
5380
|
+
effective_user = resolve_effective_user_id(current_user, user_id)
|
|
5375
5381
|
logger.info(
|
|
5376
|
-
f"🔽 DOWNLOAD ENDPOINT - Attempting to download file: {file_id} for user: {
|
|
5382
|
+
f"🔽 DOWNLOAD ENDPOINT - Attempting to download file: {file_id} for user: {effective_user}, inline={inline}"
|
|
5377
5383
|
)
|
|
5378
5384
|
|
|
5379
5385
|
# Check if file storage manager is available
|
|
@@ -5387,12 +5393,12 @@ async def download_file(
|
|
|
5387
5393
|
f"📄 DOWNLOAD ENDPOINT - File metadata: mime_type={metadata.mime_type}, storage_path={metadata.storage_path}"
|
|
5388
5394
|
)
|
|
5389
5395
|
|
|
5390
|
-
# Object-level authorization:
|
|
5391
|
-
#
|
|
5392
|
-
# the file's existence to non-owners.
|
|
5393
|
-
if not is_owner(metadata.user_id,
|
|
5396
|
+
# Object-level authorization: the effective end-user must own the file, or
|
|
5397
|
+
# the caller must be admin (QA/support). Respond 404 instead of 403 to
|
|
5398
|
+
# avoid disclosing the file's existence to non-owners.
|
|
5399
|
+
if not is_owner(metadata.user_id, effective_user, is_admin=is_admin):
|
|
5394
5400
|
logger.warning(
|
|
5395
|
-
f"🚫 DOWNLOAD ENDPOINT - User {
|
|
5401
|
+
f"🚫 DOWNLOAD ENDPOINT - User {effective_user} not owner of file {file_id}"
|
|
5396
5402
|
)
|
|
5397
5403
|
raise HTTPException(status_code=404, detail="File not found")
|
|
5398
5404
|
|
|
@@ -5422,9 +5428,11 @@ async def download_file(
|
|
|
5422
5428
|
async def view_file(
|
|
5423
5429
|
file_id: str,
|
|
5424
5430
|
token: str | None = Query(None, description="Signed short-lived view token bound to file_id"),
|
|
5431
|
+
user_id: str | None = Query(None, description="End-user the request acts for"),
|
|
5425
5432
|
basic_credentials: HTTPBasicCredentials | None = Depends(basic_security),
|
|
5426
5433
|
bearer_credentials: HTTPAuthorizationCredentials | None = Depends(bearer_security),
|
|
5427
5434
|
x_api_key: str | None = Header(None, alias="X-API-Key"),
|
|
5435
|
+
is_admin: bool = Depends(get_optional_admin),
|
|
5428
5436
|
):
|
|
5429
5437
|
"""View file inline in browser (for displaying images in chat, etc.).
|
|
5430
5438
|
|
|
@@ -5492,7 +5500,13 @@ async def view_file(
|
|
|
5492
5500
|
)
|
|
5493
5501
|
except HTTPException:
|
|
5494
5502
|
principal = None
|
|
5495
|
-
|
|
5503
|
+
# Admin (QA/support) may view any file; otherwise the effective
|
|
5504
|
+
# end-user (portal-honored user_id) must own it. ``principal`` may be
|
|
5505
|
+
# None — an admin Bearer-only request still authorizes via is_admin.
|
|
5506
|
+
effective_user = (
|
|
5507
|
+
resolve_effective_user_id(principal, user_id) if principal is not None else ""
|
|
5508
|
+
)
|
|
5509
|
+
if is_owner(metadata.user_id, effective_user, is_admin=is_admin):
|
|
5496
5510
|
authorized = True
|
|
5497
5511
|
|
|
5498
5512
|
if not authorized:
|
|
@@ -5519,18 +5533,24 @@ async def view_file(
|
|
|
5519
5533
|
|
|
5520
5534
|
|
|
5521
5535
|
@app.get("/files/{file_id}/metadata")
|
|
5522
|
-
async def get_file_metadata(
|
|
5536
|
+
async def get_file_metadata(
|
|
5537
|
+
file_id: str,
|
|
5538
|
+
user_id: str | None = Query(None, description="End-user the request acts for"),
|
|
5539
|
+
current_user: str = Depends(get_current_user),
|
|
5540
|
+
is_admin: bool = Depends(get_optional_admin),
|
|
5541
|
+
):
|
|
5523
5542
|
"""Get file metadata"""
|
|
5524
5543
|
try:
|
|
5544
|
+
effective_user = resolve_effective_user_id(current_user, user_id)
|
|
5525
5545
|
metadata = await app.state.file_storage_manager.get_file_metadata(file_id)
|
|
5526
5546
|
|
|
5527
5547
|
if not metadata:
|
|
5528
5548
|
raise HTTPException(status_code=404, detail="File not found")
|
|
5529
5549
|
|
|
5530
|
-
# Object-level authorization:
|
|
5531
|
-
if not is_owner(metadata.user_id,
|
|
5550
|
+
# Object-level authorization: effective end-user must own the file, or admin.
|
|
5551
|
+
if not is_owner(metadata.user_id, effective_user, is_admin=is_admin):
|
|
5532
5552
|
logger.warning(
|
|
5533
|
-
f"🚫 METADATA ENDPOINT - User {
|
|
5553
|
+
f"🚫 METADATA ENDPOINT - User {effective_user} not owner of file {file_id}"
|
|
5534
5554
|
)
|
|
5535
5555
|
raise HTTPException(status_code=404, detail="File not found")
|
|
5536
5556
|
|
|
@@ -5557,17 +5577,25 @@ async def get_file_metadata(file_id: str, current_user: str = Depends(get_curren
|
|
|
5557
5577
|
|
|
5558
5578
|
|
|
5559
5579
|
@app.get("/files/{file_id}/preview")
|
|
5560
|
-
async def preview_file(
|
|
5580
|
+
async def preview_file(
|
|
5581
|
+
file_id: str,
|
|
5582
|
+
user_id: str | None = Query(None, description="End-user the request acts for"),
|
|
5583
|
+
current_user: str = Depends(get_current_user),
|
|
5584
|
+
is_admin: bool = Depends(get_optional_admin),
|
|
5585
|
+
):
|
|
5561
5586
|
"""Preview file content optimized for UI display"""
|
|
5562
5587
|
try:
|
|
5588
|
+
effective_user = resolve_effective_user_id(current_user, user_id)
|
|
5563
5589
|
# First check if file exists and get metadata
|
|
5564
5590
|
metadata = await app.state.file_storage_manager.get_file_metadata(file_id)
|
|
5565
5591
|
if not metadata:
|
|
5566
5592
|
raise HTTPException(status_code=404, detail="File not found")
|
|
5567
5593
|
|
|
5568
|
-
# Object-level authorization:
|
|
5569
|
-
if not is_owner(metadata.user_id,
|
|
5570
|
-
logger.warning(
|
|
5594
|
+
# Object-level authorization: effective end-user must own the file, or admin.
|
|
5595
|
+
if not is_owner(metadata.user_id, effective_user, is_admin=is_admin):
|
|
5596
|
+
logger.warning(
|
|
5597
|
+
f"🚫 PREVIEW ENDPOINT - User {effective_user} not owner of file {file_id}"
|
|
5598
|
+
)
|
|
5571
5599
|
raise HTTPException(status_code=404, detail="File not found")
|
|
5572
5600
|
|
|
5573
5601
|
# Get the file content
|
|
@@ -5716,9 +5744,15 @@ async def list_files(
|
|
|
5716
5744
|
|
|
5717
5745
|
|
|
5718
5746
|
@app.delete("/files/{file_id}")
|
|
5719
|
-
async def delete_file(
|
|
5747
|
+
async def delete_file(
|
|
5748
|
+
file_id: str,
|
|
5749
|
+
user_id: str | None = Query(None, description="End-user the request acts for"),
|
|
5750
|
+
current_user: str = Depends(get_current_user),
|
|
5751
|
+
is_admin: bool = Depends(get_optional_admin),
|
|
5752
|
+
):
|
|
5720
5753
|
"""Delete file from storage"""
|
|
5721
5754
|
try:
|
|
5755
|
+
effective_user = resolve_effective_user_id(current_user, user_id)
|
|
5722
5756
|
# Fetch metadata first to enforce object-level authorization before
|
|
5723
5757
|
# any destructive operation. Missing or non-owned files yield 404
|
|
5724
5758
|
# (existence not disclosed to non-owners).
|
|
@@ -5726,8 +5760,10 @@ async def delete_file(file_id: str, current_user: str = Depends(get_current_user
|
|
|
5726
5760
|
if not metadata:
|
|
5727
5761
|
raise HTTPException(status_code=404, detail="File not found")
|
|
5728
5762
|
|
|
5729
|
-
if not is_owner(metadata.user_id,
|
|
5730
|
-
logger.warning(
|
|
5763
|
+
if not is_owner(metadata.user_id, effective_user, is_admin=is_admin):
|
|
5764
|
+
logger.warning(
|
|
5765
|
+
f"🚫 DELETE ENDPOINT - User {effective_user} not owner of file {file_id}"
|
|
5766
|
+
)
|
|
5731
5767
|
raise HTTPException(status_code=404, detail="File not found")
|
|
5732
5768
|
|
|
5733
5769
|
success = await app.state.file_storage_manager.delete_file(file_id)
|
{agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/web/skills_router.py
RENAMED
|
@@ -9,8 +9,9 @@ The router is split into two authorization tiers:
|
|
|
9
9
|
- read endpoints (listing, detail, file download, read-only validation) require
|
|
10
10
|
any authenticated principal (``get_current_user``) ;
|
|
11
11
|
- mutation endpoints (create, update, delete, file upload/delete) require admin
|
|
12
|
-
authentication (``
|
|
13
|
-
code that is later
|
|
12
|
+
authentication (``require_admin``: admin Bearer token OR HTTP Basic with the
|
|
13
|
+
admin password), since skill content can carry executable code that is later
|
|
14
|
+
run by agents.
|
|
14
15
|
|
|
15
16
|
Both tiers are aggregated under the public ``skills_router`` so the registered
|
|
16
17
|
paths and the import surface used by ``web/server.py`` remain unchanged.
|
|
@@ -48,7 +49,7 @@ from agent_framework.skills.custom_skill_manager import (
|
|
|
48
49
|
SkillNotFoundError,
|
|
49
50
|
)
|
|
50
51
|
|
|
51
|
-
from .admin_auth import
|
|
52
|
+
from .admin_auth import require_admin
|
|
52
53
|
|
|
53
54
|
|
|
54
55
|
logger = logging.getLogger(__name__)
|
|
@@ -186,11 +187,13 @@ read_router = APIRouter(
|
|
|
186
187
|
|
|
187
188
|
# Mutation tier: admin authentication required. Writing skill content can
|
|
188
189
|
# introduce code that agents later execute, so mutations are gated behind the
|
|
189
|
-
# stronger admin credential.
|
|
190
|
+
# stronger admin credential. ``require_admin`` accepts either the admin Bearer
|
|
191
|
+
# token OR HTTP Basic carrying the admin password (single ADMIN_PASSWORD secret),
|
|
192
|
+
# so the /ui can mutate skills via whichever admin credential it holds.
|
|
190
193
|
mutation_router = APIRouter(
|
|
191
194
|
prefix="/api/skills",
|
|
192
195
|
tags=["skills"],
|
|
193
|
-
dependencies=[Depends(
|
|
196
|
+
dependencies=[Depends(require_admin)],
|
|
194
197
|
)
|
|
195
198
|
|
|
196
199
|
# Public aggregator preserving the import surface used by ``web/server.py``.
|
{agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2/agent_framework_lib.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-framework-lib
|
|
3
|
-
Version: 0.8.9
|
|
3
|
+
Version: 0.8.9.post2
|
|
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>
|
|
@@ -15,13 +15,25 @@ protègent les secrets, les tenants et le conteneur — aucune ne dépend des au
|
|
|
15
15
|
- Méthodes acceptées : Basic Auth, clé API (`Authorization: Bearer` ou `X-API-Key`),
|
|
16
16
|
et le **jeton de session scopé** (`X-Session-Token`, voir §4).
|
|
17
17
|
- Mode dev non authentifié : `AUTH_DEV_MODE=true` uniquement (jamais en prod).
|
|
18
|
+
- **Autorisation role-based (propriété + rôle admin)** : l'accès à une ressource
|
|
19
|
+
(sessions, fichiers) est accordé si l'**utilisateur effectif** en est propriétaire
|
|
20
|
+
(`is_owner`) OU si l'appelant a le **rôle admin**. `AUTH_TRUST_CLIENT_USER_ID`
|
|
21
|
+
(défaut `true`) ne fait que **résoudre** l'utilisateur effectif depuis le `user_id`
|
|
22
|
+
fourni par un portail de confiance — il n'**autorise** plus l'accès cross-user. Les
|
|
23
|
+
endpoints fichier (`/files/{id}/download|view|metadata|preview`, `DELETE /files/{id}`)
|
|
24
|
+
acceptent `?user_id=` et vérifient la propriété contre cet utilisateur effectif.
|
|
25
|
+
L'accès cross-user (QA/support : voir/télécharger les fichiers ou sessions d'un autre
|
|
26
|
+
end-user, créer/éditer des skills) passe par le **rôle admin** : token Bearer admin
|
|
27
|
+
(`POST /api/admin/auth/verify` avec `ADMIN_PASSWORD`) OU HTTP Basic portant
|
|
28
|
+
`ADMIN_PASSWORD`.
|
|
18
29
|
|
|
19
30
|
| Variable | Défaut | Rôle |
|
|
20
31
|
|----------|--------|------|
|
|
21
32
|
| `AUTH_DEV_MODE` | `false` | Seul commutateur autorisant l'accès non authentifié (principal `anonymous`). |
|
|
22
33
|
| `REQUIRE_AUTH` | — | Câblage des mécanismes basic/API key. |
|
|
34
|
+
| `AUTH_TRUST_CLIENT_USER_ID` | `true` | Portail de confiance : **résout** l'utilisateur effectif depuis le `user_id` client (n'autorise PAS l'accès cross-user). `false` = lie chaque requête au principal authentifié. |
|
|
23
35
|
| `BASIC_AUTH_USERNAME` / `BASIC_AUTH_PASSWORD` | — | Basic auth ; **aucun défaut fonctionnel** (voie désactivée si non défini). |
|
|
24
|
-
| `ADMIN_PASSWORD` | — |
|
|
36
|
+
| `ADMIN_PASSWORD` | — | **Rôle admin** : impersonation cross-user (QA/support) + mutations skills. Voie désactivée si non défini. |
|
|
25
37
|
| `API_KEYS` | — | Clés API maître (CSV). N'est plus exposée au shell par défaut (voir §4). |
|
|
26
38
|
| `CORS_ALLOWED_ORIGINS` / `CORS_ALLOW_ALL` | localhost sûr | Origines CORS ; jamais `*`+credentials simultanés. |
|
|
27
39
|
|
|
@@ -123,6 +135,10 @@ pendant ≤ TTL (éphémère, mono-session, borné) — jamais la clé maître.
|
|
|
123
135
|
- Stockage physique **par utilisateur** : `files/<user>_<hash>/…` (au lieu d'un
|
|
124
136
|
dossier à plat). Défense en profondeur en plus du contrôle `is_owner` au niveau
|
|
125
137
|
API. Lecture des fichiers existants (à plat) préservée.
|
|
138
|
+
- Contrôle d'accès API **role-based** (cf. §1) : les endpoints fichier vérifient la
|
|
139
|
+
propriété contre l'**utilisateur effectif** (résolu depuis `?user_id=` quand
|
|
140
|
+
`AUTH_TRUST_CLIENT_USER_ID=true`) ; un end-user n'accède qu'à ses propres fichiers
|
|
141
|
+
(404 sinon). Le **rôle admin** court-circuite la propriété (QA/support).
|
|
126
142
|
- `AGENT_OUTPUT_DIR` cloisonné par `user/session`, nettoyé après chaque appel.
|
|
127
143
|
|
|
128
144
|
| Variable | Défaut | Rôle |
|
|
@@ -158,7 +174,8 @@ admin (`SECURITY_THREAT_DETECTED` via le webhook), sans invoquer l'agent.
|
|
|
158
174
|
```bash
|
|
159
175
|
AUTH_DEV_MODE=false # auth obligatoire
|
|
160
176
|
BASIC_AUTH_PASSWORD=<fort> # ou API_KEYS=<...>
|
|
161
|
-
ADMIN_PASSWORD=<fort>
|
|
177
|
+
ADMIN_PASSWORD=<fort> # active le rôle admin (impersonation QA/support + skills)
|
|
178
|
+
AUTH_TRUST_CLIENT_USER_ID=true # portail de confiance (résout user_id) ; false si clients non fiables
|
|
162
179
|
CORS_ALLOWED_ORIGINS=https://app.exemple.com
|
|
163
180
|
SECRET_REDACTION_ENCODINGS=true
|
|
164
181
|
SHELL_RESOURCE_LIMITS=true
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "agent-framework-lib"
|
|
7
|
-
version = "0.8.
|
|
7
|
+
version = "0.8.9post2"
|
|
8
8
|
description = "A comprehensive Python framework for building and serving conversational AI agents with FastAPI"
|
|
9
9
|
readme = {file = "README.md", content-type = "text/markdown"}
|
|
10
10
|
license = {text = "MIT"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post2}/agent_framework/a2a/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|