v0.37.1
v0.37.1: Responsive waits and bridge polish
A patch release focused on staying responsive: sending a message now interrupts a blocked watch, slow embedding backends get their configured headroom, and the bridge keeps its dispatch thread free of background work.
Your message wins over a blocked watch
If the agent is blocked in a synchronous bash_watch wait when you send a message, the wait now aborts immediately and converts itself to a background watch — the agent processes your message right away, and the original notification still arrives when the task finishes or the pattern matches.
Readable web pages in aft_outline and aft_zoom
HTML-only pages (Docusaurus blogs, docs sites) are now converted to Markdown at fetch time. Previously these pages dumped raw HTML into context, and zoom-by-heading failed because headings absorbed invisible permalink anchors. Outlines now come out clean, sections zoom by their visible heading text, and code blocks render as language-tagged fences. Markdown-native URLs are unchanged.
Semantic index responsiveness
semantic.timeout_msis honored up to the real transport budget (55s) instead of being silently clamped to 25s — slow local backends (LMStudio cold-loads) keep their configured headroom, and background refresh batches stop getting aborted mid-embed.- Full-corpus refreshes (after
.gitignore/.aftignorechanges) no longer walk the project on the bridge's request thread — the walk happens on the refresh worker, so other tool calls aren't blocked behind it. - Loading a large index verifies file freshness in parallel on a bounded pool, shaving startup time.
Bash output protection covers more commands
The pipe protection that keeps bun test | grep fail from hiding failures now also recognizes env-prefixed runners (CI=1 bun test), bun --cwd <pkg> test, mvn clean test, and multi-task rake invocations (rake db:setup test) — with the same fail-closed safety rules for redirections, substitutions, and side-effectful filters.
Fixes
- Background bash multi-command scripts now execute from a script file instead of shell argv, removing quoting and length edge cases, with a regression test asserting every command's output lands in the raw capture file.
- Bridges with a crashed or timed-out process no longer pin themselves against idle eviction through leftover background-task bookkeeping.
/dev/fd/paths in bash permission checks accept only numeric descriptors (/dev/fd/2) — path-traversal shapes like/dev/fd/../sdastill ask.- The JSONC config schema now includes the
inspectblock andlsp.diagnostics_on_edit, so editors stop flagging valid config. - Two C libraries dropped from the dependency tree (oniguruma regex, and the C++ half of esaxx): the tokenizer now uses pure-Rust backends, trimming build complexity with byte-identical tokenization (regression-tested).