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 <crate>`.

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) <noreply@anthropic.com>
This commit is contained in:
Scott Werner 2026-09-23 12:40:52 -04:00
parent a2b39a2408
commit 00984ce241
9 changed files with 117 additions and 126 deletions

View file

@ -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

View file

@ -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)

65
Cargo.lock generated
View file

@ -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",

View file

@ -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 <crate>` (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"

View file

@ -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 <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 <rev> sandbox-driver-host sandbox-driver-docker`,
//! with `<rev>` 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.

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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;