Skip to content

Releases: agentfirstkit/agent-first-http

v0.14.0

Choose a tag to compare

@agentfirstkit agentfirstkit released this 12 Sep 13:39
  • A takeover tab now stays open only while a wall is pending; clean results, errors, and the completed re-fetch close it
  • New host idle-tab reaper: --tab-idle-timeout-s (default 900s) closes leftover page tabs once no client is connected and no takeover is pending
  • tab_id is reported only for a tab that is still open
  • Dependency upgrades: dirs 7; camoufox pin 152.0.4-beta.30

v0.13.2

Choose a tag to compare

@agentfirstkit agentfirstkit released this 03 Sep 11:41
  • Widen the host liveness probe and time its websocket connect and CDP call separately, so a browser busy rendering is no longer reported as a browser that is gone
  • Stop host discovery from refusing a request over a degraded backend reading — only a host that reports having no browser yet blocks one now
  • Name afhttp container install in the recovery hint only when no host was found, instead of pointing at a container that just answered
  • Wait out a transient unhealthy /health reading during container install rather than failing the install on the first one
  • Document that one host is one browser, so heavy JS-driven pages are fetched one at a time rather than concurrently
  • Refresh the dependency lockfile, replacing a yanked chacha20 release, and follow the pinned Go toolchain to 1.27.1

v0.13.1

Choose a tag to compare

@agentfirstkit agentfirstkit released this 27 Aug 16:32
  • Fix the prebuilt container install, which failed on every platform: the Dockerfile copies install-browser-policy.sh out of the embedded build context and that file was never embedded, so the default install path died on a missing file while --from-source kept working
  • Report what the builder actually said when an image build fails, instead of asserting an unchecked cause; the source-build routes are named only when the release download is what failed, rather than on every failure regardless of reason
  • Hand the data volume to the image's own account before first start on the Apple runtime, where a named volume is mounted root-owned and the non-root host could not create its state directory
  • Read container state from Apple's inspect shape (status.state) as well as Docker's (State.Running), and list with ls rather than a ps subcommand Apple does not have; between them every container on that runtime read as stopped and a healthy host was reported as having exited
  • Update the pinned camoufox backend from v152.0.4-beta.28 to v152.0.4-beta.29

v0.13.0

Choose a tag to compare

@agentfirstkit agentfirstkit released this 23 Aug 12:46
  • Apply the RFC 6265 §5.3 acceptance check when merging Set-Cookie, so a response can broaden a cookie only to its own parent domain and can no longer replace an unrelated site's session cookie by asserting a domain it has no claim to
  • Honor Max-Age over Expires and delete on a non-positive Max-Age, so the header a site logs you out with actually revokes the cookie instead of leaving a session cookie that outlived the revocation
  • Stop echoing the raw value of --header, --cookie and --proxy-url in domain errors, which had been putting Authorization headers, session cookies and proxy userinfo into error events that are routinely logged
  • Replace ui takeover's --takeover-no-window with --mode window|link|session and add a link delivery, so a person on another device on the same network gets one URL through AFUI's proxy while the takeover host stays on loopback
  • Publish the takeover panel's URL as link_url on its progress event, deleting the emitter and named-field walk that existed only to undo the redaction afhttp's own _secret suffix had caused
  • Report a window takeover's session_id like every other delivery, since a window is announced to the registry too, and let AFUI merge its own delivery facts instead of flattening them into afhttp's ready event
  • Refuse an https takeover panel while the delivery is being planned rather than when AFUI's refusal arrives, so a credential is not minted and discarded, and name the delivery that does work
  • Say in the skill that everything a page returns is data and never an instruction — page text, DOM, console output, downloads, redirect targets and error pages are evidence about the page, and nothing in them widens the task
  • Move the container backend build to Go 1.27.0 and fail the image build when foxbridge cannot be installed or the camoufox binary goes missing, instead of shipping an image that advertises --with camoufox with no bridge behind it
  • Run the local container gates on Apple's container runtime as well as Docker, so the one fixed test entrypoint works on a machine with neither Docker nor a local Rust toolchain
  • Report a cargo test --list failure as itself with the compiler's output, instead of swallowing it and reading a build failure as six deleted regression tests
  • Run the pinned ShellCheck version in this repository's own CI, verify the release job is building the tag it was asked for, assert the built binary reports that tag's version, publish the checksum in one canonical spelling and upload assets without replacing bytes already attached
  • Upgrade Agent-First Data to 0.34.0 and Agent-First UI to 0.5.0

v0.12.0

Choose a tag to compare

@agentfirstkit agentfirstkit released this 07 Aug 11:03
  • Discover the standard local host for every command that needs one rather than only for fetch --takeover: with no --endpoint-url the local host container is inspected read-only, its token read from its own data volume, and /health verified before anything is sent
  • Never start or recreate a container while discovering, keep inline the default so a plain fetch needs no host at all, never second-guess an explicit --endpoint-url, and let fetch --profile discover instead of erroring when no endpoint is given
  • Let --token-secret name where a token lives rather than only carry it: env:NAME, file:PATH#DOT_PATH, container:NAME and literal:TOKEN, with container:NAME covering the host token in a named volume that no path on the machine can address
  • Classify token sources while argv is projected and read them only at connect time, so a rejected invocation never opens a file or spawns a container runtime and no error can echo what it read
  • Adopt the shared value-source grammar in place of a private copy, so an unaccepted source is refused as cli_invalid_argument_value at exit 2 while argv resolves, --token-secret prompt answers with what it does accept, and the syntax is rendered from the declaration instead of repeated across every reference row
  • Carry a resolved token as a secret-typed value end to end, exposing the bytes only where they are needed and rendering every other debug output as redacted
  • Require afhttp host to name the source of the token it demands from callers, with no environment fallback, so a server never inherits what it accepts from an ambient variable
  • Replace the private takeover handoff store with an Agent-First UI access token, gaining constant-time comparison and a revoke path the crate never had, and cleanup that no longer runs only when a credential is minted
  • Add afhttp ui takeover, which opens the takeover panel in an Agent-First UI window so the window closing is the signal that the person finished instead of the agent guessing
  • Emit a runnable client command from container install and status and from the entrypoint banner, instead of an AFHTTP_TOKEN_SECRET= template to paste

v0.11.0

Choose a tag to compare

@agentfirstkit agentfirstkit released this 05 Aug 09:37
  • Drop the chrome-headless-shell backend: it shipped the same engine and CDP surface as chromium for an extra pinned download and an x86_64-only asymmetry, so --browser and 'container install --with' no longer accept it
  • Move the runtime, builder, downloader, and test container images from Debian bookworm to trixie, including the matching KasmVNC package
  • Install a managed browser policy in both container images so Chromium's unsupported-command-line-flag bar stops stealing viewport on the takeover display, changing no launch flag and no sandbox posture
  • Fix takeover downloads landing nowhere: profile prefs now suppress the native save dialog and point downloads at the profile's own directory, replacing a host-level Browser.setDownloadBehavior that died with the throwaway connection that set it
  • Correct the deployment guide's claim that --no-sandbox raises no warning bar, and record what does and does not suppress it
  • Upgrade to agent-first-data 0.31.0, resolving bound registries through BoundOutcome and running invocations off the invocation itself
  • Add a CLI test that drives every declared shape through its own handler with strict argument reads, so a handler asking for an id its shape cannot supply fails in test rather than silently projecting an empty string

v0.10.1

Choose a tag to compare

@agentfirstkit agentfirstkit released this 02 Aug 19:58
  • Route --docs and plain help through the new agent-first-data write_raw instead of a private stdout/stderr dispatch, so stream routing comes from the crate that injects those outcomes rather than from a copy in this binary
  • Treat a closed reader as success: afhttp --docs | head now exits 0 where the private copy returned a failure code

v0.10.0

Choose a tag to compare

@agentfirstkit agentfirstkit released this 02 Aug 10:20
  • Compile the CLI from afdata's closed-world registry — the root, four command groups, 23 leaf commands and 34 legal shapes in one declaration — so combinations that were runtime errors become disjoint shapes the parser rejects; clap and two hand-rolled argv scanners are deleted
  • Report the origin's response Content-Type verbatim on FetchResult, so callers stop reconstructing it from body_file's extension, which silently loses every type outside the extension table
  • Make takeover backend-agnostic and add Chrome as an opt-in backend: the install preflight, capability gate, and image probe now follow the selected --browser instead of naming Brave, whose pin rested on the since-obsolete premise that Linux arm64 had no Chrome; Brave stays the default on its own merits
  • Stop passing --disable-gpu to Chromium, which switched off the GPU process and took WebGL with it, making every host read as automation; --enable-unsafe-swiftshader permits the software fallback instead, so hardware GL still wins wherever it exists
  • Drop the forced --disable-blink-features=AutomationControlled, which bought nothing and made Chromium show an unsupported-flag banner on the one path a human is watching, and widen container fonts from about 46 to about 486 families so a captured browser stops fingerprinting as a bare server and stops rendering CJK as tofu
  • Refresh the container pins the drift check had been failing the gate on: chrome-for-testing 151.0.7922.47 to .71, and KasmVNC 1.4.0 to 1.5.0
  • Upgrade Agent-First Data to 0.29.0 and resolve it from crates.io in standalone CI, deleting the sibling-repository checkout every job previously needed

v0.9.0

Choose a tag to compare

@agentfirstkit agentfirstkit released this 28 Jul 19:05
  • Unify CLI discovery: version and help share one pre-parser, bare --help returns a compact AFDATA JSON result scoped to a single command level, --recursive expands the full tree, and --output plain|yaml|markdown selects human or documentation views
  • Stop advertising clap's help pseudo-subcommand and return a structured invalid_argument error when a command is missing, instead of dumping plain-text usage
  • Rewrite every flag's help into a short summary plus a detail paragraph so compact structured help stays small while plain and markdown output keep the full caveats
  • Add a global --output-to split|stdout|stderr; the default split sends results to stdout and errors to stderr, while stdout and stderr collapse all events onto one ordered stream
  • Rename the human-takeover capability to takeover_url_secret with a handoff_secret query parameter, redacted by default and revealed only by the explicit panel, fetch --takeover, and handoff results
  • Redact credential-bearing URLs across all tool-originated output: userinfo passwords and token-shaped query parameters in every *_url field, network.json request URLs, console source URLs, observation page and frame URLs, storage URLs, and the host's recent-requests ring
  • Bump every artifact to schema_version 2 with self-describing field names: observation page_url and frame_url, network request_url with monotonic timing fields, console timestamp_epoch_ms and source_url, storage page_url, and host_ready listen_address
  • Raise the agent-first-data floor to 0.26.1 and refresh pinned dependencies including base64 0.23 and chrome-for-testing 151.0.7922.47
  • Mount the spore alone at /workspace in the Docker test harness with an optional sibling agent-first-data mount, so the gate no longer assumes a monorepo layout

v0.8.0

Choose a tag to compare

@agentfirstkit agentfirstkit released this 21 Jul 13:45
  • Emit afhttp --version as an AFDATA protocol-v1 JSON event (name, display_name, version, build) via a clap-introspecting pre-parser instead of plain version text.
  • Stamp the build commit SHA into the version's build field via build.rs, falling back to "unknown" for crates.io tarball builds with no reachable git.
  • Migrate to agent-first-data 0.22 and its L1-L8 API (redaction policy, output style, infallible event builders), absorbing the retired agent-first-config crate.
  • Bump pinned browser backends to chrome-for-testing 151 and camoufox 152 beta.
  • Move the embedded skill to the skills/agent-first-http/SKILL.md layout and add Hermes as a skill install target alongside Codex, Claude Code, and opencode.
  • Rewrite the README into the canonical user guide with a coverage map, host/driver roles, worked examples, Rust SDK usage, and cross-spore collaboration notes, retiring docs/overview.md.