agent-framework-lib 0.8.8__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.
Files changed (337) hide show
  1. {agent_framework_lib-0.8.8/agent_framework_lib.egg-info → agent_framework_lib-0.8.8.post3}/PKG-INFO +1 -1
  2. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/security/authz.py +36 -3
  3. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/security/sandbox_provider.py +14 -3
  4. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/shell_tool.py +22 -1
  5. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/server.py +68 -23
  6. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3/agent_framework_lib.egg-info}/PKG-INFO +1 -1
  7. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework_lib.egg-info/SOURCES.txt +1 -0
  8. agent_framework_lib-0.8.8.post3/docs/OPENSHELL_GATEWAY_HOST_SETUP.md +195 -0
  9. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/pyproject.toml +1 -1
  10. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/ARCHITECTURE.md +0 -0
  11. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/LICENSE +0 -0
  12. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/MANIFEST.in +0 -0
  13. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/README.md +0 -0
  14. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/__init__.py +0 -0
  15. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/__init__.py +0 -0
  16. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/base.py +0 -0
  17. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/__init__.py +0 -0
  18. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
  19. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
  20. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
  21. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
  22. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
  23. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
  24. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
  25. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/models.py +0 -0
  26. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/providers/__init__.py +0 -0
  27. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
  28. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/a2a/providers/postgres_provider.py +0 -0
  29. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/capabilities/__init__.py +0 -0
  30. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/capabilities/resolver.py +0 -0
  31. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/__init__.py +0 -0
  32. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/audit.py +0 -0
  33. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/config.py +0 -0
  34. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/crypto.py +0 -0
  35. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/git_provider.py +0 -0
  36. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/herdr_client.py +0 -0
  37. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/models.py +0 -0
  38. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/orchestrator.py +0 -0
  39. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/store.py +0 -0
  40. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/code_delivery/tools.py +0 -0
  41. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/__init__.py +0 -0
  42. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/activity_formatter.py +0 -0
  43. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/agent_interface.py +0 -0
  44. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/agent_provider.py +0 -0
  45. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/base_agent.py +0 -0
  46. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/context_budget.py +0 -0
  47. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/context_summarizer.py +0 -0
  48. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/elasticsearch_config_provider.py +0 -0
  49. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/execution_controller.py +0 -0
  50. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/implementation_validator.py +0 -0
  51. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/interruption_message.py +0 -0
  52. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/knowledge_state.py +0 -0
  53. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/loop_detector.py +0 -0
  54. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/model_clients.py +0 -0
  55. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/model_config.py +0 -0
  56. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/model_router.py +0 -0
  57. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/models.py +0 -0
  58. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/prompt_builder.py +0 -0
  59. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/provider_calibration.py +0 -0
  60. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/scratchpad_compressor.py +0 -0
  61. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/scratchpad_serializer.py +0 -0
  62. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/state_manager.py +0 -0
  63. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/step_display_config.py +0 -0
  64. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/core/streaming_parts_accumulator.py +0 -0
  65. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/implementations/__init__.py +0 -0
  66. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/implementations/budget_aware_agent.py +0 -0
  67. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/implementations/llamaindex_agent.py +0 -0
  68. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
  69. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/implementations/microsoft_agent.py +0 -0
  70. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/__init__.py +0 -0
  71. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/agent_mixin.py +0 -0
  72. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/base.py +0 -0
  73. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/config.py +0 -0
  74. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/hypothesis_engine.py +0 -0
  75. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/implicit_feedback.py +0 -0
  76. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/manager.py +0 -0
  77. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/personalization.py +0 -0
  78. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/providers/__init__.py +0 -0
  79. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/providers/graphiti_provider.py +0 -0
  80. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/providers/memori_provider.py +0 -0
  81. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/response_lessons.py +0 -0
  82. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/tools.py +0 -0
  83. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/memory/work_patterns.py +0 -0
  84. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/__init__.py +0 -0
  85. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/api_timing_tracker.py +0 -0
  86. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
  87. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
  88. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/error_handling.py +0 -0
  89. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/error_logging.py +0 -0
  90. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
  91. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/llm_metrics.py +0 -0
  92. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/llm_metrics_collector.py +0 -0
  93. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
  94. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/metrics_aggregator.py +0 -0
  95. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/metrics_config.py +0 -0
  96. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/observability_manager.py +0 -0
  97. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/otel_instrumentor.py +0 -0
  98. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/otel_logging_handler.py +0 -0
  99. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
  100. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/otel_setup.py +0 -0
  101. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/performance_monitor.py +0 -0
  102. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/progress_tracker.py +0 -0
  103. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/resource_manager.py +0 -0
  104. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
  105. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
  106. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/timing_tracker.py +0 -0
  107. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/token_counter.py +0 -0
  108. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/monitoring/tracing_context.py +0 -0
  109. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/notifications/__init__.py +0 -0
  110. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/notifications/hub.py +0 -0
  111. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/notifications/webhook_notifier.py +0 -0
  112. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/processing/__init__.py +0 -0
  113. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/processing/ai_content_management.py +0 -0
  114. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/processing/markdown_converter.py +0 -0
  115. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/processing/multimodal_integration.py +0 -0
  116. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/processing/rich_content_validation.py +0 -0
  117. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/py.typed +0 -0
  118. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/security/__init__.py +0 -0
  119. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/security/file_view_token.py +0 -0
  120. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/security/input_guard.py +0 -0
  121. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/security/openshell_policy.yaml +0 -0
  122. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/security/pii_redactor.py +0 -0
  123. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/security/sandbox.py +0 -0
  124. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/security/secret_redactor.py +0 -0
  125. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/security/shell_env.py +0 -0
  126. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/security/upload_token.py +0 -0
  127. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/session/__init__.py +0 -0
  128. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/session/elasticsearch_session_storage.py +0 -0
  129. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/session/session_storage.py +0 -0
  130. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/__init__.py +0 -0
  131. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/agent_mixin.py +0 -0
  132. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/base.py +0 -0
  133. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/__init__.py +0 -0
  134. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/scripts/__init__.py +0 -0
  135. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/scripts/create_and_register.py +0 -0
  136. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/scripts/register_to_storage.py +0 -0
  137. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/chart/SKILL.md +0 -0
  138. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/chart/chart_to_image.py +0 -0
  139. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/chart/vendor_chart.umd.min.js +0 -0
  140. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/code_delivery/SKILL.md +0 -0
  141. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/code_format/SKILL.md +0 -0
  142. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/code_format/format_python.py +0 -0
  143. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/csv/SKILL.md +0 -0
  144. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/csv/create_csv.py +0 -0
  145. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/csv/read_csv.py +0 -0
  146. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/csv/transform_csv.py +0 -0
  147. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/data_format/SKILL.md +0 -0
  148. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/data_format/json_to_yaml.py +0 -0
  149. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/data_format/yaml_to_json.py +0 -0
  150. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/drawio/SKILL.md +0 -0
  151. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/drawio/create_drawio.py +0 -0
  152. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/email_template/SKILL.md +0 -0
  153. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/excel/SKILL.md +0 -0
  154. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/excel/create_excel.py +0 -0
  155. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file/SKILL.md +0 -0
  156. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file/create_file.py +0 -0
  157. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file/list_files.py +0 -0
  158. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file/read_file.py +0 -0
  159. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file_access/SKILL.md +0 -0
  160. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file_access/download_to_local.py +0 -0
  161. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/file_access/get_file_path.py +0 -0
  162. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/form/SKILL.md +0 -0
  163. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/image_display/SKILL.md +0 -0
  164. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/image_gen/SKILL.md +0 -0
  165. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/image_gen/create_image.py +0 -0
  166. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/image_gen/generate_image.py +0 -0
  167. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/mermaid/SKILL.md +0 -0
  168. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/mermaid/mermaid_to_image.py +0 -0
  169. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/mermaid/vendor_mermaid.umd.min.js +0 -0
  170. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/multimodal/SKILL.md +0 -0
  171. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +0 -0
  172. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/SKILL.md +0 -0
  173. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/create_powerpoint.py +0 -0
  174. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/Big Data Infographics.pptx +0 -0
  175. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/Executive Design Pitch Deck.pptx +0 -0
  176. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/Management Consulting Toolkit.pptx +0 -0
  177. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/__init__.py +0 -0
  178. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/generate_templates.py +0 -0
  179. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/skill_creator/SKILL.md +0 -0
  180. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/skill_creator/skill_api.py +0 -0
  181. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/table/SKILL.md +0 -0
  182. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/table/table_to_image.py +0 -0
  183. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +0 -0
  184. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/unified_pdf/create_pdf.py +0 -0
  185. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/web_news_search/SKILL.md +0 -0
  186. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/web_news_search/web_news_search.py +0 -0
  187. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/word/SKILL.md +0 -0
  188. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/builtin/skills/word/create_word.py +0 -0
  189. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/custom_skill_manager.py +0 -0
  190. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/discovery_prompt.py +0 -0
  191. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/markdown_loader.py +0 -0
  192. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/skills/tools.py +0 -0
  193. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/storage/__init__.py +0 -0
  194. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/storage/file_storages.py +0 -0
  195. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/storage/file_system_management.py +0 -0
  196. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/storage/storage_optimizer.py +0 -0
  197. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/subagents/__init__.py +0 -0
  198. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/subagents/executor.py +0 -0
  199. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/subagents/message_injector.py +0 -0
  200. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/subagents/message_queue.py +0 -0
  201. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/subagents/retrigger.py +0 -0
  202. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/subagents/spawn_tool.py +0 -0
  203. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/__init__.py +0 -0
  204. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/activity_callback.py +0 -0
  205. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/adaptive_pdf_css.py +0 -0
  206. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/base.py +0 -0
  207. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/html_content_analyzer.py +0 -0
  208. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/multimodal_tools.py +0 -0
  209. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/pdf_image_scaler.py +0 -0
  210. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/sizing_config.py +0 -0
  211. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/web_fetch_tool.py +0 -0
  212. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/tools/web_search_tool.py +0 -0
  213. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/utils/__init__.py +0 -0
  214. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/utils/path_utils.py +0 -0
  215. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/utils/post_install.py +0 -0
  216. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/utils/session_title_generator.py +0 -0
  217. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/utils/source_detector.py +0 -0
  218. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/utils/special_blocks.py +0 -0
  219. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/__init__.py +0 -0
  220. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/admin_auth.py +0 -0
  221. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/admin_models.py +0 -0
  222. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/admin_router.py +0 -0
  223. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/admin_services.py +0 -0
  224. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/api_timing_middleware.py +0 -0
  225. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
  226. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
  227. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
  228. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
  229. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
  230. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/Dockerfile +0 -0
  231. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/GETTING_STARTED.md +0 -0
  232. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/GITNEXUS_USER_GUIDE.md +0 -0
  233. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
  234. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/README.md +0 -0
  235. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
  236. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/WORKSPACE_INTEGRATION.md +0 -0
  237. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/api-reference.md +0 -0
  238. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/configuration.md +0 -0
  239. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/docker-compose.yml +0 -0
  240. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_example_multi_skills.py +0 -0
  241. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_with_file_storage.py +0 -0
  242. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
  243. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
  244. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_with_memory_graphiti.py +0 -0
  245. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_with_memory_hybrid.py +0 -0
  246. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/agent_with_memory_simple.py +0 -0
  247. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
  248. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/simple_agent.py +0 -0
  249. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
  250. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/docs/installation-guide.md +0 -0
  251. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/documentation_generator.py +0 -0
  252. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/gitnexus_client.py +0 -0
  253. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/helper_agent.py +0 -0
  254. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/helper_ui.html +0 -0
  255. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/modern_ui.html +0 -0
  256. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
  257. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
  258. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/otel_tracing_middleware.py +0 -0
  259. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/skills_router.py +0 -0
  260. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/web/test_app.html +0 -0
  261. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/__init__.py +0 -0
  262. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/artefacts.py +0 -0
  263. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/client.py +0 -0
  264. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/config.py +0 -0
  265. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/context.py +0 -0
  266. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/cursor.py +0 -0
  267. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/memory.py +0 -0
  268. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/models.py +0 -0
  269. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/poller.py +0 -0
  270. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/preferences.py +0 -0
  271. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/router.py +0 -0
  272. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/session.py +0 -0
  273. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework/workspace/subscription.py +0 -0
  274. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
  275. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework_lib.egg-info/entry_points.txt +0 -0
  276. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework_lib.egg-info/requires.txt +0 -0
  277. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/agent_framework_lib.egg-info/top_level.txt +0 -0
  278. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/A2A_GUIDE.md +0 -0
  279. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
  280. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/ARCHITECTURE_DIAGRAM.md +0 -0
  281. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
  282. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/CANCEL_AND_INTERRUPT_FRONTEND.md +0 -0
  283. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
  284. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/CREATING_AGENTS.md +0 -0
  285. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
  286. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/DEEPEVAL_TEST_REPORT.md +0 -0
  287. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/DIAGNOSTIC_SANDBOX_SKILLS.md +0 -0
  288. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/DOCKER_SETUP.md +0 -0
  289. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +0 -0
  290. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
  291. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/FILE_STORAGE_GUIDE.md +0 -0
  292. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/GETTING_STARTED.md +0 -0
  293. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/GITNEXUS_USER_GUIDE.md +0 -0
  294. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/HISTORY_MESSAGE_FORMAT.md +0 -0
  295. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
  296. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/MEMORY_INSTALLATION.md +0 -0
  297. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
  298. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/MULTIMODAL_TOOLS_GUIDE.md +0 -0
  299. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/OBSERVABILITY_GUIDE.md +0 -0
  300. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/PYPI_PUBLISHING.md +0 -0
  301. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/QA_STREAMING_LATENCY.md +0 -0
  302. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/SCREENSHOTS_GUIDE.md +0 -0
  303. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/SECRETS_MANAGEMENT.md +0 -0
  304. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/SECURITY_HARDENING.md +0 -0
  305. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
  306. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/SSE_NOTIFICATIONS_GUIDE.md +0 -0
  307. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/STREAMING_EVENTS_FRONTEND.md +0 -0
  308. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
  309. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/WORKSPACE_INTEGRATION.md +0 -0
  310. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/api-reference.md +0 -0
  311. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/configuration.md +0 -0
  312. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/framework_audit_remarques.md +0 -0
  313. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/helper_agent.md +0 -0
  314. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/index.md +0 -0
  315. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/docs/installation-guide.md +0 -0
  316. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/README.md +0 -0
  317. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/agent_context_budget_test.py +0 -0
  318. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/agent_example_multi_skills.py +0 -0
  319. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/agent_exemple_test.py +0 -0
  320. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/agent_training_with_apo.py +0 -0
  321. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/agent_with_custom_tools_file_storage.py +0 -0
  322. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/agent_with_file_storage.py +0 -0
  323. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/agent_with_mcp.py +0 -0
  324. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/agent_with_memory_graphiti.py +0 -0
  325. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/agent_with_memory_hybrid.py +0 -0
  326. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/agent_with_memory_simple.py +0 -0
  327. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/agent_with_personalization.py +0 -0
  328. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/biagenttest.py +0 -0
  329. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/custom_framework_agent.py +0 -0
  330. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/dependencies/docker-compose.yaml +0 -0
  331. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/pyproject.toml +0 -0
  332. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/simple_agent.py +0 -0
  333. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/skills_demo_agent.py +0 -0
  334. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/test_work_patterns_live.py +0 -0
  335. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/examples/workspace_test_agent.py +0 -0
  336. {agent_framework_lib-0.8.8 → agent_framework_lib-0.8.8.post3}/setup.cfg +0 -0
  337. {agent_framework_lib-0.8.8 → 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, ou si le mode
68
- développement est actif et que le principal est ``"anonymous"``
69
- (compat mono-utilisateur).
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.debug(
479
- "openshell download (no output?) for %s: %s",
484
+ logger.warning(
485
+ "[sandbox] download failed for %s (src=%s) rc=%s — generated files "
486
+ "may be lost: %s",
480
487
  name,
481
- (proc.stdout + proc.stderr).strip()[:200],
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
- with contextlib.suppress(Exception):
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 ""
@@ -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
@@ -667,6 +668,30 @@ async def _load_session_or_raise(storage: Any, user_id: str, session_id: str) ->
667
668
  return session_data
668
669
 
669
670
 
671
+ def _matches_status_filter(
672
+ metadata: dict[str, Any] | None, include_closed: bool, only_closed: bool
673
+ ) -> bool:
674
+ """Decide whether a session matches the requested open/closed filter.
675
+
676
+ A session is considered closed when ``metadata.status == "closed"``; any
677
+ other value (including a missing status) is treated as open.
678
+
679
+ Args:
680
+ metadata: Session metadata dict (may be None).
681
+ include_closed: Return both open and closed sessions.
682
+ only_closed: Return only closed sessions (takes precedence).
683
+
684
+ Returns:
685
+ True if the session should be included in the result.
686
+ """
687
+ is_closed = (metadata or {}).get("status") == "closed"
688
+ if only_closed:
689
+ return is_closed
690
+ if include_closed:
691
+ return True
692
+ return not is_closed
693
+
694
+
670
695
  # Pydantic model for incoming messages, now uses content list
671
696
  class MessageRequest(BaseModel):
672
697
  # This model directly mirrors StructuredAgentInput for the request body
@@ -2306,7 +2331,7 @@ async def handle_message_endpoint(
2306
2331
  # mismatch that made uploaded files 404 on download. In dev-mode (auth
2307
2332
  # disabled) the query param is honored for single-user compatibility.
2308
2333
  # Mirrors /files/upload (see effective_user_id there).
2309
- user_id = current_user if auth_required() else user_id
2334
+ user_id = resolve_effective_user_id(current_user, user_id)
2310
2335
 
2311
2336
  # Determine session_id: query param > body.session_id > new UUID
2312
2337
  session_id_from_query = request.query_params.get("session_id")
@@ -2720,7 +2745,7 @@ async def handle_stream_endpoint(
2720
2745
  # user_id query param — bind the session (and every file it stores) to the
2721
2746
  # authenticated principal. In dev-mode (auth disabled) the query param is
2722
2747
  # honored for single-user compatibility. Mirrors /files/upload.
2723
- user_id = current_user if auth_required() else user_id
2748
+ user_id = resolve_effective_user_id(current_user, user_id)
2724
2749
 
2725
2750
  # Support both /sessions/{session_id}/stream and /stream?session_id=...
2726
2751
  # If session_id is not provided as a path parameter, try to get it from query/body
@@ -4055,14 +4080,27 @@ async def list_sessions_endpoint(
4055
4080
  user_id: str = Query(
4056
4081
  DEFAULT_USER_ID, description="Identifier for the user whose sessions to list"
4057
4082
  ),
4083
+ include_closed: bool = Query(
4084
+ False,
4085
+ description="When true, return both open and closed sessions instead of open only.",
4086
+ ),
4087
+ only_closed: bool = Query(
4088
+ False,
4089
+ description="When true, return only closed sessions. Takes precedence over include_closed.",
4090
+ ),
4058
4091
  current_user: str = Depends(get_current_user),
4059
4092
  ):
4060
- """Lists all active session IDs for a given user_id, filtered by current agent ID."""
4093
+ """Lists session IDs for a given user_id, filtered by current agent ID.
4094
+
4095
+ By default only open sessions (status != "closed") are returned. Use
4096
+ ``only_closed=true`` to list only closed sessions, or ``include_closed=true``
4097
+ to list both open and closed sessions.
4098
+ """
4061
4099
  global session_storage
4062
4100
 
4063
4101
  # Multi-tenant: under auth, list only the authenticated principal's sessions
4064
4102
  # (ignore client user_id). Keeps the UI consistent with /message + /stream.
4065
- user_id = current_user if auth_required() else user_id
4103
+ user_id = resolve_effective_user_id(current_user, user_id)
4066
4104
 
4067
4105
  if not session_storage:
4068
4106
  raise HTTPException(status_code=500, detail="Session storage not available")
@@ -4073,13 +4111,20 @@ async def list_sessions_endpoint(
4073
4111
  agent_identity = StateManager.create_agent_identity(temp_agent)
4074
4112
  current_agent_id = agent_identity.agent_id
4075
4113
 
4076
- # Use agent-filtered session retrieval by agent_id (not agent_type)
4077
- user_sessions = await session_storage.get_user_sessions_by_agent(
4078
- user_id, agent_id=current_agent_id
4079
- )
4114
+ # Use session info (includes metadata.status) so we can filter by status.
4115
+ # Already sorted by updated_at desc across all backends.
4116
+ sessions_info = await session_storage.list_user_sessions_with_info(user_id)
4117
+
4118
+ user_sessions = [
4119
+ info["session_id"]
4120
+ for info in sessions_info
4121
+ if info.get("agent_id") == current_agent_id
4122
+ and _matches_status_filter(info.get("metadata"), include_closed, only_closed)
4123
+ ]
4124
+
4080
4125
  # An empty list during a storage outage would look like "no sessions".
4081
4126
  # Surface the outage as 503 instead so the client can retry.
4082
- if not user_sessions and not await session_storage.is_available():
4127
+ if not sessions_info and not await session_storage.is_available():
4083
4128
  raise HTTPException(
4084
4129
  status_code=503,
4085
4130
  detail=STORAGE_UNAVAILABLE_DETAIL,
@@ -4107,7 +4152,7 @@ async def list_sessions_with_info_endpoint(
4107
4152
 
4108
4153
  # Multi-tenant: under auth, list only the authenticated principal's sessions
4109
4154
  # (ignore client user_id). Keeps the UI consistent with /message + /stream.
4110
- user_id = current_user if auth_required() else user_id
4155
+ user_id = resolve_effective_user_id(current_user, user_id)
4111
4156
 
4112
4157
  if not session_storage:
4113
4158
  raise HTTPException(status_code=500, detail="Session storage not available")
@@ -4212,7 +4257,7 @@ async def cancel_execution_endpoint(
4212
4257
 
4213
4258
  # Multi-tenant: under auth, only the authenticated principal may cancel their
4214
4259
  # own session (ignore client user_id). Matches /message + /stream ownership.
4215
- user_id = current_user if auth_required() else user_id
4260
+ user_id = resolve_effective_user_id(current_user, user_id)
4216
4261
 
4217
4262
  if not session_storage:
4218
4263
  raise HTTPException(status_code=500, detail="Session storage not available")
@@ -4288,7 +4333,7 @@ async def get_execution_state_endpoint(
4288
4333
 
4289
4334
  # Multi-tenant: under auth, scope to the authenticated principal (ignore
4290
4335
  # client user_id) so ownership matches /message + /stream.
4291
- user_id = current_user if auth_required() else user_id
4336
+ user_id = resolve_effective_user_id(current_user, user_id)
4292
4337
 
4293
4338
  if not session_storage:
4294
4339
  raise HTTPException(status_code=500, detail="Session storage not available")
@@ -4379,7 +4424,7 @@ async def get_history_endpoint(
4379
4424
  # Multi-tenant: under auth, scope reads to the authenticated principal and
4380
4425
  # ignore the client-supplied user_id. Mirrors the write side (/message,
4381
4426
  # /stream) so sessions created there are visible to the same UI identity.
4382
- user_id = current_user if auth_required() else user_id
4427
+ user_id = resolve_effective_user_id(current_user, user_id)
4383
4428
 
4384
4429
  if not session_storage:
4385
4430
  raise HTTPException(status_code=500, detail="Session storage not available")
@@ -5015,7 +5060,7 @@ async def get_code_delivery_config_endpoint(
5015
5060
  # The client-provided user_id query param is only honored in dev-mode to
5016
5061
  # preserve single-user/finalizer compatibility (cannot be used to read or
5017
5062
  # mutate another user's code-delivery config when auth is enabled).
5018
- effective_user_id = current_user if auth_required() else user_id
5063
+ effective_user_id = resolve_effective_user_id(current_user, user_id)
5019
5064
 
5020
5065
  resolved = await get_shared_store().resolve(effective_user_id, session_id)
5021
5066
  meta = resolved.github_auth
@@ -5059,7 +5104,7 @@ async def set_code_delivery_github_auth_endpoint(
5059
5104
  )
5060
5105
  # Storage identity bound to the authenticated principal (query param honored
5061
5106
  # only in dev-mode) so a user cannot store a token under another identity.
5062
- effective_user_id = current_user if auth_required() else user_id
5107
+ effective_user_id = resolve_effective_user_id(current_user, user_id)
5063
5108
  try:
5064
5109
  await get_shared_store().set_github_token(
5065
5110
  effective_user_id, body.token, meta, session_id=body.session_id
@@ -5084,7 +5129,7 @@ async def delete_code_delivery_github_auth_endpoint(
5084
5129
  from agent_framework.code_delivery.store import get_shared_store
5085
5130
 
5086
5131
  # Storage identity bound to the authenticated principal (dev-mode honors the query param).
5087
- effective_user_id = current_user if auth_required() else user_id
5132
+ effective_user_id = resolve_effective_user_id(current_user, user_id)
5088
5133
  await get_shared_store().clear_github_token(effective_user_id, session_id=session_id)
5089
5134
  return {"success": True, "scope": "session" if session_id else "user"}
5090
5135
 
@@ -5099,7 +5144,7 @@ async def get_code_delivery_repos_endpoint(
5099
5144
  from agent_framework.code_delivery.store import get_shared_store
5100
5145
 
5101
5146
  # Storage identity bound to the authenticated principal (dev-mode honors the query param).
5102
- effective_user_id = current_user if auth_required() else user_id
5147
+ effective_user_id = resolve_effective_user_id(current_user, user_id)
5103
5148
  resolved = await get_shared_store().resolve(effective_user_id, session_id)
5104
5149
  return {"repos": [r.model_dump() for r in resolved.repos]}
5105
5150
 
@@ -5116,7 +5161,7 @@ async def set_code_delivery_repos_endpoint(
5116
5161
 
5117
5162
  repos = [RepoEntry(**r.model_dump()) for r in body.repos]
5118
5163
  # Storage identity bound to the authenticated principal (dev-mode honors the query param).
5119
- effective_user_id = current_user if auth_required() else user_id
5164
+ effective_user_id = resolve_effective_user_id(current_user, user_id)
5120
5165
  await get_shared_store().set_repos(effective_user_id, repos, session_id=body.session_id)
5121
5166
  return {"success": True, "count": len(repos)}
5122
5167
 
@@ -5167,7 +5212,7 @@ async def set_code_delivery_herdr_endpoint(
5167
5212
  if body.mode not in ("local", "remote"):
5168
5213
  raise HTTPException(status_code=400, detail="mode must be 'local' or 'remote'")
5169
5214
  # Storage identity bound to the authenticated principal (dev-mode honors the query param).
5170
- effective_user_id = current_user if auth_required() else user_id
5215
+ effective_user_id = resolve_effective_user_id(current_user, user_id)
5171
5216
  fields: dict[str, Any] = {"mode": body.mode}
5172
5217
  if body.base_url is not None:
5173
5218
  # SSRF / token-exfiltration guard before persistence or use.
@@ -5200,7 +5245,7 @@ async def set_code_delivery_settings_endpoint(
5200
5245
  model=body.backend_model or "claude-sonnet-4-20250514",
5201
5246
  )
5202
5247
  # Storage identity bound to the authenticated principal (dev-mode honors the query param).
5203
- effective_user_id = current_user if auth_required() else user_id
5248
+ effective_user_id = resolve_effective_user_id(current_user, user_id)
5204
5249
  await get_shared_store().set_settings(
5205
5250
  effective_user_id,
5206
5251
  enabled=body.enabled,
@@ -5273,7 +5318,7 @@ async def upload_file(
5273
5318
  # spoofing another user's ownership. In dev-mode the query param is
5274
5319
  # honored (passive finalizer uploads via localhost using the
5275
5320
  # AGENT_USER_ID wiring), preserving single-user compatibility.
5276
- effective_user_id = current_user if auth_required() else user_id
5321
+ effective_user_id = resolve_effective_user_id(current_user, user_id)
5277
5322
 
5278
5323
  file_id = await app.state.file_storage_manager.store_file(
5279
5324
  content=content,
@@ -5621,7 +5666,7 @@ async def list_files(
5621
5666
  # Multi-tenant: under auth, list only the authenticated principal's files
5622
5667
  # (ignore the client user_id) so the UI sees the files uploaded by skills,
5623
5668
  # which are owned by the same principal. Mirrors /files/upload + download.
5624
- user_id = current_user if auth_required() else user_id
5669
+ user_id = resolve_effective_user_id(current_user, user_id)
5625
5670
  try:
5626
5671
  logger.info(
5627
5672
  f"🔍 FILES ENDPOINT - Parameters: user_id={user_id}, session_id={session_id}, is_generated={is_generated}"
@@ -6929,7 +6974,7 @@ async def get_session_response_times_endpoint(
6929
6974
  # Multi-tenant: under auth, scope to the authenticated principal (ignore the
6930
6975
  # client user_id) so the ownership check below matches sessions created by
6931
6976
  # /message and /stream under the same identity.
6932
- user_id = current_user if auth_required() else user_id
6977
+ user_id = resolve_effective_user_id(current_user, user_id)
6933
6978
 
6934
6979
  if session_storage is None:
6935
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.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"}