[workspace] members = [ "crates/ferryman-channel", "crates/ferryman-core", "crates/ferryman-server", "crates/ferryman-cli", "crates/ferryman-ops", "crates/ferryman-worker-sdk", "crates/ferryman-iroh", "crates/ferryman-hive-rescue", # A sub-product rather than a part of Ferryman: `ferry-deadman` seals a repo to a # future drand beacon round, and works on any git repository with no Ferryman # anywhere. It is in this workspace so it is built, linted and tested with # everything else rather than rotting in a directory nobody compiles - the lesson # the tray already taught. Same licence as everything here: it was written under # MIT and relicensed by its author on the way in, deliberately. "crates/ferry-deadman", ] # ferryman-tray is excluded on purpose: it needs desktop libraries (GTK on Linux) that a # headless agent box does not have, and breaking the build there to compile a tray nobody # on that machine can see would be the wrong trade. Built per platform in the release job. exclude = ["crates/ferryman-tray"] resolver = "2" [workspace.package] version = "0.6.3" edition = "2024" license = "LicenseRef-Ferryman-Source-Available" repository = "https://github.com/estejosh/ferryman" [workspace.dependencies] anyhow = "1.0" async-stream = "0.3" async-trait = "0.1" # BIP-39 English recovery phrases (24 words for 32 seed bytes). `tiny-bip39` is the # small, maintained fork of the vetted `bip39` 0.6 with the same word list and the same # validation, default-features off so it compiles English only and skips the RNG helpers # Ferryman does not use. Renamed to `bip39` so call sites read as the standard. bip39 = { package = "tiny-bip39", version = "2.0.0", default-features = false } chacha20poly1305 = "0.11" axum = { version = "0.8", features = ["macros", "json"] } chrono = { version = "0.4", features = ["serde"] } clap = { version = "4.5", features = ["derive", "env"] } futures-util = "0.3" fs2 = "0.4" hex = "0.4" hmac = "0.13" hostname = "0.4" ed25519-dalek = { version = "3.0", features = ["rand_core", "pkcs8", "pem"] } keyring = { version = "3.6", features = ["windows-native", "apple-native", "sync-secret-service"] } pbkdf2 = "0.13" rpassword = "7.4" http-body-util = "0.1" rand = "0.10" # Held at 0.12 deliberately. 0.13 builds fine, but its `rustls` feature brings # aws-lc-rs in place of `ring`, and aws-lc-sys wants cmake and a C toolchain - # a hard stop on the machines least likely to have one, which is exactly the # machine an agent is asked to install this on unattended. The OTLP exporter # pulls a 0.13 of its own either way; one duplicate crate is cheaper than a # native build dependency. reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "stream"] } rusqlite = { version = "0.40", features = ["bundled", "chrono"] } # The OpenTelemetry crates move as a set, and nothing moves until # `tracing-opentelemetry` does: it decides which `opentelemetry` ends up in the # graph, and bumping the other three around it only puts two versions of # `opentelemetry` there, after which the newer SDK's exporter no longer # satisfies a trait that came from the older API: # # the trait `opentelemetry_sdk::trace::SpanExporter` is not implemented # for `opentelemetry_otlp::SpanExporter` # no method named `tracer` found for struct `SdkTracerProvider` # # The set was held at 0.31 for exactly that reason until tracing-opentelemetry # 0.33 shipped against 0.32. Dependabot proposes the partial bump, because from # a single crate's point of view it looks safe; it is not. Move all four or # none. opentelemetry = { version = "0.32", features = ["trace"] } opentelemetry_sdk = { version = "0.32", features = ["rt-tokio"] } opentelemetry-otlp = { version = "0.32", default-features = false, features = ["http-proto", "reqwest-client"] } tracing-opentelemetry = "0.33" serde = { version = "1.0", features = ["derive"] } serde_jcs = "0.2" serde_json = "1.0" hkdf = "0.13" sha2 = "0.11" system-idle-time = "1.0" sysinfo = { version = "0.39", default-features = false, features = ["system"] } thiserror = "2.0" tokio = { version = "1.47", features = ["full"] } toml = "1.1" tower = "0.5" tower-http = { version = "0.7", features = ["trace", "request-id", "cors"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } uuid = { version = "1.18", features = ["v4", "serde"] } wait-timeout = "0.2" x25519-dalek = { version = "3", features = ["static_secrets"] } zstd = "0.14.3" [workspace.lints.rust] unsafe_code = "forbid" [workspace.lints.clippy] all = { level = "warn", priority = -1 } pedantic = { level = "warn", priority = -1 }