agent-framework-lib 0.8.7.post3__tar.gz → 0.8.7.post5__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 (321) hide show
  1. {agent_framework_lib-0.8.7.post3/agent_framework_lib.egg-info → agent_framework_lib-0.8.7.post5}/PKG-INFO +1 -1
  2. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/agent_interface.py +16 -0
  3. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/base_agent.py +129 -49
  4. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/model_router.py +0 -1
  5. agent_framework_lib-0.8.7.post5/agent_framework/security/__init__.py +17 -0
  6. agent_framework_lib-0.8.7.post5/agent_framework/security/secret_redactor.py +291 -0
  7. agent_framework_lib-0.8.7.post5/agent_framework/security/shell_env.py +195 -0
  8. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/shell_tool.py +70 -3
  9. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/server.py +268 -55
  10. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5/agent_framework_lib.egg-info}/PKG-INFO +1 -1
  11. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/SOURCES.txt +3 -0
  12. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/pyproject.toml +1 -1
  13. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/ARCHITECTURE.md +0 -0
  14. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/LICENSE +0 -0
  15. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/MANIFEST.in +0 -0
  16. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/README.md +0 -0
  17. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/__init__.py +0 -0
  18. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/__init__.py +0 -0
  19. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/base.py +0 -0
  20. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/__init__.py +0 -0
  21. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
  22. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
  23. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
  24. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
  25. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
  26. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
  27. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
  28. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/models.py +0 -0
  29. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/providers/__init__.py +0 -0
  30. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
  31. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/a2a/providers/postgres_provider.py +0 -0
  32. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/capabilities/__init__.py +0 -0
  33. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/capabilities/resolver.py +0 -0
  34. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/__init__.py +0 -0
  35. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/audit.py +0 -0
  36. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/config.py +0 -0
  37. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/git_provider.py +0 -0
  38. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/herdr_client.py +0 -0
  39. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/models.py +0 -0
  40. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/orchestrator.py +0 -0
  41. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/code_delivery/tools.py +0 -0
  42. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/__init__.py +0 -0
  43. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/activity_formatter.py +0 -0
  44. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/agent_provider.py +0 -0
  45. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/context_budget.py +0 -0
  46. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/context_summarizer.py +0 -0
  47. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/elasticsearch_config_provider.py +0 -0
  48. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/execution_controller.py +0 -0
  49. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/implementation_validator.py +0 -0
  50. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/interruption_message.py +0 -0
  51. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/knowledge_state.py +0 -0
  52. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/loop_detector.py +0 -0
  53. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/model_clients.py +0 -0
  54. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/model_config.py +0 -0
  55. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/models.py +0 -0
  56. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/prompt_builder.py +0 -0
  57. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/provider_calibration.py +0 -0
  58. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/scratchpad_compressor.py +0 -0
  59. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/scratchpad_serializer.py +0 -0
  60. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/state_manager.py +0 -0
  61. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/step_display_config.py +0 -0
  62. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/core/streaming_parts_accumulator.py +0 -0
  63. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/__init__.py +0 -0
  64. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/budget_aware_agent.py +0 -0
  65. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/llamaindex_agent.py +0 -0
  66. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
  67. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/implementations/microsoft_agent.py +0 -0
  68. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/__init__.py +0 -0
  69. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/agent_mixin.py +0 -0
  70. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/base.py +0 -0
  71. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/config.py +0 -0
  72. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/hypothesis_engine.py +0 -0
  73. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/implicit_feedback.py +0 -0
  74. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/manager.py +0 -0
  75. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/personalization.py +0 -0
  76. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/providers/__init__.py +0 -0
  77. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/providers/graphiti_provider.py +0 -0
  78. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/providers/memori_provider.py +0 -0
  79. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/response_lessons.py +0 -0
  80. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/tools.py +0 -0
  81. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/memory/work_patterns.py +0 -0
  82. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/__init__.py +0 -0
  83. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/api_timing_tracker.py +0 -0
  84. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
  85. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
  86. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/error_handling.py +0 -0
  87. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/error_logging.py +0 -0
  88. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
  89. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/llm_metrics.py +0 -0
  90. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/llm_metrics_collector.py +0 -0
  91. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
  92. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/metrics_aggregator.py +0 -0
  93. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/metrics_config.py +0 -0
  94. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/observability_manager.py +0 -0
  95. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/otel_instrumentor.py +0 -0
  96. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/otel_logging_handler.py +0 -0
  97. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
  98. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/otel_setup.py +0 -0
  99. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/performance_monitor.py +0 -0
  100. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/progress_tracker.py +0 -0
  101. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/resource_manager.py +0 -0
  102. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
  103. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
  104. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/timing_tracker.py +0 -0
  105. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/token_counter.py +0 -0
  106. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/monitoring/tracing_context.py +0 -0
  107. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/notifications/__init__.py +0 -0
  108. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/notifications/hub.py +0 -0
  109. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/notifications/webhook_notifier.py +0 -0
  110. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/__init__.py +0 -0
  111. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/ai_content_management.py +0 -0
  112. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/markdown_converter.py +0 -0
  113. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/multimodal_integration.py +0 -0
  114. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/processing/rich_content_validation.py +0 -0
  115. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/py.typed +0 -0
  116. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/session/__init__.py +0 -0
  117. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/session/elasticsearch_session_storage.py +0 -0
  118. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/session/session_storage.py +0 -0
  119. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/__init__.py +0 -0
  120. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/agent_mixin.py +0 -0
  121. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/base.py +0 -0
  122. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/__init__.py +0 -0
  123. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/scripts/__init__.py +0 -0
  124. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/scripts/create_and_register.py +0 -0
  125. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/scripts/register_to_storage.py +0 -0
  126. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/chart/SKILL.md +0 -0
  127. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/chart/chart_to_image.py +0 -0
  128. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/code_delivery/SKILL.md +0 -0
  129. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/code_format/SKILL.md +0 -0
  130. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/code_format/format_python.py +0 -0
  131. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/csv/SKILL.md +0 -0
  132. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/csv/create_csv.py +0 -0
  133. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/csv/read_csv.py +0 -0
  134. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/csv/transform_csv.py +0 -0
  135. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/data_format/SKILL.md +0 -0
  136. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/data_format/json_to_yaml.py +0 -0
  137. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/data_format/yaml_to_json.py +0 -0
  138. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/drawio/SKILL.md +0 -0
  139. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/drawio/create_drawio.py +0 -0
  140. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/email_template/SKILL.md +0 -0
  141. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/excel/SKILL.md +0 -0
  142. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/excel/create_excel.py +0 -0
  143. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file/SKILL.md +0 -0
  144. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file/create_file.py +0 -0
  145. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file/list_files.py +0 -0
  146. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file/read_file.py +0 -0
  147. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file_access/SKILL.md +0 -0
  148. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file_access/download_to_local.py +0 -0
  149. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/file_access/get_file_path.py +0 -0
  150. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/form/SKILL.md +0 -0
  151. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/image_display/SKILL.md +0 -0
  152. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/image_gen/SKILL.md +0 -0
  153. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/image_gen/create_image.py +0 -0
  154. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/image_gen/generate_image.py +0 -0
  155. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/mermaid/SKILL.md +0 -0
  156. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/mermaid/mermaid_to_image.py +0 -0
  157. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/multimodal/SKILL.md +0 -0
  158. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +0 -0
  159. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/SKILL.md +0 -0
  160. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/create_powerpoint.py +0 -0
  161. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/templates/Big Data Infographics.pptx +0 -0
  162. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/templates/Executive Design Pitch Deck.pptx +0 -0
  163. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/templates/Management Consulting Toolkit.pptx +0 -0
  164. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/templates/__init__.py +0 -0
  165. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/powerpoint/templates/generate_templates.py +0 -0
  166. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/skill_creator/SKILL.md +0 -0
  167. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/skill_creator/skill_api.py +0 -0
  168. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/table/SKILL.md +0 -0
  169. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/table/table_to_image.py +0 -0
  170. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +0 -0
  171. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/unified_pdf/create_pdf.py +0 -0
  172. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/web_news_search/SKILL.md +0 -0
  173. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/web_news_search/web_news_search.py +0 -0
  174. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/word/SKILL.md +0 -0
  175. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/builtin/skills/word/create_word.py +0 -0
  176. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/custom_skill_manager.py +0 -0
  177. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/discovery_prompt.py +0 -0
  178. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/markdown_loader.py +0 -0
  179. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/skills/tools.py +0 -0
  180. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/storage/__init__.py +0 -0
  181. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/storage/file_storages.py +0 -0
  182. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/storage/file_system_management.py +0 -0
  183. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/storage/storage_optimizer.py +0 -0
  184. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/__init__.py +0 -0
  185. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/executor.py +0 -0
  186. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/message_injector.py +0 -0
  187. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/message_queue.py +0 -0
  188. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/retrigger.py +0 -0
  189. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/subagents/spawn_tool.py +0 -0
  190. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/__init__.py +0 -0
  191. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/activity_callback.py +0 -0
  192. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/adaptive_pdf_css.py +0 -0
  193. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/base.py +0 -0
  194. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/html_content_analyzer.py +0 -0
  195. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/multimodal_tools.py +0 -0
  196. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/pdf_image_scaler.py +0 -0
  197. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/sizing_config.py +0 -0
  198. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/web_fetch_tool.py +0 -0
  199. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/tools/web_search_tool.py +0 -0
  200. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/__init__.py +0 -0
  201. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/path_utils.py +0 -0
  202. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/post_install.py +0 -0
  203. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/session_title_generator.py +0 -0
  204. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/source_detector.py +0 -0
  205. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/utils/special_blocks.py +0 -0
  206. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/__init__.py +0 -0
  207. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/admin_auth.py +0 -0
  208. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/admin_models.py +0 -0
  209. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/admin_router.py +0 -0
  210. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/admin_services.py +0 -0
  211. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/api_timing_middleware.py +0 -0
  212. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
  213. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
  214. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
  215. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
  216. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
  217. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/Dockerfile +0 -0
  218. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/GETTING_STARTED.md +0 -0
  219. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/GITNEXUS_USER_GUIDE.md +0 -0
  220. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
  221. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/README.md +0 -0
  222. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
  223. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/WORKSPACE_INTEGRATION.md +0 -0
  224. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/api-reference.md +0 -0
  225. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/configuration.md +0 -0
  226. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/docker-compose.yml +0 -0
  227. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_example_multi_skills.py +0 -0
  228. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_file_storage.py +0 -0
  229. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
  230. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
  231. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_memory_graphiti.py +0 -0
  232. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_memory_hybrid.py +0 -0
  233. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/agent_with_memory_simple.py +0 -0
  234. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
  235. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/simple_agent.py +0 -0
  236. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
  237. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/docs/installation-guide.md +0 -0
  238. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/documentation_generator.py +0 -0
  239. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/gitnexus_client.py +0 -0
  240. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/helper_agent.py +0 -0
  241. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/helper_ui.html +0 -0
  242. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/modern_ui.html +0 -0
  243. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
  244. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
  245. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/otel_tracing_middleware.py +0 -0
  246. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/skills_router.py +0 -0
  247. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/web/test_app.html +0 -0
  248. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/__init__.py +0 -0
  249. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/artefacts.py +0 -0
  250. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/client.py +0 -0
  251. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/config.py +0 -0
  252. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/context.py +0 -0
  253. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/cursor.py +0 -0
  254. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/memory.py +0 -0
  255. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/models.py +0 -0
  256. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/poller.py +0 -0
  257. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/preferences.py +0 -0
  258. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/router.py +0 -0
  259. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/session.py +0 -0
  260. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework/workspace/subscription.py +0 -0
  261. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
  262. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/entry_points.txt +0 -0
  263. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/requires.txt +0 -0
  264. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/agent_framework_lib.egg-info/top_level.txt +0 -0
  265. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/A2A_GUIDE.md +0 -0
  266. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
  267. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/ARCHITECTURE_DIAGRAM.md +0 -0
  268. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
  269. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/CANCEL_AND_INTERRUPT_FRONTEND.md +0 -0
  270. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
  271. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/CREATING_AGENTS.md +0 -0
  272. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
  273. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/DEEPEVAL_TEST_REPORT.md +0 -0
  274. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/DOCKER_SETUP.md +0 -0
  275. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +0 -0
  276. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
  277. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/FILE_STORAGE_GUIDE.md +0 -0
  278. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/GETTING_STARTED.md +0 -0
  279. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/GITNEXUS_USER_GUIDE.md +0 -0
  280. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/HISTORY_MESSAGE_FORMAT.md +0 -0
  281. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
  282. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/MEMORY_INSTALLATION.md +0 -0
  283. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
  284. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/MULTIMODAL_TOOLS_GUIDE.md +0 -0
  285. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/OBSERVABILITY_GUIDE.md +0 -0
  286. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/PYPI_PUBLISHING.md +0 -0
  287. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/QA_STREAMING_LATENCY.md +0 -0
  288. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/SCREENSHOTS_GUIDE.md +0 -0
  289. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
  290. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/SSE_NOTIFICATIONS_GUIDE.md +0 -0
  291. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/STREAMING_EVENTS_FRONTEND.md +0 -0
  292. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
  293. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/WORKSPACE_INTEGRATION.md +0 -0
  294. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/api-reference.md +0 -0
  295. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/configuration.md +0 -0
  296. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/framework_audit_remarques.md +0 -0
  297. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/helper_agent.md +0 -0
  298. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/index.md +0 -0
  299. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/docs/installation-guide.md +0 -0
  300. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/README.md +0 -0
  301. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_context_budget_test.py +0 -0
  302. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_example_multi_skills.py +0 -0
  303. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_exemple_test.py +0 -0
  304. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_training_with_apo.py +0 -0
  305. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_custom_tools_file_storage.py +0 -0
  306. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_file_storage.py +0 -0
  307. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_mcp.py +0 -0
  308. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_memory_graphiti.py +0 -0
  309. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_memory_hybrid.py +0 -0
  310. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_memory_simple.py +0 -0
  311. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/agent_with_personalization.py +0 -0
  312. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/biagenttest.py +0 -0
  313. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/custom_framework_agent.py +0 -0
  314. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/dependencies/docker-compose.yaml +0 -0
  315. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/pyproject.toml +0 -0
  316. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/simple_agent.py +0 -0
  317. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/skills_demo_agent.py +0 -0
  318. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/test_work_patterns_live.py +0 -0
  319. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/examples/workspace_test_agent.py +0 -0
  320. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/setup.cfg +0 -0
  321. {agent_framework_lib-0.8.7.post3 → agent_framework_lib-0.8.7.post5}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-framework-lib
3
- Version: 0.8.7.post3
3
+ Version: 0.8.7.post5
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>
@@ -892,6 +892,22 @@ class AgentInterface(abc.ABC):
892
892
  "memory_adapter": None,
893
893
  }
894
894
 
895
+ def get_secret_redactor(self) -> Any:
896
+ """Return a redactor used to mask secret values in outgoing data.
897
+
898
+ The redactor exposes ``redact_text``, ``redact_parts``, ``feed`` and
899
+ ``flush`` and is used by the server as a last-line defense to strip
900
+ secret values (container env keys, workspace secrets) from responses,
901
+ persisted data, and logs.
902
+
903
+ The default implementation returns an inert redactor (nothing to mask).
904
+ ``BaseAgent`` overrides this to build a redactor from the sensitive
905
+ environment values and the current workspace secrets.
906
+ """
907
+ from ..security.secret_redactor import SecretRedactor
908
+
909
+ return SecretRedactor([])
910
+
895
911
  def get_custom_tool_display_info(self) -> dict[str, Any]:
896
912
  """
897
913
  Returns custom display info for agent-specific tools (e.g., MCP tools).
@@ -15,6 +15,7 @@ Subclasses must implement all abstract methods to provide framework-specific fun
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
+ import asyncio
18
19
  import json
19
20
  import logging
20
21
  import os
@@ -28,6 +29,7 @@ if TYPE_CHECKING:
28
29
  from collections.abc import AsyncGenerator
29
30
 
30
31
  from ..capabilities.resolver import CapabilitySet
32
+ from ..security.secret_redactor import SecretRedactor
31
33
  from ..subagents.executor import SubagentExecutor
32
34
  from ..subagents.message_queue import SessionMessageQueue
33
35
  from ..subagents.spawn_tool import SubagentSpawnTool
@@ -376,6 +378,41 @@ class BaseAgent(SkillsMixin, MemoryMixin, AgentInterface):
376
378
  except Exception as e:
377
379
  logger.warning(f"Could not propagate workspace secrets to live ShellTool: {e}")
378
380
 
381
+ def _loaded_skill_env_keys(self) -> set[str]:
382
+ """Return env-var names declared by currently loaded skills.
383
+
384
+ Reads ``requires_env`` from the metadata of every loaded skill so that
385
+ ``ShellTool`` can expose those variables to the shell while everything
386
+ else is scrubbed. Returns an empty set if skills are unavailable.
387
+ """
388
+ if not SKILLS_AVAILABLE or not getattr(self, "_enable_skills", False):
389
+ return set()
390
+ keys: set[str] = set()
391
+ try:
392
+ registry = self._skill_registry
393
+ for name in registry.list_loaded():
394
+ skill = registry.get(name)
395
+ if skill is not None:
396
+ keys.update(skill.metadata.requires_env)
397
+ except Exception as e: # noqa: BLE001 — never break shell wiring
398
+ logger.warning(f"Could not collect loaded skill env keys: {e}")
399
+ return keys
400
+
401
+ def get_secret_redactor(self) -> SecretRedactor:
402
+ """Build a redactor masking sensitive env values + workspace secrets.
403
+
404
+ The returned redactor masks any occurrence of a sensitive container
405
+ environment value (LLM keys, infra creds, ``API_KEYS``) or workspace
406
+ secret in outgoing text, parts, persisted data, and logs. Rebuilt on
407
+ demand so it always reflects the current environment and workspace.
408
+ """
409
+ from ..security.secret_redactor import SecretRedactor
410
+ from ..security.shell_env import sensitive_env_values
411
+
412
+ env_values = sensitive_env_values(os.environ)
413
+ workspace_values = list(self._workspace_secrets.values())
414
+ return SecretRedactor(env_values + workspace_values)
415
+
379
416
  def set_subagent_executor(self, executor: SubagentExecutor | None) -> None:
380
417
  """Inject or remove the shared SubagentExecutor.
381
418
 
@@ -640,7 +677,10 @@ class BaseAgent(SkillsMixin, MemoryMixin, AgentInterface):
640
677
  try:
641
678
  from ..tools.shell_tool import ShellTool
642
679
 
643
- shell_tool = ShellTool(default_timeout=120)
680
+ shell_tool = ShellTool(
681
+ default_timeout=120,
682
+ skill_env_provider=self._loaded_skill_env_keys,
683
+ )
644
684
  # Inject session context so that AGENT_USER_ID / AGENT_SESSION_ID are
645
685
  # propagated to subprocesses (register_to_storage / create_and_register).
646
686
  # Without this, generated files are uploaded without session_id and
@@ -849,13 +889,15 @@ class BaseAgent(SkillsMixin, MemoryMixin, AgentInterface):
849
889
  user_id = session_configuration.get("user_id", "default_user")
850
890
  provider = self._memory_manager.primary
851
891
 
852
- context = await provider.recall(
853
- user_id=user_id,
854
- agent_id=self.agent_id,
855
- query="préférences style réponse utilisateur",
856
- limit=20,
892
+ # Les trois lectures mémoire (préférences, work patterns, response
893
+ # lessons) sont indépendantes et toutes I/O Graphiti : on les lance
894
+ # en parallèle pour réduire la latence du préprocessing. Le prompt
895
+ # résultant est identique au chemin séquentiel précédent.
896
+ facts, work_profile_block, lessons_block = await asyncio.gather(
897
+ self._recall_user_preferences(provider, user_id),
898
+ self._build_work_profile_block(provider, user_id),
899
+ self._build_lessons_block(provider, user_id),
857
900
  )
858
- facts = context.facts if context else []
859
901
 
860
902
  if not facts:
861
903
  # Replace placeholder with empty string if present
@@ -867,48 +909,6 @@ class BaseAgent(SkillsMixin, MemoryMixin, AgentInterface):
867
909
  return
868
910
 
869
911
  fact_lines = "\n".join(f"- {f.content}" for f in facts if f.content)
870
- preference_block = f"[User Preferences]\n{fact_lines}"
871
-
872
- # --- Work Pattern directives ---
873
- work_profile_block = ""
874
- try:
875
- from ..memory.work_patterns import WorkPatternAnalyzer
876
-
877
- wp_analyzer = WorkPatternAnalyzer(provider)
878
- work_profile = await wp_analyzer.build_profile(
879
- user_id=user_id,
880
- agent_id=self.agent_id,
881
- min_entries=3,
882
- )
883
- if work_profile.total_interactions >= 3:
884
- directives = wp_analyzer.build_agent_directives(work_profile)
885
- if directives:
886
- work_profile_block = "\n\n[Directives de travail]\n" f"{directives}"
887
- logger.info(
888
- "Work pattern directives injected for user=%s: %d interactions",
889
- user_id,
890
- work_profile.total_interactions,
891
- )
892
- except Exception as e:
893
- logger.debug("Work pattern injection skipped: %s", e)
894
-
895
- # --- Response Lessons (the key part) ---
896
- lessons_block = ""
897
- try:
898
- from ..memory.response_lessons import format_lessons_for_prompt, recall_lessons
899
-
900
- lessons = await recall_lessons(provider, user_id, self.agent_id, limit=10)
901
- if lessons:
902
- formatted = format_lessons_for_prompt(lessons)
903
- if formatted:
904
- lessons_block = f"\n\n[Leçons apprises — compléments à inclure automatiquement]\n{formatted}"
905
- logger.info(
906
- "Response lessons injected for user=%s: %d lessons",
907
- user_id,
908
- len(lessons),
909
- )
910
- except Exception as e:
911
- logger.debug("Response lessons injection skipped: %s", e)
912
912
 
913
913
  preference_block = (
914
914
  f"[User Preferences]\n{fact_lines}{work_profile_block}{lessons_block}"
@@ -927,6 +927,86 @@ class BaseAgent(SkillsMixin, MemoryMixin, AgentInterface):
927
927
  except Exception as e:
928
928
  logger.warning("Personalization injection skipped: %s", e)
929
929
 
930
+ async def _recall_user_preferences(self, provider: Any, user_id: str) -> list[Any]:
931
+ """Recall les facts de préférences utilisateur depuis la mémoire.
932
+
933
+ Args:
934
+ provider: Provider mémoire primaire.
935
+ user_id: Identifiant utilisateur.
936
+
937
+ Returns:
938
+ Liste de facts de préférences (vide si aucun).
939
+ """
940
+ context = await provider.recall(
941
+ user_id=user_id,
942
+ agent_id=self.agent_id,
943
+ query="préférences style réponse utilisateur",
944
+ limit=20,
945
+ )
946
+ return context.facts if context else []
947
+
948
+ async def _build_work_profile_block(self, provider: Any, user_id: str) -> str:
949
+ """Construit le bloc de directives de travail depuis les work patterns.
950
+
951
+ Args:
952
+ provider: Provider mémoire primaire.
953
+ user_id: Identifiant utilisateur.
954
+
955
+ Returns:
956
+ Bloc texte à injecter (vide si pas assez de données ou en cas d'échec).
957
+ """
958
+ try:
959
+ from ..memory.work_patterns import WorkPatternAnalyzer
960
+
961
+ wp_analyzer = WorkPatternAnalyzer(provider)
962
+ work_profile = await wp_analyzer.build_profile(
963
+ user_id=user_id,
964
+ agent_id=self.agent_id,
965
+ min_entries=3,
966
+ )
967
+ if work_profile.total_interactions >= 3:
968
+ directives = wp_analyzer.build_agent_directives(work_profile)
969
+ if directives:
970
+ logger.info(
971
+ "Work pattern directives injected for user=%s: %d interactions",
972
+ user_id,
973
+ work_profile.total_interactions,
974
+ )
975
+ return "\n\n[Directives de travail]\n" f"{directives}"
976
+ except Exception as e:
977
+ logger.debug("Work pattern injection skipped: %s", e)
978
+ return ""
979
+
980
+ async def _build_lessons_block(self, provider: Any, user_id: str) -> str:
981
+ """Construit le bloc de leçons apprises depuis les response lessons.
982
+
983
+ Args:
984
+ provider: Provider mémoire primaire.
985
+ user_id: Identifiant utilisateur.
986
+
987
+ Returns:
988
+ Bloc texte à injecter (vide si aucune leçon ou en cas d'échec).
989
+ """
990
+ try:
991
+ from ..memory.response_lessons import format_lessons_for_prompt, recall_lessons
992
+
993
+ lessons = await recall_lessons(provider, user_id, self.agent_id, limit=10)
994
+ if lessons:
995
+ formatted = format_lessons_for_prompt(lessons)
996
+ if formatted:
997
+ logger.info(
998
+ "Response lessons injected for user=%s: %d lessons",
999
+ user_id,
1000
+ len(lessons),
1001
+ )
1002
+ return (
1003
+ "\n\n[Leçons apprises — compléments à inclure automatiquement]\n"
1004
+ f"{formatted}"
1005
+ )
1006
+ except Exception as e:
1007
+ logger.debug("Response lessons injection skipped: %s", e)
1008
+ return ""
1009
+
930
1010
  def _has_shell_tool(self) -> bool:
931
1011
  """Check whether a shell tool is available."""
932
1012
  return self._live_shell_tool is not None
@@ -140,7 +140,6 @@ class ModelRouter:
140
140
  DEFAULT_STANDARD_MODELS: list[str] = [
141
141
  "claude-sonnet-4-6",
142
142
  "gpt-5.4-mini",
143
- "claude-haiku-4-5-20251001",
144
143
  "gemini-2.5-flash",
145
144
  "gemini-3-flash-preview",
146
145
  ]
@@ -0,0 +1,17 @@
1
+ """Security utilities for the agent framework.
2
+
3
+ Provides secret redaction (masking secret values in any output reaching the
4
+ client, persistence, or logs) and the shell environment allowlist used to
5
+ prevent the shell sandbox from reading container secrets it does not need.
6
+ """
7
+
8
+ from .secret_redactor import SecretRedactor, build_redaction_value_set
9
+ from .shell_env import build_shell_env, sensitive_env_values
10
+
11
+
12
+ __all__ = [
13
+ "SecretRedactor",
14
+ "build_redaction_value_set",
15
+ "build_shell_env",
16
+ "sensitive_env_values",
17
+ ]
@@ -0,0 +1,291 @@
1
+ """Masquage des valeurs de secrets dans les chaînes et les output parts.
2
+
3
+ Le ``SecretRedactor`` remplace toute occurrence d'une valeur secrète connue par
4
+ un masque fixe (``********``), avant que la donnée n'atteigne le client, le
5
+ stockage de session/Elasticsearch ou les logs.
6
+
7
+ Deux sources de valeurs à masquer :
8
+ - les variables d'environnement sensibles du conteneur (clés LLM, creds infra) ;
9
+ - les secrets workspace injectés dans le shell.
10
+
11
+ Le masquage est littéral (pas de regex sur la valeur), insensible à rien
12
+ d'autre que la casse exacte, et trie les valeurs par longueur décroissante pour
13
+ éviter qu'un secret court inclus dans un secret long ne soit masqué de façon
14
+ incohérente.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import os
20
+ from typing import TYPE_CHECKING, Any
21
+
22
+
23
+ if TYPE_CHECKING:
24
+ from collections.abc import Iterable, Sequence
25
+
26
+
27
+ MASK = "********"
28
+
29
+ DEFAULT_MIN_LEN = 4
30
+ """Longueur minimale d'une valeur pour être masquée (sous ce seuil = bruit)."""
31
+
32
+
33
+ def _redaction_min_len() -> int:
34
+ """Lit le seuil de longueur minimale depuis l'environnement."""
35
+ raw = os.environ.get("SECRET_REDACTION_MIN_LEN", "")
36
+ try:
37
+ value = int(raw)
38
+ except (TypeError, ValueError):
39
+ return DEFAULT_MIN_LEN
40
+ return value if value > 0 else DEFAULT_MIN_LEN
41
+
42
+
43
+ def build_redaction_value_set(
44
+ *value_groups: Iterable[str] | None,
45
+ min_len: int | None = None,
46
+ ) -> list[str]:
47
+ """Construit la liste triée des valeurs à masquer.
48
+
49
+ Fusionne plusieurs groupes de valeurs, retire les doublons, ignore les
50
+ valeurs vides ou trop courtes, puis trie par longueur décroissante.
51
+
52
+ Args:
53
+ *value_groups: Itérables de valeurs candidates (env sensibles,
54
+ secrets workspace, etc.). Les ``None`` sont tolérés.
55
+ min_len: Longueur minimale d'une valeur pour être retenue. Si ``None``,
56
+ lit ``SECRET_REDACTION_MIN_LEN`` (défaut 4).
57
+
58
+ Returns:
59
+ Liste de valeurs uniques triées par longueur décroissante.
60
+ """
61
+ threshold = min_len if min_len is not None else _redaction_min_len()
62
+ seen: set[str] = set()
63
+ for group in value_groups:
64
+ if not group:
65
+ continue
66
+ for raw in group:
67
+ if raw is None:
68
+ continue
69
+ value = str(raw)
70
+ if len(value) < threshold:
71
+ continue
72
+ seen.add(value)
73
+ return sorted(seen, key=len, reverse=True)
74
+
75
+
76
+ class SecretRedactor:
77
+ """Masque des valeurs secrètes dans des chaînes et des output parts.
78
+
79
+ Stateless vis-à-vis de la session, sauf pour le buffer de ``feed()`` utilisé
80
+ en streaming. Construire un nouveau redacteur par session (ou réutiliser tant
81
+ que l'ensemble des secrets ne change pas).
82
+ """
83
+
84
+ def __init__(self, secret_values: Iterable[str] | None = None) -> None:
85
+ """Initialise le redacteur.
86
+
87
+ Args:
88
+ secret_values: Valeurs à masquer. Filtrées/triées via
89
+ ``build_redaction_value_set``.
90
+ """
91
+ self._values: list[str] = build_redaction_value_set(secret_values)
92
+ self._max_len: int = self._values[0].__len__() if self._values else 0
93
+ self._buffer: str = ""
94
+
95
+ @property
96
+ def active(self) -> bool:
97
+ """``True`` si au moins une valeur est à masquer."""
98
+ return bool(self._values)
99
+
100
+ @property
101
+ def secret_values(self) -> list[str]:
102
+ """Copie de la liste des valeurs masquées (triée par longueur décr.)."""
103
+ return list(self._values)
104
+
105
+ def redact_text(self, text: str | None) -> str | None:
106
+ """Masque toutes les occurrences des valeurs secrètes dans ``text``.
107
+
108
+ Args:
109
+ text: Texte à nettoyer. ``None`` est renvoyé tel quel.
110
+
111
+ Returns:
112
+ Le texte avec chaque valeur secrète remplacée par ``********``.
113
+ """
114
+ if text is None or not self._values:
115
+ return text
116
+ if not text:
117
+ return text
118
+ result = text
119
+ for value in self._values:
120
+ if value in result:
121
+ result = result.replace(value, MASK)
122
+ return result
123
+
124
+ def redact_obj(self, obj: Any) -> Any:
125
+ """Masque récursivement les valeurs secrètes dans une structure JSON.
126
+
127
+ Gère str, dict, list, tuple. Les autres types sont renvoyés tels quels.
128
+ """
129
+ if not self._values:
130
+ return obj
131
+ if isinstance(obj, str):
132
+ return self.redact_text(obj)
133
+ if isinstance(obj, dict):
134
+ return {k: self.redact_obj(v) for k, v in obj.items()}
135
+ if isinstance(obj, list):
136
+ return [self.redact_obj(v) for v in obj]
137
+ if isinstance(obj, tuple):
138
+ return tuple(self.redact_obj(v) for v in obj)
139
+ return obj
140
+
141
+ def redact_parts(self, parts: Sequence[Any] | None) -> list[Any]:
142
+ """Masque les champs textuels de chaque output part.
143
+
144
+ Couvre ``TextOutputPart.text``, ``TextOutputStreamPart.text``,
145
+ ``ActivityOutputPart.content``/``results``/``tools``, et
146
+ ``TechnicalDetails.raw_result``/``error_message``. Retourne de nouvelles
147
+ instances (immutabilité) — les parts non concernées sont conservées.
148
+
149
+ Args:
150
+ parts: Liste d'output parts (modèles Pydantic) ou de dicts.
151
+
152
+ Returns:
153
+ Nouvelle liste avec les valeurs secrètes masquées.
154
+ """
155
+ if not parts:
156
+ return list(parts) if parts is not None else []
157
+ if not self._values:
158
+ return list(parts)
159
+ return [self._redact_part(part) for part in parts]
160
+
161
+ def _redact_part(self, part: Any) -> Any:
162
+ """Masque une seule part (dict ou modèle Pydantic)."""
163
+ if isinstance(part, dict):
164
+ return self.redact_obj(part)
165
+
166
+ part_type = getattr(part, "type", None)
167
+
168
+ if part_type in ("text_output", "text_output_stream"):
169
+ text = getattr(part, "text", None)
170
+ redacted = self.redact_text(text)
171
+ if redacted != text:
172
+ return part.model_copy(update={"text": redacted})
173
+ return part
174
+
175
+ if part_type == "activity":
176
+ return self._redact_activity_part(part)
177
+
178
+ return part
179
+
180
+ def _redact_activity_part(self, part: Any) -> Any:
181
+ """Masque le contenu textuel et les détails techniques d'une activité."""
182
+ updates: dict[str, Any] = {}
183
+
184
+ content = getattr(part, "content", None)
185
+ redacted_content = self.redact_text(content)
186
+ if redacted_content != content:
187
+ updates["content"] = redacted_content
188
+
189
+ for field in ("results", "tools"):
190
+ value = getattr(part, field, None)
191
+ if value:
192
+ redacted = self.redact_obj(value)
193
+ if redacted != value:
194
+ updates[field] = redacted
195
+
196
+ td = getattr(part, "technical_details", None)
197
+ if td is not None:
198
+ td_updates: dict[str, Any] = {}
199
+ raw_result = getattr(td, "raw_result", None)
200
+ redacted_raw = self.redact_text(raw_result)
201
+ if redacted_raw != raw_result:
202
+ td_updates["raw_result"] = redacted_raw
203
+ err = getattr(td, "error_message", None)
204
+ redacted_err = self.redact_text(err)
205
+ if redacted_err != err:
206
+ td_updates["error_message"] = redacted_err
207
+ args = getattr(td, "arguments", None)
208
+ if args:
209
+ redacted_args = self.redact_obj(args)
210
+ if redacted_args != args:
211
+ td_updates["arguments"] = redacted_args
212
+ if td_updates:
213
+ updates["technical_details"] = td.model_copy(update=td_updates)
214
+
215
+ if updates:
216
+ return part.model_copy(update=updates)
217
+ return part
218
+
219
+ def feed(self, delta: str) -> str:
220
+ """Masquage incrémental pour le streaming.
221
+
222
+ Conserve un buffer brut et n'émet que le préfixe qui ne peut plus être
223
+ affecté par les caractères futurs. On retient au minimum
224
+ ``max_len - 1`` caractères (longueur du plus long secret moins un), puis
225
+ on abaisse la coupure pour ne jamais scinder une occurrence présente
226
+ dans le buffer. Le préfixe émis est masqué ; le reste est conservé.
227
+
228
+ Args:
229
+ delta: Nouveau fragment de texte.
230
+
231
+ Returns:
232
+ Portion masquée et sûre à émettre immédiatement (peut être vide).
233
+ """
234
+ if not self._values:
235
+ return delta
236
+ self._buffer += delta
237
+ buf = self._buffer
238
+ margin = self._max_len - 1
239
+ cut = len(buf) - margin
240
+ if cut <= 0:
241
+ return ""
242
+
243
+ cut = self._safe_cut(buf, cut)
244
+ if cut <= 0:
245
+ return ""
246
+
247
+ emitted = self.redact_text(buf[:cut]) or ""
248
+ self._buffer = buf[cut:]
249
+ return emitted
250
+
251
+ def _safe_cut(self, buf: str, cut: int) -> int:
252
+ """Abaisse ``cut`` jusqu'à ce qu'aucune occurrence ne le chevauche.
253
+
254
+ Une occurrence ``buf[start:start+len(v)]`` chevauche ``cut`` si
255
+ ``start < cut < start + len(v)``. On ramène ``cut`` au début de la
256
+ première occurrence chevauchante, en itérant jusqu'au point fixe car
257
+ abaisser ``cut`` peut révéler des occurrences plus précoces.
258
+ """
259
+ changed = True
260
+ while changed and cut > 0:
261
+ changed = False
262
+ for value in self._values:
263
+ lv = len(value)
264
+ start = 0
265
+ while True:
266
+ idx = buf.find(value, start)
267
+ if idx == -1 or idx >= cut:
268
+ break
269
+ if idx + lv > cut:
270
+ cut = idx
271
+ changed = True
272
+ break
273
+ start = idx + 1
274
+ if cut <= 0:
275
+ return 0
276
+ return cut
277
+
278
+ def flush(self) -> str:
279
+ """Vide le buffer de streaming en masquant le résidu.
280
+
281
+ Returns:
282
+ Le reste du buffer, masqué.
283
+ """
284
+ if not self._buffer:
285
+ return ""
286
+ remaining = self.redact_text(self._buffer) or ""
287
+ self._buffer = ""
288
+ return remaining
289
+
290
+
291
+ __all__ = ["SecretRedactor", "build_redaction_value_set", "MASK"]