mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-10-09 03:20:56 +00:00
Step 3 of .ai/plans/pebble-absorbs-embedder-concerns.md, pinning pebble
6cdb30a with its `mcp` feature.
Pebble starts the stage's MCP servers while the agent is built, registers
their tools under `mcp__{server}__{tool}` with `ToolSource::Mcp`, and
closes them with the agent, for all three placements: a child of the run
worker over stdio, a server over HTTP (streamable or SSE), and a server
launched in the run sandbox and reached through the sandbox's preview
URL. `fabro_mcp::pebble::pebble_server` maps `McpServerSettings` onto
pebble's `McpServer`, keeping fabro's `/sse` path for sandbox-hosted SSE
servers; `RunSandbox::port_routes` hands pebble the driver's `PreviewUrls`
facet as the route to a sandbox port. The stage's event sink mirrors
`McpServerReady` and `McpServerFailed` onto the run's `agent.mcp.ready`
and `agent.mcp.failed` events, as it mirrors `RouteFailover` onto
`agent.failover`, and stores no second copy of a mirrored fact.
Deleted: `sandbox_mcp.rs`, the MCP branches of `pebble.rs` and `fabro
exec`, and fabro-mcp's client, connection manager, HTTP helpers, and SSE
transport, whose tests moved to pebble. fabro-mcp keeps the settings
re-export, the mapping, and a stdio client behind `test-support` for the
tests of fabro's own MCP server. `fabro exec` reports each server's
outcome from the agent's snapshot. The Daytona Playwright live test now
drives the sandbox-hosted server through an agent.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
136 lines
4.8 KiB
TOML
136 lines
4.8 KiB
TOML
[package]
|
|
name = "fabro-cli"
|
|
edition.workspace = true
|
|
version.workspace = true
|
|
publish = false
|
|
license.workspace = true
|
|
description = "Unified CLI for the Fabro AI framework"
|
|
|
|
[[bin]]
|
|
name = "fabro"
|
|
path = "src/main.rs"
|
|
|
|
[features]
|
|
default = []
|
|
sleep_inhibitor = ["dep:core-foundation"]
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[dependencies]
|
|
fabro-auth = { path = "../../foundation/fabro-auth" }
|
|
fabro-config = { path = "../../foundation/fabro-config" }
|
|
fabro-environment = { path = "../../components/fabro-environment" }
|
|
fabro-llm = { path = "../../components/fabro-llm" }
|
|
fabro-oauth = { path = "../../foundation/fabro-oauth" }
|
|
fabro-github = { path = "../../components/fabro-github" }
|
|
pebble-agent.workspace = true
|
|
pebble-coding-agent.workspace = true
|
|
fabro-dump = { path = "../../components/fabro-dump" }
|
|
fabro-hooks = { path = "../../components/fabro-hooks" }
|
|
fabro-install = { path = "../../components/fabro-install" }
|
|
fabro-interview = { path = "../../components/fabro-interview" }
|
|
fabro-mcp = { path = "../../components/fabro-mcp" }
|
|
fabro-mcp-server = { path = "../fabro-mcp-server" }
|
|
fabro-manifest = { path = "../../components/fabro-manifest" }
|
|
fabro-proc = { path = "../../foundation/fabro-proc" }
|
|
fabro-sandbox = { path = "../../components/fabro-sandbox" }
|
|
fabro-checkpoint = { path = "../../components/fabro-checkpoint" }
|
|
fabro-graphviz = { path = "../../components/fabro-graphviz" }
|
|
fabro-validate = { path = "../../components/fabro-validate" }
|
|
fabro-workflow = { path = "../../components/fabro-workflow" }
|
|
fabro-server = { path = "../fabro-server" }
|
|
fabro-client = { path = "../../foundation/fabro-client" }
|
|
fabro-api = { path = "../../foundation/fabro-api" }
|
|
fabro-telemetry = { path = "../../foundation/fabro-telemetry" }
|
|
fabro-store = { path = "../../components/fabro-store" }
|
|
fabro-vault = { path = "../../foundation/fabro-vault" }
|
|
fabro-types = { path = "../../foundation/fabro-types", features = ["clap"] }
|
|
lithos-llm = { workspace = true, features = ["runtime"] }
|
|
fabro-redact.workspace = true
|
|
fabro-util = { path = "../../foundation/fabro-util" }
|
|
fabro-http.workspace = true
|
|
fabro-static.workspace = true
|
|
fabro-template = { path = "../../foundation/fabro-template" }
|
|
fabro-tool = { path = "../../components/fabro-tool" }
|
|
clap.workspace = true
|
|
clap_complete.workspace = true
|
|
cli-table.workspace = true
|
|
console.workspace = true
|
|
indicatif.workspace = true
|
|
anyhow.workspace = true
|
|
miette.workspace = true
|
|
dotenvy.workspace = true
|
|
tokio.workspace = true
|
|
tokio-tungstenite.workspace = true
|
|
tracing.workspace = true
|
|
tracing-subscriber.workspace = true
|
|
tracing-appender.workspace = true
|
|
chrono = { workspace = true, features = ["serde"] }
|
|
dirs.workspace = true
|
|
fs2.workspace = true
|
|
serde.workspace = true
|
|
thiserror.workspace = true
|
|
toml.workspace = true
|
|
toml_edit.workspace = true
|
|
futures.workspace = true
|
|
regex.workspace = true
|
|
semver.workspace = true
|
|
progenitor-client = "0.13"
|
|
async-trait.workspace = true
|
|
jsonwebtoken.workspace = true
|
|
base64.workspace = true
|
|
ulid.workspace = true
|
|
scopeguard = "1"
|
|
rustls = { version = "0.23", default-features = false, features = ["std", "ring"] }
|
|
ring = "0.17"
|
|
x509-parser = "0.16"
|
|
rand.workspace = true
|
|
dialoguer.workspace = true
|
|
git2.workspace = true
|
|
axum.workspace = true
|
|
serde_json.workspace = true
|
|
serde_yaml = "0.9"
|
|
tempfile = "3"
|
|
sha2.workspace = true
|
|
shlex = "1"
|
|
walkdir.workspace = true
|
|
object_store.workspace = true
|
|
bytes.workspace = true
|
|
tokio-util.workspace = true
|
|
libc = "0.2"
|
|
nix = { version = "0.30", features = ["fs"] }
|
|
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
core-foundation = { version = "0.9", optional = true }
|
|
|
|
# Vendor openssl only for musl targets. Transitive dependencies pull
|
|
# native-tls via reqwest, which needs libssl. On glibc runners the system
|
|
# libssl is used; on musl runners we compile openssl from source.
|
|
[target.'cfg(target_env = "musl")'.dependencies]
|
|
openssl = { version = "0.10", features = ["vendored"] }
|
|
|
|
[build-dependencies]
|
|
fabro-build-support = { path = "../../foundation/build-support" }
|
|
chrono = { workspace = true }
|
|
|
|
[dev-dependencies]
|
|
assert_cmd = "2"
|
|
fabro-acp = { path = "../../components/fabro-acp", features = ["test-support"] }
|
|
fabro-mcp = { path = "../../components/fabro-mcp", features = ["test-support"] }
|
|
fabro-build-support = { path = "../../foundation/build-support" }
|
|
fabro-server = { path = "../fabro-server", features = ["test-support"] }
|
|
fabro-workflow = { path = "../../components/fabro-workflow", features = ["test-support"] }
|
|
fabro-types = { path = "../../foundation/fabro-types", features = ["clap", "test-support"] }
|
|
insta = { workspace = true, features = ["filters"] }
|
|
paste = "1"
|
|
predicates = "3"
|
|
serde_json.workspace = true
|
|
tempfile = "3"
|
|
temp-env = "0.3"
|
|
httpmock = "0.8"
|
|
fabro-test = { workspace = true }
|
|
fabro-macros = { path = "../../foundation/fabro-macros" }
|
|
hkdf.workspace = true
|
|
reqwest = { workspace = true, features = ["cookies"] }
|
|
tokio = { workspace = true, features = ["test-util", "macros"] }
|