v0.50.1
v0.50.1
Patch release: correctness and performance fixes accumulated since v0.50.0, including four fixes for issues reported by the community.
Fixes
-
aft_search/grep: indexed case-insensitive regex search no longer loses Unicode case-folding matches. The trigram index decomposed patterns without the case-insensitive flag, so matches like the Kelvin sign vsKwere pruned before regex verification — the indexed path returned zero results where the fallback found them. -
aft_search: test-file filtering no longer starves results. Candidate selection now excludes test files before the top-K window, so heavily test-matched queries can't crowd eligible production results down to zero. -
Oversized tool responses now resolve instead of hanging (#215). A response over the daemon transport's frame limit previously vanished with only a log line, leaving the call unanswered. Oversized text is now truncated server-side with an explicit notice, and anything still too large returns a structured
response_too_largeerror with steering. -
Post-edit diagnostics no longer serialize the LSP manager (#216). Edits with
diagnostics: trueheld a process-wide lock for up to 10 seconds while waiting on the language server. The wait now runs lock-free; concurrent LSP operations across roots proceed immediately. -
Edits mixing line-range fields with empty find/replace sentinels are accepted (#217). Models that emit
oldString: ""/occurrence: 1alongside a valid line-range edit no longer get rejected with a mixed-modes error; meaningful mixed fields still reject. -
Interrupted downloads no longer block subsequent launches (#213). A lock left by an interrupted first download could brick every launch for up to 8 minutes. Locks held by dead processes are now reclaimed immediately, and the waiter budget outlasts the stale window.
-
Edit diagnostics honesty: warming-phase language-server output is no longer reported as authoritative. Inline diagnostics during rust-analyzer startup stay pending until the server reports quiescence.
-
aft_safetyundo reports created-file removals. Undoing an operation that created a file removes the file but previously reportedfiles 0, reading as a no-op. -
bash_watchpattern offsets are exact under invalid UTF-8. Match offsets were computed on lossily-decoded text, shifting positions after undecodable bytes and occasionally double-delivering sticky watches. -
aft_conflictsno longer misses index-only deleted-file conflicts.
Performance
-
Health probe replies are constant-time. Daemon health replies assembled per-root detail on every probe (~888ms at 50 roots, and slower under load). Diagnostic detail is now served from an off-path cached rollup with a freshness stamp; replies measure ~0.3ms warm and stay sub-millisecond under CPU starvation.
-
aft_callgraphimpact/callers queries are up to 4x faster. Reverse-adjacency lookups now prefetch each traversal frontier in bounded batches instead of one query per visited symbol (2.7s to 0.6s at depth 5 on a 51k-edge graph). -
aft_zoomis ~44% faster per call by borrowing source lines instead of copying every line of the file. -
Daemon response envelopes are ~44% cheaper to build by encoding rendered text once and reusing the bytes.
-
Bash output compression is 17-19% faster on large outputs by eliminating a redundant ANSI-stripping pass and unnecessary short-circuit scans.
-
Session binds skip irrelevant package-manifest scans when callgraph warming is disabled, roughly halving warm bind acknowledgment time.
-
Background scans skip dead-code passes when the callgraph store is disabled, and Tier-2 dead-code projections are cached across unchanged callgraphs (#209).