1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
[]
= "decdn-cli"
= true
= true
= true
= true
= "User-facing deCDN CLI (decdn binary): probe, fetch, pools, publishing, origin import, node admin"
= true
= true
= "README.md"
= true
= true
[[]]
= "decdn"
= "src/main.rs"
[]
= { = true }
= { = true }
# `config init --origin <URL>` validates and normalizes the origin base URL
# through the same `parse_origin_url` the daemon's resolver uses, so the
# generated `[cache.origin]` and the runtime agree by construction. A leaf
# crate already in this binary's tree via `decdn-common` — no new bloat and
# the iroh-blobs/AWS-free invariant (#578) holds. `url` (already in the tree
# via config-types) classifies the flag's spelling — http(s)/file/s3 — before
# the per-kind guard runs.
= { = true }
= { = true }
# `key-gen` (this crate) and the runtime loader in `decdn-node` both load
# the eth keystore via `decdn_incentive::eth_identity` (#406). Lives in
# `incentive` per `appendix-poc-production-seams.md` §Seam 1 — clients
# (voucher signers per ADR 003) and nodes share the keystore surface. The
# `redb` feature backs `decdn fetch`'s persistent buyer pool store (#940),
# so a pool opens once and is reused (each lane's watermark resumed) across invocations.
= { = true, = ["redb"] }
# `decdn fetch` (issue #391): the standalone client-side paid pull reuses the
# shared `cdn/client/v1` requester. `decdn-client` depends only on `blake3` for
# content verification (NOT iroh-blobs), so the CLI's iroh-blobs-free invariant
# (#578) holds — verify with `cargo tree -p decdn-cli -e normal -i iroh-blobs`.
= { = true }
# `decdn origin import` (#1904) seeds a filesystem cache origin: it writes each
# blob's sharded data object plus its `{hex}.obao4` pre-order bao outboard, which
# must match the daemon's own encoding at `IROH_BLOCK_SIZE`. The `bao-range` leaf
# crate owns that outboard encoder and the `.obao4` layout contract shared with
# the cache reader; it depends only on `bao-tree`, so the iroh-blobs-free
# invariant (#578) holds — already in this binary's tree via `decdn-client`.
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
# `decdn origin import --dry-run` (issue #391): directory walk + glob
# exclude + streaming BLAKE3. `blake3` is used directly for the bundle
# digest.
# The *entire* CLI is free of iroh-blobs / the AWS SDK: the
# config-vocabulary types `decdn-common` needs live in the
# `decdn-config-types` leaf crate, so `cli → common → config-types`
# does not drag in `decdn-cache` (see `appendix-binaries.md` §
# binary-size). Verify with
# `cargo tree -p decdn-cli -e normal -i iroh-blobs` (must be empty).
# `tempfile` is also a runtime dep here because writing a bundle manifest
# to disk (`origin import --bundle`) is atomic via `NamedTempFile::persist`
# — a unique
# O_CREAT|O_EXCL temp avoids the symlink-clobber risk of a predictable
# `<output>.partial` filename on a shared workspace.
= { = true }
= { = true }
= { = true }
= { = true }
# `decdn origin import --optimize` (content-defined chunking): splits a
# publisher file into `fastcdc::v2020` chunks so cross-file dedup can work at
# chunk granularity instead of whole-file.
= { = true }
# `decdn fetch` (#1118) renders a delivery progress bar to stderr. TTY-aware, so
# a piped/redirected fetch stays silent. Small dep tree (console, unicode-width),
# unrelated to the iroh-blobs/AWS-free invariant above.
= { = true }
# `decdn bundle pull` mirrors its total bar into the terminal's tab-bar progress
# (OSC 9;4) where the terminal supports it. No dependencies of its own.
= { = true }
# Opt-in client-side logging (`--log-level` / `RUST_LOG`): the CLI installs no
# subscriber by default, so verbose fetch/incentive/iroh spans are diagnosable
# on demand without disturbing the terminal UI. The `fetch`/`bundle pull`
# commands emit their own status and warning spans through these macros, so the
# routing narration is silent by default and visible at the requested level.
# Already in this binary's tree via `decdn-node`'s daemon path; env-filter + fmt
# only.
= { = true }
= { = true }
# `node top` (issue #275) scrapes the daemon's loopback /metrics HTTP
# endpoint. Workspace-pinned with rustls + no default features — same
# settings `decdn-node` uses, so the dep tree stays unified.
= { = true }
# `node register` (ADR 019 § Step 2.3) submits `CapacityBond.registerNode`
# on-chain: it needs alloy's provider/contract/signer surface. `decdn fetch`
# (#391) also uses it to parse on-chain identifiers and build the EIP-712
# voucher/slash domains. alloy is already in this binary's tree via
# `decdn-incentive` (a normal dep), so this exposes the existing crate to CLI
# source without new bloat.
= { = true }
# `decdn fetch` auto-discovery (#936) probes its `SELECT_K` sample concurrently
# via `join_all`, which borrows one shared `&endpoint` instead of cloning it
# per probe. Combinators only — no iroh-blobs, so the #578 invariant holds.
= { = true }
# `decdn whoami` holds the resolved keystore password in a `Zeroizing<String>`
# (the type `eth_identity::read_password` returns) so it is scrubbed on drop.
= { = true }
[]
= { = true, = ["redb", "test-util"] }
# `ScriptedSource` and `StaticSources` drive the acquire loop in unit tests.
= { = true, = ["test-util"] }
# Integration tests in `tests/admin_rpc.rs` exercise the loopback admin
# RPC end-to-end against a real `AdminState` spawned from the daemon
# crate, so the daemon's surface is a dev-dependency here. `decdn-cache`
# is needed to construct the `CacheEngine` the admin server runs against.
# None of this leaks into the `decdn` binary's release dep tree.
= { = true }
= { = true }
# A mocked chain answers a revert with a JSON-RPC `ErrorPayload`, which `alloy`
# does not re-export.
= { = true }
# `tests/key_gen_prompt_pty.rs` drives the real `decdn` binary through the
# interactive keystore-password prompt, which `rpassword` reads from
# `/dev/tty`. `rexpect` forks the child onto a pty and makes that pty its
# controlling terminal — see the workspace-manifest note for why we do not do
# the fork ourselves. Pty forking is POSIX-only, as is that test.
[]
= { = true }
[]
= true