Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
99a94bd
feat: replace an agent's sandbox when its configuration changes
cv Oct 17, 2026
5dfdcf0
Merge remote-tracking branch 'origin/v1' into feat/agent-sandbox-repl…
cv Oct 17, 2026
a8a5117
style: format the merged lifecycle classification
cv Oct 17, 2026
4e1bbf1
Merge remote-tracking branch 'origin/v1' into feat/agent-sandbox-repl…
cv Oct 17, 2026
f2e583b
feat: run agents through Fabric's fabric-agent-ctl
cv Oct 17, 2026
38a231f
test(ci): budget the added fabric contract tests
cv Oct 17, 2026
2163df0
Merge branch 'feat/agent-sandbox-replacement' into feat/fabric-agent-ctl
cv Oct 17, 2026
85ed9e8
test(ci): budget the OpenShell contract tests at their current size
cv Oct 17, 2026
4490b1a
Merge branch 'feat/agent-sandbox-replacement' into feat/fabric-agent-ctl
cv Oct 17, 2026
961a508
Revert "test(ci): budget the OpenShell contract tests at their curren…
cv Oct 17, 2026
26570c0
Revert "test(ci): budget the added fabric contract tests"
cv Oct 17, 2026
4167408
Merge branch 'feat/agent-sandbox-replacement' into feat/fabric-agent-ctl
cv Oct 17, 2026
48fbb89
Merge remote-tracking branch 'origin/v1' into feat/agent-sandbox-repl…
cv Oct 17, 2026
47f59ad
Merge branch 'feat/agent-sandbox-replacement' into feat/fabric-agent-ctl
cv Oct 17, 2026
f8fdd0f
fix(image): import the image catalog without the bridge's PYTHONPATH
cv Oct 17, 2026
da0e1fb
perf(fabric): parse the bundled catalog once
cv Oct 17, 2026
baea2ab
Merge branch 'feat/agent-sandbox-replacement' into feat/fabric-agent-ctl
cv Oct 17, 2026
69d0210
Merge remote-tracking branch 'origin/v1' into feat/fabric-agent-ctl
cv Oct 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ jobs:
if: needs.plan.outputs.images == 'true'
run: |
cargo images build --platform "$AGENT_PLATFORM" dummy
cargo images qualify nc-fabric:dummy --lifecycle dummy --require-ready
cargo images qualify nc-fabric:dummy --lifecycle dummy
- name: Check packaging and generic Fabric lifecycle
if: needs.plan.outputs.images == 'true'
run: docker buildx bake check
Expand Down
13 changes: 7 additions & 6 deletions crates/fabric-provider/src/agent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use nemoclaw_fabric::agent::{
use openshell_provider::OpenShell;
use std::borrow::Cow;

/// Reconciles agents through the Fabric bridge of their sandbox.
/// Starts and stops agents through Fabric's `fabric-agent-ctl` in their sandbox.
#[derive(Clone)]
pub struct AgentBackend(pub OpenShell);

Expand All @@ -29,7 +29,7 @@ fn configuration_row(row: &Row) -> Result<Row, ObservationError> {
/// observed document differs from the one they compose.
fn agent_row(agent: &Row, configured: &Row, observed: &Row) -> Row {
let mut row = agent.clone();
for field in ["id", "running"] {
for field in ["id", "runtime_id"] {
if let Some(value) = observed.get(field) {
row.insert(field.into(), value.clone());
}
Expand Down Expand Up @@ -116,15 +116,15 @@ fn sandbox_kept(

/// The Fabric agent resource and its planning rules.
pub fn definitions() -> [nemoclaw_tofu::Definition; 1] {
use nemoclaw_tofu::{Definition, rerun_when_stopped};
use nemoclaw_tofu::{Definition, carry_prior};
let references = agent::references();
let inputs = agent::structured_inputs();
let carried: Vec<&'static str> = references
.iter()
.flat_map(|reference| reference.fields.iter().map(|(_, field)| *field))
.collect();
let sections: Vec<&'static str> = inputs.iter().map(|input| input.field).collect();
let fields: Vec<&'static str> = [NAME, DESCRIPTION, "running"]
let fields: Vec<&'static str> = [NAME, DESCRIPTION, "runtime_id"]
.into_iter()
.chain(carried.iter().copied())
.chain(sections.iter().copied())
Expand All @@ -133,7 +133,7 @@ pub fn definitions() -> [nemoclaw_tofu::Definition; 1] {
// A changed agent is a new agent in a new sandbox. Another endpoint is
// another gateway; credentials rotate in place. A newer image catalog for
// the same harness changes no agent.
let mutable: Vec<&'static str> = [HARNESS_CATALOG, "running"]
let mutable: Vec<&'static str> = [HARNESS_CATALOG, "runtime_id"]
.into_iter()
.chain(gateway[1..].iter().copied())
.collect();
Expand All @@ -144,7 +144,8 @@ pub fn definitions() -> [nemoclaw_tofu::Definition; 1] {
.collect();
let mut definition = Definition::new("agent", &fields, &mutable)
.optional(&optional)
.computed("running", rerun_when_stopped)
// The ID Fabric gives the sandbox's one runtime, for invocations.
.computed("runtime_id", carry_prior)
.validate_inputs(validate)
.refuse_replacement_when(sandbox_kept)
// Readiness compares the applied document with this digest.
Expand Down
315 changes: 0 additions & 315 deletions crates/fabric-provider/src/agent_readiness.rs

This file was deleted.

Loading
Loading