# v0.30.3 — URL fetching moves to Rust, plus quality-of-life fixes

This release moves `aft_outline` / `aft_zoom` URL fetching out of the TypeScript plugin layer and into the Rust binary, fixing a class of body-stall failures under OpenCode's Bun runtime. It also tightens a handful of long-standing UX rough edges across both plugins.

## URL fetching now happens in Rust

Fetching for `aft_outline({ target: "https://..." })` and `aft_zoom({ url: "..." })` now uses `reqwest` in the Rust binary instead of `undici` in the TypeScript plugin. This eliminates the "body read stalled (no data for 15000ms)" failures that were specific to OpenCode's Bun-bundled runtime — most visibly for `api.github.com`, `registry.npmjs.org`, and large HTML pages.

Network behavior under the hood:
- TLS via `rustls` with a 30-second connect timeout.
- 15-second per-chunk body stall timeout.
- SSRF guard (private/loopback/link-local rejection) preserved.
- New: up to 2 silent retries on transient connect/transport failures. TCP connect blips and momentary TLS hiccups no longer surface as errors to the agent; HTTP 4xx/5xx and SSRF rejections still pass through immediately.
- JSON responses are now accepted, so npm registry endpoints and unpkg package metadata can be outlined directly. Top-level keys appear in the outline.

## Fresh-install announcements no longer spam

The version-announcement dialog (the "What's new in v..." panel) used to fire on every restart in ephemeral environments — Docker containers, CI sandboxes, disposable dev containers — because they had no record of any previous version. First-time users on a brand-new install saw the same dialog with changelog bullets they had no context for.

Fresh installs now silently record the current version and suppress the dialog. Real upgrades from an older recorded version continue to fire as expected. The shared helper lives in `@cortexkit/aft-bridge` so OpenCode and Pi stay in lockstep.

(Same fix pattern as `cortexkit/magic-context#99`.)

## Notifications carry the current agent (#62)

Ignored messages (configure warnings, auto-update notices, startup announcements, status messages) now carry the active agent identity. Previously, when the user had switched to a non-default agent through `oh-my-openagent` or a similar extension, these one-way messages still appeared under the default agent label in the UI. Background-bash completion reminders were already correct; this brings the rest of the notification surface to parity.

## Bun-test failure markers survive `bun run` wrappers

When a `package.json` `test` script calls `bun test` and the agent invokes it through `bun run --cwd packages/foo test`, the bun output compressor used to drop the `(fail) ...` markers — agents would see only a summary like `2 fail / Ran 940 tests across 82 files` and have to re-run with `| grep fail` to see what actually failed. The compressor now detects bun-test output by its private summary line and preserves failure context regardless of how `bun test` was invoked.

## Acknowledgements

`@cortexkit/aft-bridge`, `@cortexkit/aft-opencode`, `@cortexkit/aft-pi`, `@cortexkit/aft`, `agent-file-tools`, `aft-tokenizer`, and the platform binary packages all ship at `v0.30.3`.
