diff --git a/server/src/services/computer-environment-driver.test.ts b/server/src/services/computer-environment-driver.test.ts index 816c0ce3123..186e2ee72c1 100644 --- a/server/src/services/computer-environment-driver.test.ts +++ b/server/src/services/computer-environment-driver.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it, vi } from "vitest"; +import { resolveEnvironmentExecutionTarget, resolveEnvironmentExecutionTransport } from "./environment-execution-target.js"; import { createComputerEnvironmentDriver } from "./computer-environment-driver.js"; const state = vi.hoisted(() => { @@ -12,6 +13,13 @@ vi.mock("./environments.js", () => ({ environmentService: () => state })); vi.mock("./instance-settings.js", () => ({ instanceSettingsService: () => ({ getExperimental: async () => ({ enableBoatEnvironments: true }) }) })); describe("computer environment probe ownership", () => { + it("does not construct a computer owner for legacy transport serialization", async () => { + const input = { db: {} as never, companyId: "company", adapterType: "paperclip_runner", + environment: { id: "environment", driver: "computer", config: {} }, leaseMetadata: null }; + await expect(resolveEnvironmentExecutionTransport(input)).resolves.toBeNull(); + await expect(resolveEnvironmentExecutionTarget(input)).rejects.toThrow("computer_lease_required"); + }); + it("keeps stable configuration on one session key and fences a changed model", async () => { state.admit.mockClear(); const db = { update: () => ({ set: () => ({ where: async () => undefined }) }) }; diff --git a/server/src/services/environment-execution-target.ts b/server/src/services/environment-execution-target.ts index b83014756cd..e529b6752a6 100644 --- a/server/src/services/environment-execution-target.ts +++ b/server/src/services/environment-execution-target.ts @@ -679,5 +679,8 @@ export async function resolveEnvironmentExecutionTarget(input: { export async function resolveEnvironmentExecutionTransport( input: Parameters[0], ): Promise | null> { + // Computer execution uses a live owner capability, resolved after workspace + // realization. It has no legacy serialized transport to resolve at acquire. + if (input.environment.driver === "computer") return null; return adapterExecutionTargetToRemoteSpec(await resolveEnvironmentExecutionTarget(input)) as Record | null; }