geny-executor 2.71.0__tar.gz → 2.72.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {geny_executor-2.71.0 → geny_executor-2.72.0}/PKG-INFO +1 -1
- {geny_executor-2.71.0 → geny_executor-2.72.0}/pyproject.toml +1 -1
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/pipeline.py +6 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/base.py +122 -23
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/openai_compatible.py +9 -19
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/profiles.py +10 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/responses_wire.py +20 -3
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/router.py +19 -1
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/vllm.py +9 -24
- geny_executor-2.72.0/tests/unit/test_an_endpoint_declares_what_it_serves.py +187 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cooldown_policy.py +60 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_images_a_model_cannot_see.py +94 -3
- {geny_executor-2.71.0 → geny_executor-2.72.0}/.gitignore +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/LICENSE +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/NOTICE +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/README.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/README_ko.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/audio/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/audio/stt/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/audio/stt/openai_compatible.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/audio/stt/provider.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/audio/stt/registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/channels/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/channels/built_in.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/channels/factory.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/channels/send_message_channel.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/channels/user_file_channel.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/artifact.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/builder.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/compaction.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/config.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/context_prune.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/diff.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/environment.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/environment_control.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/errors.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/introspection.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/manifest_factory.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/message_repair.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/mutation.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/presets.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/result.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/schema.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/shared_keys.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/slot.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/snapshot.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/state.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/core/token_estimate.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/runner.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/store_abc.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/store_impl/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/store_impl/file_backed.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/store_impl/in_memory.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/cron/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/events/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/events/bus.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/events/catalog.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/events/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/adapter.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/discord.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/factory.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/runner.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/slack.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/telegram.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/gateway/ws_base.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/ab_test.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/cost.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/models.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/monitor.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/replay.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/history/service.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/hooks/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/hooks/config.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/hooks/events.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/hooks/runner.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/_failover.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/_sandbox_handle.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/anthropic.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/claude_code_tokens.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/codex.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/credentials.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/google.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/local_probe.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/model_discovery.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/openai.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/text_tool_protocol.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/translators/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/translators/_canonical.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/_locks.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/_offload.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/_progressive.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/composite/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/composite/handles.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/composite/provider.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/composite/routing.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/composite/snapshot.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/client.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/google.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/local.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/openai.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/openai_compatible.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/embedding/voyage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/factory.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/facts.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/graph_rank.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/presets.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/provider.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/ephemeral.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/config.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/frontmatter.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/graph_edges.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/index_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/layout.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/ltm_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/notes_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/provider.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/snapshot.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/stm_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/timezone.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/file/vector_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/config.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/connection.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/index_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/ltm_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/notes_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/provider.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/schema.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/snapshot.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/stm_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/providers/sql/vector_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/retriever.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/rollup.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/strategy.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/vector/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/memory/vector/qdrant_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/notifications/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/notifications/registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/permission/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/permission/loader.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/permission/matrix.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/permission/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/py.typed +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/runtime/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/runtime/task_executors.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/runtime/task_runner.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/security/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/security/import_validator.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/security/script_sandbox.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/session/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/session/freshness.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/session/manager.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/session/persistence.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/session/session.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/settings/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/settings/loader.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/settings/section_registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/batch/SKILL.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/debug/SKILL.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/environment/REFERENCE.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/environment/SKILL.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/loop/SKILL.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/lorem-ipsum/SKILL.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/simplify/SKILL.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/skillify/SKILL.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/stuck/SKILL.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/tool-builder/REFERENCE.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/tool-builder/SKILL.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled/verify/SKILL.md +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/bundled_skills.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/fork.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/frontmatter.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/loader.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/mcp_bridge.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/path_match.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/shell_blocks.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/skill_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/skills/watcher.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/_helpers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/cancel.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/clear.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/compact.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/config.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/context.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/cost.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/help.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/memory.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/model.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/preset_info.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/status.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/built_in/tasks.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/md_template.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/parser.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/slash_commands/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/artifact/default/normalizers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/artifact/default/validators.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/normalizers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s01_input/validators.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/artifact/default/compactors.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/artifact/default/retrievers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/artifact/default/strategies.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/compactors.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/retrievers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/strategies.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s02_context/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/artifact/default/builders.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/builders.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/persona/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/persona/builder.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/persona/provider.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s03_system/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/artifact/default/guards.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/guards.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s04_guard/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/artifact/default/strategies.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s05_cache/strategies.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/_translate.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/default/providers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/default/retry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/default/router.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/default/tool_loop.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/google/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/google/providers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/openai/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/artifact/openai/providers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/providers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/retry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s06_api/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/artifact/default/pricing.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/artifact/default/trackers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/pricing.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s07_token/trackers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/artifact/default/budget.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/artifact/default/processors.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/processors.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s08_think/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/artifact/default/parsers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/artifact/default/signals.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/parsers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/signals.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s09_parse/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/artifact/default/executors.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/artifact/default/routers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/dispatcher.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/executors.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/persistence.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/routers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/state_mutation.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s10_tool/streaming.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s11_tool_review/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s11_tool_review/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s11_tool_review/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s11_tool_review/artifact/default/reviewers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s11_tool_review/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s11_tool_review/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/artifact/default/orchestrators.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/orchestrators.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/persistent_subagent.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/subagent_catalog.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/subagent_type.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s12_agent/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/artifact/default/file_backed_registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/artifact/default/policies.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/artifact/default/registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s13_task_registry/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/strategy.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/artifact/default/strategies.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/strategies.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s14_evaluate/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/artifact/default/requesters.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/artifact/default/timeouts.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s15_hitl/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/artifact/default/controllers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/controllers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s16_loop/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/artifact/default/emitters.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/emitters.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s17_emit/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/_dehydrate.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/artifact/default/persistence.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/artifact/default/strategies.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/insight.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/persistence.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s18_memory/strategies.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/artifact/default/importance.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/artifact/default/summarizers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/frequency_policy.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s19_summarize/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/artifact/default/frequencies.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/artifact/default/persisters.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/restore.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s20_persist/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/artifact/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/artifact/default/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/artifact/default/formatters.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/artifact/default/multi_format.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/artifact/default/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/formatters.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/interface.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/stages/s21_yield/stage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/_sandbox.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/_ssh.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/adhoc.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/base.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/_path_guard.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/_ssh_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/_web_search_backends.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/agent_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/ask_user_question_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/atlassian_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/audio_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/bash_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/browser_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/cron_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/dev_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/doc_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/edit_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/env_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/glob_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/google_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/grep_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/mcp_wrapper_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/notebook_edit_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/operator_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/plan_mode_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/push_notification_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/read_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/sandbox_exec_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/send_message_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/ssh_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/subagent_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/task_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/todo_write_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/tool_search_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/web_fetch_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/web_search_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/workspace_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/worktree_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/built_in/write_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/composer.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/errors.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/adapter.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/credentials.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/errors.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/manager.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/oauth.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/state.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/mcp/uri.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/plugin.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/provider.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/providers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/sandbox.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/scope.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/tools/stage_binding.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/workspace/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/workspace/stack.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/workspace/types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/_fixtures/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/_fixtures/fake_echo_cli.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/_fixtures/geny_manifest_layout.json +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/_fixtures/manifest_entries.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/conftest.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/fixtures/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/fixtures/adapter/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/fixtures/adapter/adapter.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c1_six_layer_retrieval.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c2_execution_recording.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c3_reflection_and_promotion.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c4_rest_coverage.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c5_embedding_migration.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c6_session_resume.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_c7_adapter_parity.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/completeness/test_spec_loads.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/memory_provider_contract.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_embedding_clients.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_error_codes_stability.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_embedding_credentials.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_auto_vector.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_composite.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_composite_routing.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_curated_global.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_ephemeral.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_factory.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_file.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_file_layout.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_file_vector.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_sql.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_sql_dialect.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_sql_schema.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_provider_sql_vector.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_memory_vector_breaker.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/contract/test_stage_uniformity.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/integration/test_cycle_ab_cross_import.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/integration/test_integration.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/harness.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/test_anthropic.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/test_google.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/test_local_providers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/test_openai.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/conformance/test_vllm.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/live/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/live/test_live_canaries.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_anthropic_build_kwargs.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_anthropic_classify.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_base_client.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_credentials.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_google_classify.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_local_probe.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_local_tool_repair.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_openai_client.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/llm_client/unit/test_profiles.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/memory/test_note_delete_propagation.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/__init__.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_account_load_balancing.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_account_router.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_adaptive_model_router.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_adaptive_router_configure.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_adaptive_thinking_budget.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_adhoc_providers.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_agent_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_api_timeout_kwarg.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_artifact_metadata.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_ask_user_question_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_atlassian_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_attach_llm_client_guard.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_audio_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_binary_classify_manifest.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_browser_doc_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_budget_compaction_recovery.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_built_in_autoregister.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_builtin_capabilities.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_builtin_channels.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_builtin_features.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cache_prefix_key.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cancellation.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_claude_code_token_client.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cli_stream_limit.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_codex_responses_client.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_compaction_stm_watermark.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_composite_set_hooks.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_concurrent_runs.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_config_liveness.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_conversation_is_portable.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_core_deferred_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cron_runner.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cron_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_cron_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_deterministic_prune_pass.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_dev_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_diff_order_keyed.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_dispatch_context_carries_the_sandbox.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_dynamic_persona_builder.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_embedding_error_classification.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_embedding_loop_safety.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_embedding_openai_compatible.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_errors_categories.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_evaluation_chain.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_evaluation_chain_configure.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_event_catalog.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_event_channel_unification.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_event_correlation.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_external_tool_resolution.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_failover_classification.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_forge_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_fork_multi_provider.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_from_manifest_strict_validation.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_gateway.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_gateway_ws.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_geny_prod_manifest_repro.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_graph_edges.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_graph_rank.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_guard_fail_fast.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_hierarchical_sidecars.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_hook_gate_split.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_hook_in_process.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_hook_runner.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_hook_taxonomy.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_hooks_and_shared_keys.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_host_selections_resolve.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_identity_card_and_pinned.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_index_list_categories.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_index_render_vault_map.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_index_sidecar_coalescing.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_interaction_fields.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_internal_agentic_loop.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_introspection.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_client_base.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_client_capabilities.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_client_registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_client_request_types.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_client_state.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_compactor_selfwire.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_llm_summary_compactor.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_lock_cancel_leak.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_loop_agnostic_lock.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_factory.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_from_dict_hygiene.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_memory_wiring.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_provider_validation.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_subagents_memory_sections.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_v2.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_manifest_v3_migration.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_annotations_attach.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_credential_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_fsm.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_lifecycle.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_namespace.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_oauth.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_prompts_skills_bridge.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_resource_retriever.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_uri.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_mcp_wrapper_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_memory_aware_retriever.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_memory_facts.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_memory_hooks_after_callbacks.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_memory_metadata_extension.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_memory_rollup.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_model_discovery.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_model_overrides.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_multi_dim_budget_configure.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_multi_dim_budget_controller.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_multi_format_yield.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_multi_provider.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_multimodal.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_note_graph_queries.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_notebook_edit_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_notes_load_pinned.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_notes_store_offloop_scan.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_one_path_vocabulary.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_openai_responses_routing.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_operator_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_ordered_emitter_chain.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_permission_matrix.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_permission_mode_promotions.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_permission_posture.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_persistent_subagent.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase1_foundation.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase1_pipeline.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase2_agent_loop.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase2_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase3_context_memory.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase4_think_agent_evaluate.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase5_emit_presets_mcp.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase5_environment.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase6_history.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase6_integration.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase7_security.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase9a_preset_regen.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_phase9a_scaffolding.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_pipeline_aclose.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_pipeline_attach_runtime.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_pipeline_events_tap.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_pipeline_from_manifest.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_pipeline_hook_lifecycle.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_pipeline_session_runtime.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_plan_mode_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_primary_provider_and_build_reports.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_progressive_disclosure.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_provider_driven_strategy.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_push_notification_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_qdrant_vector_store.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_refresh_backlinks_extension.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_refresh_runtime_and_run_lock.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_resolve_model_config.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_restore_bad_strategy_config.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_reviewer_policy_configure.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_runtime_task_runner.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s06_chunk_forwarding.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s06_provider_selection.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s13_file_backed_registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s13_task_registry_output.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s19_frequency_policy.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9b1_tool_review.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9b2_task_registry.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9b3_hitl.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9b4_summarize.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9b5_persist.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9c1_pipeline_resume.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_s9c2_restore_state.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_sandbox_exec_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_sandbox_path_mapping.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_sandbox_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_security_hardening.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_self_modifying_env.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_send_message_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_settings_loader.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_level3_resources.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_1.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_2.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_3.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_4_bundled.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_5_fork.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_6_killer.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_phase_10_7_watcher.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_richer_schema.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skill_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_skills_foundation.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_slash_built_in_control.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_slash_built_in_introspection.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_slash_commands.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_slash_md_template.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_sql_stm_session_scope.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_ssh_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_stage10_ask_hitl.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_stage10_hook_wiring.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_stage10_partition_executor.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_stage10_permission_matrix.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_stage19_session_summary.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_state_mutation_wiring.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_state_shared_and_local.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_stm_append_event.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_storage_growth_caps.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_strategy_config_roundtrip.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_streaming_tool_executor.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_structured_output_parser.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_structured_reflection.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_catalog.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_credential_propagation.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_descriptor.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_manifest_compile.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_orchestrator_zero_arg.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_parallel.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_pipeline_lifecycle.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_subagent_type_orchestrator.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_task_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_text_tool_protocol.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_todo_write_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_abc_uplift.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_call_events.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_errors.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_lifecycle_hooks.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_pair_repair.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_plugins.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_provider.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_result_persistence.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_results_end_the_turn.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_search_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_tool_stage_max_concurrency.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_ttft_cache_overhaul.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_ttft_critical_path.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_ttft_warmup_streaming.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_turn_boundary_state.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_validate_manifest.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_vault_map_drill.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_web_fetch_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_web_search_backends.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_web_search_tool.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_workspace.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_workspace_propagation.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_workspace_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_workspace_tools_integration.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_worktree_tools.py +0 -0
- {geny_executor-2.71.0 → geny_executor-2.72.0}/tests/unit/test_write_hook_carries_the_note.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: geny-executor
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.72.0
|
|
4
4
|
Summary: Harness-engineered agent pipeline library — one 21-stage architecture, many model accounts behind one conversation
|
|
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.
|
|
7
|
+
version = "2.72.0"
|
|
8
8
|
description = "Harness-engineered agent pipeline library — one 21-stage architecture, many model accounts behind one conversation"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -148,6 +148,12 @@ def _creds_to_client_kwargs(provider: str, creds: ProviderCredentials) -> Dict[s
|
|
|
148
148
|
kwargs["base_url"] = creds.base_url
|
|
149
149
|
if creds.default_headers is not None:
|
|
150
150
|
kwargs["default_headers"] = dict(creds.default_headers)
|
|
151
|
+
# vLLM's defaults are the safe floor (no tools, no vision) because
|
|
152
|
+
# those depend on the model the server loaded, which only the
|
|
153
|
+
# deployment knows. ``extras["capabilities"]`` is how it says.
|
|
154
|
+
overrides = (creds.extras or {}).get("capabilities")
|
|
155
|
+
if isinstance(overrides, Mapping):
|
|
156
|
+
kwargs["capabilities"] = dict(overrides)
|
|
151
157
|
return kwargs
|
|
152
158
|
|
|
153
159
|
# API providers (anthropic / openai / google)
|
|
@@ -25,8 +25,17 @@ from __future__ import annotations
|
|
|
25
25
|
|
|
26
26
|
import logging
|
|
27
27
|
from abc import ABC, abstractmethod
|
|
28
|
-
from dataclasses import dataclass, field
|
|
29
|
-
from typing import
|
|
28
|
+
from dataclasses import dataclass, field, replace as _dc_replace
|
|
29
|
+
from typing import (
|
|
30
|
+
Any,
|
|
31
|
+
AsyncIterator,
|
|
32
|
+
Awaitable,
|
|
33
|
+
Callable,
|
|
34
|
+
Dict,
|
|
35
|
+
List,
|
|
36
|
+
Mapping,
|
|
37
|
+
Optional,
|
|
38
|
+
)
|
|
30
39
|
|
|
31
40
|
from geny_executor.core.config import ModelConfig
|
|
32
41
|
from geny_executor.core.errors import APIError, ErrorCategory
|
|
@@ -156,6 +165,62 @@ class BaseClient(ABC):
|
|
|
156
165
|
self._default_headers = default_headers
|
|
157
166
|
self._event_sink = event_sink
|
|
158
167
|
|
|
168
|
+
# ── Capability negotiation ──────────────────────────────────────────
|
|
169
|
+
|
|
170
|
+
def configure_capabilities(self, **overrides: Any) -> None:
|
|
171
|
+
"""Amend this INSTANCE's capability flags for the model it reaches.
|
|
172
|
+
|
|
173
|
+
A class declares what its *wire format* can express; only the
|
|
174
|
+
deployment knows what the *served model* actually does. One vLLM
|
|
175
|
+
endpoint runs a tool-calling model and the next one does not; one
|
|
176
|
+
OpenAI-compatible base_url is a laptop's llama.cpp and the next is
|
|
177
|
+
an aggregator fronting frontier models. So the flags are settable
|
|
178
|
+
per instance rather than per class::
|
|
179
|
+
|
|
180
|
+
client.configure_capabilities(supports_tools=True,
|
|
181
|
+
supports_tool_choice=True)
|
|
182
|
+
|
|
183
|
+
``capabilities.drops`` is read against these upgraded flags (see
|
|
184
|
+
:meth:`_apply_declared_drops`), so an upgrade really does let the
|
|
185
|
+
field reach the server — the drops tuple needs no rewriting.
|
|
186
|
+
"""
|
|
187
|
+
# type-ignore: dataclasses.replace stubs cannot type heterogeneous
|
|
188
|
+
# **kwargs against the per-field types; the dataclass validates at
|
|
189
|
+
# construction.
|
|
190
|
+
self.capabilities = _dc_replace(self.capabilities, **overrides) # type: ignore[arg-type]
|
|
191
|
+
|
|
192
|
+
def apply_capability_overrides(self, overrides: Optional[Mapping[str, Any]]) -> None:
|
|
193
|
+
"""Apply a HOST-supplied capability declaration, ignoring unknowns.
|
|
194
|
+
|
|
195
|
+
Separate from :meth:`configure_capabilities` because the input is
|
|
196
|
+
untrusted: it arrives from an account row or a manifest, where a
|
|
197
|
+
typo or a flag from a newer library version must not take down the
|
|
198
|
+
turn. Unknown keys are dropped with a log line instead of raising.
|
|
199
|
+
"""
|
|
200
|
+
if not overrides:
|
|
201
|
+
return
|
|
202
|
+
known: Dict[str, Any] = {}
|
|
203
|
+
unknown: List[str] = []
|
|
204
|
+
for key, value in overrides.items():
|
|
205
|
+
if not hasattr(self.capabilities, key):
|
|
206
|
+
unknown.append(str(key))
|
|
207
|
+
continue
|
|
208
|
+
# Coerce against the CURRENT value's type, not a hard-coded
|
|
209
|
+
# field list: the flags are overwhelmingly booleans (and a JSON
|
|
210
|
+
# account row spells one "true"/1), while ``streaming_granularity``
|
|
211
|
+
# and ``drops`` are not — and a new non-bool field must not start
|
|
212
|
+
# silently arriving as ``True``.
|
|
213
|
+
current = getattr(self.capabilities, key)
|
|
214
|
+
known[key] = bool(value) if isinstance(current, bool) else value
|
|
215
|
+
if unknown:
|
|
216
|
+
logger.warning(
|
|
217
|
+
"%s: ignoring unknown capability override(s): %s",
|
|
218
|
+
self.provider or type(self).__name__,
|
|
219
|
+
", ".join(sorted(unknown)),
|
|
220
|
+
)
|
|
221
|
+
if known:
|
|
222
|
+
self.configure_capabilities(**known)
|
|
223
|
+
|
|
159
224
|
# ── High-level surface used by stages ───────────────────────────────
|
|
160
225
|
|
|
161
226
|
async def create_message(
|
|
@@ -290,6 +355,12 @@ class BaseClient(ABC):
|
|
|
290
355
|
return request
|
|
291
356
|
|
|
292
357
|
# ── images a backend cannot see ──────────────────────────────────
|
|
358
|
+
|
|
359
|
+
#: What a lowered image leaves behind. A sentence, not an empty slot:
|
|
360
|
+
#: the model has to be able to tell "there was a picture I cannot see"
|
|
361
|
+
#: from "there was nothing here".
|
|
362
|
+
_IMAGE_PLACEHOLDER = "[an image was attached here; this model cannot see images]"
|
|
363
|
+
|
|
293
364
|
def _lower_unseeable_images(self, request: APIRequest) -> None:
|
|
294
365
|
"""Replace image blocks this client cannot see with a note saying so.
|
|
295
366
|
|
|
@@ -305,39 +376,67 @@ class BaseClient(ABC):
|
|
|
305
376
|
* say an image was here and could not be shown, which is what this
|
|
306
377
|
does, alongside a ``llm_client.field_dropped`` event so the host
|
|
307
378
|
can say so too.
|
|
379
|
+
|
|
380
|
+
Two places carry images and they are gated separately: a block on
|
|
381
|
+
the message itself (the user attached it) and a block nested inside
|
|
382
|
+
a ``tool_result`` (a tool returned it — a screenshot, a rendered
|
|
383
|
+
chart). Some backends take the first and reject the second, so
|
|
384
|
+
``supports_vision_tool_results`` decides the nested ones.
|
|
308
385
|
"""
|
|
309
386
|
caps = self.capabilities
|
|
310
387
|
if caps.supports_vision and caps.supports_vision_tool_results:
|
|
311
388
|
return
|
|
312
|
-
|
|
389
|
+
tool_results_ok = caps.supports_vision and caps.supports_vision_tool_results
|
|
390
|
+
|
|
391
|
+
# Copy-on-write, all the way down. ``request.messages`` is a SHALLOW
|
|
392
|
+
# copy of the caller's list, so editing a block in place would edit
|
|
393
|
+
# the pipeline's canonical history — and one turn on a text-only hop
|
|
394
|
+
# would destroy the image for every later turn, including the ones on
|
|
395
|
+
# a model that could have seen it. The degradation ends with this
|
|
396
|
+
# request.
|
|
313
397
|
lowered = 0
|
|
314
|
-
for message in request.messages:
|
|
398
|
+
for position, message in enumerate(request.messages):
|
|
315
399
|
content = message.get("content")
|
|
316
400
|
if not isinstance(content, list):
|
|
317
401
|
continue
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
)
|
|
321
|
-
allowed = (
|
|
322
|
-
caps.supports_vision and caps.supports_vision_tool_results
|
|
323
|
-
if in_tool_result
|
|
324
|
-
else caps.supports_vision
|
|
325
|
-
)
|
|
326
|
-
if allowed:
|
|
327
|
-
continue
|
|
328
|
-
replaced: list[Any] = []
|
|
402
|
+
replaced: List[Any] = []
|
|
403
|
+
changed = False
|
|
329
404
|
for block in content:
|
|
330
|
-
if isinstance(block, dict)
|
|
405
|
+
if not isinstance(block, dict):
|
|
406
|
+
replaced.append(block)
|
|
407
|
+
continue
|
|
408
|
+
btype = block.get("type")
|
|
409
|
+
if btype == "image" and not caps.supports_vision:
|
|
410
|
+
replaced.append({"type": "text", "text": self._IMAGE_PLACEHOLDER})
|
|
331
411
|
lowered += 1
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
412
|
+
changed = True
|
|
413
|
+
elif btype == "tool_result" and not tool_results_ok:
|
|
414
|
+
inner = block.get("content")
|
|
415
|
+
if not isinstance(inner, list):
|
|
416
|
+
replaced.append(block)
|
|
417
|
+
continue
|
|
418
|
+
# An image a TOOL returned lives one level down, inside
|
|
419
|
+
# the tool_result's own content list — which is why the
|
|
420
|
+
# top-level scan alone would have found nothing to lower
|
|
421
|
+
# on exactly the turn that needed it (a screenshot).
|
|
422
|
+
inner_replaced: List[Any] = []
|
|
423
|
+
inner_changed = False
|
|
424
|
+
for inner_block in inner:
|
|
425
|
+
if isinstance(inner_block, dict) and inner_block.get("type") == "image":
|
|
426
|
+
inner_replaced.append({"type": "text", "text": self._IMAGE_PLACEHOLDER})
|
|
427
|
+
lowered += 1
|
|
428
|
+
inner_changed = True
|
|
429
|
+
else:
|
|
430
|
+
inner_replaced.append(inner_block)
|
|
431
|
+
if inner_changed:
|
|
432
|
+
replaced.append({**block, "content": inner_replaced})
|
|
433
|
+
changed = True
|
|
434
|
+
else:
|
|
435
|
+
replaced.append(block)
|
|
338
436
|
else:
|
|
339
437
|
replaced.append(block)
|
|
340
|
-
|
|
438
|
+
if changed:
|
|
439
|
+
request.messages[position] = {**message, "content": replaced}
|
|
341
440
|
|
|
342
441
|
if lowered:
|
|
343
442
|
self._emit_unsupported("image")
|
{geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/openai_compatible.py
RENAMED
|
@@ -24,8 +24,7 @@ from __future__ import annotations
|
|
|
24
24
|
import json
|
|
25
25
|
import logging
|
|
26
26
|
import re
|
|
27
|
-
from
|
|
28
|
-
from typing import Any, Dict, Optional
|
|
27
|
+
from typing import Any, Dict, Mapping, Optional
|
|
29
28
|
|
|
30
29
|
from geny_executor.llm_client.openai import OpenAIClient
|
|
31
30
|
from geny_executor.llm_client.profiles import (
|
|
@@ -108,6 +107,7 @@ class OpenAICompatibleClient(OpenAIClient):
|
|
|
108
107
|
event_sink: Optional[Any] = None,
|
|
109
108
|
num_ctx: Optional[int] = None,
|
|
110
109
|
think: Optional[bool] = None,
|
|
110
|
+
capabilities: Optional[Mapping[str, Any]] = None,
|
|
111
111
|
) -> None:
|
|
112
112
|
profile = self._profile
|
|
113
113
|
resolved_base_url = base_url or profile.default_base_url
|
|
@@ -126,23 +126,13 @@ class OpenAICompatibleClient(OpenAIClient):
|
|
|
126
126
|
)
|
|
127
127
|
self._num_ctx = num_ctx
|
|
128
128
|
self._think = think
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
supports_tool_choice=False)
|
|
137
|
-
|
|
138
|
-
``capabilities.drops`` is interpreted against the upgraded flags
|
|
139
|
-
(see ``BaseClient._apply_declared_drops``), so toggling
|
|
140
|
-
``supports_tools`` really does gate whether ``tools`` reach the
|
|
141
|
-
server — no need to rewrite the drops tuple here.
|
|
142
|
-
"""
|
|
143
|
-
# type-ignore: dataclasses.replace stubs can't type heterogeneous
|
|
144
|
-
# **kwargs; the dataclass validates values at construction.
|
|
145
|
-
self.capabilities = replace(self.capabilities, **overrides) # type: ignore[arg-type]
|
|
129
|
+
# What one OpenAI-compatible endpoint can do is not what another can:
|
|
130
|
+
# this class serves a keyless llama.cpp on a laptop AND a cloud
|
|
131
|
+
# aggregator routing to frontier models. Vision, tools and structured
|
|
132
|
+
# output are properties of the SERVED MODEL, so the account that knows
|
|
133
|
+
# which endpoint this is gets to say (see
|
|
134
|
+
# ``BaseClient.apply_capability_overrides``).
|
|
135
|
+
self.apply_capability_overrides(capabilities)
|
|
146
136
|
|
|
147
137
|
def _parse_tool_arguments(self, raw: Any) -> Any:
|
|
148
138
|
"""Strict parse, then repair the malformed JSON local servers emit.
|
|
@@ -205,6 +205,9 @@ def profiled_client_kwargs(name: str, creds: Any) -> Dict[str, Any]:
|
|
|
205
205
|
the requested context window.
|
|
206
206
|
* ``think`` — from ``extras["think"]``; becomes ``extra_body.think``
|
|
207
207
|
(Ollama's native reasoning toggle).
|
|
208
|
+
* ``capabilities`` — from ``extras["capabilities"]``; capability flags
|
|
209
|
+
the ACCOUNT declares about its endpoint (vision above all), because
|
|
210
|
+
one class serves both a laptop's llama.cpp and a cloud aggregator.
|
|
208
211
|
|
|
209
212
|
Pure: imports nothing from the SDK path. ``creds`` is a
|
|
210
213
|
``ProviderCredentials`` (typed ``Any`` to avoid a circular import).
|
|
@@ -224,6 +227,13 @@ def profiled_client_kwargs(name: str, creds: Any) -> Dict[str, Any]:
|
|
|
224
227
|
think = extras.get("think")
|
|
225
228
|
if think is not None:
|
|
226
229
|
kwargs["think"] = bool(think)
|
|
230
|
+
overrides = extras.get("capabilities")
|
|
231
|
+
if isinstance(overrides, Mapping):
|
|
232
|
+
# The account's own declaration of what its endpoint serves. An
|
|
233
|
+
# aggregator routing to frontier models can see images; the
|
|
234
|
+
# llama.cpp build on a laptop usually cannot, and only the account
|
|
235
|
+
# knows which one this is.
|
|
236
|
+
kwargs["capabilities"] = dict(overrides)
|
|
227
237
|
return kwargs
|
|
228
238
|
|
|
229
239
|
|
{geny_executor-2.71.0 → geny_executor-2.72.0}/src/geny_executor/llm_client/responses_wire.py
RENAMED
|
@@ -22,6 +22,7 @@ a reasoning agent is not a trade worth making.
|
|
|
22
22
|
from __future__ import annotations
|
|
23
23
|
|
|
24
24
|
import hashlib
|
|
25
|
+
import contextlib
|
|
25
26
|
import json
|
|
26
27
|
import time
|
|
27
28
|
import uuid
|
|
@@ -358,13 +359,14 @@ class ResponsesClient(BaseClient):
|
|
|
358
359
|
continue
|
|
359
360
|
if resp.status_code != 200:
|
|
360
361
|
raw = (await resp.aread()).decode("utf-8", "replace")
|
|
361
|
-
raise self._http_error(resp.status_code, raw)
|
|
362
|
+
raise self._http_error(resp.status_code, raw, resp.headers)
|
|
362
363
|
async for chunk in self._consume(resp, started):
|
|
363
364
|
yield chunk
|
|
364
365
|
return
|
|
365
366
|
|
|
366
|
-
def _http_error(self, status: int, raw: str) -> APIError:
|
|
367
|
+
def _http_error(self, status: int, raw: str, headers: Any = None) -> APIError:
|
|
367
368
|
detail = raw
|
|
369
|
+
retry_after: Optional[float] = None
|
|
368
370
|
try:
|
|
369
371
|
data = json.loads(raw)
|
|
370
372
|
err = data.get("error") if isinstance(data, dict) else None
|
|
@@ -372,6 +374,11 @@ class ResponsesClient(BaseClient):
|
|
|
372
374
|
detail = str(err.get("message") or err.get("code") or raw)
|
|
373
375
|
if err.get("resets_in_seconds"):
|
|
374
376
|
self._notify_host({"kind": "rate_limit", "info": err})
|
|
377
|
+
# …and keep it: this is the provider saying exactly when
|
|
378
|
+
# the account is usable again, which beats benching it
|
|
379
|
+
# for a flat fifteen minutes in both directions.
|
|
380
|
+
with contextlib.suppress(TypeError, ValueError):
|
|
381
|
+
retry_after = float(err["resets_in_seconds"])
|
|
375
382
|
elif isinstance(data, dict) and data.get("detail"):
|
|
376
383
|
detail = str(data["detail"])
|
|
377
384
|
except Exception: # noqa: BLE001 — a non-JSON body is the message
|
|
@@ -380,11 +387,21 @@ class ResponsesClient(BaseClient):
|
|
|
380
387
|
category = classify_text(detail, status)
|
|
381
388
|
if status == 400 and "usage" in detail.lower() and "limit" in detail.lower():
|
|
382
389
|
category = ErrorCategory.RATE_LIMITED
|
|
383
|
-
|
|
390
|
+
if retry_after is None and headers is not None:
|
|
391
|
+
with contextlib.suppress(AttributeError, TypeError, ValueError):
|
|
392
|
+
header = headers.get("retry-after")
|
|
393
|
+
if header is not None:
|
|
394
|
+
retry_after = float(header)
|
|
395
|
+
error = APIError(
|
|
384
396
|
f"{self.label}{label} HTTP {status}: {detail[:600]}",
|
|
385
397
|
category=category,
|
|
386
398
|
status_code=status,
|
|
387
399
|
)
|
|
400
|
+
if retry_after is not None and retry_after > 0:
|
|
401
|
+
# Read by the router to size the bench. Carried on the error
|
|
402
|
+
# rather than only in the text so it survives re-wording.
|
|
403
|
+
error.retry_after = retry_after # type: ignore[attr-defined]
|
|
404
|
+
return error
|
|
388
405
|
|
|
389
406
|
async def _consume(self, resp: httpx.Response, started: float) -> AsyncIterator[Dict[str, Any]]:
|
|
390
407
|
text_parts: list[str] = []
|
|
@@ -32,6 +32,24 @@ from geny_executor.llm_client.types import APIRequest, APIResponse
|
|
|
32
32
|
_CONTENT = {"text_delta", "thinking_delta", "tool_use", "input_json_delta"}
|
|
33
33
|
|
|
34
34
|
|
|
35
|
+
def _retry_fields(exc: BaseException) -> dict[str, Any]:
|
|
36
|
+
"""What the provider said about coming back, off the exception.
|
|
37
|
+
|
|
38
|
+
Clients that get a machine-readable answer — Codex's
|
|
39
|
+
``resets_in_seconds``, a ``Retry-After`` header — attach it here rather
|
|
40
|
+
than only wording it into the message, so re-wording the message cannot
|
|
41
|
+
quietly turn the hint back into a guess.
|
|
42
|
+
"""
|
|
43
|
+
fields: dict[str, Any] = {}
|
|
44
|
+
retry_after = getattr(exc, "retry_after", None)
|
|
45
|
+
if retry_after is not None:
|
|
46
|
+
fields["retry_after"] = retry_after
|
|
47
|
+
reset_at = getattr(exc, "reset_at", None)
|
|
48
|
+
if reset_at is not None:
|
|
49
|
+
fields["reset_at"] = reset_at
|
|
50
|
+
return fields
|
|
51
|
+
|
|
52
|
+
|
|
35
53
|
def _label(target: dict[str, Any]) -> str:
|
|
36
54
|
return f"{target.get('label') or target.get('kind')}·{target.get('model')}"
|
|
37
55
|
|
|
@@ -241,7 +259,7 @@ class RouterClient(BaseClient):
|
|
|
241
259
|
# When the provider says when to come back, believe it. A flat bench
|
|
242
260
|
# is a guess in both directions: too short and the next turn walks
|
|
243
261
|
# into the same wall, too long and a recovered account sits idle.
|
|
244
|
-
until = failover.reset_at_from(detail, fields=
|
|
262
|
+
until = failover.reset_at_from(detail, fields=_retry_fields(exc))
|
|
245
263
|
|
|
246
264
|
provider = str(target.get("engineProvider") or "")
|
|
247
265
|
if (
|
|
@@ -6,14 +6,13 @@ adapter is identical; the differences are:
|
|
|
6
6
|
- ``provider = "vllm"``
|
|
7
7
|
- a required ``base_url`` (no public SaaS endpoint)
|
|
8
8
|
- conservative default capabilities (tool-calling depends on the
|
|
9
|
-
serving model
|
|
10
|
-
|
|
9
|
+
serving model, so the deployment declares it: ``capabilities=`` at
|
|
10
|
+
construction, or :meth:`BaseClient.configure_capabilities` later)
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
13
|
from __future__ import annotations
|
|
14
14
|
|
|
15
|
-
from
|
|
16
|
-
from typing import Any, Dict, Optional
|
|
15
|
+
from typing import Any, Dict, Mapping, Optional
|
|
17
16
|
|
|
18
17
|
from geny_executor.llm_client.base import ClientCapabilities
|
|
19
18
|
from geny_executor.llm_client.openai import OpenAIClient
|
|
@@ -49,6 +48,7 @@ class VLLMClient(OpenAIClient):
|
|
|
49
48
|
base_url: Optional[str] = None,
|
|
50
49
|
default_headers: Optional[Dict[str, str]] = None,
|
|
51
50
|
event_sink: Optional[Any] = None,
|
|
51
|
+
capabilities: Optional[Mapping[str, Any]] = None,
|
|
52
52
|
) -> None:
|
|
53
53
|
if not base_url:
|
|
54
54
|
raise ValueError(
|
|
@@ -61,23 +61,8 @@ class VLLMClient(OpenAIClient):
|
|
|
61
61
|
default_headers=default_headers,
|
|
62
62
|
event_sink=event_sink,
|
|
63
63
|
)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
client = VLLMClient(base_url=...)
|
|
71
|
-
client.configure_capabilities(supports_tools=True, supports_tool_choice=True)
|
|
72
|
-
|
|
73
|
-
The declared ``drops`` tuple is interpreted against the upgraded
|
|
74
|
-
flags: the drop application skips any field whose matching
|
|
75
|
-
``supports_*`` flag is True on the instance (see
|
|
76
|
-
``BaseClient._apply_declared_drops``), so the opt-in above
|
|
77
|
-
really does let ``tools`` / ``tool_choice`` reach the server —
|
|
78
|
-
no need to rewrite ``drops`` here.
|
|
79
|
-
"""
|
|
80
|
-
# type-ignore: dataclasses.replace stubs can't type heterogeneous
|
|
81
|
-
# **kwargs against the per-field types; values are validated by
|
|
82
|
-
# the dataclass itself at construction.
|
|
83
|
-
self.capabilities = replace(self.capabilities, **overrides) # type: ignore[arg-type]
|
|
64
|
+
# What a vLLM server can do is a property of the model it loaded,
|
|
65
|
+
# not of vLLM: the same endpoint class serves a tool-calling
|
|
66
|
+
# Qwen-Coder and a plain text completion model. The defaults above
|
|
67
|
+
# are the safe floor; the deployment that knows better says so.
|
|
68
|
+
self.apply_capability_overrides(capabilities)
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"""One client class, endpoints with nothing in common behind it.
|
|
2
|
+
|
|
3
|
+
``custom`` is how Geny reaches OpenRouter *and* a laptop's llama.cpp; the
|
|
4
|
+
one ``vllm`` class serves a tool-calling Qwen and a plain text model. The
|
|
5
|
+
class has to declare the weakest of them, so whoever configured the endpoint
|
|
6
|
+
gets to amend it — at construction, from the account row.
|
|
7
|
+
|
|
8
|
+
The regression that made this necessary: defaulting ``supports_vision`` to
|
|
9
|
+
False was right for a local server and silently turned every image sent
|
|
10
|
+
through OpenRouter into "[an image was attached here]".
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import pytest
|
|
16
|
+
|
|
17
|
+
from geny_executor.core.pipeline import _creds_to_client_kwargs
|
|
18
|
+
from geny_executor.llm_client.base import BaseClient, ClientCapabilities
|
|
19
|
+
from geny_executor.llm_client.credentials import ProviderCredentials
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class _Probe(BaseClient):
|
|
23
|
+
provider = "probe"
|
|
24
|
+
capabilities = ClientCapabilities(supports_tools=False, drops=("tools",))
|
|
25
|
+
|
|
26
|
+
async def _send(self, request, *, purpose: str = ""): # pragma: no cover
|
|
27
|
+
raise NotImplementedError
|
|
28
|
+
|
|
29
|
+
async def create_message_stream(self, **_kw): # pragma: no cover
|
|
30
|
+
raise NotImplementedError
|
|
31
|
+
yield {}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TestADeclarationFromTheHost:
|
|
35
|
+
def test_a_flag_is_raised(self) -> None:
|
|
36
|
+
client = _Probe()
|
|
37
|
+
client.apply_capability_overrides({"supports_vision": True})
|
|
38
|
+
assert client.capabilities.supports_vision is True
|
|
39
|
+
|
|
40
|
+
def test_a_flag_is_lowered(self) -> None:
|
|
41
|
+
client = _Probe()
|
|
42
|
+
client.apply_capability_overrides({"supports_streaming": False})
|
|
43
|
+
assert client.capabilities.supports_streaming is False
|
|
44
|
+
|
|
45
|
+
def test_json_truthiness_becomes_a_real_boolean(self) -> None:
|
|
46
|
+
"""The declaration arrives from a database row via JSON, where a
|
|
47
|
+
1 and a "true" are both how someone spells yes."""
|
|
48
|
+
client = _Probe()
|
|
49
|
+
client.apply_capability_overrides({"supports_vision": 1})
|
|
50
|
+
assert client.capabilities.supports_vision is True
|
|
51
|
+
|
|
52
|
+
def test_a_non_boolean_field_is_not_coerced(self) -> None:
|
|
53
|
+
client = _Probe()
|
|
54
|
+
client.apply_capability_overrides({"streaming_granularity": "message"})
|
|
55
|
+
assert client.capabilities.streaming_granularity == "message"
|
|
56
|
+
|
|
57
|
+
def test_an_unknown_flag_is_ignored_not_raised(self) -> None:
|
|
58
|
+
"""It comes from config. A typo in a settings page must not take the
|
|
59
|
+
turn down, and a flag from a newer library version must not either."""
|
|
60
|
+
client = _Probe()
|
|
61
|
+
client.apply_capability_overrides({"supports_telepathy": True, "supports_vision": True})
|
|
62
|
+
assert client.capabilities.supports_vision is True
|
|
63
|
+
|
|
64
|
+
def test_nothing_declared_changes_nothing(self) -> None:
|
|
65
|
+
client = _Probe()
|
|
66
|
+
before = client.capabilities
|
|
67
|
+
client.apply_capability_overrides(None)
|
|
68
|
+
client.apply_capability_overrides({})
|
|
69
|
+
assert client.capabilities is before
|
|
70
|
+
|
|
71
|
+
def test_only_this_instance_is_affected(self) -> None:
|
|
72
|
+
"""Two accounts on the same class, one an aggregator and one a local
|
|
73
|
+
box — the second must not inherit the first's declaration."""
|
|
74
|
+
one, two = _Probe(), _Probe()
|
|
75
|
+
one.apply_capability_overrides({"supports_vision": True})
|
|
76
|
+
assert two.capabilities.supports_vision is False
|
|
77
|
+
assert _Probe.capabilities.supports_vision is False
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class TestTheDeclarationBeatsTheDropsTuple:
|
|
81
|
+
"""``drops`` is written against the class's conservative defaults. An
|
|
82
|
+
upgrade that did not also amend the drops would restore the flag and
|
|
83
|
+
still strip the field — the flag would read as a lie."""
|
|
84
|
+
|
|
85
|
+
def test_restoring_tools_really_sends_them(self) -> None:
|
|
86
|
+
from geny_executor.core.config import ModelConfig
|
|
87
|
+
|
|
88
|
+
client = _Probe()
|
|
89
|
+
client.apply_capability_overrides({"supports_tools": True})
|
|
90
|
+
request = client._build_request(
|
|
91
|
+
model_config=ModelConfig(model="m"),
|
|
92
|
+
messages=[{"role": "user", "content": "hi"}],
|
|
93
|
+
system="",
|
|
94
|
+
tools=[{"name": "Read", "input_schema": {}}],
|
|
95
|
+
tool_choice=None,
|
|
96
|
+
stream=False,
|
|
97
|
+
)
|
|
98
|
+
assert request.tools
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class TestVLLM:
|
|
102
|
+
"""A vLLM server is whatever model it loaded — which is why the class
|
|
103
|
+
says no tools and why an account has to be able to say otherwise."""
|
|
104
|
+
|
|
105
|
+
def test_the_class_still_assumes_nothing(self) -> None:
|
|
106
|
+
from geny_executor.llm_client.vllm import VLLMClient
|
|
107
|
+
|
|
108
|
+
assert VLLMClient.capabilities.supports_tools is False
|
|
109
|
+
|
|
110
|
+
def test_a_deployment_can_say_it_calls_tools(self) -> None:
|
|
111
|
+
from geny_executor.llm_client.vllm import VLLMClient
|
|
112
|
+
|
|
113
|
+
client = VLLMClient(
|
|
114
|
+
base_url="http://box:8000/v1",
|
|
115
|
+
capabilities={"supports_tools": True, "supports_tool_choice": True},
|
|
116
|
+
)
|
|
117
|
+
assert client.capabilities.supports_tools is True
|
|
118
|
+
assert client.capabilities.supports_tool_choice is True
|
|
119
|
+
|
|
120
|
+
def test_the_account_declaration_reaches_the_constructor(self) -> None:
|
|
121
|
+
"""The gap this closes: a flag stored on the account that no code
|
|
122
|
+
path carried to the client is a setting that does nothing."""
|
|
123
|
+
kwargs = _creds_to_client_kwargs(
|
|
124
|
+
"vllm",
|
|
125
|
+
ProviderCredentials(
|
|
126
|
+
api_key="k",
|
|
127
|
+
base_url="http://box:8000/v1",
|
|
128
|
+
extras={"capabilities": {"supports_tools": True}},
|
|
129
|
+
),
|
|
130
|
+
)
|
|
131
|
+
assert kwargs["capabilities"] == {"supports_tools": True}
|
|
132
|
+
|
|
133
|
+
def test_an_account_that_declares_nothing_sends_nothing(self) -> None:
|
|
134
|
+
kwargs = _creds_to_client_kwargs(
|
|
135
|
+
"vllm", ProviderCredentials(api_key="k", base_url="http://box:8000/v1")
|
|
136
|
+
)
|
|
137
|
+
assert "capabilities" not in kwargs
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class TestTheOpenAICompatibleFamily:
|
|
141
|
+
@pytest.mark.parametrize("provider", ["custom", "ollama", "lmstudio"])
|
|
142
|
+
def test_the_account_declaration_reaches_the_constructor(self, provider: str) -> None:
|
|
143
|
+
kwargs = _creds_to_client_kwargs(
|
|
144
|
+
provider,
|
|
145
|
+
ProviderCredentials(
|
|
146
|
+
api_key="k",
|
|
147
|
+
base_url="https://openrouter.ai/api/v1",
|
|
148
|
+
extras={"capabilities": {"supports_vision": True}},
|
|
149
|
+
),
|
|
150
|
+
)
|
|
151
|
+
assert kwargs["capabilities"] == {"supports_vision": True}
|
|
152
|
+
|
|
153
|
+
def test_an_aggregator_gets_its_vision_back(self) -> None:
|
|
154
|
+
"""OpenRouter is reached as ``custom``. Without the declaration the
|
|
155
|
+
shared class assumes a text-only local server."""
|
|
156
|
+
from geny_executor.llm_client.openai_compatible import CustomOpenAIClient
|
|
157
|
+
|
|
158
|
+
default = CustomOpenAIClient(base_url="https://openrouter.ai/api/v1")
|
|
159
|
+
declared = CustomOpenAIClient(
|
|
160
|
+
base_url="https://openrouter.ai/api/v1",
|
|
161
|
+
capabilities={"supports_vision": True},
|
|
162
|
+
)
|
|
163
|
+
assert default.capabilities.supports_vision is False
|
|
164
|
+
assert declared.capabilities.supports_vision is True
|
|
165
|
+
|
|
166
|
+
def test_declaring_one_flag_leaves_the_rest_alone(self) -> None:
|
|
167
|
+
from geny_executor.llm_client.openai_compatible import CustomOpenAIClient
|
|
168
|
+
|
|
169
|
+
client = CustomOpenAIClient(
|
|
170
|
+
base_url="http://box:8080/v1", capabilities={"supports_vision": True}
|
|
171
|
+
)
|
|
172
|
+
assert client.capabilities.supports_tools is True
|
|
173
|
+
assert client.capabilities.supports_structured_output is True
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class TestEveryCapabilityAwareClientTakesTheKwarg:
|
|
177
|
+
"""Geny names these providers as the ones it may declare for. A client
|
|
178
|
+
that lost the parameter would fail only on a live turn."""
|
|
179
|
+
|
|
180
|
+
@pytest.mark.parametrize("provider", ["custom", "local", "ollama", "lmstudio", "vllm"])
|
|
181
|
+
def test_the_constructor_accepts_it(self, provider: str) -> None:
|
|
182
|
+
import inspect
|
|
183
|
+
|
|
184
|
+
from geny_executor.llm_client.registry import ClientRegistry
|
|
185
|
+
|
|
186
|
+
params = inspect.signature(ClientRegistry.get(provider).__init__).parameters
|
|
187
|
+
assert "capabilities" in params
|