v2.24.0

Released August 25, 2026 · View on GitHub →

A rejected API key made an agent run look like it had simply run out of steps: every request was retried, the budget drained, and the report blamed the iteration limit.

Fixed

agentChat threw a bare Error for any failed HTTP response, so the retry loop's "never retry a 4xx" branch — which tests err instanceof ApiError && err.status — never applied. An expired key was retried once per iteration and the run then reported Exceeded maximum of N iterations: the one explanation with nothing to do with the cause. A run that used to burn twenty-five requests over six minutes now stops on the first, saying 401.

reads a cache that only loadAllApiKeys fills; it does not consult the environment itself. The fix agent started without that call, so every request went out with an empty bearer token. In CI this looked exactly like a model that would not do the work, with a perfectly valid key sitting in the environment the whole time.

what did not happen and never what did. It now counts the agent's tool calls, separates failures from successes, and quotes the first failure — usually a refusal, and usually the entire explanation.

Changed

byte — a deliberate separator written as a raw byte rather than \u0000 — which made grep, file and diff viewers treat the whole file as binary and silently skip it. Same behaviour, same separator, now searchable.

Downloads

Install with npm install -g codeep@2.24.0 or brew install vladoivankovic/codeep/codeep.