geny-executor 2.4.1__tar.gz → 2.5.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 (691) hide show
  1. {geny_executor-2.4.1 → geny_executor-2.5.0}/PKG-INFO +1 -1
  2. {geny_executor-2.4.1 → geny_executor-2.5.0}/pyproject.toml +1 -1
  3. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/__init__.py +0 -1
  4. geny_executor-2.5.0/src/geny_executor/core/compaction.py +120 -0
  5. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/manifest_factory.py +2 -6
  6. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/pipeline.py +20 -0
  7. geny_executor-2.5.0/src/geny_executor/core/token_estimate.py +87 -0
  8. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/events/catalog.py +21 -1
  9. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/provider.py +48 -1
  10. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/artifact/default/stage.py +12 -8
  11. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/interface.py +8 -0
  12. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/artifact/default/guards.py +34 -7
  13. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/artifact/default/stage.py +87 -7
  14. geny_executor-2.5.0/src/geny_executor/stages/s04_guard/types.py +20 -0
  15. geny_executor-2.5.0/tests/unit/test_budget_compaction_recovery.py +339 -0
  16. geny_executor-2.4.1/src/geny_executor/stages/s04_guard/types.py +0 -15
  17. {geny_executor-2.4.1 → geny_executor-2.5.0}/.gitignore +0 -0
  18. {geny_executor-2.4.1 → geny_executor-2.5.0}/LICENSE +0 -0
  19. {geny_executor-2.4.1 → geny_executor-2.5.0}/README.md +0 -0
  20. {geny_executor-2.4.1 → geny_executor-2.5.0}/README_ko.md +0 -0
  21. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/channels/__init__.py +0 -0
  22. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/channels/send_message_channel.py +0 -0
  23. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/channels/user_file_channel.py +0 -0
  24. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/__init__.py +0 -0
  25. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/artifact.py +0 -0
  26. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/builder.py +0 -0
  27. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/config.py +0 -0
  28. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/diff.py +0 -0
  29. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/environment.py +0 -0
  30. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/errors.py +0 -0
  31. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/introspection.py +0 -0
  32. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/mutation.py +0 -0
  33. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/presets.py +0 -0
  34. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/result.py +0 -0
  35. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/schema.py +0 -0
  36. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/shared_keys.py +0 -0
  37. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/slot.py +0 -0
  38. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/snapshot.py +0 -0
  39. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/stage.py +0 -0
  40. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/state.py +0 -0
  41. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/__init__.py +0 -0
  42. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/runner.py +0 -0
  43. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/store_abc.py +0 -0
  44. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/store_impl/__init__.py +0 -0
  45. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/store_impl/file_backed.py +0 -0
  46. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/store_impl/in_memory.py +0 -0
  47. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/types.py +0 -0
  48. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/events/__init__.py +0 -0
  49. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/events/bus.py +0 -0
  50. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/events/types.py +0 -0
  51. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/__init__.py +0 -0
  52. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/ab_test.py +0 -0
  53. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/cost.py +0 -0
  54. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/models.py +0 -0
  55. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/monitor.py +0 -0
  56. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/replay.py +0 -0
  57. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/service.py +0 -0
  58. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/hooks/__init__.py +0 -0
  59. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/hooks/config.py +0 -0
  60. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/hooks/events.py +0 -0
  61. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/hooks/runner.py +0 -0
  62. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/__init__.py +0 -0
  63. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/_cli_runtime.py +0 -0
  64. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/anthropic.py +0 -0
  65. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/base.py +0 -0
  66. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/claude_code.py +0 -0
  67. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/credentials.py +0 -0
  68. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/google.py +0 -0
  69. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/openai.py +0 -0
  70. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/registry.py +0 -0
  71. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/translators/__init__.py +0 -0
  72. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/translators/_canonical.py +0 -0
  73. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/translators/_cli.py +0 -0
  74. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/types.py +0 -0
  75. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/vllm.py +0 -0
  76. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/__init__.py +0 -0
  77. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/_locks.py +0 -0
  78. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/_progressive.py +0 -0
  79. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/composite/__init__.py +0 -0
  80. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/composite/handles.py +0 -0
  81. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/composite/provider.py +0 -0
  82. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/composite/routing.py +0 -0
  83. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/composite/snapshot.py +0 -0
  84. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/__init__.py +0 -0
  85. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/client.py +0 -0
  86. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/google.py +0 -0
  87. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/local.py +0 -0
  88. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/openai.py +0 -0
  89. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/registry.py +0 -0
  90. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/voyage.py +0 -0
  91. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/factory.py +0 -0
  92. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/presets.py +0 -0
  93. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/provider.py +0 -0
  94. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/__init__.py +0 -0
  95. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/ephemeral.py +0 -0
  96. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/__init__.py +0 -0
  97. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/config.py +0 -0
  98. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/frontmatter.py +0 -0
  99. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/index_store.py +0 -0
  100. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/layout.py +0 -0
  101. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/ltm_store.py +0 -0
  102. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/notes_store.py +0 -0
  103. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/snapshot.py +0 -0
  104. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/stm_store.py +0 -0
  105. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/timezone.py +0 -0
  106. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/vector_store.py +0 -0
  107. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/__init__.py +0 -0
  108. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/config.py +0 -0
  109. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/connection.py +0 -0
  110. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/index_store.py +0 -0
  111. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/ltm_store.py +0 -0
  112. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/notes_store.py +0 -0
  113. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/provider.py +0 -0
  114. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/schema.py +0 -0
  115. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/snapshot.py +0 -0
  116. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/stm_store.py +0 -0
  117. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/vector_store.py +0 -0
  118. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/retriever.py +0 -0
  119. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/strategy.py +0 -0
  120. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/notifications/__init__.py +0 -0
  121. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/notifications/registry.py +0 -0
  122. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/permission/__init__.py +0 -0
  123. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/permission/loader.py +0 -0
  124. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/permission/matrix.py +0 -0
  125. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/permission/types.py +0 -0
  126. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/py.typed +0 -0
  127. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/runtime/__init__.py +0 -0
  128. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/runtime/task_executors.py +0 -0
  129. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/runtime/task_runner.py +0 -0
  130. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/security/__init__.py +0 -0
  131. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/security/import_validator.py +0 -0
  132. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/security/script_sandbox.py +0 -0
  133. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/session/__init__.py +0 -0
  134. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/session/freshness.py +0 -0
  135. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/session/manager.py +0 -0
  136. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/session/persistence.py +0 -0
  137. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/session/session.py +0 -0
  138. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/settings/__init__.py +0 -0
  139. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/settings/loader.py +0 -0
  140. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/settings/section_registry.py +0 -0
  141. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/__init__.py +0 -0
  142. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/batch/SKILL.md +0 -0
  143. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/debug/SKILL.md +0 -0
  144. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/loop/SKILL.md +0 -0
  145. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/lorem-ipsum/SKILL.md +0 -0
  146. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/simplify/SKILL.md +0 -0
  147. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/skillify/SKILL.md +0 -0
  148. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/stuck/SKILL.md +0 -0
  149. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/verify/SKILL.md +0 -0
  150. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled_skills.py +0 -0
  151. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/fork.py +0 -0
  152. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/frontmatter.py +0 -0
  153. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/loader.py +0 -0
  154. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/mcp_bridge.py +0 -0
  155. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/path_match.py +0 -0
  156. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/registry.py +0 -0
  157. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/shell_blocks.py +0 -0
  158. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/skill_tool.py +0 -0
  159. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/types.py +0 -0
  160. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/watcher.py +0 -0
  161. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/__init__.py +0 -0
  162. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/__init__.py +0 -0
  163. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/_helpers.py +0 -0
  164. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/cancel.py +0 -0
  165. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/clear.py +0 -0
  166. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/compact.py +0 -0
  167. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/config.py +0 -0
  168. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/context.py +0 -0
  169. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/cost.py +0 -0
  170. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/help.py +0 -0
  171. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/memory.py +0 -0
  172. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/model.py +0 -0
  173. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/preset_info.py +0 -0
  174. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/status.py +0 -0
  175. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/tasks.py +0 -0
  176. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/md_template.py +0 -0
  177. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/parser.py +0 -0
  178. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/registry.py +0 -0
  179. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/types.py +0 -0
  180. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/__init__.py +0 -0
  181. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/__init__.py +0 -0
  182. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/artifact/__init__.py +0 -0
  183. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/artifact/default/__init__.py +0 -0
  184. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/artifact/default/normalizers.py +0 -0
  185. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/artifact/default/stage.py +0 -0
  186. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/artifact/default/validators.py +0 -0
  187. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/interface.py +0 -0
  188. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/normalizers.py +0 -0
  189. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/stage.py +0 -0
  190. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/types.py +0 -0
  191. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/validators.py +0 -0
  192. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/__init__.py +0 -0
  193. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/artifact/__init__.py +0 -0
  194. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/artifact/default/__init__.py +0 -0
  195. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/artifact/default/compactors.py +0 -0
  196. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/artifact/default/retrievers.py +0 -0
  197. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/artifact/default/strategies.py +0 -0
  198. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/compactors.py +0 -0
  199. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/retrievers.py +0 -0
  200. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/stage.py +0 -0
  201. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/strategies.py +0 -0
  202. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/types.py +0 -0
  203. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/__init__.py +0 -0
  204. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/artifact/__init__.py +0 -0
  205. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/artifact/default/__init__.py +0 -0
  206. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/artifact/default/builders.py +0 -0
  207. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/artifact/default/stage.py +0 -0
  208. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/builders.py +0 -0
  209. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/interface.py +0 -0
  210. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/persona/__init__.py +0 -0
  211. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/persona/builder.py +0 -0
  212. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/persona/provider.py +0 -0
  213. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/stage.py +0 -0
  214. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/__init__.py +0 -0
  215. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/artifact/__init__.py +0 -0
  216. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/artifact/default/__init__.py +0 -0
  217. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/guards.py +0 -0
  218. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/interface.py +0 -0
  219. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/stage.py +0 -0
  220. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/__init__.py +0 -0
  221. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/artifact/__init__.py +0 -0
  222. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/artifact/default/__init__.py +0 -0
  223. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/artifact/default/stage.py +0 -0
  224. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/artifact/default/strategies.py +0 -0
  225. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/interface.py +0 -0
  226. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/stage.py +0 -0
  227. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/strategies.py +0 -0
  228. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/__init__.py +0 -0
  229. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/_translate.py +0 -0
  230. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/__init__.py +0 -0
  231. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/default/__init__.py +0 -0
  232. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/default/providers.py +0 -0
  233. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/default/retry.py +0 -0
  234. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/default/router.py +0 -0
  235. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/default/stage.py +0 -0
  236. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/default/tool_loop.py +0 -0
  237. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/google/__init__.py +0 -0
  238. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/google/providers.py +0 -0
  239. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/openai/__init__.py +0 -0
  240. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/openai/providers.py +0 -0
  241. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/interface.py +0 -0
  242. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/providers.py +0 -0
  243. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/retry.py +0 -0
  244. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/stage.py +0 -0
  245. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/types.py +0 -0
  246. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/__init__.py +0 -0
  247. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/artifact/__init__.py +0 -0
  248. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/artifact/default/__init__.py +0 -0
  249. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/artifact/default/pricing.py +0 -0
  250. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/artifact/default/stage.py +0 -0
  251. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/artifact/default/trackers.py +0 -0
  252. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/interface.py +0 -0
  253. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/pricing.py +0 -0
  254. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/stage.py +0 -0
  255. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/trackers.py +0 -0
  256. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/__init__.py +0 -0
  257. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/artifact/default/__init__.py +0 -0
  258. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/artifact/default/budget.py +0 -0
  259. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/artifact/default/processors.py +0 -0
  260. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/artifact/default/stage.py +0 -0
  261. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/interface.py +0 -0
  262. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/processors.py +0 -0
  263. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/stage.py +0 -0
  264. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/types.py +0 -0
  265. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/__init__.py +0 -0
  266. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/artifact/default/__init__.py +0 -0
  267. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/artifact/default/parsers.py +0 -0
  268. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/artifact/default/signals.py +0 -0
  269. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/artifact/default/stage.py +0 -0
  270. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/interface.py +0 -0
  271. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/parsers.py +0 -0
  272. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/signals.py +0 -0
  273. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/stage.py +0 -0
  274. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/types.py +0 -0
  275. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/__init__.py +0 -0
  276. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/artifact/__init__.py +0 -0
  277. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/artifact/default/__init__.py +0 -0
  278. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/artifact/default/executors.py +0 -0
  279. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/artifact/default/routers.py +0 -0
  280. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/artifact/default/stage.py +0 -0
  281. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/dispatcher.py +0 -0
  282. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/executors.py +0 -0
  283. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/interface.py +0 -0
  284. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/persistence.py +0 -0
  285. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/routers.py +0 -0
  286. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/stage.py +0 -0
  287. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/state_mutation.py +0 -0
  288. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/streaming.py +0 -0
  289. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s11_tool_review/__init__.py +0 -0
  290. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s11_tool_review/artifact/__init__.py +0 -0
  291. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s11_tool_review/artifact/default/__init__.py +0 -0
  292. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s11_tool_review/artifact/default/reviewers.py +0 -0
  293. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s11_tool_review/artifact/default/stage.py +0 -0
  294. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s11_tool_review/interface.py +0 -0
  295. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/__init__.py +0 -0
  296. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/artifact/__init__.py +0 -0
  297. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/artifact/default/__init__.py +0 -0
  298. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/artifact/default/orchestrators.py +0 -0
  299. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/artifact/default/stage.py +0 -0
  300. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/interface.py +0 -0
  301. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/orchestrators.py +0 -0
  302. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/stage.py +0 -0
  303. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/subagent_type.py +0 -0
  304. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/types.py +0 -0
  305. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/__init__.py +0 -0
  306. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/artifact/__init__.py +0 -0
  307. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/artifact/default/__init__.py +0 -0
  308. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/artifact/default/file_backed_registry.py +0 -0
  309. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/artifact/default/policies.py +0 -0
  310. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/artifact/default/registry.py +0 -0
  311. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/artifact/default/stage.py +0 -0
  312. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/interface.py +0 -0
  313. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/types.py +0 -0
  314. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/__init__.py +0 -0
  315. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/artifact/__init__.py +0 -0
  316. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/__init__.py +0 -0
  317. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/strategy.py +0 -0
  318. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/artifact/default/__init__.py +0 -0
  319. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/artifact/default/stage.py +0 -0
  320. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/artifact/default/strategies.py +0 -0
  321. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/interface.py +0 -0
  322. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/stage.py +0 -0
  323. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/strategies.py +0 -0
  324. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/types.py +0 -0
  325. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/__init__.py +0 -0
  326. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/artifact/__init__.py +0 -0
  327. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/artifact/default/__init__.py +0 -0
  328. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/artifact/default/requesters.py +0 -0
  329. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/artifact/default/stage.py +0 -0
  330. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/artifact/default/timeouts.py +0 -0
  331. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/interface.py +0 -0
  332. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/types.py +0 -0
  333. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/__init__.py +0 -0
  334. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/artifact/__init__.py +0 -0
  335. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/artifact/default/__init__.py +0 -0
  336. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/artifact/default/controllers.py +0 -0
  337. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/artifact/default/stage.py +0 -0
  338. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/controllers.py +0 -0
  339. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/interface.py +0 -0
  340. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/stage.py +0 -0
  341. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/__init__.py +0 -0
  342. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/artifact/__init__.py +0 -0
  343. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/artifact/default/__init__.py +0 -0
  344. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/artifact/default/emitters.py +0 -0
  345. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/artifact/default/stage.py +0 -0
  346. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/emitters.py +0 -0
  347. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/interface.py +0 -0
  348. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/stage.py +0 -0
  349. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/types.py +0 -0
  350. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/__init__.py +0 -0
  351. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/_dehydrate.py +0 -0
  352. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/artifact/__init__.py +0 -0
  353. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/artifact/default/__init__.py +0 -0
  354. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/artifact/default/persistence.py +0 -0
  355. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/artifact/default/stage.py +0 -0
  356. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/artifact/default/strategies.py +0 -0
  357. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/insight.py +0 -0
  358. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/interface.py +0 -0
  359. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/persistence.py +0 -0
  360. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/stage.py +0 -0
  361. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/strategies.py +0 -0
  362. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/__init__.py +0 -0
  363. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/artifact/__init__.py +0 -0
  364. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/artifact/default/__init__.py +0 -0
  365. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/artifact/default/importance.py +0 -0
  366. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/artifact/default/stage.py +0 -0
  367. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/artifact/default/summarizers.py +0 -0
  368. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/frequency_policy.py +0 -0
  369. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/interface.py +0 -0
  370. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/types.py +0 -0
  371. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/__init__.py +0 -0
  372. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/artifact/__init__.py +0 -0
  373. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/artifact/default/__init__.py +0 -0
  374. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/artifact/default/frequencies.py +0 -0
  375. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/artifact/default/persisters.py +0 -0
  376. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/artifact/default/stage.py +0 -0
  377. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/interface.py +0 -0
  378. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/restore.py +0 -0
  379. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/types.py +0 -0
  380. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/__init__.py +0 -0
  381. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/artifact/__init__.py +0 -0
  382. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/artifact/default/__init__.py +0 -0
  383. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/artifact/default/formatters.py +0 -0
  384. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/artifact/default/multi_format.py +0 -0
  385. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/artifact/default/stage.py +0 -0
  386. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/formatters.py +0 -0
  387. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/interface.py +0 -0
  388. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/stage.py +0 -0
  389. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/__init__.py +0 -0
  390. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/adhoc.py +0 -0
  391. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/base.py +0 -0
  392. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/__init__.py +0 -0
  393. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/_path_guard.py +0 -0
  394. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/agent_tool.py +0 -0
  395. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/ask_user_question_tool.py +0 -0
  396. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/bash_tool.py +0 -0
  397. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/cron_tools.py +0 -0
  398. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/dev_tools.py +0 -0
  399. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/edit_tool.py +0 -0
  400. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/glob_tool.py +0 -0
  401. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/grep_tool.py +0 -0
  402. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/mcp_wrapper_tools.py +0 -0
  403. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/notebook_edit_tool.py +0 -0
  404. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/operator_tools.py +0 -0
  405. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/plan_mode_tools.py +0 -0
  406. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/push_notification_tool.py +0 -0
  407. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/read_tool.py +0 -0
  408. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/send_message_tool.py +0 -0
  409. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/task_tools.py +0 -0
  410. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/todo_write_tool.py +0 -0
  411. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/tool_search_tool.py +0 -0
  412. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/web_fetch_tool.py +0 -0
  413. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/web_search_tool.py +0 -0
  414. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/worktree_tools.py +0 -0
  415. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/write_tool.py +0 -0
  416. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/composer.py +0 -0
  417. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/errors.py +0 -0
  418. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/__init__.py +0 -0
  419. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/adapter.py +0 -0
  420. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/credentials.py +0 -0
  421. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/errors.py +0 -0
  422. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/manager.py +0 -0
  423. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/oauth.py +0 -0
  424. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/state.py +0 -0
  425. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/uri.py +0 -0
  426. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/provider.py +0 -0
  427. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/providers.py +0 -0
  428. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/registry.py +0 -0
  429. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/sandbox.py +0 -0
  430. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/scope.py +0 -0
  431. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/stage_binding.py +0 -0
  432. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/workspace/__init__.py +0 -0
  433. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/workspace/stack.py +0 -0
  434. {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/workspace/types.py +0 -0
  435. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/__init__.py +0 -0
  436. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/_fixtures/__init__.py +0 -0
  437. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/_fixtures/fake_claude.py +0 -0
  438. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/_fixtures/fake_echo_cli.py +0 -0
  439. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/_fixtures/geny_manifest_layout.json +0 -0
  440. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/_fixtures/manifest_entries.py +0 -0
  441. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/__init__.py +0 -0
  442. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/conftest.py +0 -0
  443. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/fixtures/__init__.py +0 -0
  444. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/fixtures/adapter/__init__.py +0 -0
  445. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/fixtures/adapter/adapter.py +0 -0
  446. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c1_six_layer_retrieval.py +0 -0
  447. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c2_execution_recording.py +0 -0
  448. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c3_reflection_and_promotion.py +0 -0
  449. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c4_rest_coverage.py +0 -0
  450. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c5_embedding_migration.py +0 -0
  451. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c6_session_resume.py +0 -0
  452. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c7_adapter_parity.py +0 -0
  453. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_spec_loads.py +0 -0
  454. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/__init__.py +0 -0
  455. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/memory_provider_contract.py +0 -0
  456. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_embedding_clients.py +0 -0
  457. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_error_codes_stability.py +0 -0
  458. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_embedding_credentials.py +0 -0
  459. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_auto_vector.py +0 -0
  460. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_composite.py +0 -0
  461. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_composite_routing.py +0 -0
  462. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_curated_global.py +0 -0
  463. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_ephemeral.py +0 -0
  464. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_factory.py +0 -0
  465. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_file.py +0 -0
  466. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_file_layout.py +0 -0
  467. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_file_vector.py +0 -0
  468. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_sql.py +0 -0
  469. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_sql_dialect.py +0 -0
  470. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_sql_schema.py +0 -0
  471. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_sql_vector.py +0 -0
  472. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_vector_breaker.py +0 -0
  473. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_stage_uniformity.py +0 -0
  474. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/integration/test_cycle_ab_cross_import.py +0 -0
  475. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/integration/test_integration.py +0 -0
  476. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/__init__.py +0 -0
  477. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/__init__.py +0 -0
  478. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/harness.py +0 -0
  479. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/test_anthropic.py +0 -0
  480. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/test_claude_code_cli.py +0 -0
  481. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/test_google.py +0 -0
  482. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/test_openai.py +0 -0
  483. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/test_vllm.py +0 -0
  484. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/__init__.py +0 -0
  485. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/cli-2.1.149-json.json +0 -0
  486. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/cli-2.1.149-json.meta +0 -0
  487. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/cli-2.1.149-stream.jsonl +0 -0
  488. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/cli-2.1.149-stream.meta +0 -0
  489. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/cli-2.1.162-stream.jsonl +0 -0
  490. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/cli-2.1.162-stream.meta +0 -0
  491. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/test_golden_replay.py +0 -0
  492. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/live/__init__.py +0 -0
  493. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/live/test_live_canaries.py +0 -0
  494. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/__init__.py +0 -0
  495. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_anthropic_build_kwargs.py +0 -0
  496. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_anthropic_classify.py +0 -0
  497. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_base_client.py +0 -0
  498. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_claude_code.py +0 -0
  499. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_cli_cancellation.py +0 -0
  500. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_cli_event_forwarding.py +0 -0
  501. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_cli_runtime.py +0 -0
  502. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_credentials.py +0 -0
  503. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_google_classify.py +0 -0
  504. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_openai_client.py +0 -0
  505. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_translators_cli_claude_code.py +0 -0
  506. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/__init__.py +0 -0
  507. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_adaptive_model_router.py +0 -0
  508. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_adaptive_router_configure.py +0 -0
  509. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_adaptive_thinking_budget.py +0 -0
  510. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_adhoc_providers.py +0 -0
  511. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_agent_tool.py +0 -0
  512. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_api_timeout_kwarg.py +0 -0
  513. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_artifact_metadata.py +0 -0
  514. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_ask_user_question_tool.py +0 -0
  515. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_attach_llm_client_guard.py +0 -0
  516. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_binary_classify_manifest.py +0 -0
  517. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_built_in_autoregister.py +0 -0
  518. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_builtin_capabilities.py +0 -0
  519. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_builtin_features.py +0 -0
  520. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_cache_prefix_key.py +0 -0
  521. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_cancellation.py +0 -0
  522. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_cli_mcp_passthrough.py +0 -0
  523. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_composite_set_hooks.py +0 -0
  524. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_concurrent_runs.py +0 -0
  525. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_config_liveness.py +0 -0
  526. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_cron_runner.py +0 -0
  527. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_cron_store.py +0 -0
  528. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_cron_tools.py +0 -0
  529. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_dev_tools.py +0 -0
  530. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_diff_order_keyed.py +0 -0
  531. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_dynamic_persona_builder.py +0 -0
  532. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_embedding_error_classification.py +0 -0
  533. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_errors_categories.py +0 -0
  534. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_evaluation_chain.py +0 -0
  535. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_evaluation_chain_configure.py +0 -0
  536. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_event_catalog.py +0 -0
  537. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_event_channel_unification.py +0 -0
  538. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_event_correlation.py +0 -0
  539. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_external_tool_resolution.py +0 -0
  540. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_fork_multi_provider.py +0 -0
  541. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_from_manifest_strict_validation.py +0 -0
  542. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_geny_prod_manifest_repro.py +0 -0
  543. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_guard_fail_fast.py +0 -0
  544. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_hierarchical_sidecars.py +0 -0
  545. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_hook_gate_split.py +0 -0
  546. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_hook_in_process.py +0 -0
  547. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_hook_runner.py +0 -0
  548. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_hook_taxonomy.py +0 -0
  549. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_hooks_and_shared_keys.py +0 -0
  550. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_host_selections_resolve.py +0 -0
  551. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_index_list_categories.py +0 -0
  552. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_index_render_vault_map.py +0 -0
  553. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_interaction_fields.py +0 -0
  554. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_internal_agentic_loop.py +0 -0
  555. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_introspection.py +0 -0
  556. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_llm_client_base.py +0 -0
  557. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_llm_client_capabilities.py +0 -0
  558. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_llm_client_registry.py +0 -0
  559. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_llm_client_request_types.py +0 -0
  560. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_llm_client_state.py +0 -0
  561. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_llm_summary_compactor.py +0 -0
  562. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_loop_agnostic_lock.py +0 -0
  563. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_factory.py +0 -0
  564. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_from_dict_hygiene.py +0 -0
  565. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_memory_wiring.py +0 -0
  566. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_provider_validation.py +0 -0
  567. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_subagents_memory_sections.py +0 -0
  568. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_v2.py +0 -0
  569. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_v3_migration.py +0 -0
  570. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_annotations_attach.py +0 -0
  571. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_credential_store.py +0 -0
  572. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_fsm.py +0 -0
  573. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_lifecycle.py +0 -0
  574. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_namespace.py +0 -0
  575. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_oauth.py +0 -0
  576. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_prompts_skills_bridge.py +0 -0
  577. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_resource_retriever.py +0 -0
  578. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_uri.py +0 -0
  579. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_wrapper_tools.py +0 -0
  580. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_memory_aware_retriever.py +0 -0
  581. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_memory_hooks_after_callbacks.py +0 -0
  582. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_memory_metadata_extension.py +0 -0
  583. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_model_overrides.py +0 -0
  584. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_multi_dim_budget_configure.py +0 -0
  585. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_multi_dim_budget_controller.py +0 -0
  586. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_multi_format_yield.py +0 -0
  587. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_multi_provider.py +0 -0
  588. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_multimodal.py +0 -0
  589. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_note_graph_queries.py +0 -0
  590. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_notebook_edit_tool.py +0 -0
  591. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_notes_load_pinned.py +0 -0
  592. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_operator_tools.py +0 -0
  593. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_ordered_emitter_chain.py +0 -0
  594. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_permission_matrix.py +0 -0
  595. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_permission_mode_promotions.py +0 -0
  596. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_permission_posture.py +0 -0
  597. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase1_foundation.py +0 -0
  598. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase1_pipeline.py +0 -0
  599. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase2_agent_loop.py +0 -0
  600. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase2_tools.py +0 -0
  601. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase3_context_memory.py +0 -0
  602. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase4_think_agent_evaluate.py +0 -0
  603. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase5_emit_presets_mcp.py +0 -0
  604. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase5_environment.py +0 -0
  605. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase6_history.py +0 -0
  606. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase6_integration.py +0 -0
  607. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase7_security.py +0 -0
  608. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase9a_preset_regen.py +0 -0
  609. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase9a_scaffolding.py +0 -0
  610. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_pipeline_aclose.py +0 -0
  611. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_pipeline_attach_runtime.py +0 -0
  612. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_pipeline_events_tap.py +0 -0
  613. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_pipeline_from_manifest.py +0 -0
  614. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_pipeline_hook_lifecycle.py +0 -0
  615. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_pipeline_session_runtime.py +0 -0
  616. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_plan_mode_tools.py +0 -0
  617. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_primary_provider_and_build_reports.py +0 -0
  618. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_progressive_disclosure.py +0 -0
  619. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_provider_driven_strategy.py +0 -0
  620. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_push_notification_tool.py +0 -0
  621. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_refresh_backlinks_extension.py +0 -0
  622. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_refresh_runtime_and_run_lock.py +0 -0
  623. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_resolve_model_config.py +0 -0
  624. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_restore_bad_strategy_config.py +0 -0
  625. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_reviewer_policy_configure.py +0 -0
  626. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_runtime_task_runner.py +0 -0
  627. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s06_chunk_forwarding.py +0 -0
  628. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s06_provider_selection.py +0 -0
  629. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s13_file_backed_registry.py +0 -0
  630. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s13_task_registry_output.py +0 -0
  631. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s19_frequency_policy.py +0 -0
  632. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9b1_tool_review.py +0 -0
  633. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9b2_task_registry.py +0 -0
  634. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9b3_hitl.py +0 -0
  635. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9b4_summarize.py +0 -0
  636. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9b5_persist.py +0 -0
  637. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9c1_pipeline_resume.py +0 -0
  638. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9c2_restore_state.py +0 -0
  639. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_send_message_tool.py +0 -0
  640. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_settings_loader.py +0 -0
  641. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_1.py +0 -0
  642. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_2.py +0 -0
  643. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_3.py +0 -0
  644. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_4_bundled.py +0 -0
  645. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_5_fork.py +0 -0
  646. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_6_killer.py +0 -0
  647. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_7_watcher.py +0 -0
  648. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_richer_schema.py +0 -0
  649. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_tool.py +0 -0
  650. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skills_foundation.py +0 -0
  651. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_slash_built_in_control.py +0 -0
  652. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_slash_built_in_introspection.py +0 -0
  653. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_slash_commands.py +0 -0
  654. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_slash_md_template.py +0 -0
  655. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_stage10_ask_hitl.py +0 -0
  656. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_stage10_hook_wiring.py +0 -0
  657. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_stage10_partition_executor.py +0 -0
  658. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_stage10_permission_matrix.py +0 -0
  659. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_stage19_session_summary.py +0 -0
  660. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_state_mutation_wiring.py +0 -0
  661. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_state_shared_and_local.py +0 -0
  662. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_stm_append_event.py +0 -0
  663. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_strategy_config_roundtrip.py +0 -0
  664. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_streaming_tool_executor.py +0 -0
  665. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_structured_output_parser.py +0 -0
  666. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_structured_reflection.py +0 -0
  667. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_credential_propagation.py +0 -0
  668. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_descriptor.py +0 -0
  669. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_manifest_compile.py +0 -0
  670. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_orchestrator_zero_arg.py +0 -0
  671. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_parallel.py +0 -0
  672. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_pipeline_lifecycle.py +0 -0
  673. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_type_orchestrator.py +0 -0
  674. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_task_tools.py +0 -0
  675. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_todo_write_tool.py +0 -0
  676. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_abc_uplift.py +0 -0
  677. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_call_events.py +0 -0
  678. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_errors.py +0 -0
  679. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_lifecycle_hooks.py +0 -0
  680. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_provider.py +0 -0
  681. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_result_persistence.py +0 -0
  682. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_search_tool.py +0 -0
  683. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_stage_max_concurrency.py +0 -0
  684. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_turn_boundary_state.py +0 -0
  685. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_validate_manifest.py +0 -0
  686. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_web_fetch_tool.py +0 -0
  687. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_web_search_tool.py +0 -0
  688. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_workspace.py +0 -0
  689. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_workspace_propagation.py +0 -0
  690. {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_workspace_tools_integration.py +0 -0
  691. {geny_executor-2.4.1 → geny_executor-2.5.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.4.1
3
+ Version: 2.5.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.4.1"
7
+ version = "2.5.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"
@@ -126,7 +126,6 @@ from geny_executor.stages.s12_agent.subagent_type import (
126
126
  # Single source of truth: read the installed distribution version so
127
127
  # ``__version__`` can never drift from ``pyproject.toml`` again.
128
128
  try:
129
- from importlib.metadata import PackageNotFoundError as _PkgNotFound
130
129
  from importlib.metadata import version as _pkg_version
131
130
 
132
131
  __version__ = _pkg_version("geny-executor")
@@ -0,0 +1,120 @@
1
+ """Shared compaction runner — one place that runs a compactor, emits a
2
+ uniform event, and persists the snapshot to a memory provider.
3
+
4
+ Both the Stage 2 proactive trigger (context near 80%) and the Stage 4
5
+ reactive token-budget guard (context near the hard ceiling) compact the
6
+ SAME ``state.messages`` with the SAME compactor instance. Centralising
7
+ "compact + record" here guarantees they log and persist identically, and
8
+ that the snapshot is never written twice (a host wrapper that records its
9
+ own snapshot sets ``compactor.persists_own_compaction = True``).
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import logging
15
+ from typing import Any, Optional
16
+
17
+ from geny_executor.core.state import PipelineState
18
+ from geny_executor.core.token_estimate import estimate_prompt_tokens
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ def _compactor_name(compactor: Any) -> str:
24
+ return str(getattr(compactor, "name", None) or type(compactor).__name__)
25
+
26
+
27
+ def _summary_text(state: PipelineState) -> str:
28
+ """Best-effort extraction of the summary a compactor placed at the head."""
29
+ msgs = state.messages or []
30
+ if not msgs:
31
+ return ""
32
+ head = msgs[0]
33
+ if not isinstance(head, dict):
34
+ return ""
35
+ content = head.get("content", "")
36
+ if isinstance(content, str):
37
+ return content
38
+ if isinstance(content, list):
39
+ parts = [
40
+ b.get("text", "") for b in content if isinstance(b, dict) and b.get("type") == "text"
41
+ ]
42
+ return "\n".join(p for p in parts if p)
43
+ return ""
44
+
45
+
46
+ async def run_compaction(
47
+ state: PipelineState,
48
+ compactor: Any,
49
+ *,
50
+ trigger: str,
51
+ provider: Optional[Any] = None,
52
+ ) -> dict:
53
+ """Run ``compactor`` against ``state`` and return a result summary dict.
54
+
55
+ Emits a ``context.compacted`` event carrying ``trigger`` ("proactive"
56
+ from Stage 2, "guard" from Stage 4) and, when a provider exposes
57
+ ``record_compaction`` and the compactor does not persist its own
58
+ snapshot, records the snapshot to the provider's "compactions"
59
+ category. Never raises — compaction is best-effort relief, not a
60
+ correctness gate; failures are logged as events and swallowed.
61
+ """
62
+ before_msgs = len(state.messages or [])
63
+ before_tokens = estimate_prompt_tokens(state)
64
+
65
+ try:
66
+ await compactor.compact(state)
67
+ except Exception as exc: # noqa: BLE001 — best effort
68
+ state.add_event(
69
+ "context.compaction_failed",
70
+ {"compactor": _compactor_name(compactor), "trigger": trigger, "error": str(exc)},
71
+ )
72
+ logger.warning("Compaction (%s) failed: %s", trigger, exc)
73
+ return {"ok": False, "before_messages": before_msgs, "after_messages": before_msgs}
74
+
75
+ after_msgs = len(state.messages or [])
76
+ after_tokens = estimate_prompt_tokens(state)
77
+ replaced = max(0, before_msgs - after_msgs)
78
+ saved_tokens = max(0, before_tokens - after_tokens)
79
+
80
+ state.add_event(
81
+ "context.compacted",
82
+ {
83
+ "strategy": _compactor_name(compactor),
84
+ "trigger": trigger,
85
+ "messages_before": before_msgs,
86
+ "messages_after": after_msgs,
87
+ "saved_tokens_estimate": saved_tokens,
88
+ },
89
+ )
90
+
91
+ # Persist the snapshot unless the compactor already does it itself.
92
+ if (
93
+ replaced > 0
94
+ and provider is not None
95
+ and not getattr(compactor, "persists_own_compaction", False)
96
+ and hasattr(provider, "record_compaction")
97
+ ):
98
+ try:
99
+ await provider.record_compaction(
100
+ _summary_text(state),
101
+ replaced_count=replaced,
102
+ strategy=_compactor_name(compactor),
103
+ saved_tokens=saved_tokens,
104
+ session_id=getattr(state, "session_id", "") or "",
105
+ trigger=trigger,
106
+ )
107
+ except Exception as exc: # noqa: BLE001 — best effort
108
+ state.add_event(
109
+ "context.compaction_record_failed",
110
+ {"compactor": _compactor_name(compactor), "error": str(exc)},
111
+ )
112
+ logger.debug("record_compaction failed: %s", exc)
113
+
114
+ return {
115
+ "ok": True,
116
+ "before_messages": before_msgs,
117
+ "after_messages": after_msgs,
118
+ "replaced": replaced,
119
+ "saved_tokens_estimate": saved_tokens,
120
+ }
@@ -798,14 +798,10 @@ def build_manifest_for(
798
798
  if not provider:
799
799
  raise ValueError(f"preset {key!r} requires an explicit provider=")
800
800
  return build_manifest(key, provider=provider, **kwargs)
801
- raise ValueError(
802
- f"unknown preset key {key!r}. Catalog: {[d.key for d in _PRESET_CATALOG]}"
803
- )
801
+ raise ValueError(f"unknown preset key {key!r}. Catalog: {[d.key for d in _PRESET_CATALOG]}")
804
802
  eff_provider = provider or desc.provider
805
803
  if not eff_provider:
806
- raise ValueError(
807
- f"preset {key!r} has no recommended provider; pass provider= explicitly."
808
- )
804
+ raise ValueError(f"preset {key!r} has no recommended provider; pass provider= explicitly.")
809
805
  kwargs.setdefault("name", desc.name)
810
806
  kwargs.setdefault("description", desc.description)
811
807
  return build_manifest(desc.base_preset, provider=eff_provider, **kwargs)
@@ -2672,6 +2672,26 @@ class Pipeline:
2672
2672
  else:
2673
2673
  state.tool_dispatcher = None
2674
2674
 
2675
+ # Budget-recovery auto-wire (2.5.0): give the Guard stage the same
2676
+ # compactor the Context stage uses so a ``compact`` guard signal
2677
+ # (token-budget pressure) can shrink history and re-check instead
2678
+ # of hard-rejecting. Re-synced each turn so a host that swaps the
2679
+ # Context compactor (e.g. an LLM-backed one) is picked up — unless
2680
+ # the host wired recovery explicitly via attach_budget_recovery.
2681
+ guard_stage = self._stages.get(4)
2682
+ context_stage = self._stages.get(2)
2683
+ if (
2684
+ guard_stage is not None
2685
+ and context_stage is not None
2686
+ and hasattr(guard_stage, "attach_budget_recovery")
2687
+ and not getattr(guard_stage, "_budget_recovery_explicit", False)
2688
+ ):
2689
+ compactor = getattr(context_stage, "_compactor", None)
2690
+ provider = getattr(context_stage, "_provider", None)
2691
+ if compactor is not None:
2692
+ guard_stage._budget_compactor = compactor
2693
+ guard_stage._memory_provider = provider
2694
+
2675
2695
  self._has_started = True
2676
2696
  return state
2677
2697
 
@@ -0,0 +1,87 @@
1
+ """Cheap, single-source token estimation for context-budget decisions.
2
+
3
+ The Stage 2 *proactive* compaction trigger and the Stage 4 *reactive*
4
+ token-budget guard must share ONE notion of "how big is the next API
5
+ call" — otherwise compaction (which shrinks ``state.messages``) cannot
6
+ relieve a guard that measures something else. Before 2.5.0 the guard
7
+ read ``state.token_usage`` (session/turn-cumulative usage, which
8
+ compaction never lowers) and compared it against the per-call context
9
+ window, so a long tool-loop turn could trip the guard with no way for
10
+ compaction to help. This module is the shared estimator both stages now
11
+ use against ``state.context_window_budget``.
12
+
13
+ The estimate is deliberately rough (≈4 chars/token, the heuristic Stage 2
14
+ has always used) — it *gates compaction*, it does not bill. Image blocks
15
+ are counted at a flat per-image estimate rather than their base64 length:
16
+ a single 1568px screenshot is ~1.6k vision tokens but tens of thousands
17
+ of base64 characters, and counting the characters would trip compaction
18
+ on the first image.
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ from typing import Any, List, Union
24
+
25
+ # Anthropic vision tokens land roughly here for a typical full-size image.
26
+ # A flat estimate beats counting base64 characters (which over-counts by
27
+ # ~50x and would trip compaction on a single screenshot).
28
+ _IMAGE_TOKEN_ESTIMATE = 1_600
29
+ _CHARS_PER_TOKEN = 4
30
+
31
+
32
+ def _estimate_text(text: str) -> int:
33
+ return len(text) // _CHARS_PER_TOKEN
34
+
35
+
36
+ def _estimate_block(block: Any) -> int:
37
+ """Estimate one content block (text / image / tool_use / tool_result)."""
38
+ if not isinstance(block, dict):
39
+ return _estimate_text(str(block))
40
+ btype = block.get("type")
41
+ if btype == "image" or "source" in block:
42
+ return _IMAGE_TOKEN_ESTIMATE
43
+ total = 0
44
+ for key in ("text", "content", "input", "thinking"):
45
+ val = block.get(key)
46
+ if isinstance(val, str):
47
+ total += _estimate_text(val)
48
+ elif isinstance(val, list):
49
+ total += sum(_estimate_block(sub) for sub in val)
50
+ elif val is not None:
51
+ total += _estimate_text(str(val))
52
+ return total or _estimate_text(str(block))
53
+
54
+
55
+ def _estimate_content(content: Union[str, List[Any], Any]) -> int:
56
+ if isinstance(content, str):
57
+ return _estimate_text(content)
58
+ if isinstance(content, list):
59
+ return sum(_estimate_block(b) for b in content)
60
+ if content is None:
61
+ return 0
62
+ return _estimate_text(str(content))
63
+
64
+
65
+ def estimate_message_tokens(messages: List[Any]) -> int:
66
+ """Rough token estimate of a message list (content only)."""
67
+ return sum(
68
+ _estimate_content(m.get("content", "")) for m in (messages or []) if isinstance(m, dict)
69
+ )
70
+
71
+
72
+ def estimate_prompt_tokens(state: Any) -> int:
73
+ """Rough INPUT-token estimate for the next API call.
74
+
75
+ Sums the system prompt, the message list, and the tool schemas —
76
+ everything that travels in the request and therefore counts against
77
+ ``state.context_window_budget``. Used identically by the Stage 2
78
+ compaction trigger and the Stage 4 token-budget guard so that
79
+ compacting ``state.messages`` measurably lowers the same number the
80
+ guard checks.
81
+ """
82
+ total = _estimate_content(getattr(state, "system", "") or "")
83
+ total += estimate_message_tokens(getattr(state, "messages", []) or [])
84
+ tools = getattr(state, "tools", None)
85
+ if tools:
86
+ total += sum(_estimate_text(str(tool)) for tool in tools)
87
+ return total
@@ -93,6 +93,8 @@ class EventTypes(str, Enum):
93
93
  # ── Stage 2: Context ──
94
94
  CONTEXT_BUILT = "context.built"
95
95
  CONTEXT_COMPACTED = "context.compacted"
96
+ CONTEXT_COMPACTION_FAILED = "context.compaction_failed"
97
+ CONTEXT_COMPACTION_RECORD_FAILED = "context.compaction_record_failed"
96
98
  MEMORY_COMPACTION_SUMMARIZED = "memory.compaction.summarized"
97
99
  MEMORY_COMPACTION_LLM_FAILED = "memory.compaction.llm_failed"
98
100
 
@@ -102,6 +104,7 @@ class EventTypes(str, Enum):
102
104
  # ── Stage 4: Guard ──
103
105
  GUARD_CHECK = "guard.check"
104
106
  GUARD_WARN = "guard.warn"
107
+ GUARD_COMPACTING = "guard.compacting"
105
108
 
106
109
  # ── Stage 5: Cache ──
107
110
  CACHE_APPLIED = "cache.applied"
@@ -317,7 +320,20 @@ PAYLOADS: Dict[EventTypes, Dict[str, str]] = {
317
320
  "chunks": "int? — RetrievalResult.to_event form (provider-driven path)",
318
321
  },
319
322
  EventTypes.CONTEXT_COMPACTED: {
320
- "strategy": "str — compactor class name",
323
+ "strategy": "str — compactor name/class",
324
+ "trigger": "str? — 'proactive' (Stage 2) | 'guard' (Stage 4)",
325
+ "messages_before": "int?",
326
+ "messages_after": "int?",
327
+ "saved_tokens_estimate": "int?",
328
+ },
329
+ EventTypes.CONTEXT_COMPACTION_FAILED: {
330
+ "compactor": "str",
331
+ "trigger": "str — 'proactive' | 'guard'",
332
+ "error": "str",
333
+ },
334
+ EventTypes.CONTEXT_COMPACTION_RECORD_FAILED: {
335
+ "compactor": "str",
336
+ "error": "str",
321
337
  },
322
338
  EventTypes.MEMORY_COMPACTION_SUMMARIZED: {
323
339
  "model": "str",
@@ -342,6 +358,10 @@ PAYLOADS: Dict[EventTypes, Dict[str, str]] = {
342
358
  EventTypes.GUARD_WARN: {
343
359
  "message": "str",
344
360
  },
361
+ EventTypes.GUARD_COMPACTING: {
362
+ "guard_name": "str — guard that signalled compaction (token_budget)",
363
+ "reason": "str — the guard message",
364
+ },
345
365
  EventTypes.CACHE_APPLIED: {
346
366
  "strategy": "str — cache strategy class name",
347
367
  "system_is_blocks": "bool",
@@ -12,7 +12,7 @@ from __future__ import annotations
12
12
 
13
13
  import logging
14
14
  from pathlib import Path
15
- from typing import Dict, List, Optional, Sequence
15
+ from typing import Any, Dict, List, Optional, Sequence
16
16
 
17
17
  from geny_executor.memory.provider import (
18
18
  BackendInfo,
@@ -252,6 +252,53 @@ class FileMemoryProvider(MemoryProvider):
252
252
  )
253
253
  return receipt
254
254
 
255
+ async def record_compaction(
256
+ self,
257
+ summary: str,
258
+ *,
259
+ replaced_count: int = 0,
260
+ strategy: str = "",
261
+ saved_tokens: Optional[int] = None,
262
+ session_id: str = "",
263
+ trigger: str = "",
264
+ ) -> Optional[str]:
265
+ """Persist a history-compaction snapshot to the "compactions" category.
266
+
267
+ Called by :func:`geny_executor.core.compaction.run_compaction` when
268
+ Stage 2 (proactive) or Stage 4 (token-budget guard) compacts the
269
+ conversation. Best-effort and standalone-friendly: returns the
270
+ written note filename, or ``None`` when there is nothing to record.
271
+ Hosts that maintain a richer compaction archive set
272
+ ``compactor.persists_own_compaction = True`` so this is skipped.
273
+ """
274
+ body = (summary or "").strip()
275
+ if not body and replaced_count <= 0:
276
+ return None
277
+
278
+ frontmatter: Dict[str, Any] = {
279
+ "replaced_count": int(replaced_count),
280
+ "strategy": strategy or "",
281
+ "trigger": trigger or "",
282
+ "session_id": session_id or self._session_id,
283
+ }
284
+ if saved_tokens is not None:
285
+ frontmatter["saved_tokens"] = int(saved_tokens)
286
+
287
+ title = f"Compaction · {replaced_count} messages" if replaced_count else "Compaction"
288
+ note_meta = await self._notes.write(
289
+ NoteDraft(
290
+ title=title,
291
+ body=body or f"[{replaced_count} messages compacted.]",
292
+ importance=Importance.MEDIUM,
293
+ tags=["compaction", "system-artifact"],
294
+ category="compactions",
295
+ scope=self._scope,
296
+ frontmatter=frontmatter,
297
+ )
298
+ )
299
+ await self._index.rebuild()
300
+ return note_meta.ref.filename
301
+
255
302
  async def reflect(self, ctx: ReflectionContext) -> Sequence[Insight]:
256
303
  # File provider has no LLM; reflection wires in via MemoryHooks
257
304
  # / the orchestrating stage. Default is "no insights".
@@ -4,10 +4,12 @@ from __future__ import annotations
4
4
 
5
5
  from typing import Any, Dict, Optional
6
6
 
7
+ from geny_executor.core.compaction import run_compaction
7
8
  from geny_executor.core.schema import ConfigField, ConfigSchema
8
9
  from geny_executor.core.slot import StrategySlot
9
10
  from geny_executor.core.stage import Stage
10
11
  from geny_executor.core.state import PipelineState
12
+ from geny_executor.core.token_estimate import estimate_prompt_tokens
11
13
  from geny_executor.memory.provider import (
12
14
  MemoryEvent,
13
15
  MemoryProvider,
@@ -24,6 +26,7 @@ from geny_executor.stages.s02_context.artifact.default.strategies import (
24
26
  SimpleLoadStrategy,
25
27
  )
26
28
  from geny_executor.stages.s02_context.artifact.default.compactors import (
29
+ LLMSummaryCompactor,
27
30
  SlidingWindowCompactor,
28
31
  SummaryCompactor,
29
32
  TruncateCompactor,
@@ -76,6 +79,7 @@ class ContextStage(Stage[Any, Any]):
76
79
  registry={
77
80
  "truncate": TruncateCompactor,
78
81
  "summary": SummaryCompactor,
82
+ "llm_summary": LLMSummaryCompactor,
79
83
  "sliding_window": SlidingWindowCompactor,
80
84
  },
81
85
  description="History compaction strategy",
@@ -224,15 +228,15 @@ class ContextStage(Stage[Any, Any]):
224
228
  )
225
229
  state.metadata["memory_context"] = memory_text
226
230
 
227
- # Compact if needed (rough estimate: 4 chars per token)
228
- estimated_tokens = sum(len(str(m.get("content", ""))) // 4 for m in state.messages)
231
+ # Proactive compaction: when the projected next-call context
232
+ # (system + messages + tools) crosses 80% of the window, compact
233
+ # now so the Stage 4 token-budget guard's 95% safety net rarely
234
+ # has to. Both stages use ``estimate_prompt_tokens`` so compaction
235
+ # measurably lowers the same number the guard checks.
236
+ estimated_tokens = estimate_prompt_tokens(state)
229
237
  if estimated_tokens > state.context_window_budget * 0.8:
230
- await self._compactor.compact(state)
231
- state.add_event(
232
- "context.compacted",
233
- {
234
- "strategy": type(self._compactor).__name__,
235
- },
238
+ await run_compaction(
239
+ state, self._compactor, trigger="proactive", provider=self._provider
236
240
  )
237
241
 
238
242
  state.add_event(
@@ -21,6 +21,14 @@ class ContextStrategy(Strategy):
21
21
  class HistoryCompactor(Strategy):
22
22
  """Base interface for compacting conversation history when budget is exceeded."""
23
23
 
24
+ # Set True by compactors that write their own compaction snapshot to a
25
+ # memory provider (e.g. a host wrapper that records to a vault). When
26
+ # True, the centralised :func:`geny_executor.core.compaction.run_compaction`
27
+ # helper skips its own ``provider.record_compaction`` call so the
28
+ # snapshot is not persisted twice. Plain in-library compactors leave
29
+ # this False and rely on the helper for persistence.
30
+ persists_own_compaction: bool = False
31
+
24
32
  @abstractmethod
25
33
  async def compact(self, state: PipelineState) -> None:
26
34
  """Compact history in state.messages to fit within budget."""
@@ -6,12 +6,27 @@ from typing import Any, Dict, Optional, Set
6
6
 
7
7
  from geny_executor.core.schema import ConfigField, ConfigSchema
8
8
  from geny_executor.core.state import PipelineState
9
+ from geny_executor.core.token_estimate import estimate_prompt_tokens
9
10
  from geny_executor.stages.s04_guard.interface import Guard
10
11
  from geny_executor.stages.s04_guard.types import GuardResult
11
12
 
12
13
 
13
14
  class TokenBudgetGuard(Guard):
14
- """Check if token budget allows another API call."""
15
+ """Ensure the NEXT API call still fits in the context window.
16
+
17
+ Measures the *projected* input size of the next request (system +
18
+ messages + tools, via :func:`estimate_prompt_tokens`) against
19
+ ``state.context_window_budget``, reserving ``min_remaining_tokens``
20
+ of headroom for the model's response. When the projection leaves too
21
+ little headroom the guard returns ``action="compact"`` — a *recoverable*
22
+ signal: :class:`GuardStage` compacts ``state.messages`` and re-checks
23
+ once, hard-rejecting only if the context still does not fit.
24
+
25
+ Before 2.5.0 this guard read session/turn-cumulative ``token_usage``
26
+ and hard-rejected — a measure compaction could never lower, so a long
27
+ tool-loop turn died with no recovery. Cumulative *spend* caps remain
28
+ the job of ``cost_budget`` and the Stage 16 loop's token dimension.
29
+ """
15
30
 
16
31
  def __init__(self, min_remaining_tokens: int = 10_000):
17
32
  self._min_remaining = min_remaining_tokens
@@ -22,7 +37,10 @@ class TokenBudgetGuard(Guard):
22
37
 
23
38
  @property
24
39
  def description(self) -> str:
25
- return f"Ensures at least {self._min_remaining} tokens remaining"
40
+ return (
41
+ f"Ensures the next request leaves >= {self._min_remaining} tokens "
42
+ "of context headroom (compacts history first)"
43
+ )
26
44
 
27
45
  @classmethod
28
46
  def config_schema(cls) -> ConfigSchema:
@@ -33,7 +51,12 @@ class TokenBudgetGuard(Guard):
33
51
  name="min_remaining_tokens",
34
52
  type="integer",
35
53
  label="Min remaining tokens",
36
- description="Reject the turn if this many tokens aren't free in the context window.",
54
+ description=(
55
+ "Headroom (for the response) the next request must leave "
56
+ "free in the context window. When the projected request "
57
+ "would leave less, history is compacted and re-checked "
58
+ "before the turn is rejected."
59
+ ),
37
60
  default=10_000,
38
61
  min_value=0,
39
62
  ),
@@ -49,14 +72,18 @@ class TokenBudgetGuard(Guard):
49
72
  return {"min_remaining_tokens": self._min_remaining}
50
73
 
51
74
  def check(self, state: PipelineState) -> GuardResult:
52
- used = state.token_usage.input_tokens + state.token_usage.output_tokens
53
- remaining = state.context_window_budget - used
75
+ projected = estimate_prompt_tokens(state)
76
+ remaining = state.context_window_budget - projected
54
77
  if remaining < self._min_remaining:
55
78
  return GuardResult(
56
79
  passed=False,
57
80
  guard_name=self.name,
58
- message=f"Token budget low: {remaining} remaining (min {self._min_remaining})",
59
- action="reject",
81
+ message=(
82
+ f"Context near limit: ~{projected} of "
83
+ f"{state.context_window_budget} tokens projected, "
84
+ f"{remaining} free (need {self._min_remaining})"
85
+ ),
86
+ action="compact",
60
87
  )
61
88
  return GuardResult(passed=True, guard_name=self.name)
62
89
 
@@ -11,6 +11,7 @@ from geny_executor.core.slot import SlotChain
11
11
  from geny_executor.core.stage import Stage
12
12
  from geny_executor.core.state import PipelineState
13
13
  from geny_executor.stages.s04_guard.interface import Guard, GuardChain
14
+ from geny_executor.stages.s04_guard.types import GuardResult
14
15
  from geny_executor.stages.s04_guard.artifact.default.guards import (
15
16
  CostBudgetGuard,
16
17
  IterationGuard,
@@ -48,6 +49,29 @@ class GuardStage(Stage[Any, Any]):
48
49
  }
49
50
  self._max_chain_length = int(max_chain_length)
50
51
  self._fail_fast = bool(fail_fast)
52
+ # Budget-recovery wiring (2.5.0). A guard may return
53
+ # ``action="compact"`` (the token-budget guard does when the
54
+ # projected request is too large). When a compactor is wired,
55
+ # ``execute`` compacts ``state.messages`` and re-checks once
56
+ # before rejecting. Auto-wired from the Context stage's compactor
57
+ # by ``Pipeline._init_state`` each turn; a host may override via
58
+ # :meth:`attach_budget_recovery`. ``None`` → "compact" degrades
59
+ # to a hard reject (pre-2.5.0 behaviour).
60
+ self._budget_compactor: Optional[Any] = None
61
+ self._memory_provider: Optional[Any] = None
62
+ # True once a host explicitly wired recovery — stops the
63
+ # per-turn auto-wire (Pipeline._init_state) from clobbering it.
64
+ self._budget_recovery_explicit = False
65
+
66
+ def attach_budget_recovery(
67
+ self, compactor: Optional[Any], provider: Optional[Any] = None
68
+ ) -> "GuardStage":
69
+ """Wire the compactor (and optional memory provider) used to recover
70
+ from a ``compact`` guard signal. See class/__init__ notes."""
71
+ self._budget_compactor = compactor
72
+ self._memory_provider = provider
73
+ self._budget_recovery_explicit = True
74
+ return self
51
75
 
52
76
  @property
53
77
  def guards(self) -> SlotChain:
@@ -153,22 +177,52 @@ class GuardStage(Stage[Any, Any]):
153
177
  },
154
178
  )
155
179
 
156
- if not result.passed:
180
+ if result.passed:
181
+ return input
182
+
183
+ if result.action == "warn":
184
+ state.add_event("guard.warn", {"message": result.message})
185
+ return input
186
+
187
+ # Recoverable budget pressure: compact history and re-check
188
+ # once before giving up. Only the first compact-actionable
189
+ # failure triggers recovery; a recovered chain re-runs clean.
190
+ if result.action == "compact" and await self._recover_budget(state, result):
191
+ result = GuardChain(guards).check_all(state)
192
+ state.add_event(
193
+ "guard.check",
194
+ {
195
+ "passed": result.passed,
196
+ "guard_name": result.guard_name,
197
+ "message": result.message,
198
+ "recheck": True,
199
+ },
200
+ )
201
+ if result.passed:
202
+ return input
157
203
  if result.action == "warn":
158
204
  state.add_event("guard.warn", {"message": result.message})
159
205
  return input
160
- raise GuardRejectError(
161
- result.message,
162
- guard_name=result.guard_name,
163
- )
164
206
 
165
- return input
207
+ raise GuardRejectError(
208
+ result.message,
209
+ guard_name=result.guard_name,
210
+ )
166
211
 
167
212
  # fail_fast=False — run EVERY guard and aggregate. Operators use
168
213
  # this to see the full violation picture in one turn instead of
169
214
  # fixing guards one rejection at a time.
170
215
  failures = [r for r in (guard.check(state) for guard in guards) if not r.passed]
171
- rejects = [r for r in failures if r.action != "warn"]
216
+
217
+ # Recoverable budget pressure: if any failure asked to compact,
218
+ # compact once and re-evaluate the whole chain before aggregating
219
+ # rejects (a recovered token_budget guard drops out of the list).
220
+ if any(r.action == "compact" for r in failures):
221
+ compact_result = next(r for r in failures if r.action == "compact")
222
+ if await self._recover_budget(state, compact_result):
223
+ failures = [r for r in (guard.check(state) for guard in guards) if not r.passed]
224
+
225
+ rejects = [r for r in failures if r.action not in ("warn",)]
172
226
 
173
227
  state.add_event(
174
228
  "guard.check",
@@ -194,3 +248,29 @@ class GuardStage(Stage[Any, Any]):
194
248
  )
195
249
 
196
250
  return input
251
+
252
+ async def _recover_budget(self, state: PipelineState, result: GuardResult) -> bool:
253
+ """Compact history in response to a ``compact`` guard signal.
254
+
255
+ Returns True iff a compactor was wired and ran (so the caller
256
+ should re-check the chain). With no compactor wired the signal
257
+ degrades to a hard reject — the pre-2.5.0 behaviour.
258
+ """
259
+ if self._budget_compactor is None:
260
+ return False
261
+
262
+ state.add_event(
263
+ "guard.compacting",
264
+ {"guard_name": result.guard_name, "reason": result.message},
265
+ )
266
+ # Lazy import: keeps the guard stage import-light and avoids a
267
+ # core→stage cycle at module load.
268
+ from geny_executor.core.compaction import run_compaction
269
+
270
+ outcome = await run_compaction(
271
+ state,
272
+ self._budget_compactor,
273
+ trigger="guard",
274
+ provider=self._memory_provider,
275
+ )
276
+ return bool(outcome.get("ok"))