geny-executor 2.71.0__tar.gz → 2.72.1__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 (794) hide show
  1. {geny_executor-2.71.0 → geny_executor-2.72.1}/PKG-INFO +1 -1
  2. {geny_executor-2.71.0 → geny_executor-2.72.1}/pyproject.toml +1 -1
  3. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/pipeline.py +6 -0
  4. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/base.py +140 -23
  5. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/openai_compatible.py +9 -19
  6. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/profiles.py +10 -0
  7. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/responses_wire.py +20 -3
  8. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/router.py +19 -1
  9. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/vllm.py +9 -24
  10. geny_executor-2.72.1/tests/unit/test_an_endpoint_declares_what_it_serves.py +253 -0
  11. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_cooldown_policy.py +60 -0
  12. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_images_a_model_cannot_see.py +94 -3
  13. {geny_executor-2.71.0 → geny_executor-2.72.1}/.gitignore +0 -0
  14. {geny_executor-2.71.0 → geny_executor-2.72.1}/LICENSE +0 -0
  15. {geny_executor-2.71.0 → geny_executor-2.72.1}/NOTICE +0 -0
  16. {geny_executor-2.71.0 → geny_executor-2.72.1}/README.md +0 -0
  17. {geny_executor-2.71.0 → geny_executor-2.72.1}/README_ko.md +0 -0
  18. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/__init__.py +0 -0
  19. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/audio/__init__.py +0 -0
  20. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/audio/stt/__init__.py +0 -0
  21. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/audio/stt/openai_compatible.py +0 -0
  22. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/audio/stt/provider.py +0 -0
  23. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/audio/stt/registry.py +0 -0
  24. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/channels/__init__.py +0 -0
  25. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/channels/built_in.py +0 -0
  26. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/channels/factory.py +0 -0
  27. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/channels/send_message_channel.py +0 -0
  28. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/channels/user_file_channel.py +0 -0
  29. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/__init__.py +0 -0
  30. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/artifact.py +0 -0
  31. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/builder.py +0 -0
  32. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/compaction.py +0 -0
  33. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/config.py +0 -0
  34. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/context_prune.py +0 -0
  35. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/diff.py +0 -0
  36. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/environment.py +0 -0
  37. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/environment_control.py +0 -0
  38. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/errors.py +0 -0
  39. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/introspection.py +0 -0
  40. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/manifest_factory.py +0 -0
  41. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/message_repair.py +0 -0
  42. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/mutation.py +0 -0
  43. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/presets.py +0 -0
  44. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/result.py +0 -0
  45. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/schema.py +0 -0
  46. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/shared_keys.py +0 -0
  47. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/slot.py +0 -0
  48. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/snapshot.py +0 -0
  49. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/stage.py +0 -0
  50. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/state.py +0 -0
  51. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/core/token_estimate.py +0 -0
  52. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/cron/__init__.py +0 -0
  53. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/cron/runner.py +0 -0
  54. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/cron/store_abc.py +0 -0
  55. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/cron/store_impl/__init__.py +0 -0
  56. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/cron/store_impl/file_backed.py +0 -0
  57. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/cron/store_impl/in_memory.py +0 -0
  58. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/cron/types.py +0 -0
  59. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/events/__init__.py +0 -0
  60. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/events/bus.py +0 -0
  61. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/events/catalog.py +0 -0
  62. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/events/types.py +0 -0
  63. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/gateway/__init__.py +0 -0
  64. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/gateway/adapter.py +0 -0
  65. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/gateway/discord.py +0 -0
  66. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/gateway/factory.py +0 -0
  67. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/gateway/runner.py +0 -0
  68. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/gateway/slack.py +0 -0
  69. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/gateway/telegram.py +0 -0
  70. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/gateway/types.py +0 -0
  71. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/gateway/ws_base.py +0 -0
  72. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/history/__init__.py +0 -0
  73. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/history/ab_test.py +0 -0
  74. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/history/cost.py +0 -0
  75. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/history/models.py +0 -0
  76. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/history/monitor.py +0 -0
  77. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/history/replay.py +0 -0
  78. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/history/service.py +0 -0
  79. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/hooks/__init__.py +0 -0
  80. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/hooks/config.py +0 -0
  81. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/hooks/events.py +0 -0
  82. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/hooks/runner.py +0 -0
  83. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/__init__.py +0 -0
  84. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/_failover.py +0 -0
  85. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/_sandbox_handle.py +0 -0
  86. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/anthropic.py +0 -0
  87. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/claude_code_tokens.py +0 -0
  88. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/codex.py +0 -0
  89. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/credentials.py +0 -0
  90. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/google.py +0 -0
  91. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/local_probe.py +0 -0
  92. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/model_discovery.py +0 -0
  93. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/openai.py +0 -0
  94. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/registry.py +0 -0
  95. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/text_tool_protocol.py +0 -0
  96. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/translators/__init__.py +0 -0
  97. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/translators/_canonical.py +0 -0
  98. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/llm_client/types.py +0 -0
  99. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/__init__.py +0 -0
  100. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/_locks.py +0 -0
  101. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/_offload.py +0 -0
  102. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/_progressive.py +0 -0
  103. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/composite/__init__.py +0 -0
  104. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/composite/handles.py +0 -0
  105. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/composite/provider.py +0 -0
  106. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/composite/routing.py +0 -0
  107. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/composite/snapshot.py +0 -0
  108. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/embedding/__init__.py +0 -0
  109. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/embedding/client.py +0 -0
  110. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/embedding/google.py +0 -0
  111. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/embedding/local.py +0 -0
  112. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/embedding/openai.py +0 -0
  113. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/embedding/openai_compatible.py +0 -0
  114. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/embedding/registry.py +0 -0
  115. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/embedding/voyage.py +0 -0
  116. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/factory.py +0 -0
  117. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/facts.py +0 -0
  118. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/graph_rank.py +0 -0
  119. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/presets.py +0 -0
  120. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/provider.py +0 -0
  121. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/__init__.py +0 -0
  122. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/ephemeral.py +0 -0
  123. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/__init__.py +0 -0
  124. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/config.py +0 -0
  125. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/frontmatter.py +0 -0
  126. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/graph_edges.py +0 -0
  127. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/index_store.py +0 -0
  128. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/layout.py +0 -0
  129. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/ltm_store.py +0 -0
  130. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/notes_store.py +0 -0
  131. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/provider.py +0 -0
  132. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/snapshot.py +0 -0
  133. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/stm_store.py +0 -0
  134. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/timezone.py +0 -0
  135. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/file/vector_store.py +0 -0
  136. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/sql/__init__.py +0 -0
  137. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/sql/config.py +0 -0
  138. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/sql/connection.py +0 -0
  139. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/sql/index_store.py +0 -0
  140. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/sql/ltm_store.py +0 -0
  141. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/sql/notes_store.py +0 -0
  142. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/sql/provider.py +0 -0
  143. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/sql/schema.py +0 -0
  144. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/sql/snapshot.py +0 -0
  145. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/sql/stm_store.py +0 -0
  146. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/providers/sql/vector_store.py +0 -0
  147. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/retriever.py +0 -0
  148. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/rollup.py +0 -0
  149. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/strategy.py +0 -0
  150. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/vector/__init__.py +0 -0
  151. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/memory/vector/qdrant_store.py +0 -0
  152. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/notifications/__init__.py +0 -0
  153. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/notifications/registry.py +0 -0
  154. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/permission/__init__.py +0 -0
  155. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/permission/loader.py +0 -0
  156. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/permission/matrix.py +0 -0
  157. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/permission/types.py +0 -0
  158. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/py.typed +0 -0
  159. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/runtime/__init__.py +0 -0
  160. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/runtime/task_executors.py +0 -0
  161. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/runtime/task_runner.py +0 -0
  162. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/security/__init__.py +0 -0
  163. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/security/import_validator.py +0 -0
  164. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/security/script_sandbox.py +0 -0
  165. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/session/__init__.py +0 -0
  166. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/session/freshness.py +0 -0
  167. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/session/manager.py +0 -0
  168. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/session/persistence.py +0 -0
  169. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/session/session.py +0 -0
  170. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/settings/__init__.py +0 -0
  171. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/settings/loader.py +0 -0
  172. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/settings/section_registry.py +0 -0
  173. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/__init__.py +0 -0
  174. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled/batch/SKILL.md +0 -0
  175. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled/debug/SKILL.md +0 -0
  176. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled/environment/REFERENCE.md +0 -0
  177. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled/environment/SKILL.md +0 -0
  178. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled/loop/SKILL.md +0 -0
  179. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled/lorem-ipsum/SKILL.md +0 -0
  180. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled/simplify/SKILL.md +0 -0
  181. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled/skillify/SKILL.md +0 -0
  182. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled/stuck/SKILL.md +0 -0
  183. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled/tool-builder/REFERENCE.md +0 -0
  184. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled/tool-builder/SKILL.md +0 -0
  185. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled/verify/SKILL.md +0 -0
  186. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/bundled_skills.py +0 -0
  187. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/fork.py +0 -0
  188. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/frontmatter.py +0 -0
  189. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/loader.py +0 -0
  190. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/mcp_bridge.py +0 -0
  191. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/path_match.py +0 -0
  192. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/registry.py +0 -0
  193. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/shell_blocks.py +0 -0
  194. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/skill_tool.py +0 -0
  195. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/types.py +0 -0
  196. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/skills/watcher.py +0 -0
  197. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/__init__.py +0 -0
  198. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/__init__.py +0 -0
  199. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/_helpers.py +0 -0
  200. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/cancel.py +0 -0
  201. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/clear.py +0 -0
  202. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/compact.py +0 -0
  203. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/config.py +0 -0
  204. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/context.py +0 -0
  205. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/cost.py +0 -0
  206. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/help.py +0 -0
  207. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/memory.py +0 -0
  208. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/model.py +0 -0
  209. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/preset_info.py +0 -0
  210. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/status.py +0 -0
  211. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/built_in/tasks.py +0 -0
  212. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/md_template.py +0 -0
  213. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/parser.py +0 -0
  214. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/registry.py +0 -0
  215. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/slash_commands/types.py +0 -0
  216. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/__init__.py +0 -0
  217. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s01_input/__init__.py +0 -0
  218. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s01_input/artifact/__init__.py +0 -0
  219. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s01_input/artifact/default/__init__.py +0 -0
  220. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s01_input/artifact/default/normalizers.py +0 -0
  221. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s01_input/artifact/default/stage.py +0 -0
  222. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s01_input/artifact/default/validators.py +0 -0
  223. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s01_input/interface.py +0 -0
  224. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s01_input/normalizers.py +0 -0
  225. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s01_input/stage.py +0 -0
  226. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s01_input/types.py +0 -0
  227. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s01_input/validators.py +0 -0
  228. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/__init__.py +0 -0
  229. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/artifact/__init__.py +0 -0
  230. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/artifact/default/__init__.py +0 -0
  231. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/artifact/default/compactors.py +0 -0
  232. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/artifact/default/retrievers.py +0 -0
  233. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/artifact/default/stage.py +0 -0
  234. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/artifact/default/strategies.py +0 -0
  235. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/compactors.py +0 -0
  236. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/interface.py +0 -0
  237. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/retrievers.py +0 -0
  238. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/stage.py +0 -0
  239. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/strategies.py +0 -0
  240. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s02_context/types.py +0 -0
  241. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s03_system/__init__.py +0 -0
  242. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s03_system/artifact/__init__.py +0 -0
  243. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s03_system/artifact/default/__init__.py +0 -0
  244. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s03_system/artifact/default/builders.py +0 -0
  245. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s03_system/artifact/default/stage.py +0 -0
  246. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s03_system/builders.py +0 -0
  247. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s03_system/interface.py +0 -0
  248. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s03_system/persona/__init__.py +0 -0
  249. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s03_system/persona/builder.py +0 -0
  250. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s03_system/persona/provider.py +0 -0
  251. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s03_system/stage.py +0 -0
  252. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s04_guard/__init__.py +0 -0
  253. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s04_guard/artifact/__init__.py +0 -0
  254. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s04_guard/artifact/default/__init__.py +0 -0
  255. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s04_guard/artifact/default/guards.py +0 -0
  256. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s04_guard/artifact/default/stage.py +0 -0
  257. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s04_guard/guards.py +0 -0
  258. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s04_guard/interface.py +0 -0
  259. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s04_guard/stage.py +0 -0
  260. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s04_guard/types.py +0 -0
  261. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s05_cache/__init__.py +0 -0
  262. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s05_cache/artifact/__init__.py +0 -0
  263. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s05_cache/artifact/default/__init__.py +0 -0
  264. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s05_cache/artifact/default/stage.py +0 -0
  265. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s05_cache/artifact/default/strategies.py +0 -0
  266. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s05_cache/interface.py +0 -0
  267. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s05_cache/stage.py +0 -0
  268. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s05_cache/strategies.py +0 -0
  269. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/__init__.py +0 -0
  270. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/_translate.py +0 -0
  271. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/artifact/__init__.py +0 -0
  272. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/artifact/default/__init__.py +0 -0
  273. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/artifact/default/providers.py +0 -0
  274. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/artifact/default/retry.py +0 -0
  275. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/artifact/default/router.py +0 -0
  276. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/artifact/default/stage.py +0 -0
  277. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/artifact/default/tool_loop.py +0 -0
  278. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/artifact/google/__init__.py +0 -0
  279. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/artifact/google/providers.py +0 -0
  280. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/artifact/openai/__init__.py +0 -0
  281. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/artifact/openai/providers.py +0 -0
  282. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/interface.py +0 -0
  283. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/providers.py +0 -0
  284. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/retry.py +0 -0
  285. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/stage.py +0 -0
  286. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s06_api/types.py +0 -0
  287. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s07_token/__init__.py +0 -0
  288. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s07_token/artifact/__init__.py +0 -0
  289. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s07_token/artifact/default/__init__.py +0 -0
  290. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s07_token/artifact/default/pricing.py +0 -0
  291. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s07_token/artifact/default/stage.py +0 -0
  292. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s07_token/artifact/default/trackers.py +0 -0
  293. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s07_token/interface.py +0 -0
  294. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s07_token/pricing.py +0 -0
  295. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s07_token/stage.py +0 -0
  296. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s07_token/trackers.py +0 -0
  297. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s08_think/__init__.py +0 -0
  298. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s08_think/artifact/default/__init__.py +0 -0
  299. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s08_think/artifact/default/budget.py +0 -0
  300. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s08_think/artifact/default/processors.py +0 -0
  301. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s08_think/artifact/default/stage.py +0 -0
  302. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s08_think/interface.py +0 -0
  303. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s08_think/processors.py +0 -0
  304. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s08_think/stage.py +0 -0
  305. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s08_think/types.py +0 -0
  306. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s09_parse/__init__.py +0 -0
  307. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s09_parse/artifact/default/__init__.py +0 -0
  308. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s09_parse/artifact/default/parsers.py +0 -0
  309. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s09_parse/artifact/default/signals.py +0 -0
  310. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s09_parse/artifact/default/stage.py +0 -0
  311. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s09_parse/interface.py +0 -0
  312. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s09_parse/parsers.py +0 -0
  313. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s09_parse/signals.py +0 -0
  314. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s09_parse/stage.py +0 -0
  315. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s09_parse/types.py +0 -0
  316. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/__init__.py +0 -0
  317. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/artifact/__init__.py +0 -0
  318. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/artifact/default/__init__.py +0 -0
  319. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/artifact/default/executors.py +0 -0
  320. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/artifact/default/routers.py +0 -0
  321. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/artifact/default/stage.py +0 -0
  322. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/dispatcher.py +0 -0
  323. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/executors.py +0 -0
  324. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/interface.py +0 -0
  325. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/persistence.py +0 -0
  326. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/routers.py +0 -0
  327. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/stage.py +0 -0
  328. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/state_mutation.py +0 -0
  329. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s10_tool/streaming.py +0 -0
  330. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s11_tool_review/__init__.py +0 -0
  331. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s11_tool_review/artifact/__init__.py +0 -0
  332. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s11_tool_review/artifact/default/__init__.py +0 -0
  333. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s11_tool_review/artifact/default/reviewers.py +0 -0
  334. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s11_tool_review/artifact/default/stage.py +0 -0
  335. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s11_tool_review/interface.py +0 -0
  336. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s12_agent/__init__.py +0 -0
  337. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s12_agent/artifact/__init__.py +0 -0
  338. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s12_agent/artifact/default/__init__.py +0 -0
  339. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s12_agent/artifact/default/orchestrators.py +0 -0
  340. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s12_agent/artifact/default/stage.py +0 -0
  341. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s12_agent/interface.py +0 -0
  342. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s12_agent/orchestrators.py +0 -0
  343. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s12_agent/persistent_subagent.py +0 -0
  344. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s12_agent/stage.py +0 -0
  345. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s12_agent/subagent_catalog.py +0 -0
  346. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s12_agent/subagent_type.py +0 -0
  347. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s12_agent/types.py +0 -0
  348. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s13_task_registry/__init__.py +0 -0
  349. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s13_task_registry/artifact/__init__.py +0 -0
  350. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s13_task_registry/artifact/default/__init__.py +0 -0
  351. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s13_task_registry/artifact/default/file_backed_registry.py +0 -0
  352. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s13_task_registry/artifact/default/policies.py +0 -0
  353. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s13_task_registry/artifact/default/registry.py +0 -0
  354. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s13_task_registry/artifact/default/stage.py +0 -0
  355. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s13_task_registry/interface.py +0 -0
  356. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s13_task_registry/types.py +0 -0
  357. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s14_evaluate/__init__.py +0 -0
  358. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s14_evaluate/artifact/__init__.py +0 -0
  359. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/__init__.py +0 -0
  360. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/strategy.py +0 -0
  361. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s14_evaluate/artifact/default/__init__.py +0 -0
  362. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s14_evaluate/artifact/default/stage.py +0 -0
  363. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s14_evaluate/artifact/default/strategies.py +0 -0
  364. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s14_evaluate/interface.py +0 -0
  365. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s14_evaluate/stage.py +0 -0
  366. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s14_evaluate/strategies.py +0 -0
  367. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s14_evaluate/types.py +0 -0
  368. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s15_hitl/__init__.py +0 -0
  369. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s15_hitl/artifact/__init__.py +0 -0
  370. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s15_hitl/artifact/default/__init__.py +0 -0
  371. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s15_hitl/artifact/default/requesters.py +0 -0
  372. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s15_hitl/artifact/default/stage.py +0 -0
  373. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s15_hitl/artifact/default/timeouts.py +0 -0
  374. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s15_hitl/interface.py +0 -0
  375. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s15_hitl/types.py +0 -0
  376. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s16_loop/__init__.py +0 -0
  377. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s16_loop/artifact/__init__.py +0 -0
  378. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s16_loop/artifact/default/__init__.py +0 -0
  379. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s16_loop/artifact/default/controllers.py +0 -0
  380. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s16_loop/artifact/default/stage.py +0 -0
  381. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s16_loop/controllers.py +0 -0
  382. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s16_loop/interface.py +0 -0
  383. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s16_loop/stage.py +0 -0
  384. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s17_emit/__init__.py +0 -0
  385. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s17_emit/artifact/__init__.py +0 -0
  386. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s17_emit/artifact/default/__init__.py +0 -0
  387. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s17_emit/artifact/default/emitters.py +0 -0
  388. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s17_emit/artifact/default/stage.py +0 -0
  389. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s17_emit/emitters.py +0 -0
  390. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s17_emit/interface.py +0 -0
  391. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s17_emit/stage.py +0 -0
  392. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s17_emit/types.py +0 -0
  393. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s18_memory/__init__.py +0 -0
  394. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s18_memory/_dehydrate.py +0 -0
  395. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s18_memory/artifact/__init__.py +0 -0
  396. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s18_memory/artifact/default/__init__.py +0 -0
  397. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s18_memory/artifact/default/persistence.py +0 -0
  398. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s18_memory/artifact/default/stage.py +0 -0
  399. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s18_memory/artifact/default/strategies.py +0 -0
  400. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s18_memory/insight.py +0 -0
  401. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s18_memory/interface.py +0 -0
  402. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s18_memory/persistence.py +0 -0
  403. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s18_memory/stage.py +0 -0
  404. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s18_memory/strategies.py +0 -0
  405. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s19_summarize/__init__.py +0 -0
  406. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s19_summarize/artifact/__init__.py +0 -0
  407. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s19_summarize/artifact/default/__init__.py +0 -0
  408. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s19_summarize/artifact/default/importance.py +0 -0
  409. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s19_summarize/artifact/default/stage.py +0 -0
  410. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s19_summarize/artifact/default/summarizers.py +0 -0
  411. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s19_summarize/frequency_policy.py +0 -0
  412. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s19_summarize/interface.py +0 -0
  413. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s19_summarize/types.py +0 -0
  414. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s20_persist/__init__.py +0 -0
  415. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s20_persist/artifact/__init__.py +0 -0
  416. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s20_persist/artifact/default/__init__.py +0 -0
  417. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s20_persist/artifact/default/frequencies.py +0 -0
  418. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s20_persist/artifact/default/persisters.py +0 -0
  419. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s20_persist/artifact/default/stage.py +0 -0
  420. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s20_persist/interface.py +0 -0
  421. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s20_persist/restore.py +0 -0
  422. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s20_persist/types.py +0 -0
  423. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s21_yield/__init__.py +0 -0
  424. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s21_yield/artifact/__init__.py +0 -0
  425. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s21_yield/artifact/default/__init__.py +0 -0
  426. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s21_yield/artifact/default/formatters.py +0 -0
  427. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s21_yield/artifact/default/multi_format.py +0 -0
  428. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s21_yield/artifact/default/stage.py +0 -0
  429. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s21_yield/formatters.py +0 -0
  430. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s21_yield/interface.py +0 -0
  431. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/stages/s21_yield/stage.py +0 -0
  432. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/__init__.py +0 -0
  433. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/_sandbox.py +0 -0
  434. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/_ssh.py +0 -0
  435. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/adhoc.py +0 -0
  436. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/base.py +0 -0
  437. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/__init__.py +0 -0
  438. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/_path_guard.py +0 -0
  439. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/_ssh_store.py +0 -0
  440. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/_web_search_backends.py +0 -0
  441. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/agent_tool.py +0 -0
  442. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/ask_user_question_tool.py +0 -0
  443. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/atlassian_tools.py +0 -0
  444. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/audio_tools.py +0 -0
  445. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/bash_tool.py +0 -0
  446. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/browser_tools.py +0 -0
  447. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/cron_tools.py +0 -0
  448. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/dev_tools.py +0 -0
  449. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/doc_tools.py +0 -0
  450. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/edit_tool.py +0 -0
  451. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/env_tools.py +0 -0
  452. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/glob_tool.py +0 -0
  453. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/google_tools.py +0 -0
  454. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/grep_tool.py +0 -0
  455. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/mcp_wrapper_tools.py +0 -0
  456. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/notebook_edit_tool.py +0 -0
  457. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/operator_tools.py +0 -0
  458. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/plan_mode_tools.py +0 -0
  459. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/push_notification_tool.py +0 -0
  460. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/read_tool.py +0 -0
  461. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/sandbox_exec_tool.py +0 -0
  462. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/send_message_tool.py +0 -0
  463. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/ssh_tools.py +0 -0
  464. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/subagent_tools.py +0 -0
  465. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/task_tools.py +0 -0
  466. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/todo_write_tool.py +0 -0
  467. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/tool_search_tool.py +0 -0
  468. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/web_fetch_tool.py +0 -0
  469. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/web_search_tool.py +0 -0
  470. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/workspace_tools.py +0 -0
  471. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/worktree_tools.py +0 -0
  472. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/built_in/write_tool.py +0 -0
  473. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/composer.py +0 -0
  474. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/errors.py +0 -0
  475. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/mcp/__init__.py +0 -0
  476. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/mcp/adapter.py +0 -0
  477. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/mcp/credentials.py +0 -0
  478. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/mcp/errors.py +0 -0
  479. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/mcp/manager.py +0 -0
  480. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/mcp/oauth.py +0 -0
  481. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/mcp/state.py +0 -0
  482. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/mcp/uri.py +0 -0
  483. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/plugin.py +0 -0
  484. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/provider.py +0 -0
  485. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/providers.py +0 -0
  486. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/registry.py +0 -0
  487. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/sandbox.py +0 -0
  488. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/scope.py +0 -0
  489. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/tools/stage_binding.py +0 -0
  490. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/workspace/__init__.py +0 -0
  491. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/workspace/stack.py +0 -0
  492. {geny_executor-2.71.0 → geny_executor-2.72.1}/src/geny_executor/workspace/types.py +0 -0
  493. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/__init__.py +0 -0
  494. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/_fixtures/__init__.py +0 -0
  495. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/_fixtures/fake_echo_cli.py +0 -0
  496. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/_fixtures/geny_manifest_layout.json +0 -0
  497. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/_fixtures/manifest_entries.py +0 -0
  498. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/__init__.py +0 -0
  499. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/conftest.py +0 -0
  500. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/fixtures/__init__.py +0 -0
  501. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/fixtures/adapter/__init__.py +0 -0
  502. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/fixtures/adapter/adapter.py +0 -0
  503. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/test_c1_six_layer_retrieval.py +0 -0
  504. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/test_c2_execution_recording.py +0 -0
  505. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/test_c3_reflection_and_promotion.py +0 -0
  506. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/test_c4_rest_coverage.py +0 -0
  507. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/test_c5_embedding_migration.py +0 -0
  508. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/test_c6_session_resume.py +0 -0
  509. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/test_c7_adapter_parity.py +0 -0
  510. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/completeness/test_spec_loads.py +0 -0
  511. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/__init__.py +0 -0
  512. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/memory_provider_contract.py +0 -0
  513. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_embedding_clients.py +0 -0
  514. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_error_codes_stability.py +0 -0
  515. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_embedding_credentials.py +0 -0
  516. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_auto_vector.py +0 -0
  517. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_composite.py +0 -0
  518. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_composite_routing.py +0 -0
  519. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_curated_global.py +0 -0
  520. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_ephemeral.py +0 -0
  521. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_factory.py +0 -0
  522. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_file.py +0 -0
  523. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_file_layout.py +0 -0
  524. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_file_vector.py +0 -0
  525. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_sql.py +0 -0
  526. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_sql_dialect.py +0 -0
  527. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_sql_schema.py +0 -0
  528. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_provider_sql_vector.py +0 -0
  529. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_memory_vector_breaker.py +0 -0
  530. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/contract/test_stage_uniformity.py +0 -0
  531. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/integration/test_cycle_ab_cross_import.py +0 -0
  532. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/integration/test_integration.py +0 -0
  533. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/__init__.py +0 -0
  534. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/conformance/__init__.py +0 -0
  535. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/conformance/harness.py +0 -0
  536. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/conformance/test_anthropic.py +0 -0
  537. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/conformance/test_google.py +0 -0
  538. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/conformance/test_local_providers.py +0 -0
  539. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/conformance/test_openai.py +0 -0
  540. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/conformance/test_vllm.py +0 -0
  541. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/live/__init__.py +0 -0
  542. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/live/test_live_canaries.py +0 -0
  543. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/unit/__init__.py +0 -0
  544. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/unit/test_anthropic_build_kwargs.py +0 -0
  545. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/unit/test_anthropic_classify.py +0 -0
  546. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/unit/test_base_client.py +0 -0
  547. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/unit/test_credentials.py +0 -0
  548. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/unit/test_google_classify.py +0 -0
  549. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/unit/test_local_probe.py +0 -0
  550. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/unit/test_local_tool_repair.py +0 -0
  551. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/unit/test_openai_client.py +0 -0
  552. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/llm_client/unit/test_profiles.py +0 -0
  553. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/memory/test_note_delete_propagation.py +0 -0
  554. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/__init__.py +0 -0
  555. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_account_load_balancing.py +0 -0
  556. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_account_router.py +0 -0
  557. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_adaptive_model_router.py +0 -0
  558. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_adaptive_router_configure.py +0 -0
  559. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_adaptive_thinking_budget.py +0 -0
  560. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_adhoc_providers.py +0 -0
  561. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_agent_tool.py +0 -0
  562. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_api_timeout_kwarg.py +0 -0
  563. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_artifact_metadata.py +0 -0
  564. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_ask_user_question_tool.py +0 -0
  565. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_atlassian_tools.py +0 -0
  566. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_attach_llm_client_guard.py +0 -0
  567. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_audio_tools.py +0 -0
  568. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_binary_classify_manifest.py +0 -0
  569. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_browser_doc_tools.py +0 -0
  570. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_budget_compaction_recovery.py +0 -0
  571. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_built_in_autoregister.py +0 -0
  572. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_builtin_capabilities.py +0 -0
  573. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_builtin_channels.py +0 -0
  574. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_builtin_features.py +0 -0
  575. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_cache_prefix_key.py +0 -0
  576. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_cancellation.py +0 -0
  577. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_claude_code_token_client.py +0 -0
  578. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_cli_stream_limit.py +0 -0
  579. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_codex_responses_client.py +0 -0
  580. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_compaction_stm_watermark.py +0 -0
  581. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_composite_set_hooks.py +0 -0
  582. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_concurrent_runs.py +0 -0
  583. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_config_liveness.py +0 -0
  584. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_conversation_is_portable.py +0 -0
  585. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_core_deferred_tools.py +0 -0
  586. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_cron_runner.py +0 -0
  587. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_cron_store.py +0 -0
  588. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_cron_tools.py +0 -0
  589. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_deterministic_prune_pass.py +0 -0
  590. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_dev_tools.py +0 -0
  591. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_diff_order_keyed.py +0 -0
  592. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_dispatch_context_carries_the_sandbox.py +0 -0
  593. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_dynamic_persona_builder.py +0 -0
  594. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_embedding_error_classification.py +0 -0
  595. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_embedding_loop_safety.py +0 -0
  596. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_embedding_openai_compatible.py +0 -0
  597. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_errors_categories.py +0 -0
  598. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_evaluation_chain.py +0 -0
  599. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_evaluation_chain_configure.py +0 -0
  600. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_event_catalog.py +0 -0
  601. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_event_channel_unification.py +0 -0
  602. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_event_correlation.py +0 -0
  603. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_external_tool_resolution.py +0 -0
  604. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_failover_classification.py +0 -0
  605. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_forge_tool.py +0 -0
  606. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_fork_multi_provider.py +0 -0
  607. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_from_manifest_strict_validation.py +0 -0
  608. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_gateway.py +0 -0
  609. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_gateway_ws.py +0 -0
  610. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_geny_prod_manifest_repro.py +0 -0
  611. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_graph_edges.py +0 -0
  612. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_graph_rank.py +0 -0
  613. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_guard_fail_fast.py +0 -0
  614. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_hierarchical_sidecars.py +0 -0
  615. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_hook_gate_split.py +0 -0
  616. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_hook_in_process.py +0 -0
  617. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_hook_runner.py +0 -0
  618. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_hook_taxonomy.py +0 -0
  619. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_hooks_and_shared_keys.py +0 -0
  620. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_host_selections_resolve.py +0 -0
  621. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_identity_card_and_pinned.py +0 -0
  622. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_index_list_categories.py +0 -0
  623. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_index_render_vault_map.py +0 -0
  624. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_index_sidecar_coalescing.py +0 -0
  625. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_interaction_fields.py +0 -0
  626. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_internal_agentic_loop.py +0 -0
  627. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_introspection.py +0 -0
  628. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_llm_client_base.py +0 -0
  629. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_llm_client_capabilities.py +0 -0
  630. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_llm_client_registry.py +0 -0
  631. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_llm_client_request_types.py +0 -0
  632. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_llm_client_state.py +0 -0
  633. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_llm_compactor_selfwire.py +0 -0
  634. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_llm_summary_compactor.py +0 -0
  635. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_lock_cancel_leak.py +0 -0
  636. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_loop_agnostic_lock.py +0 -0
  637. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_manifest_factory.py +0 -0
  638. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_manifest_from_dict_hygiene.py +0 -0
  639. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_manifest_memory_wiring.py +0 -0
  640. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_manifest_provider_validation.py +0 -0
  641. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_manifest_subagents_memory_sections.py +0 -0
  642. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_manifest_v2.py +0 -0
  643. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_manifest_v3_migration.py +0 -0
  644. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_mcp_annotations_attach.py +0 -0
  645. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_mcp_credential_store.py +0 -0
  646. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_mcp_fsm.py +0 -0
  647. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_mcp_lifecycle.py +0 -0
  648. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_mcp_namespace.py +0 -0
  649. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_mcp_oauth.py +0 -0
  650. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_mcp_prompts_skills_bridge.py +0 -0
  651. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_mcp_resource_retriever.py +0 -0
  652. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_mcp_uri.py +0 -0
  653. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_mcp_wrapper_tools.py +0 -0
  654. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_memory_aware_retriever.py +0 -0
  655. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_memory_facts.py +0 -0
  656. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_memory_hooks_after_callbacks.py +0 -0
  657. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_memory_metadata_extension.py +0 -0
  658. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_memory_rollup.py +0 -0
  659. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_model_discovery.py +0 -0
  660. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_model_overrides.py +0 -0
  661. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_multi_dim_budget_configure.py +0 -0
  662. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_multi_dim_budget_controller.py +0 -0
  663. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_multi_format_yield.py +0 -0
  664. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_multi_provider.py +0 -0
  665. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_multimodal.py +0 -0
  666. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_note_graph_queries.py +0 -0
  667. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_notebook_edit_tool.py +0 -0
  668. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_notes_load_pinned.py +0 -0
  669. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_notes_store_offloop_scan.py +0 -0
  670. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_one_path_vocabulary.py +0 -0
  671. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_openai_responses_routing.py +0 -0
  672. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_operator_tools.py +0 -0
  673. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_ordered_emitter_chain.py +0 -0
  674. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_permission_matrix.py +0 -0
  675. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_permission_mode_promotions.py +0 -0
  676. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_permission_posture.py +0 -0
  677. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_persistent_subagent.py +0 -0
  678. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase1_foundation.py +0 -0
  679. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase1_pipeline.py +0 -0
  680. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase2_agent_loop.py +0 -0
  681. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase2_tools.py +0 -0
  682. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase3_context_memory.py +0 -0
  683. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase4_think_agent_evaluate.py +0 -0
  684. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase5_emit_presets_mcp.py +0 -0
  685. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase5_environment.py +0 -0
  686. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase6_history.py +0 -0
  687. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase6_integration.py +0 -0
  688. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase7_security.py +0 -0
  689. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase9a_preset_regen.py +0 -0
  690. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_phase9a_scaffolding.py +0 -0
  691. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_pipeline_aclose.py +0 -0
  692. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_pipeline_attach_runtime.py +0 -0
  693. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_pipeline_events_tap.py +0 -0
  694. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_pipeline_from_manifest.py +0 -0
  695. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_pipeline_hook_lifecycle.py +0 -0
  696. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_pipeline_session_runtime.py +0 -0
  697. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_plan_mode_tools.py +0 -0
  698. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_primary_provider_and_build_reports.py +0 -0
  699. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_progressive_disclosure.py +0 -0
  700. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_provider_driven_strategy.py +0 -0
  701. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_push_notification_tool.py +0 -0
  702. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_qdrant_vector_store.py +0 -0
  703. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_refresh_backlinks_extension.py +0 -0
  704. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_refresh_runtime_and_run_lock.py +0 -0
  705. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_resolve_model_config.py +0 -0
  706. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_restore_bad_strategy_config.py +0 -0
  707. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_reviewer_policy_configure.py +0 -0
  708. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_runtime_task_runner.py +0 -0
  709. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_s06_chunk_forwarding.py +0 -0
  710. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_s06_provider_selection.py +0 -0
  711. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_s13_file_backed_registry.py +0 -0
  712. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_s13_task_registry_output.py +0 -0
  713. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_s19_frequency_policy.py +0 -0
  714. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_s9b1_tool_review.py +0 -0
  715. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_s9b2_task_registry.py +0 -0
  716. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_s9b3_hitl.py +0 -0
  717. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_s9b4_summarize.py +0 -0
  718. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_s9b5_persist.py +0 -0
  719. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_s9c1_pipeline_resume.py +0 -0
  720. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_s9c2_restore_state.py +0 -0
  721. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_sandbox_exec_tool.py +0 -0
  722. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_sandbox_path_mapping.py +0 -0
  723. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_sandbox_tools.py +0 -0
  724. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_security_hardening.py +0 -0
  725. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_self_modifying_env.py +0 -0
  726. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_send_message_tool.py +0 -0
  727. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_settings_loader.py +0 -0
  728. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_skill_level3_resources.py +0 -0
  729. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_skill_phase_10_1.py +0 -0
  730. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_skill_phase_10_2.py +0 -0
  731. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_skill_phase_10_3.py +0 -0
  732. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_skill_phase_10_4_bundled.py +0 -0
  733. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_skill_phase_10_5_fork.py +0 -0
  734. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_skill_phase_10_6_killer.py +0 -0
  735. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_skill_phase_10_7_watcher.py +0 -0
  736. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_skill_richer_schema.py +0 -0
  737. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_skill_tool.py +0 -0
  738. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_skills_foundation.py +0 -0
  739. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_slash_built_in_control.py +0 -0
  740. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_slash_built_in_introspection.py +0 -0
  741. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_slash_commands.py +0 -0
  742. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_slash_md_template.py +0 -0
  743. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_sql_stm_session_scope.py +0 -0
  744. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_ssh_tools.py +0 -0
  745. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_stage10_ask_hitl.py +0 -0
  746. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_stage10_hook_wiring.py +0 -0
  747. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_stage10_partition_executor.py +0 -0
  748. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_stage10_permission_matrix.py +0 -0
  749. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_stage19_session_summary.py +0 -0
  750. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_state_mutation_wiring.py +0 -0
  751. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_state_shared_and_local.py +0 -0
  752. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_stm_append_event.py +0 -0
  753. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_storage_growth_caps.py +0 -0
  754. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_strategy_config_roundtrip.py +0 -0
  755. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_streaming_tool_executor.py +0 -0
  756. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_structured_output_parser.py +0 -0
  757. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_structured_reflection.py +0 -0
  758. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_subagent_catalog.py +0 -0
  759. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_subagent_credential_propagation.py +0 -0
  760. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_subagent_descriptor.py +0 -0
  761. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_subagent_manifest_compile.py +0 -0
  762. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_subagent_orchestrator_zero_arg.py +0 -0
  763. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_subagent_parallel.py +0 -0
  764. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_subagent_pipeline_lifecycle.py +0 -0
  765. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_subagent_type_orchestrator.py +0 -0
  766. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_task_tools.py +0 -0
  767. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_text_tool_protocol.py +0 -0
  768. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_todo_write_tool.py +0 -0
  769. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_tool_abc_uplift.py +0 -0
  770. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_tool_call_events.py +0 -0
  771. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_tool_errors.py +0 -0
  772. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_tool_lifecycle_hooks.py +0 -0
  773. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_tool_pair_repair.py +0 -0
  774. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_tool_plugins.py +0 -0
  775. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_tool_provider.py +0 -0
  776. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_tool_result_persistence.py +0 -0
  777. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_tool_results_end_the_turn.py +0 -0
  778. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_tool_search_tool.py +0 -0
  779. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_tool_stage_max_concurrency.py +0 -0
  780. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_ttft_cache_overhaul.py +0 -0
  781. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_ttft_critical_path.py +0 -0
  782. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_ttft_warmup_streaming.py +0 -0
  783. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_turn_boundary_state.py +0 -0
  784. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_validate_manifest.py +0 -0
  785. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_vault_map_drill.py +0 -0
  786. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_web_fetch_tool.py +0 -0
  787. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_web_search_backends.py +0 -0
  788. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_web_search_tool.py +0 -0
  789. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_workspace.py +0 -0
  790. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_workspace_propagation.py +0 -0
  791. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_workspace_tools.py +0 -0
  792. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_workspace_tools_integration.py +0 -0
  793. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_worktree_tools.py +0 -0
  794. {geny_executor-2.71.0 → geny_executor-2.72.1}/tests/unit/test_write_hook_carries_the_note.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: geny-executor
3
- Version: 2.71.0
3
+ Version: 2.72.1
4
4
  Summary: Harness-engineered agent pipeline library — one 21-stage architecture, many model accounts behind one conversation
5
5
  Project-URL: Homepage, https://github.com/CocoRoF/geny-executor
6
6
  Project-URL: Repository, https://github.com/CocoRoF/geny-executor
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "geny-executor"
7
- version = "2.71.0"
7
+ version = "2.72.1"
8
8
  description = "Harness-engineered agent pipeline library — one 21-stage architecture, many model accounts behind one conversation"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -148,6 +148,12 @@ def _creds_to_client_kwargs(provider: str, creds: ProviderCredentials) -> Dict[s
148
148
  kwargs["base_url"] = creds.base_url
149
149
  if creds.default_headers is not None:
150
150
  kwargs["default_headers"] = dict(creds.default_headers)
151
+ # vLLM's defaults are the safe floor (no tools, no vision) because
152
+ # those depend on the model the server loaded, which only the
153
+ # deployment knows. ``extras["capabilities"]`` is how it says.
154
+ overrides = (creds.extras or {}).get("capabilities")
155
+ if isinstance(overrides, Mapping):
156
+ kwargs["capabilities"] = dict(overrides)
151
157
  return kwargs
152
158
 
153
159
  # API providers (anthropic / openai / google)
@@ -25,8 +25,17 @@ from __future__ import annotations
25
25
 
26
26
  import logging
27
27
  from abc import ABC, abstractmethod
28
- from dataclasses import dataclass, field
29
- from typing import Any, AsyncIterator, Awaitable, Callable, Dict, List, Optional
28
+ from dataclasses import dataclass, field, replace as _dc_replace
29
+ from typing import (
30
+ Any,
31
+ AsyncIterator,
32
+ Awaitable,
33
+ Callable,
34
+ Dict,
35
+ List,
36
+ Mapping,
37
+ Optional,
38
+ )
30
39
 
31
40
  from geny_executor.core.config import ModelConfig
32
41
  from geny_executor.core.errors import APIError, ErrorCategory
@@ -156,6 +165,62 @@ class BaseClient(ABC):
156
165
  self._default_headers = default_headers
157
166
  self._event_sink = event_sink
158
167
 
168
+ # ── Capability negotiation ──────────────────────────────────────────
169
+
170
+ def configure_capabilities(self, **overrides: Any) -> None:
171
+ """Amend this INSTANCE's capability flags for the model it reaches.
172
+
173
+ A class declares what its *wire format* can express; only the
174
+ deployment knows what the *served model* actually does. One vLLM
175
+ endpoint runs a tool-calling model and the next one does not; one
176
+ OpenAI-compatible base_url is a laptop's llama.cpp and the next is
177
+ an aggregator fronting frontier models. So the flags are settable
178
+ per instance rather than per class::
179
+
180
+ client.configure_capabilities(supports_tools=True,
181
+ supports_tool_choice=True)
182
+
183
+ ``capabilities.drops`` is read against these upgraded flags (see
184
+ :meth:`_apply_declared_drops`), so an upgrade really does let the
185
+ field reach the server — the drops tuple needs no rewriting.
186
+ """
187
+ # type-ignore: dataclasses.replace stubs cannot type heterogeneous
188
+ # **kwargs against the per-field types; the dataclass validates at
189
+ # construction.
190
+ self.capabilities = _dc_replace(self.capabilities, **overrides) # type: ignore[arg-type]
191
+
192
+ def apply_capability_overrides(self, overrides: Optional[Mapping[str, Any]]) -> None:
193
+ """Apply a HOST-supplied capability declaration, ignoring unknowns.
194
+
195
+ Separate from :meth:`configure_capabilities` because the input is
196
+ untrusted: it arrives from an account row or a manifest, where a
197
+ typo or a flag from a newer library version must not take down the
198
+ turn. Unknown keys are dropped with a log line instead of raising.
199
+ """
200
+ if not overrides:
201
+ return
202
+ known: Dict[str, Any] = {}
203
+ unknown: List[str] = []
204
+ for key, value in overrides.items():
205
+ if not hasattr(self.capabilities, key):
206
+ unknown.append(str(key))
207
+ continue
208
+ # Coerce against the CURRENT value's type, not a hard-coded
209
+ # field list: the flags are overwhelmingly booleans (and a JSON
210
+ # account row spells one "true"/1), while ``streaming_granularity``
211
+ # and ``drops`` are not — and a new non-bool field must not start
212
+ # silently arriving as ``True``.
213
+ current = getattr(self.capabilities, key)
214
+ known[key] = bool(value) if isinstance(current, bool) else value
215
+ if unknown:
216
+ logger.warning(
217
+ "%s: ignoring unknown capability override(s): %s",
218
+ self.provider or type(self).__name__,
219
+ ", ".join(sorted(unknown)),
220
+ )
221
+ if known:
222
+ self.configure_capabilities(**known)
223
+
159
224
  # ── High-level surface used by stages ───────────────────────────────
160
225
 
161
226
  async def create_message(
@@ -270,8 +335,26 @@ class BaseClient(ABC):
270
335
  if model_config.top_k is not None and not self.capabilities.supports_top_k:
271
336
  self._emit_unsupported("top_k")
272
337
 
338
+ # Tools negotiation. Until 2.72.1 a client that declared
339
+ # ``supports_tools=False`` still sent them: stripping was left to the
340
+ # ``drops`` tuple, and every shipped client that says no to tools also
341
+ # lists them there — so the hole was invisible until a DEPLOYMENT said
342
+ # no through ``capabilities=`` on a class whose tuple says nothing.
343
+ # That is a setting that does nothing, which is the one outcome a
344
+ # settings page must never have. The capability is authoritative here,
345
+ # exactly as it already is for top_k and stop_sequences.
346
+ if tools and not self.capabilities.supports_tools:
347
+ self._emit_unsupported("tools")
348
+ request.tools = None
349
+
273
350
  if tool_choice and not self.capabilities.supports_tool_choice:
274
351
  self._emit_unsupported("tool_choice")
352
+ request.tool_choice = None
353
+
354
+ # A tool_choice with no tools is a 400 on every backend that checks,
355
+ # so the two travel together whichever of them was dropped.
356
+ if request.tool_choice is not None and not request.tools:
357
+ request.tool_choice = None
275
358
 
276
359
  # Stop-sequences negotiation — clients that drop stop_sequences
277
360
  # signal it explicitly. (Not silently honored by all CLI backends.)
@@ -290,6 +373,12 @@ class BaseClient(ABC):
290
373
  return request
291
374
 
292
375
  # ── images a backend cannot see ──────────────────────────────────
376
+
377
+ #: What a lowered image leaves behind. A sentence, not an empty slot:
378
+ #: the model has to be able to tell "there was a picture I cannot see"
379
+ #: from "there was nothing here".
380
+ _IMAGE_PLACEHOLDER = "[an image was attached here; this model cannot see images]"
381
+
293
382
  def _lower_unseeable_images(self, request: APIRequest) -> None:
294
383
  """Replace image blocks this client cannot see with a note saying so.
295
384
 
@@ -305,39 +394,67 @@ class BaseClient(ABC):
305
394
  * say an image was here and could not be shown, which is what this
306
395
  does, alongside a ``llm_client.field_dropped`` event so the host
307
396
  can say so too.
397
+
398
+ Two places carry images and they are gated separately: a block on
399
+ the message itself (the user attached it) and a block nested inside
400
+ a ``tool_result`` (a tool returned it — a screenshot, a rendered
401
+ chart). Some backends take the first and reject the second, so
402
+ ``supports_vision_tool_results`` decides the nested ones.
308
403
  """
309
404
  caps = self.capabilities
310
405
  if caps.supports_vision and caps.supports_vision_tool_results:
311
406
  return
312
-
407
+ tool_results_ok = caps.supports_vision and caps.supports_vision_tool_results
408
+
409
+ # Copy-on-write, all the way down. ``request.messages`` is a SHALLOW
410
+ # copy of the caller's list, so editing a block in place would edit
411
+ # the pipeline's canonical history — and one turn on a text-only hop
412
+ # would destroy the image for every later turn, including the ones on
413
+ # a model that could have seen it. The degradation ends with this
414
+ # request.
313
415
  lowered = 0
314
- for message in request.messages:
416
+ for position, message in enumerate(request.messages):
315
417
  content = message.get("content")
316
418
  if not isinstance(content, list):
317
419
  continue
318
- in_tool_result = any(
319
- isinstance(b, dict) and b.get("type") == "tool_result" for b in content
320
- )
321
- allowed = (
322
- caps.supports_vision and caps.supports_vision_tool_results
323
- if in_tool_result
324
- else caps.supports_vision
325
- )
326
- if allowed:
327
- continue
328
- replaced: list[Any] = []
420
+ replaced: List[Any] = []
421
+ changed = False
329
422
  for block in content:
330
- if isinstance(block, dict) and block.get("type") == "image":
423
+ if not isinstance(block, dict):
424
+ replaced.append(block)
425
+ continue
426
+ btype = block.get("type")
427
+ if btype == "image" and not caps.supports_vision:
428
+ replaced.append({"type": "text", "text": self._IMAGE_PLACEHOLDER})
331
429
  lowered += 1
332
- replaced.append(
333
- {
334
- "type": "text",
335
- "text": "[an image was attached here; this model cannot see images]",
336
- }
337
- )
430
+ changed = True
431
+ elif btype == "tool_result" and not tool_results_ok:
432
+ inner = block.get("content")
433
+ if not isinstance(inner, list):
434
+ replaced.append(block)
435
+ continue
436
+ # An image a TOOL returned lives one level down, inside
437
+ # the tool_result's own content list — which is why the
438
+ # top-level scan alone would have found nothing to lower
439
+ # on exactly the turn that needed it (a screenshot).
440
+ inner_replaced: List[Any] = []
441
+ inner_changed = False
442
+ for inner_block in inner:
443
+ if isinstance(inner_block, dict) and inner_block.get("type") == "image":
444
+ inner_replaced.append({"type": "text", "text": self._IMAGE_PLACEHOLDER})
445
+ lowered += 1
446
+ inner_changed = True
447
+ else:
448
+ inner_replaced.append(inner_block)
449
+ if inner_changed:
450
+ replaced.append({**block, "content": inner_replaced})
451
+ changed = True
452
+ else:
453
+ replaced.append(block)
338
454
  else:
339
455
  replaced.append(block)
340
- message["content"] = replaced
456
+ if changed:
457
+ request.messages[position] = {**message, "content": replaced}
341
458
 
342
459
  if lowered:
343
460
  self._emit_unsupported("image")
@@ -24,8 +24,7 @@ from __future__ import annotations
24
24
  import json
25
25
  import logging
26
26
  import re
27
- from dataclasses import replace
28
- from typing import Any, Dict, Optional
27
+ from typing import Any, Dict, Mapping, Optional
29
28
 
30
29
  from geny_executor.llm_client.openai import OpenAIClient
31
30
  from geny_executor.llm_client.profiles import (
@@ -108,6 +107,7 @@ class OpenAICompatibleClient(OpenAIClient):
108
107
  event_sink: Optional[Any] = None,
109
108
  num_ctx: Optional[int] = None,
110
109
  think: Optional[bool] = None,
110
+ capabilities: Optional[Mapping[str, Any]] = None,
111
111
  ) -> None:
112
112
  profile = self._profile
113
113
  resolved_base_url = base_url or profile.default_base_url
@@ -126,23 +126,13 @@ class OpenAICompatibleClient(OpenAIClient):
126
126
  )
127
127
  self._num_ctx = num_ctx
128
128
  self._think = think
129
-
130
- def configure_capabilities(self, **overrides: bool) -> None:
131
- """Upgrade/downgrade capability flags for the deployed model.
132
-
133
- A local endpoint serving a model without tool support opts out::
134
-
135
- client.configure_capabilities(supports_tools=False,
136
- supports_tool_choice=False)
137
-
138
- ``capabilities.drops`` is interpreted against the upgraded flags
139
- (see ``BaseClient._apply_declared_drops``), so toggling
140
- ``supports_tools`` really does gate whether ``tools`` reach the
141
- server — no need to rewrite the drops tuple here.
142
- """
143
- # type-ignore: dataclasses.replace stubs can't type heterogeneous
144
- # **kwargs; the dataclass validates values at construction.
145
- self.capabilities = replace(self.capabilities, **overrides) # type: ignore[arg-type]
129
+ # What one OpenAI-compatible endpoint can do is not what another can:
130
+ # this class serves a keyless llama.cpp on a laptop AND a cloud
131
+ # aggregator routing to frontier models. Vision, tools and structured
132
+ # output are properties of the SERVED MODEL, so the account that knows
133
+ # which endpoint this is gets to say (see
134
+ # ``BaseClient.apply_capability_overrides``).
135
+ self.apply_capability_overrides(capabilities)
146
136
 
147
137
  def _parse_tool_arguments(self, raw: Any) -> Any:
148
138
  """Strict parse, then repair the malformed JSON local servers emit.
@@ -205,6 +205,9 @@ def profiled_client_kwargs(name: str, creds: Any) -> Dict[str, Any]:
205
205
  the requested context window.
206
206
  * ``think`` — from ``extras["think"]``; becomes ``extra_body.think``
207
207
  (Ollama's native reasoning toggle).
208
+ * ``capabilities`` — from ``extras["capabilities"]``; capability flags
209
+ the ACCOUNT declares about its endpoint (vision above all), because
210
+ one class serves both a laptop's llama.cpp and a cloud aggregator.
208
211
 
209
212
  Pure: imports nothing from the SDK path. ``creds`` is a
210
213
  ``ProviderCredentials`` (typed ``Any`` to avoid a circular import).
@@ -224,6 +227,13 @@ def profiled_client_kwargs(name: str, creds: Any) -> Dict[str, Any]:
224
227
  think = extras.get("think")
225
228
  if think is not None:
226
229
  kwargs["think"] = bool(think)
230
+ overrides = extras.get("capabilities")
231
+ if isinstance(overrides, Mapping):
232
+ # The account's own declaration of what its endpoint serves. An
233
+ # aggregator routing to frontier models can see images; the
234
+ # llama.cpp build on a laptop usually cannot, and only the account
235
+ # knows which one this is.
236
+ kwargs["capabilities"] = dict(overrides)
227
237
  return kwargs
228
238
 
229
239
 
@@ -22,6 +22,7 @@ a reasoning agent is not a trade worth making.
22
22
  from __future__ import annotations
23
23
 
24
24
  import hashlib
25
+ import contextlib
25
26
  import json
26
27
  import time
27
28
  import uuid
@@ -358,13 +359,14 @@ class ResponsesClient(BaseClient):
358
359
  continue
359
360
  if resp.status_code != 200:
360
361
  raw = (await resp.aread()).decode("utf-8", "replace")
361
- raise self._http_error(resp.status_code, raw)
362
+ raise self._http_error(resp.status_code, raw, resp.headers)
362
363
  async for chunk in self._consume(resp, started):
363
364
  yield chunk
364
365
  return
365
366
 
366
- def _http_error(self, status: int, raw: str) -> APIError:
367
+ def _http_error(self, status: int, raw: str, headers: Any = None) -> APIError:
367
368
  detail = raw
369
+ retry_after: Optional[float] = None
368
370
  try:
369
371
  data = json.loads(raw)
370
372
  err = data.get("error") if isinstance(data, dict) else None
@@ -372,6 +374,11 @@ class ResponsesClient(BaseClient):
372
374
  detail = str(err.get("message") or err.get("code") or raw)
373
375
  if err.get("resets_in_seconds"):
374
376
  self._notify_host({"kind": "rate_limit", "info": err})
377
+ # …and keep it: this is the provider saying exactly when
378
+ # the account is usable again, which beats benching it
379
+ # for a flat fifteen minutes in both directions.
380
+ with contextlib.suppress(TypeError, ValueError):
381
+ retry_after = float(err["resets_in_seconds"])
375
382
  elif isinstance(data, dict) and data.get("detail"):
376
383
  detail = str(data["detail"])
377
384
  except Exception: # noqa: BLE001 — a non-JSON body is the message
@@ -380,11 +387,21 @@ class ResponsesClient(BaseClient):
380
387
  category = classify_text(detail, status)
381
388
  if status == 400 and "usage" in detail.lower() and "limit" in detail.lower():
382
389
  category = ErrorCategory.RATE_LIMITED
383
- return APIError(
390
+ if retry_after is None and headers is not None:
391
+ with contextlib.suppress(AttributeError, TypeError, ValueError):
392
+ header = headers.get("retry-after")
393
+ if header is not None:
394
+ retry_after = float(header)
395
+ error = APIError(
384
396
  f"{self.label}{label} HTTP {status}: {detail[:600]}",
385
397
  category=category,
386
398
  status_code=status,
387
399
  )
400
+ if retry_after is not None and retry_after > 0:
401
+ # Read by the router to size the bench. Carried on the error
402
+ # rather than only in the text so it survives re-wording.
403
+ error.retry_after = retry_after # type: ignore[attr-defined]
404
+ return error
388
405
 
389
406
  async def _consume(self, resp: httpx.Response, started: float) -> AsyncIterator[Dict[str, Any]]:
390
407
  text_parts: list[str] = []
@@ -32,6 +32,24 @@ from geny_executor.llm_client.types import APIRequest, APIResponse
32
32
  _CONTENT = {"text_delta", "thinking_delta", "tool_use", "input_json_delta"}
33
33
 
34
34
 
35
+ def _retry_fields(exc: BaseException) -> dict[str, Any]:
36
+ """What the provider said about coming back, off the exception.
37
+
38
+ Clients that get a machine-readable answer — Codex's
39
+ ``resets_in_seconds``, a ``Retry-After`` header — attach it here rather
40
+ than only wording it into the message, so re-wording the message cannot
41
+ quietly turn the hint back into a guess.
42
+ """
43
+ fields: dict[str, Any] = {}
44
+ retry_after = getattr(exc, "retry_after", None)
45
+ if retry_after is not None:
46
+ fields["retry_after"] = retry_after
47
+ reset_at = getattr(exc, "reset_at", None)
48
+ if reset_at is not None:
49
+ fields["reset_at"] = reset_at
50
+ return fields
51
+
52
+
35
53
  def _label(target: dict[str, Any]) -> str:
36
54
  return f"{target.get('label') or target.get('kind')}·{target.get('model')}"
37
55
 
@@ -241,7 +259,7 @@ class RouterClient(BaseClient):
241
259
  # When the provider says when to come back, believe it. A flat bench
242
260
  # is a guess in both directions: too short and the next turn walks
243
261
  # into the same wall, too long and a recovered account sits idle.
244
- until = failover.reset_at_from(detail, fields=getattr(exc, "fields", None))
262
+ until = failover.reset_at_from(detail, fields=_retry_fields(exc))
245
263
 
246
264
  provider = str(target.get("engineProvider") or "")
247
265
  if (
@@ -6,14 +6,13 @@ adapter is identical; the differences are:
6
6
  - ``provider = "vllm"``
7
7
  - a required ``base_url`` (no public SaaS endpoint)
8
8
  - conservative default capabilities (tool-calling depends on the
9
- serving model; override via :meth:`VLLMClient.configure_capabilities`
10
- if the deployed model supports it)
9
+ serving model, so the deployment declares it: ``capabilities=`` at
10
+ construction, or :meth:`BaseClient.configure_capabilities` later)
11
11
  """
12
12
 
13
13
  from __future__ import annotations
14
14
 
15
- from dataclasses import replace
16
- from typing import Any, Dict, Optional
15
+ from typing import Any, Dict, Mapping, Optional
17
16
 
18
17
  from geny_executor.llm_client.base import ClientCapabilities
19
18
  from geny_executor.llm_client.openai import OpenAIClient
@@ -49,6 +48,7 @@ class VLLMClient(OpenAIClient):
49
48
  base_url: Optional[str] = None,
50
49
  default_headers: Optional[Dict[str, str]] = None,
51
50
  event_sink: Optional[Any] = None,
51
+ capabilities: Optional[Mapping[str, Any]] = None,
52
52
  ) -> None:
53
53
  if not base_url:
54
54
  raise ValueError(
@@ -61,23 +61,8 @@ class VLLMClient(OpenAIClient):
61
61
  default_headers=default_headers,
62
62
  event_sink=event_sink,
63
63
  )
64
-
65
- def configure_capabilities(self, **overrides: bool) -> None:
66
- """Upgrade the client's capability flags when the deployed model supports them.
67
-
68
- Example: a vLLM instance running a tool-call-capable model can opt in::
69
-
70
- client = VLLMClient(base_url=...)
71
- client.configure_capabilities(supports_tools=True, supports_tool_choice=True)
72
-
73
- The declared ``drops`` tuple is interpreted against the upgraded
74
- flags: the drop application skips any field whose matching
75
- ``supports_*`` flag is True on the instance (see
76
- ``BaseClient._apply_declared_drops``), so the opt-in above
77
- really does let ``tools`` / ``tool_choice`` reach the server —
78
- no need to rewrite ``drops`` here.
79
- """
80
- # type-ignore: dataclasses.replace stubs can't type heterogeneous
81
- # **kwargs against the per-field types; values are validated by
82
- # the dataclass itself at construction.
83
- self.capabilities = replace(self.capabilities, **overrides) # type: ignore[arg-type]
64
+ # What a vLLM server can do is a property of the model it loaded,
65
+ # not of vLLM: the same endpoint class serves a tool-calling
66
+ # Qwen-Coder and a plain text completion model. The defaults above
67
+ # are the safe floor; the deployment that knows better says so.
68
+ self.apply_capability_overrides(capabilities)