Skip to content

v0.3.2

Choose a tag to compare

@Abdul-Omira Abdul-Omira released this 29 Aug 07:33
· 72 commits to main since this release

Everything below is in this build. Cut from 96b40f40ec.

Tool calls that arrive as text

Some OpenAI-compatible servers (a vLLM/SGLang deployment started without --tool-call-parser) stream the model's tool call through as prose, with finish_reason: stop. The tool never runs and the turn just ends.

Koder can now read the call back out of the response as it streams and run it — behind KODER_LIFT_TEXT_TOOL_CALLS, off by default. All three formats in the wild are covered: hermes (JSON), qwen3_xml, and glm45. The server-side parser flag is still the supported fix; this is for when you can't reconfigure the server.

Bounded deliberately: OpenAI-compatible providers only, registered tool names only, never the reasoning channel, and it stands down the moment the server sends a structured call. Permissions apply to a lifted call exactly as to any other. (#671, #704, #706)

Tools

  • grep gained output_mode (content/files_with_matches/count), context, head_limit, case_insensitive, multiline and type. Count mode said "showing first N" while sorting by count — it now says "top N by count", because that's what it does.
  • read renders Jupyter notebooks cell by cell with outputs, and bounds PDF, image and notebook sizes.
  • glob takes a limit.
  • apply_patch derives its guard, permissions and writes from one write-set. (#682, #697, #701)

Providers

  • Claude subscription bridge rejected valid OAuth logins on every turn. --bare skips the keychain read that subscription auth depends on. Dropping it fixes login — and means your own Claude Code hooks now execute in that subprocess and your CLAUDE.md enters its context, which the spawn-time warning now says. fable is offered in the picker. (#676)
  • Model family resolution, with sampling keyed on it. (#674)
  • aiXplain is priced by what it actually charges; two accounting holes closed. (#662)

Sessions and cost

  • Subagent spend is included in cost readouts, updated live, and forks start at zero. (#623)
  • External git mutations are attributed in session diffs via a head-gate. (#616)
  • Out-of-scope writes are captured so sibling edits are diffable and revertable. (#678)
  • An observe-only session.compacted trigger. (#668)

App and TUI

  • Context usage moved to the composer; the session progress bar is gone. (#703)
  • Redundant working spinners removed across the UI. (#705)
  • Slash-command parity between TUI and desktop. (#669)
  • Visible subagent stop controls, revert gating, and a pre-run abort race fixed. (#681)
  • In-flight draft send marker; timeline row memos guarded against vanished group keys. (#673, #675)
  • Stale QUEUED badges hidden on idle sessions. (#621, #627)

Security and correctness

  • Benchmark submissions authenticate before they validate. (#686)
  • pacote re-locked at 21.5.1 for GHSA-w4pp-8pjf-rmxw. (#679)
  • dev.aiXplain.com no longer hardcoded in product code. (#698)
  • Ten harness accuracy findings: read-before-edit, prompt scoping, compaction digests. (#660)

Internal

  • A harness for telling whether a harness change actually helped. (#664, #687, #690)
  • Work items carry the command that would prove them done. (#685)
  • Structured subagent handoff by default. (#684)
  • no-unused-vars extended to app, ui, provider and session — it immediately caught dead code that two in-flight PRs would each have left behind. (#707)
  • Worktree disk usage capped; interrupted subagent worktrees reported. (#625)

Full changelog: v0.3.1...v0.3.2