agent-framework-lib 0.8.9__tar.gz → 0.8.9.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 (354) hide show
  1. {agent_framework_lib-0.8.9/agent_framework_lib.egg-info → agent_framework_lib-0.8.9.post3}/PKG-INFO +1 -1
  2. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/model_clients.py +172 -2
  3. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/scratchpad_compressor.py +57 -9
  4. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/authz.py +27 -9
  5. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/post_install.py +66 -0
  6. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/admin_auth.py +70 -1
  7. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/modern_ui.html +136 -10
  8. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/server.py +54 -18
  9. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/skills_router.py +8 -5
  10. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/chat_completion.py +14 -0
  11. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3/agent_framework_lib.egg-info}/PKG-INFO +1 -1
  12. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/SECURITY_HARDENING.md +19 -2
  13. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/pyproject.toml +1 -1
  14. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/ARCHITECTURE.md +0 -0
  15. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/LICENSE +0 -0
  16. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/MANIFEST.in +0 -0
  17. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/README.md +0 -0
  18. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/__init__.py +0 -0
  19. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/__init__.py +0 -0
  20. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/base.py +0 -0
  21. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/__init__.py +0 -0
  22. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
  23. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
  24. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
  25. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
  26. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
  27. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
  28. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
  29. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/models.py +0 -0
  30. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/providers/__init__.py +0 -0
  31. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
  32. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/providers/postgres_provider.py +0 -0
  33. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/capabilities/__init__.py +0 -0
  34. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/capabilities/resolver.py +0 -0
  35. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/__init__.py +0 -0
  36. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/audit.py +0 -0
  37. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/config.py +0 -0
  38. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/crypto.py +0 -0
  39. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/git_provider.py +0 -0
  40. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/herdr_client.py +0 -0
  41. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/models.py +0 -0
  42. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/orchestrator.py +0 -0
  43. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/store.py +0 -0
  44. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/tools.py +0 -0
  45. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/__init__.py +0 -0
  46. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/activity_formatter.py +0 -0
  47. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/agent_interface.py +0 -0
  48. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/agent_provider.py +0 -0
  49. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/base_agent.py +0 -0
  50. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/context_budget.py +0 -0
  51. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/context_summarizer.py +0 -0
  52. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/elasticsearch_config_provider.py +0 -0
  53. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/execution_controller.py +0 -0
  54. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/implementation_validator.py +0 -0
  55. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/interruption_message.py +0 -0
  56. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/knowledge_state.py +0 -0
  57. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/loop_detector.py +0 -0
  58. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/model_config.py +0 -0
  59. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/model_router.py +0 -0
  60. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/models.py +0 -0
  61. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/prompt_builder.py +0 -0
  62. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/provider_calibration.py +0 -0
  63. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/scratchpad_serializer.py +0 -0
  64. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/state_manager.py +0 -0
  65. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/step_display_config.py +0 -0
  66. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/streaming_parts_accumulator.py +0 -0
  67. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/__init__.py +0 -0
  68. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/budget_aware_agent.py +0 -0
  69. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/llamaindex_agent.py +0 -0
  70. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
  71. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/microsoft_agent.py +0 -0
  72. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/__init__.py +0 -0
  73. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/agent_mixin.py +0 -0
  74. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/base.py +0 -0
  75. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/config.py +0 -0
  76. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/hypothesis_engine.py +0 -0
  77. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/implicit_feedback.py +0 -0
  78. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/manager.py +0 -0
  79. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/personalization.py +0 -0
  80. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/providers/__init__.py +0 -0
  81. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/providers/graphiti_provider.py +0 -0
  82. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/providers/memori_provider.py +0 -0
  83. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/response_lessons.py +0 -0
  84. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/tools.py +0 -0
  85. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/work_patterns.py +0 -0
  86. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/__init__.py +0 -0
  87. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/api_timing_tracker.py +0 -0
  88. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
  89. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
  90. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/error_handling.py +0 -0
  91. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/error_logging.py +0 -0
  92. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
  93. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/llm_metrics.py +0 -0
  94. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/llm_metrics_collector.py +0 -0
  95. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
  96. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/metrics_aggregator.py +0 -0
  97. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/metrics_config.py +0 -0
  98. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/observability_manager.py +0 -0
  99. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/otel_instrumentor.py +0 -0
  100. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/otel_logging_handler.py +0 -0
  101. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
  102. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/otel_setup.py +0 -0
  103. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/performance_monitor.py +0 -0
  104. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/progress_tracker.py +0 -0
  105. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/resource_manager.py +0 -0
  106. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
  107. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
  108. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/timing_tracker.py +0 -0
  109. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/token_counter.py +0 -0
  110. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/tracing_context.py +0 -0
  111. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/notifications/__init__.py +0 -0
  112. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/notifications/hub.py +0 -0
  113. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/notifications/webhook_notifier.py +0 -0
  114. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/__init__.py +0 -0
  115. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/ai_content_management.py +0 -0
  116. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/markdown_converter.py +0 -0
  117. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/multimodal_integration.py +0 -0
  118. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/rich_content_validation.py +0 -0
  119. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/py.typed +0 -0
  120. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/__init__.py +0 -0
  121. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/file_view_token.py +0 -0
  122. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/input_guard.py +0 -0
  123. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/openshell_policy.yaml +0 -0
  124. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/pii_redactor.py +0 -0
  125. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/sandbox.py +0 -0
  126. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/sandbox_provider.py +0 -0
  127. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/secret_redactor.py +0 -0
  128. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/shell_env.py +0 -0
  129. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/upload_token.py +0 -0
  130. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/session/__init__.py +0 -0
  131. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/session/elasticsearch_session_storage.py +0 -0
  132. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/session/session_storage.py +0 -0
  133. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/__init__.py +0 -0
  134. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/agent_mixin.py +0 -0
  135. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/base.py +0 -0
  136. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/__init__.py +0 -0
  137. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/scripts/__init__.py +0 -0
  138. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/scripts/create_and_register.py +0 -0
  139. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/scripts/register_to_storage.py +0 -0
  140. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/chart/SKILL.md +0 -0
  141. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/chart/chart_to_image.py +0 -0
  142. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/chart/vendor_chart.umd.min.js +0 -0
  143. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/code_delivery/SKILL.md +0 -0
  144. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/code_format/SKILL.md +0 -0
  145. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/code_format/format_python.py +0 -0
  146. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/csv/SKILL.md +0 -0
  147. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/csv/create_csv.py +0 -0
  148. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/csv/read_csv.py +0 -0
  149. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/csv/transform_csv.py +0 -0
  150. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/data_format/SKILL.md +0 -0
  151. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/data_format/json_to_yaml.py +0 -0
  152. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/data_format/yaml_to_json.py +0 -0
  153. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/drawio/SKILL.md +0 -0
  154. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/drawio/create_drawio.py +0 -0
  155. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/email_template/SKILL.md +0 -0
  156. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/excel/SKILL.md +0 -0
  157. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/excel/create_excel.py +0 -0
  158. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file/SKILL.md +0 -0
  159. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file/create_file.py +0 -0
  160. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file/list_files.py +0 -0
  161. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file/read_file.py +0 -0
  162. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file_access/SKILL.md +0 -0
  163. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file_access/download_to_local.py +0 -0
  164. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file_access/get_file_path.py +0 -0
  165. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/form/SKILL.md +0 -0
  166. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/image_display/SKILL.md +0 -0
  167. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/image_gen/SKILL.md +0 -0
  168. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/image_gen/create_image.py +0 -0
  169. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/mermaid/SKILL.md +0 -0
  170. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/mermaid/mermaid_to_image.py +0 -0
  171. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/mermaid/vendor_mermaid.umd.min.js +0 -0
  172. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/multimodal/SKILL.md +0 -0
  173. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +0 -0
  174. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/SKILL.md +0 -0
  175. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/create_powerpoint.py +0 -0
  176. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/Big Data Infographics.pptx +0 -0
  177. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/Executive Design Pitch Deck.pptx +0 -0
  178. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/Management Consulting Toolkit.pptx +0 -0
  179. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/__init__.py +0 -0
  180. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/generate_templates.py +0 -0
  181. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/skill_creator/SKILL.md +0 -0
  182. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/skill_creator/skill_api.py +0 -0
  183. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/table/SKILL.md +0 -0
  184. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/table/table_to_image.py +0 -0
  185. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +0 -0
  186. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/unified_pdf/create_pdf.py +0 -0
  187. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/web_news_search/SKILL.md +0 -0
  188. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/web_news_search/web_news_search.py +0 -0
  189. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/word/SKILL.md +0 -0
  190. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/word/create_word.py +0 -0
  191. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/custom_skill_manager.py +0 -0
  192. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/discovery_prompt.py +0 -0
  193. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/markdown_loader.py +0 -0
  194. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/tools.py +0 -0
  195. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/storage/__init__.py +0 -0
  196. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/storage/file_storages.py +0 -0
  197. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/storage/file_system_management.py +0 -0
  198. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/storage/storage_optimizer.py +0 -0
  199. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/__init__.py +0 -0
  200. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/executor.py +0 -0
  201. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/message_injector.py +0 -0
  202. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/message_queue.py +0 -0
  203. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/retrigger.py +0 -0
  204. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/spawn_tool.py +0 -0
  205. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/__init__.py +0 -0
  206. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/activity_callback.py +0 -0
  207. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/adaptive_pdf_css.py +0 -0
  208. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/base.py +0 -0
  209. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/html_content_analyzer.py +0 -0
  210. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/multimodal_tools.py +0 -0
  211. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/pdf_image_scaler.py +0 -0
  212. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/shell_tool.py +0 -0
  213. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/sizing_config.py +0 -0
  214. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/web_fetch_tool.py +0 -0
  215. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/web_search_tool.py +0 -0
  216. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/__init__.py +0 -0
  217. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/path_utils.py +0 -0
  218. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/session_title_generator.py +0 -0
  219. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/source_detector.py +0 -0
  220. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/special_blocks.py +0 -0
  221. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/__init__.py +0 -0
  222. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/admin_models.py +0 -0
  223. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/admin_router.py +0 -0
  224. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/admin_services.py +0 -0
  225. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/api_timing_middleware.py +0 -0
  226. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
  227. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
  228. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
  229. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
  230. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
  231. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/Dockerfile +0 -0
  232. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/GETTING_STARTED.md +0 -0
  233. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/GITNEXUS_USER_GUIDE.md +0 -0
  234. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
  235. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/README.md +0 -0
  236. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
  237. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/WORKSPACE_INTEGRATION.md +0 -0
  238. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/api-reference.md +0 -0
  239. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/configuration.md +0 -0
  240. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/docker-compose.yml +0 -0
  241. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_example_multi_skills.py +0 -0
  242. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_file_storage.py +0 -0
  243. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
  244. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
  245. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_memory_graphiti.py +0 -0
  246. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_memory_hybrid.py +0 -0
  247. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_memory_simple.py +0 -0
  248. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
  249. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/simple_agent.py +0 -0
  250. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
  251. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/installation-guide.md +0 -0
  252. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/documentation_generator.py +0 -0
  253. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/gitnexus_client.py +0 -0
  254. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/helper_agent.py +0 -0
  255. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/helper_ui.html +0 -0
  256. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
  257. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
  258. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/otel_tracing_middleware.py +0 -0
  259. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/test_app.html +0 -0
  260. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/__init__.py +0 -0
  261. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/__init__.py +0 -0
  262. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/builder.py +0 -0
  263. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/context.py +0 -0
  264. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/decorators.py +0 -0
  265. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/engine.py +0 -0
  266. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/errors.py +0 -0
  267. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/monitoring.py +0 -0
  268. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/runner.py +0 -0
  269. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/state.py +0 -0
  270. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/types.py +0 -0
  271. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/implementations/__init__.py +0 -0
  272. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/implementations/langgraph_engine.py +0 -0
  273. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/server/__init__.py +0 -0
  274. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/server/router.py +0 -0
  275. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/server/schemas.py +0 -0
  276. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/__init__.py +0 -0
  277. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/artefacts.py +0 -0
  278. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/client.py +0 -0
  279. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/config.py +0 -0
  280. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/context.py +0 -0
  281. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/cursor.py +0 -0
  282. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/memory.py +0 -0
  283. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/models.py +0 -0
  284. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/poller.py +0 -0
  285. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/preferences.py +0 -0
  286. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/router.py +0 -0
  287. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/session.py +0 -0
  288. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/subscription.py +0 -0
  289. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/SOURCES.txt +0 -0
  290. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
  291. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/entry_points.txt +0 -0
  292. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/requires.txt +0 -0
  293. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/top_level.txt +0 -0
  294. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/A2A_GUIDE.md +0 -0
  295. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
  296. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/ARCHITECTURE_DIAGRAM.md +0 -0
  297. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
  298. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/CANCEL_AND_INTERRUPT_FRONTEND.md +0 -0
  299. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
  300. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/CREATING_AGENTS.md +0 -0
  301. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
  302. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/DEEPEVAL_TEST_REPORT.md +0 -0
  303. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/DIAGNOSTIC_SANDBOX_SKILLS.md +0 -0
  304. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/DOCKER_SETUP.md +0 -0
  305. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +0 -0
  306. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
  307. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/FILE_STORAGE_GUIDE.md +0 -0
  308. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/GETTING_STARTED.md +0 -0
  309. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/GITNEXUS_USER_GUIDE.md +0 -0
  310. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/HISTORY_MESSAGE_FORMAT.md +0 -0
  311. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
  312. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/MEMORY_INSTALLATION.md +0 -0
  313. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
  314. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/MULTIMODAL_TOOLS_GUIDE.md +0 -0
  315. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/OBSERVABILITY_GUIDE.md +0 -0
  316. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/OPENSHELL_GATEWAY_HOST_SETUP.md +0 -0
  317. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/PYPI_PUBLISHING.md +0 -0
  318. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/QA_STREAMING_LATENCY.md +0 -0
  319. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/SCREENSHOTS_GUIDE.md +0 -0
  320. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/SECRETS_MANAGEMENT.md +0 -0
  321. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
  322. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/SSE_NOTIFICATIONS_GUIDE.md +0 -0
  323. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/STREAMING_EVENTS_FRONTEND.md +0 -0
  324. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
  325. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/WORKSPACE_INTEGRATION.md +0 -0
  326. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/api-reference.md +0 -0
  327. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/configuration.md +0 -0
  328. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/framework_audit_remarques.md +0 -0
  329. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/helper_agent.md +0 -0
  330. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/index.md +0 -0
  331. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/installation-guide.md +0 -0
  332. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/README.md +0 -0
  333. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_context_budget_test.py +0 -0
  334. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_example_multi_skills.py +0 -0
  335. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_exemple_test.py +0 -0
  336. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_training_with_apo.py +0 -0
  337. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_custom_tools_file_storage.py +0 -0
  338. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_file_storage.py +0 -0
  339. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_mcp.py +0 -0
  340. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_memory_graphiti.py +0 -0
  341. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_memory_hybrid.py +0 -0
  342. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_memory_simple.py +0 -0
  343. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_personalization.py +0 -0
  344. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/biagenttest.py +0 -0
  345. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/custom_framework_agent.py +0 -0
  346. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/dependencies/docker-compose.yaml +0 -0
  347. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/pyproject.toml +0 -0
  348. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/simple_agent.py +0 -0
  349. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/skills_demo_agent.py +0 -0
  350. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/test_work_patterns_live.py +0 -0
  351. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/workflow_engine_example.py +0 -0
  352. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/workspace_test_agent.py +0 -0
  353. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/setup.cfg +0 -0
  354. {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.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.9
3
+ Version: 0.8.9.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>
@@ -1243,6 +1243,7 @@ async def execute_chat_completion(
1243
1243
  stream: bool = False,
1244
1244
  max_tokens: int | None = None,
1245
1245
  temperature: float | None = None,
1246
+ response_format: dict[str, Any] | None = None,
1246
1247
  ) -> "ChatExecutionResult | AsyncIterator[ChatExecutionChunk]":
1247
1248
  """Execute a chat completion against a raw provider client and normalize it.
1248
1249
 
@@ -1262,6 +1263,15 @@ async def execute_chat_completion(
1262
1263
  stream: When ``True``, returns an async iterator of ``ChatExecutionChunk``.
1263
1264
  max_tokens: Optional max output tokens (overrides ``model_params``).
1264
1265
  temperature: Optional sampling temperature (overrides ``model_params``).
1266
+ response_format: Optional, provider-agnostic structured-output request in
1267
+ the OpenAI shape — ``{"type": "json_object"}``,
1268
+ ``{"type": "json_schema", "json_schema": {"name", "schema", ...}}`` or
1269
+ ``{"type": "text"}``. Each provider helper translates it to that
1270
+ provider's native mechanism (OpenAI: pass-through; Anthropic: a
1271
+ system-prompt JSON directive since the Messages API has no
1272
+ ``response_format``; Gemini: ``response_mime_type`` /
1273
+ ``response_schema`` in ``generation_config``). ``None`` or
1274
+ ``{"type": "text"}`` is a no-op.
1265
1275
 
1266
1276
  Returns:
1267
1277
  A ``ChatExecutionResult`` for non-streaming calls, or an
@@ -1280,6 +1290,7 @@ async def execute_chat_completion(
1280
1290
  stream=stream,
1281
1291
  max_tokens=max_tokens,
1282
1292
  temperature=temperature,
1293
+ response_format=response_format,
1283
1294
  )
1284
1295
  if ANTHROPIC_AVAILABLE and isinstance(client, AsyncAnthropic):
1285
1296
  return await _execute_anthropic(
@@ -1289,6 +1300,7 @@ async def execute_chat_completion(
1289
1300
  stream=stream,
1290
1301
  max_tokens=max_tokens,
1291
1302
  temperature=temperature,
1303
+ response_format=response_format,
1292
1304
  )
1293
1305
  if GEMINI_AVAILABLE and isinstance(client, genai.GenerativeModel):
1294
1306
  return await _execute_gemini(
@@ -1298,6 +1310,7 @@ async def execute_chat_completion(
1298
1310
  stream=stream,
1299
1311
  max_tokens=max_tokens,
1300
1312
  temperature=temperature,
1313
+ response_format=response_format,
1301
1314
  )
1302
1315
  # Fallback: dispatch by duck-typing on the SDK surface when isinstance fails
1303
1316
  # (e.g., a subclass or a test double). This keeps dispatch robust without
@@ -1310,6 +1323,7 @@ async def execute_chat_completion(
1310
1323
  stream=stream,
1311
1324
  max_tokens=max_tokens,
1312
1325
  temperature=temperature,
1326
+ response_format=response_format,
1313
1327
  )
1314
1328
  if hasattr(client, "messages") and hasattr(client.messages, "create"):
1315
1329
  return await _execute_anthropic(
@@ -1319,6 +1333,7 @@ async def execute_chat_completion(
1319
1333
  stream=stream,
1320
1334
  max_tokens=max_tokens,
1321
1335
  temperature=temperature,
1336
+ response_format=response_format,
1322
1337
  )
1323
1338
  if hasattr(client, "generate_content_async"):
1324
1339
  return await _execute_gemini(
@@ -1328,6 +1343,7 @@ async def execute_chat_completion(
1328
1343
  stream=stream,
1329
1344
  max_tokens=max_tokens,
1330
1345
  temperature=temperature,
1346
+ response_format=response_format,
1331
1347
  )
1332
1348
  raise TypeError(
1333
1349
  f"execute_chat_completion: unrecognized client type {type(client).__name__!r}; "
@@ -1335,6 +1351,93 @@ async def execute_chat_completion(
1335
1351
  )
1336
1352
 
1337
1353
 
1354
+ # ---------------------------------------------------------------------------
1355
+ # Provider-agnostic response_format translation (multi-provider support)
1356
+ # ---------------------------------------------------------------------------
1357
+
1358
+
1359
+ def _wants_json(response_format: dict[str, Any] | None) -> bool:
1360
+ """Return ``True`` when ``response_format`` requests structured JSON output."""
1361
+ if not response_format:
1362
+ return False
1363
+ return (response_format.get("type") or "").lower() in ("json_object", "json_schema")
1364
+
1365
+
1366
+ def _extract_json_schema(response_format: dict[str, Any] | None) -> dict[str, Any] | None:
1367
+ """Extract the JSON schema dict from an OpenAI-shaped ``response_format``.
1368
+
1369
+ Supports ``{"type": "json_schema", "json_schema": {"schema": {...}}}`` and the
1370
+ flatter ``{"type": "json_schema", "schema": {...}}``. Returns ``None`` when no
1371
+ schema is present (e.g. plain ``{"type": "json_object"}``).
1372
+ """
1373
+ if not response_format:
1374
+ return None
1375
+ js = response_format.get("json_schema")
1376
+ if isinstance(js, dict):
1377
+ schema = js.get("schema")
1378
+ if isinstance(schema, dict):
1379
+ return schema
1380
+ return js or None
1381
+ schema = response_format.get("schema")
1382
+ return schema if isinstance(schema, dict) else None
1383
+
1384
+
1385
+ def _openai_response_format(response_format: dict[str, Any] | None) -> dict[str, Any] | None:
1386
+ """Normalize a provider-agnostic ``response_format`` to OpenAI's exact envelope.
1387
+
1388
+ OpenAI's Structured Outputs require ``{"type": "json_schema", "json_schema":
1389
+ {"name": ..., "schema": ...}}``. We also accept the flatter
1390
+ ``{"type": "json_schema", "schema": {...}}`` (used uniformly by the Anthropic/
1391
+ Gemini helpers) and wrap it so the same ``response_format`` works across every
1392
+ provider. ``json_object`` / ``text`` and an already-wrapped envelope pass
1393
+ through unchanged.
1394
+ """
1395
+ if not response_format:
1396
+ return response_format
1397
+ if (response_format.get("type") or "").lower() != "json_schema":
1398
+ return response_format
1399
+ # Already in OpenAI's nested shape -> pass through.
1400
+ if isinstance(response_format.get("json_schema"), dict):
1401
+ return response_format
1402
+ # Flat ``schema`` form -> wrap into the OpenAI envelope (a ``name`` is required
1403
+ # by the API; default it when the caller did not supply one).
1404
+ schema = response_format.get("schema")
1405
+ if isinstance(schema, dict):
1406
+ return {
1407
+ "type": "json_schema",
1408
+ "json_schema": {
1409
+ "name": response_format.get("name", "response"),
1410
+ "schema": schema,
1411
+ },
1412
+ }
1413
+ return response_format
1414
+
1415
+
1416
+ def _ensure_openai_json_keyword(
1417
+ messages: list[dict[str, Any]], response_format: dict[str, Any] | None
1418
+ ) -> list[dict[str, Any]]:
1419
+ """Guarantee the ``"json"`` keyword is present when OpenAI ``json_object`` is used.
1420
+
1421
+ OpenAI's JSON mode (``response_format={"type": "json_object"}``) returns a 400
1422
+ (``'messages' must contain the word 'json'``) unless some message mentions
1423
+ JSON. Structured Outputs (``json_schema``) has no such rule. When the keyword
1424
+ is missing for a ``json_object`` request, append a trailing system instruction
1425
+ (without mutating the caller's list).
1426
+ """
1427
+ if not response_format:
1428
+ return messages
1429
+ if (response_format.get("type") or "").lower() != "json_object":
1430
+ return messages
1431
+ for msg in messages:
1432
+ content = msg.get("content")
1433
+ text = content if isinstance(content, str) else (str(content) if content is not None else "")
1434
+ if "json" in text.lower():
1435
+ return messages
1436
+ return list(messages) + [
1437
+ {"role": "system", "content": "Respond with a single valid JSON object."}
1438
+ ]
1439
+
1440
+
1338
1441
  async def _execute_openai(
1339
1442
  client: Any,
1340
1443
  model_params: dict[str, Any],
@@ -1343,25 +1446,36 @@ async def _execute_openai(
1343
1446
  stream: bool = False,
1344
1447
  max_tokens: int | None = None,
1345
1448
  temperature: float | None = None,
1449
+ response_format: dict[str, Any] | None = None,
1346
1450
  ) -> "ChatExecutionResult | AsyncIterator[ChatExecutionChunk]":
1347
1451
  """Execute via ``client.chat.completions.create``.
1348
1452
 
1349
1453
  OpenAI accepts the system role INSIDE the messages list, so the messages are
1350
1454
  passed through unchanged (Req 2.11). Token usage is read from
1351
1455
  ``usage.prompt_tokens``/``usage.completion_tokens`` with reasoning tokens (if
1352
- reported) mapped to ``thinking_tokens``.
1456
+ reported) mapped to ``thinking_tokens``. ``response_format`` is forwarded
1457
+ natively (OpenAI supports ``json_object`` / ``json_schema``).
1353
1458
  """
1354
1459
  model, effective_temperature, effective_max_tokens = _resolve_call_params(
1355
1460
  model_params, max_tokens, temperature
1356
1461
  )
1357
1462
 
1463
+ # Normalize response_format to OpenAI's exact envelope and ensure the "json"
1464
+ # keyword exists for json_object mode (otherwise the API rejects the call).
1465
+ normalized_rf = _openai_response_format(response_format)
1466
+ effective_messages = _ensure_openai_json_keyword(messages, normalized_rf)
1467
+
1358
1468
  create_kwargs: dict[str, Any] = {
1359
1469
  "model": model,
1360
- "messages": messages,
1470
+ "messages": effective_messages,
1361
1471
  "temperature": effective_temperature,
1362
1472
  }
1363
1473
  if effective_max_tokens is not None:
1364
1474
  create_kwargs["max_tokens"] = effective_max_tokens
1475
+ # OpenAI natively supports response_format; forward the normalized value (a
1476
+ # plain ``{"type": "text"}`` is harmless, so only skip the no-op ``None``).
1477
+ if normalized_rf is not None:
1478
+ create_kwargs["response_format"] = normalized_rf
1365
1479
 
1366
1480
  if stream:
1367
1481
  # Ask OpenAI to include the usage chunk at the end of the stream so token
@@ -1441,6 +1555,40 @@ def _normalize_openai_usage(
1441
1555
  return input_tokens, output_tokens, 0, True
1442
1556
 
1443
1557
 
1558
+ def _anthropic_output_config(response_format: dict[str, Any] | None) -> dict[str, Any] | None:
1559
+ """Translate a provider-agnostic ``response_format`` to Anthropic's native shape.
1560
+
1561
+ Anthropic's Messages API supports structured outputs via the ``output_config``
1562
+ parameter: ``{"format": {"type": "json_schema", "schema": {...}}}``. The schema
1563
+ is REQUIRED (there is no schema-less "json object" mode), so a plain
1564
+ ``json_object`` request maps to a permissive object schema. Returns the
1565
+ ``output_config`` dict when JSON is requested, else ``None``.
1566
+
1567
+ Structured outputs accept only a subset of JSON Schema (e.g. ``minimum`` /
1568
+ ``maxLength`` / ``pattern`` are unsupported and would 400). We run the caller's
1569
+ schema through the SDK's ``transform_schema`` — exactly what ``messages.parse``
1570
+ does internally — which strips unsupported keywords (folding them into field
1571
+ descriptions) and adds ``additionalProperties: false``. If the helper is
1572
+ unavailable or fails, the raw schema is sent as-is.
1573
+
1574
+ With ``output_config`` the model emits the validated JSON as normal text, so
1575
+ extraction and streaming use the standard text path (real incremental deltas).
1576
+ """
1577
+ if not _wants_json(response_format):
1578
+ return None
1579
+ schema = _extract_json_schema(response_format)
1580
+ if not isinstance(schema, dict):
1581
+ schema = {"type": "object"}
1582
+ else:
1583
+ try: # Align the schema with Anthropic's supported JSON Schema subset.
1584
+ from anthropic import transform_schema
1585
+
1586
+ schema = transform_schema(schema)
1587
+ except Exception as exc: # pragma: no cover - defensive: never block the call
1588
+ logger.debug("[execute_chat_completion] anthropic transform_schema skipped: %s", exc)
1589
+ return {"format": {"type": "json_schema", "schema": schema}}
1590
+
1591
+
1444
1592
  async def _execute_anthropic(
1445
1593
  client: Any,
1446
1594
  model_params: dict[str, Any],
@@ -1449,6 +1597,7 @@ async def _execute_anthropic(
1449
1597
  stream: bool = False,
1450
1598
  max_tokens: int | None = None,
1451
1599
  temperature: float | None = None,
1600
+ response_format: dict[str, Any] | None = None,
1452
1601
  ) -> "ChatExecutionResult | AsyncIterator[ChatExecutionChunk]":
1453
1602
  """Execute via ``client.messages.create``.
1454
1603
 
@@ -1456,6 +1605,12 @@ async def _execute_anthropic(
1456
1605
  top-level ``system`` parameter, so the system-role message is lifted out of
1457
1606
  the messages list into ``system`` (Req 2.11). Token usage is read from
1458
1607
  ``usage.input_tokens``/``usage.output_tokens``.
1608
+
1609
+ The Anthropic Messages API supports structured outputs natively via the
1610
+ ``output_config`` parameter (``{"format": {"type": "json_schema", "schema":
1611
+ {...}}}``), so a JSON ``response_format`` is mapped to it and the model returns
1612
+ validated JSON as normal text. Extraction and streaming therefore use the
1613
+ standard text path — real incremental deltas, unlike a tool-use workaround.
1459
1614
  """
1460
1615
  model, effective_temperature, effective_max_tokens = _resolve_call_params(
1461
1616
  model_params, max_tokens, temperature
@@ -1466,6 +1621,9 @@ async def _execute_anthropic(
1466
1621
 
1467
1622
  system_text, non_system_messages = _split_system_messages(messages)
1468
1623
 
1624
+ # Translate response_format → Anthropic's native structured-output config.
1625
+ output_config = _anthropic_output_config(response_format)
1626
+
1469
1627
  create_kwargs: dict[str, Any] = {
1470
1628
  "model": model,
1471
1629
  "messages": non_system_messages,
@@ -1474,6 +1632,8 @@ async def _execute_anthropic(
1474
1632
  }
1475
1633
  if system_text is not None:
1476
1634
  create_kwargs["system"] = system_text
1635
+ if output_config is not None:
1636
+ create_kwargs["output_config"] = output_config
1477
1637
 
1478
1638
  if stream:
1479
1639
 
@@ -1585,12 +1745,17 @@ async def _execute_gemini(
1585
1745
  stream: bool = False,
1586
1746
  max_tokens: int | None = None,
1587
1747
  temperature: float | None = None,
1748
+ response_format: dict[str, Any] | None = None,
1588
1749
  ) -> "ChatExecutionResult | AsyncIterator[ChatExecutionChunk]":
1589
1750
  """Execute via Gemini ``GenerativeModel.generate_content_async``.
1590
1751
 
1591
1752
  Gemini keeps the system role inside the prompt / system instruction (Req 2.11).
1592
1753
  Token usage is read from ``usage_metadata`` (``prompt_token_count`` /
1593
1754
  ``candidates_token_count`` / ``thoughts_token_count``).
1755
+
1756
+ Gemini has no ``response_format`` parameter either: a JSON request is mapped to
1757
+ ``generation_config.response_mime_type = "application/json"`` and, when a JSON
1758
+ schema is supplied, ``generation_config.response_schema``.
1594
1759
  """
1595
1760
  model, effective_temperature, effective_max_tokens = _resolve_call_params(
1596
1761
  model_params, max_tokens, temperature
@@ -1600,6 +1765,11 @@ async def _execute_gemini(
1600
1765
  generation_config: dict[str, Any] = {"temperature": effective_temperature}
1601
1766
  if effective_max_tokens is not None:
1602
1767
  generation_config["max_output_tokens"] = effective_max_tokens
1768
+ if _wants_json(response_format):
1769
+ generation_config["response_mime_type"] = "application/json"
1770
+ schema = _extract_json_schema(response_format)
1771
+ if schema is not None:
1772
+ generation_config["response_schema"] = schema
1603
1773
 
1604
1774
  if stream:
1605
1775
 
@@ -30,6 +30,18 @@ logger = logging.getLogger(__name__)
30
30
 
31
31
  TRUNCATION_MARKER = "\n\n[... contenu tronqué ...]\n\n"
32
32
 
33
+ # Bandeau injecté en tête d'un tool_result tronqué de force parce qu'il dépassait
34
+ # à lui seul le budget de contexte. Rend l'agent conscient que les données brutes
35
+ # sont incomplètes et l'oriente vers des appels plus ciblés (pagination/morceaux).
36
+ OVERSIZE_RESULT_NOTICE = (
37
+ "⚠️ RÉSULTAT TRONQUÉ AUTOMATIQUEMENT — l'appel outil a renvoyé un volume trop "
38
+ "grand pour la fenêtre de contexte. Les données brutes ci-dessous sont INCOMPLÈTES : "
39
+ "ne te fie pas aux valeurs partielles ni aux totaux/agrégats qui en dépendent. "
40
+ "Si tu as besoin des données complètes, refais des appels plus ciblés "
41
+ "(filtres précis, LIMIT/pagination, colonnes restreintes) pour traiter le résultat "
42
+ "par morceaux.\n---\n"
43
+ )
44
+
33
45
  # OpenAI enforces a 10 485 760 character limit per message content.
34
46
  # We use a conservative 8M limit to leave headroom for JSON serialization
35
47
  # overhead, tool_call metadata, and other wrapper text added by the SDK.
@@ -163,7 +175,12 @@ class ScratchpadCompressor:
163
175
 
164
176
  return "\n".join(parts)
165
177
 
166
- def _truncate_single_result(self, message: ChatMessage, target_tokens: int) -> ChatMessage:
178
+ def _truncate_single_result(
179
+ self,
180
+ message: ChatMessage,
181
+ target_tokens: int,
182
+ oversize_notice: bool = False,
183
+ ) -> ChatMessage:
167
184
  """Tronque le contenu d'un tool_result en gardant début + marqueur + fin.
168
185
 
169
186
  Aplatit d'abord tous les blocks en texte brut pour que la troncature
@@ -176,6 +193,10 @@ class ScratchpadCompressor:
176
193
  Args:
177
194
  message: Message tool_result à tronquer.
178
195
  target_tokens: Nombre cible de tokens pour le message tronqué.
196
+ oversize_notice: Si True et qu'une troncature a réellement lieu,
197
+ préfixe le contenu avec OVERSIZE_RESULT_NOTICE pour avertir
198
+ l'agent que les données brutes sont incomplètes. Les tokens du
199
+ bandeau sont réservés dans la cible pour ne pas la dépasser.
179
200
 
180
201
  Returns:
181
202
  Nouveau ChatMessage avec le contenu tronqué (blocks nettoyés).
@@ -195,7 +216,14 @@ class ScratchpadCompressor:
195
216
  k: v for k, v in (message.additional_kwargs or {}).items() if k not in ("tool_calls",)
196
217
  }
197
218
 
198
- if current_tokens <= target_tokens or target_tokens <= 0:
219
+ # Réserver les tokens du bandeau d'avertissement dans la cible pour que
220
+ # (bandeau + contenu tronqué) reste sous target_tokens.
221
+ notice = OVERSIZE_RESULT_NOTICE if oversize_notice else ""
222
+ notice_tokens = self._token_counter.count_tokens(notice).count if notice else 0
223
+ effective_target = max(0, target_tokens - notice_tokens)
224
+
225
+ if current_tokens <= effective_target or target_tokens <= 0:
226
+ # Aucune troncature nécessaire → pas de bandeau (rien n'est perdu).
199
227
  if content != (message.content or ""):
200
228
  return ChatMessage(
201
229
  role=message.role,
@@ -206,7 +234,7 @@ class ScratchpadCompressor:
206
234
 
207
235
  # Réserver des tokens pour le marqueur de troncature
208
236
  marker_tokens = self._token_counter.count_tokens(TRUNCATION_MARKER).count
209
- available_tokens = max(0, target_tokens - marker_tokens)
237
+ available_tokens = max(0, effective_target - marker_tokens)
210
238
 
211
239
  # Répartir entre début et fin (60% début, 40% fin)
212
240
  begin_tokens = int(available_tokens * 0.6)
@@ -219,17 +247,18 @@ class ScratchpadCompressor:
219
247
  end_chars = max(0, int(end_tokens * chars_per_token))
220
248
 
221
249
  if begin_chars + end_chars >= len(content):
222
- if content != (message.content or ""):
250
+ final_content = notice + content if notice else content
251
+ if final_content != (message.content or ""):
223
252
  return ChatMessage(
224
253
  role=message.role,
225
- content=content,
254
+ content=final_content,
226
255
  additional_kwargs=clean_kwargs,
227
256
  )
228
257
  return message
229
258
 
230
259
  begin_part = content[:begin_chars]
231
260
  end_part = content[-end_chars:] if end_chars > 0 else ""
232
- truncated_content = begin_part + TRUNCATION_MARKER + end_part
261
+ truncated_content = notice + begin_part + TRUNCATION_MARKER + end_part
233
262
 
234
263
  return ChatMessage(
235
264
  role=message.role,
@@ -324,8 +353,11 @@ class ScratchpadCompressor:
324
353
  if not old_entries:
325
354
  last_pair_tokens = self._count_tokens(last_pair)
326
355
  if last_pair_tokens > available_for_scratchpad:
327
- # Tronquer le tool_result de la dernière paire
328
- compressed_pair = self._truncate_last_pair(last_pair, available_for_scratchpad)
356
+ # Tronquer le tool_result de la dernière paire + avertir l'agent
357
+ # (le résultat unique dépasse à lui seul le budget).
358
+ compressed_pair = self._truncate_last_pair(
359
+ last_pair, available_for_scratchpad, oversize_notice=True
360
+ )
329
361
  tokens_after = self._count_tokens(compressed_pair)
330
362
  self._log_compression(
331
363
  entries_before,
@@ -343,6 +375,17 @@ class ScratchpadCompressor:
343
375
 
344
376
  # Cas 2 : il y a des anciennes entrées à compresser
345
377
  last_pair_tokens = self._count_tokens(last_pair)
378
+
379
+ # Garde-fou : si la dernière paire dépasse à elle seule le budget, la
380
+ # préserver verbatim est impossible (sinon résumer les anciennes entrées
381
+ # ne sert à rien — c'est le bug du blob unique géant). On la tronque
382
+ # aussi, avec bandeau d'avertissement pour l'agent.
383
+ if last_pair_tokens > available_for_scratchpad:
384
+ last_pair = self._truncate_last_pair(
385
+ last_pair, available_for_scratchpad, oversize_notice=True
386
+ )
387
+ last_pair_tokens = self._count_tokens(last_pair)
388
+
346
389
  target_old_tokens = max(0, available_for_scratchpad - last_pair_tokens)
347
390
 
348
391
  # Tenter le résumé LLM
@@ -443,6 +486,7 @@ class ScratchpadCompressor:
443
486
  self,
444
487
  last_pair: list[ChatMessage],
445
488
  available_tokens: int,
489
+ oversize_notice: bool = False,
446
490
  ) -> list[ChatMessage]:
447
491
  """Tronque le tool_result dans la dernière paire pour respecter le budget.
448
492
 
@@ -452,6 +496,8 @@ class ScratchpadCompressor:
452
496
  Args:
453
497
  last_pair: Dernière paire de messages (tool_call + tool_result).
454
498
  available_tokens: Tokens disponibles pour toute la paire.
499
+ oversize_notice: Propagé à _truncate_single_result pour préfixer le
500
+ bandeau d'avertissement quand le tool_result est tronqué.
455
501
 
456
502
  Returns:
457
503
  Paire avec le tool_result tronqué si nécessaire.
@@ -462,7 +508,9 @@ class ScratchpadCompressor:
462
508
  for msg in last_pair:
463
509
  if msg.role == MessageRole.TOOL:
464
510
  remaining = max(0, available_tokens - tokens_used)
465
- result.append(self._truncate_single_result(msg, remaining))
511
+ result.append(
512
+ self._truncate_single_result(msg, remaining, oversize_notice=oversize_notice)
513
+ )
466
514
  else:
467
515
  tokens_used += self._count_tokens([msg])
468
516
  result.append(msg)
@@ -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