v0.46.0
AFT v0.46.0
96 commits since v0.45.1. This release hardens the daemon (subc) execution path end to end, fixes a broken TUI sidebar on current OpenCode versions, and unifies storage resolution across all entry points.
OpenCode TUI sidebar fix
OpenCode 1.17.x stopped applying its Solid compile-time transform to plugins loaded from the package cache, which broke the AFT sidebar in two ways: installs with a stale plugin cache failed at import, and fresh installs rendered once and froze (values never updated). The TUI is now precompiled at build time against the host's runtime modules, with a loader that falls back to raw TSX for older hosts and development checkouts. The release pipeline gained a packed-install smoke test that verifies the compiled path is reactive, so this class of breakage cannot ship silently again.
Daemon path hardening
The subc transport arc that started in v0.45 is now production-shaped:
- Typed elicitation capability: bash permission prompts over MCP hosts (e.g. Claude Code) activate from the
consumer_capabilitiesfield introduced in subc-protocol 0.8. Hosts that do not declare the capability fail closed. - Bind responsiveness under load: artifact-owner heartbeats moved off the per-root mutating lane to a dedicated timer thread; maintenance drains are decomposed into bounded jobs with batch caps; a pending bind now defers maintenance for its root instead of queueing behind it; and overdue binds receive an explicit deadline error instead of hanging.
- A production-shaped rebind storm test rig (multiple roots and sessions rebinding over a slow embedding backend) now gates releases, asserting bind acknowledgment, tool, health, and completion push latencies.
- Killed daemons on Windows surface as connection resets rather than clean EOF; the module now treats both as a clean close, matching Unix behavior.
One storage universe
Plugin-less invocations (the daemon-supervised module, aft warmup, bare CLI) resolved storage to the legacy ~/.cache/aft fallback instead of the CortexKit data root the plugins use. Each front paid its own cold indexes, and artifact-owner leases could not see each other across the split. All fallback sites now resolve to the same CortexKit data root, locked by a regression test.
Search and inspect
- Cross-root search (multi-project sessions) now serves borrowed indexes with drift warnings instead of failing when checkouts differ in untracked ignore files; nonexistent paths return
path_not_found. - Duplicate detection has a 10-line minimum span, ending flags on 3-4 line idiomatic blocks. The dead
inspect.duplicatesconfig knobs were removed. - Cheaper directory outlines (top-level symbols only) and callgraph summaries (top-15 with a summary line past 20 entries), with tests hidden by default across both.
Fixes
- Search index changes now persist on clean shutdown. The in-memory trigram delta is flushed to the shared cache when a bridge or daemon module exits cleanly, so restarts and cross-worktree searches see current results instead of the state at the last background compaction.
- TUI sidebar now works when the TUI is attached to a serve/Desktop host from a different directory. The sidebar's status lookup and push subscription follow the session's verified project directory to the process that actually hosts the bridge, instead of staying stuck on the lazy-spawn placeholder.
aft_deleteaccepts stringified booleans forrecursive(and all boolean tool parameters coerce consistently).- Batch
edits[]support on Pi's edit tool, matching OpenCode. aft_outlineaccepts array-coercedtargetparameters.- Bash pipelines route to raw generic output instead of risking failure-hiding head-token compression; empty command output is never fabricated into non-empty summaries.
- Grep-nudge no longer fires on suppressed-output commands.
- The
/aft-statusdialog no longer resets the session's selected model on OpenCode Desktop. - Windows: fixed three CI-only test failures (verbatim path as git clone source, a process-global env-var race between parallel tests, and a resulting poison cascade).