agent-framework-lib 0.8.8.post2__tar.gz → 0.8.8.post3__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.8.post2/agent_framework_lib.egg-info → agent_framework_lib-0.8.8.post3}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/security/authz.py +36 -3
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/security/sandbox_provider.py +14 -3
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/shell_tool.py +22 -1
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/server.py +18 -17
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3/agent_framework_lib.egg-info}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework_lib.egg-info/SOURCES.txt +1 -0
- agent_framework_lib-0.8.8.post3/docs/OPENSHELL_GATEWAY_HOST_SETUP.md +195 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/pyproject.toml +1 -1
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/ARCHITECTURE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/LICENSE +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/MANIFEST.in +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/README.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/base.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/models.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/providers/postgres_provider.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/capabilities/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/capabilities/resolver.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/audit.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/config.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/crypto.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/git_provider.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/herdr_client.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/models.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/orchestrator.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/store.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/tools.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/activity_formatter.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/agent_interface.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/agent_provider.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/base_agent.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/context_budget.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/context_summarizer.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/elasticsearch_config_provider.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/execution_controller.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/implementation_validator.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/interruption_message.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/knowledge_state.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/loop_detector.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/model_clients.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/model_config.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/model_router.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/models.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/prompt_builder.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/provider_calibration.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/scratchpad_compressor.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/scratchpad_serializer.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/state_manager.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/step_display_config.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/streaming_parts_accumulator.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/implementations/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/implementations/budget_aware_agent.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/implementations/llamaindex_agent.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/implementations/microsoft_agent.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/base.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/config.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/hypothesis_engine.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/implicit_feedback.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/manager.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/personalization.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/providers/graphiti_provider.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/providers/memori_provider.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/response_lessons.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/tools.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/work_patterns.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/api_timing_tracker.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/error_handling.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/error_logging.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/llm_metrics.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/llm_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/metrics_aggregator.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/metrics_config.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/observability_manager.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/otel_instrumentor.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/otel_logging_handler.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/otel_setup.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/performance_monitor.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/progress_tracker.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/resource_manager.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/timing_tracker.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/token_counter.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/tracing_context.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/notifications/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/notifications/hub.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/notifications/webhook_notifier.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/processing/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/processing/ai_content_management.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/processing/markdown_converter.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/processing/multimodal_integration.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/processing/rich_content_validation.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/py.typed +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/security/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/security/file_view_token.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/security/input_guard.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/security/openshell_policy.yaml +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/security/pii_redactor.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/security/sandbox.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/security/secret_redactor.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/security/shell_env.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/security/upload_token.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/session/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/session/elasticsearch_session_storage.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/session/session_storage.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/base.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/scripts/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/scripts/create_and_register.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/scripts/register_to_storage.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/chart/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/chart/chart_to_image.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/chart/vendor_chart.umd.min.js +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/code_delivery/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/code_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/code_format/format_python.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/csv/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/csv/create_csv.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/csv/read_csv.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/csv/transform_csv.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/data_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/data_format/json_to_yaml.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/data_format/yaml_to_json.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/drawio/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/drawio/create_drawio.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/email_template/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/excel/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/excel/create_excel.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file/create_file.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file/list_files.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file/read_file.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file_access/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file_access/download_to_local.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file_access/get_file_path.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/form/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/image_display/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/image_gen/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/image_gen/create_image.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/image_gen/generate_image.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/mermaid/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/mermaid/mermaid_to_image.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/mermaid/vendor_mermaid.umd.min.js +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/multimodal/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/create_powerpoint.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/Big Data Infographics.pptx +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/Executive Design Pitch Deck.pptx +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/Management Consulting Toolkit.pptx +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/generate_templates.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/skill_creator/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/skill_creator/skill_api.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/table/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/table/table_to_image.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/unified_pdf/create_pdf.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/web_news_search/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/web_news_search/web_news_search.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/word/SKILL.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/word/create_word.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/custom_skill_manager.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/discovery_prompt.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/markdown_loader.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/tools.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/storage/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/storage/file_storages.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/storage/file_system_management.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/storage/storage_optimizer.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/subagents/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/subagents/executor.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/subagents/message_injector.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/subagents/message_queue.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/subagents/retrigger.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/subagents/spawn_tool.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/activity_callback.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/adaptive_pdf_css.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/base.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/html_content_analyzer.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/multimodal_tools.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/pdf_image_scaler.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/sizing_config.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/web_fetch_tool.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/web_search_tool.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/utils/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/utils/path_utils.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/utils/post_install.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/utils/session_title_generator.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/utils/source_detector.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/utils/special_blocks.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/admin_auth.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/admin_models.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/admin_router.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/admin_services.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/api_timing_middleware.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/Dockerfile +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/README.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/docker-compose.yml +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/documentation_generator.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/gitnexus_client.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/helper_agent.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/helper_ui.html +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/modern_ui.html +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/otel_tracing_middleware.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/skills_router.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/test_app.html +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/__init__.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/artefacts.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/client.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/config.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/context.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/cursor.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/memory.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/models.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/poller.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/preferences.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/router.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/session.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/subscription.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework_lib.egg-info/entry_points.txt +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework_lib.egg-info/requires.txt +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework_lib.egg-info/top_level.txt +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/ARCHITECTURE_DIAGRAM.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/CANCEL_AND_INTERRUPT_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/DEEPEVAL_TEST_REPORT.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/DIAGNOSTIC_SANDBOX_SKILLS.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/FILE_STORAGE_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/HISTORY_MESSAGE_FORMAT.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/MULTIMODAL_TOOLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/OBSERVABILITY_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/PYPI_PUBLISHING.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/QA_STREAMING_LATENCY.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/SCREENSHOTS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/SECRETS_MANAGEMENT.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/SECURITY_HARDENING.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/SSE_NOTIFICATIONS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/STREAMING_EVENTS_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/framework_audit_remarques.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/helper_agent.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/index.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/README.md +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/agent_context_budget_test.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/agent_exemple_test.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/agent_training_with_apo.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/agent_with_custom_tools_file_storage.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/agent_with_personalization.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/biagenttest.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/dependencies/docker-compose.yaml +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/pyproject.toml +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/test_work_patterns_live.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/examples/workspace_test_agent.py +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/setup.cfg +0 -0
- {agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-framework-lib
|
|
3
|
-
Version: 0.8.8.
|
|
3
|
+
Version: 0.8.8.post3
|
|
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>
|
|
@@ -55,6 +55,36 @@ def auth_required() -> bool:
|
|
|
55
55
|
return not dev_mode_enabled()
|
|
56
56
|
|
|
57
57
|
|
|
58
|
+
def trust_client_user_id() -> bool:
|
|
59
|
+
"""Le déployeur fait confiance au client pour fournir le ``user_id``.
|
|
60
|
+
|
|
61
|
+
Activé via ``AUTH_TRUST_CLIENT_USER_ID``. Cas d'usage : un backend de
|
|
62
|
+
confiance authentifié par API key (un portail) qui multiplexe plusieurs
|
|
63
|
+
end-users et passe leur ``user_id`` en paramètre. Quand actif, le serveur
|
|
64
|
+
HONORE le ``user_id`` client (au lieu de le forcer au principal authentifié),
|
|
65
|
+
et ``is_owner`` autorise ce principal de confiance sur toute ressource —
|
|
66
|
+
l'auth (API key) reste exigée, mais le contrôle par end-user est délégué au
|
|
67
|
+
portail.
|
|
68
|
+
|
|
69
|
+
⚠️ N'activer QUE si le client est de confiance et applique lui-même le
|
|
70
|
+
contrôle d'accès par end-user — sinon tout détenteur de la clé peut réclamer
|
|
71
|
+
n'importe quel ``user_id``.
|
|
72
|
+
"""
|
|
73
|
+
return _env_flag("AUTH_TRUST_CLIENT_USER_ID")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def resolve_effective_user_id(current_user: str, requested_user_id: str | None) -> str:
|
|
77
|
+
"""Identité effective pour scoper sessions/fichiers.
|
|
78
|
+
|
|
79
|
+
Honore le ``user_id`` client quand l'auth est désactivée (dev mode) OU que le
|
|
80
|
+
déployeur fait confiance au client (``AUTH_TRUST_CLIENT_USER_ID``). Sinon, lie
|
|
81
|
+
au principal authentifié (anti-usurpation multi-tenant).
|
|
82
|
+
"""
|
|
83
|
+
if requested_user_id and (not auth_required() or trust_client_user_id()):
|
|
84
|
+
return requested_user_id
|
|
85
|
+
return current_user
|
|
86
|
+
|
|
87
|
+
|
|
58
88
|
def is_owner(resource_user_id: str | None, principal: str) -> bool:
|
|
59
89
|
"""Vérifie que ``principal`` possède la ressource.
|
|
60
90
|
|
|
@@ -64,14 +94,17 @@ def is_owner(resource_user_id: str | None, principal: str) -> bool:
|
|
|
64
94
|
principal: Identité authentifiée demandant l'accès.
|
|
65
95
|
|
|
66
96
|
Returns:
|
|
67
|
-
``True`` si le principal possède la ressource,
|
|
68
|
-
|
|
69
|
-
(
|
|
97
|
+
``True`` si le principal possède la ressource, si le mode développement
|
|
98
|
+
est actif et que le principal est ``"anonymous"`` (compat mono-utilisateur),
|
|
99
|
+
ou si le client est de confiance (``AUTH_TRUST_CLIENT_USER_ID`` — le portail
|
|
100
|
+
de confiance peut accéder aux ressources de n'importe quel end-user).
|
|
70
101
|
"""
|
|
71
102
|
if resource_user_id is not None and resource_user_id == principal:
|
|
72
103
|
return True
|
|
73
104
|
if dev_mode_enabled() and principal == ANONYMOUS_PRINCIPAL:
|
|
74
105
|
return True
|
|
106
|
+
if trust_client_user_id():
|
|
107
|
+
return True
|
|
75
108
|
return False
|
|
76
109
|
|
|
77
110
|
|
|
@@ -474,12 +474,23 @@ class OpenShellProvider(SandboxProvider):
|
|
|
474
474
|
src = f"{SANDBOX_OUTPUT}/{_safe_name(out_subdir)}" if out_subdir else SANDBOX_OUTPUT
|
|
475
475
|
# Source dir may not exist if the command wrote nothing — tolerate failure.
|
|
476
476
|
proc = self._run_cli(["sandbox", "download", name, src, dest_dir], timeout=120)
|
|
477
|
+
# Visibility: this PULL is the only file-delivery path in the sandboxed
|
|
478
|
+
# topology, so its outcome must be observable (was DEBUG → silent file loss).
|
|
479
|
+
try:
|
|
480
|
+
pulled = sum(len(files) for _, _, files in os.walk(dest_dir))
|
|
481
|
+
except OSError:
|
|
482
|
+
pulled = -1
|
|
477
483
|
if proc.returncode != 0:
|
|
478
|
-
logger.
|
|
479
|
-
"
|
|
484
|
+
logger.warning(
|
|
485
|
+
"[sandbox] download failed for %s (src=%s) rc=%s — generated files "
|
|
486
|
+
"may be lost: %s",
|
|
480
487
|
name,
|
|
481
|
-
|
|
488
|
+
src,
|
|
489
|
+
proc.returncode,
|
|
490
|
+
(proc.stdout + proc.stderr).strip()[:300],
|
|
482
491
|
)
|
|
492
|
+
else:
|
|
493
|
+
logger.info("[sandbox] pulled %d file(s) from %s for %s", pulled, src, name)
|
|
483
494
|
# Best-effort: remove the per-command subdir so a long-lived session does
|
|
484
495
|
# not accumulate output slices in /sandbox/output.
|
|
485
496
|
if out_subdir:
|
|
@@ -754,6 +754,15 @@ class ShellTool(AgentTool):
|
|
|
754
754
|
)
|
|
755
755
|
env["AGENT_HOST"] = callback_host
|
|
756
756
|
env["AGENT_PORT"] = str(callback_port)
|
|
757
|
+
# In the per-session sandbox the in-shell HTTP upload is the WRONG path:
|
|
758
|
+
# the sandbox is a sibling container with no reliable route back to the
|
|
759
|
+
# agent (in Coolify the agent port is not published — host.docker.internal
|
|
760
|
+
# :8000 is NOT the agent → 401/wrong server). The skill therefore only
|
|
761
|
+
# WRITES its file to AGENT_OUTPUT_DIR; the parent ShellTool finalizer pulls
|
|
762
|
+
# it out via the gateway (collect_out) and registers it to the agent itself
|
|
763
|
+
# (localhost) with the session token. Forcing skip also prevents the skill
|
|
764
|
+
# from printing a file_id that would make the finalizer skip the file.
|
|
765
|
+
env["AGENT_SKILL_SKIP_HTTP_UPLOAD"] = "true"
|
|
757
766
|
# Tell upload scripts whether to authenticate.
|
|
758
767
|
env["REQUIRE_AUTH"] = os.environ.get("REQUIRE_AUTH", "false")
|
|
759
768
|
# Scoped, short-lived session token (HMAC, user/session) so the sandbox
|
|
@@ -846,8 +855,20 @@ class ShellTool(AgentTool):
|
|
|
846
855
|
)
|
|
847
856
|
return out
|
|
848
857
|
|
|
849
|
-
|
|
858
|
+
# Pull the files the sandbox produced out via the gateway. This is the
|
|
859
|
+
# ONLY delivery path in the sandboxed topology (the sandbox itself has
|
|
860
|
+
# no route to register them). Failures here = lost files, so they MUST
|
|
861
|
+
# be visible (previously swallowed silently → undiagnosable file loss).
|
|
862
|
+
try:
|
|
850
863
|
provider.collect_out(session_id, collect_dir, out_subdir=out_subdir)
|
|
864
|
+
except Exception as e: # noqa: BLE001 — never raise into the agent
|
|
865
|
+
logger.warning(
|
|
866
|
+
"[ShellTool] collect_out failed (session=%s, out_subdir=%s) — "
|
|
867
|
+
"generated files may not be delivered: %s",
|
|
868
|
+
session_id,
|
|
869
|
+
out_subdir,
|
|
870
|
+
e,
|
|
871
|
+
)
|
|
851
872
|
|
|
852
873
|
stdout = result.stdout or ""
|
|
853
874
|
stderr = result.stderr or ""
|
{agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/web/server.py
RENAMED
|
@@ -193,6 +193,7 @@ from ..security.authz import (
|
|
|
193
193
|
OutboundURLValidationError,
|
|
194
194
|
auth_required,
|
|
195
195
|
is_owner,
|
|
196
|
+
resolve_effective_user_id,
|
|
196
197
|
validate_outbound_url,
|
|
197
198
|
)
|
|
198
199
|
from ..security.file_view_token import verify_file_token
|
|
@@ -2330,7 +2331,7 @@ async def handle_message_endpoint(
|
|
|
2330
2331
|
# mismatch that made uploaded files 404 on download. In dev-mode (auth
|
|
2331
2332
|
# disabled) the query param is honored for single-user compatibility.
|
|
2332
2333
|
# Mirrors /files/upload (see effective_user_id there).
|
|
2333
|
-
user_id = current_user
|
|
2334
|
+
user_id = resolve_effective_user_id(current_user, user_id)
|
|
2334
2335
|
|
|
2335
2336
|
# Determine session_id: query param > body.session_id > new UUID
|
|
2336
2337
|
session_id_from_query = request.query_params.get("session_id")
|
|
@@ -2744,7 +2745,7 @@ async def handle_stream_endpoint(
|
|
|
2744
2745
|
# user_id query param — bind the session (and every file it stores) to the
|
|
2745
2746
|
# authenticated principal. In dev-mode (auth disabled) the query param is
|
|
2746
2747
|
# honored for single-user compatibility. Mirrors /files/upload.
|
|
2747
|
-
user_id = current_user
|
|
2748
|
+
user_id = resolve_effective_user_id(current_user, user_id)
|
|
2748
2749
|
|
|
2749
2750
|
# Support both /sessions/{session_id}/stream and /stream?session_id=...
|
|
2750
2751
|
# If session_id is not provided as a path parameter, try to get it from query/body
|
|
@@ -4099,7 +4100,7 @@ async def list_sessions_endpoint(
|
|
|
4099
4100
|
|
|
4100
4101
|
# Multi-tenant: under auth, list only the authenticated principal's sessions
|
|
4101
4102
|
# (ignore client user_id). Keeps the UI consistent with /message + /stream.
|
|
4102
|
-
user_id = current_user
|
|
4103
|
+
user_id = resolve_effective_user_id(current_user, user_id)
|
|
4103
4104
|
|
|
4104
4105
|
if not session_storage:
|
|
4105
4106
|
raise HTTPException(status_code=500, detail="Session storage not available")
|
|
@@ -4151,7 +4152,7 @@ async def list_sessions_with_info_endpoint(
|
|
|
4151
4152
|
|
|
4152
4153
|
# Multi-tenant: under auth, list only the authenticated principal's sessions
|
|
4153
4154
|
# (ignore client user_id). Keeps the UI consistent with /message + /stream.
|
|
4154
|
-
user_id = current_user
|
|
4155
|
+
user_id = resolve_effective_user_id(current_user, user_id)
|
|
4155
4156
|
|
|
4156
4157
|
if not session_storage:
|
|
4157
4158
|
raise HTTPException(status_code=500, detail="Session storage not available")
|
|
@@ -4256,7 +4257,7 @@ async def cancel_execution_endpoint(
|
|
|
4256
4257
|
|
|
4257
4258
|
# Multi-tenant: under auth, only the authenticated principal may cancel their
|
|
4258
4259
|
# own session (ignore client user_id). Matches /message + /stream ownership.
|
|
4259
|
-
user_id = current_user
|
|
4260
|
+
user_id = resolve_effective_user_id(current_user, user_id)
|
|
4260
4261
|
|
|
4261
4262
|
if not session_storage:
|
|
4262
4263
|
raise HTTPException(status_code=500, detail="Session storage not available")
|
|
@@ -4332,7 +4333,7 @@ async def get_execution_state_endpoint(
|
|
|
4332
4333
|
|
|
4333
4334
|
# Multi-tenant: under auth, scope to the authenticated principal (ignore
|
|
4334
4335
|
# client user_id) so ownership matches /message + /stream.
|
|
4335
|
-
user_id = current_user
|
|
4336
|
+
user_id = resolve_effective_user_id(current_user, user_id)
|
|
4336
4337
|
|
|
4337
4338
|
if not session_storage:
|
|
4338
4339
|
raise HTTPException(status_code=500, detail="Session storage not available")
|
|
@@ -4423,7 +4424,7 @@ async def get_history_endpoint(
|
|
|
4423
4424
|
# Multi-tenant: under auth, scope reads to the authenticated principal and
|
|
4424
4425
|
# ignore the client-supplied user_id. Mirrors the write side (/message,
|
|
4425
4426
|
# /stream) so sessions created there are visible to the same UI identity.
|
|
4426
|
-
user_id = current_user
|
|
4427
|
+
user_id = resolve_effective_user_id(current_user, user_id)
|
|
4427
4428
|
|
|
4428
4429
|
if not session_storage:
|
|
4429
4430
|
raise HTTPException(status_code=500, detail="Session storage not available")
|
|
@@ -5059,7 +5060,7 @@ async def get_code_delivery_config_endpoint(
|
|
|
5059
5060
|
# The client-provided user_id query param is only honored in dev-mode to
|
|
5060
5061
|
# preserve single-user/finalizer compatibility (cannot be used to read or
|
|
5061
5062
|
# mutate another user's code-delivery config when auth is enabled).
|
|
5062
|
-
effective_user_id = current_user
|
|
5063
|
+
effective_user_id = resolve_effective_user_id(current_user, user_id)
|
|
5063
5064
|
|
|
5064
5065
|
resolved = await get_shared_store().resolve(effective_user_id, session_id)
|
|
5065
5066
|
meta = resolved.github_auth
|
|
@@ -5103,7 +5104,7 @@ async def set_code_delivery_github_auth_endpoint(
|
|
|
5103
5104
|
)
|
|
5104
5105
|
# Storage identity bound to the authenticated principal (query param honored
|
|
5105
5106
|
# only in dev-mode) so a user cannot store a token under another identity.
|
|
5106
|
-
effective_user_id = current_user
|
|
5107
|
+
effective_user_id = resolve_effective_user_id(current_user, user_id)
|
|
5107
5108
|
try:
|
|
5108
5109
|
await get_shared_store().set_github_token(
|
|
5109
5110
|
effective_user_id, body.token, meta, session_id=body.session_id
|
|
@@ -5128,7 +5129,7 @@ async def delete_code_delivery_github_auth_endpoint(
|
|
|
5128
5129
|
from agent_framework.code_delivery.store import get_shared_store
|
|
5129
5130
|
|
|
5130
5131
|
# Storage identity bound to the authenticated principal (dev-mode honors the query param).
|
|
5131
|
-
effective_user_id = current_user
|
|
5132
|
+
effective_user_id = resolve_effective_user_id(current_user, user_id)
|
|
5132
5133
|
await get_shared_store().clear_github_token(effective_user_id, session_id=session_id)
|
|
5133
5134
|
return {"success": True, "scope": "session" if session_id else "user"}
|
|
5134
5135
|
|
|
@@ -5143,7 +5144,7 @@ async def get_code_delivery_repos_endpoint(
|
|
|
5143
5144
|
from agent_framework.code_delivery.store import get_shared_store
|
|
5144
5145
|
|
|
5145
5146
|
# Storage identity bound to the authenticated principal (dev-mode honors the query param).
|
|
5146
|
-
effective_user_id = current_user
|
|
5147
|
+
effective_user_id = resolve_effective_user_id(current_user, user_id)
|
|
5147
5148
|
resolved = await get_shared_store().resolve(effective_user_id, session_id)
|
|
5148
5149
|
return {"repos": [r.model_dump() for r in resolved.repos]}
|
|
5149
5150
|
|
|
@@ -5160,7 +5161,7 @@ async def set_code_delivery_repos_endpoint(
|
|
|
5160
5161
|
|
|
5161
5162
|
repos = [RepoEntry(**r.model_dump()) for r in body.repos]
|
|
5162
5163
|
# Storage identity bound to the authenticated principal (dev-mode honors the query param).
|
|
5163
|
-
effective_user_id = current_user
|
|
5164
|
+
effective_user_id = resolve_effective_user_id(current_user, user_id)
|
|
5164
5165
|
await get_shared_store().set_repos(effective_user_id, repos, session_id=body.session_id)
|
|
5165
5166
|
return {"success": True, "count": len(repos)}
|
|
5166
5167
|
|
|
@@ -5211,7 +5212,7 @@ async def set_code_delivery_herdr_endpoint(
|
|
|
5211
5212
|
if body.mode not in ("local", "remote"):
|
|
5212
5213
|
raise HTTPException(status_code=400, detail="mode must be 'local' or 'remote'")
|
|
5213
5214
|
# Storage identity bound to the authenticated principal (dev-mode honors the query param).
|
|
5214
|
-
effective_user_id = current_user
|
|
5215
|
+
effective_user_id = resolve_effective_user_id(current_user, user_id)
|
|
5215
5216
|
fields: dict[str, Any] = {"mode": body.mode}
|
|
5216
5217
|
if body.base_url is not None:
|
|
5217
5218
|
# SSRF / token-exfiltration guard before persistence or use.
|
|
@@ -5244,7 +5245,7 @@ async def set_code_delivery_settings_endpoint(
|
|
|
5244
5245
|
model=body.backend_model or "claude-sonnet-4-20250514",
|
|
5245
5246
|
)
|
|
5246
5247
|
# Storage identity bound to the authenticated principal (dev-mode honors the query param).
|
|
5247
|
-
effective_user_id = current_user
|
|
5248
|
+
effective_user_id = resolve_effective_user_id(current_user, user_id)
|
|
5248
5249
|
await get_shared_store().set_settings(
|
|
5249
5250
|
effective_user_id,
|
|
5250
5251
|
enabled=body.enabled,
|
|
@@ -5317,7 +5318,7 @@ async def upload_file(
|
|
|
5317
5318
|
# spoofing another user's ownership. In dev-mode the query param is
|
|
5318
5319
|
# honored (passive finalizer uploads via localhost using the
|
|
5319
5320
|
# AGENT_USER_ID wiring), preserving single-user compatibility.
|
|
5320
|
-
effective_user_id = current_user
|
|
5321
|
+
effective_user_id = resolve_effective_user_id(current_user, user_id)
|
|
5321
5322
|
|
|
5322
5323
|
file_id = await app.state.file_storage_manager.store_file(
|
|
5323
5324
|
content=content,
|
|
@@ -5665,7 +5666,7 @@ async def list_files(
|
|
|
5665
5666
|
# Multi-tenant: under auth, list only the authenticated principal's files
|
|
5666
5667
|
# (ignore the client user_id) so the UI sees the files uploaded by skills,
|
|
5667
5668
|
# which are owned by the same principal. Mirrors /files/upload + download.
|
|
5668
|
-
user_id = current_user
|
|
5669
|
+
user_id = resolve_effective_user_id(current_user, user_id)
|
|
5669
5670
|
try:
|
|
5670
5671
|
logger.info(
|
|
5671
5672
|
f"🔍 FILES ENDPOINT - Parameters: user_id={user_id}, session_id={session_id}, is_generated={is_generated}"
|
|
@@ -6973,7 +6974,7 @@ async def get_session_response_times_endpoint(
|
|
|
6973
6974
|
# Multi-tenant: under auth, scope to the authenticated principal (ignore the
|
|
6974
6975
|
# client user_id) so the ownership check below matches sessions created by
|
|
6975
6976
|
# /message and /stream under the same identity.
|
|
6976
|
-
user_id = current_user
|
|
6977
|
+
user_id = resolve_effective_user_id(current_user, user_id)
|
|
6977
6978
|
|
|
6978
6979
|
if session_storage is None:
|
|
6979
6980
|
raise HTTPException(status_code=500, detail="Session storage not available")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-framework-lib
|
|
3
|
-
Version: 0.8.8.
|
|
3
|
+
Version: 0.8.8.post3
|
|
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>
|
|
@@ -296,6 +296,7 @@ docs/MEMORY_INSTALLATION.md
|
|
|
296
296
|
docs/MODIFICATIONS_CONCURRENCE.md
|
|
297
297
|
docs/MULTIMODAL_TOOLS_GUIDE.md
|
|
298
298
|
docs/OBSERVABILITY_GUIDE.md
|
|
299
|
+
docs/OPENSHELL_GATEWAY_HOST_SETUP.md
|
|
299
300
|
docs/PYPI_PUBLISHING.md
|
|
300
301
|
docs/QA_STREAMING_LATENCY.md
|
|
301
302
|
docs/SCREENSHOTS_GUIDE.md
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# OpenShell sandbox — host gateway setup (Docker deployments)
|
|
2
|
+
|
|
3
|
+
How to run the per-session OpenShell sandbox when the agent is deployed in a
|
|
4
|
+
**Docker container** (docker-compose, Coolify, plain `docker run`, …) on a Linux
|
|
5
|
+
host. This is the configuration that makes `shell_exec` run untrusted code in an
|
|
6
|
+
isolated sandbox in production — without it the shell silently degrades to the
|
|
7
|
+
**local path with no FS/network jail**.
|
|
8
|
+
|
|
9
|
+
## TL;DR — one script per host
|
|
10
|
+
|
|
11
|
+
On each deployment host (dev, staging, prod), as the user that owns Docker
|
|
12
|
+
(e.g. `ubuntu`):
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
bash scripts/setup-openshell-host.sh
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
It is idempotent and does everything below (install, JWT keys, config, persistent
|
|
19
|
+
systemd service, smoke test) and prints the exact env vars to set on each agent.
|
|
20
|
+
The rest of this doc explains what it does and how to debug it. The agent
|
|
21
|
+
container side is in the agent `docker-compose.prod.yml` / `openshell-entrypoint.sh`.
|
|
22
|
+
|
|
23
|
+
## Why the gateway runs on the HOST (not in the agent container)
|
|
24
|
+
|
|
25
|
+
OpenShell has two parts: the **CLI** (the agent calls it) and the **gateway**
|
|
26
|
+
server, which drives Docker to create the per-session sandbox containers.
|
|
27
|
+
|
|
28
|
+
On native Linux Docker, the gateway's Docker driver must bind the **Docker
|
|
29
|
+
bridge gateway IP** (e.g. `172.16.x.1`) so the sandbox containers can reach it.
|
|
30
|
+
Only the **host** owns that address — a gateway running *inside* the agent
|
|
31
|
+
container cannot bind it and crashes with:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
Error: failed to bind to 172.16.21.1:17670: Cannot assign requested address (os error 99)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
(It "just works" on a Mac because Docker Desktop's networking is different.)
|
|
38
|
+
|
|
39
|
+
So the supported topology on Linux is:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
┌─ Host (has Docker) ───────────────────────────────────────────┐
|
|
43
|
+
│ openshell-gateway (binds 0.0.0.0:17670, drives Docker) │
|
|
44
|
+
│ ▲ │ creates │
|
|
45
|
+
│ │ http (insecure, LAN) ▼ │
|
|
46
|
+
│ ┌─ Agent container ─┐ ┌─ Sandbox containers (per session)─┐│
|
|
47
|
+
│ │ openshell CLI │ │ jailed; reach the gateway via the ││
|
|
48
|
+
│ │ + docker.sock │ │ host bridge IP ││
|
|
49
|
+
│ └───────────────────┘ └───────────────────────────────────┘│
|
|
50
|
+
└───────────────────────────────────────────────────────────────┘
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 1. Host setup
|
|
54
|
+
|
|
55
|
+
Prereq: the host runs Docker, and the user that will run the gateway can use it
|
|
56
|
+
**without sudo** (`docker info` works → that user is in the `docker` group). If
|
|
57
|
+
not, one-time: `sudo usermod -aG docker <user>` then re-login. No sudo is needed
|
|
58
|
+
at runtime.
|
|
59
|
+
|
|
60
|
+
Install the OpenShell CLI + gateway:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
curl -fsSL https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | sh
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Write a gateway config. With TLS off there is no mTLS user auth, so we must
|
|
67
|
+
(a) allow unauthenticated callers (the agent CLI), and (b) still give the gateway
|
|
68
|
+
a JWT signing key — **Docker sandboxes require a gateway-minted JWT** to
|
|
69
|
+
authenticate their supervisor back to the gateway, otherwise `sandbox create`
|
|
70
|
+
fails with `docker sandboxes require gateway JWT auth`. The install already
|
|
71
|
+
generated the JWT keys under `~/.local/state/openshell/tls/jwt/`.
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# JWT signing keys (created by the installer; regenerate if missing):
|
|
75
|
+
ls ~/.local/state/openshell/tls/jwt/ \
|
|
76
|
+
|| openshell-gateway generate-certs --output-dir ~/.local/state/openshell/tls
|
|
77
|
+
|
|
78
|
+
cat > ~/openshell-gateway.toml <<EOF
|
|
79
|
+
[openshell.gateway.auth]
|
|
80
|
+
allow_unauthenticated_users = true
|
|
81
|
+
|
|
82
|
+
[openshell.gateway.gateway_jwt]
|
|
83
|
+
signing_key_path = "$HOME/.local/state/openshell/tls/jwt/signing.pem"
|
|
84
|
+
public_key_path = "$HOME/.local/state/openshell/tls/jwt/public.pem"
|
|
85
|
+
kid_path = "$HOME/.local/state/openshell/tls/jwt/kid"
|
|
86
|
+
EOF
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Run the gateway with **TLS disabled** (the agent reaches it over the trusted
|
|
90
|
+
internal Docker network), bound to all interfaces, with that config:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# the installer's systemd --user service starts with mTLS + 127.0.0.1 and may
|
|
94
|
+
# crash (no certs / no docker group in the unit) — run it ourselves instead:
|
|
95
|
+
systemctl --user stop openshell-gateway 2>/dev/null || true
|
|
96
|
+
pkill -f openshell-gateway 2>/dev/null || true
|
|
97
|
+
|
|
98
|
+
nohup openshell-gateway --disable-tls --bind-address 0.0.0.0 \
|
|
99
|
+
--config ~/openshell-gateway.toml >~/openshell-gateway.log 2>&1 &
|
|
100
|
+
disown
|
|
101
|
+
|
|
102
|
+
ss -ltnp | grep 17670 # expect: LISTEN 0.0.0.0:17670
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
A healthy log shows three lines: `Unauthenticated user access enabled`,
|
|
106
|
+
`gateway-minted sandbox JWT enabled`, and `Server listening address=0.0.0.0:17670`
|
|
107
|
+
— and it stays up (`Using compute driver driver=docker`).
|
|
108
|
+
|
|
109
|
+
### Make it permanent (survive logout/reboot)
|
|
110
|
+
|
|
111
|
+
Override the installed `systemd --user` unit to use the same flags:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
mkdir -p ~/.config/systemd/user/openshell-gateway.service.d
|
|
115
|
+
cat > ~/.config/systemd/user/openshell-gateway.service.d/override.conf <<'EOF'
|
|
116
|
+
[Service]
|
|
117
|
+
ExecStartPre=
|
|
118
|
+
ExecStart=
|
|
119
|
+
ExecStart=/usr/bin/openshell-gateway --disable-tls --bind-address 0.0.0.0 --config %h/openshell-gateway.toml
|
|
120
|
+
Restart=always
|
|
121
|
+
EOF
|
|
122
|
+
systemctl --user daemon-reload
|
|
123
|
+
systemctl --user restart openshell-gateway
|
|
124
|
+
systemctl --user status openshell-gateway --no-pager
|
|
125
|
+
|
|
126
|
+
sudo loginctl enable-linger "$USER" # one-time: keep the user service alive after logout/reboot
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
If the service still fails on `query Docker daemon version: Connect`, the user
|
|
130
|
+
manager was started before the `docker` group was granted — re-login (or reboot)
|
|
131
|
+
so it picks up the group, then `systemctl --user restart openshell-gateway`.
|
|
132
|
+
|
|
133
|
+
## 2. Agent container setup (docker-compose)
|
|
134
|
+
|
|
135
|
+
The agent needs the Docker socket (to build the sandbox image on the host Docker
|
|
136
|
+
and pass the framework's `docker info` check) and the gateway endpoint. See the
|
|
137
|
+
agent compose files for a full example; the OpenShell-relevant parts:
|
|
138
|
+
|
|
139
|
+
```yaml
|
|
140
|
+
services:
|
|
141
|
+
agent:
|
|
142
|
+
environment:
|
|
143
|
+
- SHELL_SANDBOX_PROVIDER=openshell
|
|
144
|
+
- OPENSHELL_GATEWAY_ENDPOINT=http://host.docker.internal:17670
|
|
145
|
+
- OPENSHELL_GATEWAY_INSECURE=true
|
|
146
|
+
volumes:
|
|
147
|
+
- /var/run/docker.sock:/var/run/docker.sock
|
|
148
|
+
group_add:
|
|
149
|
+
- "${DOCKER_GID}" # host: getent group docker | cut -d: -f3 (or: stat -c %g /var/run/docker.sock)
|
|
150
|
+
extra_hosts:
|
|
151
|
+
- "host.docker.internal:host-gateway" # resolves to the host (Linux)
|
|
152
|
+
# NO `ports:` under Coolify — its proxy owns the host ports (publishing
|
|
153
|
+
# 0.0.0.0:<port> here fails with "port is already allocated").
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Set `DOCKER_GID` in the deployment env to the host's docker group GID. The agent
|
|
157
|
+
`openshell-entrypoint.sh` ships with the image; it does NOT start a local gateway
|
|
158
|
+
— it just verifies the remote one and starts the agent.
|
|
159
|
+
|
|
160
|
+
## 3. Validation
|
|
161
|
+
|
|
162
|
+
Agent boot log should print:
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
[openshell] using remote gateway http://host.docker.internal:17670
|
|
166
|
+
[openshell] gateway connected — per-session sandbox ACTIVE.
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
instead of `[sandbox] SECURITY DEGRADED ...`. Then exercise a file-generating
|
|
170
|
+
skill and confirm it runs (the shell is jailed; generated files still land in
|
|
171
|
+
storage via the parent finalizer).
|
|
172
|
+
|
|
173
|
+
## 4. Security
|
|
174
|
+
|
|
175
|
+
- The gateway runs with `--disable-tls` and no auth. **Do NOT expose port 17670**
|
|
176
|
+
beyond the host/VPC — keep it out of the cloud security group / firewall. It is
|
|
177
|
+
reachable by the agent over the internal Docker network only. Anyone who can
|
|
178
|
+
reach `:17670` can create sandboxes (i.e. run code) through it.
|
|
179
|
+
- For a hardened multi-host setup, use OpenShell's mTLS gateway (generate certs,
|
|
180
|
+
distribute the client cert to the agent) or its Helm chart for Kubernetes
|
|
181
|
+
instead of `--disable-tls`.
|
|
182
|
+
|
|
183
|
+
## Troubleshooting (errors seen in practice)
|
|
184
|
+
|
|
185
|
+
| Symptom | Cause | Fix |
|
|
186
|
+
|---------|-------|-----|
|
|
187
|
+
| `--tls-cert is required when TLS is enabled` | gateway started with mTLS but no certs | run with `--disable-tls` |
|
|
188
|
+
| `failed to bind to 172.16.x.1:17670: Cannot assign requested address` | gateway running *inside* a container can't bind the bridge IP | run the gateway on the **host** (this doc) |
|
|
189
|
+
| `failed to query Docker daemon version: ... Connect` | the gateway process has no Docker socket access | run as a user in the `docker` group (no sudo at runtime); for the systemd `--user` unit, re-login so it inherits the group |
|
|
190
|
+
| Agent log: `Docker not available` | the agent container can't reach Docker | mount `/var/run/docker.sock` + set `DOCKER_GID` to the host docker group GID |
|
|
191
|
+
| `Bind for 0.0.0.0:<port> failed: port is already allocated` (Coolify) | a `ports:` publish collides with Coolify's proxy | remove `ports:` — Coolify routes the domain via its own proxy |
|
|
192
|
+
| Agent log: `cannot reach …:17670` | gateway down, or `host.docker.internal` doesn't resolve | confirm the host gateway is up (`ss -ltnp | grep 17670`) and `extra_hosts: host.docker.internal:host-gateway` is set |
|
|
193
|
+
| `error: invalid value '1' for '--gateway-insecure'` | `OPENSHELL_GATEWAY_INSECURE` set to `1`/`0` | the value must be `true`/`false` → `OPENSHELL_GATEWAY_INSECURE=true` |
|
|
194
|
+
| `sandbox create failed: ... missing authorization header` | gateway has no auth mechanism, but rejects unauthenticated callers | add `[openshell.gateway.auth] allow_unauthenticated_users = true` to the gateway config |
|
|
195
|
+
| `sandbox create failed: docker sandboxes require gateway JWT auth` | the gateway can't mint the sandbox supervisor's JWT | add `[openshell.gateway.gateway_jwt]` (signing/public/kid paths) to the gateway config |
|
|
@@ -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.8post3"
|
|
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
|
{agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/__init__.py
RENAMED
|
File without changes
|
{agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/__init__.py
RENAMED
|
File without changes
|
{agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/base.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
|
{agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/models.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/__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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_framework_lib-0.8.8.post2 → agent_framework_lib-0.8.8.post3}/agent_framework/core/models.py
RENAMED
|
File without changes
|