From 00984ce2414467c24a5e66bebbe008996df550df Mon Sep 17 00:00:00 2001 From: Scott Werner Date: Wed, 23 Sep 2026 12:40:52 -0400 Subject: [PATCH 1/3] build: track Lithos git dependencies on branch main Every lithoscomputer git dependency (sandbox-driver, pebble, petri, lithos-llm, twins) now uses `branch = "main"` instead of an exact rev, matching the libraries, so the workspace resolves one Cargo source per repository. Cargo.lock is the single place the commits are chosen; move one with `cargo update -p `. The lockfile keeps every commit except sandbox-driver, which moves from 583a164 to b30203c: Daytona removed its paginated sandbox listing, and b30203c lists through cursors instead (it also moves the driver's daytona-sdk-rust dependency to 0e69058). The Daytona auth-probe test mocks now serve the cursor endpoint the driver calls. CI reads the sandbox-driver commit for the plugin install from the lockfile through cargo metadata instead of from Cargo.toml. Co-Authored-By: Claude Opus 5.5 (1M context) --- .github/workflows/rust.yml | 39 ++++---- AGENTS.md | 4 +- Cargo.lock | 65 ++++++------- Cargo.toml | 95 +++++++++---------- .../fabro-cli/tests/it/workflow/docker.rs | 7 +- lib/apps/fabro-server/src/server/tests.rs | 9 +- lib/apps/fabro-server/tests/it/api/install.rs | 9 +- lib/components/fabro-petri/README.md | 11 ++- lib/components/fabro-petri/src/lib.rs | 4 +- 9 files changed, 117 insertions(+), 126 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 758603179..d97f111f2 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -147,14 +147,15 @@ jobs: # Every Petri run takes its scope through a sandbox-driver plugin # executable that Petri finds on PATH: `sandbox-driver-host` for the # `local` provider, `sandbox-driver-docker` for `docker`. Installed - # at the rev the workspace pins, so the plugins and the in-process - # driver are one build; a from-source build, so the two executables - # are cached by OS and rev and only rebuilt when the pin moves. - - name: Read the sandbox-driver rev the workspace pins + # at the commit Cargo.lock resolves sandbox-driver to, so the plugins + # and the in-process driver are one build; a from-source build, so the + # two executables are cached by OS and commit and only rebuilt when the + # lockfile moves the driver. + - name: Read the sandbox-driver commit Cargo.lock resolves id: sandbox-driver run: | - rev="$(sed -n 's/^sandbox-driver = { git = "[^"]*", rev = "\([0-9a-f]*\)" }$/\1/p' Cargo.toml)" - test -n "$rev" + rev="$(cargo metadata --locked --format-version 1 | jq -r '.packages[] | select(.name == "sandbox-driver") | .source' | sed 's/.*#//' | sort -u)" + [[ "$rev" =~ ^[0-9a-f]{40}$ ]] echo "rev=$rev" >> "$GITHUB_OUTPUT" - name: Restore the sandbox-driver plugin executables id: sandbox-driver-cache @@ -220,14 +221,15 @@ jobs: # Every Petri run takes its scope through a sandbox-driver plugin # executable that Petri finds on PATH: `sandbox-driver-host` for the # `local` provider, `sandbox-driver-docker` for `docker`. Installed - # at the rev the workspace pins, so the plugins and the in-process - # driver are one build; a from-source build, so the two executables - # are cached by OS and rev and only rebuilt when the pin moves. - - name: Read the sandbox-driver rev the workspace pins + # at the commit Cargo.lock resolves sandbox-driver to, so the plugins + # and the in-process driver are one build; a from-source build, so the + # two executables are cached by OS and commit and only rebuilt when the + # lockfile moves the driver. + - name: Read the sandbox-driver commit Cargo.lock resolves id: sandbox-driver run: | - rev="$(sed -n 's/^sandbox-driver = { git = "[^"]*", rev = "\([0-9a-f]*\)" }$/\1/p' Cargo.toml)" - test -n "$rev" + rev="$(cargo metadata --locked --format-version 1 | jq -r '.packages[] | select(.name == "sandbox-driver") | .source' | sed 's/.*#//' | sort -u)" + [[ "$rev" =~ ^[0-9a-f]{40}$ ]] echo "rev=$rev" >> "$GITHUB_OUTPUT" - name: Restore the sandbox-driver plugin executables id: sandbox-driver-cache @@ -268,14 +270,15 @@ jobs: # Every Petri run takes its scope through a sandbox-driver plugin # executable that Petri finds on PATH: `sandbox-driver-host` for the # `local` provider, `sandbox-driver-docker` for `docker`. Installed - # at the rev the workspace pins, so the plugins and the in-process - # driver are one build; a from-source build, so the two executables - # are cached by OS and rev and only rebuilt when the pin moves. - - name: Read the sandbox-driver rev the workspace pins + # at the commit Cargo.lock resolves sandbox-driver to, so the plugins + # and the in-process driver are one build; a from-source build, so the + # two executables are cached by OS and commit and only rebuilt when the + # lockfile moves the driver. + - name: Read the sandbox-driver commit Cargo.lock resolves id: sandbox-driver run: | - rev="$(sed -n 's/^sandbox-driver = { git = "[^"]*", rev = "\([0-9a-f]*\)" }$/\1/p' Cargo.toml)" - test -n "$rev" + rev="$(cargo metadata --locked --format-version 1 | jq -r '.packages[] | select(.name == "sandbox-driver") | .source' | sed 's/.*#//' | sort -u)" + [[ "$rev" =~ ^[0-9a-f]{40}$ ]] echo "rev=$rev" >> "$GITHUB_OUTPUT" - name: Restore the sandbox-driver plugin executables id: sandbox-driver-cache diff --git a/AGENTS.md b/AGENTS.md index 949f2a51a..813e33ecd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -117,7 +117,7 @@ Fabro is an AI-powered workflow orchestration platform. Workflows are defined as - **fabro-workflow** — Fabro's platform half of a run: creates a run around Petri's admission (the run's display graph is read off the admitted graph), archives, forks and retries runs, and holds the run tools and the pull request pipeline. Compilation and execution are Petri's, through `fabro-petri` - **fabro-dot** — The workflow graph as written, read through Petri's DOT parser: its name, goal, node and edge counts, and the files it references (`import`, `stack.child_workflow`, `@file` prompts, the goal). The bundler and the workflow-version store walk references through it; `fabro-graphviz` re-emits Fabro DOT for Graphviz through it - **fabro-graphviz** — SVG rendering of workflow graphs through the vendored Graphviz (`graphviz-sys`) -- **fabro-petri** — Fabro's adapters over Petri, the workflow engine: the one crate that imports the Petri packages (pinned by rev in the workspace `Cargo.toml`), holding the run store over SQLite and the platform adapters +- **fabro-petri** — Fabro's adapters over Petri, the workflow engine: the one crate that imports the Petri packages (workspace dependencies tracking Petri `main`, with the commit chosen in `Cargo.lock`), holding the run store over SQLite and the platform adapters - **fabro-server** — Axum HTTP server. Routes for runs, sessions, models, completions, usage. SSE event streaming. Demo mode via header - **fabro-llm** — Unified LLM client with providers: Anthropic, OpenAI, Gemini, OpenAI-compatible, plus retry/middleware/streaming - **fabro-api** — Auto-generated Rust types and reqwest HTTP client from OpenAPI spec (build.rs + progenitor) @@ -228,7 +228,7 @@ Fabro is an AI-powered workflow orchestration platform. Workflows are defined as - **fabro-workflow** — Fabro's platform half of a run: creates a run around Petri's admission (the run's display graph is read off the admitted graph), archives, forks and retries runs, and holds the run tools and the pull request pipeline. Compilation and execution are Petri's, through `fabro-petri` - **fabro-dot** — The workflow graph as written, read through Petri's DOT parser: its name, goal, node and edge counts, and the files it references (`import`, `stack.child_workflow`, `@file` prompts, the goal). The bundler and the workflow-version store walk references through it; `fabro-graphviz` re-emits Fabro DOT for Graphviz through it - **fabro-graphviz** — SVG rendering of workflow graphs through the vendored Graphviz (`graphviz-sys`) -- **fabro-petri** — Fabro's adapters over Petri, the workflow engine: the one crate that imports the Petri packages (pinned by rev in the workspace `Cargo.toml`), holding the run store over SQLite and the platform adapters +- **fabro-petri** — Fabro's adapters over Petri, the workflow engine: the one crate that imports the Petri packages (workspace dependencies tracking Petri `main`, with the commit chosen in `Cargo.lock`), holding the run store over SQLite and the platform adapters - **fabro-server** — Axum HTTP server. Routes for runs, sessions, models, completions, usage. SSE event streaming. Demo mode via header - **fabro-llm** — Unified LLM client with providers: Anthropic, OpenAI, Gemini, OpenAI-compatible, plus retry/middleware/streaming - **fabro-api** — Auto-generated Rust types and reqwest HTTP client from OpenAPI spec (build.rs + progenitor) diff --git a/Cargo.lock b/Cargo.lock index 424c56a68..dcd17a0a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1642,7 +1642,7 @@ checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" [[package]] name = "daytona-api-client" version = "0.1.0" -source = "git+https://github.com/brynary/daytona-sdk-rust?rev=5e86990418e21f4288ce537c9852dfdf78768abc#5e86990418e21f4288ce537c9852dfdf78768abc" +source = "git+https://github.com/brynary/daytona-sdk-rust?rev=0e69058c888a6562c70a5b16d707253914cff563#0e69058c888a6562c70a5b16d707253914cff563" dependencies = [ "reqwest 0.13.4", "reqwest-middleware", @@ -1656,7 +1656,7 @@ dependencies = [ [[package]] name = "daytona-sdk" version = "0.1.0" -source = "git+https://github.com/brynary/daytona-sdk-rust?rev=5e86990418e21f4288ce537c9852dfdf78768abc#5e86990418e21f4288ce537c9852dfdf78768abc" +source = "git+https://github.com/brynary/daytona-sdk-rust?rev=0e69058c888a6562c70a5b16d707253914cff563#0e69058c888a6562c70a5b16d707253914cff563" dependencies = [ "daytona-api-client", "daytona-toolbox-client", @@ -1676,7 +1676,7 @@ dependencies = [ [[package]] name = "daytona-toolbox-client" version = "0.1.0" -source = "git+https://github.com/brynary/daytona-sdk-rust?rev=5e86990418e21f4288ce537c9852dfdf78768abc#5e86990418e21f4288ce537c9852dfdf78768abc" +source = "git+https://github.com/brynary/daytona-sdk-rust?rev=0e69058c888a6562c70a5b16d707253914cff563#0e69058c888a6562c70a5b16d707253914cff563" dependencies = [ "reqwest 0.13.4", "reqwest-middleware", @@ -4279,7 +4279,7 @@ checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "lithos-llm" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/lithos-llm?rev=43a42ac28e9d9bcf40a91abc02be4f12ca274ebb#43a42ac28e9d9bcf40a91abc02be4f12ca274ebb" +source = "git+https://github.com/lithoscomputer/lithos-llm?branch=main#43a42ac28e9d9bcf40a91abc02be4f12ca274ebb" dependencies = [ "async-trait", "aws-config", @@ -5069,7 +5069,7 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pebble-agent" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/pebble?rev=13a7798eddd8e248e0bbdb65d8e812aec3ded9ca#13a7798eddd8e248e0bbdb65d8e812aec3ded9ca" +source = "git+https://github.com/lithoscomputer/pebble?branch=main#13a7798eddd8e248e0bbdb65d8e812aec3ded9ca" dependencies = [ "async-trait", "futures-util", @@ -5086,7 +5086,7 @@ dependencies = [ [[package]] name = "pebble-cli-core" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/pebble?rev=13a7798eddd8e248e0bbdb65d8e812aec3ded9ca#13a7798eddd8e248e0bbdb65d8e812aec3ded9ca" +source = "git+https://github.com/lithoscomputer/pebble?branch=main#13a7798eddd8e248e0bbdb65d8e812aec3ded9ca" dependencies = [ "anyhow", "async-trait", @@ -5115,7 +5115,7 @@ dependencies = [ [[package]] name = "pebble-coding-agent" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/pebble?rev=13a7798eddd8e248e0bbdb65d8e812aec3ded9ca#13a7798eddd8e248e0bbdb65d8e812aec3ded9ca" +source = "git+https://github.com/lithoscomputer/pebble?branch=main#13a7798eddd8e248e0bbdb65d8e812aec3ded9ca" dependencies = [ "async-trait", "futures-util", @@ -5157,7 +5157,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "petri-attractor-steps" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "async-trait", "globset", @@ -5188,7 +5188,7 @@ dependencies = [ [[package]] name = "petri-driver" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "async-trait", "getrandom 0.3.4", @@ -5208,7 +5208,7 @@ dependencies = [ [[package]] name = "petri-engine" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "petri-ir", "serde", @@ -5220,7 +5220,7 @@ dependencies = [ [[package]] name = "petri-execution" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "async-trait", "petri-driver", @@ -5244,7 +5244,7 @@ dependencies = [ [[package]] name = "petri-executor" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "async-trait", "libc", @@ -5259,7 +5259,7 @@ dependencies = [ [[package]] name = "petri-executor-sandbox" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "async-trait", "petri-executor", @@ -5281,7 +5281,7 @@ dependencies = [ [[package]] name = "petri-frontend" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "marked-yaml", "petri-ir", @@ -5295,7 +5295,7 @@ dependencies = [ [[package]] name = "petri-frontend-attractor" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "minijinja", "petri-frontend", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "petri-frontend-fabro" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "petri-frontend", "petri-frontend-attractor", @@ -5328,7 +5328,7 @@ dependencies = [ [[package]] name = "petri-frontend-native" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "petri-frontend", "petri-ir", @@ -5339,7 +5339,7 @@ dependencies = [ [[package]] name = "petri-ir" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "regex", "serde", @@ -5352,7 +5352,7 @@ dependencies = [ [[package]] name = "petri-runtime" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "async-trait", "petri-driver", @@ -5373,7 +5373,7 @@ dependencies = [ [[package]] name = "petri-steps" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "async-trait", "petri-executor", @@ -5389,7 +5389,7 @@ dependencies = [ [[package]] name = "petri-store" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "async-trait", "getrandom 0.3.4", @@ -5404,7 +5404,7 @@ dependencies = [ [[package]] name = "petri-testkit" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" dependencies = [ "async-trait", "petri-driver", @@ -6283,7 +6283,7 @@ dependencies = [ [[package]] name = "sandbox-driver" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?rev=583a16463320966e8f5c88bedd1d759e93fbd05f#583a16463320966e8f5c88bedd1d759e93fbd05f" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" dependencies = [ "async-trait", "globset", @@ -6300,13 +6300,14 @@ dependencies = [ [[package]] name = "sandbox-driver-daytona" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?rev=583a16463320966e8f5c88bedd1d759e93fbd05f#583a16463320966e8f5c88bedd1d759e93fbd05f" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" dependencies = [ "anyhow", "async-trait", "base64", "daytona-api-client", "daytona-sdk", + "futures-util", "hmac 0.12.1", "rand 0.10.1", "reqwest 0.13.4", @@ -6327,7 +6328,7 @@ dependencies = [ [[package]] name = "sandbox-driver-daytona-config" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?rev=583a16463320966e8f5c88bedd1d759e93fbd05f#583a16463320966e8f5c88bedd1d759e93fbd05f" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" dependencies = [ "sandbox-driver-docker-config", "serde", @@ -6337,7 +6338,7 @@ dependencies = [ [[package]] name = "sandbox-driver-docker" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?rev=583a16463320966e8f5c88bedd1d759e93fbd05f#583a16463320966e8f5c88bedd1d759e93fbd05f" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" dependencies = [ "anyhow", "async-trait", @@ -6358,7 +6359,7 @@ dependencies = [ [[package]] name = "sandbox-driver-docker-config" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?rev=583a16463320966e8f5c88bedd1d759e93fbd05f#583a16463320966e8f5c88bedd1d759e93fbd05f" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" dependencies = [ "serde", "serde_json", @@ -6367,7 +6368,7 @@ dependencies = [ [[package]] name = "sandbox-driver-host" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?rev=583a16463320966e8f5c88bedd1d759e93fbd05f#583a16463320966e8f5c88bedd1d759e93fbd05f" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" dependencies = [ "anyhow", "async-trait", @@ -6385,7 +6386,7 @@ dependencies = [ [[package]] name = "sandbox-driver-protocol" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?rev=583a16463320966e8f5c88bedd1d759e93fbd05f#583a16463320966e8f5c88bedd1d759e93fbd05f" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" dependencies = [ "async-trait", "base64", @@ -6402,7 +6403,7 @@ dependencies = [ [[package]] name = "sandbox-driver-testing" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?rev=583a16463320966e8f5c88bedd1d759e93fbd05f#583a16463320966e8f5c88bedd1d759e93fbd05f" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" dependencies = [ "async-trait", "sandbox-driver", @@ -7876,7 +7877,7 @@ dependencies = [ [[package]] name = "twin-core" version = "0.1.5" -source = "git+https://github.com/lithoscomputer/twins?rev=ca45f0e50a6716d716aa2f638ca3cf767e88f613#ca45f0e50a6716d716aa2f638ca3cf767e88f613" +source = "git+https://github.com/lithoscomputer/twins?branch=main#ca45f0e50a6716d716aa2f638ca3cf767e88f613" dependencies = [ "anyhow", "async-stream", @@ -7910,7 +7911,7 @@ dependencies = [ [[package]] name = "twin-openai" version = "0.1.5" -source = "git+https://github.com/lithoscomputer/twins?rev=ca45f0e50a6716d716aa2f638ca3cf767e88f613#ca45f0e50a6716d716aa2f638ca3cf767e88f613" +source = "git+https://github.com/lithoscomputer/twins?branch=main#ca45f0e50a6716d716aa2f638ca3cf767e88f613" dependencies = [ "anyhow", "async-stream", diff --git a/Cargo.toml b/Cargo.toml index 61c888b10..98b0fb6b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -73,62 +73,57 @@ sha2 = "0.10" hex = "0.4" insta = "1" fabro-test = { path = "lib/foundation/fabro-test" } -# Provider-neutral LLM catalog and client. Pinned to a revision until 0.x is -# published to crates.io. -lithos-llm = { git = "https://github.com/lithoscomputer/lithos-llm", rev = "43a42ac28e9d9bcf40a91abc02be4f12ca274ebb", default-features = false } -# Deterministic OpenAI twin used by twin-mode E2E tests; the same revision -# lithos-llm verifies its codecs against. -twin-openai = { git = "https://github.com/lithoscomputer/twins", rev = "ca45f0e50a6716d716aa2f638ca3cf767e88f613" } +# Lithos git dependencies (lithos-llm, twins, sandbox-driver, pebble, petri) +# all track `branch = "main"`, here and in every Lithos library that depends +# on them, so the workspace resolves one source per repository and links one +# copy of each shared crate. Fabro's `Cargo.lock` is the single place their +# commits are chosen: move one with `cargo update -p ` (for example +# `cargo update -p sandbox-driver`), never a bare `cargo update`, and review +# `git diff Cargo.lock` for unrelated moves. Don't point Fabro at an unmerged +# library PR; to try unmerged work, add an uncommitted `[patch]` locally. +# +# Provider-neutral LLM catalog and client, from git until 0.x is published to +# crates.io. +lithos-llm = { git = "https://github.com/lithoscomputer/lithos-llm", branch = "main", default-features = false } +# Deterministic OpenAI twin used by twin-mode E2E tests, the twin lithos-llm +# verifies its codecs against. +twin-openai = { git = "https://github.com/lithoscomputer/twins", branch = "main" } twin-github = { path = "test/twin/github" } tokio-tungstenite = { version = "0.26", features = ["rustls-tls-webpki-roots"] } futures-util = "0.3" # sandbox-driver: the sandbox provider layer. Bundled Host, Docker, and # Daytona providers link in-process; third-party providers run as stdio -# plugins through sandbox-driver-protocol. Pinned by rev to sandbox-driver -# `main` (the `section-4-driver-items` work merged in #20; #21 gave the -# protocol crate's `PluginSupervisor` numbered generations, a health probe -# before a generation serves, and a refusal of a replacement that reports -# another resource namespace; #22 made the Daytona exec decoder resync on a -# torn frame and report what it dropped as `ExecStreamingResult::output_loss` -# instead of failing the command; #23 made an idle Host sentinel reap its -# own process group once its owning provider pid is gone, so a provider -# that is killed rather than stopped leaves no sentinel behind; #61 let a -# second process attach read-only to a managed host workspace by path, so -# the server's `petri.run` ownership check runs on the host as on Docker). -# The CI plugin job installs the driver executables at the same rev, read -# from this file. -sandbox-driver = { git = "https://github.com/lithoscomputer/sandbox-driver", rev = "583a16463320966e8f5c88bedd1d759e93fbd05f" } -sandbox-driver-protocol = { git = "https://github.com/lithoscomputer/sandbox-driver", rev = "583a16463320966e8f5c88bedd1d759e93fbd05f" } -sandbox-driver-host = { git = "https://github.com/lithoscomputer/sandbox-driver", rev = "583a16463320966e8f5c88bedd1d759e93fbd05f" } -sandbox-driver-docker = { git = "https://github.com/lithoscomputer/sandbox-driver", rev = "583a16463320966e8f5c88bedd1d759e93fbd05f" } -sandbox-driver-docker-config = { git = "https://github.com/lithoscomputer/sandbox-driver", rev = "583a16463320966e8f5c88bedd1d759e93fbd05f" } -sandbox-driver-daytona = { git = "https://github.com/lithoscomputer/sandbox-driver", rev = "583a16463320966e8f5c88bedd1d759e93fbd05f" } -sandbox-driver-daytona-config = { git = "https://github.com/lithoscomputer/sandbox-driver", rev = "583a16463320966e8f5c88bedd1d759e93fbd05f" } -sandbox-driver-testing = { git = "https://github.com/lithoscomputer/sandbox-driver", rev = "583a16463320966e8f5c88bedd1d759e93fbd05f" } +# plugins through sandbox-driver-protocol. The CI plugin jobs install the +# driver executables at the commit `Cargo.lock` resolves `sandbox-driver` to, +# so the plugins and the in-process driver are one build. +sandbox-driver = { git = "https://github.com/lithoscomputer/sandbox-driver", branch = "main" } +sandbox-driver-protocol = { git = "https://github.com/lithoscomputer/sandbox-driver", branch = "main" } +sandbox-driver-host = { git = "https://github.com/lithoscomputer/sandbox-driver", branch = "main" } +sandbox-driver-docker = { git = "https://github.com/lithoscomputer/sandbox-driver", branch = "main" } +sandbox-driver-docker-config = { git = "https://github.com/lithoscomputer/sandbox-driver", branch = "main" } +sandbox-driver-daytona = { git = "https://github.com/lithoscomputer/sandbox-driver", branch = "main" } +sandbox-driver-daytona-config = { git = "https://github.com/lithoscomputer/sandbox-driver", branch = "main" } +sandbox-driver-testing = { git = "https://github.com/lithoscomputer/sandbox-driver", branch = "main" } # pebble: the coding agent loop fabro runs its agent stages, Ask Fabro -# sessions, hook evaluators, and `fabro exec` on. Pinned by rev to pebble -# `main`. The `Environment` over a sandbox-driver handle is pebble's -# `sandbox_driver` module (the `sandbox-driver` feature), so pebble pins the -# same sandbox-driver rev as this file and the workspace links one copy of -# the driver; a move of either pin moves the other. Pebble pins the same -# lithos-llm rev as fabro, and its lockfile policy is that every shared crate -# resolves to the version lithos-llm locks. -pebble-agent = { git = "https://github.com/lithoscomputer/pebble", rev = "13a7798eddd8e248e0bbdb65d8e812aec3ded9ca" } -pebble-coding-agent = { git = "https://github.com/lithoscomputer/pebble", rev = "13a7798eddd8e248e0bbdb65d8e812aec3ded9ca", features = ["mcp", "search-providers", "sandbox-driver"] } -pebble-cli-core = { git = "https://github.com/lithoscomputer/pebble", rev = "13a7798eddd8e248e0bbdb65d8e812aec3ded9ca" } -# petri: the workflow engine Fabro runs its workflows on. Pinned by rev, the -# same way pebble and sandbox-driver are. Petri pins the same pebble, -# lithos-llm and sandbox-driver revisions as this file, so the workspace links -# one copy of each. Only `fabro-petri` and `fabro-dot` (the DOT parser alone) -# may depend on these packages; the keys carry the `petri_` prefix so the crate -# names say where they come from. -petri_runtime = { git = "https://github.com/lithoscomputer/petri.git", rev = "f80f68b06b3e58401b75b62d0a29c8420effd9e2", package = "petri-runtime" } -petri_execution = { git = "https://github.com/lithoscomputer/petri.git", rev = "f80f68b06b3e58401b75b62d0a29c8420effd9e2", package = "petri-execution" } -petri_store = { git = "https://github.com/lithoscomputer/petri.git", rev = "f80f68b06b3e58401b75b62d0a29c8420effd9e2", package = "petri-store" } -petri_attractor_steps = { git = "https://github.com/lithoscomputer/petri.git", rev = "f80f68b06b3e58401b75b62d0a29c8420effd9e2", package = "petri-attractor-steps" } -petri_frontend_attractor = { git = "https://github.com/lithoscomputer/petri.git", rev = "f80f68b06b3e58401b75b62d0a29c8420effd9e2", package = "petri-frontend-attractor" } -petri_frontend_fabro = { git = "https://github.com/lithoscomputer/petri.git", rev = "f80f68b06b3e58401b75b62d0a29c8420effd9e2", package = "petri-frontend-fabro" } -petri_testkit = { git = "https://github.com/lithoscomputer/petri.git", rev = "f80f68b06b3e58401b75b62d0a29c8420effd9e2", package = "petri-testkit" } +# sessions, hook evaluators, and `fabro exec` on. The `Environment` over a +# sandbox-driver handle is pebble's `sandbox_driver` module (the +# `sandbox-driver` feature); pebble tracks sandbox-driver and lithos-llm +# `main` as this file does, so the workspace links one copy of each. +pebble-agent = { git = "https://github.com/lithoscomputer/pebble", branch = "main" } +pebble-coding-agent = { git = "https://github.com/lithoscomputer/pebble", branch = "main", features = ["mcp", "search-providers", "sandbox-driver"] } +pebble-cli-core = { git = "https://github.com/lithoscomputer/pebble", branch = "main" } +# petri: the workflow engine Fabro runs its workflows on. Petri tracks +# pebble, lithos-llm and sandbox-driver `main` as this file does, so the +# workspace links one copy of each. Only `fabro-petri` and `fabro-dot` (the +# DOT parser alone) may depend on these packages; the keys carry the `petri_` +# prefix so the crate names say where they come from. +petri_runtime = { git = "https://github.com/lithoscomputer/petri.git", branch = "main", package = "petri-runtime" } +petri_execution = { git = "https://github.com/lithoscomputer/petri.git", branch = "main", package = "petri-execution" } +petri_store = { git = "https://github.com/lithoscomputer/petri.git", branch = "main", package = "petri-store" } +petri_attractor_steps = { git = "https://github.com/lithoscomputer/petri.git", branch = "main", package = "petri-attractor-steps" } +petri_frontend_attractor = { git = "https://github.com/lithoscomputer/petri.git", branch = "main", package = "petri-frontend-attractor" } +petri_frontend_fabro = { git = "https://github.com/lithoscomputer/petri.git", branch = "main", package = "petri-frontend-fabro" } +petri_testkit = { git = "https://github.com/lithoscomputer/petri.git", branch = "main", package = "petri-testkit" } sentry = { version = "0.35", default-features = false, features = ["backtrace", "contexts", "ureq", "rustls"] } fork = "0.2" exec = "0.3" diff --git a/lib/apps/fabro-cli/tests/it/workflow/docker.rs b/lib/apps/fabro-cli/tests/it/workflow/docker.rs index 42f562a89..905d7625f 100644 --- a/lib/apps/fabro-cli/tests/it/workflow/docker.rs +++ b/lib/apps/fabro-cli/tests/it/workflow/docker.rs @@ -3,9 +3,10 @@ //! //! Petri serves every provider through a sandbox-driver plugin executable it //! finds on `PATH` (`sandbox-driver-docker` here); CI installs the -//! executables at the rev the workspace pins, and a developer installs them -//! with -//! `cargo install --locked --git https://github.com/lithoscomputer/sandbox-driver --rev sandbox-driver-host sandbox-driver-docker`. +//! executables at the commit `Cargo.lock` resolves `sandbox-driver` to, and a +//! developer installs them with +//! `cargo install --locked --git https://github.com/lithoscomputer/sandbox-driver --rev sandbox-driver-host sandbox-driver-docker`, +//! with `` read from that `Cargo.lock` entry. //! A scenario configured here runs against its own server so the environment //! it creates never leaks into the shared session server. diff --git a/lib/apps/fabro-server/src/server/tests.rs b/lib/apps/fabro-server/src/server/tests.rs index c6262bb39..94a5ab8db 100644 --- a/lib/apps/fabro-server/src/server/tests.rs +++ b/lib/apps/fabro-server/src/server/tests.rs @@ -225,17 +225,12 @@ fn run_json_pending_control(run: &serde_json::Value) -> &serde_json::Value { async fn mock_daytona_auth_probe(server: &MockServer) -> httpmock::Mock<'_> { server .mock_async(|when, then| { - when.method(GET) - .path("/sandbox/paginated") - .query_param("page", "1") - .query_param("limit", "1"); + when.method(GET).path("/sandbox").query_param("limit", "1"); then.status(200) .header("content-type", "application/json") .json_body(json!({ "items": [], - "total": 0, - "page": 1, - "totalPages": 0 + "nextCursor": null })); }) .await diff --git a/lib/apps/fabro-server/tests/it/api/install.rs b/lib/apps/fabro-server/tests/it/api/install.rs index 0fd738959..995976580 100644 --- a/lib/apps/fabro-server/tests/it/api/install.rs +++ b/lib/apps/fabro-server/tests/it/api/install.rs @@ -92,17 +92,12 @@ fn assert_no_legacy_environment_dir(temp_dir: &tempfile::TempDir) { async fn mock_daytona_auth_probe(server: &MockServer) -> httpmock::Mock<'_> { server .mock_async(|when, then| { - when.method(GET) - .path("/sandbox/paginated") - .query_param("page", "1") - .query_param("limit", "1"); + when.method(GET).path("/sandbox").query_param("limit", "1"); then.status(200) .header("content-type", "application/json") .json_body(serde_json::json!({ "items": [], - "total": 0, - "page": 1, - "totalPages": 0 + "nextCursor": null })); }) .await diff --git a/lib/components/fabro-petri/README.md b/lib/components/fabro-petri/README.md index 1b55eca77..77aed8197 100644 --- a/lib/components/fabro-petri/README.md +++ b/lib/components/fabro-petri/README.md @@ -4,11 +4,12 @@ Fabro's adapters over Petri, the workflow engine Fabro runs its workflows on. ## Layering rule -Only this crate imports Petri. The workspace `Cargo.toml` pins the Petri -packages by revision under `petri_*` keys, and `fabro-petri` is the only -member that lists them as dependencies. Every other Fabro crate reaches the -engine through what this crate exports. A Petri pin move is therefore a change -to this crate and the lockfile, nothing else. +Only this crate imports Petri. The workspace `Cargo.toml` lists the Petri +packages under `petri_*` keys, tracking Petri's `main` branch, and +`fabro-petri` is the only member that lists them as dependencies. Every other +Fabro crate reaches the engine through what this crate exports. The workspace +`Cargo.lock` chooses the Petri commit, so moving it (`cargo update -p +petri-runtime`) is a change to this crate and the lockfile, nothing else. ## What it holds diff --git a/lib/components/fabro-petri/src/lib.rs b/lib/components/fabro-petri/src/lib.rs index 80b73dce8..3995db671 100644 --- a/lib/components/fabro-petri/src/lib.rs +++ b/lib/components/fabro-petri/src/lib.rs @@ -58,8 +58,8 @@ //! - [`prune`]: a run's sandboxes deleted through Petri's lease ledger, as //! `petri sandbox prune` deletes them, when Fabro deletes the run. //! -//! The Petri packages are pinned by revision in the workspace `Cargo.toml` -//! under `petri_*` keys. +//! The Petri packages are workspace dependencies under `petri_*` keys that +//! track Petri's `main` branch; the workspace `Cargo.lock` chooses the commit. pub mod admission; pub mod blobs; From f75dc8828c4915189a2ba657aff2b72cea5892ff Mon Sep 17 00:00:00 2001 From: Scott Werner Date: Thu, 24 Sep 2026 12:09:47 -0400 Subject: [PATCH 2/3] docs: shorten the Lithos git dependency convention comments Reduce the workspace Cargo.toml convention block to three lines: Lithos libraries track `main`, Cargo.lock picks the commits (move one with `cargo update -p `), and unmerged library work is tried with an uncommitted `[patch]`. Drop the instruction to hand-review lockfile diffs and trim the restatements in the pebble and petri comments, the fabro-petri README and module doc, AGENTS.md, and the docker test doc. Co-Authored-By: Claude Opus 5.5 (1M context) --- AGENTS.md | 4 ++-- Cargo.toml | 24 +++++++------------ .../fabro-cli/tests/it/workflow/docker.rs | 7 +++--- lib/components/fabro-petri/README.md | 6 ++--- lib/components/fabro-petri/src/lib.rs | 4 ++-- 5 files changed, 17 insertions(+), 28 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 813e33ecd..3ddc8f843 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -117,7 +117,7 @@ Fabro is an AI-powered workflow orchestration platform. Workflows are defined as - **fabro-workflow** — Fabro's platform half of a run: creates a run around Petri's admission (the run's display graph is read off the admitted graph), archives, forks and retries runs, and holds the run tools and the pull request pipeline. Compilation and execution are Petri's, through `fabro-petri` - **fabro-dot** — The workflow graph as written, read through Petri's DOT parser: its name, goal, node and edge counts, and the files it references (`import`, `stack.child_workflow`, `@file` prompts, the goal). The bundler and the workflow-version store walk references through it; `fabro-graphviz` re-emits Fabro DOT for Graphviz through it - **fabro-graphviz** — SVG rendering of workflow graphs through the vendored Graphviz (`graphviz-sys`) -- **fabro-petri** — Fabro's adapters over Petri, the workflow engine: the one crate that imports the Petri packages (workspace dependencies tracking Petri `main`, with the commit chosen in `Cargo.lock`), holding the run store over SQLite and the platform adapters +- **fabro-petri** — Fabro's adapters over Petri, the workflow engine: the one crate that imports the Petri packages (tracking Petri `main`; see the workspace `Cargo.toml`), holding the run store over SQLite and the platform adapters - **fabro-server** — Axum HTTP server. Routes for runs, sessions, models, completions, usage. SSE event streaming. Demo mode via header - **fabro-llm** — Unified LLM client with providers: Anthropic, OpenAI, Gemini, OpenAI-compatible, plus retry/middleware/streaming - **fabro-api** — Auto-generated Rust types and reqwest HTTP client from OpenAPI spec (build.rs + progenitor) @@ -228,7 +228,7 @@ Fabro is an AI-powered workflow orchestration platform. Workflows are defined as - **fabro-workflow** — Fabro's platform half of a run: creates a run around Petri's admission (the run's display graph is read off the admitted graph), archives, forks and retries runs, and holds the run tools and the pull request pipeline. Compilation and execution are Petri's, through `fabro-petri` - **fabro-dot** — The workflow graph as written, read through Petri's DOT parser: its name, goal, node and edge counts, and the files it references (`import`, `stack.child_workflow`, `@file` prompts, the goal). The bundler and the workflow-version store walk references through it; `fabro-graphviz` re-emits Fabro DOT for Graphviz through it - **fabro-graphviz** — SVG rendering of workflow graphs through the vendored Graphviz (`graphviz-sys`) -- **fabro-petri** — Fabro's adapters over Petri, the workflow engine: the one crate that imports the Petri packages (workspace dependencies tracking Petri `main`, with the commit chosen in `Cargo.lock`), holding the run store over SQLite and the platform adapters +- **fabro-petri** — Fabro's adapters over Petri, the workflow engine: the one crate that imports the Petri packages (tracking Petri `main`; see the workspace `Cargo.toml`), holding the run store over SQLite and the platform adapters - **fabro-server** — Axum HTTP server. Routes for runs, sessions, models, completions, usage. SSE event streaming. Demo mode via header - **fabro-llm** — Unified LLM client with providers: Anthropic, OpenAI, Gemini, OpenAI-compatible, plus retry/middleware/streaming - **fabro-api** — Auto-generated Rust types and reqwest HTTP client from OpenAPI spec (build.rs + progenitor) diff --git a/Cargo.toml b/Cargo.toml index 98b0fb6b0..6e3ba46cb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -73,15 +73,10 @@ sha2 = "0.10" hex = "0.4" insta = "1" fabro-test = { path = "lib/foundation/fabro-test" } -# Lithos git dependencies (lithos-llm, twins, sandbox-driver, pebble, petri) -# all track `branch = "main"`, here and in every Lithos library that depends -# on them, so the workspace resolves one source per repository and links one -# copy of each shared crate. Fabro's `Cargo.lock` is the single place their -# commits are chosen: move one with `cargo update -p ` (for example -# `cargo update -p sandbox-driver`), never a bare `cargo update`, and review -# `git diff Cargo.lock` for unrelated moves. Don't point Fabro at an unmerged -# library PR; to try unmerged work, add an uncommitted `[patch]` locally. -# +# Lithos libraries track `main`; this lockfile picks the commits — move one +# with `cargo update -p `. Try unmerged library work with an +# uncommitted `[patch]`, not a PR-head pin. + # Provider-neutral LLM catalog and client, from git until 0.x is published to # crates.io. lithos-llm = { git = "https://github.com/lithoscomputer/lithos-llm", branch = "main", default-features = false } @@ -107,16 +102,13 @@ sandbox-driver-testing = { git = "https://github.com/lithoscomputer/sandbox-driv # pebble: the coding agent loop fabro runs its agent stages, Ask Fabro # sessions, hook evaluators, and `fabro exec` on. The `Environment` over a # sandbox-driver handle is pebble's `sandbox_driver` module (the -# `sandbox-driver` feature); pebble tracks sandbox-driver and lithos-llm -# `main` as this file does, so the workspace links one copy of each. +# `sandbox-driver` feature). pebble-agent = { git = "https://github.com/lithoscomputer/pebble", branch = "main" } pebble-coding-agent = { git = "https://github.com/lithoscomputer/pebble", branch = "main", features = ["mcp", "search-providers", "sandbox-driver"] } pebble-cli-core = { git = "https://github.com/lithoscomputer/pebble", branch = "main" } -# petri: the workflow engine Fabro runs its workflows on. Petri tracks -# pebble, lithos-llm and sandbox-driver `main` as this file does, so the -# workspace links one copy of each. Only `fabro-petri` and `fabro-dot` (the -# DOT parser alone) may depend on these packages; the keys carry the `petri_` -# prefix so the crate names say where they come from. +# petri: the workflow engine Fabro runs its workflows on. Only `fabro-petri` +# and `fabro-dot` (the DOT parser alone) may depend on these packages; the +# keys carry the `petri_` prefix so the crate names say where they come from. petri_runtime = { git = "https://github.com/lithoscomputer/petri.git", branch = "main", package = "petri-runtime" } petri_execution = { git = "https://github.com/lithoscomputer/petri.git", branch = "main", package = "petri-execution" } petri_store = { git = "https://github.com/lithoscomputer/petri.git", branch = "main", package = "petri-store" } diff --git a/lib/apps/fabro-cli/tests/it/workflow/docker.rs b/lib/apps/fabro-cli/tests/it/workflow/docker.rs index 905d7625f..a892cbe34 100644 --- a/lib/apps/fabro-cli/tests/it/workflow/docker.rs +++ b/lib/apps/fabro-cli/tests/it/workflow/docker.rs @@ -3,10 +3,9 @@ //! //! Petri serves every provider through a sandbox-driver plugin executable it //! finds on `PATH` (`sandbox-driver-docker` here); CI installs the -//! executables at the commit `Cargo.lock` resolves `sandbox-driver` to, and a -//! developer installs them with -//! `cargo install --locked --git https://github.com/lithoscomputer/sandbox-driver --rev sandbox-driver-host sandbox-driver-docker`, -//! with `` read from that `Cargo.lock` entry. +//! executables at the `sandbox-driver` commit in `Cargo.lock`, and a developer +//! installs them with +//! `cargo install --locked --git https://github.com/lithoscomputer/sandbox-driver --rev sandbox-driver-host sandbox-driver-docker`. //! A scenario configured here runs against its own server so the environment //! it creates never leaks into the shared session server. diff --git a/lib/components/fabro-petri/README.md b/lib/components/fabro-petri/README.md index 77aed8197..cc86f7cc2 100644 --- a/lib/components/fabro-petri/README.md +++ b/lib/components/fabro-petri/README.md @@ -5,11 +5,9 @@ Fabro's adapters over Petri, the workflow engine Fabro runs its workflows on. ## Layering rule Only this crate imports Petri. The workspace `Cargo.toml` lists the Petri -packages under `petri_*` keys, tracking Petri's `main` branch, and +packages under `petri_*` keys (see its comment for how they are tracked), and `fabro-petri` is the only member that lists them as dependencies. Every other -Fabro crate reaches the engine through what this crate exports. The workspace -`Cargo.lock` chooses the Petri commit, so moving it (`cargo update -p -petri-runtime`) is a change to this crate and the lockfile, nothing else. +Fabro crate reaches the engine through what this crate exports. ## What it holds diff --git a/lib/components/fabro-petri/src/lib.rs b/lib/components/fabro-petri/src/lib.rs index 3995db671..6cb4c7d75 100644 --- a/lib/components/fabro-petri/src/lib.rs +++ b/lib/components/fabro-petri/src/lib.rs @@ -58,8 +58,8 @@ //! - [`prune`]: a run's sandboxes deleted through Petri's lease ledger, as //! `petri sandbox prune` deletes them, when Fabro deletes the run. //! -//! The Petri packages are workspace dependencies under `petri_*` keys that -//! track Petri's `main` branch; the workspace `Cargo.lock` chooses the commit. +//! The Petri packages are workspace dependencies under `petri_*` keys; see the +//! workspace `Cargo.toml` for how they are tracked. pub mod admission; pub mod blobs; From 7f1c871443e04b5770f9ea0cf84396ee18b645e0 Mon Sep 17 00:00:00 2001 From: Scott Werner Date: Thu, 24 Sep 2026 13:41:23 -0400 Subject: [PATCH 3/3] Lock the Lithos libraries at their mains after the branch switch Pebble, Petri, and sandbox-driver now name their internal dependencies by branch = "main", so move the lock to their mains: pebble 72a51ea, Petri cbab2c5, sandbox-driver 236196e (the Daytona cursor-listing fix plus a test-only MSRV fix and a dependency-spelling change), twins 19bf6ae. lithos-llm stays at 43a42ac: its main has changed Observer::on_retry to take a RetryEvent, and pebble doesn't build against that yet. Co-Authored-By: Claude Opus 5.5 (1M context) --- Cargo.lock | 64 +++++++++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dcd17a0a3..0073596f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1642,7 +1642,7 @@ checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" [[package]] name = "daytona-api-client" version = "0.1.0" -source = "git+https://github.com/brynary/daytona-sdk-rust?rev=0e69058c888a6562c70a5b16d707253914cff563#0e69058c888a6562c70a5b16d707253914cff563" +source = "git+https://github.com/brynary/daytona-sdk-rust?branch=main#0e69058c888a6562c70a5b16d707253914cff563" dependencies = [ "reqwest 0.13.4", "reqwest-middleware", @@ -1656,7 +1656,7 @@ dependencies = [ [[package]] name = "daytona-sdk" version = "0.1.0" -source = "git+https://github.com/brynary/daytona-sdk-rust?rev=0e69058c888a6562c70a5b16d707253914cff563#0e69058c888a6562c70a5b16d707253914cff563" +source = "git+https://github.com/brynary/daytona-sdk-rust?branch=main#0e69058c888a6562c70a5b16d707253914cff563" dependencies = [ "daytona-api-client", "daytona-toolbox-client", @@ -1676,7 +1676,7 @@ dependencies = [ [[package]] name = "daytona-toolbox-client" version = "0.1.0" -source = "git+https://github.com/brynary/daytona-sdk-rust?rev=0e69058c888a6562c70a5b16d707253914cff563#0e69058c888a6562c70a5b16d707253914cff563" +source = "git+https://github.com/brynary/daytona-sdk-rust?branch=main#0e69058c888a6562c70a5b16d707253914cff563" dependencies = [ "reqwest 0.13.4", "reqwest-middleware", @@ -3765,7 +3765,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.2", + "windows-core 0.62.2", ] [[package]] @@ -5069,7 +5069,7 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pebble-agent" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/pebble?branch=main#13a7798eddd8e248e0bbdb65d8e812aec3ded9ca" +source = "git+https://github.com/lithoscomputer/pebble?branch=main#72a51ea2652be619f214e331f1fde87e9acb2267" dependencies = [ "async-trait", "futures-util", @@ -5086,7 +5086,7 @@ dependencies = [ [[package]] name = "pebble-cli-core" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/pebble?branch=main#13a7798eddd8e248e0bbdb65d8e812aec3ded9ca" +source = "git+https://github.com/lithoscomputer/pebble?branch=main#72a51ea2652be619f214e331f1fde87e9acb2267" dependencies = [ "anyhow", "async-trait", @@ -5115,7 +5115,7 @@ dependencies = [ [[package]] name = "pebble-coding-agent" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/pebble?branch=main#13a7798eddd8e248e0bbdb65d8e812aec3ded9ca" +source = "git+https://github.com/lithoscomputer/pebble?branch=main#72a51ea2652be619f214e331f1fde87e9acb2267" dependencies = [ "async-trait", "futures-util", @@ -5157,7 +5157,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "petri-attractor-steps" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "async-trait", "globset", @@ -5188,7 +5188,7 @@ dependencies = [ [[package]] name = "petri-driver" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "async-trait", "getrandom 0.3.4", @@ -5208,7 +5208,7 @@ dependencies = [ [[package]] name = "petri-engine" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "petri-ir", "serde", @@ -5220,7 +5220,7 @@ dependencies = [ [[package]] name = "petri-execution" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "async-trait", "petri-driver", @@ -5244,7 +5244,7 @@ dependencies = [ [[package]] name = "petri-executor" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "async-trait", "libc", @@ -5259,7 +5259,7 @@ dependencies = [ [[package]] name = "petri-executor-sandbox" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "async-trait", "petri-executor", @@ -5281,7 +5281,7 @@ dependencies = [ [[package]] name = "petri-frontend" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "marked-yaml", "petri-ir", @@ -5295,7 +5295,7 @@ dependencies = [ [[package]] name = "petri-frontend-attractor" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "minijinja", "petri-frontend", @@ -5312,7 +5312,7 @@ dependencies = [ [[package]] name = "petri-frontend-fabro" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "petri-frontend", "petri-frontend-attractor", @@ -5328,7 +5328,7 @@ dependencies = [ [[package]] name = "petri-frontend-native" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "petri-frontend", "petri-ir", @@ -5339,7 +5339,7 @@ dependencies = [ [[package]] name = "petri-ir" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "regex", "serde", @@ -5352,7 +5352,7 @@ dependencies = [ [[package]] name = "petri-runtime" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "async-trait", "petri-driver", @@ -5373,7 +5373,7 @@ dependencies = [ [[package]] name = "petri-steps" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "async-trait", "petri-executor", @@ -5389,7 +5389,7 @@ dependencies = [ [[package]] name = "petri-store" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "async-trait", "getrandom 0.3.4", @@ -5404,7 +5404,7 @@ dependencies = [ [[package]] name = "petri-testkit" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/petri.git?branch=main#f80f68b06b3e58401b75b62d0a29c8420effd9e2" +source = "git+https://github.com/lithoscomputer/petri.git?branch=main#cbab2c5f134dcbd625f554b6fd6d9704a31bcfd9" dependencies = [ "async-trait", "petri-driver", @@ -6283,7 +6283,7 @@ dependencies = [ [[package]] name = "sandbox-driver" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#236196ed134dd594e7678e38ebbe968097f1935c" dependencies = [ "async-trait", "globset", @@ -6300,7 +6300,7 @@ dependencies = [ [[package]] name = "sandbox-driver-daytona" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#236196ed134dd594e7678e38ebbe968097f1935c" dependencies = [ "anyhow", "async-trait", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "sandbox-driver-daytona-config" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#236196ed134dd594e7678e38ebbe968097f1935c" dependencies = [ "sandbox-driver-docker-config", "serde", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "sandbox-driver-docker" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#236196ed134dd594e7678e38ebbe968097f1935c" dependencies = [ "anyhow", "async-trait", @@ -6359,7 +6359,7 @@ dependencies = [ [[package]] name = "sandbox-driver-docker-config" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#236196ed134dd594e7678e38ebbe968097f1935c" dependencies = [ "serde", "serde_json", @@ -6368,7 +6368,7 @@ dependencies = [ [[package]] name = "sandbox-driver-host" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#236196ed134dd594e7678e38ebbe968097f1935c" dependencies = [ "anyhow", "async-trait", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "sandbox-driver-protocol" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#236196ed134dd594e7678e38ebbe968097f1935c" dependencies = [ "async-trait", "base64", @@ -6403,7 +6403,7 @@ dependencies = [ [[package]] name = "sandbox-driver-testing" version = "0.1.0" -source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#b30203c774b537d3f2697a19eb5b0542d13b0a56" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#236196ed134dd594e7678e38ebbe968097f1935c" dependencies = [ "async-trait", "sandbox-driver", @@ -7877,7 +7877,7 @@ dependencies = [ [[package]] name = "twin-core" version = "0.1.5" -source = "git+https://github.com/lithoscomputer/twins?branch=main#ca45f0e50a6716d716aa2f638ca3cf767e88f613" +source = "git+https://github.com/lithoscomputer/twins?branch=main#19bf6ae2fbfcea7a845fe9fa0796b1d613db859a" dependencies = [ "anyhow", "async-stream", @@ -7911,7 +7911,7 @@ dependencies = [ [[package]] name = "twin-openai" version = "0.1.5" -source = "git+https://github.com/lithoscomputer/twins?branch=main#ca45f0e50a6716d716aa2f638ca3cf767e88f613" +source = "git+https://github.com/lithoscomputer/twins?branch=main#19bf6ae2fbfcea7a845fe9fa0796b1d613db859a" dependencies = [ "anyhow", "async-stream",