Highlights
Gemini: recover when a step ends without a finish reason (#121, #122)
Vertex Gemini sometimes ends a model step with no finish reason: thought chunks only, sometimes with an error embedded in a 200 stream. The CLI used to resend the conversation ending on the model's own turn, which Vertex rejects with 400 Requests ending with a model turn are not supported, and the session failed.
- A step that ends
unknownwith no visible output (no text, no delivered tool call) is now a retryable error, subject to the normal retry limit. - Before retrying, the failed attempt's parts are removed and its usage is rolled back. Repeated identical tool executions still trigger the doom-loop guard across retries.
- An
unknownfinish that produced text is treated as finished (stop), so the answer isn't regenerated. - For Gemini targets, including Gemini behind a gateway, OpenRouter or another proxy, a trailing assistant turn without a tool call is never sent. The MAX_STEPS instruction is sent as a user turn, and a hard step cap stops the loop.
- Terminal provider errors no longer carry raw response headers or bodies.
Verified against real Vertex with fault injection: every injected and natural fault recovered.
Headless (run --format json)
- New
retryevent{attempt, code, next}with a stablecode(no_finish_reason,rate_limited,overloaded,server_error,network,unknown). It never contains raw provider text. Additive;schemaVersionstays"1". - Headless runs now fail (exit 1) when the provider ends with an
errororcontent-filterfinish, or when unknown-finish retries are exhausted (#108, #113). step_finishgains an optionalterminationobject with safe provider finish diagnostics. Request IDs are reported only as present or redacted (#109, #114).- Tool-call truth: the loop no longer stops on
stopwhile delivered local tool calls are outstanding, and a failed subagent now fails its parent task (#89, #116). - Optional model stream idle timeout (#80, #117): off by default. Set
AICTRL_MODEL_STREAM_IDLE_TIMEOUT_MS(e.g.300000) to fail a stalled stream withreason: "timeout",code: "MODEL_STREAM_IDLE_TIMEOUT". The timer pauses while tools run.
See EVENTS.md for the full event contract.
Providers
- Vertex (#118): a scoped auth client that's reused and loaded lazily; validated projects and locations, including the regional
us/euendpoints;google-vertex-anthropicgets the same handling. An invalid Vertex configuration now affects only the Vertex providers, not every provider. - Gemini schemas are normalised for non-native transports (#111, #119).
Other
- The manual AI review workflow is hardened; the automatic review trigger is removed (#120).
- UTM tracking added to website links (#107).
Full changelog: v0.4.3...v0.4.4