geny-executor 2.65.0__tar.gz → 2.65.2__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 (797) hide show
  1. {geny_executor-2.65.0 → geny_executor-2.65.2}/PKG-INFO +1 -1
  2. {geny_executor-2.65.0 → geny_executor-2.65.2}/pyproject.toml +1 -1
  3. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/_cli_runtime.py +155 -28
  4. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/claude_code.py +38 -2
  5. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/_fixtures/fake_claude.py +27 -0
  6. geny_executor-2.65.2/tests/llm_client/unit/test_cli_leaked_stdout.py +135 -0
  7. geny_executor-2.65.2/tests/unit/test_cli_hot_spare_liveness.py +101 -0
  8. {geny_executor-2.65.0 → geny_executor-2.65.2}/.gitignore +0 -0
  9. {geny_executor-2.65.0 → geny_executor-2.65.2}/LICENSE +0 -0
  10. {geny_executor-2.65.0 → geny_executor-2.65.2}/NOTICE +0 -0
  11. {geny_executor-2.65.0 → geny_executor-2.65.2}/README.md +0 -0
  12. {geny_executor-2.65.0 → geny_executor-2.65.2}/README_ko.md +0 -0
  13. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/__init__.py +0 -0
  14. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/audio/__init__.py +0 -0
  15. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/audio/stt/__init__.py +0 -0
  16. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/audio/stt/openai_compatible.py +0 -0
  17. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/audio/stt/provider.py +0 -0
  18. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/audio/stt/registry.py +0 -0
  19. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/channels/__init__.py +0 -0
  20. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/channels/built_in.py +0 -0
  21. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/channels/factory.py +0 -0
  22. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/channels/send_message_channel.py +0 -0
  23. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/channels/user_file_channel.py +0 -0
  24. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/__init__.py +0 -0
  25. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/artifact.py +0 -0
  26. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/builder.py +0 -0
  27. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/compaction.py +0 -0
  28. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/config.py +0 -0
  29. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/context_prune.py +0 -0
  30. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/diff.py +0 -0
  31. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/environment.py +0 -0
  32. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/environment_control.py +0 -0
  33. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/errors.py +0 -0
  34. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/introspection.py +0 -0
  35. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/manifest_factory.py +0 -0
  36. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/message_repair.py +0 -0
  37. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/mutation.py +0 -0
  38. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/pipeline.py +0 -0
  39. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/presets.py +0 -0
  40. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/result.py +0 -0
  41. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/schema.py +0 -0
  42. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/shared_keys.py +0 -0
  43. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/slot.py +0 -0
  44. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/snapshot.py +0 -0
  45. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/stage.py +0 -0
  46. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/state.py +0 -0
  47. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/core/token_estimate.py +0 -0
  48. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/cron/__init__.py +0 -0
  49. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/cron/runner.py +0 -0
  50. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/cron/store_abc.py +0 -0
  51. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/cron/store_impl/__init__.py +0 -0
  52. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/cron/store_impl/file_backed.py +0 -0
  53. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/cron/store_impl/in_memory.py +0 -0
  54. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/cron/types.py +0 -0
  55. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/events/__init__.py +0 -0
  56. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/events/bus.py +0 -0
  57. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/events/catalog.py +0 -0
  58. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/events/types.py +0 -0
  59. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/gateway/__init__.py +0 -0
  60. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/gateway/adapter.py +0 -0
  61. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/gateway/discord.py +0 -0
  62. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/gateway/factory.py +0 -0
  63. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/gateway/runner.py +0 -0
  64. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/gateway/slack.py +0 -0
  65. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/gateway/telegram.py +0 -0
  66. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/gateway/types.py +0 -0
  67. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/gateway/ws_base.py +0 -0
  68. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/history/__init__.py +0 -0
  69. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/history/ab_test.py +0 -0
  70. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/history/cost.py +0 -0
  71. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/history/models.py +0 -0
  72. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/history/monitor.py +0 -0
  73. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/history/replay.py +0 -0
  74. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/history/service.py +0 -0
  75. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/hooks/__init__.py +0 -0
  76. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/hooks/config.py +0 -0
  77. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/hooks/events.py +0 -0
  78. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/hooks/runner.py +0 -0
  79. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/__init__.py +0 -0
  80. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/anthropic.py +0 -0
  81. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/base.py +0 -0
  82. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/credentials.py +0 -0
  83. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/google.py +0 -0
  84. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/local_probe.py +0 -0
  85. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/model_discovery.py +0 -0
  86. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/openai.py +0 -0
  87. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/openai_compatible.py +0 -0
  88. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/profiles.py +0 -0
  89. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/registry.py +0 -0
  90. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/translators/__init__.py +0 -0
  91. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/translators/_canonical.py +0 -0
  92. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/translators/_cli.py +0 -0
  93. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/types.py +0 -0
  94. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/llm_client/vllm.py +0 -0
  95. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/__init__.py +0 -0
  96. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/_locks.py +0 -0
  97. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/_offload.py +0 -0
  98. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/_progressive.py +0 -0
  99. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/composite/__init__.py +0 -0
  100. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/composite/handles.py +0 -0
  101. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/composite/provider.py +0 -0
  102. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/composite/routing.py +0 -0
  103. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/composite/snapshot.py +0 -0
  104. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/embedding/__init__.py +0 -0
  105. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/embedding/client.py +0 -0
  106. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/embedding/google.py +0 -0
  107. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/embedding/local.py +0 -0
  108. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/embedding/openai.py +0 -0
  109. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/embedding/openai_compatible.py +0 -0
  110. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/embedding/registry.py +0 -0
  111. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/embedding/voyage.py +0 -0
  112. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/factory.py +0 -0
  113. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/facts.py +0 -0
  114. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/graph_rank.py +0 -0
  115. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/presets.py +0 -0
  116. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/provider.py +0 -0
  117. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/__init__.py +0 -0
  118. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/ephemeral.py +0 -0
  119. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/__init__.py +0 -0
  120. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/config.py +0 -0
  121. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/frontmatter.py +0 -0
  122. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/graph_edges.py +0 -0
  123. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/index_store.py +0 -0
  124. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/layout.py +0 -0
  125. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/ltm_store.py +0 -0
  126. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/notes_store.py +0 -0
  127. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/provider.py +0 -0
  128. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/snapshot.py +0 -0
  129. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/stm_store.py +0 -0
  130. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/timezone.py +0 -0
  131. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/file/vector_store.py +0 -0
  132. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/sql/__init__.py +0 -0
  133. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/sql/config.py +0 -0
  134. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/sql/connection.py +0 -0
  135. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/sql/index_store.py +0 -0
  136. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/sql/ltm_store.py +0 -0
  137. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/sql/notes_store.py +0 -0
  138. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/sql/provider.py +0 -0
  139. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/sql/schema.py +0 -0
  140. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/sql/snapshot.py +0 -0
  141. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/sql/stm_store.py +0 -0
  142. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/providers/sql/vector_store.py +0 -0
  143. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/retriever.py +0 -0
  144. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/rollup.py +0 -0
  145. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/strategy.py +0 -0
  146. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/vector/__init__.py +0 -0
  147. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/memory/vector/qdrant_store.py +0 -0
  148. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/notifications/__init__.py +0 -0
  149. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/notifications/registry.py +0 -0
  150. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/permission/__init__.py +0 -0
  151. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/permission/loader.py +0 -0
  152. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/permission/matrix.py +0 -0
  153. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/permission/types.py +0 -0
  154. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/py.typed +0 -0
  155. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/runtime/__init__.py +0 -0
  156. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/runtime/task_executors.py +0 -0
  157. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/runtime/task_runner.py +0 -0
  158. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/security/__init__.py +0 -0
  159. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/security/import_validator.py +0 -0
  160. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/security/script_sandbox.py +0 -0
  161. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/session/__init__.py +0 -0
  162. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/session/freshness.py +0 -0
  163. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/session/manager.py +0 -0
  164. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/session/persistence.py +0 -0
  165. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/session/session.py +0 -0
  166. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/settings/__init__.py +0 -0
  167. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/settings/loader.py +0 -0
  168. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/settings/section_registry.py +0 -0
  169. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/__init__.py +0 -0
  170. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled/batch/SKILL.md +0 -0
  171. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled/debug/SKILL.md +0 -0
  172. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled/environment/REFERENCE.md +0 -0
  173. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled/environment/SKILL.md +0 -0
  174. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled/loop/SKILL.md +0 -0
  175. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled/lorem-ipsum/SKILL.md +0 -0
  176. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled/simplify/SKILL.md +0 -0
  177. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled/skillify/SKILL.md +0 -0
  178. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled/stuck/SKILL.md +0 -0
  179. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled/tool-builder/REFERENCE.md +0 -0
  180. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled/tool-builder/SKILL.md +0 -0
  181. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled/verify/SKILL.md +0 -0
  182. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/bundled_skills.py +0 -0
  183. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/fork.py +0 -0
  184. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/frontmatter.py +0 -0
  185. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/loader.py +0 -0
  186. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/mcp_bridge.py +0 -0
  187. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/path_match.py +0 -0
  188. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/registry.py +0 -0
  189. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/shell_blocks.py +0 -0
  190. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/skill_tool.py +0 -0
  191. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/types.py +0 -0
  192. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/skills/watcher.py +0 -0
  193. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/__init__.py +0 -0
  194. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/__init__.py +0 -0
  195. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/_helpers.py +0 -0
  196. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/cancel.py +0 -0
  197. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/clear.py +0 -0
  198. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/compact.py +0 -0
  199. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/config.py +0 -0
  200. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/context.py +0 -0
  201. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/cost.py +0 -0
  202. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/help.py +0 -0
  203. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/memory.py +0 -0
  204. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/model.py +0 -0
  205. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/preset_info.py +0 -0
  206. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/status.py +0 -0
  207. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/built_in/tasks.py +0 -0
  208. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/md_template.py +0 -0
  209. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/parser.py +0 -0
  210. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/registry.py +0 -0
  211. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/slash_commands/types.py +0 -0
  212. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/__init__.py +0 -0
  213. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s01_input/__init__.py +0 -0
  214. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s01_input/artifact/__init__.py +0 -0
  215. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s01_input/artifact/default/__init__.py +0 -0
  216. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s01_input/artifact/default/normalizers.py +0 -0
  217. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s01_input/artifact/default/stage.py +0 -0
  218. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s01_input/artifact/default/validators.py +0 -0
  219. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s01_input/interface.py +0 -0
  220. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s01_input/normalizers.py +0 -0
  221. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s01_input/stage.py +0 -0
  222. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s01_input/types.py +0 -0
  223. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s01_input/validators.py +0 -0
  224. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/__init__.py +0 -0
  225. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/artifact/__init__.py +0 -0
  226. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/artifact/default/__init__.py +0 -0
  227. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/artifact/default/compactors.py +0 -0
  228. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/artifact/default/retrievers.py +0 -0
  229. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/artifact/default/stage.py +0 -0
  230. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/artifact/default/strategies.py +0 -0
  231. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/compactors.py +0 -0
  232. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/interface.py +0 -0
  233. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/retrievers.py +0 -0
  234. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/stage.py +0 -0
  235. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/strategies.py +0 -0
  236. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s02_context/types.py +0 -0
  237. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s03_system/__init__.py +0 -0
  238. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s03_system/artifact/__init__.py +0 -0
  239. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s03_system/artifact/default/__init__.py +0 -0
  240. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s03_system/artifact/default/builders.py +0 -0
  241. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s03_system/artifact/default/stage.py +0 -0
  242. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s03_system/builders.py +0 -0
  243. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s03_system/interface.py +0 -0
  244. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s03_system/persona/__init__.py +0 -0
  245. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s03_system/persona/builder.py +0 -0
  246. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s03_system/persona/provider.py +0 -0
  247. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s03_system/stage.py +0 -0
  248. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s04_guard/__init__.py +0 -0
  249. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s04_guard/artifact/__init__.py +0 -0
  250. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s04_guard/artifact/default/__init__.py +0 -0
  251. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s04_guard/artifact/default/guards.py +0 -0
  252. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s04_guard/artifact/default/stage.py +0 -0
  253. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s04_guard/guards.py +0 -0
  254. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s04_guard/interface.py +0 -0
  255. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s04_guard/stage.py +0 -0
  256. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s04_guard/types.py +0 -0
  257. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s05_cache/__init__.py +0 -0
  258. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s05_cache/artifact/__init__.py +0 -0
  259. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s05_cache/artifact/default/__init__.py +0 -0
  260. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s05_cache/artifact/default/stage.py +0 -0
  261. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s05_cache/artifact/default/strategies.py +0 -0
  262. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s05_cache/interface.py +0 -0
  263. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s05_cache/stage.py +0 -0
  264. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s05_cache/strategies.py +0 -0
  265. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/__init__.py +0 -0
  266. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/_translate.py +0 -0
  267. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/artifact/__init__.py +0 -0
  268. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/artifact/default/__init__.py +0 -0
  269. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/artifact/default/providers.py +0 -0
  270. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/artifact/default/retry.py +0 -0
  271. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/artifact/default/router.py +0 -0
  272. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/artifact/default/stage.py +0 -0
  273. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/artifact/default/tool_loop.py +0 -0
  274. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/artifact/google/__init__.py +0 -0
  275. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/artifact/google/providers.py +0 -0
  276. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/artifact/openai/__init__.py +0 -0
  277. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/artifact/openai/providers.py +0 -0
  278. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/interface.py +0 -0
  279. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/providers.py +0 -0
  280. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/retry.py +0 -0
  281. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/stage.py +0 -0
  282. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s06_api/types.py +0 -0
  283. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s07_token/__init__.py +0 -0
  284. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s07_token/artifact/__init__.py +0 -0
  285. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s07_token/artifact/default/__init__.py +0 -0
  286. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s07_token/artifact/default/pricing.py +0 -0
  287. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s07_token/artifact/default/stage.py +0 -0
  288. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s07_token/artifact/default/trackers.py +0 -0
  289. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s07_token/interface.py +0 -0
  290. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s07_token/pricing.py +0 -0
  291. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s07_token/stage.py +0 -0
  292. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s07_token/trackers.py +0 -0
  293. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s08_think/__init__.py +0 -0
  294. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s08_think/artifact/default/__init__.py +0 -0
  295. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s08_think/artifact/default/budget.py +0 -0
  296. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s08_think/artifact/default/processors.py +0 -0
  297. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s08_think/artifact/default/stage.py +0 -0
  298. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s08_think/interface.py +0 -0
  299. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s08_think/processors.py +0 -0
  300. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s08_think/stage.py +0 -0
  301. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s08_think/types.py +0 -0
  302. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s09_parse/__init__.py +0 -0
  303. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s09_parse/artifact/default/__init__.py +0 -0
  304. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s09_parse/artifact/default/parsers.py +0 -0
  305. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s09_parse/artifact/default/signals.py +0 -0
  306. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s09_parse/artifact/default/stage.py +0 -0
  307. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s09_parse/interface.py +0 -0
  308. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s09_parse/parsers.py +0 -0
  309. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s09_parse/signals.py +0 -0
  310. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s09_parse/stage.py +0 -0
  311. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s09_parse/types.py +0 -0
  312. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/__init__.py +0 -0
  313. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/artifact/__init__.py +0 -0
  314. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/artifact/default/__init__.py +0 -0
  315. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/artifact/default/executors.py +0 -0
  316. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/artifact/default/routers.py +0 -0
  317. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/artifact/default/stage.py +0 -0
  318. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/dispatcher.py +0 -0
  319. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/executors.py +0 -0
  320. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/interface.py +0 -0
  321. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/persistence.py +0 -0
  322. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/routers.py +0 -0
  323. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/stage.py +0 -0
  324. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/state_mutation.py +0 -0
  325. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s10_tool/streaming.py +0 -0
  326. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s11_tool_review/__init__.py +0 -0
  327. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s11_tool_review/artifact/__init__.py +0 -0
  328. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s11_tool_review/artifact/default/__init__.py +0 -0
  329. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s11_tool_review/artifact/default/reviewers.py +0 -0
  330. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s11_tool_review/artifact/default/stage.py +0 -0
  331. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s11_tool_review/interface.py +0 -0
  332. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s12_agent/__init__.py +0 -0
  333. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s12_agent/artifact/__init__.py +0 -0
  334. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s12_agent/artifact/default/__init__.py +0 -0
  335. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s12_agent/artifact/default/orchestrators.py +0 -0
  336. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s12_agent/artifact/default/stage.py +0 -0
  337. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s12_agent/interface.py +0 -0
  338. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s12_agent/orchestrators.py +0 -0
  339. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s12_agent/persistent_subagent.py +0 -0
  340. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s12_agent/stage.py +0 -0
  341. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s12_agent/subagent_catalog.py +0 -0
  342. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s12_agent/subagent_type.py +0 -0
  343. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s12_agent/types.py +0 -0
  344. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s13_task_registry/__init__.py +0 -0
  345. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s13_task_registry/artifact/__init__.py +0 -0
  346. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s13_task_registry/artifact/default/__init__.py +0 -0
  347. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s13_task_registry/artifact/default/file_backed_registry.py +0 -0
  348. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s13_task_registry/artifact/default/policies.py +0 -0
  349. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s13_task_registry/artifact/default/registry.py +0 -0
  350. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s13_task_registry/artifact/default/stage.py +0 -0
  351. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s13_task_registry/interface.py +0 -0
  352. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s13_task_registry/types.py +0 -0
  353. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s14_evaluate/__init__.py +0 -0
  354. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s14_evaluate/artifact/__init__.py +0 -0
  355. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/__init__.py +0 -0
  356. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/strategy.py +0 -0
  357. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s14_evaluate/artifact/default/__init__.py +0 -0
  358. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s14_evaluate/artifact/default/stage.py +0 -0
  359. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s14_evaluate/artifact/default/strategies.py +0 -0
  360. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s14_evaluate/interface.py +0 -0
  361. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s14_evaluate/stage.py +0 -0
  362. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s14_evaluate/strategies.py +0 -0
  363. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s14_evaluate/types.py +0 -0
  364. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s15_hitl/__init__.py +0 -0
  365. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s15_hitl/artifact/__init__.py +0 -0
  366. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s15_hitl/artifact/default/__init__.py +0 -0
  367. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s15_hitl/artifact/default/requesters.py +0 -0
  368. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s15_hitl/artifact/default/stage.py +0 -0
  369. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s15_hitl/artifact/default/timeouts.py +0 -0
  370. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s15_hitl/interface.py +0 -0
  371. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s15_hitl/types.py +0 -0
  372. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s16_loop/__init__.py +0 -0
  373. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s16_loop/artifact/__init__.py +0 -0
  374. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s16_loop/artifact/default/__init__.py +0 -0
  375. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s16_loop/artifact/default/controllers.py +0 -0
  376. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s16_loop/artifact/default/stage.py +0 -0
  377. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s16_loop/controllers.py +0 -0
  378. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s16_loop/interface.py +0 -0
  379. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s16_loop/stage.py +0 -0
  380. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s17_emit/__init__.py +0 -0
  381. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s17_emit/artifact/__init__.py +0 -0
  382. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s17_emit/artifact/default/__init__.py +0 -0
  383. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s17_emit/artifact/default/emitters.py +0 -0
  384. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s17_emit/artifact/default/stage.py +0 -0
  385. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s17_emit/emitters.py +0 -0
  386. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s17_emit/interface.py +0 -0
  387. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s17_emit/stage.py +0 -0
  388. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s17_emit/types.py +0 -0
  389. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s18_memory/__init__.py +0 -0
  390. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s18_memory/_dehydrate.py +0 -0
  391. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s18_memory/artifact/__init__.py +0 -0
  392. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s18_memory/artifact/default/__init__.py +0 -0
  393. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s18_memory/artifact/default/persistence.py +0 -0
  394. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s18_memory/artifact/default/stage.py +0 -0
  395. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s18_memory/artifact/default/strategies.py +0 -0
  396. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s18_memory/insight.py +0 -0
  397. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s18_memory/interface.py +0 -0
  398. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s18_memory/persistence.py +0 -0
  399. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s18_memory/stage.py +0 -0
  400. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s18_memory/strategies.py +0 -0
  401. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s19_summarize/__init__.py +0 -0
  402. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s19_summarize/artifact/__init__.py +0 -0
  403. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s19_summarize/artifact/default/__init__.py +0 -0
  404. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s19_summarize/artifact/default/importance.py +0 -0
  405. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s19_summarize/artifact/default/stage.py +0 -0
  406. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s19_summarize/artifact/default/summarizers.py +0 -0
  407. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s19_summarize/frequency_policy.py +0 -0
  408. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s19_summarize/interface.py +0 -0
  409. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s19_summarize/types.py +0 -0
  410. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s20_persist/__init__.py +0 -0
  411. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s20_persist/artifact/__init__.py +0 -0
  412. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s20_persist/artifact/default/__init__.py +0 -0
  413. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s20_persist/artifact/default/frequencies.py +0 -0
  414. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s20_persist/artifact/default/persisters.py +0 -0
  415. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s20_persist/artifact/default/stage.py +0 -0
  416. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s20_persist/interface.py +0 -0
  417. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s20_persist/restore.py +0 -0
  418. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s20_persist/types.py +0 -0
  419. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s21_yield/__init__.py +0 -0
  420. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s21_yield/artifact/__init__.py +0 -0
  421. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s21_yield/artifact/default/__init__.py +0 -0
  422. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s21_yield/artifact/default/formatters.py +0 -0
  423. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s21_yield/artifact/default/multi_format.py +0 -0
  424. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s21_yield/artifact/default/stage.py +0 -0
  425. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s21_yield/formatters.py +0 -0
  426. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s21_yield/interface.py +0 -0
  427. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/stages/s21_yield/stage.py +0 -0
  428. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/__init__.py +0 -0
  429. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/_sandbox.py +0 -0
  430. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/_ssh.py +0 -0
  431. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/adhoc.py +0 -0
  432. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/base.py +0 -0
  433. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/__init__.py +0 -0
  434. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/_path_guard.py +0 -0
  435. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/_ssh_store.py +0 -0
  436. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/_web_search_backends.py +0 -0
  437. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/agent_tool.py +0 -0
  438. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/ask_user_question_tool.py +0 -0
  439. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/atlassian_tools.py +0 -0
  440. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/audio_tools.py +0 -0
  441. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/bash_tool.py +0 -0
  442. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/browser_tools.py +0 -0
  443. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/cron_tools.py +0 -0
  444. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/dev_tools.py +0 -0
  445. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/doc_tools.py +0 -0
  446. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/edit_tool.py +0 -0
  447. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/env_tools.py +0 -0
  448. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/glob_tool.py +0 -0
  449. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/google_tools.py +0 -0
  450. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/grep_tool.py +0 -0
  451. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/mcp_wrapper_tools.py +0 -0
  452. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/notebook_edit_tool.py +0 -0
  453. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/operator_tools.py +0 -0
  454. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/plan_mode_tools.py +0 -0
  455. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/push_notification_tool.py +0 -0
  456. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/read_tool.py +0 -0
  457. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/sandbox_exec_tool.py +0 -0
  458. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/send_message_tool.py +0 -0
  459. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/ssh_tools.py +0 -0
  460. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/subagent_tools.py +0 -0
  461. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/task_tools.py +0 -0
  462. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/todo_write_tool.py +0 -0
  463. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/tool_search_tool.py +0 -0
  464. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/web_fetch_tool.py +0 -0
  465. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/web_search_tool.py +0 -0
  466. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/workspace_tools.py +0 -0
  467. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/worktree_tools.py +0 -0
  468. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/built_in/write_tool.py +0 -0
  469. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/composer.py +0 -0
  470. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/errors.py +0 -0
  471. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/mcp/__init__.py +0 -0
  472. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/mcp/adapter.py +0 -0
  473. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/mcp/credentials.py +0 -0
  474. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/mcp/errors.py +0 -0
  475. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/mcp/manager.py +0 -0
  476. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/mcp/oauth.py +0 -0
  477. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/mcp/state.py +0 -0
  478. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/mcp/uri.py +0 -0
  479. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/plugin.py +0 -0
  480. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/provider.py +0 -0
  481. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/providers.py +0 -0
  482. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/registry.py +0 -0
  483. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/sandbox.py +0 -0
  484. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/scope.py +0 -0
  485. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/tools/stage_binding.py +0 -0
  486. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/workspace/__init__.py +0 -0
  487. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/workspace/stack.py +0 -0
  488. {geny_executor-2.65.0 → geny_executor-2.65.2}/src/geny_executor/workspace/types.py +0 -0
  489. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/__init__.py +0 -0
  490. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/_fixtures/__init__.py +0 -0
  491. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/_fixtures/fake_echo_cli.py +0 -0
  492. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/_fixtures/geny_manifest_layout.json +0 -0
  493. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/_fixtures/manifest_entries.py +0 -0
  494. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/__init__.py +0 -0
  495. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/conftest.py +0 -0
  496. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/fixtures/__init__.py +0 -0
  497. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/fixtures/adapter/__init__.py +0 -0
  498. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/fixtures/adapter/adapter.py +0 -0
  499. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/test_c1_six_layer_retrieval.py +0 -0
  500. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/test_c2_execution_recording.py +0 -0
  501. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/test_c3_reflection_and_promotion.py +0 -0
  502. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/test_c4_rest_coverage.py +0 -0
  503. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/test_c5_embedding_migration.py +0 -0
  504. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/test_c6_session_resume.py +0 -0
  505. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/test_c7_adapter_parity.py +0 -0
  506. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/completeness/test_spec_loads.py +0 -0
  507. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/__init__.py +0 -0
  508. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/memory_provider_contract.py +0 -0
  509. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_embedding_clients.py +0 -0
  510. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_error_codes_stability.py +0 -0
  511. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_embedding_credentials.py +0 -0
  512. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_auto_vector.py +0 -0
  513. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_composite.py +0 -0
  514. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_composite_routing.py +0 -0
  515. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_curated_global.py +0 -0
  516. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_ephemeral.py +0 -0
  517. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_factory.py +0 -0
  518. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_file.py +0 -0
  519. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_file_layout.py +0 -0
  520. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_file_vector.py +0 -0
  521. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_sql.py +0 -0
  522. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_sql_dialect.py +0 -0
  523. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_sql_schema.py +0 -0
  524. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_provider_sql_vector.py +0 -0
  525. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_memory_vector_breaker.py +0 -0
  526. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/contract/test_stage_uniformity.py +0 -0
  527. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/integration/test_cycle_ab_cross_import.py +0 -0
  528. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/integration/test_integration.py +0 -0
  529. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/__init__.py +0 -0
  530. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/conformance/__init__.py +0 -0
  531. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/conformance/harness.py +0 -0
  532. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/conformance/test_anthropic.py +0 -0
  533. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/conformance/test_claude_code_cli.py +0 -0
  534. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/conformance/test_google.py +0 -0
  535. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/conformance/test_local_providers.py +0 -0
  536. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/conformance/test_openai.py +0 -0
  537. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/conformance/test_vllm.py +0 -0
  538. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/golden/__init__.py +0 -0
  539. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/golden/cli-2.1.149-json.json +0 -0
  540. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/golden/cli-2.1.149-json.meta +0 -0
  541. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/golden/cli-2.1.149-stream.jsonl +0 -0
  542. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/golden/cli-2.1.149-stream.meta +0 -0
  543. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/golden/cli-2.1.162-stream.jsonl +0 -0
  544. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/golden/cli-2.1.162-stream.meta +0 -0
  545. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/golden/test_golden_replay.py +0 -0
  546. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/live/__init__.py +0 -0
  547. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/live/test_live_canaries.py +0 -0
  548. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/__init__.py +0 -0
  549. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_anthropic_build_kwargs.py +0 -0
  550. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_anthropic_classify.py +0 -0
  551. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_base_client.py +0 -0
  552. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_claude_code.py +0 -0
  553. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_cli_cancellation.py +0 -0
  554. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_cli_event_forwarding.py +0 -0
  555. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_cli_prewarm.py +0 -0
  556. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_cli_runtime.py +0 -0
  557. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_container_runner.py +0 -0
  558. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_credentials.py +0 -0
  559. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_google_classify.py +0 -0
  560. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_local_probe.py +0 -0
  561. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_local_tool_repair.py +0 -0
  562. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_openai_client.py +0 -0
  563. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_profiles.py +0 -0
  564. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/llm_client/unit/test_translators_cli_claude_code.py +0 -0
  565. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/memory/test_note_delete_propagation.py +0 -0
  566. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/__init__.py +0 -0
  567. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_adaptive_model_router.py +0 -0
  568. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_adaptive_router_configure.py +0 -0
  569. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_adaptive_thinking_budget.py +0 -0
  570. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_adhoc_providers.py +0 -0
  571. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_agent_tool.py +0 -0
  572. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_api_timeout_kwarg.py +0 -0
  573. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_artifact_metadata.py +0 -0
  574. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_ask_user_question_tool.py +0 -0
  575. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_atlassian_tools.py +0 -0
  576. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_attach_llm_client_guard.py +0 -0
  577. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_audio_tools.py +0 -0
  578. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_binary_classify_manifest.py +0 -0
  579. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_browser_doc_tools.py +0 -0
  580. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_budget_compaction_recovery.py +0 -0
  581. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_built_in_autoregister.py +0 -0
  582. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_builtin_capabilities.py +0 -0
  583. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_builtin_channels.py +0 -0
  584. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_builtin_features.py +0 -0
  585. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_cache_prefix_key.py +0 -0
  586. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_cancellation.py +0 -0
  587. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_claude_code_nonstream_prompt.py +0 -0
  588. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_claude_code_vision_wire.py +0 -0
  589. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_cli_mcp_passthrough.py +0 -0
  590. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_cli_stream_limit.py +0 -0
  591. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_compaction_stm_watermark.py +0 -0
  592. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_composite_set_hooks.py +0 -0
  593. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_concurrent_runs.py +0 -0
  594. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_config_liveness.py +0 -0
  595. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_core_deferred_tools.py +0 -0
  596. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_cron_runner.py +0 -0
  597. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_cron_store.py +0 -0
  598. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_cron_tools.py +0 -0
  599. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_deterministic_prune_pass.py +0 -0
  600. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_dev_tools.py +0 -0
  601. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_diff_order_keyed.py +0 -0
  602. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_dynamic_persona_builder.py +0 -0
  603. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_embedding_error_classification.py +0 -0
  604. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_embedding_loop_safety.py +0 -0
  605. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_embedding_openai_compatible.py +0 -0
  606. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_errors_categories.py +0 -0
  607. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_evaluation_chain.py +0 -0
  608. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_evaluation_chain_configure.py +0 -0
  609. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_event_catalog.py +0 -0
  610. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_event_channel_unification.py +0 -0
  611. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_event_correlation.py +0 -0
  612. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_external_tool_resolution.py +0 -0
  613. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_forge_tool.py +0 -0
  614. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_fork_multi_provider.py +0 -0
  615. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_from_manifest_strict_validation.py +0 -0
  616. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_gateway.py +0 -0
  617. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_gateway_ws.py +0 -0
  618. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_geny_prod_manifest_repro.py +0 -0
  619. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_graph_edges.py +0 -0
  620. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_graph_rank.py +0 -0
  621. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_guard_fail_fast.py +0 -0
  622. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_hierarchical_sidecars.py +0 -0
  623. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_hook_gate_split.py +0 -0
  624. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_hook_in_process.py +0 -0
  625. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_hook_runner.py +0 -0
  626. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_hook_taxonomy.py +0 -0
  627. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_hooks_and_shared_keys.py +0 -0
  628. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_host_selections_resolve.py +0 -0
  629. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_identity_card_and_pinned.py +0 -0
  630. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_index_list_categories.py +0 -0
  631. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_index_render_vault_map.py +0 -0
  632. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_index_sidecar_coalescing.py +0 -0
  633. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_interaction_fields.py +0 -0
  634. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_internal_agentic_loop.py +0 -0
  635. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_introspection.py +0 -0
  636. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_llm_client_base.py +0 -0
  637. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_llm_client_capabilities.py +0 -0
  638. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_llm_client_registry.py +0 -0
  639. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_llm_client_request_types.py +0 -0
  640. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_llm_client_state.py +0 -0
  641. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_llm_compactor_selfwire.py +0 -0
  642. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_llm_summary_compactor.py +0 -0
  643. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_loop_agnostic_lock.py +0 -0
  644. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_manifest_factory.py +0 -0
  645. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_manifest_from_dict_hygiene.py +0 -0
  646. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_manifest_memory_wiring.py +0 -0
  647. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_manifest_provider_validation.py +0 -0
  648. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_manifest_subagents_memory_sections.py +0 -0
  649. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_manifest_v2.py +0 -0
  650. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_manifest_v3_migration.py +0 -0
  651. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_mcp_annotations_attach.py +0 -0
  652. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_mcp_credential_store.py +0 -0
  653. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_mcp_fsm.py +0 -0
  654. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_mcp_lifecycle.py +0 -0
  655. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_mcp_namespace.py +0 -0
  656. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_mcp_oauth.py +0 -0
  657. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_mcp_prompts_skills_bridge.py +0 -0
  658. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_mcp_resource_retriever.py +0 -0
  659. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_mcp_uri.py +0 -0
  660. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_mcp_wrapper_tools.py +0 -0
  661. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_memory_aware_retriever.py +0 -0
  662. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_memory_facts.py +0 -0
  663. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_memory_hooks_after_callbacks.py +0 -0
  664. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_memory_metadata_extension.py +0 -0
  665. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_memory_rollup.py +0 -0
  666. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_model_discovery.py +0 -0
  667. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_model_overrides.py +0 -0
  668. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_multi_dim_budget_configure.py +0 -0
  669. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_multi_dim_budget_controller.py +0 -0
  670. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_multi_format_yield.py +0 -0
  671. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_multi_provider.py +0 -0
  672. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_multimodal.py +0 -0
  673. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_note_graph_queries.py +0 -0
  674. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_notebook_edit_tool.py +0 -0
  675. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_notes_load_pinned.py +0 -0
  676. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_notes_store_offloop_scan.py +0 -0
  677. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_operator_tools.py +0 -0
  678. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_ordered_emitter_chain.py +0 -0
  679. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_permission_matrix.py +0 -0
  680. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_permission_mode_promotions.py +0 -0
  681. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_permission_posture.py +0 -0
  682. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_persistent_subagent.py +0 -0
  683. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase1_foundation.py +0 -0
  684. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase1_pipeline.py +0 -0
  685. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase2_agent_loop.py +0 -0
  686. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase2_tools.py +0 -0
  687. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase3_context_memory.py +0 -0
  688. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase4_think_agent_evaluate.py +0 -0
  689. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase5_emit_presets_mcp.py +0 -0
  690. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase5_environment.py +0 -0
  691. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase6_history.py +0 -0
  692. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase6_integration.py +0 -0
  693. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase7_security.py +0 -0
  694. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase9a_preset_regen.py +0 -0
  695. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_phase9a_scaffolding.py +0 -0
  696. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_pipeline_aclose.py +0 -0
  697. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_pipeline_attach_runtime.py +0 -0
  698. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_pipeline_events_tap.py +0 -0
  699. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_pipeline_from_manifest.py +0 -0
  700. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_pipeline_hook_lifecycle.py +0 -0
  701. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_pipeline_session_runtime.py +0 -0
  702. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_plan_mode_tools.py +0 -0
  703. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_primary_provider_and_build_reports.py +0 -0
  704. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_progressive_disclosure.py +0 -0
  705. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_provider_driven_strategy.py +0 -0
  706. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_push_notification_tool.py +0 -0
  707. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_qdrant_vector_store.py +0 -0
  708. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_refresh_backlinks_extension.py +0 -0
  709. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_refresh_runtime_and_run_lock.py +0 -0
  710. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_resolve_model_config.py +0 -0
  711. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_restore_bad_strategy_config.py +0 -0
  712. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_reviewer_policy_configure.py +0 -0
  713. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_runtime_task_runner.py +0 -0
  714. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_s06_chunk_forwarding.py +0 -0
  715. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_s06_provider_selection.py +0 -0
  716. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_s13_file_backed_registry.py +0 -0
  717. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_s13_task_registry_output.py +0 -0
  718. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_s19_frequency_policy.py +0 -0
  719. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_s9b1_tool_review.py +0 -0
  720. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_s9b2_task_registry.py +0 -0
  721. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_s9b3_hitl.py +0 -0
  722. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_s9b4_summarize.py +0 -0
  723. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_s9b5_persist.py +0 -0
  724. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_s9c1_pipeline_resume.py +0 -0
  725. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_s9c2_restore_state.py +0 -0
  726. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_sandbox_attach.py +0 -0
  727. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_sandbox_exec_tool.py +0 -0
  728. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_sandbox_path_mapping.py +0 -0
  729. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_sandbox_tools.py +0 -0
  730. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_security_hardening.py +0 -0
  731. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_self_modifying_env.py +0 -0
  732. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_send_message_tool.py +0 -0
  733. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_settings_loader.py +0 -0
  734. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_skill_level3_resources.py +0 -0
  735. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_skill_phase_10_1.py +0 -0
  736. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_skill_phase_10_2.py +0 -0
  737. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_skill_phase_10_3.py +0 -0
  738. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_skill_phase_10_4_bundled.py +0 -0
  739. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_skill_phase_10_5_fork.py +0 -0
  740. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_skill_phase_10_6_killer.py +0 -0
  741. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_skill_phase_10_7_watcher.py +0 -0
  742. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_skill_richer_schema.py +0 -0
  743. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_skill_tool.py +0 -0
  744. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_skills_foundation.py +0 -0
  745. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_slash_built_in_control.py +0 -0
  746. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_slash_built_in_introspection.py +0 -0
  747. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_slash_commands.py +0 -0
  748. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_slash_md_template.py +0 -0
  749. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_sql_stm_session_scope.py +0 -0
  750. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_ssh_tools.py +0 -0
  751. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_stage10_ask_hitl.py +0 -0
  752. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_stage10_hook_wiring.py +0 -0
  753. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_stage10_partition_executor.py +0 -0
  754. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_stage10_permission_matrix.py +0 -0
  755. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_stage19_session_summary.py +0 -0
  756. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_state_mutation_wiring.py +0 -0
  757. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_state_shared_and_local.py +0 -0
  758. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_stm_append_event.py +0 -0
  759. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_storage_growth_caps.py +0 -0
  760. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_strategy_config_roundtrip.py +0 -0
  761. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_streaming_tool_executor.py +0 -0
  762. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_structured_output_parser.py +0 -0
  763. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_structured_reflection.py +0 -0
  764. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_subagent_catalog.py +0 -0
  765. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_subagent_credential_propagation.py +0 -0
  766. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_subagent_descriptor.py +0 -0
  767. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_subagent_manifest_compile.py +0 -0
  768. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_subagent_orchestrator_zero_arg.py +0 -0
  769. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_subagent_parallel.py +0 -0
  770. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_subagent_pipeline_lifecycle.py +0 -0
  771. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_subagent_type_orchestrator.py +0 -0
  772. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_task_tools.py +0 -0
  773. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_todo_write_tool.py +0 -0
  774. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_tool_abc_uplift.py +0 -0
  775. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_tool_call_events.py +0 -0
  776. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_tool_errors.py +0 -0
  777. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_tool_lifecycle_hooks.py +0 -0
  778. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_tool_pair_repair.py +0 -0
  779. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_tool_plugins.py +0 -0
  780. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_tool_provider.py +0 -0
  781. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_tool_result_persistence.py +0 -0
  782. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_tool_search_tool.py +0 -0
  783. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_tool_stage_max_concurrency.py +0 -0
  784. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_ttft_cache_overhaul.py +0 -0
  785. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_ttft_critical_path.py +0 -0
  786. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_ttft_warmup_streaming.py +0 -0
  787. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_turn_boundary_state.py +0 -0
  788. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_validate_manifest.py +0 -0
  789. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_vault_map_drill.py +0 -0
  790. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_web_fetch_tool.py +0 -0
  791. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_web_search_backends.py +0 -0
  792. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_web_search_tool.py +0 -0
  793. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_workspace.py +0 -0
  794. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_workspace_propagation.py +0 -0
  795. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_workspace_tools.py +0 -0
  796. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_workspace_tools_integration.py +0 -0
  797. {geny_executor-2.65.0 → geny_executor-2.65.2}/tests/unit/test_worktree_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: geny-executor
3
- Version: 2.65.0
3
+ Version: 2.65.2
4
4
  Summary: Harness-engineered agent pipeline library with 21-stage dual-abstraction architecture, built on the Anthropic API
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.65.0"
7
+ version = "2.65.2"
8
8
  description = "Harness-engineered agent pipeline library with 21-stage dual-abstraction architecture, built on the Anthropic API"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -71,6 +71,12 @@ logger = logging.getLogger(__name__)
71
71
  # discarded, so the line is unrecoverable). Delegated heavy work makes
72
72
  # large tool results routine, so the default is deliberately generous:
73
73
  # 32 MiB (a cap, not an allocation — memory is used only per actual line).
74
+ #: How often the stream reader looks up from the pipe to check whether
75
+ #: the child is still alive. Only ever costs a wakeup when no line has
76
+ #: arrived, so a busy stream never pays it.
77
+ _EXIT_POLL_S = 0.25
78
+
79
+
74
80
  def _cli_stream_limit() -> int:
75
81
  raw = os.environ.get("GENY_CLI_STREAM_LIMIT", "").strip()
76
82
  try:
@@ -221,6 +227,22 @@ class CLIProcessRunner:
221
227
  cwd: Optional[str] = None
222
228
  timeout_s: float = 300.0
223
229
  kill_grace_s: float = 2.0
230
+ #: How long to keep reading stdout AFTER the child has exited.
231
+ #:
232
+ #: A pipe reaches EOF when the last writer closes it — which is not
233
+ #: the same event as "the child exited". The CLI spawns MCP servers
234
+ #: as its own children, and they inherit its stdout; one that
235
+ #: outlives it (or ignores the parent-death signal) holds the write
236
+ #: end open, so ``readline()`` blocks on a pipe nothing will ever
237
+ #: write to again. Waiting on EOF alone therefore parks the turn for
238
+ #: the FULL ``timeout_s`` — 2026-08-10 in production that was a dead
239
+ #: CLI (rc=0, output complete) and a turn that hung until a
240
+ #: host-side stall guard abandoned it minutes later.
241
+ #:
242
+ #: After exit, anything still in flight is bytes already written to
243
+ #: the pipe buffer, which drain immediately. This grace is generous
244
+ #: for that and short enough that a leaked FD costs seconds.
245
+ exit_drain_grace_s: float = 5.0
224
246
 
225
247
  def __post_init__(self) -> None:
226
248
  if not self.binary:
@@ -301,9 +323,15 @@ class CLIProcessRunner:
301
323
  stderr_task = asyncio.create_task(_collect_stderr(proc.stderr, stderr_buf))
302
324
 
303
325
  try:
304
- async for line in _aiter_lines(proc.stdout, timeout_s=self.timeout_s, start_t=t0):
326
+ async for line in _aiter_lines(
327
+ proc.stdout,
328
+ timeout_s=self.timeout_s,
329
+ start_t=t0,
330
+ proc=proc,
331
+ drain_grace_s=self.exit_drain_grace_s,
332
+ ):
305
333
  yield line
306
- rc = await proc.wait()
334
+ rc = await self._reap(proc)
307
335
  except CLITimeout:
308
336
  await self._kill_tree(proc)
309
337
  raise
@@ -355,10 +383,50 @@ class CLIProcessRunner:
355
383
  timeout=self.timeout_s,
356
384
  )
357
385
 
386
+ # ------------------------------------------------------------- reap
387
+ async def _reap(self, proc: asyncio.subprocess.Process) -> int:
388
+ """Exit status, without betting the turn on ``proc.wait()``.
389
+
390
+ ``wait()`` completes only when the child has exited AND every
391
+ pipe has disconnected. A survivor holding the inherited stdout
392
+ satisfies the first and blocks the second forever, so awaiting
393
+ it here would re-introduce exactly the hang the read loop just
394
+ escaped.
395
+
396
+ So: give ``wait()`` a short window, and if it does not land,
397
+ take the returncode the child watcher already recorded and kill
398
+ the process group — which is also what finally releases the
399
+ leaked descriptor.
400
+ """
401
+ try:
402
+ return await asyncio.wait_for(proc.wait(), timeout=self.kill_grace_s)
403
+ except asyncio.TimeoutError:
404
+ pass
405
+ rc = proc.returncode
406
+ if rc is None:
407
+ # Still genuinely running — the caller's ladder owns it.
408
+ return -1
409
+ logger.warning(
410
+ "CLI exited rc=%s but a pipe stayed open — killing the process "
411
+ "group to release it", rc,
412
+ )
413
+ await self._kill_tree(proc, force=True)
414
+ return rc
415
+
358
416
  # ------------------------------------------------------------- kill
359
- async def _kill_tree(self, proc: asyncio.subprocess.Process) -> None:
360
- """Send SIGTERM, wait grace, then SIGKILL the process group."""
361
- if proc.returncode is not None:
417
+ async def _kill_tree(
418
+ self, proc: asyncio.subprocess.Process, *, force: bool = False
419
+ ) -> None:
420
+ """Send SIGTERM, wait grace, then SIGKILL the process group.
421
+
422
+ ``force`` keeps going when the direct child is already reaped:
423
+ the group can still hold survivors it spawned — an MCP server
424
+ sitting on the inherited stdout — and those are precisely what
425
+ needs signalling. Without it the early return below reads "the
426
+ child is gone, nothing to kill", which is exactly wrong for the
427
+ case that leaks.
428
+ """
429
+ if proc.returncode is not None and not force:
362
430
  return
363
431
  try:
364
432
  if sys.platform != "win32":
@@ -512,33 +580,92 @@ async def _aiter_lines(
512
580
  *,
513
581
  timeout_s: float,
514
582
  start_t: float,
583
+ proc: Optional[asyncio.subprocess.Process] = None,
584
+ drain_grace_s: float = 5.0,
515
585
  ) -> AsyncIterator[bytes]:
586
+ """Yield stdout lines until EOF — or until the child is gone and quiet.
587
+
588
+ Once the child has exited, EOF is no longer guaranteed to arrive at
589
+ all: an inherited write end can keep the pipe open indefinitely. So
590
+ the read budget collapses to ``drain_grace_s`` from the moment the
591
+ exit is observed, and the iterator ends on the first quiet moment
592
+ instead of parking on ``timeout_s``. Bytes already in the pipe are
593
+ still delivered — draining a buffer is instant next to that grace.
594
+ """
516
595
  if stream is None:
517
596
  return
518
- while True:
519
- elapsed = time.monotonic() - start_t
520
- remaining = timeout_s - elapsed
521
- if remaining <= 0:
522
- raise CLITimeout(f"stream timeout after {timeout_s:.1f}s")
523
- try:
524
- line = await asyncio.wait_for(stream.readline(), timeout=remaining)
525
- except asyncio.TimeoutError as e:
526
- raise CLITimeout(f"stream readline timeout after {timeout_s:.1f}s") from e
527
- except ValueError as e:
528
- # asyncio raises ValueError("Separator is found, but chunk is
529
- # longer than limit") when ONE line exceeds the StreamReader
530
- # limit — and discards the buffered bytes, so the line is
531
- # unrecoverable. With the 32 MiB default this is near
532
- # impossible; if it still happens, losing ONE event beats
533
- # killing the whole delegated turn. Log loudly and continue.
534
- logger.warning(
535
- "CLI stream line exceeded the %d-byte limit — skipping one "
536
- "event and continuing (%s)", _cli_stream_limit(), e,
597
+ read_task: Optional[asyncio.Task[bytes]] = None
598
+ died_at: Optional[float] = None
599
+ try:
600
+ while True:
601
+ now = time.monotonic()
602
+ remaining = timeout_s - (now - start_t)
603
+ if remaining <= 0:
604
+ raise CLITimeout(f"stream timeout after {timeout_s:.1f}s")
605
+
606
+ # One read task, carried across iterations: a readline that
607
+ # loses the race must NOT be discarded, or the bytes it is
608
+ # mid-way through consuming are lost.
609
+ if read_task is None:
610
+ read_task = asyncio.ensure_future(stream.readline())
611
+
612
+ if died_at is None and proc is not None and proc.returncode is not None:
613
+ died_at = now
614
+ if died_at is not None:
615
+ grace_left = drain_grace_s - (now - died_at)
616
+ if grace_left <= 0:
617
+ logger.warning(
618
+ "CLI exited but stdout stayed open for %.1fs — ending "
619
+ "the stream (an inherited pipe write end is still "
620
+ "held; the answer is complete, the FD is not).",
621
+ drain_grace_s,
622
+ )
623
+ return
624
+ budget = min(remaining, grace_left)
625
+ else:
626
+ # Poll rather than await the child: ``proc.wait()`` cannot
627
+ # be the death signal here, because asyncio only completes
628
+ # it once every pipe has ALSO disconnected — which is the
629
+ # exact condition a leaked stdout FD prevents. The
630
+ # returncode, by contrast, is set the moment the child
631
+ # watcher reaps, pipes or no pipes.
632
+ budget = min(remaining, _EXIT_POLL_S)
633
+
634
+ done, _pending = await asyncio.wait(
635
+ {read_task}, timeout=budget, return_when=asyncio.FIRST_COMPLETED
537
636
  )
538
- continue
539
- if not line:
540
- return
541
- yield line
637
+
638
+ if read_task not in done:
639
+ if died_at is not None or budget < remaining:
640
+ # Either draining after exit, or just a poll tick with
641
+ # budget left — go round again.
642
+ continue
643
+ raise CLITimeout(f"stream readline timeout after {timeout_s:.1f}s")
644
+
645
+ try:
646
+ line = read_task.result()
647
+ except ValueError as e:
648
+ # asyncio raises ValueError("Separator is found, but chunk is
649
+ # longer than limit") when ONE line exceeds the StreamReader
650
+ # limit — and discards the buffered bytes, so the line is
651
+ # unrecoverable. With the 32 MiB default this is near
652
+ # impossible; if it still happens, losing ONE event beats
653
+ # killing the whole delegated turn. Log loudly and continue.
654
+ logger.warning(
655
+ "CLI stream line exceeded the %d-byte limit — skipping one "
656
+ "event and continuing (%s)", _cli_stream_limit(), e,
657
+ )
658
+ read_task = None
659
+ continue
660
+ finally:
661
+ if read_task is not None and read_task.done():
662
+ read_task = None
663
+ if not line:
664
+ return
665
+ yield line
666
+ finally:
667
+ if read_task is not None and not read_task.done():
668
+ read_task.cancel()
542
669
 
543
670
 
544
671
  async def _drain_stdin(
@@ -113,6 +113,29 @@ def _classify_cli_result(result: CLIResult, *, cli_version: str = "") -> APIErro
113
113
  )
114
114
 
115
115
 
116
+ def _process_alive(proc: Any) -> bool:
117
+ """Is this child still running, really?
118
+
119
+ ``asyncio.subprocess.Process.returncode`` is bookkeeping: it stays None
120
+ until the event loop reaps the child. A process that already exited can
121
+ therefore look alive indefinitely. Ask the kernel instead.
122
+ """
123
+ if getattr(proc, "returncode", None) is not None:
124
+ return False
125
+ pid = getattr(proc, "pid", None)
126
+ if not pid:
127
+ return False
128
+ try:
129
+ os.kill(pid, 0)
130
+ except ProcessLookupError:
131
+ return False
132
+ except PermissionError:
133
+ return True # exists, owned by someone else — still alive
134
+ except OSError:
135
+ return False
136
+ return True
137
+
138
+
116
139
  class ClaudeCodeCLIClient(BaseClient):
117
140
  """Subprocess-backed Claude Code client."""
118
141
 
@@ -276,7 +299,20 @@ class ClaudeCodeCLIClient(BaseClient):
276
299
  The spare is only valid for an IDENTICAL argv (model, MCP config,
277
300
  session resume flags, permissions — everything). Any drift means
278
301
  the prewarmed process was booted with stale config: discard it
279
- and spawn fresh. Also discards a spare that died while idle.
302
+ and spawn fresh.
303
+
304
+ It must also still be ALIVE, and ``returncode`` is not enough to
305
+ know that. It is only set once asyncio has reaped the child; a
306
+ process that exited without the transport noticing keeps
307
+ ``returncode is None`` forever, so a corpse reads as a healthy
308
+ spare. The turn then hands its prompt to a dead pipe and waits —
309
+ which is exactly what happened in production: the CLI started,
310
+ listed its tools, exited, and every subsequent turn stalled until a
311
+ watchdog abandoned it. Turning the prewarm off made the same
312
+ session answer in 11 s.
313
+
314
+ ``kill(pid, 0)`` costs a syscall and answers the question the
315
+ bookkeeping cannot.
280
316
  """
281
317
  spare = self._spare
282
318
  if spare is None:
@@ -286,7 +322,7 @@ class ClaudeCodeCLIClient(BaseClient):
286
322
  if expire_task is not None:
287
323
  expire_task.cancel()
288
324
  proc = spare["proc"]
289
- if spare["argv"] != list(argv) or proc.returncode is not None:
325
+ if spare["argv"] != list(argv) or not _process_alive(proc):
290
326
  self._discard_spare_proc(spare)
291
327
  return None
292
328
  return proc
@@ -474,6 +474,32 @@ def _stream_then_hang(argv: List[str]) -> int:
474
474
  return 0
475
475
 
476
476
 
477
+ def _leaky_child_then_exit(argv: List[str]) -> int:
478
+ """Answer in full, exit 0 — and leave a child holding stdout open.
479
+
480
+ This is the production failure of 2026-08-10, reduced. The real CLI
481
+ spawns MCP servers as its own children; they inherit its stdout. When
482
+ the CLI exits, the pipe does NOT reach EOF, because the write end is
483
+ still open in the survivor. A reader that waits for EOF alone waits
484
+ forever on a process that finished minutes ago — the turn hangs with
485
+ a complete answer sitting in it.
486
+
487
+ The forked child holds the FD and sleeps. It writes nothing: the
488
+ point is the open descriptor, not the data.
489
+ """
490
+ pid = os.fork()
491
+ if pid == 0: # child — inherits stdout, outlives the parent
492
+ try:
493
+ os.setsid()
494
+ except OSError:
495
+ pass
496
+ time.sleep(600)
497
+ os._exit(0)
498
+ rc = _ok_stream_event(argv)
499
+ sys.stdout.flush()
500
+ return rc
501
+
502
+
477
503
  def _permission_fail(argv: List[str]) -> int:
478
504
  sys.stderr.write("permission denied: tool Bash blocked by policy\n")
479
505
  return 1
@@ -520,6 +546,7 @@ SCENARIOS = {
520
546
  "ok_result_envelope": _ok_result_envelope,
521
547
  "stream_unknown_lines": _stream_unknown_lines,
522
548
  "stream_then_hang": _stream_then_hang,
549
+ "leaky_child_then_exit": _leaky_child_then_exit,
523
550
  "message_form_auth_failed": _message_form_auth_failed,
524
551
  "auth_fail": _auth_fail,
525
552
  "permission_fail": _permission_fail,
@@ -0,0 +1,135 @@
1
+ """A dead CLI must not be able to park a turn on its own stdout.
2
+
3
+ Production, 2026-08-10. Turns stopped answering. The stack said the
4
+ pipeline was inside ``_call_streaming``, awaiting the client's async
5
+ generator; the CLI trace said the very same invocation had exited
6
+ ``rc=0`` with a complete answer, seconds in. Both were true.
7
+
8
+ A pipe reaches EOF when the LAST writer closes it, and the CLI is not
9
+ the only writer: it spawns MCP servers as children and they inherit its
10
+ stdout. One that outlives it — a bridge that misses the parent-death
11
+ signal, a server mid-request — holds the write end open, and
12
+ ``readline()`` blocks on a pipe with nothing left to write to it. The
13
+ reader waited for EOF, so it waited for the full ``timeout_s``: 30
14
+ minutes of spinner over an answer that was already complete.
15
+
16
+ The fix reaps the child concurrently and, once it is gone, gives stdout
17
+ only ``exit_drain_grace_s`` to produce anything more. Buffered bytes
18
+ still arrive — draining a buffer is instant next to that grace.
19
+
20
+ ``leaky_child_then_exit`` reproduces the shape exactly: full stream-json
21
+ answer, clean exit, one forked child sitting on the inherited FD.
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ import asyncio
27
+ import os
28
+ import signal
29
+ import sys
30
+ import time
31
+ from pathlib import Path
32
+
33
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "..", "src"))
34
+
35
+ import pytest
36
+
37
+ from geny_executor.llm_client._cli_runtime import CLIProcessRunner
38
+
39
+
40
+ FAKE_CLAUDE = str(
41
+ (Path(__file__).resolve().parents[2] / "_fixtures" / "fake_claude.py")
42
+ )
43
+
44
+ STREAM_ARGV = ["--print", "--output-format", "stream-json"]
45
+
46
+
47
+ def _runner(scenario: str, **kwargs) -> CLIProcessRunner:
48
+ defaults = dict(binary=FAKE_CLAUDE, timeout_s=30.0, kill_grace_s=0.5)
49
+ defaults.update(kwargs)
50
+ return CLIProcessRunner(
51
+ env_extras={"FAKE_CLAUDE_SCENARIO": scenario}, **defaults
52
+ )
53
+
54
+
55
+ async def _collect(runner: CLIProcessRunner) -> list[bytes]:
56
+ return [line async for line in runner.stream(STREAM_ARGV)]
57
+
58
+
59
+ @pytest.mark.asyncio
60
+ async def test_exited_child_with_leaked_stdout_ends_the_stream() -> None:
61
+ """The stream ends on the drain grace, not on ``timeout_s``.
62
+
63
+ ``timeout_s`` is 30s and the grace 1s; the leaked child sleeps 600s.
64
+ Before the fix this test hung for the full 30s and then raised
65
+ ``CLITimeout``, losing a complete answer.
66
+ """
67
+ runner = _runner("leaky_child_then_exit", timeout_s=30.0,
68
+ exit_drain_grace_s=1.0)
69
+ t0 = time.monotonic()
70
+ lines = await asyncio.wait_for(_collect(runner), timeout=20.0)
71
+ elapsed = time.monotonic() - t0
72
+
73
+ assert elapsed < 10.0, f"stream waited {elapsed:.1f}s on a dead child"
74
+ # The answer survived: ending early must not truncate delivered output.
75
+ assert lines, "no output collected"
76
+ joined = b"".join(lines)
77
+ assert b"content_block_delta" in joined or b"assistant" in joined
78
+
79
+
80
+ @pytest.mark.asyncio
81
+ async def test_drain_grace_is_measured_from_child_exit() -> None:
82
+ """A longer grace costs exactly that much more, and no more.
83
+
84
+ Pins the shape of the wait: the cost of a leaked FD is the grace,
85
+ not the timeout — which is the whole point of the change.
86
+ """
87
+ runner = _runner("leaky_child_then_exit", timeout_s=30.0,
88
+ exit_drain_grace_s=3.0)
89
+ t0 = time.monotonic()
90
+ await asyncio.wait_for(_collect(runner), timeout=20.0)
91
+ elapsed = time.monotonic() - t0
92
+ assert 2.0 <= elapsed < 12.0, f"grace not honoured (took {elapsed:.1f}s)"
93
+
94
+
95
+ @pytest.mark.asyncio
96
+ async def test_healthy_stream_is_unaffected() -> None:
97
+ """No grandchild, no grace: a clean CLI still ends on real EOF.
98
+
99
+ The guard must not shorten a normal stream — the common path has to
100
+ stay exactly as fast as it was.
101
+ """
102
+ runner = _runner("ok_stream_event", timeout_s=30.0,
103
+ exit_drain_grace_s=5.0)
104
+ t0 = time.monotonic()
105
+ lines = await asyncio.wait_for(_collect(runner), timeout=20.0)
106
+ elapsed = time.monotonic() - t0
107
+ assert lines
108
+ assert elapsed < 5.0, (
109
+ f"clean stream paid the drain grace ({elapsed:.1f}s) — it should "
110
+ "end on EOF immediately"
111
+ )
112
+
113
+
114
+ @pytest.mark.asyncio
115
+ async def test_slow_but_alive_child_is_not_cut_off() -> None:
116
+ """The grace applies only AFTER exit — a slow live child keeps its
117
+ full budget.
118
+
119
+ ``stream_then_hang`` emits one delta and sleeps 600s while alive, so
120
+ the only thing that may stop it is ``timeout_s``. If the drain grace
121
+ leaked into the alive path, this would end in ~1s with a CLITimeout
122
+ raised far too early.
123
+ """
124
+ from geny_executor.llm_client._cli_runtime import CLITimeout
125
+
126
+ runner = _runner("stream_then_hang", timeout_s=4.0,
127
+ exit_drain_grace_s=1.0)
128
+ t0 = time.monotonic()
129
+ with pytest.raises(CLITimeout):
130
+ await asyncio.wait_for(_collect(runner), timeout=25.0)
131
+ elapsed = time.monotonic() - t0
132
+ assert elapsed >= 3.0, (
133
+ f"alive child was cut off after {elapsed:.1f}s — the drain grace "
134
+ "must not apply before exit"
135
+ )
@@ -0,0 +1,101 @@
1
+ """The hot spare must be alive, not merely un-reaped.
2
+
3
+ The prewarm exists for time-to-first-token: after a turn, a `claude` process
4
+ is started so the next turn skips Node boot, auth and MCP startup. The turn
5
+ then hands its prompt to that process over stdin.
6
+
7
+ `Process.returncode` is bookkeeping — it stays None until the event loop
8
+ reaps the child — so a process that already exited reads as a healthy spare
9
+ forever. In production the CLI started, listed its tools, exited, and every
10
+ following turn stalled until a watchdog abandoned it at 320 s. The same
11
+ session answered in 11 s with the prewarm disabled.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import os
17
+
18
+ import pytest
19
+
20
+ from geny_executor.llm_client.claude_code import (
21
+ ClaudeCodeCLIClient,
22
+ _process_alive,
23
+ )
24
+
25
+
26
+ class _Proc:
27
+ def __init__(self, pid, returncode=None):
28
+ self.pid = pid
29
+ self.returncode = returncode
30
+
31
+
32
+ def _client() -> ClaudeCodeCLIClient:
33
+ return ClaudeCodeCLIClient.__new__(ClaudeCodeCLIClient)
34
+
35
+
36
+ def _with_spare(argv, proc):
37
+ c = _client()
38
+ c._spare = {"proc": proc, "argv": list(argv), "runner": None}
39
+ c._discarded = []
40
+ c._discard_spare_proc = lambda spare: c._discarded.append(spare)
41
+ return c
42
+
43
+
44
+ # ── the liveness probe itself ───────────────────────────────────────
45
+
46
+ def test_a_running_process_is_alive():
47
+ assert _process_alive(_Proc(os.getpid())) is True
48
+
49
+
50
+ def test_a_reaped_process_is_not():
51
+ assert _process_alive(_Proc(os.getpid(), returncode=0)) is False
52
+
53
+
54
+ def test_a_vanished_process_is_not_alive_despite_no_returncode():
55
+ """THE bug. returncode is None because nobody reaped it; the process is
56
+ gone all the same."""
57
+ pid = os.fork()
58
+ if pid == 0: # child
59
+ os._exit(0)
60
+ os.waitpid(pid, 0) # reap outside asyncio's view
61
+
62
+ assert _process_alive(_Proc(pid)) is False
63
+
64
+
65
+ def test_no_pid_is_not_alive():
66
+ assert _process_alive(_Proc(None)) is False
67
+
68
+
69
+ # ── what _take_spare does with it ───────────────────────────────────
70
+
71
+ def test_a_live_matching_spare_is_handed_over():
72
+ proc = _Proc(os.getpid())
73
+ c = _with_spare(["claude", "--model", "opus"], proc)
74
+
75
+ assert c._take_spare(["claude", "--model", "opus"]) is proc
76
+ assert c._spare is None, "the spare was handed over AND kept"
77
+
78
+
79
+ def test_a_dead_spare_is_discarded_not_reused():
80
+ pid = os.fork()
81
+ if pid == 0:
82
+ os._exit(0)
83
+ os.waitpid(pid, 0)
84
+ c = _with_spare(["claude"], _Proc(pid))
85
+
86
+ assert c._take_spare(["claude"]) is None
87
+ assert len(c._discarded) == 1
88
+
89
+
90
+ def test_a_spare_booted_with_different_argv_is_discarded():
91
+ """Model, MCP config, resume flags — any drift means stale config."""
92
+ c = _with_spare(["claude", "--model", "opus"], _Proc(os.getpid()))
93
+
94
+ assert c._take_spare(["claude", "--model", "haiku"]) is None
95
+ assert len(c._discarded) == 1
96
+
97
+
98
+ def test_no_spare_is_not_an_error():
99
+ c = _client()
100
+ c._spare = None
101
+ assert c._take_spare(["claude"]) is None
File without changes
File without changes
File without changes