From 2e6a4188685b5ad0a5a527f1ffaba29bccff74c4 Mon Sep 17 00:00:00 2001 From: Dotta Date: Tue, 18 Aug 2026 17:13:44 +0000 Subject: [PATCH] fix(release): vendor Runner D in the server package Keep the clean-consumer Runner D package out of first-publish CI enrollment while bundling its compiled runtime into the released server artifact. Co-Authored-By: Paperclip --- packages/paperclip-runner/package.json | 1 + scripts/release-package-manifest.json | 7 +------ server/package.json | 6 +++--- server/scripts/vendor-paperclip-runner.mjs | 19 +++++++++++++++++++ server/src/services/heartbeat.ts | 2 +- .../native-runtime/completion-contracts.ts | 2 +- .../native-runtime/native-execution-input.ts | 4 ++-- .../native-interaction-bridge.ts | 2 +- .../native-runtime/native-session-executor.ts | 4 ++-- .../paperclip-control-plane-port.ts | 4 ++-- server/src/vendor/paperclip-runner/index.ts | 4 ++++ 11 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 server/scripts/vendor-paperclip-runner.mjs create mode 100644 server/src/vendor/paperclip-runner/index.ts diff --git a/packages/paperclip-runner/package.json b/packages/paperclip-runner/package.json index a4a7c1de7fd..d48495d6d71 100644 --- a/packages/paperclip-runner/package.json +++ b/packages/paperclip-runner/package.json @@ -1,6 +1,7 @@ { "name": "@paperclipai/paperclip-runner", "version": "0.1.2", + "private": true, "license": "MIT", "type": "module", "exports": { diff --git a/scripts/release-package-manifest.json b/scripts/release-package-manifest.json index 6a5530d4ed0..2f785b64302 100644 --- a/scripts/release-package-manifest.json +++ b/scripts/release-package-manifest.json @@ -82,12 +82,7 @@ { "dir": "packages/paperclip-eval-kernel", "name": "@paperclipai/paperclip-eval-kernel", - "publishFromCi": true - }, - { - "dir": "packages/paperclip-runner", - "name": "@paperclipai/paperclip-runner", - "publishFromCi": true + "publishFromCi": false }, { "dir": "packages/plugins/sdk", diff --git a/server/package.json b/server/package.json index e11497d19be..f27be5c0f4e 100644 --- a/server/package.json +++ b/server/package.json @@ -35,8 +35,8 @@ "dev": "tsx src/index.ts", "dev:watch": "cross-env PAPERCLIP_MIGRATION_PROMPT=never PAPERCLIP_MIGRATION_AUTO_APPLY=true tsx ./scripts/dev-watch.ts", "prepare:ui-dist": "bash ../scripts/prepare-server-ui-dist.sh", - "build": "tsc && mkdir -p dist/onboarding-assets dist/built-ins && cp -R src/onboarding-assets/. dist/onboarding-assets/ && cp -R src/built-ins/. dist/built-ins/", - "prepack": "pnpm run prepare:ui-dist", + "build": "pnpm --filter @paperclipai/paperclip-runner build:typescript && tsc && mkdir -p dist/onboarding-assets dist/built-ins && cp -R src/onboarding-assets/. dist/onboarding-assets/ && cp -R src/built-ins/. dist/built-ins/ && node scripts/vendor-paperclip-runner.mjs", + "prepack": "pnpm run prepare:ui-dist && node scripts/vendor-paperclip-runner.mjs", "postpack": "rm -rf ui-dist", "clean": "rm -rf dist", "start": "node dist/index.js", @@ -57,7 +57,6 @@ "@paperclipai/adapter-utils": "workspace:*", "@paperclipai/db": "workspace:*", "@paperclipai/plugin-sdk": "workspace:*", - "@paperclipai/paperclip-runner": "workspace:*", "@paperclipai/shared": "workspace:*", "@paperclipai/skills-catalog": "workspace:*", "@paperclipai/hermes-paperclip-adapter": "workspace:*", @@ -83,6 +82,7 @@ "zod": "^3.24.2" }, "devDependencies": { + "@paperclipai/paperclip-runner": "workspace:*", "@types/express": "^5.0.0", "@types/express-serve-static-core": "^5.1.3", "@types/jsdom": "^28.0.0", diff --git a/server/scripts/vendor-paperclip-runner.mjs b/server/scripts/vendor-paperclip-runner.mjs new file mode 100644 index 00000000000..d8915cc469e --- /dev/null +++ b/server/scripts/vendor-paperclip-runner.mjs @@ -0,0 +1,19 @@ +import { access, cp, mkdir, rm } from "node:fs/promises"; +import { resolve } from "node:path"; + +const serverRoot = resolve(import.meta.dirname, ".."); +const runnerDist = resolve(serverRoot, "../packages/paperclip-runner/dist"); +const vendorRoot = resolve(serverRoot, "dist/vendor"); +const vendorDist = resolve(vendorRoot, "paperclip-runner"); + +await access(resolve(runnerDist, "index.js")).catch(() => { + throw new Error( + "Runner D build output is missing. Run pnpm --filter @paperclipai/paperclip-runner build:typescript first.", + ); +}); + +await rm(vendorDist, { recursive: true, force: true }); +await mkdir(vendorRoot, { recursive: true }); +await cp(runnerDist, vendorDist, { recursive: true }); + +process.stdout.write("Vendored Runner D JavaScript into the server distribution.\n"); diff --git a/server/src/services/heartbeat.ts b/server/src/services/heartbeat.ts index e669495d952..ca9119af598 100644 --- a/server/src/services/heartbeat.ts +++ b/server/src/services/heartbeat.ts @@ -99,7 +99,7 @@ import { parseNativeExecutionInput, type NativeExecutionInputV1, type NativeSessionBackend, -} from "@paperclipai/paperclip-runner"; +} from "../vendor/paperclip-runner/index.js"; import { normalizeResponsibleUserDenialCode } from "./responsible-user-denial-run-outcomes.js"; import { getRunLogStore, type RunLogHandle } from "./run-log-store.js"; import { getServerAdapter, listAdapterModelProfiles, runningProcesses } from "../adapters/index.js"; diff --git a/server/src/services/native-runtime/completion-contracts.ts b/server/src/services/native-runtime/completion-contracts.ts index 96163ee2abb..15e80b45b00 100644 --- a/server/src/services/native-runtime/completion-contracts.ts +++ b/server/src/services/native-runtime/completion-contracts.ts @@ -1,7 +1,7 @@ import { and, desc, eq } from "drizzle-orm"; import type { Db } from "@paperclipai/db"; import { completionContracts } from "@paperclipai/db"; -import type { StrictCompletionContractInput } from "@paperclipai/paperclip-runner"; +import type { StrictCompletionContractInput } from "../../vendor/paperclip-runner/index.js"; import { nativeSha256 } from "./canonical.js"; export const NATIVE_COMPLETION_CONTRACT_SCHEMA = "paperclip.completion-contract.v1"; diff --git a/server/src/services/native-runtime/native-execution-input.ts b/server/src/services/native-runtime/native-execution-input.ts index 3aef3c47704..32a1475b95f 100644 --- a/server/src/services/native-runtime/native-execution-input.ts +++ b/server/src/services/native-runtime/native-execution-input.ts @@ -2,8 +2,8 @@ import type { NativeExecutionInputV1, NativeInteractionResponseEnvelope, StrictCompletionContractInput, -} from "@paperclipai/paperclip-runner"; -import { parseNativeExecutionInput } from "@paperclipai/paperclip-runner"; +} from "../../vendor/paperclip-runner/index.js"; +import { parseNativeExecutionInput } from "../../vendor/paperclip-runner/index.js"; /** Closed constructor: callers cannot spread legacy context or environment data. */ export function buildNativeExecutionInput(input: { diff --git a/server/src/services/native-runtime/native-interaction-bridge.ts b/server/src/services/native-runtime/native-interaction-bridge.ts index e6a7e0f482f..c80bcbb69e6 100644 --- a/server/src/services/native-runtime/native-interaction-bridge.ts +++ b/server/src/services/native-runtime/native-interaction-bridge.ts @@ -1,5 +1,5 @@ import type { Db } from "@paperclipai/db"; -import type { NativeInteractionResponseEnvelope } from "@paperclipai/paperclip-runner"; +import type { NativeInteractionResponseEnvelope } from "../../vendor/paperclip-runner/index.js"; import { and, asc, eq, inArray } from "drizzle-orm"; import { agents, diff --git a/server/src/services/native-runtime/native-session-executor.ts b/server/src/services/native-runtime/native-session-executor.ts index 36b6348759d..5a87d0cb9e4 100644 --- a/server/src/services/native-runtime/native-session-executor.ts +++ b/server/src/services/native-runtime/native-session-executor.ts @@ -5,11 +5,11 @@ import type { NativeExecutionInputV1, NativeSession, NativeSessionBackend, -} from "@paperclipai/paperclip-runner"; +} from "../../vendor/paperclip-runner/index.js"; import { createCodexNativeSessionBackend, executeNativeSession, -} from "@paperclipai/paperclip-runner"; +} from "../../vendor/paperclip-runner/index.js"; import type { Db } from "@paperclipai/db"; import { and, eq, sql } from "drizzle-orm"; import { heartbeatRuns, issues, nativeRunFinalizations } from "@paperclipai/db"; diff --git a/server/src/services/native-runtime/paperclip-control-plane-port.ts b/server/src/services/native-runtime/paperclip-control-plane-port.ts index 8afbff1e4b6..1407faf7903 100644 --- a/server/src/services/native-runtime/paperclip-control-plane-port.ts +++ b/server/src/services/native-runtime/paperclip-control-plane-port.ts @@ -16,11 +16,11 @@ import type { PrpEvent, PrpTerminalState, ReplayControlPlaneEventsInput, -} from "@paperclipai/paperclip-runner"; +} from "../../vendor/paperclip-runner/index.js"; import { validatePrpEvent, validatePrpStructuredRunResult, -} from "@paperclipai/paperclip-runner"; +} from "../../vendor/paperclip-runner/index.js"; import { appendHeartbeatRunEvent } from "../heartbeat-run-events.js"; import { nativeSha256 } from "./canonical.js"; diff --git a/server/src/vendor/paperclip-runner/index.ts b/server/src/vendor/paperclip-runner/index.ts new file mode 100644 index 00000000000..06371d61656 --- /dev/null +++ b/server/src/vendor/paperclip-runner/index.ts @@ -0,0 +1,4 @@ +// Development and test builds resolve the workspace package here. The server +// build replaces this compiled shim with the package's built distribution so +// published server installs do not need a separate Runner D npm bootstrap. +export * from "@paperclipai/paperclip-runner";