agent-framework-lib 0.8.9__tar.gz → 0.8.9.post2__tar.gz

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