From 3a5637732b4b16caf0f5b373e6ed1ae8f32e04ab Mon Sep 17 00:00:00 2001 From: Dotta Date: Mon, 28 Sep 2026 17:35:56 -0500 Subject: [PATCH] fix(runner): pin patched Node for remote provider packs --- docker/daytona-runner/Dockerfile | 2 +- docker/daytona-runner/README.md | 6 ++++++ tests/runner-e2e/daytona-image.test.ts | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docker/daytona-runner/Dockerfile b/docker/daytona-runner/Dockerfile index 50c22ec37c..5a1da31b1f 100644 --- a/docker/daytona-runner/Dockerfile +++ b/docker/daytona-runner/Dockerfile @@ -12,7 +12,7 @@ COPY packages/paperclip-runner/protocol ../protocol RUN cargo build --locked --release -j 2 -p paperclip-runner-core --bin paperclip-runnerd \ && strip /workspace/packages/paperclip-runner/runner/target/release/paperclip-runnerd -FROM node:24-bookworm@sha256:9137a20e25879e0b557227b57e3ee4e9af4bde29eb3db66134cd1723e84f830b AS provider-pack-build +FROM node:24.21.0-bookworm@sha256:5a750d3be5e5c80275f8c9a5367c3aed99c2875656590c8d0701c7ee687f5f0a AS provider-pack-build RUN corepack enable && corepack prepare pnpm@9.15.4 --activate WORKDIR /workspace COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc tsconfig.base.json ./ diff --git a/docker/daytona-runner/README.md b/docker/daytona-runner/README.md index 3d4fb80b53..cd54962638 100644 --- a/docker/daytona-runner/README.md +++ b/docker/daytona-runner/README.md @@ -94,6 +94,12 @@ full Git SHA as `PAPERCLIP_RUNNER_SOURCE_REVISION`. Do not bake provider credentials, Paperclip bootstrap tickets, or Daytona preview tokens into this image. They remain per-run secret material. +The provider-pack build pins the official Linux x64 Node 24.21.0 image by +manifest digest. Its bundled Undici is 7.29.1, which fixes +[GHSA-3wwx-pv8p-q78v](https://github.com/advisories/GHSA-3wwx-pv8p-q78v). +Pi separately verifies its private Node executable and nested npm dependency; +changing the outer interpreter does not replace either provider-owned pin. + Provider CLI updates are manifest-only changes: repository CI owns the root lockfile. Resolve the complete workspace manifest graph in the build context before invoking Docker, matching CI when a source commit precedes the lockfile diff --git a/tests/runner-e2e/daytona-image.test.ts b/tests/runner-e2e/daytona-image.test.ts index 997a8e5bd6..3d4a2786b5 100644 --- a/tests/runner-e2e/daytona-image.test.ts +++ b/tests/runner-e2e/daytona-image.test.ts @@ -82,7 +82,7 @@ describe("runner E2E Daytona image contract", () => { ); expect(extractDaytonaBaseImages(dockerfile)).toEqual([ "rust:1.97-bookworm@sha256:408fe88047cef61a2087653b0c5255fa51c0f2d6d94ddedd7a2562a9b91a46f6", - "node:24-bookworm@sha256:9137a20e25879e0b557227b57e3ee4e9af4bde29eb3db66134cd1723e84f830b", + "node:24.21.0-bookworm@sha256:5a750d3be5e5c80275f8c9a5367c3aed99c2875656590c8d0701c7ee687f5f0a", "daytonaio/sandbox:0.8.0@sha256:eadf88e4391072b7ad4bed27d9cadfc9fe9d8ed375d9219d34c2ccb518f213e3", ]); expect(dockerignore).toContain("**/node_modules");