geny-executor 2.26.0__tar.gz → 2.28.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (737) hide show
  1. {geny_executor-2.26.0 → geny_executor-2.28.0}/PKG-INFO +1 -1
  2. {geny_executor-2.26.0 → geny_executor-2.28.0}/pyproject.toml +1 -1
  3. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/environment_control.py +250 -2
  4. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/pipeline.py +19 -0
  5. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/bundled/environment/REFERENCE.md +36 -3
  6. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/bundled/environment/SKILL.md +11 -0
  7. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s03_system/artifact/default/builders.py +30 -6
  8. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/artifact/default/stage.py +11 -0
  9. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/env_tools.py +5 -1
  10. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_self_modifying_env.py +79 -0
  11. {geny_executor-2.26.0 → geny_executor-2.28.0}/.gitignore +0 -0
  12. {geny_executor-2.26.0 → geny_executor-2.28.0}/LICENSE +0 -0
  13. {geny_executor-2.26.0 → geny_executor-2.28.0}/README.md +0 -0
  14. {geny_executor-2.26.0 → geny_executor-2.28.0}/README_ko.md +0 -0
  15. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/__init__.py +0 -0
  16. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/channels/__init__.py +0 -0
  17. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/channels/built_in.py +0 -0
  18. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/channels/factory.py +0 -0
  19. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/channels/send_message_channel.py +0 -0
  20. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/channels/user_file_channel.py +0 -0
  21. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/__init__.py +0 -0
  22. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/artifact.py +0 -0
  23. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/builder.py +0 -0
  24. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/compaction.py +0 -0
  25. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/config.py +0 -0
  26. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/diff.py +0 -0
  27. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/environment.py +0 -0
  28. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/errors.py +0 -0
  29. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/introspection.py +0 -0
  30. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/manifest_factory.py +0 -0
  31. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/mutation.py +0 -0
  32. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/presets.py +0 -0
  33. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/result.py +0 -0
  34. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/schema.py +0 -0
  35. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/shared_keys.py +0 -0
  36. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/slot.py +0 -0
  37. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/snapshot.py +0 -0
  38. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/stage.py +0 -0
  39. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/state.py +0 -0
  40. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/core/token_estimate.py +0 -0
  41. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/cron/__init__.py +0 -0
  42. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/cron/runner.py +0 -0
  43. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/cron/store_abc.py +0 -0
  44. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/cron/store_impl/__init__.py +0 -0
  45. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/cron/store_impl/file_backed.py +0 -0
  46. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/cron/store_impl/in_memory.py +0 -0
  47. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/cron/types.py +0 -0
  48. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/events/__init__.py +0 -0
  49. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/events/bus.py +0 -0
  50. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/events/catalog.py +0 -0
  51. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/events/types.py +0 -0
  52. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/gateway/__init__.py +0 -0
  53. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/gateway/adapter.py +0 -0
  54. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/gateway/discord.py +0 -0
  55. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/gateway/factory.py +0 -0
  56. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/gateway/runner.py +0 -0
  57. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/gateway/slack.py +0 -0
  58. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/gateway/telegram.py +0 -0
  59. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/gateway/types.py +0 -0
  60. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/gateway/ws_base.py +0 -0
  61. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/history/__init__.py +0 -0
  62. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/history/ab_test.py +0 -0
  63. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/history/cost.py +0 -0
  64. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/history/models.py +0 -0
  65. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/history/monitor.py +0 -0
  66. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/history/replay.py +0 -0
  67. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/history/service.py +0 -0
  68. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/hooks/__init__.py +0 -0
  69. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/hooks/config.py +0 -0
  70. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/hooks/events.py +0 -0
  71. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/hooks/runner.py +0 -0
  72. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/__init__.py +0 -0
  73. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/_cli_runtime.py +0 -0
  74. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/anthropic.py +0 -0
  75. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/base.py +0 -0
  76. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/claude_code.py +0 -0
  77. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/credentials.py +0 -0
  78. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/google.py +0 -0
  79. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/local_probe.py +0 -0
  80. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/model_discovery.py +0 -0
  81. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/openai.py +0 -0
  82. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/openai_compatible.py +0 -0
  83. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/profiles.py +0 -0
  84. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/registry.py +0 -0
  85. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/translators/__init__.py +0 -0
  86. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/translators/_canonical.py +0 -0
  87. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/translators/_cli.py +0 -0
  88. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/types.py +0 -0
  89. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/llm_client/vllm.py +0 -0
  90. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/__init__.py +0 -0
  91. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/_locks.py +0 -0
  92. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/_progressive.py +0 -0
  93. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/composite/__init__.py +0 -0
  94. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/composite/handles.py +0 -0
  95. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/composite/provider.py +0 -0
  96. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/composite/routing.py +0 -0
  97. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/composite/snapshot.py +0 -0
  98. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/embedding/__init__.py +0 -0
  99. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/embedding/client.py +0 -0
  100. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/embedding/google.py +0 -0
  101. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/embedding/local.py +0 -0
  102. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/embedding/openai.py +0 -0
  103. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/embedding/registry.py +0 -0
  104. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/embedding/voyage.py +0 -0
  105. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/factory.py +0 -0
  106. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/presets.py +0 -0
  107. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/provider.py +0 -0
  108. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/__init__.py +0 -0
  109. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/ephemeral.py +0 -0
  110. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/file/__init__.py +0 -0
  111. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/file/config.py +0 -0
  112. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/file/frontmatter.py +0 -0
  113. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/file/index_store.py +0 -0
  114. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/file/layout.py +0 -0
  115. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/file/ltm_store.py +0 -0
  116. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/file/notes_store.py +0 -0
  117. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/file/provider.py +0 -0
  118. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/file/snapshot.py +0 -0
  119. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/file/stm_store.py +0 -0
  120. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/file/timezone.py +0 -0
  121. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/file/vector_store.py +0 -0
  122. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/sql/__init__.py +0 -0
  123. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/sql/config.py +0 -0
  124. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/sql/connection.py +0 -0
  125. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/sql/index_store.py +0 -0
  126. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/sql/ltm_store.py +0 -0
  127. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/sql/notes_store.py +0 -0
  128. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/sql/provider.py +0 -0
  129. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/sql/schema.py +0 -0
  130. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/sql/snapshot.py +0 -0
  131. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/sql/stm_store.py +0 -0
  132. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/providers/sql/vector_store.py +0 -0
  133. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/retriever.py +0 -0
  134. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/rollup.py +0 -0
  135. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/memory/strategy.py +0 -0
  136. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/notifications/__init__.py +0 -0
  137. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/notifications/registry.py +0 -0
  138. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/permission/__init__.py +0 -0
  139. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/permission/loader.py +0 -0
  140. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/permission/matrix.py +0 -0
  141. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/permission/types.py +0 -0
  142. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/py.typed +0 -0
  143. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/runtime/__init__.py +0 -0
  144. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/runtime/task_executors.py +0 -0
  145. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/runtime/task_runner.py +0 -0
  146. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/security/__init__.py +0 -0
  147. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/security/import_validator.py +0 -0
  148. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/security/script_sandbox.py +0 -0
  149. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/session/__init__.py +0 -0
  150. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/session/freshness.py +0 -0
  151. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/session/manager.py +0 -0
  152. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/session/persistence.py +0 -0
  153. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/session/session.py +0 -0
  154. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/settings/__init__.py +0 -0
  155. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/settings/loader.py +0 -0
  156. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/settings/section_registry.py +0 -0
  157. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/__init__.py +0 -0
  158. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/bundled/batch/SKILL.md +0 -0
  159. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/bundled/debug/SKILL.md +0 -0
  160. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/bundled/loop/SKILL.md +0 -0
  161. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/bundled/lorem-ipsum/SKILL.md +0 -0
  162. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/bundled/simplify/SKILL.md +0 -0
  163. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/bundled/skillify/SKILL.md +0 -0
  164. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/bundled/stuck/SKILL.md +0 -0
  165. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/bundled/verify/SKILL.md +0 -0
  166. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/bundled_skills.py +0 -0
  167. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/fork.py +0 -0
  168. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/frontmatter.py +0 -0
  169. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/loader.py +0 -0
  170. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/mcp_bridge.py +0 -0
  171. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/path_match.py +0 -0
  172. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/registry.py +0 -0
  173. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/shell_blocks.py +0 -0
  174. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/skill_tool.py +0 -0
  175. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/types.py +0 -0
  176. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/skills/watcher.py +0 -0
  177. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/__init__.py +0 -0
  178. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/__init__.py +0 -0
  179. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/_helpers.py +0 -0
  180. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/cancel.py +0 -0
  181. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/clear.py +0 -0
  182. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/compact.py +0 -0
  183. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/config.py +0 -0
  184. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/context.py +0 -0
  185. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/cost.py +0 -0
  186. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/help.py +0 -0
  187. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/memory.py +0 -0
  188. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/model.py +0 -0
  189. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/preset_info.py +0 -0
  190. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/status.py +0 -0
  191. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/built_in/tasks.py +0 -0
  192. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/md_template.py +0 -0
  193. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/parser.py +0 -0
  194. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/registry.py +0 -0
  195. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/slash_commands/types.py +0 -0
  196. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/__init__.py +0 -0
  197. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s01_input/__init__.py +0 -0
  198. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s01_input/artifact/__init__.py +0 -0
  199. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s01_input/artifact/default/__init__.py +0 -0
  200. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s01_input/artifact/default/normalizers.py +0 -0
  201. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s01_input/artifact/default/stage.py +0 -0
  202. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s01_input/artifact/default/validators.py +0 -0
  203. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s01_input/interface.py +0 -0
  204. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s01_input/normalizers.py +0 -0
  205. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s01_input/stage.py +0 -0
  206. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s01_input/types.py +0 -0
  207. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s01_input/validators.py +0 -0
  208. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/__init__.py +0 -0
  209. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/artifact/__init__.py +0 -0
  210. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/artifact/default/__init__.py +0 -0
  211. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/artifact/default/compactors.py +0 -0
  212. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/artifact/default/retrievers.py +0 -0
  213. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/artifact/default/stage.py +0 -0
  214. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/artifact/default/strategies.py +0 -0
  215. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/compactors.py +0 -0
  216. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/interface.py +0 -0
  217. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/retrievers.py +0 -0
  218. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/stage.py +0 -0
  219. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/strategies.py +0 -0
  220. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s02_context/types.py +0 -0
  221. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s03_system/__init__.py +0 -0
  222. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s03_system/artifact/__init__.py +0 -0
  223. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s03_system/artifact/default/__init__.py +0 -0
  224. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s03_system/artifact/default/stage.py +0 -0
  225. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s03_system/builders.py +0 -0
  226. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s03_system/interface.py +0 -0
  227. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s03_system/persona/__init__.py +0 -0
  228. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s03_system/persona/builder.py +0 -0
  229. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s03_system/persona/provider.py +0 -0
  230. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s03_system/stage.py +0 -0
  231. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s04_guard/__init__.py +0 -0
  232. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s04_guard/artifact/__init__.py +0 -0
  233. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s04_guard/artifact/default/__init__.py +0 -0
  234. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s04_guard/artifact/default/guards.py +0 -0
  235. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s04_guard/artifact/default/stage.py +0 -0
  236. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s04_guard/guards.py +0 -0
  237. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s04_guard/interface.py +0 -0
  238. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s04_guard/stage.py +0 -0
  239. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s04_guard/types.py +0 -0
  240. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s05_cache/__init__.py +0 -0
  241. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s05_cache/artifact/__init__.py +0 -0
  242. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s05_cache/artifact/default/__init__.py +0 -0
  243. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s05_cache/artifact/default/stage.py +0 -0
  244. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s05_cache/artifact/default/strategies.py +0 -0
  245. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s05_cache/interface.py +0 -0
  246. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s05_cache/stage.py +0 -0
  247. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s05_cache/strategies.py +0 -0
  248. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/__init__.py +0 -0
  249. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/_translate.py +0 -0
  250. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/artifact/__init__.py +0 -0
  251. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/artifact/default/__init__.py +0 -0
  252. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/artifact/default/providers.py +0 -0
  253. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/artifact/default/retry.py +0 -0
  254. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/artifact/default/router.py +0 -0
  255. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/artifact/default/stage.py +0 -0
  256. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/artifact/default/tool_loop.py +0 -0
  257. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/artifact/google/__init__.py +0 -0
  258. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/artifact/google/providers.py +0 -0
  259. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/artifact/openai/__init__.py +0 -0
  260. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/artifact/openai/providers.py +0 -0
  261. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/interface.py +0 -0
  262. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/providers.py +0 -0
  263. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/retry.py +0 -0
  264. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/stage.py +0 -0
  265. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s06_api/types.py +0 -0
  266. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s07_token/__init__.py +0 -0
  267. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s07_token/artifact/__init__.py +0 -0
  268. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s07_token/artifact/default/__init__.py +0 -0
  269. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s07_token/artifact/default/pricing.py +0 -0
  270. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s07_token/artifact/default/stage.py +0 -0
  271. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s07_token/artifact/default/trackers.py +0 -0
  272. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s07_token/interface.py +0 -0
  273. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s07_token/pricing.py +0 -0
  274. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s07_token/stage.py +0 -0
  275. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s07_token/trackers.py +0 -0
  276. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s08_think/__init__.py +0 -0
  277. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s08_think/artifact/default/__init__.py +0 -0
  278. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s08_think/artifact/default/budget.py +0 -0
  279. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s08_think/artifact/default/processors.py +0 -0
  280. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s08_think/artifact/default/stage.py +0 -0
  281. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s08_think/interface.py +0 -0
  282. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s08_think/processors.py +0 -0
  283. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s08_think/stage.py +0 -0
  284. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s08_think/types.py +0 -0
  285. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s09_parse/__init__.py +0 -0
  286. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s09_parse/artifact/default/__init__.py +0 -0
  287. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s09_parse/artifact/default/parsers.py +0 -0
  288. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s09_parse/artifact/default/signals.py +0 -0
  289. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s09_parse/artifact/default/stage.py +0 -0
  290. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s09_parse/interface.py +0 -0
  291. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s09_parse/parsers.py +0 -0
  292. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s09_parse/signals.py +0 -0
  293. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s09_parse/stage.py +0 -0
  294. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s09_parse/types.py +0 -0
  295. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/__init__.py +0 -0
  296. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/artifact/__init__.py +0 -0
  297. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/artifact/default/__init__.py +0 -0
  298. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/artifact/default/executors.py +0 -0
  299. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/artifact/default/routers.py +0 -0
  300. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/dispatcher.py +0 -0
  301. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/executors.py +0 -0
  302. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/interface.py +0 -0
  303. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/persistence.py +0 -0
  304. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/routers.py +0 -0
  305. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/stage.py +0 -0
  306. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/state_mutation.py +0 -0
  307. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s10_tool/streaming.py +0 -0
  308. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s11_tool_review/__init__.py +0 -0
  309. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s11_tool_review/artifact/__init__.py +0 -0
  310. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s11_tool_review/artifact/default/__init__.py +0 -0
  311. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s11_tool_review/artifact/default/reviewers.py +0 -0
  312. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s11_tool_review/artifact/default/stage.py +0 -0
  313. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s11_tool_review/interface.py +0 -0
  314. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s12_agent/__init__.py +0 -0
  315. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s12_agent/artifact/__init__.py +0 -0
  316. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s12_agent/artifact/default/__init__.py +0 -0
  317. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s12_agent/artifact/default/orchestrators.py +0 -0
  318. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s12_agent/artifact/default/stage.py +0 -0
  319. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s12_agent/interface.py +0 -0
  320. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s12_agent/orchestrators.py +0 -0
  321. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s12_agent/persistent_subagent.py +0 -0
  322. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s12_agent/stage.py +0 -0
  323. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s12_agent/subagent_catalog.py +0 -0
  324. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s12_agent/subagent_type.py +0 -0
  325. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s12_agent/types.py +0 -0
  326. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s13_task_registry/__init__.py +0 -0
  327. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s13_task_registry/artifact/__init__.py +0 -0
  328. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s13_task_registry/artifact/default/__init__.py +0 -0
  329. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s13_task_registry/artifact/default/file_backed_registry.py +0 -0
  330. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s13_task_registry/artifact/default/policies.py +0 -0
  331. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s13_task_registry/artifact/default/registry.py +0 -0
  332. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s13_task_registry/artifact/default/stage.py +0 -0
  333. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s13_task_registry/interface.py +0 -0
  334. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s13_task_registry/types.py +0 -0
  335. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s14_evaluate/__init__.py +0 -0
  336. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s14_evaluate/artifact/__init__.py +0 -0
  337. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/__init__.py +0 -0
  338. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/strategy.py +0 -0
  339. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s14_evaluate/artifact/default/__init__.py +0 -0
  340. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s14_evaluate/artifact/default/stage.py +0 -0
  341. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s14_evaluate/artifact/default/strategies.py +0 -0
  342. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s14_evaluate/interface.py +0 -0
  343. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s14_evaluate/stage.py +0 -0
  344. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s14_evaluate/strategies.py +0 -0
  345. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s14_evaluate/types.py +0 -0
  346. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s15_hitl/__init__.py +0 -0
  347. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s15_hitl/artifact/__init__.py +0 -0
  348. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s15_hitl/artifact/default/__init__.py +0 -0
  349. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s15_hitl/artifact/default/requesters.py +0 -0
  350. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s15_hitl/artifact/default/stage.py +0 -0
  351. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s15_hitl/artifact/default/timeouts.py +0 -0
  352. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s15_hitl/interface.py +0 -0
  353. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s15_hitl/types.py +0 -0
  354. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s16_loop/__init__.py +0 -0
  355. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s16_loop/artifact/__init__.py +0 -0
  356. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s16_loop/artifact/default/__init__.py +0 -0
  357. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s16_loop/artifact/default/controllers.py +0 -0
  358. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s16_loop/artifact/default/stage.py +0 -0
  359. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s16_loop/controllers.py +0 -0
  360. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s16_loop/interface.py +0 -0
  361. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s16_loop/stage.py +0 -0
  362. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s17_emit/__init__.py +0 -0
  363. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s17_emit/artifact/__init__.py +0 -0
  364. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s17_emit/artifact/default/__init__.py +0 -0
  365. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s17_emit/artifact/default/emitters.py +0 -0
  366. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s17_emit/artifact/default/stage.py +0 -0
  367. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s17_emit/emitters.py +0 -0
  368. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s17_emit/interface.py +0 -0
  369. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s17_emit/stage.py +0 -0
  370. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s17_emit/types.py +0 -0
  371. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s18_memory/__init__.py +0 -0
  372. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s18_memory/_dehydrate.py +0 -0
  373. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s18_memory/artifact/__init__.py +0 -0
  374. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s18_memory/artifact/default/__init__.py +0 -0
  375. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s18_memory/artifact/default/persistence.py +0 -0
  376. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s18_memory/artifact/default/stage.py +0 -0
  377. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s18_memory/artifact/default/strategies.py +0 -0
  378. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s18_memory/insight.py +0 -0
  379. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s18_memory/interface.py +0 -0
  380. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s18_memory/persistence.py +0 -0
  381. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s18_memory/stage.py +0 -0
  382. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s18_memory/strategies.py +0 -0
  383. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s19_summarize/__init__.py +0 -0
  384. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s19_summarize/artifact/__init__.py +0 -0
  385. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s19_summarize/artifact/default/__init__.py +0 -0
  386. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s19_summarize/artifact/default/importance.py +0 -0
  387. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s19_summarize/artifact/default/stage.py +0 -0
  388. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s19_summarize/artifact/default/summarizers.py +0 -0
  389. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s19_summarize/frequency_policy.py +0 -0
  390. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s19_summarize/interface.py +0 -0
  391. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s19_summarize/types.py +0 -0
  392. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s20_persist/__init__.py +0 -0
  393. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s20_persist/artifact/__init__.py +0 -0
  394. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s20_persist/artifact/default/__init__.py +0 -0
  395. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s20_persist/artifact/default/frequencies.py +0 -0
  396. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s20_persist/artifact/default/persisters.py +0 -0
  397. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s20_persist/artifact/default/stage.py +0 -0
  398. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s20_persist/interface.py +0 -0
  399. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s20_persist/restore.py +0 -0
  400. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s20_persist/types.py +0 -0
  401. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s21_yield/__init__.py +0 -0
  402. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s21_yield/artifact/__init__.py +0 -0
  403. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s21_yield/artifact/default/__init__.py +0 -0
  404. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s21_yield/artifact/default/formatters.py +0 -0
  405. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s21_yield/artifact/default/multi_format.py +0 -0
  406. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s21_yield/artifact/default/stage.py +0 -0
  407. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s21_yield/formatters.py +0 -0
  408. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s21_yield/interface.py +0 -0
  409. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/stages/s21_yield/stage.py +0 -0
  410. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/__init__.py +0 -0
  411. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/_sandbox.py +0 -0
  412. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/adhoc.py +0 -0
  413. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/base.py +0 -0
  414. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/__init__.py +0 -0
  415. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/_path_guard.py +0 -0
  416. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/_web_search_backends.py +0 -0
  417. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/agent_tool.py +0 -0
  418. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/ask_user_question_tool.py +0 -0
  419. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/bash_tool.py +0 -0
  420. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/cron_tools.py +0 -0
  421. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/dev_tools.py +0 -0
  422. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/edit_tool.py +0 -0
  423. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/glob_tool.py +0 -0
  424. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/grep_tool.py +0 -0
  425. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/mcp_wrapper_tools.py +0 -0
  426. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/notebook_edit_tool.py +0 -0
  427. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/operator_tools.py +0 -0
  428. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/plan_mode_tools.py +0 -0
  429. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/push_notification_tool.py +0 -0
  430. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/read_tool.py +0 -0
  431. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/send_message_tool.py +0 -0
  432. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/subagent_tools.py +0 -0
  433. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/task_tools.py +0 -0
  434. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/todo_write_tool.py +0 -0
  435. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/tool_search_tool.py +0 -0
  436. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/web_fetch_tool.py +0 -0
  437. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/web_search_tool.py +0 -0
  438. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/worktree_tools.py +0 -0
  439. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/built_in/write_tool.py +0 -0
  440. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/composer.py +0 -0
  441. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/errors.py +0 -0
  442. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/mcp/__init__.py +0 -0
  443. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/mcp/adapter.py +0 -0
  444. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/mcp/credentials.py +0 -0
  445. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/mcp/errors.py +0 -0
  446. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/mcp/manager.py +0 -0
  447. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/mcp/oauth.py +0 -0
  448. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/mcp/state.py +0 -0
  449. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/mcp/uri.py +0 -0
  450. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/plugin.py +0 -0
  451. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/provider.py +0 -0
  452. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/providers.py +0 -0
  453. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/registry.py +0 -0
  454. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/sandbox.py +0 -0
  455. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/scope.py +0 -0
  456. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/tools/stage_binding.py +0 -0
  457. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/workspace/__init__.py +0 -0
  458. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/workspace/stack.py +0 -0
  459. {geny_executor-2.26.0 → geny_executor-2.28.0}/src/geny_executor/workspace/types.py +0 -0
  460. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/__init__.py +0 -0
  461. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/_fixtures/__init__.py +0 -0
  462. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/_fixtures/fake_claude.py +0 -0
  463. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/_fixtures/fake_echo_cli.py +0 -0
  464. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/_fixtures/geny_manifest_layout.json +0 -0
  465. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/_fixtures/manifest_entries.py +0 -0
  466. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/__init__.py +0 -0
  467. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/conftest.py +0 -0
  468. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/fixtures/__init__.py +0 -0
  469. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/fixtures/adapter/__init__.py +0 -0
  470. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/fixtures/adapter/adapter.py +0 -0
  471. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/test_c1_six_layer_retrieval.py +0 -0
  472. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/test_c2_execution_recording.py +0 -0
  473. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/test_c3_reflection_and_promotion.py +0 -0
  474. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/test_c4_rest_coverage.py +0 -0
  475. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/test_c5_embedding_migration.py +0 -0
  476. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/test_c6_session_resume.py +0 -0
  477. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/test_c7_adapter_parity.py +0 -0
  478. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/completeness/test_spec_loads.py +0 -0
  479. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/__init__.py +0 -0
  480. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/memory_provider_contract.py +0 -0
  481. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_embedding_clients.py +0 -0
  482. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_error_codes_stability.py +0 -0
  483. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_embedding_credentials.py +0 -0
  484. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_auto_vector.py +0 -0
  485. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_composite.py +0 -0
  486. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_composite_routing.py +0 -0
  487. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_curated_global.py +0 -0
  488. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_ephemeral.py +0 -0
  489. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_factory.py +0 -0
  490. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_file.py +0 -0
  491. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_file_layout.py +0 -0
  492. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_file_vector.py +0 -0
  493. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_sql.py +0 -0
  494. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_sql_dialect.py +0 -0
  495. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_sql_schema.py +0 -0
  496. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_provider_sql_vector.py +0 -0
  497. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_memory_vector_breaker.py +0 -0
  498. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/contract/test_stage_uniformity.py +0 -0
  499. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/integration/test_cycle_ab_cross_import.py +0 -0
  500. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/integration/test_integration.py +0 -0
  501. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/__init__.py +0 -0
  502. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/conformance/__init__.py +0 -0
  503. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/conformance/harness.py +0 -0
  504. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/conformance/test_anthropic.py +0 -0
  505. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/conformance/test_claude_code_cli.py +0 -0
  506. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/conformance/test_google.py +0 -0
  507. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/conformance/test_local_providers.py +0 -0
  508. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/conformance/test_openai.py +0 -0
  509. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/conformance/test_vllm.py +0 -0
  510. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/golden/__init__.py +0 -0
  511. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/golden/cli-2.1.149-json.json +0 -0
  512. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/golden/cli-2.1.149-json.meta +0 -0
  513. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/golden/cli-2.1.149-stream.jsonl +0 -0
  514. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/golden/cli-2.1.149-stream.meta +0 -0
  515. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/golden/cli-2.1.162-stream.jsonl +0 -0
  516. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/golden/cli-2.1.162-stream.meta +0 -0
  517. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/golden/test_golden_replay.py +0 -0
  518. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/live/__init__.py +0 -0
  519. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/live/test_live_canaries.py +0 -0
  520. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/__init__.py +0 -0
  521. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_anthropic_build_kwargs.py +0 -0
  522. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_anthropic_classify.py +0 -0
  523. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_base_client.py +0 -0
  524. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_claude_code.py +0 -0
  525. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_cli_cancellation.py +0 -0
  526. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_cli_event_forwarding.py +0 -0
  527. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_cli_runtime.py +0 -0
  528. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_container_runner.py +0 -0
  529. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_credentials.py +0 -0
  530. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_google_classify.py +0 -0
  531. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_local_probe.py +0 -0
  532. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_local_tool_repair.py +0 -0
  533. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_openai_client.py +0 -0
  534. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_profiles.py +0 -0
  535. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/llm_client/unit/test_translators_cli_claude_code.py +0 -0
  536. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/__init__.py +0 -0
  537. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_adaptive_model_router.py +0 -0
  538. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_adaptive_router_configure.py +0 -0
  539. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_adaptive_thinking_budget.py +0 -0
  540. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_adhoc_providers.py +0 -0
  541. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_agent_tool.py +0 -0
  542. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_api_timeout_kwarg.py +0 -0
  543. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_artifact_metadata.py +0 -0
  544. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_ask_user_question_tool.py +0 -0
  545. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_attach_llm_client_guard.py +0 -0
  546. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_binary_classify_manifest.py +0 -0
  547. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_budget_compaction_recovery.py +0 -0
  548. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_built_in_autoregister.py +0 -0
  549. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_builtin_capabilities.py +0 -0
  550. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_builtin_channels.py +0 -0
  551. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_builtin_features.py +0 -0
  552. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_cache_prefix_key.py +0 -0
  553. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_cancellation.py +0 -0
  554. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_claude_code_nonstream_prompt.py +0 -0
  555. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_cli_mcp_passthrough.py +0 -0
  556. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_composite_set_hooks.py +0 -0
  557. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_concurrent_runs.py +0 -0
  558. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_config_liveness.py +0 -0
  559. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_cron_runner.py +0 -0
  560. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_cron_store.py +0 -0
  561. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_cron_tools.py +0 -0
  562. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_dev_tools.py +0 -0
  563. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_diff_order_keyed.py +0 -0
  564. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_dynamic_persona_builder.py +0 -0
  565. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_embedding_error_classification.py +0 -0
  566. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_errors_categories.py +0 -0
  567. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_evaluation_chain.py +0 -0
  568. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_evaluation_chain_configure.py +0 -0
  569. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_event_catalog.py +0 -0
  570. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_event_channel_unification.py +0 -0
  571. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_event_correlation.py +0 -0
  572. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_external_tool_resolution.py +0 -0
  573. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_fork_multi_provider.py +0 -0
  574. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_from_manifest_strict_validation.py +0 -0
  575. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_gateway.py +0 -0
  576. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_gateway_ws.py +0 -0
  577. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_geny_prod_manifest_repro.py +0 -0
  578. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_guard_fail_fast.py +0 -0
  579. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_hierarchical_sidecars.py +0 -0
  580. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_hook_gate_split.py +0 -0
  581. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_hook_in_process.py +0 -0
  582. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_hook_runner.py +0 -0
  583. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_hook_taxonomy.py +0 -0
  584. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_hooks_and_shared_keys.py +0 -0
  585. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_host_selections_resolve.py +0 -0
  586. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_index_list_categories.py +0 -0
  587. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_index_render_vault_map.py +0 -0
  588. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_interaction_fields.py +0 -0
  589. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_internal_agentic_loop.py +0 -0
  590. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_introspection.py +0 -0
  591. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_llm_client_base.py +0 -0
  592. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_llm_client_capabilities.py +0 -0
  593. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_llm_client_registry.py +0 -0
  594. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_llm_client_request_types.py +0 -0
  595. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_llm_client_state.py +0 -0
  596. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_llm_compactor_selfwire.py +0 -0
  597. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_llm_summary_compactor.py +0 -0
  598. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_loop_agnostic_lock.py +0 -0
  599. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_manifest_factory.py +0 -0
  600. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_manifest_from_dict_hygiene.py +0 -0
  601. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_manifest_memory_wiring.py +0 -0
  602. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_manifest_provider_validation.py +0 -0
  603. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_manifest_subagents_memory_sections.py +0 -0
  604. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_manifest_v2.py +0 -0
  605. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_manifest_v3_migration.py +0 -0
  606. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_mcp_annotations_attach.py +0 -0
  607. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_mcp_credential_store.py +0 -0
  608. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_mcp_fsm.py +0 -0
  609. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_mcp_lifecycle.py +0 -0
  610. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_mcp_namespace.py +0 -0
  611. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_mcp_oauth.py +0 -0
  612. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_mcp_prompts_skills_bridge.py +0 -0
  613. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_mcp_resource_retriever.py +0 -0
  614. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_mcp_uri.py +0 -0
  615. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_mcp_wrapper_tools.py +0 -0
  616. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_memory_aware_retriever.py +0 -0
  617. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_memory_hooks_after_callbacks.py +0 -0
  618. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_memory_metadata_extension.py +0 -0
  619. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_memory_rollup.py +0 -0
  620. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_model_discovery.py +0 -0
  621. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_model_overrides.py +0 -0
  622. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_multi_dim_budget_configure.py +0 -0
  623. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_multi_dim_budget_controller.py +0 -0
  624. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_multi_format_yield.py +0 -0
  625. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_multi_provider.py +0 -0
  626. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_multimodal.py +0 -0
  627. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_note_graph_queries.py +0 -0
  628. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_notebook_edit_tool.py +0 -0
  629. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_notes_load_pinned.py +0 -0
  630. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_operator_tools.py +0 -0
  631. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_ordered_emitter_chain.py +0 -0
  632. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_permission_matrix.py +0 -0
  633. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_permission_mode_promotions.py +0 -0
  634. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_permission_posture.py +0 -0
  635. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_persistent_subagent.py +0 -0
  636. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase1_foundation.py +0 -0
  637. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase1_pipeline.py +0 -0
  638. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase2_agent_loop.py +0 -0
  639. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase2_tools.py +0 -0
  640. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase3_context_memory.py +0 -0
  641. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase4_think_agent_evaluate.py +0 -0
  642. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase5_emit_presets_mcp.py +0 -0
  643. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase5_environment.py +0 -0
  644. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase6_history.py +0 -0
  645. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase6_integration.py +0 -0
  646. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase7_security.py +0 -0
  647. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase9a_preset_regen.py +0 -0
  648. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_phase9a_scaffolding.py +0 -0
  649. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_pipeline_aclose.py +0 -0
  650. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_pipeline_attach_runtime.py +0 -0
  651. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_pipeline_events_tap.py +0 -0
  652. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_pipeline_from_manifest.py +0 -0
  653. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_pipeline_hook_lifecycle.py +0 -0
  654. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_pipeline_session_runtime.py +0 -0
  655. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_plan_mode_tools.py +0 -0
  656. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_primary_provider_and_build_reports.py +0 -0
  657. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_progressive_disclosure.py +0 -0
  658. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_provider_driven_strategy.py +0 -0
  659. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_push_notification_tool.py +0 -0
  660. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_refresh_backlinks_extension.py +0 -0
  661. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_refresh_runtime_and_run_lock.py +0 -0
  662. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_resolve_model_config.py +0 -0
  663. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_restore_bad_strategy_config.py +0 -0
  664. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_reviewer_policy_configure.py +0 -0
  665. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_runtime_task_runner.py +0 -0
  666. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_s06_chunk_forwarding.py +0 -0
  667. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_s06_provider_selection.py +0 -0
  668. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_s13_file_backed_registry.py +0 -0
  669. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_s13_task_registry_output.py +0 -0
  670. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_s19_frequency_policy.py +0 -0
  671. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_s9b1_tool_review.py +0 -0
  672. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_s9b2_task_registry.py +0 -0
  673. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_s9b3_hitl.py +0 -0
  674. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_s9b4_summarize.py +0 -0
  675. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_s9b5_persist.py +0 -0
  676. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_s9c1_pipeline_resume.py +0 -0
  677. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_s9c2_restore_state.py +0 -0
  678. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_sandbox_attach.py +0 -0
  679. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_sandbox_tools.py +0 -0
  680. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_send_message_tool.py +0 -0
  681. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_settings_loader.py +0 -0
  682. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_skill_level3_resources.py +0 -0
  683. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_skill_phase_10_1.py +0 -0
  684. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_skill_phase_10_2.py +0 -0
  685. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_skill_phase_10_3.py +0 -0
  686. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_skill_phase_10_4_bundled.py +0 -0
  687. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_skill_phase_10_5_fork.py +0 -0
  688. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_skill_phase_10_6_killer.py +0 -0
  689. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_skill_phase_10_7_watcher.py +0 -0
  690. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_skill_richer_schema.py +0 -0
  691. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_skill_tool.py +0 -0
  692. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_skills_foundation.py +0 -0
  693. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_slash_built_in_control.py +0 -0
  694. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_slash_built_in_introspection.py +0 -0
  695. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_slash_commands.py +0 -0
  696. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_slash_md_template.py +0 -0
  697. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_stage10_ask_hitl.py +0 -0
  698. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_stage10_hook_wiring.py +0 -0
  699. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_stage10_partition_executor.py +0 -0
  700. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_stage10_permission_matrix.py +0 -0
  701. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_stage19_session_summary.py +0 -0
  702. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_state_mutation_wiring.py +0 -0
  703. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_state_shared_and_local.py +0 -0
  704. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_stm_append_event.py +0 -0
  705. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_strategy_config_roundtrip.py +0 -0
  706. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_streaming_tool_executor.py +0 -0
  707. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_structured_output_parser.py +0 -0
  708. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_structured_reflection.py +0 -0
  709. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_subagent_catalog.py +0 -0
  710. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_subagent_credential_propagation.py +0 -0
  711. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_subagent_descriptor.py +0 -0
  712. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_subagent_manifest_compile.py +0 -0
  713. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_subagent_orchestrator_zero_arg.py +0 -0
  714. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_subagent_parallel.py +0 -0
  715. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_subagent_pipeline_lifecycle.py +0 -0
  716. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_subagent_type_orchestrator.py +0 -0
  717. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_task_tools.py +0 -0
  718. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_todo_write_tool.py +0 -0
  719. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_tool_abc_uplift.py +0 -0
  720. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_tool_call_events.py +0 -0
  721. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_tool_errors.py +0 -0
  722. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_tool_lifecycle_hooks.py +0 -0
  723. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_tool_plugins.py +0 -0
  724. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_tool_provider.py +0 -0
  725. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_tool_result_persistence.py +0 -0
  726. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_tool_search_tool.py +0 -0
  727. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_tool_stage_max_concurrency.py +0 -0
  728. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_turn_boundary_state.py +0 -0
  729. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_validate_manifest.py +0 -0
  730. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_vault_map_drill.py +0 -0
  731. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_web_fetch_tool.py +0 -0
  732. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_web_search_backends.py +0 -0
  733. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_web_search_tool.py +0 -0
  734. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_workspace.py +0 -0
  735. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_workspace_propagation.py +0 -0
  736. {geny_executor-2.26.0 → geny_executor-2.28.0}/tests/unit/test_workspace_tools_integration.py +0 -0
  737. {geny_executor-2.26.0 → geny_executor-2.28.0}/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.26.0
3
+ Version: 2.28.0
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.26.0"
7
+ version = "2.28.0"
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 = "MIT"
@@ -37,6 +37,56 @@ logger = logging.getLogger(__name__)
37
37
  EnvPersistence = Callable[[Dict[str, Any]], Awaitable[None]]
38
38
 
39
39
 
40
+ # ── editable env-config surface ────────────────────────────────────────
41
+ # Model generation knobs that ``PipelineConfig.apply_to_state`` stamps onto
42
+ # state EVERY turn — so editing them on the live config takes effect next turn.
43
+ # The MODEL ID and PROVIDER are deliberately absent: those are "core" and stay
44
+ # locked (a session must not silently switch which model it is).
45
+ _TUNABLE_MODEL_KEYS: Dict[str, type] = {
46
+ "temperature": float,
47
+ "max_tokens": int,
48
+ "top_p": float,
49
+ "top_k": int,
50
+ "thinking_enabled": bool,
51
+ "thinking_budget_tokens": int,
52
+ }
53
+ # Top-level PipelineConfig limits re-applied to state every run.
54
+ _TUNABLE_PIPELINE_KEYS: Dict[str, type] = {
55
+ "max_iterations": int,
56
+ "cost_budget_usd": float,
57
+ "context_window_budget": int,
58
+ "single_turn": bool,
59
+ }
60
+ # Never editable at runtime — identity / credentials / wiring.
61
+ _CORE_LOCKED_KEYS = frozenset(
62
+ {"model", "provider", "api_key", "base_url", "name", "credentials"}
63
+ )
64
+ # extras keys that are runtime HANDLES (objects), not editable settings. The
65
+ # value-is-a-dict heuristic already excludes most; this names the known ones
66
+ # defensively so they never surface as "settings" even if dict-shaped.
67
+ _RESERVED_EXTRAS_KEYS = frozenset(
68
+ {
69
+ "workspace_stack", "task_registry", "task_runner", "cron_store",
70
+ "cron_runner", "agent_orchestrator", "subagent_manager", "mcp_manager",
71
+ "mcp_config", "notification_endpoints", "env_extras",
72
+ }
73
+ )
74
+ _SECRET_NAME_HINTS = ("key", "token", "secret", "password", "passwd", "credential")
75
+
76
+
77
+ def _coerce(value: Any, typ: type) -> Any:
78
+ """Best-effort coerce a JSON value to the config field's type."""
79
+ if typ is bool:
80
+ if isinstance(value, bool):
81
+ return value
82
+ return str(value).strip().lower() in ("1", "true", "yes", "on")
83
+ if typ is int:
84
+ return int(float(value))
85
+ if typ is float:
86
+ return float(value)
87
+ return value
88
+
89
+
40
90
  @dataclass
41
91
  class EnvChangeEntry:
42
92
  """One change-log entry for an environment mutation."""
@@ -75,6 +125,9 @@ class PipelineEnvironment:
75
125
  skill_registry: Optional[Any] = None,
76
126
  skill_fork_runner: Optional[Any] = None,
77
127
  persistence: Optional[EnvPersistence] = None,
128
+ tool_context: Optional[Any] = None,
129
+ config: Optional[Any] = None,
130
+ settings_schemas: Optional[List[Dict[str, Any]]] = None,
78
131
  ) -> None:
79
132
  self._registry = registry
80
133
  self._providers: Tuple[Any, ...] = tuple(providers or ())
@@ -82,6 +135,19 @@ class PipelineEnvironment:
82
135
  self._skill_registry = skill_registry
83
136
  self._skill_fork_runner = skill_fork_runner
84
137
  self._persistence = persistence
138
+ # Live tool-dispatch context — its ``.extras`` carries per-tool
139
+ # settings (e.g. ``extras["web_search"]["brave_api_key"]``). Editing
140
+ # this dict takes effect on the next tool call (the Tool stage reads
141
+ # ``self._context.extras`` live per dispatch).
142
+ self._tool_context = tool_context
143
+ # The running PipelineConfig — model tunables (temperature / max_tokens
144
+ # / thinking) + pipeline limits (max_iterations) are applied to state
145
+ # every turn, so editing them here takes effect next turn.
146
+ self._config = config
147
+ # Optional host-supplied descriptor of the configurable tool settings
148
+ # (groups + fields + which fields are secret) for richer discovery +
149
+ # accurate secret masking. The executor stays host-agnostic without it.
150
+ self._settings_schemas: List[Dict[str, Any]] = list(settings_schemas or [])
85
151
  self._log: List[EnvChangeEntry] = []
86
152
  self._seq = 0
87
153
  # Session-authored skills (create_skill/edit_skill) — kept so the
@@ -99,6 +165,20 @@ class PipelineEnvironment:
99
165
  """Set/replace the host persistence callback (``env_save``)."""
100
166
  self._persistence = persistence
101
167
 
168
+ def attach_tool_context(self, tool_context: Optional[Any]) -> None:
169
+ """Re-point at the live tool-dispatch context (its ``.extras`` holds
170
+ the editable per-tool settings). Called when a host swaps the context
171
+ via attach_runtime/refresh_runtime."""
172
+ self._tool_context = tool_context
173
+
174
+ def attach_config(self, config: Optional[Any]) -> None:
175
+ """Re-point at the running PipelineConfig (model tunables + limits)."""
176
+ self._config = config
177
+
178
+ def attach_settings_schemas(self, schemas: Optional[List[Dict[str, Any]]]) -> None:
179
+ """Set/replace the host descriptor of configurable tool settings."""
180
+ self._settings_schemas = list(schemas or [])
181
+
102
182
  # ── change log ────────────────────────────────────────────────────
103
183
  def _record(self, action: str, target: str, detail: str, ok: bool = True) -> None:
104
184
  self._seq += 1
@@ -159,6 +239,8 @@ class PipelineEnvironment:
159
239
  "available_tools": self.available_tools(),
160
240
  "active_skills": self.active_skills(),
161
241
  "available_skills": self.available_skills(),
242
+ "setting_groups": self._setting_groups(),
243
+ "config": {**self.get_config().get("model", {}), **self.get_config().get("pipeline", {})},
162
244
  "changes": len(self._log),
163
245
  "persistable": self._persistence is not None,
164
246
  }
@@ -231,8 +313,9 @@ class PipelineEnvironment:
231
313
  msg = f"tool '{name}' is not active"
232
314
  self._record("disable_tool", name, msg, ok=False)
233
315
  return False, msg
234
- # Guard the self-modification tools so a session can't strand itself.
235
- if name.startswith("env_"):
316
+ # Guard the self-modification tool so a session can't strand itself
317
+ # (the built-in dispatcher is named "env"; older builds used "env_*").
318
+ if name == "env" or name.startswith("env_"):
236
319
  msg = f"refusing to disable the environment control tool '{name}'"
237
320
  self._record("disable_tool", name, msg, ok=False)
238
321
  return False, msg
@@ -371,6 +454,165 @@ class PipelineEnvironment:
371
454
  self._record("edit_skill", sid, msg)
372
455
  return True, msg
373
456
 
457
+ # ── tool settings (values tools need — e.g. API keys) ─────────────
458
+ def _extras(self) -> Optional[Dict[str, Any]]:
459
+ ctx = self._tool_context
460
+ if ctx is None:
461
+ return None
462
+ ex = getattr(ctx, "extras", None)
463
+ if ex is None: # late-attached context with no extras dict yet
464
+ ex = {}
465
+ try:
466
+ ctx.extras = ex # type: ignore[attr-defined]
467
+ except Exception: # noqa: BLE001
468
+ return None
469
+ return ex if isinstance(ex, dict) else None
470
+
471
+ def _setting_groups(self) -> List[str]:
472
+ """extras keys that are editable setting groups (dict-shaped, not a
473
+ reserved runtime handle, not an internal ``__key__``)."""
474
+ ex = self._extras()
475
+ if not ex:
476
+ return []
477
+ groups = []
478
+ for k, v in ex.items():
479
+ if k in _RESERVED_EXTRAS_KEYS or str(k).startswith("__"):
480
+ continue
481
+ if isinstance(v, dict):
482
+ groups.append(k)
483
+ return sorted(groups)
484
+
485
+ def _schema_for(self, group: str) -> Optional[Dict[str, Any]]:
486
+ for sch in self._settings_schemas:
487
+ if sch.get("key") == group:
488
+ return sch
489
+ return None
490
+
491
+ def _is_secret(self, group: str, field: str) -> bool:
492
+ sch = self._schema_for(group)
493
+ if sch:
494
+ for f in sch.get("fields", []) or []:
495
+ if f.get("name") == field:
496
+ return bool(f.get("secret") or f.get("secure"))
497
+ low = field.lower()
498
+ return any(h in low for h in _SECRET_NAME_HINTS)
499
+
500
+ @staticmethod
501
+ def _mask(value: Any) -> str:
502
+ s = str(value)
503
+ if not s:
504
+ return ""
505
+ return "•" * 6 + (s[-4:] if len(s) > 4 else "")
506
+
507
+ def get_settings(self, *, reveal: bool = False) -> Dict[str, Any]:
508
+ """Current per-tool settings (secrets masked unless ``reveal``), plus
509
+ any host-declared schema so the agent can discover what's configurable."""
510
+ out: Dict[str, Any] = {"groups": {}, "schemas": self._settings_schemas}
511
+ ex = self._extras()
512
+ if ex is None:
513
+ out["note"] = "no settings context is available in this environment"
514
+ return out
515
+ for group in self._setting_groups():
516
+ vals = {}
517
+ for field, raw in (ex.get(group) or {}).items():
518
+ if not reveal and self._is_secret(group, field):
519
+ vals[field] = self._mask(raw) if raw not in (None, "") else ""
520
+ else:
521
+ vals[field] = raw
522
+ out["groups"][group] = vals
523
+ return out
524
+
525
+ def set_setting(self, key: str, field: str, value: Any) -> Tuple[bool, str]:
526
+ """Set a single tool-setting value (e.g. an API key). Takes effect on
527
+ the next call of the tool that reads ``extras[key][field]``."""
528
+ ex = self._extras()
529
+ if ex is None:
530
+ msg = "no settings context is available in this environment"
531
+ self._record("set_setting", f"{key}.{field}", msg, ok=False)
532
+ return False, msg
533
+ key = str(key).strip()
534
+ field = str(field).strip()
535
+ if not key or not field:
536
+ return False, "both 'key' and 'field' are required"
537
+ if key in _RESERVED_EXTRAS_KEYS or key.startswith("__"):
538
+ msg = f"'{key}' is a protected runtime handle, not an editable setting"
539
+ self._record("set_setting", f"{key}.{field}", msg, ok=False)
540
+ return False, msg
541
+ group = ex.get(key)
542
+ if not isinstance(group, dict):
543
+ group = {}
544
+ ex[key] = group
545
+ group[field] = value
546
+ shown = self._mask(value) if self._is_secret(key, field) else value
547
+ msg = f"set {key}.{field} = {shown}"
548
+ self._record("set_setting", f"{key}.{field}", msg)
549
+ return True, msg
550
+
551
+ # ── env config (model tunables + pipeline limits; core stays locked) ─
552
+ def get_config(self) -> Dict[str, Any]:
553
+ """Editable config knobs + their current values, plus the locked core
554
+ (model / provider) so the agent knows what it may and may not change."""
555
+ model_vals: Dict[str, Any] = {}
556
+ pipe_vals: Dict[str, Any] = {}
557
+ core: Dict[str, Any] = {}
558
+ cfg = self._config
559
+ if cfg is not None:
560
+ mc = getattr(cfg, "model", None)
561
+ if mc is not None:
562
+ for k in _TUNABLE_MODEL_KEYS:
563
+ if hasattr(mc, k):
564
+ model_vals[k] = getattr(mc, k)
565
+ core["model"] = getattr(mc, "model", None)
566
+ for k in _TUNABLE_PIPELINE_KEYS:
567
+ if hasattr(cfg, k):
568
+ pipe_vals[k] = getattr(cfg, k)
569
+ return {
570
+ "model": model_vals,
571
+ "pipeline": pipe_vals,
572
+ "locked": sorted(_CORE_LOCKED_KEYS),
573
+ "core": core,
574
+ }
575
+
576
+ def set_config(self, key: str, value: Any) -> Tuple[bool, str]:
577
+ """Edit one tunable config knob. Refuses core/locked keys (model,
578
+ provider, credentials). Takes effect next turn."""
579
+ key = str(key).strip()
580
+ if key in _CORE_LOCKED_KEYS:
581
+ msg = f"'{key}' is a core setting and cannot be changed at runtime"
582
+ self._record("set_config", key, msg, ok=False)
583
+ return False, msg
584
+ cfg = self._config
585
+ if cfg is None:
586
+ msg = "no config is available in this environment"
587
+ self._record("set_config", key, msg, ok=False)
588
+ return False, msg
589
+ try:
590
+ if key in _TUNABLE_MODEL_KEYS:
591
+ mc = getattr(cfg, "model", None)
592
+ if mc is None:
593
+ return False, "no model config available"
594
+ coerced = _coerce(value, _TUNABLE_MODEL_KEYS[key])
595
+ setattr(mc, key, coerced)
596
+ elif key in _TUNABLE_PIPELINE_KEYS:
597
+ coerced = _coerce(value, _TUNABLE_PIPELINE_KEYS[key])
598
+ setattr(cfg, key, coerced)
599
+ else:
600
+ msg = f"'{key}' is not an editable config knob"
601
+ self._record("set_config", key, msg, ok=False)
602
+ return False, msg
603
+ except Exception as exc: # noqa: BLE001
604
+ msg = f"could not set {key}: {exc}"
605
+ self._record("set_config", key, msg, ok=False)
606
+ return False, msg
607
+ msg = f"set config {key} = {coerced}"
608
+ self._record("set_config", key, msg)
609
+ return True, msg
610
+
611
+ def _config_overrides(self) -> Dict[str, Any]:
612
+ """The tunable config values (for the overlay) — restored on resume."""
613
+ snap = self.get_config()
614
+ return {"model": snap.get("model", {}), "pipeline": snap.get("pipeline", {})}
615
+
374
616
  # ── persistence (save the evolved env overlay) ────────────────────
375
617
  def overlay(self) -> Dict[str, Any]:
376
618
  """Serialise the session-scoped environment overlay (what changed)
@@ -380,6 +622,12 @@ class PipelineEnvironment:
380
622
  "active_tools": self.active_tools(),
381
623
  "active_skills": self.active_skills(),
382
624
  "authored_skills": list(self._authored_skills.values()),
625
+ # Real (unmasked) values so a resume restores working settings —
626
+ # stored in the session's own scoped storage, like the manifest.
627
+ "tool_settings": {g: dict(self._extras().get(g, {})) for g in self._setting_groups()}
628
+ if self._extras() is not None
629
+ else {},
630
+ "config": self._config_overrides(),
383
631
  "changelog": self.changelog(),
384
632
  }
385
633
 
@@ -735,6 +735,7 @@ class Pipeline:
735
735
  # _environment — the live PipelineEnvironment controller (lazy).
736
736
  self._adhoc_providers: List[Any] = []
737
737
  self._env_persistence: Any = None
738
+ self._env_settings_schemas: Any = None
738
739
  self._environment: Any = None
739
740
  self._has_started: bool = (
740
741
  False # flips once run()/run_stream() begins; gates attach_runtime
@@ -1487,6 +1488,7 @@ class Pipeline:
1487
1488
  subagent_registry: Optional[Any] = None,
1488
1489
  sandbox: Optional[Any] = None,
1489
1490
  env_persistence: Optional[Any] = None,
1491
+ env_settings_schemas: Optional[Any] = None,
1490
1492
  override_manifest: bool = False,
1491
1493
  ) -> None:
1492
1494
  """Inject session-scoped runtime objects into a manifest-built pipeline.
@@ -1640,6 +1642,7 @@ class Pipeline:
1640
1642
  subagent_registry=subagent_registry,
1641
1643
  sandbox=sandbox,
1642
1644
  env_persistence=env_persistence,
1645
+ env_settings_schemas=env_settings_schemas,
1643
1646
  override_manifest=override_manifest,
1644
1647
  )
1645
1648
 
@@ -1700,6 +1703,7 @@ class Pipeline:
1700
1703
  subagent_registry: Optional[Any] = None,
1701
1704
  sandbox: Optional[Any] = None,
1702
1705
  env_persistence: Optional[Any] = None,
1706
+ env_settings_schemas: Optional[Any] = None,
1703
1707
  override_manifest: bool = False,
1704
1708
  ) -> None:
1705
1709
  """Shared wiring behind :meth:`attach_runtime` / :meth:`refresh_runtime`.
@@ -1738,6 +1742,13 @@ class Pipeline:
1738
1742
  if self._environment is not None:
1739
1743
  self._environment.attach_persistence(env_persistence)
1740
1744
 
1745
+ if env_settings_schemas is not None:
1746
+ # Host descriptor of configurable tool settings (groups + fields +
1747
+ # which are secret) for accurate masking / discovery by env_get_settings.
1748
+ self._env_settings_schemas = env_settings_schemas
1749
+ if self._environment is not None:
1750
+ self._environment.attach_settings_schemas(env_settings_schemas)
1751
+
1741
1752
  if tool_context is not None:
1742
1753
  self._set_tool_stage_context(tool_context)
1743
1754
  # A host-supplied tool_context replaces the Tool stage's context —
@@ -1992,6 +2003,10 @@ class Pipeline:
1992
2003
  skill_registry=getattr(sp, "_registry", None) if sp else None,
1993
2004
  skill_fork_runner=getattr(sp, "_fork_runner", None) if sp else None,
1994
2005
  persistence=self._env_persistence,
2006
+ # Model tunables + pipeline limits (core model/provider stay locked).
2007
+ config=self._config,
2008
+ # Host descriptor of configurable tool settings (optional).
2009
+ settings_schemas=getattr(self, "_env_settings_schemas", None),
1995
2010
  )
1996
2011
 
1997
2012
  def _init_environment_controller(self) -> None:
@@ -2021,6 +2036,10 @@ class Pipeline:
2021
2036
  ctx = ToolContext()
2022
2037
  stage._context = ctx
2023
2038
  ctx.environment = environment
2039
+ # Give the controller the SAME context object so its setting edits
2040
+ # land on the dict the dispatch reads live (build_dispatch_context).
2041
+ if environment is not None and hasattr(environment, "attach_tool_context"):
2042
+ environment.attach_tool_context(ctx)
2024
2043
  return
2025
2044
 
2026
2045
  def _set_stage_slot_strategy(self, *, stage_name: str, slot_name: str, strategy: Any) -> None:
@@ -59,11 +59,44 @@ write actions return a short status string (and set an error flag on failure).
59
59
  - Updates only the provided fields. If the skill is active, its surfaced tool is
60
60
  refreshed to the new body.
61
61
 
62
+ ## Tool settings (values tools need — API keys, backends, URLs)
63
+
64
+ These are the variables a tool reads at run time (e.g. the web_search backend +
65
+ its API key). They live in the tool-dispatch context's `extras[group][field]`.
66
+
67
+ ### `get_settings`
68
+ - args: `{ "reveal": <bool?> }` — set `reveal: true` to see secret values
69
+ unmasked (default masks them).
70
+ - returns: `{ "groups": { "<group>": { "<field>": value }, ... },
71
+ "schemas": [...] }`. `schemas` (when the host declares them) lists each
72
+ group's fields + which are secret.
73
+
74
+ ### `set_setting`
75
+ - args: `{ "key": "<group, e.g. web_search>", "field": "<e.g. brave_api_key>",
76
+ "value": <any> }`
77
+ - Sets one value. Effective on the NEXT call of the tool that reads it. Refuses
78
+ protected runtime handles (`workspace_stack`, `task_registry`, …).
79
+
80
+ ## Config (tunable knobs; core stays locked)
81
+
82
+ ### `get_config`
83
+ - args: none
84
+ - returns: `{ "model": {temperature, max_tokens, top_p, top_k, thinking_enabled,
85
+ thinking_budget_tokens}, "pipeline": {max_iterations, cost_budget_usd,
86
+ context_window_budget, single_turn}, "locked": [...], "core": {model} }`.
87
+
88
+ ### `set_config`
89
+ - args: `{ "key": "<knob>", "value": <number/bool> }`
90
+ - Edits one tunable knob (values coerced to the field's type). Takes effect next
91
+ turn. **Refuses** core keys: `model`, `provider`, `api_key`, `base_url`,
92
+ `credentials`, `name` — the model identity and credentials cannot be changed
93
+ at runtime.
94
+
62
95
  ## Persistence
63
96
 
64
97
  ### `save`
65
98
  - args: none
66
99
  - Persists the overlay (prompt + active tools + active skills + authored skills
67
- + changelog) for THIS session via the host's persistence callback, so it is
68
- restored on resume. Returns an error string if no persistence is configured
69
- (changes still remain live for the current session).
100
+ + tool_settings + config + changelog) for THIS session via the host's
101
+ persistence callback, so it is restored on resume. Returns an error string if
102
+ no persistence is configured (changes still remain live for the session).
@@ -36,6 +36,17 @@ template) and take effect **from the next turn**. Every change is logged.
36
36
  "description": "one line — when to use it", "body": "# Title\n\nstep-by-step
37
37
  instructions"})`. It is enabled immediately. Edit later with
38
38
  `env(action="edit_skill", args={"skill_id": "...", "body": "..."})`.
39
+ - **Inspect tool settings** — `env(action="get_settings")`. Shows the
40
+ configurable values tools need (e.g. a search backend + API key); secrets are
41
+ masked. `args.schemas` describes what each group accepts when the host declares it.
42
+ - **Set a tool's value** (API key, backend, URL, …) — `env(action="set_setting",
43
+ args={"key": "web_search", "field": "brave_api_key", "value": "..."})`. Takes
44
+ effect on the next call of that tool.
45
+ - **Inspect tunable config** — `env(action="get_config")`. Model knobs
46
+ (temperature, max_tokens, thinking…) + pipeline limits (max_iterations); plus
47
+ the LOCKED core (model, provider) you cannot change.
48
+ - **Set a config knob** — `env(action="set_config", args={"key": "temperature",
49
+ "value": 0.7})`. Takes effect next turn. Core keys (model/provider) are refused.
39
50
  - **Review your changes** — `env(action="changelog")`.
40
51
  - **Save** — `env(action="save")`. Persists your evolved environment for THIS
41
52
  session so it is restored next time. (If saving isn't configured the call
@@ -46,9 +46,19 @@ class MutablePromptBuilder(PromptBuilder):
46
46
  edited — so it is a safe drop-in default.
47
47
  """
48
48
 
49
- def __init__(self, prompt: str = "", sections: Optional[List[str]] = None):
49
+ def __init__(
50
+ self,
51
+ prompt: str = "",
52
+ sections: Optional[List[str]] = None,
53
+ blocks: Optional[List[PromptBlock]] = None,
54
+ ):
50
55
  self._base = prompt
51
56
  self._sections: List[str] = [str(s) for s in (sections or [])]
57
+ # Dynamic blocks (e.g. datetime / memory) rendered per turn AFTER the
58
+ # editable base + sections. The session edits the base; these keep
59
+ # working. Lets a host (Geny) use MutablePromptBuilder in place of a
60
+ # ComposablePromptBuilder without losing its dynamic content.
61
+ self._blocks: List[PromptBlock] = list(blocks or [])
52
62
 
53
63
  @property
54
64
  def name(self) -> str:
@@ -82,16 +92,30 @@ class MutablePromptBuilder(PromptBuilder):
82
92
  """Drop all appended sections (keeps the base)."""
83
93
  self._sections = []
84
94
 
85
- def current_text(self) -> str:
86
- """The fully-rendered prompt as it stands now."""
87
- return self._render()
95
+ def add_block(self, block: PromptBlock) -> "MutablePromptBuilder":
96
+ """Append a dynamic block (rendered per turn). Chainable."""
97
+ self._blocks.append(block)
98
+ return self
88
99
 
89
- def _render(self) -> str:
100
+ def current_text(self) -> str:
101
+ """The editable prompt (base + appended sections) as it stands now.
102
+ Excludes dynamic blocks — that's the part the session owns/edits."""
90
103
  parts = [self._base, *self._sections]
91
104
  return "\n\n".join(p for p in parts if p and p.strip())
92
105
 
106
+ def _render(self, state: Optional[PipelineState]) -> str:
107
+ parts: List[str] = [self._base, *self._sections]
108
+ for block in self._blocks:
109
+ try:
110
+ rendered = block.render(state) # type: ignore[arg-type]
111
+ except Exception: # noqa: BLE001 — a broken block never breaks the prompt
112
+ continue
113
+ if rendered:
114
+ parts.append(rendered if isinstance(rendered, str) else str(rendered))
115
+ return "\n\n".join(p for p in parts if p and p.strip())
116
+
93
117
  def build(self, state: PipelineState) -> str:
94
- return self._render()
118
+ return self._render(state)
95
119
 
96
120
 
97
121
  class PersonaBlock(PromptBlock):
@@ -218,6 +218,17 @@ class ToolStage(Stage[Any, Any]):
218
218
  # (the default) means no matrix is configured and dispatch
219
219
  # behaves exactly as it did pre-Phase-7.
220
220
  permission_rules=list(getattr(self._context, "permission_rules", None) or []),
221
+ # Host-attached tool settings (e.g. ``extras["web_search"]
222
+ # ["brave_api_key"]``) read LIVE off ``self._context`` each
223
+ # dispatch — so a value edited at runtime (the ``env`` tool's
224
+ # set_setting) is visible on the very next tool call. Shallow-
225
+ # copied so a buggy tool can't drop session-wide keys; nested
226
+ # setting dicts stay shared (the edit path the controller uses).
227
+ extras=dict(getattr(self._context, "extras", None) or {}),
228
+ # The self-modifying-environment controller — likewise read live
229
+ # so the built-in ``env`` tool reaches it through real dispatch
230
+ # (not just direct calls). Without this it would see ``None``.
231
+ environment=getattr(self._context, "environment", None),
221
232
  )
222
233
 
223
234
  # 2.2.0 (audit §1-5 — policy via config): the permission posture
@@ -46,6 +46,10 @@ _ACTIONS = {
46
46
  ("skill_id", "description", "body", "allowed_tools"),
47
47
  ),
48
48
  "edit_skill": ("edit_skill", False, ("skill_id", "description", "body", "allowed_tools")),
49
+ "get_settings": ("get_settings", False, ("reveal",)),
50
+ "set_setting": ("set_setting", False, ("key", "field", "value")),
51
+ "get_config": ("get_config", False, ()),
52
+ "set_config": ("set_config", False, ("key", "value")),
49
53
  "changelog": ("changelog", False, ("limit",)),
50
54
  "save": ("save", True, ()),
51
55
  }
@@ -100,7 +104,7 @@ class EnvTool(Tool):
100
104
 
101
105
  def capabilities(self, input: Dict[str, Any]) -> ToolCapabilities:
102
106
  action = (input or {}).get("action")
103
- read_only = action in ("view", "get_prompt", "changelog")
107
+ read_only = action in ("view", "get_prompt", "changelog", "get_settings", "get_config")
104
108
  # Env edits change the active toolset/prompt — never run them in parallel
105
109
  # with other tools.
106
110
  return ToolCapabilities(concurrency_safe=False, read_only=read_only)
@@ -148,3 +148,82 @@ async def test_env_save_calls_host_persistence_with_overlay() -> None:
148
148
  assert "web_search" in saved["active_tools"]
149
149
  actions = {c["action"] for c in saved["changelog"]}
150
150
  assert {"set_prompt", "enable_tool"} <= actions
151
+
152
+
153
+ # ── dispatch-path wiring: the env tool + tool settings must survive the
154
+ # per-call ToolContext that the Tool stage builds (build_dispatch_context).
155
+
156
+
157
+ def _tool_stage(pipeline: Pipeline):
158
+ return next(s for s in pipeline._stages.values() if getattr(s, "name", "") == "tool")
159
+
160
+
161
+ @pytest.mark.asyncio
162
+ async def test_env_controller_survives_dispatch_context() -> None:
163
+ """The env tool reads ctx.environment; the Tool stage builds a fresh
164
+ ToolContext per call — that context MUST carry environment + extras."""
165
+ from geny_executor.core.state import PipelineState
166
+
167
+ prov = _Provider({"read": _NamedTool("read")})
168
+ pipeline = await _build(prov)
169
+ stage = _tool_stage(pipeline)
170
+ # Seed a tool setting on the live stage context.
171
+ stage._context.extras = {"web_search": {"brave_api_key": "SEEDKEY"}}
172
+ pipeline._set_tool_stage_environment(pipeline.environment)
173
+
174
+ state = PipelineState(session_id="s1")
175
+ dispatch_ctx = stage.build_dispatch_context(state)
176
+ assert dispatch_ctx.environment is pipeline.environment # env tool can reach it
177
+ assert dispatch_ctx.extras.get("web_search", {}).get("brave_api_key") == "SEEDKEY"
178
+
179
+
180
+ @pytest.mark.asyncio
181
+ async def test_set_setting_reaches_next_dispatch() -> None:
182
+ from geny_executor.core.state import PipelineState
183
+
184
+ prov = _Provider({"read": _NamedTool("read")})
185
+ pipeline = await _build(prov)
186
+ stage = _tool_stage(pipeline)
187
+ stage._context.extras = {}
188
+ pipeline._set_tool_stage_environment(pipeline.environment)
189
+ env = pipeline.environment
190
+
191
+ ok, _ = env.set_setting("web_search", "brave_api_key", "LIVEKEY")
192
+ assert ok
193
+ # The NEXT dispatch context sees the value the controller just wrote.
194
+ ctx = stage.build_dispatch_context(PipelineState(session_id="s1"))
195
+ assert ctx.extras["web_search"]["brave_api_key"] == "LIVEKEY"
196
+ # get_settings masks the secret by default but reveals on request.
197
+ masked = env.get_settings()["groups"]["web_search"]["brave_api_key"]
198
+ assert "LIVEKEY" not in masked and masked.endswith("EKEY")
199
+ assert env.get_settings(reveal=True)["groups"]["web_search"]["brave_api_key"] == "LIVEKEY"
200
+
201
+
202
+ @pytest.mark.asyncio
203
+ async def test_config_tunables_editable_core_locked() -> None:
204
+ prov = _Provider({"read": _NamedTool("read")})
205
+ pipeline = await _build(prov)
206
+ env = pipeline.environment
207
+
208
+ ok, _ = env.set_config("temperature", 0.7)
209
+ assert ok
210
+ assert pipeline._config.model.temperature == 0.7
211
+ ok, _ = env.set_config("max_iterations", 12)
212
+ assert ok
213
+ assert pipeline._config.max_iterations == 12
214
+ # Core stays locked.
215
+ ok, msg = env.set_config("model", "claude-opus-4-8")
216
+ assert not ok and "core" in msg.lower()
217
+ ok, msg = env.set_config("provider", "openai")
218
+ assert not ok
219
+ assert "model" in env.get_config()["locked"]
220
+
221
+
222
+ @pytest.mark.asyncio
223
+ async def test_env_tool_cannot_be_disabled() -> None:
224
+ prov = _Provider({"read": _NamedTool("read")})
225
+ pipeline = await _build(prov)
226
+ env = pipeline.environment
227
+ ok, msg = env.disable_tool("env")
228
+ assert not ok and "refusing" in msg.lower()
229
+ assert "env" in env.active_tools()
File without changes
File without changes