Repository navigation
v0.3.2
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,multilineandtype. 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.
--bareskips 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.fableis 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.compactedtrigger. (#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)
pacotere-locked at 21.5.1 for GHSA-w4pp-8pjf-rmxw. (#679)dev.aiXplain.comno 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-varsextended 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