v0.1.4
Added
-
findandgrepanswer from a resident file index instead of spawning
fd/rgper call. A watcher-backedfff-searchindex is built lazily per
search root, ranks hits by frecency, and serves the next search out of warm
memory: measured on this repo,find9.7ms againstfd's 17.8ms andgrep
17ms againstrg's 95ms, with identical result sets. The tool surface does
not change — anything the index cannot answer exactly (a non-git root,
ignoreCase, a negated or depth-anchored glob, an invalid pattern, a file
target) falls straight through to the old lanes, and a cancel still stops at
once instead of waiting out a cold scan. Design and decline rules:
docs/fff-search-index.md. -
gray view PATH...shows an image file as an image (downscaled to the 2000px
cap, the one shared with thereadtool and pasted attachments). Theview
tool that 9ae15d3 deleted comes back as a command: bash's one vision path
now claimsgray view <path>...before the shell runs, alongside
cat <path>(full resolution) — so an agent checking a rendered chart,
screenshot or diagram gets an image instead of pixel soup, with no new tool
in its toolset. Multi-path by design; a leading~is expanded, since
nothing else would do it before the shell runs. -
gray view movie.mp4shows a contact sheet of sampled frames, so an agent
can see a recording without shipping the whole file into the context;
--frames Nsets how many. Gemini and Gemma models get the native video
instead of the sheet, and an oversized file says so rather than silently
downscaling past the cap. -
/gatewayis the connections picker: every installed app, its own status,
and Enter on a needs-setup row runs that app's setup — the channel picker
covers DMs, setup is token-first, the configs an app writes land in the
user's home rather than gray's, andgray gateway setup <app>does the same
headlessly for scripts. -
gray --json progressnarrates a turn:tool_started/tool_ran/
tool_finishedrows carrying disclosed, bounded, redacted output plus the
internal call id, andthinkingphase rows. A front end can render live
tool activity and a separate persistent tool card without parsing prose. -
Memory carries a turn: a one-sentence profile summary is injected with it,
the prompt asks the model to show a memory's KEY before leaning on it, and
the daily ingest is mechanical and bounded — append-only edits, daily caps,
and no verbatim duplicates under a new key. -
Provider plugins join the plugin protocol at 1.2: host-owned credential
refs, sidecar RPCs, cache/runtime roles,/connectplugin login, and an
OpenAI dynamic provider profile. Codex/ChatGPT OAuth ships as a first-party
optional plugin (plugins/codex-auth), so/connectdiscovers auth
providers only when one is actually installed and enabled.
Fixed
-
An interrupted sidecar or provider stream no longer turns a usable partial
answer into an error. A provider stream that ends without its completion
marker is finished with a capped, nonfatal interruption notice rather than a
CoreError, because the visible delta is already committed to history and
replaying it would duplicate text the user read. On Windows a blocked pipe
write is bounded by a worker task instead of stalling the runtime thread, so
cleanup can actually terminate the child; child termination after a write
timeout is bounded, and an already-exited child id no longer wedges cleanup. -
The default prompt points the agent at
gray view, notcat, for images —
catstill returns bytes, but the agent is told which one to reach for. -
Prompt caching drops two pieces of pi-parity over-engineering
(cache_controlmasking andx-session-id), and/resumepreviews the
latest message of a session rather than its opener. -
A 23-finding source audit landed with its sweep: drive-named archive entries
refused on every platform, symlink-cycle and atomic-pid-claim guards,
serialized config read-modify-write, a log-rotation guard that acquires
before it opens, and the remaining secret-redaction gaps in tool output.
Dispositions:docs/audit-fixes-2026-09-22.md.