Skip to content

v0.49.1

Choose a tag to compare

@github-actions github-actions released this 06 Aug 08:00
· 1620 commits to main since this release

v0.49.1

Patch release: contributor fixes, Windows correctness, and accumulated loop fixes.

Fixed

Windows: LSP servers failed to spawn under extended-length paths (#174). CreateProcess rejects \\?\-prefixed working directories, so every language server spawn on Windows died with "The system cannot find the path specified", and the git root-commit probe failed under the same roots. Workspace roots are now normalized before spawning. Fixing the spawn surfaced deeper consequences of the same path-form mismatch, all fixed: workspace/didChangeWatchedFiles was silently skipped (config edits never reached running servers on Windows), scoped inspect diagnostics could drop every result, dead-code liveness lost call edges for declared Cargo bins, forced re-scans served stale results for mtime-preserved edits, tsconfig build-exclusion filtering flipped with path spelling, and the status bar could drop diagnostics before filtering. The whole LSP and inspect surface now shares one canonical path form.

Deferred bash responses starved behind runtime maintenance (#172, PR #173 by @hheei). A completed foreground bash task could sit unanswered until the host transport timed out because the NDJSON loop ran maintenance before flushing ready responses. Ready responses now flush both before and after maintenance, and post-write LSP notifications no longer block on cold server startup.

Permission rules with absolute out-of-root paths never matched (PR #175 by @iceteaSA). Targets outside the project root were relativized into ../ chains no absolute rule could match; they now stay absolute, so rules like "/tmp/**": "allow" work.

Grep footer fires only where it helps (PR #176 by @iceteaSA). The "use aft_search" footer no longer appears for single named files, paths outside the indexed root, or files modified within the last 60 seconds.

Semantic search degradation names its reason (#177). When query embedding times out on a slow provider, the fallback now says so — including the configured budget and the semantic.query_timeout_ms setting that raises it — instead of a bare "fully degraded". The query timeout is also documented in the config reference alongside the index-build timeout.

edit rejected valid calls carrying empty optional fields (#171). Hosts that send appendContent: "" or edits: [] sentinels alongside a real single edit no longer get a mode-conflict error; empty sentinels are stripped at both boundaries, while symbol with empty content still means deletion. This also covers models that serialize the entire schema with type-default values — an edits array containing only all-empty placeholder items no longer claims the edits mode, and the mode errors now say to omit unused optional fields.

Qwen via LiteLLM/vLLM rejected requests with "System message must be at the beginning" (#150). AFT's workflow hints now append to the initial system message instead of adding a second system entry.

Semantic embedding client trusts the OS certificate store (#168). Custom and corporate CAs (and SSL_CERT_FILE on Linux) now work; the platform verifier replaced static webpki roots, shared process-wide so keychain evaluation is paid once.

Changed

  • aft_outline and aft_zoom signature lines no longer carry a redundant visibility/kind prefix — the signature itself carries that information. Entries exported without a visibility keyword in their signature (e.g. TypeScript export lists) keep a minimal E marker. Around 5% fewer output tokens on typical outlines.
  • read's per-tool output is unchanged, but apply_patch no longer eats one trailing newline from files with multiple, and CRLF files keep their line endings under patches (majority-convention detection).
  • Command lists joined with ;, &&, or || under a specialized output compressor (cargo, git, ...) no longer lose the output of every command after the first — about a quarter of real-world bash commands are such chains.
  • Background pattern watches (bash_watch) survive daemon restarts: stream offsets and pending matches persist and re-arm.

Internal

  • The OpenCode E2E pin moved from 1.15.10 to 1.18.13, and the weekly bump workflow opens PRs again (first success in its history).
  • Orphaned callgraph build temporaries are now swept by age at publish time across store layouts (a 15 GB accumulation class).
  • CI failure forensics: test-harness exit timeouts now capture the child's stderr tail, pid, wait duration, and kill-time liveness.
  • A repo-wide audit of path canonicalization classified 142 sites; the 7 remaining latent mixed-form risks are tracked for a follow-up wave.