From ee0a3813e325b233d6a00ed9bee0a1997de081a8 Mon Sep 17 00:00:00 2001 From: Brett Chien Date: Tue, 8 Sep 2026 21:18:58 +0800 Subject: [PATCH 1/2] fix(console): pin Beta channel to a versioned release, default ACP deploys to it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit resolve_vendor_image_tags's "Beta" resolved to the rolling pre-beta- moving tag, and the wizard's Image tag select had no link to the ACP checkbox at all — picking the implicit default (Stable) with ACP on silently sent whatever Stable currently resolves to. Stable is pinned to 0.9.0 right now (no 0.10.0 GA has cut yet), which predates ACP being wired as a first-class adapter (openab#1418, first in 0.10.0-beta.2) — so that combination reproduces the exact "no adapter configured" crash currently hitting Nike. Beta now resolves to the newest beta-named release (-beta.N) confirmed to have a matching GHCR image, same verify-don't-infer pattern Stable already used, instead of a tag with no version number to reason about. The console defaults the Image tag select to Beta the moment ACP is checked, and re-applies that on every ACP toggle. --- console/src/deploy.ts | 24 +++++- crates/oab-mcp/src/lib.rs | 2 +- crates/oabctl/src/vendor_images.rs | 130 ++++++++++++++++++++++------- 3 files changed, 125 insertions(+), 31 deletions(-) diff --git a/console/src/deploy.ts b/console/src/deploy.ts index 6e27ebc..2bf5eed 100644 --- a/console/src/deploy.ts +++ b/console/src/deploy.ts @@ -281,6 +281,20 @@ export function initDeployPanel(deps: DeployPanelDeps): DeployPanelHandle | null if (isCustom) imageCustomInput.focus(); }; + // studio#153: ACP-enabled deploys need an image with ACP wired as a + // first-class adapter (openab#1418, first shipped in 0.10.0-beta.2) — + // Stable can lag behind that fix for a long stretch (it did: Stable was + // pinned to 0.9.0, which predates the fix entirely, and picking it for an + // ACP-enabled agent reproduces the exact "no adapter configured" crash + // this was written to catch). ACP-on should not silently inherit the + // select's implicit first-option default. Only nudges *into* Beta the + // moment ACP is turned on; never fights a selection made afterward. + const preferBetaForAcp = (): void => { + if (!acpCheckbox.checked) return; + const betaOption = Array.from(imageSelectEl.options).find((o) => o.textContent?.startsWith("Beta")); + if (betaOption) imageSelectEl.value = betaOption.value; + }; + // studio#128/#136: a real lives) is skipped for "add-instance", and reset() - // (run on every open()) puts the only lives in the identity - // step, skipped for "add instance"), so submitting here would silently - // deploy an ECS service into a k8s fleet instead of erroring. Block it - // with the same clear-message pattern the wizard already uses for its - // own not-yet-supported k8s-provider case, rather than let that happen. + // studio#153: the k8s block studio#146's final-review pass added here + // is gone — `deploy.ts`'s submit handler now reads the target fleet's + // runtime/context/namespace/expected_principal straight off + // `FleetConfigEntry` (this lookup) instead of assuming ECS, so an + // "add instance" submit against a k8s fleet provisions into that + // fleet's actual context/namespace rather than silently targeting + // ECS. `fleet` should always resolve here (the operator already + // drilled into this fleet to see the button); fall back to "ecs" only + // to keep the type checker happy, not because it's an expected case. const fleet = fleetConfig?.fleets.find((f) => f.name === activeFleet); - if (fleet?.runtime === "k8s") { - note( - "info", - `fleet "${activeFleet}" is a k8s fleet — adding an instance to an existing k8s fleet isn't supported yet`, - ); - return; - } - deployPanel?.open({ kind: "add-instance", fleetName: activeFleet }); + deployPanel?.open({ + kind: "add-instance", + fleetName: activeFleet, + runtime: fleet?.runtime ?? "ecs", + context: fleet?.context ?? null, + namespace: fleet?.namespace ?? null, + expectedPrincipal: fleet?.expected_principal ?? null, + }); return; } if (target.closest('[data-action="fleet-debug"]') && activeFleet) {