agent-first-http 0.7.1

Give your AI agent its own private browser — so it reads the real page, past logins and bot walls, without ever touching yours.
Documentation
[package]
name = "agent-first-http"
version = "0.7.1"
edition = "2021"
description = "Give your AI agent its own private browser — so it reads the real page, past logins and bot walls, without ever touching yours."
license = "MIT"
repository = "https://github.com/agentfirstkit/agent-first-http"
readme = "README.md"
# container/docker/{Dockerfile,install-backends.sh,entrypoint.sh} are embedded
# via include_str! in cli/cmd/container.rs, so they must ship in the crate; the
# rest of container/ (compose, dockerignore) is build/deploy-only.
exclude = [".github/", "container/docker/compose.yaml", "container/docker/Dockerfile.dockerignore", "tests/Dockerfile.test", "tests/Dockerfile.test.dockerignore"]

[[bin]]
name = "afhttp"
path = "src/main.rs"
required-features = ["cli"]

[[example]]
name = "manual_display_takeover"
required-features = ["host"]

[features]
default = ["sdk", "cli"]
sdk = []
host = [
    "dep:chromiumoxide",
    "dep:axum",
    "dep:tower",
    "dep:tower-http",
    "dep:hyper",
    "dep:hyper-util",
]
cli = ["sdk", "host", "dep:clap", "dep:psl", "agent-first-data/cli-help", "agent-first-data/cli-help-markdown", "agent-first-data/skill-admin"]

[dependencies]
# SDK floor — always compiled.
tokio = { version = "1", features = ["full"] }
rustls = { version = "0.23", default-features = false, features = ["aws-lc-rs", "std"] }
reqwest = { version = "0.13", default-features = false, features = [
    "json", "rustls-no-provider", "gzip", "brotli", "deflate", "stream", "http2", "multipart", "form"
] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
base64 = "0.22"
uuid = { version = "1", features = ["v4"] }
tokio-tungstenite = { version = "0.29", features = ["rustls-tls-native-roots"] }
futures = "0.3"
dirs = "6"
humantime = "2"
mime_guess = "2"
fs2 = "0.4"
tempfile = "3"
url = "2"
thiserror = "2"

# Host feature deps — chromiumoxide + the axum listener stack.
chromiumoxide = { version = "0.9", optional = true, default-features = false }
axum = { version = "0.8", optional = true, features = ["ws", "macros"] }
tower = { version = "0.5", optional = true }
tower-http = { version = "0.7", optional = true, features = ["fs", "trace"] }
hyper = { version = "1", optional = true, features = ["full"] }
hyper-util = { version = "0.1", optional = true, features = ["server-auto", "tokio"] }

# SDK floor — used for URL secret redaction (redact_url_secrets); the cli-help
# and skill-admin features are enabled only by the `cli` feature. Resolves from
# crates.io; local monorepo development overrides it to the sibling crate via
# `.cargo/config.toml` (`paths = ["../agent-first-data/rust"]`), which is not
# copied into image builds — so they get the matching published version from the registry.
agent-first-data = { version = "0.14.2", default-features = false }
# CLI feature deps.
clap = { version = "4", optional = true, features = ["derive", "env"] }
cookie = "0.18"
psl = { version = "2", optional = true }

[dev-dependencies]
serde_json = "1"
tempfile = "3"
tokio = { version = "1", features = ["full", "test-util"] }
axum = { version = "0.8", features = ["ws", "macros"] }
filetime = "0.2"

[lints.clippy]
unwrap_used = "deny"
expect_used = "deny"
panic = "deny"
print_stdout = "deny"
print_stderr = "deny"