diff --git a/scripts/e2e.config.ts b/scripts/e2e.config.ts index 520fc8338d..4af872c1c0 100644 --- a/scripts/e2e.config.ts +++ b/scripts/e2e.config.ts @@ -148,33 +148,7 @@ export default { }, }, }, - { - name: "ios", - engine: mobile({ - platform: "ios", - device: simlock("iPhone 18 Pro"), - session: "t3-scenarios", - }), - app: { - bundleId: "com.t3tools.t3code.dev", - // Metro starts after the server listens, so it answering means both are up. - readyUrl: `http://127.0.0.1:${MOBILE.metroPort}/status`, - command: { - executable: resolved.node, - args: [ - startApp, - "mobile", - MOBILE_T3_HOME, - String(MOBILE.serverPort), - String(MOBILE.metroPort), - MOBILE.host, - ], - cwd: APP_DIR, - startupTimeout: 300_000, - log: ".e2e/mobile-app.log", - }, - }, - }, + ], // One server holds every test's state, and a dev stack is heavy. workers: 1, diff --git a/scripts/scenarios/start-app.ts b/scripts/scenarios/start-app.ts index 5dee3f26c1..79c933ecb4 100644 --- a/scripts/scenarios/start-app.ts +++ b/scripts/scenarios/start-app.ts @@ -22,7 +22,7 @@ import { ScenarioError } from "./shell.ts"; // The dev runner's web port is 5733 plus an offset. Mirror of BASE_WEB_PORT in dev-runner.ts. const BASE_WEB_PORT = 5733; // The replay agent `vp run dev` registers: free, recorded turns through the real adapter. -const REPLAY = { instanceId: "devReplay", model: "showcase" }; +const REPLAY = { instanceId: "devinEvidence", model: "plan-replay" }; // Generated text (titles) cannot go to the replay agent: the server swaps an ACP agent for the // first enabled real provider, else its default, Codex. So every provider it could fall back to // is off and Codex is a command that only fails: no run reaches a paid model. @@ -63,6 +63,10 @@ const prepareHome = Effect.fn("startApp.prepareHome")(function* (home: string) { yield* fs.writeFileString(shim, HOST_LABEL_SHIM); yield* fs.chmod(shim, 0o755); } + const replayExecutable = yield* path.fromFileUrl(new URL("./devin-plan-replay.cjs", import.meta.url)); + const registryDir = path.join(home, "caches/acp-registry"); + yield* fs.makeDirectory(registryDir, { recursive: true }); + yield* fs.writeFileString(path.join(registryDir, "registry.json"), JSON.stringify({version:"1",agents:[{id:"devin",name:"Plan approval replay",version:"1.0.0",description:"Synthetic Devin plan-exit replay",distribution:{binary:{"linux-x86_64":{archive:"https://example.invalid/replay.tar.gz",cmd:"devin",args:["acp"]}}}}]})); const noModel = path.join(home, "bin/no-model"); yield* fs.writeFileString(noModel, "#!/bin/sh\necho 'scenarios run no model' >&2\nexit 1\n"); yield* fs.chmod(noModel, 0o755); @@ -71,14 +75,14 @@ const prepareHome = Effect.fn("startApp.prepareHome")(function* (home: string) { yield* encodeSettings({ defaultModelSelection: REPLAY, providerInstances: Object.fromEntries( - REAL_PROVIDERS.map((driver) => [ + [["devinEvidence", { driver: "acpRegistry", displayName: "Plan approval replay", enabled: true, config: { agentId: "devin", source: "registry", commandPath: replayExecutable } }], ...REAL_PROVIDERS.map((driver) => [ driver, { driver, enabled: false, ...(driver === "codex" ? { config: { binaryPath: noModel } } : {}), }, - ]), + ])], ), }), );