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
140
141
142
143
144
145
146
147
148
149
[]
= "salvor-cli"
= "Salvor CLI: run, resume, list, history, and replay for durable agent runs"
= true
= true
= true
= true
= true
= true
# Homebrew formulae require a homepage; without it the tap-publish job warns.
= "https://github.com/joseym/salvor"
# dist metadata for the released artifact. Building with default features OFF
# drops salvor-cli's `fixture` feature, and with it the three fixture-gated
# binaries (salvor-mcp-count-fixture, salvor-demo-research, salvor-demo-model)
# that exist only for tests and the demo. That leaves the real `salvor` binary
# as the sole artifact. The binary stays fully functional: MCP-client support
# and the wasm sandbox arrive through the unconditional lib dependencies
# (salvor-tools, salvor-wasm), not through this crate's own features.
#
# `binaries` is an explicit allowlist: dist enumerates a package's binaries from
# the manifest without evaluating required-features, so it would otherwise try
# to package the three fixture binaries and fail when the default-features-off
# build never produced them. Naming `salvor` alone ships exactly that binary.
# docs.rs builds under a time and memory budget, and the default features pull the whole
# wasmtime tree in for a binary crate whose docs do not describe it. Documenting the lean
# build keeps the crate page from failing.
[]
= true
[]
# No default features (the fixture binaries stay out of a release), but `ui` is named back in:
# a released binary that cannot serve the dashboard is the thing users report as broken.
= false
= ["ui"]
# `"*"` applies to every target triple.
[]
= ["salvor"]
[]
# `fixture` builds the two in-repo MCP servers: the counting server the CLI
# integration tests spawn (`src/bin/mcp_count_fixture.rs`) and the research
# server behind the demo/ reference agent (`src/bin/demo_research.rs`). Both
# pull in the server half of the rmcp SDK and schemars only for those
# binaries. The feature is on by default so a plain `cargo test --workspace`
# builds them and Cargo sets CARGO_BIN_EXE_salvor-mcp-count-fixture and
# CARGO_BIN_EXE_salvor-demo-research for the tests, exactly the pattern
# salvor-tools uses for its own fixture. `--no-default-features` drops both,
# and with them the server-side rmcp surface, leaving only the client MCP
# support the product uses (which arrives transitively through salvor-tools).
# Adding these deps costs the workspace nothing: salvor-tools already compiles
# rmcp with the server features on, so feature unification means no new
# crate.
= ["fixture", "ui"]
= ["dep:rmcp", "dep:schemars", "dep:async-trait"]
# Forwards the embedded dashboard through to salvor-server. On by default so the
# shipped `salvor serve` answers the web app and the API together;
# `--no-default-features` builds a headless, API-only binary.
= ["salvor-server/ui"]
[[]]
= "salvor"
= "src/main.rs"
# The counting MCP fixture server. Test-support only; gated on `fixture` so a
# no-default-features build never compiles it. See the feature comment above.
[[]]
= "salvor-mcp-count-fixture"
= "src/bin/mcp_count_fixture.rs"
= ["fixture"]
# The research MCP server behind the demo/ reference agent.
# Demo-support, gated exactly like the counting fixture: a default-features
# `cargo build` produces it, `--no-default-features` drops it.
[[]]
= "salvor-demo-research"
= "src/bin/demo_research.rs"
= ["fixture"]
# The scripted HTTP model server behind the demo GIF: it serves the same
# twenty-turn conversation as the demo_run test (from src/demo_script.rs) so
# `docs/demo.tape` records hermetically with no network or key. Demo-support,
# gated exactly like the two MCP fixtures above.
[[]]
= "salvor-demo-model"
= "src/bin/salvor_demo_model.rs"
= ["fixture"]
[]
= true
# The graph document format + validator behind `salvor graph`. A pure, IO-free
# leaf: the CLI depends on it, never the other way, so there is no cycle.
= true
# The graph engine behind `salvor graph run` (and a graph run's `salvor
# resume`): it drives a validated document over a `RunCtx`, exactly as the CLI
# drives an agent run over the runtime.
= true
= true
= true
= true
= true
# The control-plane server behind `salvor serve`. The CLI depends on it one
# way: it supplies the agent-building function (so the TOML schema stays owned
# here) and runs the server. The `serve` subcommand is the only consumer.
# Specified directly rather than inherited so default features can be turned
# off: the CLI's own `ui` feature then governs whether the dashboard is
# embedded, and `--no-default-features` yields a headless binary. (Cargo forbids
# overriding `default-features` on a workspace-inherited dependency.)
= { = "../salvor-server", = "0.5.0", = false }
# Sandboxed wasm tools ([[wasm_tools]] in the agent file). A direct, unguarded
# dependency: the CLI is the batteries-included tier; library users who must
# not compile a wasm runtime depend on the library crates, never on this one.
= true
= true
= true
= true
= true
= true
= true
# Process discovery + termination for `salvor serve --kill`; see the
# workspace Cargo.toml for the version/feature-weight justification.
= true
# The process-group kill behind `salvor serve --dev`'s teardown of `ng
# serve`; see the workspace Cargo.toml for the justification.
= true
= true
= true
= true
= true
# Only the fixture binary uses these; optional and behind the `fixture` feature.
= { = true, = true, = [
"server",
"transport-io",
"macros",
"schemars",
] }
= { = true, = true }
# Only `demo_tools` (the `--demo-tools` registry) uses this, for its
# `ToolHandler` impls; optional and behind the `fixture` feature like the two
# deps above.
= { = true, = true }
[]
= true
= true
= true
= true
= { = "1", = ["rt", "rt-multi-thread", "macros"] }