Unsaved changes
-
@@ -1458,7 +1461,7 @@ export function AgentConfigForm(props: AgentConfigFormProps) {
{!isCreate && props.isSaving ? "Saving..." : "Save"}
diff --git a/ui/src/components/new-agent/NewAgentSetup.tsx b/ui/src/components/new-agent/NewAgentSetup.tsx
index 315b0c26e73..0e623bc77b1 100644
--- a/ui/src/components/new-agent/NewAgentSetup.tsx
+++ b/ui/src/components/new-agent/NewAgentSetup.tsx
@@ -146,7 +146,8 @@ function Setup({
const [effort, setEffort] = useState("");
const [modelOpen, setModelOpen] = useState(false);
const [environmentOverride, setEnvironmentOverride] = useState("");
- const [boatEngine, setBoatEngine] = useState<"cli" | "acp" | undefined>();
+ const [boatEngines, setBoatEngines] = useState
>>({});
+ const boatEngine = boatEngines[adapterType];
const [provider, setProvider] = useState("openrouter");
const [apiKey, setApiKey] = useState("");
const [providerBinding, setProviderBinding] = useState(
@@ -352,12 +353,12 @@ function Setup({
value={boatEngine ?? "cli"}
disabled={busy}
onChange={(event) => {
- setBoatEngine(event.target.value === "acp" ? "acp" : "cli");
+ setBoatEngines(current => ({ ...current, [adapterType]: adapterType !== "codex_local" && event.target.value === "acp" ? "acp" : "cli" }));
resetTest();
}}
>
-
+ {adapterType !== "codex_local" && }
) : null;
diff --git a/ui/src/pages/NewAgent.test.tsx b/ui/src/pages/NewAgent.test.tsx
index 40aa0d9ec45..a5e729d6014 100644
--- a/ui/src/pages/NewAgent.test.tsx
+++ b/ui/src/pages/NewAgent.test.tsx
@@ -312,7 +312,7 @@ describe("New agent setup", () => {
});
it.each([
["codex_local", "OpenAI", undefined], ["claude_local", "Claude", undefined],
- ["codex_local", "OpenAI", "acp"], ["claude_local", "Claude", "acp"],
+ ["claude_local", "Claude", "acp"],
])("shows Boat's CLI default before connecting and preserves an explicit engine for %s (%s, %s)", async (adapter, provider, choice) => {
envApi.list.mockResolvedValue([
{ id: "boat-1", name: "Boat", driver: "computer", status: "active", config: { provider: "boat" } },
@@ -323,6 +323,7 @@ describe("New agent setup", () => {
const engine = container.querySelector('[aria-label="Execution engine"]')!;
expect(engine).not.toBeNull();
expect(engine.value).toBe("cli");
+ expect(Array.from(engine.options).some(option => option.value === "acp")).toBe(adapter === "claude_local");
expect(engine.selectedOptions[0].textContent).toBe(adapter === "codex_local" ? "Codex CLI" : "Claude CLI");
expect(api.testEnvironment).not.toHaveBeenCalled();
if (choice) await act(async () => {