geny-executor 2.45.0__tar.gz → 2.46.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 (757) hide show
  1. {geny_executor-2.45.0 → geny_executor-2.46.0}/PKG-INFO +1 -1
  2. {geny_executor-2.45.0 → geny_executor-2.46.0}/pyproject.toml +1 -1
  3. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/base.py +15 -1
  4. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/claude_code.py +2 -0
  5. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/translators/_cli.py +14 -5
  6. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/types.py +13 -0
  7. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/__init__.py +36 -0
  8. geny_executor-2.46.0/src/geny_executor/memory/facts.py +504 -0
  9. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/rollup.py +220 -22
  10. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_translators_cli_claude_code.py +42 -0
  11. geny_executor-2.46.0/tests/unit/test_memory_facts.py +377 -0
  12. {geny_executor-2.45.0 → geny_executor-2.46.0}/.gitignore +0 -0
  13. {geny_executor-2.45.0 → geny_executor-2.46.0}/LICENSE +0 -0
  14. {geny_executor-2.45.0 → geny_executor-2.46.0}/NOTICE +0 -0
  15. {geny_executor-2.45.0 → geny_executor-2.46.0}/README.md +0 -0
  16. {geny_executor-2.45.0 → geny_executor-2.46.0}/README_ko.md +0 -0
  17. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/__init__.py +0 -0
  18. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/channels/__init__.py +0 -0
  19. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/channels/built_in.py +0 -0
  20. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/channels/factory.py +0 -0
  21. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/channels/send_message_channel.py +0 -0
  22. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/channels/user_file_channel.py +0 -0
  23. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/__init__.py +0 -0
  24. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/artifact.py +0 -0
  25. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/builder.py +0 -0
  26. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/compaction.py +0 -0
  27. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/config.py +0 -0
  28. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/diff.py +0 -0
  29. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/environment.py +0 -0
  30. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/environment_control.py +0 -0
  31. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/errors.py +0 -0
  32. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/introspection.py +0 -0
  33. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/manifest_factory.py +0 -0
  34. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/mutation.py +0 -0
  35. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/pipeline.py +0 -0
  36. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/presets.py +0 -0
  37. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/result.py +0 -0
  38. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/schema.py +0 -0
  39. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/shared_keys.py +0 -0
  40. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/slot.py +0 -0
  41. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/snapshot.py +0 -0
  42. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/stage.py +0 -0
  43. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/state.py +0 -0
  44. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/core/token_estimate.py +0 -0
  45. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/cron/__init__.py +0 -0
  46. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/cron/runner.py +0 -0
  47. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/cron/store_abc.py +0 -0
  48. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/cron/store_impl/__init__.py +0 -0
  49. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/cron/store_impl/file_backed.py +0 -0
  50. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/cron/store_impl/in_memory.py +0 -0
  51. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/cron/types.py +0 -0
  52. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/events/__init__.py +0 -0
  53. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/events/bus.py +0 -0
  54. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/events/catalog.py +0 -0
  55. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/events/types.py +0 -0
  56. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/gateway/__init__.py +0 -0
  57. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/gateway/adapter.py +0 -0
  58. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/gateway/discord.py +0 -0
  59. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/gateway/factory.py +0 -0
  60. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/gateway/runner.py +0 -0
  61. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/gateway/slack.py +0 -0
  62. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/gateway/telegram.py +0 -0
  63. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/gateway/types.py +0 -0
  64. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/gateway/ws_base.py +0 -0
  65. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/history/__init__.py +0 -0
  66. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/history/ab_test.py +0 -0
  67. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/history/cost.py +0 -0
  68. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/history/models.py +0 -0
  69. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/history/monitor.py +0 -0
  70. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/history/replay.py +0 -0
  71. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/history/service.py +0 -0
  72. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/hooks/__init__.py +0 -0
  73. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/hooks/config.py +0 -0
  74. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/hooks/events.py +0 -0
  75. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/hooks/runner.py +0 -0
  76. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/__init__.py +0 -0
  77. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/_cli_runtime.py +0 -0
  78. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/anthropic.py +0 -0
  79. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/credentials.py +0 -0
  80. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/google.py +0 -0
  81. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/local_probe.py +0 -0
  82. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/model_discovery.py +0 -0
  83. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/openai.py +0 -0
  84. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/openai_compatible.py +0 -0
  85. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/profiles.py +0 -0
  86. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/registry.py +0 -0
  87. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/translators/__init__.py +0 -0
  88. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/translators/_canonical.py +0 -0
  89. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/llm_client/vllm.py +0 -0
  90. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/_locks.py +0 -0
  91. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/_progressive.py +0 -0
  92. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/composite/__init__.py +0 -0
  93. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/composite/handles.py +0 -0
  94. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/composite/provider.py +0 -0
  95. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/composite/routing.py +0 -0
  96. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/composite/snapshot.py +0 -0
  97. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/embedding/__init__.py +0 -0
  98. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/embedding/client.py +0 -0
  99. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/embedding/google.py +0 -0
  100. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/embedding/local.py +0 -0
  101. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/embedding/openai.py +0 -0
  102. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/embedding/registry.py +0 -0
  103. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/embedding/voyage.py +0 -0
  104. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/factory.py +0 -0
  105. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/graph_rank.py +0 -0
  106. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/presets.py +0 -0
  107. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/provider.py +0 -0
  108. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/__init__.py +0 -0
  109. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/ephemeral.py +0 -0
  110. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/__init__.py +0 -0
  111. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/config.py +0 -0
  112. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/frontmatter.py +0 -0
  113. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/graph_edges.py +0 -0
  114. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/index_store.py +0 -0
  115. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/layout.py +0 -0
  116. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/ltm_store.py +0 -0
  117. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/notes_store.py +0 -0
  118. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/provider.py +0 -0
  119. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/snapshot.py +0 -0
  120. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/stm_store.py +0 -0
  121. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/timezone.py +0 -0
  122. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/file/vector_store.py +0 -0
  123. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/sql/__init__.py +0 -0
  124. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/sql/config.py +0 -0
  125. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/sql/connection.py +0 -0
  126. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/sql/index_store.py +0 -0
  127. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/sql/ltm_store.py +0 -0
  128. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/sql/notes_store.py +0 -0
  129. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/sql/provider.py +0 -0
  130. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/sql/schema.py +0 -0
  131. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/sql/snapshot.py +0 -0
  132. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/sql/stm_store.py +0 -0
  133. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/providers/sql/vector_store.py +0 -0
  134. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/retriever.py +0 -0
  135. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/memory/strategy.py +0 -0
  136. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/notifications/__init__.py +0 -0
  137. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/notifications/registry.py +0 -0
  138. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/permission/__init__.py +0 -0
  139. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/permission/loader.py +0 -0
  140. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/permission/matrix.py +0 -0
  141. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/permission/types.py +0 -0
  142. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/py.typed +0 -0
  143. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/runtime/__init__.py +0 -0
  144. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/runtime/task_executors.py +0 -0
  145. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/runtime/task_runner.py +0 -0
  146. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/security/__init__.py +0 -0
  147. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/security/import_validator.py +0 -0
  148. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/security/script_sandbox.py +0 -0
  149. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/session/__init__.py +0 -0
  150. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/session/freshness.py +0 -0
  151. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/session/manager.py +0 -0
  152. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/session/persistence.py +0 -0
  153. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/session/session.py +0 -0
  154. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/settings/__init__.py +0 -0
  155. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/settings/loader.py +0 -0
  156. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/settings/section_registry.py +0 -0
  157. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/__init__.py +0 -0
  158. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled/batch/SKILL.md +0 -0
  159. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled/debug/SKILL.md +0 -0
  160. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled/environment/REFERENCE.md +0 -0
  161. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled/environment/SKILL.md +0 -0
  162. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled/loop/SKILL.md +0 -0
  163. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled/lorem-ipsum/SKILL.md +0 -0
  164. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled/simplify/SKILL.md +0 -0
  165. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled/skillify/SKILL.md +0 -0
  166. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled/stuck/SKILL.md +0 -0
  167. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled/tool-builder/REFERENCE.md +0 -0
  168. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled/tool-builder/SKILL.md +0 -0
  169. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled/verify/SKILL.md +0 -0
  170. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/bundled_skills.py +0 -0
  171. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/fork.py +0 -0
  172. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/frontmatter.py +0 -0
  173. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/loader.py +0 -0
  174. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/mcp_bridge.py +0 -0
  175. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/path_match.py +0 -0
  176. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/registry.py +0 -0
  177. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/shell_blocks.py +0 -0
  178. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/skill_tool.py +0 -0
  179. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/types.py +0 -0
  180. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/skills/watcher.py +0 -0
  181. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/__init__.py +0 -0
  182. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/__init__.py +0 -0
  183. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/_helpers.py +0 -0
  184. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/cancel.py +0 -0
  185. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/clear.py +0 -0
  186. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/compact.py +0 -0
  187. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/config.py +0 -0
  188. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/context.py +0 -0
  189. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/cost.py +0 -0
  190. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/help.py +0 -0
  191. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/memory.py +0 -0
  192. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/model.py +0 -0
  193. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/preset_info.py +0 -0
  194. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/status.py +0 -0
  195. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/built_in/tasks.py +0 -0
  196. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/md_template.py +0 -0
  197. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/parser.py +0 -0
  198. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/registry.py +0 -0
  199. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/slash_commands/types.py +0 -0
  200. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/__init__.py +0 -0
  201. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s01_input/__init__.py +0 -0
  202. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s01_input/artifact/__init__.py +0 -0
  203. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s01_input/artifact/default/__init__.py +0 -0
  204. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s01_input/artifact/default/normalizers.py +0 -0
  205. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s01_input/artifact/default/stage.py +0 -0
  206. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s01_input/artifact/default/validators.py +0 -0
  207. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s01_input/interface.py +0 -0
  208. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s01_input/normalizers.py +0 -0
  209. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s01_input/stage.py +0 -0
  210. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s01_input/types.py +0 -0
  211. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s01_input/validators.py +0 -0
  212. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/__init__.py +0 -0
  213. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/artifact/__init__.py +0 -0
  214. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/artifact/default/__init__.py +0 -0
  215. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/artifact/default/compactors.py +0 -0
  216. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/artifact/default/retrievers.py +0 -0
  217. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/artifact/default/stage.py +0 -0
  218. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/artifact/default/strategies.py +0 -0
  219. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/compactors.py +0 -0
  220. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/interface.py +0 -0
  221. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/retrievers.py +0 -0
  222. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/stage.py +0 -0
  223. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/strategies.py +0 -0
  224. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s02_context/types.py +0 -0
  225. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s03_system/__init__.py +0 -0
  226. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s03_system/artifact/__init__.py +0 -0
  227. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s03_system/artifact/default/__init__.py +0 -0
  228. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s03_system/artifact/default/builders.py +0 -0
  229. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s03_system/artifact/default/stage.py +0 -0
  230. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s03_system/builders.py +0 -0
  231. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s03_system/interface.py +0 -0
  232. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s03_system/persona/__init__.py +0 -0
  233. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s03_system/persona/builder.py +0 -0
  234. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s03_system/persona/provider.py +0 -0
  235. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s03_system/stage.py +0 -0
  236. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s04_guard/__init__.py +0 -0
  237. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s04_guard/artifact/__init__.py +0 -0
  238. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s04_guard/artifact/default/__init__.py +0 -0
  239. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s04_guard/artifact/default/guards.py +0 -0
  240. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s04_guard/artifact/default/stage.py +0 -0
  241. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s04_guard/guards.py +0 -0
  242. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s04_guard/interface.py +0 -0
  243. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s04_guard/stage.py +0 -0
  244. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s04_guard/types.py +0 -0
  245. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s05_cache/__init__.py +0 -0
  246. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s05_cache/artifact/__init__.py +0 -0
  247. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s05_cache/artifact/default/__init__.py +0 -0
  248. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s05_cache/artifact/default/stage.py +0 -0
  249. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s05_cache/artifact/default/strategies.py +0 -0
  250. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s05_cache/interface.py +0 -0
  251. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s05_cache/stage.py +0 -0
  252. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s05_cache/strategies.py +0 -0
  253. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/__init__.py +0 -0
  254. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/_translate.py +0 -0
  255. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/artifact/__init__.py +0 -0
  256. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/artifact/default/__init__.py +0 -0
  257. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/artifact/default/providers.py +0 -0
  258. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/artifact/default/retry.py +0 -0
  259. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/artifact/default/router.py +0 -0
  260. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/artifact/default/stage.py +0 -0
  261. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/artifact/default/tool_loop.py +0 -0
  262. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/artifact/google/__init__.py +0 -0
  263. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/artifact/google/providers.py +0 -0
  264. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/artifact/openai/__init__.py +0 -0
  265. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/artifact/openai/providers.py +0 -0
  266. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/interface.py +0 -0
  267. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/providers.py +0 -0
  268. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/retry.py +0 -0
  269. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/stage.py +0 -0
  270. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s06_api/types.py +0 -0
  271. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s07_token/__init__.py +0 -0
  272. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s07_token/artifact/__init__.py +0 -0
  273. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s07_token/artifact/default/__init__.py +0 -0
  274. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s07_token/artifact/default/pricing.py +0 -0
  275. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s07_token/artifact/default/stage.py +0 -0
  276. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s07_token/artifact/default/trackers.py +0 -0
  277. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s07_token/interface.py +0 -0
  278. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s07_token/pricing.py +0 -0
  279. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s07_token/stage.py +0 -0
  280. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s07_token/trackers.py +0 -0
  281. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s08_think/__init__.py +0 -0
  282. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s08_think/artifact/default/__init__.py +0 -0
  283. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s08_think/artifact/default/budget.py +0 -0
  284. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s08_think/artifact/default/processors.py +0 -0
  285. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s08_think/artifact/default/stage.py +0 -0
  286. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s08_think/interface.py +0 -0
  287. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s08_think/processors.py +0 -0
  288. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s08_think/stage.py +0 -0
  289. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s08_think/types.py +0 -0
  290. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s09_parse/__init__.py +0 -0
  291. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s09_parse/artifact/default/__init__.py +0 -0
  292. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s09_parse/artifact/default/parsers.py +0 -0
  293. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s09_parse/artifact/default/signals.py +0 -0
  294. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s09_parse/artifact/default/stage.py +0 -0
  295. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s09_parse/interface.py +0 -0
  296. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s09_parse/parsers.py +0 -0
  297. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s09_parse/signals.py +0 -0
  298. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s09_parse/stage.py +0 -0
  299. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s09_parse/types.py +0 -0
  300. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/__init__.py +0 -0
  301. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/artifact/__init__.py +0 -0
  302. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/artifact/default/__init__.py +0 -0
  303. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/artifact/default/executors.py +0 -0
  304. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/artifact/default/routers.py +0 -0
  305. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/artifact/default/stage.py +0 -0
  306. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/dispatcher.py +0 -0
  307. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/executors.py +0 -0
  308. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/interface.py +0 -0
  309. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/persistence.py +0 -0
  310. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/routers.py +0 -0
  311. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/stage.py +0 -0
  312. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/state_mutation.py +0 -0
  313. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s10_tool/streaming.py +0 -0
  314. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s11_tool_review/__init__.py +0 -0
  315. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s11_tool_review/artifact/__init__.py +0 -0
  316. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s11_tool_review/artifact/default/__init__.py +0 -0
  317. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s11_tool_review/artifact/default/reviewers.py +0 -0
  318. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s11_tool_review/artifact/default/stage.py +0 -0
  319. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s11_tool_review/interface.py +0 -0
  320. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s12_agent/__init__.py +0 -0
  321. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s12_agent/artifact/__init__.py +0 -0
  322. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s12_agent/artifact/default/__init__.py +0 -0
  323. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s12_agent/artifact/default/orchestrators.py +0 -0
  324. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s12_agent/artifact/default/stage.py +0 -0
  325. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s12_agent/interface.py +0 -0
  326. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s12_agent/orchestrators.py +0 -0
  327. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s12_agent/persistent_subagent.py +0 -0
  328. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s12_agent/stage.py +0 -0
  329. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s12_agent/subagent_catalog.py +0 -0
  330. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s12_agent/subagent_type.py +0 -0
  331. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s12_agent/types.py +0 -0
  332. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s13_task_registry/__init__.py +0 -0
  333. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s13_task_registry/artifact/__init__.py +0 -0
  334. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s13_task_registry/artifact/default/__init__.py +0 -0
  335. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s13_task_registry/artifact/default/file_backed_registry.py +0 -0
  336. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s13_task_registry/artifact/default/policies.py +0 -0
  337. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s13_task_registry/artifact/default/registry.py +0 -0
  338. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s13_task_registry/artifact/default/stage.py +0 -0
  339. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s13_task_registry/interface.py +0 -0
  340. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s13_task_registry/types.py +0 -0
  341. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s14_evaluate/__init__.py +0 -0
  342. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s14_evaluate/artifact/__init__.py +0 -0
  343. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/__init__.py +0 -0
  344. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/strategy.py +0 -0
  345. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s14_evaluate/artifact/default/__init__.py +0 -0
  346. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s14_evaluate/artifact/default/stage.py +0 -0
  347. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s14_evaluate/artifact/default/strategies.py +0 -0
  348. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s14_evaluate/interface.py +0 -0
  349. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s14_evaluate/stage.py +0 -0
  350. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s14_evaluate/strategies.py +0 -0
  351. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s14_evaluate/types.py +0 -0
  352. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s15_hitl/__init__.py +0 -0
  353. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s15_hitl/artifact/__init__.py +0 -0
  354. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s15_hitl/artifact/default/__init__.py +0 -0
  355. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s15_hitl/artifact/default/requesters.py +0 -0
  356. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s15_hitl/artifact/default/stage.py +0 -0
  357. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s15_hitl/artifact/default/timeouts.py +0 -0
  358. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s15_hitl/interface.py +0 -0
  359. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s15_hitl/types.py +0 -0
  360. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s16_loop/__init__.py +0 -0
  361. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s16_loop/artifact/__init__.py +0 -0
  362. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s16_loop/artifact/default/__init__.py +0 -0
  363. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s16_loop/artifact/default/controllers.py +0 -0
  364. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s16_loop/artifact/default/stage.py +0 -0
  365. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s16_loop/controllers.py +0 -0
  366. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s16_loop/interface.py +0 -0
  367. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s16_loop/stage.py +0 -0
  368. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s17_emit/__init__.py +0 -0
  369. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s17_emit/artifact/__init__.py +0 -0
  370. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s17_emit/artifact/default/__init__.py +0 -0
  371. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s17_emit/artifact/default/emitters.py +0 -0
  372. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s17_emit/artifact/default/stage.py +0 -0
  373. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s17_emit/emitters.py +0 -0
  374. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s17_emit/interface.py +0 -0
  375. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s17_emit/stage.py +0 -0
  376. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s17_emit/types.py +0 -0
  377. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s18_memory/__init__.py +0 -0
  378. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s18_memory/_dehydrate.py +0 -0
  379. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s18_memory/artifact/__init__.py +0 -0
  380. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s18_memory/artifact/default/__init__.py +0 -0
  381. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s18_memory/artifact/default/persistence.py +0 -0
  382. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s18_memory/artifact/default/stage.py +0 -0
  383. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s18_memory/artifact/default/strategies.py +0 -0
  384. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s18_memory/insight.py +0 -0
  385. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s18_memory/interface.py +0 -0
  386. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s18_memory/persistence.py +0 -0
  387. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s18_memory/stage.py +0 -0
  388. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s18_memory/strategies.py +0 -0
  389. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s19_summarize/__init__.py +0 -0
  390. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s19_summarize/artifact/__init__.py +0 -0
  391. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s19_summarize/artifact/default/__init__.py +0 -0
  392. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s19_summarize/artifact/default/importance.py +0 -0
  393. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s19_summarize/artifact/default/stage.py +0 -0
  394. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s19_summarize/artifact/default/summarizers.py +0 -0
  395. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s19_summarize/frequency_policy.py +0 -0
  396. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s19_summarize/interface.py +0 -0
  397. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s19_summarize/types.py +0 -0
  398. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s20_persist/__init__.py +0 -0
  399. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s20_persist/artifact/__init__.py +0 -0
  400. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s20_persist/artifact/default/__init__.py +0 -0
  401. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s20_persist/artifact/default/frequencies.py +0 -0
  402. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s20_persist/artifact/default/persisters.py +0 -0
  403. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s20_persist/artifact/default/stage.py +0 -0
  404. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s20_persist/interface.py +0 -0
  405. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s20_persist/restore.py +0 -0
  406. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s20_persist/types.py +0 -0
  407. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s21_yield/__init__.py +0 -0
  408. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s21_yield/artifact/__init__.py +0 -0
  409. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s21_yield/artifact/default/__init__.py +0 -0
  410. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s21_yield/artifact/default/formatters.py +0 -0
  411. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s21_yield/artifact/default/multi_format.py +0 -0
  412. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s21_yield/artifact/default/stage.py +0 -0
  413. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s21_yield/formatters.py +0 -0
  414. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s21_yield/interface.py +0 -0
  415. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/stages/s21_yield/stage.py +0 -0
  416. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/__init__.py +0 -0
  417. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/_sandbox.py +0 -0
  418. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/adhoc.py +0 -0
  419. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/base.py +0 -0
  420. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/__init__.py +0 -0
  421. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/_path_guard.py +0 -0
  422. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/_web_search_backends.py +0 -0
  423. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/agent_tool.py +0 -0
  424. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/ask_user_question_tool.py +0 -0
  425. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/bash_tool.py +0 -0
  426. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/browser_tools.py +0 -0
  427. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/cron_tools.py +0 -0
  428. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/dev_tools.py +0 -0
  429. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/doc_tools.py +0 -0
  430. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/edit_tool.py +0 -0
  431. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/env_tools.py +0 -0
  432. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/glob_tool.py +0 -0
  433. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/google_tools.py +0 -0
  434. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/grep_tool.py +0 -0
  435. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/mcp_wrapper_tools.py +0 -0
  436. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/notebook_edit_tool.py +0 -0
  437. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/operator_tools.py +0 -0
  438. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/plan_mode_tools.py +0 -0
  439. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/push_notification_tool.py +0 -0
  440. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/read_tool.py +0 -0
  441. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/sandbox_exec_tool.py +0 -0
  442. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/send_message_tool.py +0 -0
  443. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/subagent_tools.py +0 -0
  444. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/task_tools.py +0 -0
  445. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/todo_write_tool.py +0 -0
  446. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/tool_search_tool.py +0 -0
  447. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/web_fetch_tool.py +0 -0
  448. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/web_search_tool.py +0 -0
  449. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/workspace_tools.py +0 -0
  450. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/worktree_tools.py +0 -0
  451. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/built_in/write_tool.py +0 -0
  452. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/composer.py +0 -0
  453. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/errors.py +0 -0
  454. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/mcp/__init__.py +0 -0
  455. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/mcp/adapter.py +0 -0
  456. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/mcp/credentials.py +0 -0
  457. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/mcp/errors.py +0 -0
  458. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/mcp/manager.py +0 -0
  459. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/mcp/oauth.py +0 -0
  460. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/mcp/state.py +0 -0
  461. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/mcp/uri.py +0 -0
  462. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/plugin.py +0 -0
  463. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/provider.py +0 -0
  464. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/providers.py +0 -0
  465. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/registry.py +0 -0
  466. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/sandbox.py +0 -0
  467. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/scope.py +0 -0
  468. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/tools/stage_binding.py +0 -0
  469. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/workspace/__init__.py +0 -0
  470. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/workspace/stack.py +0 -0
  471. {geny_executor-2.45.0 → geny_executor-2.46.0}/src/geny_executor/workspace/types.py +0 -0
  472. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/__init__.py +0 -0
  473. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/_fixtures/__init__.py +0 -0
  474. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/_fixtures/fake_claude.py +0 -0
  475. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/_fixtures/fake_echo_cli.py +0 -0
  476. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/_fixtures/geny_manifest_layout.json +0 -0
  477. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/_fixtures/manifest_entries.py +0 -0
  478. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/__init__.py +0 -0
  479. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/conftest.py +0 -0
  480. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/fixtures/__init__.py +0 -0
  481. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/fixtures/adapter/__init__.py +0 -0
  482. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/fixtures/adapter/adapter.py +0 -0
  483. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/test_c1_six_layer_retrieval.py +0 -0
  484. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/test_c2_execution_recording.py +0 -0
  485. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/test_c3_reflection_and_promotion.py +0 -0
  486. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/test_c4_rest_coverage.py +0 -0
  487. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/test_c5_embedding_migration.py +0 -0
  488. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/test_c6_session_resume.py +0 -0
  489. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/test_c7_adapter_parity.py +0 -0
  490. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/completeness/test_spec_loads.py +0 -0
  491. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/__init__.py +0 -0
  492. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/memory_provider_contract.py +0 -0
  493. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_embedding_clients.py +0 -0
  494. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_error_codes_stability.py +0 -0
  495. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_embedding_credentials.py +0 -0
  496. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_auto_vector.py +0 -0
  497. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_composite.py +0 -0
  498. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_composite_routing.py +0 -0
  499. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_curated_global.py +0 -0
  500. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_ephemeral.py +0 -0
  501. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_factory.py +0 -0
  502. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_file.py +0 -0
  503. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_file_layout.py +0 -0
  504. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_file_vector.py +0 -0
  505. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_sql.py +0 -0
  506. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_sql_dialect.py +0 -0
  507. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_sql_schema.py +0 -0
  508. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_provider_sql_vector.py +0 -0
  509. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_memory_vector_breaker.py +0 -0
  510. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/contract/test_stage_uniformity.py +0 -0
  511. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/integration/test_cycle_ab_cross_import.py +0 -0
  512. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/integration/test_integration.py +0 -0
  513. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/__init__.py +0 -0
  514. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/conformance/__init__.py +0 -0
  515. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/conformance/harness.py +0 -0
  516. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/conformance/test_anthropic.py +0 -0
  517. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/conformance/test_claude_code_cli.py +0 -0
  518. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/conformance/test_google.py +0 -0
  519. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/conformance/test_local_providers.py +0 -0
  520. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/conformance/test_openai.py +0 -0
  521. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/conformance/test_vllm.py +0 -0
  522. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/golden/__init__.py +0 -0
  523. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/golden/cli-2.1.149-json.json +0 -0
  524. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/golden/cli-2.1.149-json.meta +0 -0
  525. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/golden/cli-2.1.149-stream.jsonl +0 -0
  526. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/golden/cli-2.1.149-stream.meta +0 -0
  527. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/golden/cli-2.1.162-stream.jsonl +0 -0
  528. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/golden/cli-2.1.162-stream.meta +0 -0
  529. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/golden/test_golden_replay.py +0 -0
  530. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/live/__init__.py +0 -0
  531. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/live/test_live_canaries.py +0 -0
  532. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/__init__.py +0 -0
  533. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_anthropic_build_kwargs.py +0 -0
  534. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_anthropic_classify.py +0 -0
  535. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_base_client.py +0 -0
  536. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_claude_code.py +0 -0
  537. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_cli_cancellation.py +0 -0
  538. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_cli_event_forwarding.py +0 -0
  539. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_cli_runtime.py +0 -0
  540. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_container_runner.py +0 -0
  541. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_credentials.py +0 -0
  542. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_google_classify.py +0 -0
  543. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_local_probe.py +0 -0
  544. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_local_tool_repair.py +0 -0
  545. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_openai_client.py +0 -0
  546. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/llm_client/unit/test_profiles.py +0 -0
  547. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/__init__.py +0 -0
  548. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_adaptive_model_router.py +0 -0
  549. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_adaptive_router_configure.py +0 -0
  550. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_adaptive_thinking_budget.py +0 -0
  551. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_adhoc_providers.py +0 -0
  552. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_agent_tool.py +0 -0
  553. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_api_timeout_kwarg.py +0 -0
  554. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_artifact_metadata.py +0 -0
  555. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_ask_user_question_tool.py +0 -0
  556. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_attach_llm_client_guard.py +0 -0
  557. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_binary_classify_manifest.py +0 -0
  558. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_browser_doc_tools.py +0 -0
  559. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_budget_compaction_recovery.py +0 -0
  560. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_built_in_autoregister.py +0 -0
  561. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_builtin_capabilities.py +0 -0
  562. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_builtin_channels.py +0 -0
  563. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_builtin_features.py +0 -0
  564. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_cache_prefix_key.py +0 -0
  565. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_cancellation.py +0 -0
  566. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_claude_code_nonstream_prompt.py +0 -0
  567. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_claude_code_vision_wire.py +0 -0
  568. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_cli_mcp_passthrough.py +0 -0
  569. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_composite_set_hooks.py +0 -0
  570. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_concurrent_runs.py +0 -0
  571. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_config_liveness.py +0 -0
  572. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_core_deferred_tools.py +0 -0
  573. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_cron_runner.py +0 -0
  574. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_cron_store.py +0 -0
  575. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_cron_tools.py +0 -0
  576. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_dev_tools.py +0 -0
  577. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_diff_order_keyed.py +0 -0
  578. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_dynamic_persona_builder.py +0 -0
  579. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_embedding_error_classification.py +0 -0
  580. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_errors_categories.py +0 -0
  581. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_evaluation_chain.py +0 -0
  582. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_evaluation_chain_configure.py +0 -0
  583. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_event_catalog.py +0 -0
  584. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_event_channel_unification.py +0 -0
  585. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_event_correlation.py +0 -0
  586. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_external_tool_resolution.py +0 -0
  587. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_forge_tool.py +0 -0
  588. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_fork_multi_provider.py +0 -0
  589. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_from_manifest_strict_validation.py +0 -0
  590. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_gateway.py +0 -0
  591. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_gateway_ws.py +0 -0
  592. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_geny_prod_manifest_repro.py +0 -0
  593. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_graph_edges.py +0 -0
  594. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_graph_rank.py +0 -0
  595. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_guard_fail_fast.py +0 -0
  596. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_hierarchical_sidecars.py +0 -0
  597. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_hook_gate_split.py +0 -0
  598. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_hook_in_process.py +0 -0
  599. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_hook_runner.py +0 -0
  600. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_hook_taxonomy.py +0 -0
  601. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_hooks_and_shared_keys.py +0 -0
  602. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_host_selections_resolve.py +0 -0
  603. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_index_list_categories.py +0 -0
  604. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_index_render_vault_map.py +0 -0
  605. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_interaction_fields.py +0 -0
  606. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_internal_agentic_loop.py +0 -0
  607. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_introspection.py +0 -0
  608. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_llm_client_base.py +0 -0
  609. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_llm_client_capabilities.py +0 -0
  610. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_llm_client_registry.py +0 -0
  611. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_llm_client_request_types.py +0 -0
  612. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_llm_client_state.py +0 -0
  613. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_llm_compactor_selfwire.py +0 -0
  614. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_llm_summary_compactor.py +0 -0
  615. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_loop_agnostic_lock.py +0 -0
  616. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_manifest_factory.py +0 -0
  617. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_manifest_from_dict_hygiene.py +0 -0
  618. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_manifest_memory_wiring.py +0 -0
  619. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_manifest_provider_validation.py +0 -0
  620. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_manifest_subagents_memory_sections.py +0 -0
  621. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_manifest_v2.py +0 -0
  622. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_manifest_v3_migration.py +0 -0
  623. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_mcp_annotations_attach.py +0 -0
  624. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_mcp_credential_store.py +0 -0
  625. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_mcp_fsm.py +0 -0
  626. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_mcp_lifecycle.py +0 -0
  627. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_mcp_namespace.py +0 -0
  628. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_mcp_oauth.py +0 -0
  629. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_mcp_prompts_skills_bridge.py +0 -0
  630. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_mcp_resource_retriever.py +0 -0
  631. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_mcp_uri.py +0 -0
  632. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_mcp_wrapper_tools.py +0 -0
  633. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_memory_aware_retriever.py +0 -0
  634. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_memory_hooks_after_callbacks.py +0 -0
  635. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_memory_metadata_extension.py +0 -0
  636. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_memory_rollup.py +0 -0
  637. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_model_discovery.py +0 -0
  638. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_model_overrides.py +0 -0
  639. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_multi_dim_budget_configure.py +0 -0
  640. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_multi_dim_budget_controller.py +0 -0
  641. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_multi_format_yield.py +0 -0
  642. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_multi_provider.py +0 -0
  643. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_multimodal.py +0 -0
  644. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_note_graph_queries.py +0 -0
  645. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_notebook_edit_tool.py +0 -0
  646. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_notes_load_pinned.py +0 -0
  647. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_operator_tools.py +0 -0
  648. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_ordered_emitter_chain.py +0 -0
  649. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_permission_matrix.py +0 -0
  650. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_permission_mode_promotions.py +0 -0
  651. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_permission_posture.py +0 -0
  652. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_persistent_subagent.py +0 -0
  653. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase1_foundation.py +0 -0
  654. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase1_pipeline.py +0 -0
  655. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase2_agent_loop.py +0 -0
  656. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase2_tools.py +0 -0
  657. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase3_context_memory.py +0 -0
  658. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase4_think_agent_evaluate.py +0 -0
  659. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase5_emit_presets_mcp.py +0 -0
  660. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase5_environment.py +0 -0
  661. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase6_history.py +0 -0
  662. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase6_integration.py +0 -0
  663. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase7_security.py +0 -0
  664. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase9a_preset_regen.py +0 -0
  665. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_phase9a_scaffolding.py +0 -0
  666. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_pipeline_aclose.py +0 -0
  667. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_pipeline_attach_runtime.py +0 -0
  668. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_pipeline_events_tap.py +0 -0
  669. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_pipeline_from_manifest.py +0 -0
  670. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_pipeline_hook_lifecycle.py +0 -0
  671. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_pipeline_session_runtime.py +0 -0
  672. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_plan_mode_tools.py +0 -0
  673. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_primary_provider_and_build_reports.py +0 -0
  674. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_progressive_disclosure.py +0 -0
  675. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_provider_driven_strategy.py +0 -0
  676. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_push_notification_tool.py +0 -0
  677. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_refresh_backlinks_extension.py +0 -0
  678. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_refresh_runtime_and_run_lock.py +0 -0
  679. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_resolve_model_config.py +0 -0
  680. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_restore_bad_strategy_config.py +0 -0
  681. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_reviewer_policy_configure.py +0 -0
  682. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_runtime_task_runner.py +0 -0
  683. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_s06_chunk_forwarding.py +0 -0
  684. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_s06_provider_selection.py +0 -0
  685. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_s13_file_backed_registry.py +0 -0
  686. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_s13_task_registry_output.py +0 -0
  687. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_s19_frequency_policy.py +0 -0
  688. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_s9b1_tool_review.py +0 -0
  689. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_s9b2_task_registry.py +0 -0
  690. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_s9b3_hitl.py +0 -0
  691. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_s9b4_summarize.py +0 -0
  692. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_s9b5_persist.py +0 -0
  693. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_s9c1_pipeline_resume.py +0 -0
  694. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_s9c2_restore_state.py +0 -0
  695. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_sandbox_attach.py +0 -0
  696. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_sandbox_exec_tool.py +0 -0
  697. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_sandbox_tools.py +0 -0
  698. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_self_modifying_env.py +0 -0
  699. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_send_message_tool.py +0 -0
  700. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_settings_loader.py +0 -0
  701. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_skill_level3_resources.py +0 -0
  702. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_skill_phase_10_1.py +0 -0
  703. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_skill_phase_10_2.py +0 -0
  704. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_skill_phase_10_3.py +0 -0
  705. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_skill_phase_10_4_bundled.py +0 -0
  706. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_skill_phase_10_5_fork.py +0 -0
  707. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_skill_phase_10_6_killer.py +0 -0
  708. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_skill_phase_10_7_watcher.py +0 -0
  709. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_skill_richer_schema.py +0 -0
  710. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_skill_tool.py +0 -0
  711. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_skills_foundation.py +0 -0
  712. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_slash_built_in_control.py +0 -0
  713. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_slash_built_in_introspection.py +0 -0
  714. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_slash_commands.py +0 -0
  715. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_slash_md_template.py +0 -0
  716. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_stage10_ask_hitl.py +0 -0
  717. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_stage10_hook_wiring.py +0 -0
  718. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_stage10_partition_executor.py +0 -0
  719. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_stage10_permission_matrix.py +0 -0
  720. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_stage19_session_summary.py +0 -0
  721. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_state_mutation_wiring.py +0 -0
  722. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_state_shared_and_local.py +0 -0
  723. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_stm_append_event.py +0 -0
  724. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_strategy_config_roundtrip.py +0 -0
  725. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_streaming_tool_executor.py +0 -0
  726. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_structured_output_parser.py +0 -0
  727. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_structured_reflection.py +0 -0
  728. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_subagent_catalog.py +0 -0
  729. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_subagent_credential_propagation.py +0 -0
  730. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_subagent_descriptor.py +0 -0
  731. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_subagent_manifest_compile.py +0 -0
  732. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_subagent_orchestrator_zero_arg.py +0 -0
  733. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_subagent_parallel.py +0 -0
  734. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_subagent_pipeline_lifecycle.py +0 -0
  735. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_subagent_type_orchestrator.py +0 -0
  736. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_task_tools.py +0 -0
  737. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_todo_write_tool.py +0 -0
  738. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_tool_abc_uplift.py +0 -0
  739. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_tool_call_events.py +0 -0
  740. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_tool_errors.py +0 -0
  741. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_tool_lifecycle_hooks.py +0 -0
  742. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_tool_plugins.py +0 -0
  743. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_tool_provider.py +0 -0
  744. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_tool_result_persistence.py +0 -0
  745. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_tool_search_tool.py +0 -0
  746. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_tool_stage_max_concurrency.py +0 -0
  747. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_turn_boundary_state.py +0 -0
  748. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_validate_manifest.py +0 -0
  749. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_vault_map_drill.py +0 -0
  750. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_web_fetch_tool.py +0 -0
  751. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_web_search_backends.py +0 -0
  752. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_web_search_tool.py +0 -0
  753. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_workspace.py +0 -0
  754. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_workspace_propagation.py +0 -0
  755. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_workspace_tools.py +0 -0
  756. {geny_executor-2.45.0 → geny_executor-2.46.0}/tests/unit/test_workspace_tools_integration.py +0 -0
  757. {geny_executor-2.45.0 → geny_executor-2.46.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.45.0
3
+ Version: 2.46.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.45.0"
7
+ version = "2.46.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 = "Apache-2.0"
@@ -161,8 +161,16 @@ class BaseClient(ABC):
161
161
  tools: Optional[List[Dict[str, Any]]] = None,
162
162
  tool_choice: Optional[Dict[str, Any]] = None,
163
163
  purpose: str = "",
164
+ response_format: Optional[Dict[str, Any]] = None,
164
165
  ) -> APIResponse:
165
- """Send a non-streaming request built from a :class:`ModelConfig`."""
166
+ """Send a non-streaming request built from a :class:`ModelConfig`.
167
+
168
+ ``response_format`` is the canonical structured-output request
169
+ (``{"type": "json_schema", "json_schema": {...}}`` or
170
+ ``{"type": "json_object"}``). Clients that enforce it natively do
171
+ (Claude Code CLI → ``--json-schema``); others carry it as an
172
+ advisory field — callers should still validate/parse the reply.
173
+ """
166
174
  request = self._build_request(
167
175
  model_config=model_config,
168
176
  messages=messages,
@@ -170,6 +178,7 @@ class BaseClient(ABC):
170
178
  tools=tools,
171
179
  tool_choice=tool_choice,
172
180
  stream=False,
181
+ response_format=response_format,
173
182
  )
174
183
  return await self._send(request, purpose=purpose)
175
184
 
@@ -214,6 +223,7 @@ class BaseClient(ABC):
214
223
  tools: Optional[List[Dict[str, Any]]],
215
224
  tool_choice: Optional[Dict[str, Any]],
216
225
  stream: bool,
226
+ response_format: Optional[Dict[str, Any]] = None,
217
227
  ) -> APIRequest:
218
228
  """Assemble a canonical :class:`APIRequest`.
219
229
 
@@ -235,6 +245,10 @@ class BaseClient(ABC):
235
245
  ),
236
246
  stream=stream,
237
247
  )
248
+ if response_format:
249
+ request.response_format = dict(response_format)
250
+ if not self.capabilities.supports_structured_output:
251
+ self._emit_unsupported("response_format")
238
252
 
239
253
  if model_config.thinking_enabled:
240
254
  if self.capabilities.supports_thinking:
@@ -303,6 +303,7 @@ class ClaudeCodeCLIClient(BaseClient):
303
303
  tools: Optional[List[Dict[str, Any]]],
304
304
  tool_choice: Optional[Dict[str, Any]],
305
305
  stream: bool,
306
+ response_format: Optional[Dict[str, Any]] = None,
306
307
  ) -> APIRequest:
307
308
  """Canonical request assembly + client-level session continuity.
308
309
 
@@ -322,6 +323,7 @@ class ClaudeCodeCLIClient(BaseClient):
322
323
  tools=tools,
323
324
  tool_choice=tool_choice,
324
325
  stream=stream,
326
+ response_format=response_format,
325
327
  )
326
328
  if self._session_hint and request.session_hint is None:
327
329
  request.session_hint = dict(self._session_hint)
@@ -245,15 +245,24 @@ def claude_code_argv(
245
245
  # through stdin or as a prompt argument when using --print" — which
246
246
  # broke every non-streaming ``create_message`` (e.g. offline memory
247
247
  # summarisation) while streaming sessions worked.
248
- if not request.stream:
249
- prompt_text = flatten_messages_to_prompt(request.messages)
250
- if prompt_text:
251
- argv.append(prompt_text)
248
+ prompt_text = flatten_messages_to_prompt(request.messages) if not request.stream else ""
252
249
 
253
- # Caller-supplied escape hatch.
250
+ # Caller-supplied escape hatch — emitted BEFORE the ``--`` separator so
251
+ # any flags it carries (e.g. ``--tools ""``) are parsed as options, not
252
+ # swept into the positional prompt below.
254
253
  if extra_args:
255
254
  argv += list(extra_args)
256
255
 
256
+ # The prompt is the trailing positional, but ``--allowedTools`` /
257
+ # ``--disallowedTools`` are *variadic* (``nargs="+"``) — without a
258
+ # separator the CLI greedily swallows the prompt tokens as extra tool
259
+ # names ("permission deny rule '<word>' matches no known tool"). The
260
+ # POSIX ``--`` end-of-options marker forces everything after it to be
261
+ # positional, so the prompt survives verbatim regardless of which
262
+ # variadic flags precede it.
263
+ if prompt_text:
264
+ argv += ["--", prompt_text]
265
+
257
266
  return argv
258
267
 
259
268
 
@@ -99,6 +99,19 @@ class APIResponse:
99
99
  def tool_calls(self) -> List[ContentBlock]:
100
100
  return [b for b in self.content if b.type == "tool_use"]
101
101
 
102
+ @property
103
+ def structured(self) -> Optional[Any]:
104
+ """Provider-enforced structured output, when the request carried a
105
+ ``response_format`` and the backend enforced it natively.
106
+
107
+ Claude Code CLI surfaces it as the result envelope's
108
+ ``structured_output`` (both wire modes preserve the envelope in
109
+ ``raw``). Providers without native enforcement return the JSON as
110
+ text — callers should fall back to parsing ``.text``."""
111
+ if isinstance(self.raw, dict):
112
+ return self.raw.get("structured_output")
113
+ return None
114
+
102
115
  @property
103
116
  def thinking_blocks(self) -> List[ContentBlock]:
104
117
  return [b for b in self.content if b.type == "thinking"]
@@ -85,15 +85,51 @@ from geny_executor.memory.factory import MemoryProviderFactory
85
85
  # (typically a CompositeMemoryProvider) and pass a MemoryHooks bag
86
86
  # carrying retrieval policy + post-write callbacks.
87
87
  from geny_executor.memory.retriever import MemoryAwareRetriever
88
+ from geny_executor.memory.facts import (
89
+ FACT_EXTRACTION_SCHEMA,
90
+ FACTS_CATEGORY,
91
+ FACTS_FILENAME,
92
+ MEMORY_ENGINE_SYSTEM_PROMPT,
93
+ Fact,
94
+ FactExtraction,
95
+ FactExtractionReport,
96
+ FactLedger,
97
+ LedgerState,
98
+ build_fact_extraction_instruction,
99
+ render_ledger_markdown,
100
+ )
88
101
  from geny_executor.memory.rollup import (
102
+ EVERGREEN_SCHEMA,
103
+ SEGMENT_DIGEST_SCHEMA,
89
104
  MemoryRollup,
90
105
  RollupReport,
106
+ build_evergreen_instruction_structured,
107
+ build_segment_instruction_structured,
108
+ render_evergreen,
109
+ render_segment_digest,
91
110
  build_segment_instruction,
92
111
  )
93
112
  from geny_executor.memory.strategy import ProviderDrivenStrategy
94
113
  from geny_executor.memory.presets import GenyPresets
95
114
 
96
115
  __all__ = [
116
+ "Fact",
117
+ "FactExtraction",
118
+ "FactExtractionReport",
119
+ "FactLedger",
120
+ "LedgerState",
121
+ "FACT_EXTRACTION_SCHEMA",
122
+ "FACTS_FILENAME",
123
+ "FACTS_CATEGORY",
124
+ "MEMORY_ENGINE_SYSTEM_PROMPT",
125
+ "build_fact_extraction_instruction",
126
+ "render_ledger_markdown",
127
+ "SEGMENT_DIGEST_SCHEMA",
128
+ "EVERGREEN_SCHEMA",
129
+ "build_segment_instruction_structured",
130
+ "build_evergreen_instruction_structured",
131
+ "render_segment_digest",
132
+ "render_evergreen",
97
133
  # semantic compaction / rollup
98
134
  "MemoryRollup",
99
135
  "RollupReport",
@@ -0,0 +1,504 @@
1
+ """Structured Fact Ledger — durable conversational facts as first-class records.
2
+
3
+ The rollup tiers (:mod:`geny_executor.memory.rollup`) compress *narrative*;
4
+ this module owns the *atomic facts* a companion agent must never lose — the
5
+ user's name and how they want to be addressed, preferences, relationships,
6
+ commitments, long-running context. The two concerns are deliberately split:
7
+ a summary can degrade gracefully, a fact cannot.
8
+
9
+ Design contract (the reason this is robust where free-text memory is not):
10
+
11
+ * **The LLM judges, the schema constrains, the code stores.** Extraction is
12
+ an LLM call whose output is schema-bound JSON (``FACT_EXTRACTION_SCHEMA``,
13
+ enforced natively where the client supports structured output, validated
14
+ in code regardless). What counts as "important" is entirely the model's
15
+ judgment — there are no keyword lists here.
16
+ * **Diff semantics, never rewrite.** The extractor proposes ``upserts`` /
17
+ ``supersedes``; :class:`FactLedger` applies them by key. Existing facts
18
+ can only be *superseded* (kept, marked), never silently dropped — a bad
19
+ extraction pass cannot erase the ledger.
20
+ * **Storage rides the notes infrastructure.** The ledger persists as one
21
+ pinned ``critical`` note (``__facts__.md``): machine state in
22
+ frontmatter, a deterministic human-readable rendering as the body. That
23
+ buys always-on prompt injection (retriever L1.5 ``load_pinned``), search
24
+ (``memory_search``), and host UI visibility with zero new plumbing.
25
+
26
+ Triggers are HOST-DRIVEN (same philosophy as ``MemoryRollup``): the host
27
+ calls :meth:`FactExtraction.run` on its idle/close cadence and supplies the
28
+ LLM as an async ``complete_structured(instruction, schema) -> dict | None``
29
+ callable. This module never does network I/O of its own.
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ import logging
35
+ from dataclasses import dataclass, field
36
+ from datetime import datetime, timezone
37
+ from typing import Any, Awaitable, Callable, Dict, List, Optional, Sequence, Tuple
38
+
39
+ from geny_executor.memory.rollup import _flatten_turn
40
+
41
+ logger = logging.getLogger(__name__)
42
+
43
+ #: Host-injected structured LLM call: ``async (instruction, json_schema) ->
44
+ #: parsed dict`` (or ``None`` on failure — the ledger is then left untouched).
45
+ CompleteStructured = Callable[[str, Dict[str, Any]], Awaitable[Optional[Dict[str, Any]]]]
46
+
47
+ #: The ledger note — a single rewritable pinned ``critical`` note that is
48
+ #: ALWAYS injected (retriever L1.5 ``load_pinned``) and never compacted away.
49
+ FACTS_FILENAME = "__facts__.md"
50
+ FACTS_CATEGORY = "critical"
51
+
52
+ #: Closed vocabulary for fact classification. The model picks; the schema
53
+ #: enforces. Extend deliberately — every kind renders as its own section.
54
+ FACT_KINDS = (
55
+ "identity", # names, how to address the user / the agent, roles
56
+ "preference", # stated likes/dislikes, style, standing instructions
57
+ "relationship", # people/orgs around the user and their relation
58
+ "commitment", # promises, deadlines, recurring events
59
+ "context", # long-running projects/threads/situations
60
+ "knowledge", # other durable facts worth carrying across sessions
61
+ )
62
+
63
+ _IMPORTANCE_LEVELS = ("critical", "high", "medium", "low")
64
+
65
+ #: JSON Schema for one extraction pass. Kept flat and strict — additional
66
+ #: properties are rejected so the model cannot smuggle prose past the wire.
67
+ FACT_EXTRACTION_SCHEMA: Dict[str, Any] = {
68
+ "type": "object",
69
+ "additionalProperties": False,
70
+ "required": ["upserts", "supersedes"],
71
+ "properties": {
72
+ "upserts": {
73
+ "type": "array",
74
+ "items": {
75
+ "type": "object",
76
+ "additionalProperties": False,
77
+ "required": ["id", "kind", "statement", "importance"],
78
+ "properties": {
79
+ "id": {
80
+ "type": "string",
81
+ "description": (
82
+ "Stable dotted key for the fact, e.g. "
83
+ "'user.name', 'user.address_as', "
84
+ "'commitment.weekly-report'. Reuse an existing "
85
+ "id to update that fact in place."
86
+ ),
87
+ },
88
+ "kind": {"enum": list(FACT_KINDS)},
89
+ "statement": {
90
+ "type": "string",
91
+ "description": (
92
+ "The fact, one self-contained sentence; keep "
93
+ "the user's own wording where the wording IS "
94
+ "the fact (names, titles)."
95
+ ),
96
+ },
97
+ "evidence": {
98
+ "type": "string",
99
+ "description": "Short quote from the turn that establishes it.",
100
+ },
101
+ "importance": {"enum": list(_IMPORTANCE_LEVELS)},
102
+ },
103
+ },
104
+ },
105
+ "supersedes": {
106
+ "type": "array",
107
+ "items": {"type": "string"},
108
+ "description": (
109
+ "Ids of existing facts that are now wrong/replaced and must "
110
+ "be retired (they are kept, marked superseded)."
111
+ ),
112
+ },
113
+ },
114
+ }
115
+
116
+
117
+ def build_fact_extraction_instruction(
118
+ *, active_facts: str, new_turns: str
119
+ ) -> str:
120
+ """Instruction for one extraction pass over new conversation turns.
121
+
122
+ Content judgment belongs to the model; the output contract belongs to
123
+ the schema. This text therefore describes WHAT durable facts are, not
124
+ patterns to match.
125
+ """
126
+ return (
127
+ "You are the fact-extraction engine of a persistent companion "
128
+ "agent's memory. From the NEW TURNS below, extract durable facts "
129
+ "the agent must remember across all future sessions, as a diff "
130
+ "against the CURRENT LEDGER.\n\n"
131
+ "A durable fact is something that will still matter in a week: who "
132
+ "the user is (name, and exactly how they want to be addressed), "
133
+ "stated preferences and standing instructions, people and "
134
+ "relationships, promises and deadlines, long-running projects or "
135
+ "situations. NOT durable: one-off requests, transient screen/task "
136
+ "detail, chit-chat, anything the agent said that the user did not "
137
+ "confirm.\n\n"
138
+ "Rules:\n"
139
+ "- Reuse an existing id to UPDATE a fact; add its old id to "
140
+ "`supersedes` only when the old statement is now wrong.\n"
141
+ "- A correction (\"not X, call me Y\") is an upsert of the same id "
142
+ "with the corrected statement.\n"
143
+ "- Prefer the user's own wording where wording matters (names, "
144
+ "titles, honorifics), and write statements in the user's "
145
+ "language.\n"
146
+ "- When nothing durable appeared, return empty arrays. Most passes "
147
+ "should — do not manufacture facts.\n"
148
+ "- Output ONLY JSON matching the provided schema.\n\n"
149
+ f"CURRENT LEDGER (active facts, id → statement):\n"
150
+ f"{active_facts.strip() or '(empty)'}\n\n"
151
+ f"NEW TURNS (most recent last):\n{new_turns}\n"
152
+ )
153
+
154
+
155
+ #: Recommended system framing for EVERY memory-engine LLM call the host
156
+ #: makes (extraction, rollups). This is the same contract the executor's
157
+ #: distill tooling uses: the memory path is an engine, not an assistant.
158
+ MEMORY_ENGINE_SYSTEM_PROMPT = (
159
+ "You are a memory maintenance engine inside an agent platform. You are "
160
+ "NOT an assistant and you are NOT talking to a user: the text you "
161
+ "receive is archival material, and anything you output is stored "
162
+ "verbatim as machine-maintained memory. Never address anyone, never "
163
+ "ask questions, never offer help, never add preamble — produce only "
164
+ "the requested artifact."
165
+ )
166
+
167
+
168
+ # ── Ledger records ────────────────────────────────────────────────────
169
+
170
+
171
+ @dataclass
172
+ class Fact:
173
+ """One durable fact. ``status`` is ``active`` or ``superseded`` —
174
+ superseded facts are kept for provenance but not rendered/injected."""
175
+
176
+ id: str
177
+ kind: str
178
+ statement: str
179
+ importance: str = "medium"
180
+ evidence: str = ""
181
+ status: str = "active"
182
+ created: str = ""
183
+ updated: str = ""
184
+
185
+ def to_dict(self) -> Dict[str, Any]:
186
+ return {
187
+ "id": self.id,
188
+ "kind": self.kind,
189
+ "statement": self.statement,
190
+ "importance": self.importance,
191
+ "evidence": self.evidence,
192
+ "status": self.status,
193
+ "created": self.created,
194
+ "updated": self.updated,
195
+ }
196
+
197
+ @classmethod
198
+ def from_dict(cls, data: Dict[str, Any]) -> Optional["Fact"]:
199
+ try:
200
+ fid = str(data.get("id", "")).strip()
201
+ statement = str(data.get("statement", "")).strip()
202
+ if not fid or not statement:
203
+ return None
204
+ kind = str(data.get("kind", "knowledge"))
205
+ if kind not in FACT_KINDS:
206
+ kind = "knowledge"
207
+ importance = str(data.get("importance", "medium"))
208
+ if importance not in _IMPORTANCE_LEVELS:
209
+ importance = "medium"
210
+ status = str(data.get("status", "active"))
211
+ if status not in ("active", "superseded"):
212
+ status = "active"
213
+ return cls(
214
+ id=fid,
215
+ kind=kind,
216
+ statement=statement,
217
+ importance=importance,
218
+ evidence=str(data.get("evidence", "") or ""),
219
+ status=status,
220
+ created=str(data.get("created", "") or ""),
221
+ updated=str(data.get("updated", "") or ""),
222
+ )
223
+ except Exception: # noqa: BLE001 — one bad row never kills the ledger
224
+ return None
225
+
226
+
227
+ _KIND_HEADINGS = {
228
+ "identity": "Identity",
229
+ "preference": "Preferences",
230
+ "relationship": "Relationships",
231
+ "commitment": "Commitments",
232
+ "context": "Long-running Context",
233
+ "knowledge": "Other Durable Facts",
234
+ }
235
+
236
+ _IMPORTANCE_ORDER = {"critical": 0, "high": 1, "medium": 2, "low": 3}
237
+
238
+
239
+ def render_ledger_markdown(facts: Sequence[Fact]) -> str:
240
+ """Deterministic human-readable rendering of the ACTIVE facts, grouped
241
+ by kind, importance-ranked inside each group. This is what the
242
+ retriever injects as pinned context — dense, no prose padding."""
243
+ active = [f for f in facts if f.status == "active"]
244
+ if not active:
245
+ return "_(no durable facts recorded yet)_\n"
246
+ lines: List[str] = []
247
+ for kind in FACT_KINDS:
248
+ group = sorted(
249
+ (f for f in active if f.kind == kind),
250
+ key=lambda f: (_IMPORTANCE_ORDER.get(f.importance, 9), f.id),
251
+ )
252
+ if not group:
253
+ continue
254
+ lines.append(f"## {_KIND_HEADINGS[kind]}")
255
+ for f in group:
256
+ lines.append(f"- {f.statement}")
257
+ lines.append("")
258
+ superseded = sum(1 for f in facts if f.status == "superseded")
259
+ if superseded:
260
+ lines.append(f"_({superseded} superseded fact(s) retained in history)_")
261
+ lines.append("")
262
+ return "\n".join(lines)
263
+
264
+
265
+ @dataclass
266
+ class LedgerState:
267
+ """The ledger + its extraction cursor as loaded from the note."""
268
+
269
+ facts: List[Fact] = field(default_factory=list)
270
+ cursor: str = "" # ISO timestamp of the last turn already processed
271
+
272
+
273
+ class FactLedger:
274
+ """Load / apply-diff / persist the fact ledger on the provider's notes."""
275
+
276
+ def __init__(self, provider: object) -> None:
277
+ if provider is None:
278
+ raise ValueError("FactLedger requires a provider")
279
+ self._provider = provider
280
+
281
+ async def load(self) -> LedgerState:
282
+ """Read the ledger note; missing/corrupt → empty state (never raises)."""
283
+ try:
284
+ note = await self._provider.notes().read(FACTS_FILENAME)
285
+ except Exception: # noqa: BLE001
286
+ return LedgerState()
287
+ if note is None:
288
+ return LedgerState()
289
+ fm = getattr(note, "frontmatter", None) or {}
290
+ rows = fm.get("facts") or []
291
+ facts: List[Fact] = []
292
+ if isinstance(rows, list):
293
+ for row in rows:
294
+ if isinstance(row, dict):
295
+ fact = Fact.from_dict(row)
296
+ if fact is not None:
297
+ facts.append(fact)
298
+ cursor = str(fm.get("extraction_cursor", "") or "")
299
+ return LedgerState(facts=facts, cursor=cursor)
300
+
301
+ @staticmethod
302
+ def apply_diff(
303
+ state: LedgerState,
304
+ *,
305
+ upserts: Sequence[Dict[str, Any]],
306
+ supersedes: Sequence[str],
307
+ now_iso: str,
308
+ ) -> int:
309
+ """Apply an extraction diff in place. Returns the number of changes.
310
+
311
+ Code-owned semantics: upsert by id (update statement/importance/
312
+ evidence, revive if previously superseded), supersede by id (kept,
313
+ marked). Unknown ids in ``supersedes`` are ignored. The ledger can
314
+ never lose a fact it wasn't explicitly told to retire.
315
+ """
316
+ by_id = {f.id: f for f in state.facts}
317
+ changed = 0
318
+
319
+ for raw in upserts or []:
320
+ if not isinstance(raw, dict):
321
+ continue
322
+ fact = Fact.from_dict(raw)
323
+ if fact is None:
324
+ continue
325
+ existing = by_id.get(fact.id)
326
+ if existing is None:
327
+ fact.created = now_iso
328
+ fact.updated = now_iso
329
+ fact.status = "active"
330
+ state.facts.append(fact)
331
+ by_id[fact.id] = fact
332
+ changed += 1
333
+ continue
334
+ if (
335
+ existing.statement == fact.statement
336
+ and existing.importance == fact.importance
337
+ and existing.status == "active"
338
+ ):
339
+ continue # no-op upsert — keep timestamps stable
340
+ existing.statement = fact.statement
341
+ existing.kind = fact.kind
342
+ existing.importance = fact.importance
343
+ if fact.evidence:
344
+ existing.evidence = fact.evidence
345
+ existing.status = "active"
346
+ existing.updated = now_iso
347
+ changed += 1
348
+
349
+ for fid in supersedes or []:
350
+ existing = by_id.get(str(fid))
351
+ if existing is not None and existing.status != "superseded":
352
+ existing.status = "superseded"
353
+ existing.updated = now_iso
354
+ changed += 1
355
+
356
+ return changed
357
+
358
+ async def save(self, state: LedgerState) -> bool:
359
+ """Persist the ledger note (machine state in frontmatter, rendered
360
+ body). Best-effort — returns False on failure."""
361
+ try:
362
+ from geny_executor.memory.provider import Importance, NoteDraft
363
+
364
+ await self._provider.notes().write(
365
+ NoteDraft(
366
+ title="Fact Ledger",
367
+ body=render_ledger_markdown(state.facts),
368
+ importance=Importance.CRITICAL,
369
+ category=FACTS_CATEGORY,
370
+ filename=FACTS_FILENAME,
371
+ tags=["facts", "ledger"],
372
+ frontmatter={
373
+ "facts": [f.to_dict() for f in state.facts],
374
+ "extraction_cursor": state.cursor,
375
+ },
376
+ )
377
+ )
378
+ return True
379
+ except Exception: # noqa: BLE001
380
+ logger.warning("facts: ledger write failed", exc_info=True)
381
+ return False
382
+
383
+
384
+ # ── Extraction pass ───────────────────────────────────────────────────
385
+
386
+
387
+ @dataclass
388
+ class FactExtractionReport:
389
+ """Outcome of one extraction pass (diagnostics; never raises)."""
390
+
391
+ ran: bool = False
392
+ turns_seen: int = 0
393
+ changes: int = 0
394
+ active_facts: int = 0
395
+ skipped_reason: Optional[str] = None
396
+
397
+
398
+ def _turn_timestamp_iso(turn: object) -> str:
399
+ ts = getattr(turn, "timestamp", None)
400
+ if isinstance(ts, datetime):
401
+ if ts.tzinfo is None:
402
+ ts = ts.replace(tzinfo=timezone.utc)
403
+ return ts.isoformat()
404
+ return str(ts or "")
405
+
406
+
407
+ class FactExtraction:
408
+ """One host-driven extraction pass: new STM turns → schema-bound diff →
409
+ ledger. Idempotent via the cursor stored on the ledger note."""
410
+
411
+ def __init__(
412
+ self,
413
+ provider: object,
414
+ *,
415
+ complete_structured: CompleteStructured,
416
+ max_turns: int = 200,
417
+ max_active_facts: int = 200,
418
+ ) -> None:
419
+ if provider is None:
420
+ raise ValueError("FactExtraction requires a provider")
421
+ if complete_structured is None:
422
+ raise ValueError("FactExtraction requires a complete_structured callable")
423
+ self._provider = provider
424
+ self._complete = complete_structured
425
+ self._max_turns = max(1, int(max_turns))
426
+ self._max_active_facts = max(10, int(max_active_facts))
427
+
428
+ async def run(self) -> FactExtractionReport:
429
+ report = FactExtractionReport()
430
+ ledger = FactLedger(self._provider)
431
+ state = await ledger.load()
432
+
433
+ try:
434
+ turns = await self._provider.stm().recent(n=self._max_turns)
435
+ except Exception: # noqa: BLE001
436
+ report.skipped_reason = "stm_unavailable"
437
+ return report
438
+
439
+ # Only turns newer than the cursor; require at least one USER turn —
440
+ # facts come from what the user said/confirmed, and passes with only
441
+ # agent monologue (triggers, tool chatter) are skipped for free.
442
+ fresh: List[object] = []
443
+ has_user = False
444
+ latest_iso = state.cursor
445
+ for t in turns or []:
446
+ iso = _turn_timestamp_iso(t)
447
+ if state.cursor and iso and iso <= state.cursor:
448
+ continue
449
+ rendered = _flatten_turn(t)
450
+ if not rendered:
451
+ continue
452
+ fresh.append(t)
453
+ if (getattr(t, "role", "") or "") == "user":
454
+ has_user = True
455
+ if iso and iso > latest_iso:
456
+ latest_iso = iso
457
+ report.turns_seen = len(fresh)
458
+ if not fresh or not has_user:
459
+ report.skipped_reason = "no_new_user_turns"
460
+ return report
461
+
462
+ active = [f for f in state.facts if f.status == "active"]
463
+ active_lines = "\n".join(f"- {f.id}: {f.statement}" for f in active)
464
+ turn_lines = "\n".join(
465
+ r for r in (_flatten_turn(t) for t in fresh) if r
466
+ )
467
+
468
+ instruction = build_fact_extraction_instruction(
469
+ active_facts=active_lines, new_turns=turn_lines,
470
+ )
471
+ try:
472
+ data = await self._complete(instruction, FACT_EXTRACTION_SCHEMA)
473
+ except Exception: # noqa: BLE001 — host LLM; never fatal
474
+ logger.warning("facts: structured completion failed", exc_info=True)
475
+ data = None
476
+ if not isinstance(data, dict):
477
+ report.skipped_reason = "no_structured_output"
478
+ return report
479
+
480
+ upserts = data.get("upserts")
481
+ supersedes = data.get("supersedes")
482
+ if not isinstance(upserts, list) or not isinstance(supersedes, list):
483
+ report.skipped_reason = "schema_mismatch"
484
+ return report
485
+
486
+ # Backstop cap — a runaway extraction can't flood the pinned budget.
487
+ room = self._max_active_facts - len(active)
488
+ if room < len(upserts):
489
+ upserts = upserts[: max(0, room)]
490
+
491
+ now_iso = datetime.now(timezone.utc).isoformat()
492
+ report.changes = FactLedger.apply_diff(
493
+ state, upserts=upserts, supersedes=supersedes, now_iso=now_iso,
494
+ )
495
+ state.cursor = latest_iso
496
+ report.ran = True
497
+ report.active_facts = sum(1 for f in state.facts if f.status == "active")
498
+
499
+ # Persist even on zero changes — the cursor advance is what makes
500
+ # the pass idempotent and keeps already-seen turns out of the next
501
+ # extraction window.
502
+ if not await ledger.save(state):
503
+ report.skipped_reason = "ledger_write_failed"
504
+ return report