geny-executor 2.71.0__tar.gz → 2.72.0__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.0}/PKG-INFO +1 -1
  2. {geny_executor-2.71.0 → geny_executor-2.72.0}/pyproject.toml +1 -1
  3. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/pipeline.py +6 -0
  4. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/base.py +122 -23
  5. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/openai_compatible.py +9 -19
  6. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/profiles.py +10 -0
  7. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/responses_wire.py +20 -3
  8. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/router.py +19 -1
  9. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/vllm.py +9 -24
  10. geny_executor-2.72.0/tests/unit/test_an_endpoint_declares_what_it_serves.py +187 -0
  11. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cooldown_policy.py +60 -0
  12. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_images_a_model_cannot_see.py +94 -3
  13. {geny_executor-2.71.0 → geny_executor-2.72.0}/.gitignore +0 -0
  14. {geny_executor-2.71.0 → geny_executor-2.72.0}/LICENSE +0 -0
  15. {geny_executor-2.71.0 → geny_executor-2.72.0}/NOTICE +0 -0
  16. {geny_executor-2.71.0 → geny_executor-2.72.0}/README.md +0 -0
  17. {geny_executor-2.71.0 → geny_executor-2.72.0}/README_ko.md +0 -0
  18. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/__init__.py +0 -0
  19. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/audio/__init__.py +0 -0
  20. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/audio/stt/__init__.py +0 -0
  21. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/audio/stt/openai_compatible.py +0 -0
  22. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/audio/stt/provider.py +0 -0
  23. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/audio/stt/registry.py +0 -0
  24. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/channels/__init__.py +0 -0
  25. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/channels/built_in.py +0 -0
  26. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/channels/factory.py +0 -0
  27. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/channels/send_message_channel.py +0 -0
  28. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/channels/user_file_channel.py +0 -0
  29. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/__init__.py +0 -0
  30. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/artifact.py +0 -0
  31. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/builder.py +0 -0
  32. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/compaction.py +0 -0
  33. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/config.py +0 -0
  34. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/context_prune.py +0 -0
  35. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/diff.py +0 -0
  36. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/environment.py +0 -0
  37. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/environment_control.py +0 -0
  38. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/errors.py +0 -0
  39. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/introspection.py +0 -0
  40. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/manifest_factory.py +0 -0
  41. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/message_repair.py +0 -0
  42. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/mutation.py +0 -0
  43. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/presets.py +0 -0
  44. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/result.py +0 -0
  45. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/schema.py +0 -0
  46. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/shared_keys.py +0 -0
  47. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/slot.py +0 -0
  48. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/snapshot.py +0 -0
  49. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/stage.py +0 -0
  50. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/state.py +0 -0
  51. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/token_estimate.py +0 -0
  52. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/__init__.py +0 -0
  53. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/runner.py +0 -0
  54. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/store_abc.py +0 -0
  55. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/store_impl/__init__.py +0 -0
  56. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/store_impl/file_backed.py +0 -0
  57. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/store_impl/in_memory.py +0 -0
  58. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/types.py +0 -0
  59. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/events/__init__.py +0 -0
  60. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/events/bus.py +0 -0
  61. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/events/catalog.py +0 -0
  62. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/events/types.py +0 -0
  63. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/__init__.py +0 -0
  64. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/adapter.py +0 -0
  65. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/discord.py +0 -0
  66. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/factory.py +0 -0
  67. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/runner.py +0 -0
  68. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/slack.py +0 -0
  69. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/telegram.py +0 -0
  70. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/types.py +0 -0
  71. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/ws_base.py +0 -0
  72. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/__init__.py +0 -0
  73. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/ab_test.py +0 -0
  74. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/cost.py +0 -0
  75. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/models.py +0 -0
  76. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/monitor.py +0 -0
  77. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/replay.py +0 -0
  78. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/service.py +0 -0
  79. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/hooks/__init__.py +0 -0
  80. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/hooks/config.py +0 -0
  81. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/hooks/events.py +0 -0
  82. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/hooks/runner.py +0 -0
  83. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/__init__.py +0 -0
  84. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/_failover.py +0 -0
  85. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/_sandbox_handle.py +0 -0
  86. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/anthropic.py +0 -0
  87. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/claude_code_tokens.py +0 -0
  88. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/codex.py +0 -0
  89. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/credentials.py +0 -0
  90. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/google.py +0 -0
  91. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/local_probe.py +0 -0
  92. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/model_discovery.py +0 -0
  93. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/openai.py +0 -0
  94. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/registry.py +0 -0
  95. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/text_tool_protocol.py +0 -0
  96. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/translators/__init__.py +0 -0
  97. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/translators/_canonical.py +0 -0
  98. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/types.py +0 -0
  99. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/__init__.py +0 -0
  100. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/_locks.py +0 -0
  101. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/_offload.py +0 -0
  102. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/_progressive.py +0 -0
  103. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/composite/__init__.py +0 -0
  104. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/composite/handles.py +0 -0
  105. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/composite/provider.py +0 -0
  106. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/composite/routing.py +0 -0
  107. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/composite/snapshot.py +0 -0
  108. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/__init__.py +0 -0
  109. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/client.py +0 -0
  110. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/google.py +0 -0
  111. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/local.py +0 -0
  112. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/openai.py +0 -0
  113. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/openai_compatible.py +0 -0
  114. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/registry.py +0 -0
  115. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/voyage.py +0 -0
  116. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/factory.py +0 -0
  117. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/facts.py +0 -0
  118. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/graph_rank.py +0 -0
  119. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/presets.py +0 -0
  120. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/provider.py +0 -0
  121. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/__init__.py +0 -0
  122. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/ephemeral.py +0 -0
  123. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/__init__.py +0 -0
  124. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/config.py +0 -0
  125. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/frontmatter.py +0 -0
  126. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/graph_edges.py +0 -0
  127. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/index_store.py +0 -0
  128. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/layout.py +0 -0
  129. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/ltm_store.py +0 -0
  130. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/notes_store.py +0 -0
  131. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/provider.py +0 -0
  132. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/snapshot.py +0 -0
  133. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/stm_store.py +0 -0
  134. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/timezone.py +0 -0
  135. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/vector_store.py +0 -0
  136. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/__init__.py +0 -0
  137. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/config.py +0 -0
  138. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/connection.py +0 -0
  139. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/index_store.py +0 -0
  140. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/ltm_store.py +0 -0
  141. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/notes_store.py +0 -0
  142. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/provider.py +0 -0
  143. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/schema.py +0 -0
  144. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/snapshot.py +0 -0
  145. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/stm_store.py +0 -0
  146. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/vector_store.py +0 -0
  147. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/retriever.py +0 -0
  148. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/rollup.py +0 -0
  149. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/strategy.py +0 -0
  150. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/vector/__init__.py +0 -0
  151. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/vector/qdrant_store.py +0 -0
  152. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/notifications/__init__.py +0 -0
  153. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/notifications/registry.py +0 -0
  154. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/permission/__init__.py +0 -0
  155. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/permission/loader.py +0 -0
  156. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/permission/matrix.py +0 -0
  157. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/permission/types.py +0 -0
  158. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/py.typed +0 -0
  159. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/runtime/__init__.py +0 -0
  160. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/runtime/task_executors.py +0 -0
  161. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/runtime/task_runner.py +0 -0
  162. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/security/__init__.py +0 -0
  163. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/security/import_validator.py +0 -0
  164. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/security/script_sandbox.py +0 -0
  165. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/session/__init__.py +0 -0
  166. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/session/freshness.py +0 -0
  167. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/session/manager.py +0 -0
  168. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/session/persistence.py +0 -0
  169. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/session/session.py +0 -0
  170. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/settings/__init__.py +0 -0
  171. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/settings/loader.py +0 -0
  172. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/settings/section_registry.py +0 -0
  173. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/__init__.py +0 -0
  174. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/batch/SKILL.md +0 -0
  175. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/debug/SKILL.md +0 -0
  176. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/environment/REFERENCE.md +0 -0
  177. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/environment/SKILL.md +0 -0
  178. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/loop/SKILL.md +0 -0
  179. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/lorem-ipsum/SKILL.md +0 -0
  180. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/simplify/SKILL.md +0 -0
  181. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/skillify/SKILL.md +0 -0
  182. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/stuck/SKILL.md +0 -0
  183. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/tool-builder/REFERENCE.md +0 -0
  184. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/tool-builder/SKILL.md +0 -0
  185. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/verify/SKILL.md +0 -0
  186. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled_skills.py +0 -0
  187. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/fork.py +0 -0
  188. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/frontmatter.py +0 -0
  189. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/loader.py +0 -0
  190. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/mcp_bridge.py +0 -0
  191. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/path_match.py +0 -0
  192. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/registry.py +0 -0
  193. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/shell_blocks.py +0 -0
  194. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/skill_tool.py +0 -0
  195. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/types.py +0 -0
  196. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/watcher.py +0 -0
  197. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/__init__.py +0 -0
  198. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/__init__.py +0 -0
  199. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/_helpers.py +0 -0
  200. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/cancel.py +0 -0
  201. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/clear.py +0 -0
  202. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/compact.py +0 -0
  203. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/config.py +0 -0
  204. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/context.py +0 -0
  205. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/cost.py +0 -0
  206. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/help.py +0 -0
  207. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/memory.py +0 -0
  208. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/model.py +0 -0
  209. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/preset_info.py +0 -0
  210. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/status.py +0 -0
  211. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/tasks.py +0 -0
  212. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/md_template.py +0 -0
  213. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/parser.py +0 -0
  214. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/registry.py +0 -0
  215. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/types.py +0 -0
  216. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/__init__.py +0 -0
  217. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/__init__.py +0 -0
  218. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/artifact/__init__.py +0 -0
  219. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/artifact/default/__init__.py +0 -0
  220. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/artifact/default/normalizers.py +0 -0
  221. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/artifact/default/stage.py +0 -0
  222. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/artifact/default/validators.py +0 -0
  223. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/interface.py +0 -0
  224. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/normalizers.py +0 -0
  225. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/stage.py +0 -0
  226. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/types.py +0 -0
  227. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/validators.py +0 -0
  228. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/__init__.py +0 -0
  229. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/artifact/__init__.py +0 -0
  230. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/artifact/default/__init__.py +0 -0
  231. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/artifact/default/compactors.py +0 -0
  232. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/artifact/default/retrievers.py +0 -0
  233. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/artifact/default/stage.py +0 -0
  234. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/artifact/default/strategies.py +0 -0
  235. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/compactors.py +0 -0
  236. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/interface.py +0 -0
  237. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/retrievers.py +0 -0
  238. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/stage.py +0 -0
  239. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/strategies.py +0 -0
  240. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/types.py +0 -0
  241. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/__init__.py +0 -0
  242. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/artifact/__init__.py +0 -0
  243. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/artifact/default/__init__.py +0 -0
  244. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/artifact/default/builders.py +0 -0
  245. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/artifact/default/stage.py +0 -0
  246. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/builders.py +0 -0
  247. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/interface.py +0 -0
  248. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/persona/__init__.py +0 -0
  249. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/persona/builder.py +0 -0
  250. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/persona/provider.py +0 -0
  251. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/stage.py +0 -0
  252. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/__init__.py +0 -0
  253. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/artifact/__init__.py +0 -0
  254. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/artifact/default/__init__.py +0 -0
  255. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/artifact/default/guards.py +0 -0
  256. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/artifact/default/stage.py +0 -0
  257. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/guards.py +0 -0
  258. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/interface.py +0 -0
  259. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/stage.py +0 -0
  260. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/types.py +0 -0
  261. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/__init__.py +0 -0
  262. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/artifact/__init__.py +0 -0
  263. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/artifact/default/__init__.py +0 -0
  264. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/artifact/default/stage.py +0 -0
  265. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/artifact/default/strategies.py +0 -0
  266. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/interface.py +0 -0
  267. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/stage.py +0 -0
  268. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/strategies.py +0 -0
  269. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/__init__.py +0 -0
  270. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/_translate.py +0 -0
  271. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/__init__.py +0 -0
  272. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/default/__init__.py +0 -0
  273. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/default/providers.py +0 -0
  274. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/default/retry.py +0 -0
  275. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/default/router.py +0 -0
  276. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/default/stage.py +0 -0
  277. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/default/tool_loop.py +0 -0
  278. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/google/__init__.py +0 -0
  279. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/google/providers.py +0 -0
  280. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/openai/__init__.py +0 -0
  281. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/openai/providers.py +0 -0
  282. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/interface.py +0 -0
  283. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/providers.py +0 -0
  284. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/retry.py +0 -0
  285. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/stage.py +0 -0
  286. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/types.py +0 -0
  287. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/__init__.py +0 -0
  288. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/artifact/__init__.py +0 -0
  289. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/artifact/default/__init__.py +0 -0
  290. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/artifact/default/pricing.py +0 -0
  291. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/artifact/default/stage.py +0 -0
  292. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/artifact/default/trackers.py +0 -0
  293. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/interface.py +0 -0
  294. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/pricing.py +0 -0
  295. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/stage.py +0 -0
  296. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/trackers.py +0 -0
  297. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/__init__.py +0 -0
  298. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/artifact/default/__init__.py +0 -0
  299. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/artifact/default/budget.py +0 -0
  300. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/artifact/default/processors.py +0 -0
  301. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/artifact/default/stage.py +0 -0
  302. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/interface.py +0 -0
  303. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/processors.py +0 -0
  304. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/stage.py +0 -0
  305. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/types.py +0 -0
  306. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/__init__.py +0 -0
  307. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/artifact/default/__init__.py +0 -0
  308. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/artifact/default/parsers.py +0 -0
  309. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/artifact/default/signals.py +0 -0
  310. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/artifact/default/stage.py +0 -0
  311. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/interface.py +0 -0
  312. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/parsers.py +0 -0
  313. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/signals.py +0 -0
  314. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/stage.py +0 -0
  315. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/types.py +0 -0
  316. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/__init__.py +0 -0
  317. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/artifact/__init__.py +0 -0
  318. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/artifact/default/__init__.py +0 -0
  319. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/artifact/default/executors.py +0 -0
  320. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/artifact/default/routers.py +0 -0
  321. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/artifact/default/stage.py +0 -0
  322. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/dispatcher.py +0 -0
  323. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/executors.py +0 -0
  324. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/interface.py +0 -0
  325. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/persistence.py +0 -0
  326. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/routers.py +0 -0
  327. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/stage.py +0 -0
  328. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/state_mutation.py +0 -0
  329. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/streaming.py +0 -0
  330. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s11_tool_review/__init__.py +0 -0
  331. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s11_tool_review/artifact/__init__.py +0 -0
  332. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s11_tool_review/artifact/default/__init__.py +0 -0
  333. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s11_tool_review/artifact/default/reviewers.py +0 -0
  334. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s11_tool_review/artifact/default/stage.py +0 -0
  335. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s11_tool_review/interface.py +0 -0
  336. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/__init__.py +0 -0
  337. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/artifact/__init__.py +0 -0
  338. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/artifact/default/__init__.py +0 -0
  339. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/artifact/default/orchestrators.py +0 -0
  340. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/artifact/default/stage.py +0 -0
  341. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/interface.py +0 -0
  342. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/orchestrators.py +0 -0
  343. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/persistent_subagent.py +0 -0
  344. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/stage.py +0 -0
  345. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/subagent_catalog.py +0 -0
  346. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/subagent_type.py +0 -0
  347. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/types.py +0 -0
  348. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/__init__.py +0 -0
  349. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/artifact/__init__.py +0 -0
  350. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/artifact/default/__init__.py +0 -0
  351. {geny_executor-2.71.0 → geny_executor-2.72.0}/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.0}/src/geny_executor/stages/s13_task_registry/artifact/default/policies.py +0 -0
  353. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/artifact/default/registry.py +0 -0
  354. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/artifact/default/stage.py +0 -0
  355. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/interface.py +0 -0
  356. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/types.py +0 -0
  357. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/__init__.py +0 -0
  358. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/artifact/__init__.py +0 -0
  359. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/__init__.py +0 -0
  360. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/strategy.py +0 -0
  361. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/artifact/default/__init__.py +0 -0
  362. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/artifact/default/stage.py +0 -0
  363. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/artifact/default/strategies.py +0 -0
  364. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/interface.py +0 -0
  365. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/stage.py +0 -0
  366. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/strategies.py +0 -0
  367. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/types.py +0 -0
  368. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/__init__.py +0 -0
  369. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/artifact/__init__.py +0 -0
  370. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/artifact/default/__init__.py +0 -0
  371. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/artifact/default/requesters.py +0 -0
  372. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/artifact/default/stage.py +0 -0
  373. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/artifact/default/timeouts.py +0 -0
  374. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/interface.py +0 -0
  375. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/types.py +0 -0
  376. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/__init__.py +0 -0
  377. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/artifact/__init__.py +0 -0
  378. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/artifact/default/__init__.py +0 -0
  379. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/artifact/default/controllers.py +0 -0
  380. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/artifact/default/stage.py +0 -0
  381. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/controllers.py +0 -0
  382. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/interface.py +0 -0
  383. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/stage.py +0 -0
  384. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/__init__.py +0 -0
  385. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/artifact/__init__.py +0 -0
  386. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/artifact/default/__init__.py +0 -0
  387. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/artifact/default/emitters.py +0 -0
  388. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/artifact/default/stage.py +0 -0
  389. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/emitters.py +0 -0
  390. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/interface.py +0 -0
  391. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/stage.py +0 -0
  392. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/types.py +0 -0
  393. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/__init__.py +0 -0
  394. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/_dehydrate.py +0 -0
  395. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/artifact/__init__.py +0 -0
  396. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/artifact/default/__init__.py +0 -0
  397. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/artifact/default/persistence.py +0 -0
  398. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/artifact/default/stage.py +0 -0
  399. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/artifact/default/strategies.py +0 -0
  400. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/insight.py +0 -0
  401. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/interface.py +0 -0
  402. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/persistence.py +0 -0
  403. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/stage.py +0 -0
  404. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/strategies.py +0 -0
  405. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/__init__.py +0 -0
  406. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/artifact/__init__.py +0 -0
  407. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/artifact/default/__init__.py +0 -0
  408. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/artifact/default/importance.py +0 -0
  409. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/artifact/default/stage.py +0 -0
  410. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/artifact/default/summarizers.py +0 -0
  411. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/frequency_policy.py +0 -0
  412. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/interface.py +0 -0
  413. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/types.py +0 -0
  414. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/__init__.py +0 -0
  415. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/artifact/__init__.py +0 -0
  416. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/artifact/default/__init__.py +0 -0
  417. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/artifact/default/frequencies.py +0 -0
  418. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/artifact/default/persisters.py +0 -0
  419. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/artifact/default/stage.py +0 -0
  420. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/interface.py +0 -0
  421. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/restore.py +0 -0
  422. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/types.py +0 -0
  423. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/__init__.py +0 -0
  424. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/artifact/__init__.py +0 -0
  425. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/artifact/default/__init__.py +0 -0
  426. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/artifact/default/formatters.py +0 -0
  427. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/artifact/default/multi_format.py +0 -0
  428. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/artifact/default/stage.py +0 -0
  429. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/formatters.py +0 -0
  430. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/interface.py +0 -0
  431. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/stage.py +0 -0
  432. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/__init__.py +0 -0
  433. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/_sandbox.py +0 -0
  434. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/_ssh.py +0 -0
  435. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/adhoc.py +0 -0
  436. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/base.py +0 -0
  437. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/__init__.py +0 -0
  438. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/_path_guard.py +0 -0
  439. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/_ssh_store.py +0 -0
  440. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/_web_search_backends.py +0 -0
  441. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/agent_tool.py +0 -0
  442. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/ask_user_question_tool.py +0 -0
  443. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/atlassian_tools.py +0 -0
  444. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/audio_tools.py +0 -0
  445. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/bash_tool.py +0 -0
  446. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/browser_tools.py +0 -0
  447. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/cron_tools.py +0 -0
  448. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/dev_tools.py +0 -0
  449. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/doc_tools.py +0 -0
  450. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/edit_tool.py +0 -0
  451. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/env_tools.py +0 -0
  452. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/glob_tool.py +0 -0
  453. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/google_tools.py +0 -0
  454. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/grep_tool.py +0 -0
  455. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/mcp_wrapper_tools.py +0 -0
  456. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/notebook_edit_tool.py +0 -0
  457. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/operator_tools.py +0 -0
  458. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/plan_mode_tools.py +0 -0
  459. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/push_notification_tool.py +0 -0
  460. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/read_tool.py +0 -0
  461. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/sandbox_exec_tool.py +0 -0
  462. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/send_message_tool.py +0 -0
  463. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/ssh_tools.py +0 -0
  464. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/subagent_tools.py +0 -0
  465. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/task_tools.py +0 -0
  466. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/todo_write_tool.py +0 -0
  467. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/tool_search_tool.py +0 -0
  468. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/web_fetch_tool.py +0 -0
  469. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/web_search_tool.py +0 -0
  470. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/workspace_tools.py +0 -0
  471. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/worktree_tools.py +0 -0
  472. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/write_tool.py +0 -0
  473. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/composer.py +0 -0
  474. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/errors.py +0 -0
  475. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/__init__.py +0 -0
  476. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/adapter.py +0 -0
  477. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/credentials.py +0 -0
  478. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/errors.py +0 -0
  479. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/manager.py +0 -0
  480. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/oauth.py +0 -0
  481. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/state.py +0 -0
  482. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/uri.py +0 -0
  483. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/plugin.py +0 -0
  484. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/provider.py +0 -0
  485. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/providers.py +0 -0
  486. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/registry.py +0 -0
  487. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/sandbox.py +0 -0
  488. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/scope.py +0 -0
  489. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/stage_binding.py +0 -0
  490. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/workspace/__init__.py +0 -0
  491. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/workspace/stack.py +0 -0
  492. {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/workspace/types.py +0 -0
  493. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/__init__.py +0 -0
  494. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/_fixtures/__init__.py +0 -0
  495. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/_fixtures/fake_echo_cli.py +0 -0
  496. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/_fixtures/geny_manifest_layout.json +0 -0
  497. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/_fixtures/manifest_entries.py +0 -0
  498. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/__init__.py +0 -0
  499. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/conftest.py +0 -0
  500. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/fixtures/__init__.py +0 -0
  501. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/fixtures/adapter/__init__.py +0 -0
  502. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/fixtures/adapter/adapter.py +0 -0
  503. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c1_six_layer_retrieval.py +0 -0
  504. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c2_execution_recording.py +0 -0
  505. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c3_reflection_and_promotion.py +0 -0
  506. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c4_rest_coverage.py +0 -0
  507. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c5_embedding_migration.py +0 -0
  508. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c6_session_resume.py +0 -0
  509. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c7_adapter_parity.py +0 -0
  510. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_spec_loads.py +0 -0
  511. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/__init__.py +0 -0
  512. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/memory_provider_contract.py +0 -0
  513. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_embedding_clients.py +0 -0
  514. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_error_codes_stability.py +0 -0
  515. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_embedding_credentials.py +0 -0
  516. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_auto_vector.py +0 -0
  517. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_composite.py +0 -0
  518. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_composite_routing.py +0 -0
  519. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_curated_global.py +0 -0
  520. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_ephemeral.py +0 -0
  521. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_factory.py +0 -0
  522. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_file.py +0 -0
  523. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_file_layout.py +0 -0
  524. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_file_vector.py +0 -0
  525. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_sql.py +0 -0
  526. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_sql_dialect.py +0 -0
  527. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_sql_schema.py +0 -0
  528. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_sql_vector.py +0 -0
  529. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_vector_breaker.py +0 -0
  530. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_stage_uniformity.py +0 -0
  531. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/integration/test_cycle_ab_cross_import.py +0 -0
  532. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/integration/test_integration.py +0 -0
  533. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/__init__.py +0 -0
  534. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/__init__.py +0 -0
  535. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/harness.py +0 -0
  536. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/test_anthropic.py +0 -0
  537. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/test_google.py +0 -0
  538. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/test_local_providers.py +0 -0
  539. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/test_openai.py +0 -0
  540. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/test_vllm.py +0 -0
  541. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/live/__init__.py +0 -0
  542. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/live/test_live_canaries.py +0 -0
  543. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/__init__.py +0 -0
  544. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_anthropic_build_kwargs.py +0 -0
  545. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_anthropic_classify.py +0 -0
  546. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_base_client.py +0 -0
  547. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_credentials.py +0 -0
  548. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_google_classify.py +0 -0
  549. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_local_probe.py +0 -0
  550. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_local_tool_repair.py +0 -0
  551. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_openai_client.py +0 -0
  552. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_profiles.py +0 -0
  553. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/memory/test_note_delete_propagation.py +0 -0
  554. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/__init__.py +0 -0
  555. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_account_load_balancing.py +0 -0
  556. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_account_router.py +0 -0
  557. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_adaptive_model_router.py +0 -0
  558. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_adaptive_router_configure.py +0 -0
  559. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_adaptive_thinking_budget.py +0 -0
  560. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_adhoc_providers.py +0 -0
  561. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_agent_tool.py +0 -0
  562. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_api_timeout_kwarg.py +0 -0
  563. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_artifact_metadata.py +0 -0
  564. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_ask_user_question_tool.py +0 -0
  565. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_atlassian_tools.py +0 -0
  566. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_attach_llm_client_guard.py +0 -0
  567. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_audio_tools.py +0 -0
  568. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_binary_classify_manifest.py +0 -0
  569. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_browser_doc_tools.py +0 -0
  570. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_budget_compaction_recovery.py +0 -0
  571. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_built_in_autoregister.py +0 -0
  572. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_builtin_capabilities.py +0 -0
  573. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_builtin_channels.py +0 -0
  574. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_builtin_features.py +0 -0
  575. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cache_prefix_key.py +0 -0
  576. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cancellation.py +0 -0
  577. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_claude_code_token_client.py +0 -0
  578. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cli_stream_limit.py +0 -0
  579. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_codex_responses_client.py +0 -0
  580. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_compaction_stm_watermark.py +0 -0
  581. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_composite_set_hooks.py +0 -0
  582. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_concurrent_runs.py +0 -0
  583. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_config_liveness.py +0 -0
  584. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_conversation_is_portable.py +0 -0
  585. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_core_deferred_tools.py +0 -0
  586. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cron_runner.py +0 -0
  587. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cron_store.py +0 -0
  588. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cron_tools.py +0 -0
  589. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_deterministic_prune_pass.py +0 -0
  590. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_dev_tools.py +0 -0
  591. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_diff_order_keyed.py +0 -0
  592. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_dispatch_context_carries_the_sandbox.py +0 -0
  593. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_dynamic_persona_builder.py +0 -0
  594. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_embedding_error_classification.py +0 -0
  595. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_embedding_loop_safety.py +0 -0
  596. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_embedding_openai_compatible.py +0 -0
  597. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_errors_categories.py +0 -0
  598. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_evaluation_chain.py +0 -0
  599. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_evaluation_chain_configure.py +0 -0
  600. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_event_catalog.py +0 -0
  601. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_event_channel_unification.py +0 -0
  602. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_event_correlation.py +0 -0
  603. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_external_tool_resolution.py +0 -0
  604. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_failover_classification.py +0 -0
  605. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_forge_tool.py +0 -0
  606. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_fork_multi_provider.py +0 -0
  607. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_from_manifest_strict_validation.py +0 -0
  608. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_gateway.py +0 -0
  609. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_gateway_ws.py +0 -0
  610. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_geny_prod_manifest_repro.py +0 -0
  611. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_graph_edges.py +0 -0
  612. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_graph_rank.py +0 -0
  613. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_guard_fail_fast.py +0 -0
  614. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_hierarchical_sidecars.py +0 -0
  615. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_hook_gate_split.py +0 -0
  616. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_hook_in_process.py +0 -0
  617. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_hook_runner.py +0 -0
  618. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_hook_taxonomy.py +0 -0
  619. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_hooks_and_shared_keys.py +0 -0
  620. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_host_selections_resolve.py +0 -0
  621. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_identity_card_and_pinned.py +0 -0
  622. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_index_list_categories.py +0 -0
  623. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_index_render_vault_map.py +0 -0
  624. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_index_sidecar_coalescing.py +0 -0
  625. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_interaction_fields.py +0 -0
  626. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_internal_agentic_loop.py +0 -0
  627. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_introspection.py +0 -0
  628. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_client_base.py +0 -0
  629. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_client_capabilities.py +0 -0
  630. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_client_registry.py +0 -0
  631. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_client_request_types.py +0 -0
  632. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_client_state.py +0 -0
  633. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_compactor_selfwire.py +0 -0
  634. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_summary_compactor.py +0 -0
  635. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_lock_cancel_leak.py +0 -0
  636. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_loop_agnostic_lock.py +0 -0
  637. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_factory.py +0 -0
  638. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_from_dict_hygiene.py +0 -0
  639. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_memory_wiring.py +0 -0
  640. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_provider_validation.py +0 -0
  641. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_subagents_memory_sections.py +0 -0
  642. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_v2.py +0 -0
  643. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_v3_migration.py +0 -0
  644. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_annotations_attach.py +0 -0
  645. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_credential_store.py +0 -0
  646. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_fsm.py +0 -0
  647. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_lifecycle.py +0 -0
  648. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_namespace.py +0 -0
  649. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_oauth.py +0 -0
  650. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_prompts_skills_bridge.py +0 -0
  651. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_resource_retriever.py +0 -0
  652. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_uri.py +0 -0
  653. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_wrapper_tools.py +0 -0
  654. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_memory_aware_retriever.py +0 -0
  655. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_memory_facts.py +0 -0
  656. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_memory_hooks_after_callbacks.py +0 -0
  657. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_memory_metadata_extension.py +0 -0
  658. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_memory_rollup.py +0 -0
  659. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_model_discovery.py +0 -0
  660. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_model_overrides.py +0 -0
  661. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_multi_dim_budget_configure.py +0 -0
  662. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_multi_dim_budget_controller.py +0 -0
  663. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_multi_format_yield.py +0 -0
  664. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_multi_provider.py +0 -0
  665. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_multimodal.py +0 -0
  666. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_note_graph_queries.py +0 -0
  667. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_notebook_edit_tool.py +0 -0
  668. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_notes_load_pinned.py +0 -0
  669. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_notes_store_offloop_scan.py +0 -0
  670. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_one_path_vocabulary.py +0 -0
  671. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_openai_responses_routing.py +0 -0
  672. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_operator_tools.py +0 -0
  673. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_ordered_emitter_chain.py +0 -0
  674. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_permission_matrix.py +0 -0
  675. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_permission_mode_promotions.py +0 -0
  676. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_permission_posture.py +0 -0
  677. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_persistent_subagent.py +0 -0
  678. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase1_foundation.py +0 -0
  679. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase1_pipeline.py +0 -0
  680. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase2_agent_loop.py +0 -0
  681. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase2_tools.py +0 -0
  682. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase3_context_memory.py +0 -0
  683. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase4_think_agent_evaluate.py +0 -0
  684. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase5_emit_presets_mcp.py +0 -0
  685. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase5_environment.py +0 -0
  686. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase6_history.py +0 -0
  687. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase6_integration.py +0 -0
  688. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase7_security.py +0 -0
  689. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase9a_preset_regen.py +0 -0
  690. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase9a_scaffolding.py +0 -0
  691. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_pipeline_aclose.py +0 -0
  692. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_pipeline_attach_runtime.py +0 -0
  693. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_pipeline_events_tap.py +0 -0
  694. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_pipeline_from_manifest.py +0 -0
  695. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_pipeline_hook_lifecycle.py +0 -0
  696. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_pipeline_session_runtime.py +0 -0
  697. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_plan_mode_tools.py +0 -0
  698. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_primary_provider_and_build_reports.py +0 -0
  699. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_progressive_disclosure.py +0 -0
  700. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_provider_driven_strategy.py +0 -0
  701. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_push_notification_tool.py +0 -0
  702. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_qdrant_vector_store.py +0 -0
  703. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_refresh_backlinks_extension.py +0 -0
  704. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_refresh_runtime_and_run_lock.py +0 -0
  705. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_resolve_model_config.py +0 -0
  706. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_restore_bad_strategy_config.py +0 -0
  707. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_reviewer_policy_configure.py +0 -0
  708. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_runtime_task_runner.py +0 -0
  709. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s06_chunk_forwarding.py +0 -0
  710. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s06_provider_selection.py +0 -0
  711. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s13_file_backed_registry.py +0 -0
  712. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s13_task_registry_output.py +0 -0
  713. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s19_frequency_policy.py +0 -0
  714. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9b1_tool_review.py +0 -0
  715. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9b2_task_registry.py +0 -0
  716. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9b3_hitl.py +0 -0
  717. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9b4_summarize.py +0 -0
  718. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9b5_persist.py +0 -0
  719. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9c1_pipeline_resume.py +0 -0
  720. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9c2_restore_state.py +0 -0
  721. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_sandbox_exec_tool.py +0 -0
  722. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_sandbox_path_mapping.py +0 -0
  723. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_sandbox_tools.py +0 -0
  724. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_security_hardening.py +0 -0
  725. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_self_modifying_env.py +0 -0
  726. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_send_message_tool.py +0 -0
  727. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_settings_loader.py +0 -0
  728. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_level3_resources.py +0 -0
  729. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_1.py +0 -0
  730. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_2.py +0 -0
  731. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_3.py +0 -0
  732. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_4_bundled.py +0 -0
  733. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_5_fork.py +0 -0
  734. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_6_killer.py +0 -0
  735. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_7_watcher.py +0 -0
  736. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_richer_schema.py +0 -0
  737. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_tool.py +0 -0
  738. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skills_foundation.py +0 -0
  739. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_slash_built_in_control.py +0 -0
  740. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_slash_built_in_introspection.py +0 -0
  741. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_slash_commands.py +0 -0
  742. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_slash_md_template.py +0 -0
  743. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_sql_stm_session_scope.py +0 -0
  744. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_ssh_tools.py +0 -0
  745. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_stage10_ask_hitl.py +0 -0
  746. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_stage10_hook_wiring.py +0 -0
  747. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_stage10_partition_executor.py +0 -0
  748. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_stage10_permission_matrix.py +0 -0
  749. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_stage19_session_summary.py +0 -0
  750. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_state_mutation_wiring.py +0 -0
  751. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_state_shared_and_local.py +0 -0
  752. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_stm_append_event.py +0 -0
  753. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_storage_growth_caps.py +0 -0
  754. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_strategy_config_roundtrip.py +0 -0
  755. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_streaming_tool_executor.py +0 -0
  756. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_structured_output_parser.py +0 -0
  757. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_structured_reflection.py +0 -0
  758. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_catalog.py +0 -0
  759. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_credential_propagation.py +0 -0
  760. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_descriptor.py +0 -0
  761. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_manifest_compile.py +0 -0
  762. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_orchestrator_zero_arg.py +0 -0
  763. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_parallel.py +0 -0
  764. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_pipeline_lifecycle.py +0 -0
  765. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_type_orchestrator.py +0 -0
  766. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_task_tools.py +0 -0
  767. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_text_tool_protocol.py +0 -0
  768. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_todo_write_tool.py +0 -0
  769. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_abc_uplift.py +0 -0
  770. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_call_events.py +0 -0
  771. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_errors.py +0 -0
  772. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_lifecycle_hooks.py +0 -0
  773. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_pair_repair.py +0 -0
  774. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_plugins.py +0 -0
  775. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_provider.py +0 -0
  776. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_result_persistence.py +0 -0
  777. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_results_end_the_turn.py +0 -0
  778. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_search_tool.py +0 -0
  779. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_stage_max_concurrency.py +0 -0
  780. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_ttft_cache_overhaul.py +0 -0
  781. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_ttft_critical_path.py +0 -0
  782. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_ttft_warmup_streaming.py +0 -0
  783. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_turn_boundary_state.py +0 -0
  784. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_validate_manifest.py +0 -0
  785. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_vault_map_drill.py +0 -0
  786. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_web_fetch_tool.py +0 -0
  787. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_web_search_backends.py +0 -0
  788. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_web_search_tool.py +0 -0
  789. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_workspace.py +0 -0
  790. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_workspace_propagation.py +0 -0
  791. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_workspace_tools.py +0 -0
  792. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_workspace_tools_integration.py +0 -0
  793. {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_worktree_tools.py +0 -0
  794. {geny_executor-2.71.0 → geny_executor-2.72.0}/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.0
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.0"
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(
@@ -290,6 +355,12 @@ class BaseClient(ABC):
290
355
  return request
291
356
 
292
357
  # ── images a backend cannot see ──────────────────────────────────
358
+
359
+ #: What a lowered image leaves behind. A sentence, not an empty slot:
360
+ #: the model has to be able to tell "there was a picture I cannot see"
361
+ #: from "there was nothing here".
362
+ _IMAGE_PLACEHOLDER = "[an image was attached here; this model cannot see images]"
363
+
293
364
  def _lower_unseeable_images(self, request: APIRequest) -> None:
294
365
  """Replace image blocks this client cannot see with a note saying so.
295
366
 
@@ -305,39 +376,67 @@ class BaseClient(ABC):
305
376
  * say an image was here and could not be shown, which is what this
306
377
  does, alongside a ``llm_client.field_dropped`` event so the host
307
378
  can say so too.
379
+
380
+ Two places carry images and they are gated separately: a block on
381
+ the message itself (the user attached it) and a block nested inside
382
+ a ``tool_result`` (a tool returned it — a screenshot, a rendered
383
+ chart). Some backends take the first and reject the second, so
384
+ ``supports_vision_tool_results`` decides the nested ones.
308
385
  """
309
386
  caps = self.capabilities
310
387
  if caps.supports_vision and caps.supports_vision_tool_results:
311
388
  return
312
-
389
+ tool_results_ok = caps.supports_vision and caps.supports_vision_tool_results
390
+
391
+ # Copy-on-write, all the way down. ``request.messages`` is a SHALLOW
392
+ # copy of the caller's list, so editing a block in place would edit
393
+ # the pipeline's canonical history — and one turn on a text-only hop
394
+ # would destroy the image for every later turn, including the ones on
395
+ # a model that could have seen it. The degradation ends with this
396
+ # request.
313
397
  lowered = 0
314
- for message in request.messages:
398
+ for position, message in enumerate(request.messages):
315
399
  content = message.get("content")
316
400
  if not isinstance(content, list):
317
401
  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] = []
402
+ replaced: List[Any] = []
403
+ changed = False
329
404
  for block in content:
330
- if isinstance(block, dict) and block.get("type") == "image":
405
+ if not isinstance(block, dict):
406
+ replaced.append(block)
407
+ continue
408
+ btype = block.get("type")
409
+ if btype == "image" and not caps.supports_vision:
410
+ replaced.append({"type": "text", "text": self._IMAGE_PLACEHOLDER})
331
411
  lowered += 1
332
- replaced.append(
333
- {
334
- "type": "text",
335
- "text": "[an image was attached here; this model cannot see images]",
336
- }
337
- )
412
+ changed = True
413
+ elif btype == "tool_result" and not tool_results_ok:
414
+ inner = block.get("content")
415
+ if not isinstance(inner, list):
416
+ replaced.append(block)
417
+ continue
418
+ # An image a TOOL returned lives one level down, inside
419
+ # the tool_result's own content list — which is why the
420
+ # top-level scan alone would have found nothing to lower
421
+ # on exactly the turn that needed it (a screenshot).
422
+ inner_replaced: List[Any] = []
423
+ inner_changed = False
424
+ for inner_block in inner:
425
+ if isinstance(inner_block, dict) and inner_block.get("type") == "image":
426
+ inner_replaced.append({"type": "text", "text": self._IMAGE_PLACEHOLDER})
427
+ lowered += 1
428
+ inner_changed = True
429
+ else:
430
+ inner_replaced.append(inner_block)
431
+ if inner_changed:
432
+ replaced.append({**block, "content": inner_replaced})
433
+ changed = True
434
+ else:
435
+ replaced.append(block)
338
436
  else:
339
437
  replaced.append(block)
340
- message["content"] = replaced
438
+ if changed:
439
+ request.messages[position] = {**message, "content": replaced}
341
440
 
342
441
  if lowered:
343
442
  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)
@@ -0,0 +1,187 @@
1
+ """One client class, endpoints with nothing in common behind it.
2
+
3
+ ``custom`` is how Geny reaches OpenRouter *and* a laptop's llama.cpp; the
4
+ one ``vllm`` class serves a tool-calling Qwen and a plain text model. The
5
+ class has to declare the weakest of them, so whoever configured the endpoint
6
+ gets to amend it — at construction, from the account row.
7
+
8
+ The regression that made this necessary: defaulting ``supports_vision`` to
9
+ False was right for a local server and silently turned every image sent
10
+ through OpenRouter into "[an image was attached here]".
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import pytest
16
+
17
+ from geny_executor.core.pipeline import _creds_to_client_kwargs
18
+ from geny_executor.llm_client.base import BaseClient, ClientCapabilities
19
+ from geny_executor.llm_client.credentials import ProviderCredentials
20
+
21
+
22
+ class _Probe(BaseClient):
23
+ provider = "probe"
24
+ capabilities = ClientCapabilities(supports_tools=False, drops=("tools",))
25
+
26
+ async def _send(self, request, *, purpose: str = ""): # pragma: no cover
27
+ raise NotImplementedError
28
+
29
+ async def create_message_stream(self, **_kw): # pragma: no cover
30
+ raise NotImplementedError
31
+ yield {}
32
+
33
+
34
+ class TestADeclarationFromTheHost:
35
+ def test_a_flag_is_raised(self) -> None:
36
+ client = _Probe()
37
+ client.apply_capability_overrides({"supports_vision": True})
38
+ assert client.capabilities.supports_vision is True
39
+
40
+ def test_a_flag_is_lowered(self) -> None:
41
+ client = _Probe()
42
+ client.apply_capability_overrides({"supports_streaming": False})
43
+ assert client.capabilities.supports_streaming is False
44
+
45
+ def test_json_truthiness_becomes_a_real_boolean(self) -> None:
46
+ """The declaration arrives from a database row via JSON, where a
47
+ 1 and a "true" are both how someone spells yes."""
48
+ client = _Probe()
49
+ client.apply_capability_overrides({"supports_vision": 1})
50
+ assert client.capabilities.supports_vision is True
51
+
52
+ def test_a_non_boolean_field_is_not_coerced(self) -> None:
53
+ client = _Probe()
54
+ client.apply_capability_overrides({"streaming_granularity": "message"})
55
+ assert client.capabilities.streaming_granularity == "message"
56
+
57
+ def test_an_unknown_flag_is_ignored_not_raised(self) -> None:
58
+ """It comes from config. A typo in a settings page must not take the
59
+ turn down, and a flag from a newer library version must not either."""
60
+ client = _Probe()
61
+ client.apply_capability_overrides({"supports_telepathy": True, "supports_vision": True})
62
+ assert client.capabilities.supports_vision is True
63
+
64
+ def test_nothing_declared_changes_nothing(self) -> None:
65
+ client = _Probe()
66
+ before = client.capabilities
67
+ client.apply_capability_overrides(None)
68
+ client.apply_capability_overrides({})
69
+ assert client.capabilities is before
70
+
71
+ def test_only_this_instance_is_affected(self) -> None:
72
+ """Two accounts on the same class, one an aggregator and one a local
73
+ box — the second must not inherit the first's declaration."""
74
+ one, two = _Probe(), _Probe()
75
+ one.apply_capability_overrides({"supports_vision": True})
76
+ assert two.capabilities.supports_vision is False
77
+ assert _Probe.capabilities.supports_vision is False
78
+
79
+
80
+ class TestTheDeclarationBeatsTheDropsTuple:
81
+ """``drops`` is written against the class's conservative defaults. An
82
+ upgrade that did not also amend the drops would restore the flag and
83
+ still strip the field — the flag would read as a lie."""
84
+
85
+ def test_restoring_tools_really_sends_them(self) -> None:
86
+ from geny_executor.core.config import ModelConfig
87
+
88
+ client = _Probe()
89
+ client.apply_capability_overrides({"supports_tools": True})
90
+ request = client._build_request(
91
+ model_config=ModelConfig(model="m"),
92
+ messages=[{"role": "user", "content": "hi"}],
93
+ system="",
94
+ tools=[{"name": "Read", "input_schema": {}}],
95
+ tool_choice=None,
96
+ stream=False,
97
+ )
98
+ assert request.tools
99
+
100
+
101
+ class TestVLLM:
102
+ """A vLLM server is whatever model it loaded — which is why the class
103
+ says no tools and why an account has to be able to say otherwise."""
104
+
105
+ def test_the_class_still_assumes_nothing(self) -> None:
106
+ from geny_executor.llm_client.vllm import VLLMClient
107
+
108
+ assert VLLMClient.capabilities.supports_tools is False
109
+
110
+ def test_a_deployment_can_say_it_calls_tools(self) -> None:
111
+ from geny_executor.llm_client.vllm import VLLMClient
112
+
113
+ client = VLLMClient(
114
+ base_url="http://box:8000/v1",
115
+ capabilities={"supports_tools": True, "supports_tool_choice": True},
116
+ )
117
+ assert client.capabilities.supports_tools is True
118
+ assert client.capabilities.supports_tool_choice is True
119
+
120
+ def test_the_account_declaration_reaches_the_constructor(self) -> None:
121
+ """The gap this closes: a flag stored on the account that no code
122
+ path carried to the client is a setting that does nothing."""
123
+ kwargs = _creds_to_client_kwargs(
124
+ "vllm",
125
+ ProviderCredentials(
126
+ api_key="k",
127
+ base_url="http://box:8000/v1",
128
+ extras={"capabilities": {"supports_tools": True}},
129
+ ),
130
+ )
131
+ assert kwargs["capabilities"] == {"supports_tools": True}
132
+
133
+ def test_an_account_that_declares_nothing_sends_nothing(self) -> None:
134
+ kwargs = _creds_to_client_kwargs(
135
+ "vllm", ProviderCredentials(api_key="k", base_url="http://box:8000/v1")
136
+ )
137
+ assert "capabilities" not in kwargs
138
+
139
+
140
+ class TestTheOpenAICompatibleFamily:
141
+ @pytest.mark.parametrize("provider", ["custom", "ollama", "lmstudio"])
142
+ def test_the_account_declaration_reaches_the_constructor(self, provider: str) -> None:
143
+ kwargs = _creds_to_client_kwargs(
144
+ provider,
145
+ ProviderCredentials(
146
+ api_key="k",
147
+ base_url="https://openrouter.ai/api/v1",
148
+ extras={"capabilities": {"supports_vision": True}},
149
+ ),
150
+ )
151
+ assert kwargs["capabilities"] == {"supports_vision": True}
152
+
153
+ def test_an_aggregator_gets_its_vision_back(self) -> None:
154
+ """OpenRouter is reached as ``custom``. Without the declaration the
155
+ shared class assumes a text-only local server."""
156
+ from geny_executor.llm_client.openai_compatible import CustomOpenAIClient
157
+
158
+ default = CustomOpenAIClient(base_url="https://openrouter.ai/api/v1")
159
+ declared = CustomOpenAIClient(
160
+ base_url="https://openrouter.ai/api/v1",
161
+ capabilities={"supports_vision": True},
162
+ )
163
+ assert default.capabilities.supports_vision is False
164
+ assert declared.capabilities.supports_vision is True
165
+
166
+ def test_declaring_one_flag_leaves_the_rest_alone(self) -> None:
167
+ from geny_executor.llm_client.openai_compatible import CustomOpenAIClient
168
+
169
+ client = CustomOpenAIClient(
170
+ base_url="http://box:8080/v1", capabilities={"supports_vision": True}
171
+ )
172
+ assert client.capabilities.supports_tools is True
173
+ assert client.capabilities.supports_structured_output is True
174
+
175
+
176
+ class TestEveryCapabilityAwareClientTakesTheKwarg:
177
+ """Geny names these providers as the ones it may declare for. A client
178
+ that lost the parameter would fail only on a live turn."""
179
+
180
+ @pytest.mark.parametrize("provider", ["custom", "local", "ollama", "lmstudio", "vllm"])
181
+ def test_the_constructor_accepts_it(self, provider: str) -> None:
182
+ import inspect
183
+
184
+ from geny_executor.llm_client.registry import ClientRegistry
185
+
186
+ params = inspect.signature(ClientRegistry.get(provider).__init__).parameters
187
+ assert "capabilities" in params