geny-executor 2.4.1__tar.gz → 2.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {geny_executor-2.4.1 → geny_executor-2.5.0}/PKG-INFO +1 -1
- {geny_executor-2.4.1 → geny_executor-2.5.0}/pyproject.toml +1 -1
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/__init__.py +0 -1
- geny_executor-2.5.0/src/geny_executor/core/compaction.py +120 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/manifest_factory.py +2 -6
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/pipeline.py +20 -0
- geny_executor-2.5.0/src/geny_executor/core/token_estimate.py +87 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/events/catalog.py +21 -1
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/provider.py +48 -1
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/artifact/default/stage.py +12 -8
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/interface.py +8 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/artifact/default/guards.py +34 -7
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/artifact/default/stage.py +87 -7
- geny_executor-2.5.0/src/geny_executor/stages/s04_guard/types.py +20 -0
- geny_executor-2.5.0/tests/unit/test_budget_compaction_recovery.py +339 -0
- geny_executor-2.4.1/src/geny_executor/stages/s04_guard/types.py +0 -15
- {geny_executor-2.4.1 → geny_executor-2.5.0}/.gitignore +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/LICENSE +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/README.md +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/README_ko.md +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/channels/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/channels/send_message_channel.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/channels/user_file_channel.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/artifact.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/builder.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/config.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/diff.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/environment.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/errors.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/introspection.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/mutation.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/presets.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/result.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/schema.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/shared_keys.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/slot.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/snapshot.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/core/state.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/runner.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/store_abc.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/store_impl/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/store_impl/file_backed.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/store_impl/in_memory.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/cron/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/events/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/events/bus.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/events/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/ab_test.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/cost.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/models.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/monitor.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/replay.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/history/service.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/hooks/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/hooks/config.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/hooks/events.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/hooks/runner.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/_cli_runtime.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/anthropic.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/base.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/claude_code.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/credentials.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/google.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/openai.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/registry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/translators/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/translators/_canonical.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/translators/_cli.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/llm_client/vllm.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/_locks.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/_progressive.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/composite/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/composite/handles.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/composite/provider.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/composite/routing.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/composite/snapshot.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/client.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/google.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/local.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/openai.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/registry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/embedding/voyage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/factory.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/presets.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/provider.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/ephemeral.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/config.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/frontmatter.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/index_store.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/layout.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/ltm_store.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/notes_store.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/snapshot.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/stm_store.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/timezone.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/vector_store.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/config.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/connection.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/index_store.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/ltm_store.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/notes_store.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/provider.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/schema.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/snapshot.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/stm_store.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/sql/vector_store.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/retriever.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/strategy.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/notifications/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/notifications/registry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/permission/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/permission/loader.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/permission/matrix.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/permission/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/py.typed +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/runtime/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/runtime/task_executors.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/runtime/task_runner.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/security/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/security/import_validator.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/security/script_sandbox.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/session/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/session/freshness.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/session/manager.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/session/persistence.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/session/session.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/settings/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/settings/loader.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/settings/section_registry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/batch/SKILL.md +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/debug/SKILL.md +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/loop/SKILL.md +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/lorem-ipsum/SKILL.md +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/simplify/SKILL.md +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/skillify/SKILL.md +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/stuck/SKILL.md +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled/verify/SKILL.md +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/bundled_skills.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/fork.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/frontmatter.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/loader.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/mcp_bridge.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/path_match.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/registry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/shell_blocks.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/skill_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/skills/watcher.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/_helpers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/cancel.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/clear.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/compact.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/config.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/context.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/cost.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/help.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/memory.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/model.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/preset_info.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/status.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/built_in/tasks.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/md_template.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/parser.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/registry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/slash_commands/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/artifact/default/normalizers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/artifact/default/validators.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/normalizers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s01_input/validators.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/artifact/default/compactors.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/artifact/default/retrievers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/artifact/default/strategies.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/compactors.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/retrievers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/strategies.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/artifact/default/builders.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/builders.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/persona/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/persona/builder.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/persona/provider.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s03_system/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/guards.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s04_guard/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/artifact/default/strategies.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s05_cache/strategies.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/_translate.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/default/providers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/default/retry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/default/router.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/default/tool_loop.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/google/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/google/providers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/openai/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/artifact/openai/providers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/providers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/retry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s06_api/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/artifact/default/pricing.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/artifact/default/trackers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/pricing.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s07_token/trackers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/artifact/default/budget.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/artifact/default/processors.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/processors.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s08_think/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/artifact/default/parsers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/artifact/default/signals.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/parsers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/signals.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s09_parse/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/artifact/default/executors.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/artifact/default/routers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/dispatcher.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/executors.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/persistence.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/routers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/state_mutation.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s10_tool/streaming.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s11_tool_review/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s11_tool_review/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s11_tool_review/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s11_tool_review/artifact/default/reviewers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s11_tool_review/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s11_tool_review/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/artifact/default/orchestrators.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/orchestrators.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/subagent_type.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s12_agent/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/artifact/default/file_backed_registry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/artifact/default/policies.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/artifact/default/registry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s13_task_registry/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/artifact/adaptive/strategy.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/artifact/default/strategies.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/strategies.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s14_evaluate/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/artifact/default/requesters.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/artifact/default/timeouts.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s15_hitl/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/artifact/default/controllers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/controllers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s16_loop/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/artifact/default/emitters.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/emitters.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s17_emit/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/_dehydrate.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/artifact/default/persistence.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/artifact/default/strategies.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/insight.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/persistence.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s18_memory/strategies.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/artifact/default/importance.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/artifact/default/summarizers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/frequency_policy.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s19_summarize/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/artifact/default/frequencies.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/artifact/default/persisters.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/restore.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s20_persist/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/artifact/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/artifact/default/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/artifact/default/formatters.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/artifact/default/multi_format.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/artifact/default/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/formatters.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/interface.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s21_yield/stage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/adhoc.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/base.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/_path_guard.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/agent_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/ask_user_question_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/bash_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/cron_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/dev_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/edit_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/glob_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/grep_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/mcp_wrapper_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/notebook_edit_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/operator_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/plan_mode_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/push_notification_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/read_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/send_message_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/task_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/todo_write_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/tool_search_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/web_fetch_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/web_search_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/worktree_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/built_in/write_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/composer.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/errors.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/adapter.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/credentials.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/errors.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/manager.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/oauth.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/state.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/mcp/uri.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/provider.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/providers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/registry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/sandbox.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/scope.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/tools/stage_binding.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/workspace/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/workspace/stack.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/workspace/types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/_fixtures/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/_fixtures/fake_claude.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/_fixtures/fake_echo_cli.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/_fixtures/geny_manifest_layout.json +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/_fixtures/manifest_entries.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/conftest.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/fixtures/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/fixtures/adapter/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/fixtures/adapter/adapter.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c1_six_layer_retrieval.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c2_execution_recording.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c3_reflection_and_promotion.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c4_rest_coverage.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c5_embedding_migration.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c6_session_resume.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_c7_adapter_parity.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/completeness/test_spec_loads.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/memory_provider_contract.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_embedding_clients.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_error_codes_stability.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_embedding_credentials.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_auto_vector.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_composite.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_composite_routing.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_curated_global.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_ephemeral.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_factory.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_file.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_file_layout.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_file_vector.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_sql.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_sql_dialect.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_sql_schema.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_provider_sql_vector.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_memory_vector_breaker.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/contract/test_stage_uniformity.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/integration/test_cycle_ab_cross_import.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/integration/test_integration.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/harness.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/test_anthropic.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/test_claude_code_cli.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/test_google.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/test_openai.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/conformance/test_vllm.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/cli-2.1.149-json.json +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/cli-2.1.149-json.meta +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/cli-2.1.149-stream.jsonl +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/cli-2.1.149-stream.meta +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/cli-2.1.162-stream.jsonl +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/cli-2.1.162-stream.meta +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/golden/test_golden_replay.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/live/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/live/test_live_canaries.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_anthropic_build_kwargs.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_anthropic_classify.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_base_client.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_claude_code.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_cli_cancellation.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_cli_event_forwarding.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_cli_runtime.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_credentials.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_google_classify.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_openai_client.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/llm_client/unit/test_translators_cli_claude_code.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/__init__.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_adaptive_model_router.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_adaptive_router_configure.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_adaptive_thinking_budget.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_adhoc_providers.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_agent_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_api_timeout_kwarg.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_artifact_metadata.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_ask_user_question_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_attach_llm_client_guard.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_binary_classify_manifest.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_built_in_autoregister.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_builtin_capabilities.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_builtin_features.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_cache_prefix_key.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_cancellation.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_cli_mcp_passthrough.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_composite_set_hooks.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_concurrent_runs.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_config_liveness.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_cron_runner.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_cron_store.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_cron_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_dev_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_diff_order_keyed.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_dynamic_persona_builder.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_embedding_error_classification.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_errors_categories.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_evaluation_chain.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_evaluation_chain_configure.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_event_catalog.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_event_channel_unification.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_event_correlation.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_external_tool_resolution.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_fork_multi_provider.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_from_manifest_strict_validation.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_geny_prod_manifest_repro.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_guard_fail_fast.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_hierarchical_sidecars.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_hook_gate_split.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_hook_in_process.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_hook_runner.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_hook_taxonomy.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_hooks_and_shared_keys.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_host_selections_resolve.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_index_list_categories.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_index_render_vault_map.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_interaction_fields.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_internal_agentic_loop.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_introspection.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_llm_client_base.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_llm_client_capabilities.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_llm_client_registry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_llm_client_request_types.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_llm_client_state.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_llm_summary_compactor.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_loop_agnostic_lock.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_factory.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_from_dict_hygiene.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_memory_wiring.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_provider_validation.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_subagents_memory_sections.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_v2.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_manifest_v3_migration.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_annotations_attach.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_credential_store.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_fsm.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_lifecycle.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_namespace.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_oauth.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_prompts_skills_bridge.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_resource_retriever.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_uri.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_mcp_wrapper_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_memory_aware_retriever.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_memory_hooks_after_callbacks.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_memory_metadata_extension.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_model_overrides.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_multi_dim_budget_configure.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_multi_dim_budget_controller.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_multi_format_yield.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_multi_provider.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_multimodal.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_note_graph_queries.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_notebook_edit_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_notes_load_pinned.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_operator_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_ordered_emitter_chain.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_permission_matrix.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_permission_mode_promotions.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_permission_posture.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase1_foundation.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase1_pipeline.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase2_agent_loop.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase2_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase3_context_memory.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase4_think_agent_evaluate.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase5_emit_presets_mcp.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase5_environment.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase6_history.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase6_integration.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase7_security.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase9a_preset_regen.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_phase9a_scaffolding.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_pipeline_aclose.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_pipeline_attach_runtime.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_pipeline_events_tap.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_pipeline_from_manifest.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_pipeline_hook_lifecycle.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_pipeline_session_runtime.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_plan_mode_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_primary_provider_and_build_reports.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_progressive_disclosure.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_provider_driven_strategy.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_push_notification_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_refresh_backlinks_extension.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_refresh_runtime_and_run_lock.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_resolve_model_config.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_restore_bad_strategy_config.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_reviewer_policy_configure.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_runtime_task_runner.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s06_chunk_forwarding.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s06_provider_selection.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s13_file_backed_registry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s13_task_registry_output.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s19_frequency_policy.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9b1_tool_review.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9b2_task_registry.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9b3_hitl.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9b4_summarize.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9b5_persist.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9c1_pipeline_resume.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_s9c2_restore_state.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_send_message_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_settings_loader.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_1.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_2.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_3.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_4_bundled.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_5_fork.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_6_killer.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_phase_10_7_watcher.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_richer_schema.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skill_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_skills_foundation.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_slash_built_in_control.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_slash_built_in_introspection.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_slash_commands.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_slash_md_template.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_stage10_ask_hitl.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_stage10_hook_wiring.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_stage10_partition_executor.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_stage10_permission_matrix.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_stage19_session_summary.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_state_mutation_wiring.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_state_shared_and_local.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_stm_append_event.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_strategy_config_roundtrip.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_streaming_tool_executor.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_structured_output_parser.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_structured_reflection.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_credential_propagation.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_descriptor.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_manifest_compile.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_orchestrator_zero_arg.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_parallel.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_pipeline_lifecycle.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_subagent_type_orchestrator.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_task_tools.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_todo_write_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_abc_uplift.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_call_events.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_errors.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_lifecycle_hooks.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_provider.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_result_persistence.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_search_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_tool_stage_max_concurrency.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_turn_boundary_state.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_validate_manifest.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_web_fetch_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_web_search_tool.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_workspace.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_workspace_propagation.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_workspace_tools_integration.py +0 -0
- {geny_executor-2.4.1 → geny_executor-2.5.0}/tests/unit/test_worktree_tools.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: geny-executor
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.0
|
|
4
4
|
Summary: Harness-engineered agent pipeline library with 21-stage dual-abstraction architecture, built on the Anthropic API
|
|
5
5
|
Project-URL: Homepage, https://github.com/CocoRoF/geny-executor
|
|
6
6
|
Project-URL: Repository, https://github.com/CocoRoF/geny-executor
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "geny-executor"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.5.0"
|
|
8
8
|
description = "Harness-engineered agent pipeline library with 21-stage dual-abstraction architecture, built on the Anthropic API"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -126,7 +126,6 @@ from geny_executor.stages.s12_agent.subagent_type import (
|
|
|
126
126
|
# Single source of truth: read the installed distribution version so
|
|
127
127
|
# ``__version__`` can never drift from ``pyproject.toml`` again.
|
|
128
128
|
try:
|
|
129
|
-
from importlib.metadata import PackageNotFoundError as _PkgNotFound
|
|
130
129
|
from importlib.metadata import version as _pkg_version
|
|
131
130
|
|
|
132
131
|
__version__ = _pkg_version("geny-executor")
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"""Shared compaction runner — one place that runs a compactor, emits a
|
|
2
|
+
uniform event, and persists the snapshot to a memory provider.
|
|
3
|
+
|
|
4
|
+
Both the Stage 2 proactive trigger (context near 80%) and the Stage 4
|
|
5
|
+
reactive token-budget guard (context near the hard ceiling) compact the
|
|
6
|
+
SAME ``state.messages`` with the SAME compactor instance. Centralising
|
|
7
|
+
"compact + record" here guarantees they log and persist identically, and
|
|
8
|
+
that the snapshot is never written twice (a host wrapper that records its
|
|
9
|
+
own snapshot sets ``compactor.persists_own_compaction = True``).
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from typing import Any, Optional
|
|
16
|
+
|
|
17
|
+
from geny_executor.core.state import PipelineState
|
|
18
|
+
from geny_executor.core.token_estimate import estimate_prompt_tokens
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _compactor_name(compactor: Any) -> str:
|
|
24
|
+
return str(getattr(compactor, "name", None) or type(compactor).__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _summary_text(state: PipelineState) -> str:
|
|
28
|
+
"""Best-effort extraction of the summary a compactor placed at the head."""
|
|
29
|
+
msgs = state.messages or []
|
|
30
|
+
if not msgs:
|
|
31
|
+
return ""
|
|
32
|
+
head = msgs[0]
|
|
33
|
+
if not isinstance(head, dict):
|
|
34
|
+
return ""
|
|
35
|
+
content = head.get("content", "")
|
|
36
|
+
if isinstance(content, str):
|
|
37
|
+
return content
|
|
38
|
+
if isinstance(content, list):
|
|
39
|
+
parts = [
|
|
40
|
+
b.get("text", "") for b in content if isinstance(b, dict) and b.get("type") == "text"
|
|
41
|
+
]
|
|
42
|
+
return "\n".join(p for p in parts if p)
|
|
43
|
+
return ""
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
async def run_compaction(
|
|
47
|
+
state: PipelineState,
|
|
48
|
+
compactor: Any,
|
|
49
|
+
*,
|
|
50
|
+
trigger: str,
|
|
51
|
+
provider: Optional[Any] = None,
|
|
52
|
+
) -> dict:
|
|
53
|
+
"""Run ``compactor`` against ``state`` and return a result summary dict.
|
|
54
|
+
|
|
55
|
+
Emits a ``context.compacted`` event carrying ``trigger`` ("proactive"
|
|
56
|
+
from Stage 2, "guard" from Stage 4) and, when a provider exposes
|
|
57
|
+
``record_compaction`` and the compactor does not persist its own
|
|
58
|
+
snapshot, records the snapshot to the provider's "compactions"
|
|
59
|
+
category. Never raises — compaction is best-effort relief, not a
|
|
60
|
+
correctness gate; failures are logged as events and swallowed.
|
|
61
|
+
"""
|
|
62
|
+
before_msgs = len(state.messages or [])
|
|
63
|
+
before_tokens = estimate_prompt_tokens(state)
|
|
64
|
+
|
|
65
|
+
try:
|
|
66
|
+
await compactor.compact(state)
|
|
67
|
+
except Exception as exc: # noqa: BLE001 — best effort
|
|
68
|
+
state.add_event(
|
|
69
|
+
"context.compaction_failed",
|
|
70
|
+
{"compactor": _compactor_name(compactor), "trigger": trigger, "error": str(exc)},
|
|
71
|
+
)
|
|
72
|
+
logger.warning("Compaction (%s) failed: %s", trigger, exc)
|
|
73
|
+
return {"ok": False, "before_messages": before_msgs, "after_messages": before_msgs}
|
|
74
|
+
|
|
75
|
+
after_msgs = len(state.messages or [])
|
|
76
|
+
after_tokens = estimate_prompt_tokens(state)
|
|
77
|
+
replaced = max(0, before_msgs - after_msgs)
|
|
78
|
+
saved_tokens = max(0, before_tokens - after_tokens)
|
|
79
|
+
|
|
80
|
+
state.add_event(
|
|
81
|
+
"context.compacted",
|
|
82
|
+
{
|
|
83
|
+
"strategy": _compactor_name(compactor),
|
|
84
|
+
"trigger": trigger,
|
|
85
|
+
"messages_before": before_msgs,
|
|
86
|
+
"messages_after": after_msgs,
|
|
87
|
+
"saved_tokens_estimate": saved_tokens,
|
|
88
|
+
},
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Persist the snapshot unless the compactor already does it itself.
|
|
92
|
+
if (
|
|
93
|
+
replaced > 0
|
|
94
|
+
and provider is not None
|
|
95
|
+
and not getattr(compactor, "persists_own_compaction", False)
|
|
96
|
+
and hasattr(provider, "record_compaction")
|
|
97
|
+
):
|
|
98
|
+
try:
|
|
99
|
+
await provider.record_compaction(
|
|
100
|
+
_summary_text(state),
|
|
101
|
+
replaced_count=replaced,
|
|
102
|
+
strategy=_compactor_name(compactor),
|
|
103
|
+
saved_tokens=saved_tokens,
|
|
104
|
+
session_id=getattr(state, "session_id", "") or "",
|
|
105
|
+
trigger=trigger,
|
|
106
|
+
)
|
|
107
|
+
except Exception as exc: # noqa: BLE001 — best effort
|
|
108
|
+
state.add_event(
|
|
109
|
+
"context.compaction_record_failed",
|
|
110
|
+
{"compactor": _compactor_name(compactor), "error": str(exc)},
|
|
111
|
+
)
|
|
112
|
+
logger.debug("record_compaction failed: %s", exc)
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
"ok": True,
|
|
116
|
+
"before_messages": before_msgs,
|
|
117
|
+
"after_messages": after_msgs,
|
|
118
|
+
"replaced": replaced,
|
|
119
|
+
"saved_tokens_estimate": saved_tokens,
|
|
120
|
+
}
|
|
@@ -798,14 +798,10 @@ def build_manifest_for(
|
|
|
798
798
|
if not provider:
|
|
799
799
|
raise ValueError(f"preset {key!r} requires an explicit provider=")
|
|
800
800
|
return build_manifest(key, provider=provider, **kwargs)
|
|
801
|
-
raise ValueError(
|
|
802
|
-
f"unknown preset key {key!r}. Catalog: {[d.key for d in _PRESET_CATALOG]}"
|
|
803
|
-
)
|
|
801
|
+
raise ValueError(f"unknown preset key {key!r}. Catalog: {[d.key for d in _PRESET_CATALOG]}")
|
|
804
802
|
eff_provider = provider or desc.provider
|
|
805
803
|
if not eff_provider:
|
|
806
|
-
raise ValueError(
|
|
807
|
-
f"preset {key!r} has no recommended provider; pass provider= explicitly."
|
|
808
|
-
)
|
|
804
|
+
raise ValueError(f"preset {key!r} has no recommended provider; pass provider= explicitly.")
|
|
809
805
|
kwargs.setdefault("name", desc.name)
|
|
810
806
|
kwargs.setdefault("description", desc.description)
|
|
811
807
|
return build_manifest(desc.base_preset, provider=eff_provider, **kwargs)
|
|
@@ -2672,6 +2672,26 @@ class Pipeline:
|
|
|
2672
2672
|
else:
|
|
2673
2673
|
state.tool_dispatcher = None
|
|
2674
2674
|
|
|
2675
|
+
# Budget-recovery auto-wire (2.5.0): give the Guard stage the same
|
|
2676
|
+
# compactor the Context stage uses so a ``compact`` guard signal
|
|
2677
|
+
# (token-budget pressure) can shrink history and re-check instead
|
|
2678
|
+
# of hard-rejecting. Re-synced each turn so a host that swaps the
|
|
2679
|
+
# Context compactor (e.g. an LLM-backed one) is picked up — unless
|
|
2680
|
+
# the host wired recovery explicitly via attach_budget_recovery.
|
|
2681
|
+
guard_stage = self._stages.get(4)
|
|
2682
|
+
context_stage = self._stages.get(2)
|
|
2683
|
+
if (
|
|
2684
|
+
guard_stage is not None
|
|
2685
|
+
and context_stage is not None
|
|
2686
|
+
and hasattr(guard_stage, "attach_budget_recovery")
|
|
2687
|
+
and not getattr(guard_stage, "_budget_recovery_explicit", False)
|
|
2688
|
+
):
|
|
2689
|
+
compactor = getattr(context_stage, "_compactor", None)
|
|
2690
|
+
provider = getattr(context_stage, "_provider", None)
|
|
2691
|
+
if compactor is not None:
|
|
2692
|
+
guard_stage._budget_compactor = compactor
|
|
2693
|
+
guard_stage._memory_provider = provider
|
|
2694
|
+
|
|
2675
2695
|
self._has_started = True
|
|
2676
2696
|
return state
|
|
2677
2697
|
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""Cheap, single-source token estimation for context-budget decisions.
|
|
2
|
+
|
|
3
|
+
The Stage 2 *proactive* compaction trigger and the Stage 4 *reactive*
|
|
4
|
+
token-budget guard must share ONE notion of "how big is the next API
|
|
5
|
+
call" — otherwise compaction (which shrinks ``state.messages``) cannot
|
|
6
|
+
relieve a guard that measures something else. Before 2.5.0 the guard
|
|
7
|
+
read ``state.token_usage`` (session/turn-cumulative usage, which
|
|
8
|
+
compaction never lowers) and compared it against the per-call context
|
|
9
|
+
window, so a long tool-loop turn could trip the guard with no way for
|
|
10
|
+
compaction to help. This module is the shared estimator both stages now
|
|
11
|
+
use against ``state.context_window_budget``.
|
|
12
|
+
|
|
13
|
+
The estimate is deliberately rough (≈4 chars/token, the heuristic Stage 2
|
|
14
|
+
has always used) — it *gates compaction*, it does not bill. Image blocks
|
|
15
|
+
are counted at a flat per-image estimate rather than their base64 length:
|
|
16
|
+
a single 1568px screenshot is ~1.6k vision tokens but tens of thousands
|
|
17
|
+
of base64 characters, and counting the characters would trip compaction
|
|
18
|
+
on the first image.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from typing import Any, List, Union
|
|
24
|
+
|
|
25
|
+
# Anthropic vision tokens land roughly here for a typical full-size image.
|
|
26
|
+
# A flat estimate beats counting base64 characters (which over-counts by
|
|
27
|
+
# ~50x and would trip compaction on a single screenshot).
|
|
28
|
+
_IMAGE_TOKEN_ESTIMATE = 1_600
|
|
29
|
+
_CHARS_PER_TOKEN = 4
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _estimate_text(text: str) -> int:
|
|
33
|
+
return len(text) // _CHARS_PER_TOKEN
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _estimate_block(block: Any) -> int:
|
|
37
|
+
"""Estimate one content block (text / image / tool_use / tool_result)."""
|
|
38
|
+
if not isinstance(block, dict):
|
|
39
|
+
return _estimate_text(str(block))
|
|
40
|
+
btype = block.get("type")
|
|
41
|
+
if btype == "image" or "source" in block:
|
|
42
|
+
return _IMAGE_TOKEN_ESTIMATE
|
|
43
|
+
total = 0
|
|
44
|
+
for key in ("text", "content", "input", "thinking"):
|
|
45
|
+
val = block.get(key)
|
|
46
|
+
if isinstance(val, str):
|
|
47
|
+
total += _estimate_text(val)
|
|
48
|
+
elif isinstance(val, list):
|
|
49
|
+
total += sum(_estimate_block(sub) for sub in val)
|
|
50
|
+
elif val is not None:
|
|
51
|
+
total += _estimate_text(str(val))
|
|
52
|
+
return total or _estimate_text(str(block))
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _estimate_content(content: Union[str, List[Any], Any]) -> int:
|
|
56
|
+
if isinstance(content, str):
|
|
57
|
+
return _estimate_text(content)
|
|
58
|
+
if isinstance(content, list):
|
|
59
|
+
return sum(_estimate_block(b) for b in content)
|
|
60
|
+
if content is None:
|
|
61
|
+
return 0
|
|
62
|
+
return _estimate_text(str(content))
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def estimate_message_tokens(messages: List[Any]) -> int:
|
|
66
|
+
"""Rough token estimate of a message list (content only)."""
|
|
67
|
+
return sum(
|
|
68
|
+
_estimate_content(m.get("content", "")) for m in (messages or []) if isinstance(m, dict)
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def estimate_prompt_tokens(state: Any) -> int:
|
|
73
|
+
"""Rough INPUT-token estimate for the next API call.
|
|
74
|
+
|
|
75
|
+
Sums the system prompt, the message list, and the tool schemas —
|
|
76
|
+
everything that travels in the request and therefore counts against
|
|
77
|
+
``state.context_window_budget``. Used identically by the Stage 2
|
|
78
|
+
compaction trigger and the Stage 4 token-budget guard so that
|
|
79
|
+
compacting ``state.messages`` measurably lowers the same number the
|
|
80
|
+
guard checks.
|
|
81
|
+
"""
|
|
82
|
+
total = _estimate_content(getattr(state, "system", "") or "")
|
|
83
|
+
total += estimate_message_tokens(getattr(state, "messages", []) or [])
|
|
84
|
+
tools = getattr(state, "tools", None)
|
|
85
|
+
if tools:
|
|
86
|
+
total += sum(_estimate_text(str(tool)) for tool in tools)
|
|
87
|
+
return total
|
|
@@ -93,6 +93,8 @@ class EventTypes(str, Enum):
|
|
|
93
93
|
# ── Stage 2: Context ──
|
|
94
94
|
CONTEXT_BUILT = "context.built"
|
|
95
95
|
CONTEXT_COMPACTED = "context.compacted"
|
|
96
|
+
CONTEXT_COMPACTION_FAILED = "context.compaction_failed"
|
|
97
|
+
CONTEXT_COMPACTION_RECORD_FAILED = "context.compaction_record_failed"
|
|
96
98
|
MEMORY_COMPACTION_SUMMARIZED = "memory.compaction.summarized"
|
|
97
99
|
MEMORY_COMPACTION_LLM_FAILED = "memory.compaction.llm_failed"
|
|
98
100
|
|
|
@@ -102,6 +104,7 @@ class EventTypes(str, Enum):
|
|
|
102
104
|
# ── Stage 4: Guard ──
|
|
103
105
|
GUARD_CHECK = "guard.check"
|
|
104
106
|
GUARD_WARN = "guard.warn"
|
|
107
|
+
GUARD_COMPACTING = "guard.compacting"
|
|
105
108
|
|
|
106
109
|
# ── Stage 5: Cache ──
|
|
107
110
|
CACHE_APPLIED = "cache.applied"
|
|
@@ -317,7 +320,20 @@ PAYLOADS: Dict[EventTypes, Dict[str, str]] = {
|
|
|
317
320
|
"chunks": "int? — RetrievalResult.to_event form (provider-driven path)",
|
|
318
321
|
},
|
|
319
322
|
EventTypes.CONTEXT_COMPACTED: {
|
|
320
|
-
"strategy": "str — compactor class
|
|
323
|
+
"strategy": "str — compactor name/class",
|
|
324
|
+
"trigger": "str? — 'proactive' (Stage 2) | 'guard' (Stage 4)",
|
|
325
|
+
"messages_before": "int?",
|
|
326
|
+
"messages_after": "int?",
|
|
327
|
+
"saved_tokens_estimate": "int?",
|
|
328
|
+
},
|
|
329
|
+
EventTypes.CONTEXT_COMPACTION_FAILED: {
|
|
330
|
+
"compactor": "str",
|
|
331
|
+
"trigger": "str — 'proactive' | 'guard'",
|
|
332
|
+
"error": "str",
|
|
333
|
+
},
|
|
334
|
+
EventTypes.CONTEXT_COMPACTION_RECORD_FAILED: {
|
|
335
|
+
"compactor": "str",
|
|
336
|
+
"error": "str",
|
|
321
337
|
},
|
|
322
338
|
EventTypes.MEMORY_COMPACTION_SUMMARIZED: {
|
|
323
339
|
"model": "str",
|
|
@@ -342,6 +358,10 @@ PAYLOADS: Dict[EventTypes, Dict[str, str]] = {
|
|
|
342
358
|
EventTypes.GUARD_WARN: {
|
|
343
359
|
"message": "str",
|
|
344
360
|
},
|
|
361
|
+
EventTypes.GUARD_COMPACTING: {
|
|
362
|
+
"guard_name": "str — guard that signalled compaction (token_budget)",
|
|
363
|
+
"reason": "str — the guard message",
|
|
364
|
+
},
|
|
345
365
|
EventTypes.CACHE_APPLIED: {
|
|
346
366
|
"strategy": "str — cache strategy class name",
|
|
347
367
|
"system_is_blocks": "bool",
|
{geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/memory/providers/file/provider.py
RENAMED
|
@@ -12,7 +12,7 @@ from __future__ import annotations
|
|
|
12
12
|
|
|
13
13
|
import logging
|
|
14
14
|
from pathlib import Path
|
|
15
|
-
from typing import Dict, List, Optional, Sequence
|
|
15
|
+
from typing import Any, Dict, List, Optional, Sequence
|
|
16
16
|
|
|
17
17
|
from geny_executor.memory.provider import (
|
|
18
18
|
BackendInfo,
|
|
@@ -252,6 +252,53 @@ class FileMemoryProvider(MemoryProvider):
|
|
|
252
252
|
)
|
|
253
253
|
return receipt
|
|
254
254
|
|
|
255
|
+
async def record_compaction(
|
|
256
|
+
self,
|
|
257
|
+
summary: str,
|
|
258
|
+
*,
|
|
259
|
+
replaced_count: int = 0,
|
|
260
|
+
strategy: str = "",
|
|
261
|
+
saved_tokens: Optional[int] = None,
|
|
262
|
+
session_id: str = "",
|
|
263
|
+
trigger: str = "",
|
|
264
|
+
) -> Optional[str]:
|
|
265
|
+
"""Persist a history-compaction snapshot to the "compactions" category.
|
|
266
|
+
|
|
267
|
+
Called by :func:`geny_executor.core.compaction.run_compaction` when
|
|
268
|
+
Stage 2 (proactive) or Stage 4 (token-budget guard) compacts the
|
|
269
|
+
conversation. Best-effort and standalone-friendly: returns the
|
|
270
|
+
written note filename, or ``None`` when there is nothing to record.
|
|
271
|
+
Hosts that maintain a richer compaction archive set
|
|
272
|
+
``compactor.persists_own_compaction = True`` so this is skipped.
|
|
273
|
+
"""
|
|
274
|
+
body = (summary or "").strip()
|
|
275
|
+
if not body and replaced_count <= 0:
|
|
276
|
+
return None
|
|
277
|
+
|
|
278
|
+
frontmatter: Dict[str, Any] = {
|
|
279
|
+
"replaced_count": int(replaced_count),
|
|
280
|
+
"strategy": strategy or "",
|
|
281
|
+
"trigger": trigger or "",
|
|
282
|
+
"session_id": session_id or self._session_id,
|
|
283
|
+
}
|
|
284
|
+
if saved_tokens is not None:
|
|
285
|
+
frontmatter["saved_tokens"] = int(saved_tokens)
|
|
286
|
+
|
|
287
|
+
title = f"Compaction · {replaced_count} messages" if replaced_count else "Compaction"
|
|
288
|
+
note_meta = await self._notes.write(
|
|
289
|
+
NoteDraft(
|
|
290
|
+
title=title,
|
|
291
|
+
body=body or f"[{replaced_count} messages compacted.]",
|
|
292
|
+
importance=Importance.MEDIUM,
|
|
293
|
+
tags=["compaction", "system-artifact"],
|
|
294
|
+
category="compactions",
|
|
295
|
+
scope=self._scope,
|
|
296
|
+
frontmatter=frontmatter,
|
|
297
|
+
)
|
|
298
|
+
)
|
|
299
|
+
await self._index.rebuild()
|
|
300
|
+
return note_meta.ref.filename
|
|
301
|
+
|
|
255
302
|
async def reflect(self, ctx: ReflectionContext) -> Sequence[Insight]:
|
|
256
303
|
# File provider has no LLM; reflection wires in via MemoryHooks
|
|
257
304
|
# / the orchestrating stage. Default is "no insights".
|
|
@@ -4,10 +4,12 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from typing import Any, Dict, Optional
|
|
6
6
|
|
|
7
|
+
from geny_executor.core.compaction import run_compaction
|
|
7
8
|
from geny_executor.core.schema import ConfigField, ConfigSchema
|
|
8
9
|
from geny_executor.core.slot import StrategySlot
|
|
9
10
|
from geny_executor.core.stage import Stage
|
|
10
11
|
from geny_executor.core.state import PipelineState
|
|
12
|
+
from geny_executor.core.token_estimate import estimate_prompt_tokens
|
|
11
13
|
from geny_executor.memory.provider import (
|
|
12
14
|
MemoryEvent,
|
|
13
15
|
MemoryProvider,
|
|
@@ -24,6 +26,7 @@ from geny_executor.stages.s02_context.artifact.default.strategies import (
|
|
|
24
26
|
SimpleLoadStrategy,
|
|
25
27
|
)
|
|
26
28
|
from geny_executor.stages.s02_context.artifact.default.compactors import (
|
|
29
|
+
LLMSummaryCompactor,
|
|
27
30
|
SlidingWindowCompactor,
|
|
28
31
|
SummaryCompactor,
|
|
29
32
|
TruncateCompactor,
|
|
@@ -76,6 +79,7 @@ class ContextStage(Stage[Any, Any]):
|
|
|
76
79
|
registry={
|
|
77
80
|
"truncate": TruncateCompactor,
|
|
78
81
|
"summary": SummaryCompactor,
|
|
82
|
+
"llm_summary": LLMSummaryCompactor,
|
|
79
83
|
"sliding_window": SlidingWindowCompactor,
|
|
80
84
|
},
|
|
81
85
|
description="History compaction strategy",
|
|
@@ -224,15 +228,15 @@ class ContextStage(Stage[Any, Any]):
|
|
|
224
228
|
)
|
|
225
229
|
state.metadata["memory_context"] = memory_text
|
|
226
230
|
|
|
227
|
-
#
|
|
228
|
-
|
|
231
|
+
# Proactive compaction: when the projected next-call context
|
|
232
|
+
# (system + messages + tools) crosses 80% of the window, compact
|
|
233
|
+
# now so the Stage 4 token-budget guard's 95% safety net rarely
|
|
234
|
+
# has to. Both stages use ``estimate_prompt_tokens`` so compaction
|
|
235
|
+
# measurably lowers the same number the guard checks.
|
|
236
|
+
estimated_tokens = estimate_prompt_tokens(state)
|
|
229
237
|
if estimated_tokens > state.context_window_budget * 0.8:
|
|
230
|
-
await
|
|
231
|
-
|
|
232
|
-
"context.compacted",
|
|
233
|
-
{
|
|
234
|
-
"strategy": type(self._compactor).__name__,
|
|
235
|
-
},
|
|
238
|
+
await run_compaction(
|
|
239
|
+
state, self._compactor, trigger="proactive", provider=self._provider
|
|
236
240
|
)
|
|
237
241
|
|
|
238
242
|
state.add_event(
|
{geny_executor-2.4.1 → geny_executor-2.5.0}/src/geny_executor/stages/s02_context/interface.py
RENAMED
|
@@ -21,6 +21,14 @@ class ContextStrategy(Strategy):
|
|
|
21
21
|
class HistoryCompactor(Strategy):
|
|
22
22
|
"""Base interface for compacting conversation history when budget is exceeded."""
|
|
23
23
|
|
|
24
|
+
# Set True by compactors that write their own compaction snapshot to a
|
|
25
|
+
# memory provider (e.g. a host wrapper that records to a vault). When
|
|
26
|
+
# True, the centralised :func:`geny_executor.core.compaction.run_compaction`
|
|
27
|
+
# helper skips its own ``provider.record_compaction`` call so the
|
|
28
|
+
# snapshot is not persisted twice. Plain in-library compactors leave
|
|
29
|
+
# this False and rely on the helper for persistence.
|
|
30
|
+
persists_own_compaction: bool = False
|
|
31
|
+
|
|
24
32
|
@abstractmethod
|
|
25
33
|
async def compact(self, state: PipelineState) -> None:
|
|
26
34
|
"""Compact history in state.messages to fit within budget."""
|
|
@@ -6,12 +6,27 @@ from typing import Any, Dict, Optional, Set
|
|
|
6
6
|
|
|
7
7
|
from geny_executor.core.schema import ConfigField, ConfigSchema
|
|
8
8
|
from geny_executor.core.state import PipelineState
|
|
9
|
+
from geny_executor.core.token_estimate import estimate_prompt_tokens
|
|
9
10
|
from geny_executor.stages.s04_guard.interface import Guard
|
|
10
11
|
from geny_executor.stages.s04_guard.types import GuardResult
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
class TokenBudgetGuard(Guard):
|
|
14
|
-
"""
|
|
15
|
+
"""Ensure the NEXT API call still fits in the context window.
|
|
16
|
+
|
|
17
|
+
Measures the *projected* input size of the next request (system +
|
|
18
|
+
messages + tools, via :func:`estimate_prompt_tokens`) against
|
|
19
|
+
``state.context_window_budget``, reserving ``min_remaining_tokens``
|
|
20
|
+
of headroom for the model's response. When the projection leaves too
|
|
21
|
+
little headroom the guard returns ``action="compact"`` — a *recoverable*
|
|
22
|
+
signal: :class:`GuardStage` compacts ``state.messages`` and re-checks
|
|
23
|
+
once, hard-rejecting only if the context still does not fit.
|
|
24
|
+
|
|
25
|
+
Before 2.5.0 this guard read session/turn-cumulative ``token_usage``
|
|
26
|
+
and hard-rejected — a measure compaction could never lower, so a long
|
|
27
|
+
tool-loop turn died with no recovery. Cumulative *spend* caps remain
|
|
28
|
+
the job of ``cost_budget`` and the Stage 16 loop's token dimension.
|
|
29
|
+
"""
|
|
15
30
|
|
|
16
31
|
def __init__(self, min_remaining_tokens: int = 10_000):
|
|
17
32
|
self._min_remaining = min_remaining_tokens
|
|
@@ -22,7 +37,10 @@ class TokenBudgetGuard(Guard):
|
|
|
22
37
|
|
|
23
38
|
@property
|
|
24
39
|
def description(self) -> str:
|
|
25
|
-
return
|
|
40
|
+
return (
|
|
41
|
+
f"Ensures the next request leaves >= {self._min_remaining} tokens "
|
|
42
|
+
"of context headroom (compacts history first)"
|
|
43
|
+
)
|
|
26
44
|
|
|
27
45
|
@classmethod
|
|
28
46
|
def config_schema(cls) -> ConfigSchema:
|
|
@@ -33,7 +51,12 @@ class TokenBudgetGuard(Guard):
|
|
|
33
51
|
name="min_remaining_tokens",
|
|
34
52
|
type="integer",
|
|
35
53
|
label="Min remaining tokens",
|
|
36
|
-
description=
|
|
54
|
+
description=(
|
|
55
|
+
"Headroom (for the response) the next request must leave "
|
|
56
|
+
"free in the context window. When the projected request "
|
|
57
|
+
"would leave less, history is compacted and re-checked "
|
|
58
|
+
"before the turn is rejected."
|
|
59
|
+
),
|
|
37
60
|
default=10_000,
|
|
38
61
|
min_value=0,
|
|
39
62
|
),
|
|
@@ -49,14 +72,18 @@ class TokenBudgetGuard(Guard):
|
|
|
49
72
|
return {"min_remaining_tokens": self._min_remaining}
|
|
50
73
|
|
|
51
74
|
def check(self, state: PipelineState) -> GuardResult:
|
|
52
|
-
|
|
53
|
-
remaining = state.context_window_budget -
|
|
75
|
+
projected = estimate_prompt_tokens(state)
|
|
76
|
+
remaining = state.context_window_budget - projected
|
|
54
77
|
if remaining < self._min_remaining:
|
|
55
78
|
return GuardResult(
|
|
56
79
|
passed=False,
|
|
57
80
|
guard_name=self.name,
|
|
58
|
-
message=
|
|
59
|
-
|
|
81
|
+
message=(
|
|
82
|
+
f"Context near limit: ~{projected} of "
|
|
83
|
+
f"{state.context_window_budget} tokens projected, "
|
|
84
|
+
f"{remaining} free (need {self._min_remaining})"
|
|
85
|
+
),
|
|
86
|
+
action="compact",
|
|
60
87
|
)
|
|
61
88
|
return GuardResult(passed=True, guard_name=self.name)
|
|
62
89
|
|
|
@@ -11,6 +11,7 @@ from geny_executor.core.slot import SlotChain
|
|
|
11
11
|
from geny_executor.core.stage import Stage
|
|
12
12
|
from geny_executor.core.state import PipelineState
|
|
13
13
|
from geny_executor.stages.s04_guard.interface import Guard, GuardChain
|
|
14
|
+
from geny_executor.stages.s04_guard.types import GuardResult
|
|
14
15
|
from geny_executor.stages.s04_guard.artifact.default.guards import (
|
|
15
16
|
CostBudgetGuard,
|
|
16
17
|
IterationGuard,
|
|
@@ -48,6 +49,29 @@ class GuardStage(Stage[Any, Any]):
|
|
|
48
49
|
}
|
|
49
50
|
self._max_chain_length = int(max_chain_length)
|
|
50
51
|
self._fail_fast = bool(fail_fast)
|
|
52
|
+
# Budget-recovery wiring (2.5.0). A guard may return
|
|
53
|
+
# ``action="compact"`` (the token-budget guard does when the
|
|
54
|
+
# projected request is too large). When a compactor is wired,
|
|
55
|
+
# ``execute`` compacts ``state.messages`` and re-checks once
|
|
56
|
+
# before rejecting. Auto-wired from the Context stage's compactor
|
|
57
|
+
# by ``Pipeline._init_state`` each turn; a host may override via
|
|
58
|
+
# :meth:`attach_budget_recovery`. ``None`` → "compact" degrades
|
|
59
|
+
# to a hard reject (pre-2.5.0 behaviour).
|
|
60
|
+
self._budget_compactor: Optional[Any] = None
|
|
61
|
+
self._memory_provider: Optional[Any] = None
|
|
62
|
+
# True once a host explicitly wired recovery — stops the
|
|
63
|
+
# per-turn auto-wire (Pipeline._init_state) from clobbering it.
|
|
64
|
+
self._budget_recovery_explicit = False
|
|
65
|
+
|
|
66
|
+
def attach_budget_recovery(
|
|
67
|
+
self, compactor: Optional[Any], provider: Optional[Any] = None
|
|
68
|
+
) -> "GuardStage":
|
|
69
|
+
"""Wire the compactor (and optional memory provider) used to recover
|
|
70
|
+
from a ``compact`` guard signal. See class/__init__ notes."""
|
|
71
|
+
self._budget_compactor = compactor
|
|
72
|
+
self._memory_provider = provider
|
|
73
|
+
self._budget_recovery_explicit = True
|
|
74
|
+
return self
|
|
51
75
|
|
|
52
76
|
@property
|
|
53
77
|
def guards(self) -> SlotChain:
|
|
@@ -153,22 +177,52 @@ class GuardStage(Stage[Any, Any]):
|
|
|
153
177
|
},
|
|
154
178
|
)
|
|
155
179
|
|
|
156
|
-
if
|
|
180
|
+
if result.passed:
|
|
181
|
+
return input
|
|
182
|
+
|
|
183
|
+
if result.action == "warn":
|
|
184
|
+
state.add_event("guard.warn", {"message": result.message})
|
|
185
|
+
return input
|
|
186
|
+
|
|
187
|
+
# Recoverable budget pressure: compact history and re-check
|
|
188
|
+
# once before giving up. Only the first compact-actionable
|
|
189
|
+
# failure triggers recovery; a recovered chain re-runs clean.
|
|
190
|
+
if result.action == "compact" and await self._recover_budget(state, result):
|
|
191
|
+
result = GuardChain(guards).check_all(state)
|
|
192
|
+
state.add_event(
|
|
193
|
+
"guard.check",
|
|
194
|
+
{
|
|
195
|
+
"passed": result.passed,
|
|
196
|
+
"guard_name": result.guard_name,
|
|
197
|
+
"message": result.message,
|
|
198
|
+
"recheck": True,
|
|
199
|
+
},
|
|
200
|
+
)
|
|
201
|
+
if result.passed:
|
|
202
|
+
return input
|
|
157
203
|
if result.action == "warn":
|
|
158
204
|
state.add_event("guard.warn", {"message": result.message})
|
|
159
205
|
return input
|
|
160
|
-
raise GuardRejectError(
|
|
161
|
-
result.message,
|
|
162
|
-
guard_name=result.guard_name,
|
|
163
|
-
)
|
|
164
206
|
|
|
165
|
-
|
|
207
|
+
raise GuardRejectError(
|
|
208
|
+
result.message,
|
|
209
|
+
guard_name=result.guard_name,
|
|
210
|
+
)
|
|
166
211
|
|
|
167
212
|
# fail_fast=False — run EVERY guard and aggregate. Operators use
|
|
168
213
|
# this to see the full violation picture in one turn instead of
|
|
169
214
|
# fixing guards one rejection at a time.
|
|
170
215
|
failures = [r for r in (guard.check(state) for guard in guards) if not r.passed]
|
|
171
|
-
|
|
216
|
+
|
|
217
|
+
# Recoverable budget pressure: if any failure asked to compact,
|
|
218
|
+
# compact once and re-evaluate the whole chain before aggregating
|
|
219
|
+
# rejects (a recovered token_budget guard drops out of the list).
|
|
220
|
+
if any(r.action == "compact" for r in failures):
|
|
221
|
+
compact_result = next(r for r in failures if r.action == "compact")
|
|
222
|
+
if await self._recover_budget(state, compact_result):
|
|
223
|
+
failures = [r for r in (guard.check(state) for guard in guards) if not r.passed]
|
|
224
|
+
|
|
225
|
+
rejects = [r for r in failures if r.action not in ("warn",)]
|
|
172
226
|
|
|
173
227
|
state.add_event(
|
|
174
228
|
"guard.check",
|
|
@@ -194,3 +248,29 @@ class GuardStage(Stage[Any, Any]):
|
|
|
194
248
|
)
|
|
195
249
|
|
|
196
250
|
return input
|
|
251
|
+
|
|
252
|
+
async def _recover_budget(self, state: PipelineState, result: GuardResult) -> bool:
|
|
253
|
+
"""Compact history in response to a ``compact`` guard signal.
|
|
254
|
+
|
|
255
|
+
Returns True iff a compactor was wired and ran (so the caller
|
|
256
|
+
should re-check the chain). With no compactor wired the signal
|
|
257
|
+
degrades to a hard reject — the pre-2.5.0 behaviour.
|
|
258
|
+
"""
|
|
259
|
+
if self._budget_compactor is None:
|
|
260
|
+
return False
|
|
261
|
+
|
|
262
|
+
state.add_event(
|
|
263
|
+
"guard.compacting",
|
|
264
|
+
{"guard_name": result.guard_name, "reason": result.message},
|
|
265
|
+
)
|
|
266
|
+
# Lazy import: keeps the guard stage import-light and avoids a
|
|
267
|
+
# core→stage cycle at module load.
|
|
268
|
+
from geny_executor.core.compaction import run_compaction
|
|
269
|
+
|
|
270
|
+
outcome = await run_compaction(
|
|
271
|
+
state,
|
|
272
|
+
self._budget_compactor,
|
|
273
|
+
trigger="guard",
|
|
274
|
+
provider=self._memory_provider,
|
|
275
|
+
)
|
|
276
|
+
return bool(outcome.get("ok"))
|