Skip to content

0.7.0 — 2026-09-21

Choose a tag to compare

@github-actions github-actions released this 21 Sep 16:15

Release Notes

Added

  • Typed content-freshness flags on search, contents, and similar:
    --max-age-hours N (-1..=720), --fresh (maxAgeHours: 0, always crawl),
    --cache-only (maxAgeHours: -1), and --livecrawl-timeout MS. The default stays
    cache-first and the request body is unchanged when none of the flags are given. A merged
    body carrying the deprecated livecrawl field warns, and livecrawl with maxAgeHours
    is rejected locally. The contents recovery hints now emit a --fresh that actually
    parses; every emitted nextActions and suggestedCommand is parsed through the real
    command tree in tests, including warning-derived ones.

  • Exa Snapshot support: --snapshot-as-of DATE_OR_DATETIME on search, contents, and
    similar (nested under contents for search/similar, top-level for contents). Snapshot
    conflicts are rejected on the merged body: maxAgeHours, livecrawl, livecrawlTimeout,
    subpages, and for search any category or a type other than auto/fast/instant.
    Snapshot plan, contract, and trial error tags classify as feature_not_enabled on 402/403;
    SNAPSHOT_RATE_LIMIT_EXCEEDED classifies as a rate limit. Snapshot access remains subject
    to Exa plan entitlements.

  • websets preview --search <true|false>, sent as the URL query parameter the corrected
    upstream spec now declares. It defaults to true when the body carries search.count,
    which preserves the previous behaviour. capabilities reports request placement (in)
    for query parameters.

  • Vendored specs re-verified 2026-09-21: the public spec kept 64 operations and gained
    snapshotAsOf, explicit 503 SERVICE_OVERLOADED responses on the four core endpoints,
    and a factored stream/output schema set; the admin spec changed in prose only.
    xtask vendor-spec now normalizes the admin YAML in Rust (serde_yaml_ng, dev-tool only)
    instead of shelling out to Ruby, so the re-vendor runs on hosts without Ruby. The shipped
    binary still carries no YAML parser.

  • websets exports create|get and context warn (undocumented_upstream) that their routes
    are no longer documented by Exa as of 2026-09-21 and are absent from the official SDKs.
    The exports route returned a route-level 404 on a live probe and may have been retired;
    /context still works. Both stay available pending an upstream statement.

  • Batch create, list, get, cancel, and delete commands, plus early Agent run stop.
    Batch wrappers are validated locally over the merged body (--requests, --body,
    --set, or a preset may supply requests), completed-list filters survive
    pagination, and commands add their required beta tokens. Batch and stop access
    remains subject to Exa account entitlements.

  • Answer model, system prompt, and country flags; the Polymarket Agent data source;
    monitor domain filters; Dynamic Highlights JSON and file input with beta and
    option-conflict checks.

  • Follow-up commands for created resources and remaining pages. Continuations retain
    filters and explicit profile/beta settings without copying API keys or output paths.

  • Linux static release artifacts for x86_64-unknown-linux-musl and
    aarch64-unknown-linux-musl, alongside the existing glibc builds. The shell installer
    prefers the glibc archive and falls back to musl when the host's glibc is older than the release's recorded minimum
    or absent, so containers without glibc now get a working binary. Existing glibc users
    receive the same -gnu archive as before.

  • CI gains a Linux static lane that builds the musl target, fails unless the binary has no
    PT_INTERP segment and no NEEDED entries, and runs the result on an Alpine image; a
    guard rejecting -C target-cpu/-C target-feature in the build environment or the
    repository's cargo config; an offline cargo xtask vendor-spec --check gate over the
    vendored specs, overlay, and openapi/provenance.toml; and a check that the generated
    release.yml still matches dist-workspace.toml.

  • --max-response-bytes and config max_response_bytes: a 64 MiB default ceiling
    on decoded success bodies, gzip, and entire SSE streams/JSON fallbacks. Oversize
    responses return nonretryable response_too_large (exit 5), preserving HTTP error
    classification and ambiguous-create recovery. Invalid/zero caps remain exit 1.

  • contents --jobs supports 1-16 workers (default 1) for --chunk-size requests.
    Output stays in input order and retains every admitted result after a failure.
    One --output destination holds all successful chunk renderings, preserving
    modes, symlinks, and completed data on later failure.

  • permissions.state reports accessible state files and group/world-writable
    managed directories, including the credential directory, without changing modes
    or following child-directory symlinks.

Fixed

  • The generated agent skill now explains the auto-spill envelope: when output crosses
    --max-output-bytes, data is null and the file at dataPath holds the former data
    object, so results live at .results there (or pass --output FILE / --max-output-bytes 0
    for the inline shape). Extractors that read .data.results from the spill file returned
    nothing.

  • Healthy doctor test fixtures explicitly create private managed directories;
    writable-directory diagnostics remain report-only.

  • Chunked contents rejects stream:true before sending or touching output, and
    explicit --jobs requires --chunk-size. Failed writes roll back partial
    records on regular files, including targets created through dangling symlinks.

  • Account feature-access failures now return feature_not_enabled, distinct from
    a rejected credential. This follows a live Batch API entitlement refusal.

  • Schema refresh decides drift on canonical JSON (embeddedCanonicalSha256 and
    liveCanonicalSha256) rather than on formatting-dependent byte hashes;
    embeddedSpecSha256 stays as provenance for the vendored file.

  • contents --text URL and interleaved URL lists now treat --text as bare text
    retrieval, while retaining --text full, numeric caps, and explicit --text=....

  • Recovery and pagination actions retain safe request scope, withhold private headers
    and filters, and stop offering a cursor after the pagination loop rejects it.
    Batch creation never auto-retries without a documented deduplication guarantee.

  • Auto-paginated NDJSON now honors --output, retains completed pages on later
    failures, and avoids collecting the entire result set in memory. Pages are staged
    in a sibling temp file, so an existing output file is never truncated before the
    first page is written; the file keeps its permissions and a symlinked path keeps
    its link. Intermediate pages no longer offer redundant continuation commands.

  • Completed Agent streams now offer resource follow-ups without copying their
    output again. Follow-up generation no longer clones whole retrieval responses.

  • Request previews now share header assembly with live requests, including custom
    headers, SSE Accept, idempotency keys, and the documented Exa-Beta header.
    Beta tokens supplied through --beta, --header 'Exa-Beta: …', or automatic
    injection are folded into one Exa-Beta header with each token sent once, and
    every beta gate accepts a token supplied by either flag.

  • Doctor config backups are always written 0600, whatever the config's own mode
    was; --undo restores the original mode recorded alongside the backup.

  • Output documentation now explains how to recover the complete stdout result after
    an output-file write failure without repeating a successful create.

  • Connect timeout now reaches all three HTTP agents via --connect-timeout or
    config connect_timeout, independently of the whole-request timeout.

  • Doctor fix/undo honor lock acquisition failure and refresh config under lock;
    --fix --dry-run performs no filesystem mutation. Temporary files are cleaned
    after failed sync/rename, and supported directory-sync errors are reported.

  • Empty/relative XDG roots fall back to HOME; explicit Exa path overrides remain
    relative-capable. Explicit trace paths use locking sidecars and new-file 0600.

Changed

  • robot-docs guide now emits a co-located sections structure while retaining
    the flattened guidance list for compatibility. The generated agent skill is
    rewritten as agent-facing documentation and now ships at
    skills/exa-agent-cli/SKILL.md.
  • A leading @ in contents --highlights now selects a file. For a literal query
    such as @openai roadmap, use --highlights '{"query":"@openai roadmap"}'.
  • agent runs cancel now requires --yes for live calls, like stop and delete:
    it discards the results the run has gathered.
  • Every cursor-paginated list rejects --limit 0 locally as invalid_value
    instead of forwarding it upstream.
  • answer --user-location is sent as the string upstream expects, and
    answer --text is a boolean; capabilities now reports both kinds.
  • HTTP responses may now be gzip-encoded: ureq gains its gzip feature, which pulls in
    flate2 on its default pure-Rust backend, so musl static linking stays free of a zlib C
    shim. default-features on ureq stays off. Raw output preserves the decoded
    response body, not compressed wire bytes; payment redaction is unchanged.
  • rustix (unix only, fs feature) is now a direct dependency for the state layer's file
    handling. It was already present transitively, so the lockfile gained no new versions
    beyond the gzip chain and nothing was upgraded.
  • The source package now includes openapi/provenance.toml, which the OpenAPI parity test
    and vendor-spec --check read.
  • CI no longer repeats the formatting and generated-artifact checks on both operating
    systems; they run once in a dedicated lint job. Per-OS clippy, tests, and release
    builds are unchanged. Every job now has a timeout, and superseded pull-request runs are
    cancelled while pushes to main are not.
  • The dev profile now builds with debug = "line-tables-only" and no debug info for
    dependencies. A Linux comparison reduced the binary from 82,861,952 to 33,311,480
    bytes while retaining project line tables. Single cold builds were 11.63s and
    11.80s, so no build-speed gain is claimed. Release and dist builds are unaffected.
  • Documentation correction: the keyring cargo feature is inert and gates no code, so no
    release artifact stores credentials in an OS keyring. auth login writes a plaintext
    0600 file on every platform. The D11/D15 keyring design in docs/v2/ is planned, not
    implemented.

Install exa-agent-cli 0.7.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/treygoff24/exa-agent-cli/releases/download/v0.7.0/exa-agent-cli-installer.sh | sh

Install prebuilt binaries via Homebrew

brew install treygoff24/tap/exa-agent

Download exa-agent-cli 0.7.0

File Platform Checksum
exa-agent-cli-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
exa-agent-cli-x86_64-apple-darwin.tar.xz Intel macOS checksum
exa-agent-cli-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux checksum
exa-agent-cli-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum
exa-agent-cli-aarch64-unknown-linux-musl.tar.xz ARM64 MUSL Linux checksum
exa-agent-cli-x86_64-unknown-linux-musl.tar.xz x64 MUSL Linux checksum