Skip to content

feat: New Fleet wizard Step 2 rewrite — vendor + chat platform + ACP (studio#128) - #132

Merged
brettchien merged 1 commit into
mainfrom
feat/new-fleet-wizard-vendor-flow-128
Aug 29, 2026
Merged

feat: New Fleet wizard Step 2 rewrite — vendor + chat platform + ACP (studio#128)#132
brettchien merged 1 commit into
mainfrom
feat/new-fleet-wizard-vendor-flow-128

Conversation

@brettchien

Copy link
Copy Markdown
Contributor

Summary

Items 1-5 of #128's runbook, shipped together (all fields on the same new Step 2 screen — not worth splitting further). Replaces the Template/Overlay compose-library step with the vendor + chat platform + ACP flow confirmed with Brett across #128's design thread.

This directly fixes the original problem that started #119/#128: the Template dropdown ships empty on every fresh install (no bundled default, by design) and blocked the whole "+ New fleet" flow.

Console — new Step 2

  • Vendor <select>: Claude / codex / agy / cursor / kiro. "agy" is only the display label — the option value is "antigravity" (the actual GHCR image variant / Dockerfile.package build-target name resolve_vendor_image_tags expects). Caught this via a real typecheck failure (unused VENDORS translation table) before it shipped — simpler fix was making the HTML option value correct directly, not translating at call time.
  • Image tag: pre-filled from resolve_vendor_image_tags (feat: resolve vendor Stable/Beta image tags from GHCR (studio#128) #131) — Stable if GHCR confirms it exists, else Beta (pre-beta-<vendor>), else left for manual entry. Always editable, a lookup failure never blocks the field.
  • API key (optional): captured, stored as a secret; not yet wired into config.toml (documented gap carried over from feat(studio-cp,oab-mcp,src-tauri): add deploy_provision_agent (studio#128) #129).
  • Chat platform (optional, defaults to none — "use ACP directly"): Discord/Telegram/LINE, reveals the right token field(s) per platform. k8s deploys refuse a non-empty selection both client-side (clean validation message before even calling the tool) and server-side (feat(studio-cp,oab-mcp,src-tauri): add deploy_provision_agent (studio#128) #129's existing refusal — belt and suspenders, not redundant: the client check gives a better message, the server check is the real guarantee).
  • Enable ACP checkbox: default checked, forced off + disabled when vendor = agy (its bridge bypasses openab-gateway's /acp route entirely — confirmed by reading agy-acp/src/main.rs).
  • Agent name: pre-filled with a random Greek god name (Brett's request), shuffle button to re-roll, still freely editable.
  • No separate "Preview bundle" step anymore — fill in the fields, Deploy.

Backend: acp_enabled made caller-controlled

#127 hardcoded acp_enabled: Some(true) inside build_default_manifest/build_default_k8s_manifest with no way for a caller to turn it off — fine when nothing exposed a toggle yet, not fine once the wizard has an actual checkbox (needed for the agy case above, which has to be forceable to false).

  • studio-cp: both functions gained an acp_enabled: bool parameter — only generates the ACP auth secret (AWS Secrets Manager / k8s Secret) when true, no wasted secret nobody will reference. provision_from_library/provision_from_library_k8s (the older compose-library path — unrelated to this wizard, still exists) pass true at their call sites, preserving feat(oabctl,studio-cp): enable ACP by default on Studio-deployed agents #127's original unconditional-on behavior there, unchanged.
  • oab-mcp: deploy_provision_agent's schema gained acp_enabled: boolean, defaulting to true server-side when the caller omits it (same default feat(oabctl,studio-cp): enable ACP by default on Studio-deployed agents #127 had, now explicit and overridable instead of baked in).
  • src-tauri: bridge command threads the new param through.

Verification

  • npm run typecheck clean, npm test 106/106 passing, npm run build succeeds.
  • Rust side not locally compiled — same pre-existing aws-sdk-ec2 OOM limitation as every other Rust PR this week.
  • Not visually/interactively checked in a running app — this is the biggest UI change of the batch, genuinely worth Brett clicking through once merged: New Fleet → pick each vendor (check agy forces ACP off) → pick each chat platform (check the right token fields appear/disappear) → Deploy on both AWS and k8s.

Ref #128.

🤖 Generated with Claude Code

…write (studio#128)

Replaces the Template/Overlay compose-library step (empty on every fresh
install by design, blocking the whole deploy flow — the original #119
screenshot that started this) with the vendor + chat platform + ACP flow
confirmed with Brett across #128's design thread.

## Console (items 1-5 of the runbook, shipped together — all fields live
on the same new Step 2 screen)

- Vendor <select>: Claude/codex/agy/cursor/kiro. "agy" is only the display
  label — the option value is "antigravity" (the GHCR image variant /
  Dockerfile.package build-target name resolve_vendor_image_tags expects).
- Image tag: pre-filled from resolve_vendor_image_tags (#131) — Stable if
  GHCR confirms it exists, else Beta (pre-beta-<vendor>), else left for
  manual entry. Always editable — no lookup failure blocks the field.
- API key (optional): captured, stored as a secret server-side; not yet
  wired into config.toml (documented gap from #129, unchanged here).
- Chat platform (optional, default none — "use ACP directly"):
  Discord/Telegram/LINE, reveals the right token field(s) per platform.
  k8s deploys refuse a non-empty selection both client-side (clean
  validation message) and server-side (#129's existing refusal) — config.toml
  secret resolution needs AWS credentials a k8s pod doesn't have.
- Enable ACP checkbox: default checked, forced off + disabled for
  vendor=agy (its bridge bypasses openab-gateway's /acp route entirely).
- Agent name: pre-filled with a random Greek god name, shuffle button to
  re-roll, still freely editable.
- No separate "Preview bundle" step anymore — fill in the fields, Deploy.

## Backend: acp_enabled made caller-controlled (was hardcoded true in #127)

#127 hardcoded `acp_enabled: Some(true)` inside build_default_manifest /
build_default_k8s_manifest with no way for a caller to turn it off — fine
when nothing exposed a toggle, not fine once the wizard has an actual
checkbox (needed for the agy case above). Both functions, and
AgentWizardInput, now take `acp_enabled: bool` explicitly:
- studio-cp: build_default_manifest/build_default_k8s_manifest gained an
  `acp_enabled: bool` param — only generates the ACP auth secret when true.
  provision_from_library[_k8s] (the older compose-library path, unrelated
  to this wizard) pass `true` at their call sites, preserving #127's
  original unconditional-on behavior there unchanged.
- oab-mcp: deploy_provision_agent's schema gained `acp_enabled: boolean`,
  defaulting to true when the caller omits it (same default #127 had,
  now explicit and overridable instead of baked in).
- src-tauri: bridge command threads the new param through.

Ref #128.
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