Skip to content

aish v0.3.15

Choose a tag to compare

@github-actions github-actions released this 14 Oct 08:21
· 33 commits to main since this release

Added

  • 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)