You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Project instructions: aish loads AGENTS.md from the repository root and from the directories in use (including @-style file pointers), injects them prefix-cache-safe, and refreshes that directory context as you cd. /instructions prints the current state and loaded files, /instructions off disables project instructions for the session and clears every injected block, and /instructions on re-discovers them on the next turn. (#562, #590)
New web_search tool: queries the web through a fallback chain (keyed providers first, then credential-free Bing and DuckDuckGo) and returns a bounded, deduplicated list of candidate sources with title, URL, snippet, and fetch time. Output is capped at 4 KB and page text is rendered as untrusted data. (#566, #576)
Fixed
aish update and the startup update notice read the latest version from https://www.aishell.ai/repo/latest instead of cdn.aishell.ai. Release bundles download from GitHub Releases, then from the official site. AISH_DOWNLOAD_BASE_URL (or AISH_REPO_URL) and AISH_BETA_DOWNLOAD_BASE_URL still add a mirror using the previous /releases/<version>/ layout. A GitHub connection that does not complete within 30 seconds falls through to the official site; a transfer already in progress still has 300 seconds. CDN /latest was still serving 0.3.13 after 0.3.14 shipped (#561).
aish -c preselects the last session the user attached to instead of always defaulting to "create new session". The attach success is remembered in ~/.cache/aish/last-attach-session; repeated aish -c runs land on the same session without re-picking, and the default falls back to "create new" when that session is gone or no attach was recorded.
TUI panels no longer panic on terminals shorter than 7 rows. ChoicePanel, SearchSelectPanel, and SettingsPanel clamped (MIN_PANEL_HEIGHT, terminal_height) with min > max, which panics; the upper bound is now applied before the minimum (same fix SkillPanel already had). Found while testing aish -c under expect.
/model closes its picker after Enter instead of reopening it. The switching branch kept looping back into the panel, so the switch message was followed by a fresh list that kept consuming keystrokes (searching, No matches) until Esc. Enter now ends the picker for both a real switch and a re-pick of the current model; a (add account) and m (manage) still return to the list, and Esc still cancels without changing the model.
Running commands now follow terminal window resizes. The child PTY was only sized before the command started, so a full-screen program (omp, vim, htop, …) kept drawing for the old width after a resize and its frames wrapped into duplicated lines on the real terminal. Sizes are checked every 100 ms while the command runs and the child's foreground group is signalled. terminal_resize_mode is now honored on this path: off also skips the pre-command sync so the geometry stays frozen.
Terminal device queries (ESC[6n, ESC[c, ESC[>c, ESC[…$p, …) are no longer deleted from a command's output. Full-screen programs measure the surface, anchor their live region and detect host-side resizes from the terminal's answers; stripping the requests made them fall back to degraded repaint modes (TSP: terminal did not confirm the surface, resize anchor … cpr=timeout).
A command's newline is no longer translated twice on its way to the terminal (printf 'A\nB\n' used to display as A\r\r\nB\r\r\n). Both the child PTY's slave and the real terminal applied OPOST|ONLCR; the relay now compensates for the second translation.
Answers to terminal device queries are still kept out of line-oriented commands, but the filter moved from the output side to stdin: reports are dropped until a command shows full-screen behaviour (alternate screen, hidden cursor, mouse tracking, bracketed paste, synchronized output, APC) and then forwarded, so TUIs receive their answers while cat/read/pagers never see them echoed or executed. A prefix held back as a possible report is handed to the child after 500 ms (and a fingerprint split across two reads still counts), so genuine input is never withheld.
Backend command payloads no longer glue the command and its pager-restore suffix onto one line, so a trailing & or a heredoc terminator no longer corrupts the persistent shell, wedges follow-up commands behind a stuck PS2 continuation, or waits out a ~1-year timeout. The restore is deferred until after the command reaches a terminal state so read/cat cannot consume it, the bash tool's default wait is bounded at 3600 s, and Ctrl+O output panels open reliably even when the terminal does not answer cursor-position queries. (#541, #555)
/export keeps the full AI conversation across context compaction: turns absorbed into a summary are recorded in a new append-only transcript and no longer vanish from the export, older sessions still fall back to the previous snapshot, and an incomplete transcript is surfaced as a warning. (#530, #556)
A turn that stops at the tool-iteration limit keeps its completed tool calls and results in the session instead of dropping them, so the model does not re-run side effects that already happened. (#572)
A sub-agent that ends in Fatal now prints the failure category and the completed-tool summary instead of ending the turn silently. /token and the footer track provider cache hits separately, so cached tokens no longer inflate input usage. (#579, #580)
The shell keeps sudo/su command text intact on every input path, popup recovery included, so quoted spaces survive and a command is never recorded as a success without running; a blocked builtin no longer adds a second history row with exit code 0. Shell state is copied from the session after a compound line that starts with cd, export, or unset; state reads no longer depend on an external base64 (a missing or incompatible one could wipe the process environment); and a variable the session unset is removed from the process on the first read. (#546, #574)
The prompt's git-dirty check no longer blocks rendering: a cache hit returns immediately and a stale entry returns the last known value while a single background refresh runs, so the prompt never stalls and the dirty dot lags by at most ~2 s. (#599, #600)