Skip to content

feat(provision): compose→artifacts + bundleFrom + provision lib (deploy slice 2, path A) - #65

Merged
brettchien merged 2 commits into
mainfrom
feat/deploy-slice2-ecs-provision
Aug 16, 2026
Merged

feat(provision): compose→artifacts + bundleFrom + provision lib (deploy slice 2, path A)#65
brettchien merged 2 commits into
mainfrom
feat/deploy-slice2-ecs-provision

Conversation

@brettchien

Copy link
Copy Markdown
Contributor

Slice 2 foundation of the accepted agent-deployment ADR (#63), transport path A (Brett's call, 2026-08-16): extend the existing artifacts/{ns}/{name}/ prefix to carry the whole composed bundle; the runtime restores that prefix into ~ at first boot. Stacked on #64 (Slice 1) — review that first.

What's here (all additive, backward-compatible)

studio-composeBundle::artifact_objects(ns, name): pure {path → bytes}(artifacts/{ns}/{name}/{path}, bytes) upload set, plus artifacts_prefix(). Deterministic (sorted), unit-tested — the S3 key layout is verifiable without touching S3.

oabctl manifest — new optional Spec.bundleFrom (an s3://…/artifacts/{ns}/{name}/ prefix), mirroring the existing bootstrapFrom; propagated through OABFleet expand(). configFrom stays the single-file config the container reads directly. Manifests without bundleFrom default to None, so every existing deployment is unchanged.

oabctl::studio_api (the Studio-facing, config-free, additive-only surface) —

  • bundle_from_uri(bucket, ns, name) → the trailing-slash prefix URI.
  • push_bundle(...) — put each bundle object to the control-plane bucket (idempotent overwrites → re-provision replaces the prior bundle).
  • provision(...)push the bundle, then apply the manifest at its chosen image tag. Reuses parse_manifests + apply_manifests; bundle-first so the file carrier exists before ECS pulls the task up.
  • Tests: bundle_from_uri shape + bundleFrom manifest round-trip (present → Some, absent → None).

Deferred — next increments

  • oab-mcp deploy_provision tool → src-tauri command → Deploy button on the Compose preview (needs a decision on where runtime/networking params come from for a Studio-initiated deploy — the overlay's runtime section is the likely home).
  • create wizard: upload the full bundle + emit bundleFrom (today it uploads only config.toml).
  • openab image (cross-repo, needs Falcon): boot step that s3 syncs the bundleFrom prefix into ~ on first seed (bundle seeds only when state is absent; pre_seed runtime state wins thereafter). Until this lands, Studio can push the bundle + roll the service, but the agent won't restore persona/skills from it yet.

Verification

  • cargo test -p studio-compose → 19 passed
  • cargo check -p oabctl + cargo check -p oabctl --tests clean (full test + src-tauri build run under CI; the AWS-SDK test-profile codegen OOMs my constrained box, so CI is the gate there)

🤖 Generated with Claude Code

Orca and others added 2 commits August 16, 2026 23:07
…rovision (deploy slice 2, path A)

Slice 2 foundation of the agent-deployment ADR (#63), path A (extend the
artifacts prefix; the runtime restores it into ~ at boot):

- studio-compose: Bundle::artifact_objects(ns, name) — pure {path->bytes}
  → (artifacts/{ns}/{name}/{path}, bytes) mapping + artifacts_prefix().
  Unit-tested (2 new).
- oabctl manifest: new optional Spec.bundleFrom (mirrors bootstrapFrom;
  propagated through OABFleet expand). Legacy manifests unchanged (default None).
- oabctl studio_api (additive, config-free): bundle_from_uri(), push_bundle()
  (put each object to the control-plane bucket), and provision() = push bundle
  then apply the manifest at its chosen image tag. Reuses parse_manifests +
  apply_manifests. Tests for bundle_from_uri + bundleFrom manifest round-trip.

Deferred (next increments): oab-mcp deploy_provision tool + src-tauri command
+ Compose-tab Deploy button + create-wizard bundle support; and the openab
image boot step that syncs bundleFrom prefix into ~ (cross-repo).

Verified: cargo test -p studio-compose (19); cargo check -p oabctl (+ --tests).
Full oabctl test + src-tauri build run under CI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ack ②)

Wire the compose library to a one-click ECS deploy, end to end:

- oabctl studio_api: load_manifest() reads the stored desired manifest
  (manifests/{ns}/{name}.yaml); redeploy() loads it, repoints image +
  bundleFrom, pushes the bundle, and applies — networking/resources/secrets
  ride along from the stored manifest, so a redeploy needs no infra input.
- studio-cp: provision_from_library() — compose template⊕overlay, then
  redeploy; returns a ProvisionOutcome (image/digest/objects/action).
- oab-mcp: new deploy_provision tool (thin dispatch into studio-cp).
- src-tauri: deploy_provision command bridging to the sidecar tool.
- console: Deploy form on the Compose tab (revealed after preview) —
  namespace/name/image tag → compose→push→apply, with result status.

The agent must already be created (redeploy reuses its stored manifest);
net-new agent networking-from-bootstrap is a follow-up, as is the openab
image-side bundle consumption (still under discussion).

Verified: cargo check -p oabctl / -p studio-cp / -p oab-mcp; console tsc +
65 vitest + vite build. Full workspace test + src-tauri build run under CI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@brettchien
brettchien changed the base branch from feat/deploy-slice1-compose to main August 16, 2026 15:07
@brettchien
brettchien force-pushed the feat/deploy-slice2-ecs-provision branch from e01d3a0 to d20a6e0 Compare August 16, 2026 15:07
@brettchien
brettchien merged commit 45b462b into main Aug 16, 2026
2 checks passed
@brettchien
brettchien deleted the feat/deploy-slice2-ecs-provision branch August 16, 2026 15:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant