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