From abad2bd0dacfd677bac684ab2da551831f4f4227 Mon Sep 17 00:00:00 2001 From: Dotta Date: Tue, 29 Sep 2026 09:53:20 -0500 Subject: [PATCH] Bind Daytona image identity to Cursor isolation patch Co-Authored-By: Paperclip --- tests/runner-e2e/daytona-image-content.ts | 1 + tests/runner-e2e/daytona-image.test.ts | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/tests/runner-e2e/daytona-image-content.ts b/tests/runner-e2e/daytona-image-content.ts index 13cd2b58f5..4ab5b2e4a7 100644 --- a/tests/runner-e2e/daytona-image-content.ts +++ b/tests/runner-e2e/daytona-image-content.ts @@ -38,6 +38,7 @@ export const DAYTONA_IMAGE_INPUT_PATHS = [ "packages/paperclip-runner/scripts/build-provider-pack.mjs", "packages/paperclip-runner/scripts/candidate-provider-pack.mjs", "packages/paperclip-runner/scripts/materialize-cursor-distribution.mjs", + "packages/paperclip-runner/scripts/cursor-runtime-patch.mjs", "packages/paperclip-runner/scripts/build-verified-provider-entrypoints.mjs", "packages/paperclip-runner/scripts/generate-acpx-sidecar-contract.mjs", "packages/paperclip-runner/scripts/generate-protocol-schema-module.mjs", diff --git a/tests/runner-e2e/daytona-image.test.ts b/tests/runner-e2e/daytona-image.test.ts index 3087aab83e..9589629542 100644 --- a/tests/runner-e2e/daytona-image.test.ts +++ b/tests/runner-e2e/daytona-image.test.ts @@ -201,6 +201,7 @@ describe("runner E2E Daytona image contract", () => { "packages/paperclip-runner/package.json", "packages/paperclip-runner/scripts/candidate-provider-pack.mjs", "packages/paperclip-runner/scripts/materialize-cursor-distribution.mjs", + "packages/paperclip-runner/scripts/cursor-runtime-patch.mjs", "packages/paperclip-runner/cursor-distributions.json", "packages/paperclip-runner/runner/crates", "packages/paperclip-runner/src", @@ -331,6 +332,28 @@ describe("runner E2E Daytona image contract", () => { } }); + it("invalidates the image when the Cursor runtime isolation patch changes", async () => { + const root = await mkdtemp(path.join(tmpdir(), "paperclip-cursor-image-id-")); + const patchPath = "packages/paperclip-runner/scripts/cursor-runtime-patch.mjs"; + expect(DAYTONA_IMAGE_INPUT_PATHS).toContain(patchPath); + const options = { + repositoryRoot: root, + inputPaths: [patchPath], + baseImages: [`example.test/base:1@sha256:${"a".repeat(64)}`], + frontendDigest: `sha256:${"c".repeat(64)}`, + candidateProviders: ["cursor"], + } as const; + try { + await mkdir(path.dirname(path.join(root, patchPath)), { recursive: true }); + await writeFile(path.join(root, patchPath), "export const policy = 'one';\n"); + const baseline = await computeDaytonaImageContentId(options); + await writeFile(path.join(root, patchPath), "export const policy = 'two';\n"); + expect(await computeDaytonaImageContentId(options)).not.toBe(baseline); + } finally { + await rm(root, { recursive: true, force: true }); + } + }); + it("reuses the image for runner-only tests and documentation", async () => { const root = await mkdtemp( path.join(tmpdir(), "paperclip-daytona-runner-development-inputs-"),