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..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 (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 (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 (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 (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.lock b/Cargo.lock index 424c56a68..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=5e86990418e21f4288ce537c9852dfdf78768abc#5e86990418e21f4288ce537c9852dfdf78768abc" +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=5e86990418e21f4288ce537c9852dfdf78768abc#5e86990418e21f4288ce537c9852dfdf78768abc" +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=5e86990418e21f4288ce537c9852dfdf78768abc#5e86990418e21f4288ce537c9852dfdf78768abc" +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]] @@ -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#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?rev=13a7798eddd8e248e0bbdb65d8e812aec3ded9ca#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?rev=13a7798eddd8e248e0bbdb65d8e812aec3ded9ca#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=f80f68b06b3e58401b75b62d0a29c8420effd9e2#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?rev=583a16463320966e8f5c88bedd1d759e93fbd05f#583a16463320966e8f5c88bedd1d759e93fbd05f" +source = "git+https://github.com/lithoscomputer/sandbox-driver?branch=main#236196ed134dd594e7678e38ebbe968097f1935c" 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#236196ed134dd594e7678e38ebbe968097f1935c" 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#236196ed134dd594e7678e38ebbe968097f1935c" 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#236196ed134dd594e7678e38ebbe968097f1935c" 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#236196ed134dd594e7678e38ebbe968097f1935c" 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#236196ed134dd594e7678e38ebbe968097f1935c" 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#236196ed134dd594e7678e38ebbe968097f1935c" 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#236196ed134dd594e7678e38ebbe968097f1935c" 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#19bf6ae2fbfcea7a845fe9fa0796b1d613db859a" 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#19bf6ae2fbfcea7a845fe9fa0796b1d613db859a" dependencies = [ "anyhow", "async-stream", diff --git a/Cargo.toml b/Cargo.toml index 61c888b10..6e3ba46cb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -73,62 +73,49 @@ 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 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 } +# 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-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. 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..a892cbe34 100644 --- a/lib/apps/fabro-cli/tests/it/workflow/docker.rs +++ b/lib/apps/fabro-cli/tests/it/workflow/docker.rs @@ -3,8 +3,8 @@ //! //! 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 +//! 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/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..cc86f7cc2 100644 --- a/lib/components/fabro-petri/README.md +++ b/lib/components/fabro-petri/README.md @@ -4,11 +4,10 @@ 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 (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. ## What it holds diff --git a/lib/components/fabro-petri/src/lib.rs b/lib/components/fabro-petri/src/lib.rs index 80b73dce8..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 pinned by revision in the workspace `Cargo.toml` -//! under `petri_*` keys. +//! 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;