# v0.30.1

Patch release. Three classes of user-facing fixes: bash PTY parameter handling, LSP failure diagnostics, and Windows plugin auto-update.

## Bash — PTY parameter handling

Agents that defensively included `ptyRows` or `ptyCols` on regular (non-PTY) bash calls were hitting a strict validation error. Some models tried to "fix" it by adding `pty: true` to non-interactive commands, which auto-promoted them to background and broke inline output.

- `ptyRows` and `ptyCols` are now soft-ignored when `pty` is unset or false. The dimensions are only applied when a PTY is actually requested.
- `pty: true` now implies `background: true`. The two flags no longer have to be set together.
- Out-of-range or non-integer values return a clean error naming the allowed bounds (e.g. `ptyRows must be an integer between 1 and 60`).
- Tool descriptions for `ptyRows`/`ptyCols` clarify they apply only when `pty: true`.

## Plugin tool schemas

All optional numeric parameters across the OpenCode plugin (bash, read, aft_search, aft_navigate, aft_zoom, aft_outline, refactor, lsp_diagnostics) now use a JSON-Schema-representable bounded integer schema. Empty sentinels (null, empty string, zero) are rejected at validation with a clear message instead of silently being coerced or — as in an earlier internal build — causing the plugin to fail to load.

A schema-conversion regression test now covers every registered tool, so any future change that introduces an unrepresentable shape will fail before release.

## LSP — failure visibility

When an LSP server fails to start, AFT's response now surfaces stderr output captured from the child process. Previously, broken language-server shims (such as a `typescript-language-server` whose `cli.mjs` was missing) returned opaque `spawn_failed` errors without context.

- Stderr from LSP children is captured in a bounded ring buffer and included in failure responses.
- When stderr contains `MODULE_NOT_FOUND`, the response adds a hint pointing at the likely fix (reinstall the package-manager binary, or check the `lsp.servers.<name>.binary` path).
- Clients that crash after a successful initialize are now marked as failed so subsequent file requests stop re-issuing pulls against the dead pipe.

## Auto-update on Windows

Plugin self-update used `spawn("npm")` directly, which fails on Windows because the binary is `npm.cmd`. The auto-update path now resolves `npm.cmd` on Windows (same fix shape as the v0.28.2 LSP install correction).

- `npm install` stderr is captured on failure for diagnostic visibility.
- `--ignore-scripts` is now passed to the install (matches the LSP install hardening).

## Other

- `aft_outline`/`aft_zoom` URL fetch keeps the 15-second body-stall safety net that landed in v0.30.0.
- Subagent sessions continue to silently convert `background: true` bash to foreground (introduced in v0.30.0), because subagents have no completion-reminder mechanism.
