delegate-agent-cli 0.13.0__tar.gz → 0.13.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/CHANGELOG.md +13 -0
  2. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/PKG-INFO +16 -1
  3. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/README.md +15 -0
  4. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/docs/cli-reference.md +10 -4
  5. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/docs/configuration.md +5 -0
  6. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/docs/security-model.md +8 -0
  7. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/pyproject.toml +1 -1
  8. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/__init__.py +1 -1
  9. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/argv_builders.py +8 -0
  10. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/cli.py +4 -0
  11. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/cli_parser.py +33 -0
  12. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/command_help.py +26 -9
  13. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/describe_payload.py +9 -2
  14. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/request_build.py +19 -0
  15. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/request_models.py +3 -0
  16. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/run_metadata.py +12 -0
  17. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/runner.py +4 -0
  18. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/safe_workspace.py +1 -0
  19. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/snapshot_view.py +1 -0
  20. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/workflows/runtime.py +16 -0
  21. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/worktree_execution.py +2 -0
  22. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent_cli.egg-info/PKG-INFO +16 -1
  23. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_command_help.py +11 -0
  24. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_delegate_parser.py +69 -0
  25. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_end_to_end_tracking.py +13 -0
  26. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_engine_argv.py +29 -0
  27. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_execution_argv_and_prompt.py +31 -0
  28. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_execution_dry_run.py +23 -0
  29. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_execution_worktree_preflight.py +2 -0
  30. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_workflow_commands.py +40 -1
  31. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/CONTRIBUTING.md +0 -0
  32. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/LICENSE +0 -0
  33. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/MANIFEST.in +0 -0
  34. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/SECURITY.md +0 -0
  35. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/bin/delegate-profile-shim +0 -0
  36. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/bin/delegate.py +0 -0
  37. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/config.example.json +0 -0
  38. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/docs/agent-setup.md +0 -0
  39. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/docs/assets/delegate-agent-header.png +0 -0
  40. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/docs/development.md +0 -0
  41. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/docs/live-runtime.md +0 -0
  42. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/docs/publishing-checklist.md +0 -0
  43. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/docs/troubleshooting.md +0 -0
  44. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/docs/worktrees.md +0 -0
  45. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/examples/task.claude.json +0 -0
  46. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/examples/task.codex.json +0 -0
  47. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/examples/task.cursor.json +0 -0
  48. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/examples/task.droid.json +0 -0
  49. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/examples/task.grok.json +0 -0
  50. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/examples/task.judge.json +0 -0
  51. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/setup.cfg +0 -0
  52. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/archived_logs.py +0 -0
  53. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/argv_utils.py +0 -0
  54. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/bundled_models.py +0 -0
  55. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/capability_commands.py +0 -0
  56. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/command_errors.py +0 -0
  57. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/config.py +0 -0
  58. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/config_commands.py +0 -0
  59. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/constants.py +0 -0
  60. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/errors.py +0 -0
  61. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/git_utils.py +0 -0
  62. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/harness_events.py +0 -0
  63. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/inspection_commands.py +0 -0
  64. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/isolation.py +0 -0
  65. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/json_types.py +0 -0
  66. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/log_output.py +0 -0
  67. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/model_discovery.py +0 -0
  68. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/private_io.py +0 -0
  69. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/profile_commands.py +0 -0
  70. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/profile_guard.py +0 -0
  71. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/profiles.py +0 -0
  72. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/prompt_instructions.py +0 -0
  73. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/prompt_transport.py +0 -0
  74. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/reasoning.py +0 -0
  75. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/redaction.py +0 -0
  76. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/rendering.py +0 -0
  77. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/retention.py +0 -0
  78. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/run_output_commands.py +0 -0
  79. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/run_registry.py +0 -0
  80. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/run_status.py +0 -0
  81. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/wait_cancel_commands.py +0 -0
  82. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/workflows/__init__.py +0 -0
  83. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/workflows/commands.py +0 -0
  84. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/workflows/registry.py +0 -0
  85. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/workflows/schema.py +0 -0
  86. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/workflows/script.py +0 -0
  87. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/worktree_commands.py +0 -0
  88. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/worktree_gc.py +0 -0
  89. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/worktree_mgmt.py +0 -0
  90. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/worktree_records.py +0 -0
  91. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/worktree_remove.py +0 -0
  92. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/worktree_summary.py +0 -0
  93. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent/wsl.py +0 -0
  94. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent_cli.egg-info/SOURCES.txt +0 -0
  95. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent_cli.egg-info/dependency_links.txt +0 -0
  96. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent_cli.egg-info/entry_points.txt +0 -0
  97. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent_cli.egg-info/requires.txt +0 -0
  98. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/src/delegate_agent_cli.egg-info/top_level.txt +0 -0
  99. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_capability_commands.py +0 -0
  100. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_config_commands.py +0 -0
  101. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_delegate_help_cli.py +0 -0
  102. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_delegate_isolation.py +0 -0
  103. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_delegate_validation.py +0 -0
  104. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_execution_worktree_failure_cleanup.py +0 -0
  105. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_execution_worktree_run.py +0 -0
  106. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_harness_events.py +0 -0
  107. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_inspection_commands.py +0 -0
  108. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_kimi_commands.py +0 -0
  109. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_model_discovery.py +0 -0
  110. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_model_selection_wave1a.py +0 -0
  111. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_model_selection_wave1b.py +0 -0
  112. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_packaging.py +0 -0
  113. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_profiles.py +0 -0
  114. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_reasoning_capabilities.py +0 -0
  115. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_retention.py +0 -0
  116. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_run_registry.py +0 -0
  117. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_runner_capture.py +0 -0
  118. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_safe_workspace_isolation.py +0 -0
  119. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_slash_passthrough.py +0 -0
  120. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_snapshot_redaction.py +0 -0
  121. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_snapshot_rendering.py +0 -0
  122. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_snapshot_run_output.py +0 -0
  123. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_snapshot_view.py +0 -0
  124. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_utility_modules.py +0 -0
  125. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_wait_cancel_commands.py +0 -0
  126. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_wave4_launch_features.py +0 -0
  127. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_worktree_list_show.py +0 -0
  128. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_worktree_prune_gc.py +0 -0
  129. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_worktree_remove.py +0 -0
  130. {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.13.1}/tests/test_wsl_guardrails.py +0 -0
@@ -5,6 +5,18 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.13.1] - 2026-07-09
9
+
10
+ ### Added
11
+
12
+ - Codex-only `--fast` / `--no-fast` per-run service-tier overrides (and a
13
+ `fast` boolean in run-input JSON). `--fast` emits `service_tier="fast"` plus
14
+ `features.fast_mode=true` so the tier cannot be silently dropped by ambient
15
+ Codex config; `--no-fast` emits the explicit `service_tier="default"`
16
+ standard-routing sentinel; omitting both inherits Codex configuration. The
17
+ explicit choice is recorded as `requestedFast` in run metadata. The flag and
18
+ JSON key fail closed on every other engine, including a bare `"fast": null`.
19
+
8
20
  ## [0.13.0] - 2026-07-09
9
21
 
10
22
  ### Added
@@ -292,6 +304,7 @@ Usage-audit fix wave: 82 sessions and 1,241 delegate invocations from one week o
292
304
 
293
305
  - Releases before 0.1.3 predate this changelog.
294
306
 
307
+ [0.13.1]: https://github.com/treygoff24/delegate-agent/compare/v0.13.0...v0.13.1
295
308
  [0.13.0]: https://github.com/treygoff24/delegate-agent/compare/v0.12.0...v0.13.0
296
309
  [0.12.0]: https://github.com/treygoff24/delegate-agent/compare/v0.11.0...v0.12.0
297
310
  [0.11.0]: https://github.com/treygoff24/delegate-agent/compare/v0.10.0...v0.11.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: delegate-agent-cli
3
- Version: 0.13.0
3
+ Version: 0.13.1
4
4
  Summary: A tiny CLI for delegating bounded agent tasks to Cursor, Droid, OpenAI Codex, Claude Code, Grok Build, or Kimi Code runtimes.
5
5
  Author: Trey Goff
6
6
  License-Expression: MIT
@@ -243,6 +243,21 @@ delegate --json dry-run codex safe --reasoning-effort high "Review this reposito
243
243
  delegate --json dry-run claude safe --reasoning-effort high "Review this repository. Do not edit files."
244
244
  ```
245
245
 
246
+ Codex model routing is deliberately model-first rather than aliasing every
247
+ model/effort pair: define model aliases in `codex.models`, then set effort per
248
+ run with `--reasoning-effort`. Per-model effort menus (including any efforts
249
+ newer than the bundled data) belong in the private `reasoning.capabilities`
250
+ config block, which overrides the bundled defaults.
251
+
252
+ Fast mode is an independent per-run serving choice. `--fast` requests Codex's
253
+ Fast service tier, `--no-fast` explicitly requests Standard, and omitting both
254
+ inherits the active Codex configuration:
255
+
256
+ ```bash
257
+ delegate codex safe --model my-alias --reasoning-effort medium --fast "Explore likely causes."
258
+ delegate codex work --model my-alias --reasoning-effort high --no-fast "Implement and verify."
259
+ ```
260
+
246
261
  Inspect tracked output by alias:
247
262
 
248
263
  ```bash
@@ -210,6 +210,21 @@ delegate --json dry-run codex safe --reasoning-effort high "Review this reposito
210
210
  delegate --json dry-run claude safe --reasoning-effort high "Review this repository. Do not edit files."
211
211
  ```
212
212
 
213
+ Codex model routing is deliberately model-first rather than aliasing every
214
+ model/effort pair: define model aliases in `codex.models`, then set effort per
215
+ run with `--reasoning-effort`. Per-model effort menus (including any efforts
216
+ newer than the bundled data) belong in the private `reasoning.capabilities`
217
+ config block, which overrides the bundled defaults.
218
+
219
+ Fast mode is an independent per-run serving choice. `--fast` requests Codex's
220
+ Fast service tier, `--no-fast` explicitly requests Standard, and omitting both
221
+ inherits the active Codex configuration:
222
+
223
+ ```bash
224
+ delegate codex safe --model my-alias --reasoning-effort medium --fast "Explore likely causes."
225
+ delegate codex work --model my-alias --reasoning-effort high --no-fast "Implement and verify."
226
+ ```
227
+
213
228
  Inspect tracked output by alias:
214
229
 
215
230
  ```bash
@@ -28,9 +28,9 @@ delegate droid [MODEL_ALIAS] safe [--model <alias-or-model>] [--reasoning-effort
28
28
  delegate droid [MODEL_ALIAS] work [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
29
29
  delegate droid [MODEL_ALIAS] call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]
30
30
 
31
- delegate codex safe [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
32
- delegate codex work [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
33
- delegate codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [--output-schema FILE] [prompt...]
31
+ delegate codex safe [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
32
+ delegate codex work [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
33
+ delegate codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--prompt-file PATH] [--output-schema FILE] [prompt...]
34
34
 
35
35
  delegate claude safe [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
36
36
  delegate claude work [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
@@ -77,6 +77,8 @@ engines report live unsupported).
77
77
 
78
78
  `--reasoning-effort LEVEL` is optional and parsed only before prompt text begins. Engines with capability metadata reject unsupported model/effort pairs before launch with `unsupported_reasoning_effort`. It affects only model reasoning depth, cost, or latency; it does not change `safe`/`work`/`call` permissions, sandboxing, approvals, network policy, or edit capability. Cursor effort is model-selection based and requires `cursor.reasoningEffortModels`; an explicit `--model` wins over effort→model routing. Droid emits `--reasoning-effort LEVEL`; Codex emits a `model_reasoning_effort` config override for the resolved model, or for the Codex harness default model when no `codex.defaultModel` is configured and the request was explicit; Claude emits Claude Code `--effort LEVEL`; Grok emits Grok `--effort LEVEL` (`low`, `medium`, `high`, `xhigh`, `max`); OpenCode emits `--variant LEVEL` without validating it against the selected model. Kimi does not support reasoning effort in v1.
79
79
 
80
+ `--fast` and `--no-fast` are Codex-only, mutually exclusive per-run service-tier overrides. `--fast` emits `service_tier="fast"` plus `features.fast_mode=true` (Codex silently drops a Fast tier when that feature flag is off in the ambient config, so Delegate enables it explicitly); `--no-fast` emits `service_tier="default"` so a globally enabled Fast setting can be turned off for one child. Omitting both emits no override and inherits Codex configuration. Fast is orthogonal to model selection, reasoning effort, and Delegate safety policy. Two upstream caveats: Codex strips the service tier when authenticated with an API key (Fast is a ChatGPT-plan feature), and neither Codex nor the API fails on a tier the model does not offer — Delegate's flag validation is the only fail-closed layer, so an unsupported combination degrades silently to standard routing rather than erroring.
81
+
80
82
  `--progress` enables parent progress heartbeats on stderr for tracked foreground
81
83
  runs. `--no-progress` disables them even when `progress.enabled` is true in
82
84
  config. When neither flag is set, config `progress.enabled` applies (default
@@ -137,13 +139,14 @@ auth/env selection happens.
137
139
  Usage:
138
140
 
139
141
  ```bash
140
- delegate [--json] [--isolation auto|none|worktree] codex {safe,work,call} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
142
+ delegate [--json] [--isolation auto|none|worktree] codex {safe,work,call} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
141
143
  ```
142
144
 
143
145
  - Safe mode reviews your **current working tree** — uncommitted tracked edits and untracked, non-ignored files are mirrored into an isolated throwaway copy (only gitignored paths are excluded), so you can review local changes without committing first or pasting a diff. Codex safe always uses `--sandbox read-only`. Under `--isolation auto`, Codex safe is the only safe harness that may opt out with `--isolation none`, because Codex still keeps its read-only sandbox active.
144
146
  - Prompt text is delivered on stdin to `codex exec`; dry-run argv and tracked run manifests do not contain the prompt.
145
147
  - Model selection uses `--model` (alias from `codex.models` or a raw model ID), the run-input JSON `model`, or `codex.defaultModel`.
146
148
  - `--reasoning-effort` maps to a Codex `model_reasoning_effort` config override after the model is resolved.
149
+ - `--fast` requests Codex Fast for one run; `--no-fast` explicitly requests Standard; omission inherits Codex configuration. The selected tier is recorded as `requestedFast` when explicit.
147
150
  - `--output-schema FILE` is **codex-only**. Every other engine rejects it. `FILE` is a path to a JSON Schema that OpenAI enforces on Codex's final message, for machine-parseable output in fan-outs and JSON run input. Relative paths resolve against the process launch cwd, the same rule as `--prompt-file`. When set, Delegate suppresses the completion-report prompt injection for that run so the schema owns the whole final message. Missing or unreadable files fail fast before launch.
148
151
 
149
152
  Examples:
@@ -151,6 +154,7 @@ Examples:
151
154
  ```bash
152
155
  delegate codex safe "Review this repo for regressions; report file/line/severity."
153
156
  delegate codex safe --model gpt-5.5 "Review this repo for regressions; report file/line/severity."
157
+ delegate codex safe --model my-alias --reasoning-effort medium --fast "Explore likely causes."
154
158
  delegate codex work "Implement the scoped task; report changed files and tests."
155
159
  delegate codex call "Summarize this context in three bullets."
156
160
  delegate --json codex safe --output-schema findings.schema.json "Return one record per finding."
@@ -513,6 +517,7 @@ Supported input keys:
513
517
  "cwd": "/path/to/workspace",
514
518
  "isolation": "worktree",
515
519
  "reasoningEffort": "high",
520
+ "fast": false,
516
521
  "progress": true,
517
522
  "forbidCommit": true,
518
523
  "includeDirty": true,
@@ -527,6 +532,7 @@ Supported input keys:
527
532
  - `cwd`: optional workspace path. Git directories resolve to the repo root. Omit it for `mode: "call"`, which always uses an empty temporary cwd.
528
533
  - `isolation`: optional `auto`, `none`, or `worktree`. `null` is invalid. `mode: "call"` rejects isolation. For Cursor, Claude, Grok, Devin, OpenCode, Droid, and Kimi safe mode, `none` is normalized to `auto` with a warning.
529
534
  - `reasoningEffort`: optional non-empty effort string. It overrides provider `defaultReasoningEffort` for that JSON run.
535
+ - `fast`: optional Codex-only boolean or `null`. `true` requests Fast, `false` explicitly requests Standard, and `null`/omission inherits Codex configuration.
530
536
  - `progress`: optional boolean. `true` enables parent progress heartbeats on stderr; `false` disables them even when `progress.enabled` is true in config. When omitted, config `progress.enabled` applies (default `false`). `mode: "call"` rejects progress.
531
537
  - `forbidCommit`: optional boolean. `true` requires `mode: "work"` with persistent worktree isolation and fails the run if the child creates commits. `mode: "call"` rejects commit policy.
532
538
  - `includeDirty`: optional boolean. `true` requires `mode: "work"` with persistent worktree isolation and syncs tracked edits plus untracked non-ignored files into the new worktree before launch.
@@ -138,6 +138,11 @@ layers. This is read-only observability; inspecting it does not modify
138
138
 
139
139
  Reasoning-effort settings are optional. A per-run `--reasoning-effort LEVEL` or JSON `reasoningEffort` overrides provider defaults. If no effort is requested or defaulted, Delegate emits no reasoning-effort argv and preserves current runtime behavior.
140
140
 
141
+ Codex Fast is intentionally not a Delegate config default. Use per-run
142
+ `--fast`, `--no-fast`, or JSON `fast`; omission inherits the active Codex CLI
143
+ configuration. This keeps speed selection independent from model aliases and
144
+ reasoning defaults.
145
+
141
146
  ## Sections
142
147
 
143
148
  ### `tracking`
@@ -118,6 +118,14 @@ combinations before launch. OpenCode is the exception: Delegate passes the value
118
118
  through as `--variant`, and OpenCode may silently ignore an unknown variant.
119
119
  Treat higher effort as a possible latency/cost change, not as a safety control.
120
120
 
121
+ ## Codex Fast boundary
122
+
123
+ `--fast`, `--no-fast`, and JSON `fast` select a Codex service tier for one run.
124
+ They do not change the selected model, reasoning effort, sandbox, approvals,
125
+ isolation, network policy, credentials, or edit capability. Fast may consume
126
+ plan usage at a different rate; treat it as a latency/usage choice, never a
127
+ security control.
128
+
121
129
  ## Isolation boundaries
122
130
 
123
131
  ### Temporary safe isolation
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "delegate-agent-cli"
7
- version = "0.13.0"
7
+ version = "0.13.1"
8
8
  description = "A tiny CLI for delegating bounded agent tasks to Cursor, Droid, OpenAI Codex, Claude Code, Grok Build, or Kimi Code runtimes."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,5 +1,5 @@
1
1
  """Delegate Agent CLI package."""
2
2
 
3
- VERSION = "0.13.0"
3
+ VERSION = "0.13.1"
4
4
 
5
5
  __all__ = ["VERSION"]
@@ -424,6 +424,7 @@ def build_codex_argv(
424
424
  workspace_kind: str,
425
425
  stream_capture: bool = True,
426
426
  reasoning_capability: reasoning.ReasoningCapability | None = None,
427
+ fast: bool | None = None,
427
428
  prompt_transport: str = PROMPT_TRANSPORT_ARGV,
428
429
  output_schema: str | None = None,
429
430
  call_read_only: bool = False,
@@ -455,6 +456,13 @@ def build_codex_argv(
455
456
  f'model_reasoning_effort="{reasoning_capability.effort}"',
456
457
  ]
457
458
  )
459
+ if fast is not None:
460
+ service_tier = "fast" if fast else "default"
461
+ argv.extend(["-c", f'service_tier="{service_tier}"'])
462
+ if fast:
463
+ # Codex drops a "fast" tier silently when features.fast_mode is off
464
+ # in the ambient config; enable it so --fast cannot no-op.
465
+ argv.extend(["-c", "features.fast_mode=true"])
458
466
  argv.append("exec")
459
467
  argv.extend(["--cd", workspace])
460
468
  if output_schema is not None:
@@ -22,6 +22,7 @@ from delegate_agent import (
22
22
  profiles,
23
23
  reasoning,
24
24
  redaction,
25
+ run_metadata,
25
26
  run_output_commands,
26
27
  run_registry,
27
28
  wait_cancel_commands,
@@ -305,6 +306,7 @@ def dry_run_payload(request: Request) -> JsonObject:
305
306
  "promptInstructionMode": request.prompt_instruction_mode,
306
307
  }
307
308
  reasoning.add_reasoning_payload_fields(payload, request)
309
+ run_metadata.add_speed_payload_fields(payload, request)
308
310
  if request.warnings:
309
311
  payload["warnings"] = list(request.warnings)
310
312
  if request.progress:
@@ -554,6 +556,7 @@ def make_run_context(
554
556
  reasoning_effort_source=request.reasoning_effort_source,
555
557
  reasoning_capability_source=request.reasoning_capability_source,
556
558
  reasoning_transport=request.reasoning_transport,
559
+ fast=request.fast,
557
560
  prompt_transport=request.prompt_transport,
558
561
  forbid_commit=request.forbid_commit,
559
562
  progress_initial_delay_sec=request.progress_initial_delay_sec,
@@ -688,6 +691,7 @@ def execute_request(
688
691
  merged.append(warning)
689
692
  payload["warnings"] = merged
690
693
  reasoning.add_reasoning_payload_fields(payload, request)
694
+ run_metadata.add_speed_payload_fields(payload, request)
691
695
  if result.exit_code != 0:
692
696
  payload["error"] = "child_failed"
693
697
  payload["message"] = "Child command failed."
@@ -703,6 +703,7 @@ def parse_modeless_engine(
703
703
  prompt_file,
704
704
  output_schema,
705
705
  reasoning_effort,
706
+ fast,
706
707
  progress_intent,
707
708
  forbid_commit,
708
709
  prompt_parts,
@@ -715,6 +716,8 @@ def parse_modeless_engine(
715
716
  ) = parse_prompt_tail(rest[1:], json_mode, isolation, command_prefix=[engine, mode])
716
717
  if agent is not None and engine != "opencode":
717
718
  raise DelegateError("unsupported_agent", "--agent is only supported by opencode.")
719
+ if fast is not None and engine != "codex":
720
+ raise DelegateError("unsupported_fast", "--fast and --no-fast are only supported by codex.")
718
721
  forbid_commit_implied_isolation = False
719
722
  if forbid_commit and mode == "work" and isolation is None:
720
723
  isolation = "worktree"
@@ -743,6 +746,7 @@ def parse_modeless_engine(
743
746
  prompt_file=prompt_file,
744
747
  output_schema=output_schema,
745
748
  reasoning_effort=reasoning_effort,
749
+ fast=fast,
746
750
  progress_intent=progress_intent,
747
751
  forbid_commit=forbid_commit,
748
752
  forbid_commit_implied_isolation=forbid_commit_implied_isolation,
@@ -813,6 +817,7 @@ def parse_droid(
813
817
  prompt_file,
814
818
  output_schema,
815
819
  reasoning_effort,
820
+ fast,
816
821
  progress_intent,
817
822
  forbid_commit,
818
823
  prompt_parts,
@@ -825,6 +830,8 @@ def parse_droid(
825
830
  ) = parse_prompt_tail(tail, json_mode, isolation, command_prefix=command_prefix)
826
831
  if agent is not None:
827
832
  raise DelegateError("unsupported_agent", "--agent is only supported by opencode.")
833
+ if fast is not None:
834
+ raise DelegateError("unsupported_fast", "--fast and --no-fast are only supported by codex.")
828
835
  forbid_commit_implied_isolation = False
829
836
  if forbid_commit and mode == "work" and isolation is None:
830
837
  isolation = "worktree"
@@ -855,6 +862,7 @@ def parse_droid(
855
862
  prompt_file=prompt_file,
856
863
  output_schema=output_schema,
857
864
  reasoning_effort=reasoning_effort,
865
+ fast=fast,
858
866
  progress_intent=progress_intent,
859
867
  forbid_commit=forbid_commit,
860
868
  forbid_commit_implied_isolation=forbid_commit_implied_isolation,
@@ -933,6 +941,7 @@ def parse_prompt_tail(
933
941
  str | None,
934
942
  str | None,
935
943
  str | None,
944
+ bool | None,
936
945
  str | None,
937
946
  bool,
938
947
  list[str],
@@ -946,6 +955,7 @@ def parse_prompt_tail(
946
955
  prompt_file: str | None = None
947
956
  output_schema: str | None = None
948
957
  reasoning_effort: str | None = None
958
+ fast: bool | None = None
949
959
  progress_intent: str | None = None
950
960
  forbid_commit = False
951
961
  include_dirty = False
@@ -1022,6 +1032,28 @@ def parse_prompt_tail(
1022
1032
  raise DelegateError(exc.error, f"{exc.message}{corrected}") from exc
1023
1033
  i += 2
1024
1034
  continue
1035
+ if token == "--fast":
1036
+ if fast is not None:
1037
+ detail = (
1038
+ "Only one --fast flag is allowed."
1039
+ if fast
1040
+ else "--fast and --no-fast cannot be combined."
1041
+ )
1042
+ raise DelegateError("invalid_option_combination", detail)
1043
+ fast = True
1044
+ i += 1
1045
+ continue
1046
+ if token == "--no-fast":
1047
+ if fast is not None:
1048
+ detail = (
1049
+ "Only one --no-fast flag is allowed."
1050
+ if not fast
1051
+ else "--fast and --no-fast cannot be combined."
1052
+ )
1053
+ raise DelegateError("invalid_option_combination", detail)
1054
+ fast = False
1055
+ i += 1
1056
+ continue
1025
1057
  if token == "--model":
1026
1058
  if model is not None:
1027
1059
  raise DelegateError(
@@ -1132,6 +1164,7 @@ def parse_prompt_tail(
1132
1164
  prompt_file,
1133
1165
  output_schema,
1134
1166
  reasoning_effort,
1167
+ fast,
1135
1168
  progress_intent,
1136
1169
  forbid_commit,
1137
1170
  prompt_parts,
@@ -133,6 +133,16 @@ _OUTPUT_SCHEMA_OPTION = OptionSpec(
133
133
  "FILE",
134
134
  "Codex-only JSON Schema for the final message; also suppresses the completion-report instruction.",
135
135
  )
136
+ _FAST_OPTION = OptionSpec(
137
+ "--fast",
138
+ None,
139
+ "Codex only: request the Fast service tier for this run (higher usage).",
140
+ )
141
+ _NO_FAST_OPTION = OptionSpec(
142
+ "--no-fast",
143
+ None,
144
+ "Codex only: request the Standard service tier for this run, overriding inherited Fast mode.",
145
+ )
136
146
  _PROGRESS_OPTION = OptionSpec(
137
147
  "--progress",
138
148
  None,
@@ -258,14 +268,16 @@ COMMAND_SPECS: dict[str, CommandSpec] = {
258
268
  usage=(
259
269
  "delegate [--json] [--isolation auto|none|worktree] "
260
270
  "codex {safe,work} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] "
261
- "[--output-schema FILE] [--forbid-commit] [--include-dirty] [--prompt-file PATH] [prompt...]",
271
+ "[--fast|--no-fast] [--output-schema FILE] [--forbid-commit] [--include-dirty] [--prompt-file PATH] [prompt...]",
262
272
  "delegate [--json] codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] "
263
- "[--output-schema FILE] [--prompt-file PATH] [prompt...]",
273
+ "[--fast|--no-fast] [--output-schema FILE] [--prompt-file PATH] [prompt...]",
264
274
  ),
265
275
  arguments=(_MODE_ARG, _PROMPT_ARG),
266
276
  options=(
267
277
  _MODEL_OPTION,
268
278
  _REASONING_EFFORT_OPTION,
279
+ _FAST_OPTION,
280
+ _NO_FAST_OPTION,
269
281
  _OUTPUT_SCHEMA_OPTION,
270
282
  _PROGRESS_OPTION,
271
283
  _NO_PROGRESS_OPTION,
@@ -287,6 +299,8 @@ COMMAND_SPECS: dict[str, CommandSpec] = {
287
299
  "Reasoning effort is validated against the resolved model and emitted as a Codex "
288
300
  "config override; with no codex.defaultModel, explicit --reasoning-effort applies "
289
301
  "to the Codex harness default model.",
302
+ "--fast and --no-fast are per-run service-tier overrides. Omitting both inherits "
303
+ "the active Codex configuration; neither changes permissions or reasoning effort.",
290
304
  "--output-schema resolves relative paths from the launch cwd and is native Codex "
291
305
  "schema enforcement for the final message.",
292
306
  "codex.profile is a Codex CLI config overlay; top-level profiles selects "
@@ -519,10 +533,10 @@ COMMAND_SPECS: dict[str, CommandSpec] = {
519
533
  "[--prompt-file PATH] [prompt...]",
520
534
  "delegate [--json] [--isolation auto|none|worktree] "
521
535
  "dry-run codex {safe,work} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--output-schema FILE] "
522
- "[--progress] [--forbid-commit] [--include-dirty] [--prompt-file PATH] [prompt...]",
536
+ "[--fast|--no-fast] [--progress] [--forbid-commit] [--include-dirty] [--prompt-file PATH] [prompt...]",
523
537
  "delegate [--json] [--isolation auto|none|worktree] "
524
538
  "dry-run codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--output-schema FILE] "
525
- "[--prompt-file PATH] [prompt...]",
539
+ "[--fast|--no-fast] [--prompt-file PATH] [prompt...]",
526
540
  "delegate [--json] [--isolation auto|none|worktree] "
527
541
  "dry-run droid [MODEL_ALIAS] {safe,work} [--model <alias-or-model>] [--reasoning-effort LEVEL] "
528
542
  "[--progress] [--forbid-commit] [--include-dirty] [--prompt-file PATH] [prompt...]",
@@ -542,6 +556,8 @@ COMMAND_SPECS: dict[str, CommandSpec] = {
542
556
  _MODEL_OPTION,
543
557
  _REASONING_EFFORT_OPTION,
544
558
  _AGENT_OPTION,
559
+ _FAST_OPTION,
560
+ _NO_FAST_OPTION,
545
561
  _OUTPUT_SCHEMA_OPTION,
546
562
  _PROGRESS_OPTION,
547
563
  _NO_PROGRESS_OPTION,
@@ -562,6 +578,7 @@ COMMAND_SPECS: dict[str, CommandSpec] = {
562
578
  notes=(
563
579
  "dry-run shares the full engine grammar but launches no child process.",
564
580
  "--output-schema is accepted only for codex dry-runs.",
581
+ "--fast and --no-fast are accepted only for codex dry-runs.",
565
582
  "Reasoning effort is resolved from config/cache/bundled capabilities without invoking child binaries.",
566
583
  ),
567
584
  see_also=("cursor", "codex", "droid", "kimi", "claude", "grok", "opencode", "describe"),
@@ -582,7 +599,7 @@ COMMAND_SPECS: dict[str, CommandSpec] = {
582
599
  examples=("delegate run --input-json task.json",),
583
600
  notes=(
584
601
  "Accepted JSON keys: engine, mode, model, cwd, prompt, isolation, "
585
- "reasoningEffort, outputSchema, progress, forbidCommit.",
602
+ "reasoningEffort, fast, outputSchema, progress, forbidCommit.",
586
603
  "Use this for long prompts or programmatic invocation.",
587
604
  ),
588
605
  see_also=("cursor", "codex", "droid", "claude", "grok", "agent-help"),
@@ -1376,8 +1393,8 @@ def render_overview_text() -> str:
1376
1393
  f"delegate [--cwd PATH] [--json] {iso} cursor call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]",
1377
1394
  f"delegate [--cwd PATH] [--json] {iso} droid [MODEL_ALIAS] {{safe,work}} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]",
1378
1395
  f"delegate [--cwd PATH] [--json] {iso} droid [MODEL_ALIAS] call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]",
1379
- f"delegate [--cwd PATH] [--json] {iso} codex {{safe,work}} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--output-schema FILE] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]",
1380
- f"delegate [--cwd PATH] [--json] {iso} codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--output-schema FILE] [--prompt-file PATH] [prompt...]",
1396
+ f"delegate [--cwd PATH] [--json] {iso} codex {{safe,work}} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--output-schema FILE] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]",
1397
+ f"delegate [--cwd PATH] [--json] {iso} codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--output-schema FILE] [--prompt-file PATH] [prompt...]",
1381
1398
  f"delegate [--cwd PATH] [--json] {iso} claude {{safe,work}} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]",
1382
1399
  f"delegate [--cwd PATH] [--json] {iso} claude call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]",
1383
1400
  f"delegate [--cwd PATH] [--json] {iso} grok {{safe,work}} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]",
@@ -1392,8 +1409,8 @@ def render_overview_text() -> str:
1392
1409
  f"delegate [--cwd PATH] [--json] {iso} dry-run cursor call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]",
1393
1410
  f"delegate [--cwd PATH] [--json] {iso} dry-run droid [MODEL_ALIAS] {{safe,work}} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]",
1394
1411
  f"delegate [--cwd PATH] [--json] {iso} dry-run droid [MODEL_ALIAS] call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]",
1395
- f"delegate [--cwd PATH] [--json] {iso} dry-run codex {{safe,work}} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--output-schema FILE] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]",
1396
- f"delegate [--cwd PATH] [--json] {iso} dry-run codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--output-schema FILE] [--prompt-file PATH] [prompt...]",
1412
+ f"delegate [--cwd PATH] [--json] {iso} dry-run codex {{safe,work}} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--output-schema FILE] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]",
1413
+ f"delegate [--cwd PATH] [--json] {iso} dry-run codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--output-schema FILE] [--prompt-file PATH] [prompt...]",
1397
1414
  f"delegate [--cwd PATH] [--json] {iso} dry-run claude {{safe,work}} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]",
1398
1415
  f"delegate [--cwd PATH] [--json] {iso} dry-run claude call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]",
1399
1416
  f"delegate [--cwd PATH] [--json] {iso} dry-run grok {{safe,work}} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]",
@@ -534,7 +534,13 @@ def _policy_field_support_matrix() -> JsonObject:
534
534
 
535
535
 
536
536
  def _engine_capabilities() -> JsonObject:
537
- return {engine: {"outputSchema": engine == "codex"} for engine in KNOWN_ENGINES}
537
+ return {
538
+ engine: {
539
+ "outputSchema": engine == "codex",
540
+ "fast": engine == "codex",
541
+ }
542
+ for engine in KNOWN_ENGINES
543
+ }
538
544
 
539
545
 
540
546
  def _runtime_policy(config: JsonObject, mode: str, engine: str, bypass_check) -> JsonObject:
@@ -832,11 +838,12 @@ def describe_payload(
832
838
  "signature": (
833
839
  "agent(prompt, engine=None, mode=None, model=None, effort=None, "
834
840
  "schema=None, label=None, phase=None, isolation=None, "
835
- "passthrough=False, timeout=None, retries=None)"
841
+ "passthrough=False, timeout=None, retries=None, fast=None)"
836
842
  ),
837
843
  "returns": "parent-facing output string, schema object, or None",
838
844
  "notes": [
839
845
  "engine may be a fallback list; child runs are tagged --group <wfId>.",
846
+ "fast is a Codex-only per-run service-tier preference; non-Codex fallbacks ignore it.",
840
847
  "passthrough=True is explicit and mutually exclusive with schema= and mode='call'.",
841
848
  "cursor/kimi argv transport rejects prompts around 100KB; route large stages to codex/claude/droid/opencode.",
842
849
  ],
@@ -87,6 +87,7 @@ RUN_INPUT_KEYS = {
87
87
  "prompt",
88
88
  "isolation",
89
89
  "reasoningEffort",
90
+ "fast",
90
91
  "outputSchema",
91
92
  "progress",
92
93
  "forbidCommit",
@@ -925,6 +926,7 @@ def request_from_parsed(parsed: ParsedCommand, config: JsonObject, stdin: TextIO
925
926
  isolation_context=None,
926
927
  reasoning_effort=launch.reasoning_effort,
927
928
  reasoning_effort_source="cli" if launch.reasoning_effort is not None else None,
929
+ fast=launch.fast,
928
930
  progress=False,
929
931
  forbid_commit=False,
930
932
  auth_profile_override=global_options.auth_profile,
@@ -1042,6 +1044,7 @@ def request_from_parsed(parsed: ParsedCommand, config: JsonObject, stdin: TextIO
1042
1044
  isolation_context=isolation_context,
1043
1045
  reasoning_effort=launch.reasoning_effort,
1044
1046
  reasoning_effort_source="cli" if launch.reasoning_effort is not None else None,
1047
+ fast=launch.fast,
1045
1048
  progress=effective_progress,
1046
1049
  progress_initial_delay_sec=progress_initial_delay_sec,
1047
1050
  progress_interval_sec=progress_interval_sec,
@@ -1113,6 +1116,12 @@ def request_from_input_json(parsed: ParsedCommand, config: JsonObject) -> Reques
1113
1116
  raise DelegateError(exc.error, "reasoningEffort must be a non-empty string.") from exc
1114
1117
  else:
1115
1118
  reasoning_effort = None
1119
+ if "fast" in raw and engine != "codex":
1120
+ raise DelegateError("unsupported_fast", "fast is only supported by codex.")
1121
+ raw_fast = raw.get("fast")
1122
+ if raw_fast is not None and not isinstance(raw_fast, bool):
1123
+ raise DelegateError("invalid_fast", "fast must be true, false, null, or omitted.")
1124
+ fast = raw_fast if isinstance(raw_fast, bool) else None
1116
1125
  raw_progress_intent: ProgressIntent
1117
1126
  if "progress" in raw:
1118
1127
  raw_progress = raw["progress"]
@@ -1211,6 +1220,7 @@ def request_from_input_json(parsed: ParsedCommand, config: JsonObject) -> Reques
1211
1220
  isolation_context=None,
1212
1221
  reasoning_effort=reasoning_effort,
1213
1222
  reasoning_effort_source="input-json" if reasoning_effort is not None else None,
1223
+ fast=fast,
1214
1224
  progress=False,
1215
1225
  forbid_commit=False,
1216
1226
  auth_profile_override=global_options.auth_profile,
@@ -1348,6 +1358,7 @@ def request_from_input_json(parsed: ParsedCommand, config: JsonObject) -> Reques
1348
1358
  isolation_context=isolation_context,
1349
1359
  reasoning_effort=reasoning_effort,
1350
1360
  reasoning_effort_source="input-json" if reasoning_effort is not None else None,
1361
+ fast=fast,
1351
1362
  progress=effective_progress,
1352
1363
  progress_initial_delay_sec=progress_initial_delay_sec,
1353
1364
  progress_interval_sec=progress_interval_sec,
@@ -1377,6 +1388,7 @@ def build_request(
1377
1388
  isolation_context: IsolationContext | None = None,
1378
1389
  reasoning_effort: str | None = None,
1379
1390
  reasoning_effort_source: str | None = None,
1391
+ fast: bool | None = None,
1380
1392
  progress: bool = False,
1381
1393
  progress_initial_delay_sec: float = delegate_runner.PROGRESS_INITIAL_DELAY_SEC,
1382
1394
  progress_interval_sec: float = delegate_runner.PROGRESS_HEARTBEAT_INTERVAL_SEC,
@@ -1405,6 +1417,8 @@ def build_request(
1405
1417
  reasoning_effort,
1406
1418
  reasoning_effort_source=reasoning_effort_source,
1407
1419
  )
1420
+ if fast is not None and engine != "codex":
1421
+ raise DelegateError("unsupported_fast", "fast is only supported by codex.")
1408
1422
  output_schema = resolve_output_schema(engine, output_schema)
1409
1423
 
1410
1424
  return _build_request_for_workspace(
@@ -1419,6 +1433,7 @@ def build_request(
1419
1433
  isolation_context=isolation_context,
1420
1434
  requested_effort=requested_effort,
1421
1435
  effort_source=effort_source,
1436
+ fast=fast,
1422
1437
  progress=progress,
1423
1438
  progress_initial_delay_sec=progress_initial_delay_sec,
1424
1439
  progress_interval_sec=progress_interval_sec,
@@ -1612,6 +1627,7 @@ def _codex_request_parts(build: EngineBuildInput) -> EngineRequestParts:
1612
1627
  workspace_kind=build.resolved.kind,
1613
1628
  stream_capture=build.stream_capture,
1614
1629
  reasoning_capability=capability,
1630
+ fast=build.fast,
1615
1631
  prompt_transport=PROMPT_TRANSPORT_STDIN,
1616
1632
  output_schema=build.output_schema,
1617
1633
  call_read_only=build.call_read_only,
@@ -1874,6 +1890,7 @@ def _build_request_for_workspace(
1874
1890
  isolation_context: IsolationContext | None,
1875
1891
  requested_effort: str | None,
1876
1892
  effort_source: str | None,
1893
+ fast: bool | None,
1877
1894
  progress: bool,
1878
1895
  progress_initial_delay_sec: float,
1879
1896
  progress_interval_sec: float,
@@ -1912,6 +1929,7 @@ def _build_request_for_workspace(
1912
1929
  requested_effort=requested_effort,
1913
1930
  effort_source=effort_source,
1914
1931
  cache=cache,
1932
+ fast=fast,
1915
1933
  output_schema=output_schema,
1916
1934
  call_read_only=call_read_only,
1917
1935
  model_override=model_override,
@@ -1935,6 +1953,7 @@ def _build_request_for_workspace(
1935
1953
  reasoning_effort_source=parts.reasoning_effort_source,
1936
1954
  reasoning_capability_source=parts.reasoning_capability_source,
1937
1955
  reasoning_transport=parts.reasoning_transport,
1956
+ fast=fast,
1938
1957
  progress=progress,
1939
1958
  progress_initial_delay_sec=progress_initial_delay_sec,
1940
1959
  progress_interval_sec=progress_interval_sec,
@@ -47,6 +47,7 @@ class LaunchOptions:
47
47
  prompt_file: str | None = None
48
48
  output_schema: str | None = None
49
49
  reasoning_effort: str | None = None
50
+ fast: bool | None = None
50
51
  progress_intent: str | None = None
51
52
  forbid_commit: bool = False
52
53
  forbid_commit_implied_isolation: bool = False
@@ -149,6 +150,7 @@ class Request:
149
150
  reasoning_effort_source: str | None = None
150
151
  reasoning_capability_source: str | None = None
151
152
  reasoning_transport: str | None = None
153
+ fast: bool | None = None
152
154
  progress: bool = False
153
155
  progress_initial_delay_sec: float = 30.0
154
156
  progress_interval_sec: float = 60.0
@@ -201,6 +203,7 @@ class EngineBuildInput:
201
203
  requested_effort: str | None
202
204
  effort_source: str | None
203
205
  cache: JsonObject | None
206
+ fast: bool | None = None
204
207
  output_schema: str | None = None
205
208
  call_read_only: bool = False
206
209
  model_override: str | None = None
@@ -30,6 +30,8 @@ REASONING_METADATA_KEYS: MetadataKeyGroup = (
30
30
  "reasoningTransport",
31
31
  )
32
32
 
33
+ SPEED_METADATA_KEYS: MetadataKeyGroup = ("requestedFast",)
34
+
33
35
  SNAPSHOT_STATE_FALLBACK_KEYS: MetadataKeyGroup = (
34
36
  "worktreeStatus",
35
37
  "safeWorkspaceMethod",
@@ -40,9 +42,19 @@ SNAPSHOT_MANIFEST_FALLBACK_KEYS: MetadataKeyGroup = (
40
42
  *PERSISTENT_WORKTREE_METADATA_KEYS,
41
43
  "worktreeCleanupCommands",
42
44
  *REASONING_METADATA_KEYS,
45
+ *SPEED_METADATA_KEYS,
43
46
  )
44
47
 
45
48
 
49
+ class SpeedMetadataCarrier(Protocol):
50
+ fast: bool | None
51
+
52
+
53
+ def add_speed_payload_fields(payload: JsonObject, carrier: SpeedMetadataCarrier) -> None:
54
+ if carrier.fast is not None:
55
+ payload["requestedFast"] = carrier.fast
56
+
57
+
46
58
  class RunMetadataCarrier(Protocol):
47
59
  isolated_workspace: bool
48
60
  isolation_mode: str