diff --git a/packages/paperclip-runner/scripts/live-console-browser-server.mjs b/packages/paperclip-runner/scripts/live-console-browser-server.mjs index 777837d3fe..fc67929dea 100644 --- a/packages/paperclip-runner/scripts/live-console-browser-server.mjs +++ b/packages/paperclip-runner/scripts/live-console-browser-server.mjs @@ -11,8 +11,22 @@ import { resolve } from "node:path"; * `PAPERCLIP_LIVE_CONSOLE_DRIVER=codex` swaps in the real Codex app-server driver * behind exactly the same routes. */ -async function loadRunner() { - return import(new URL("../dist/index.js", import.meta.url).href); +export async function loadLiveConsoleRunner(loadModule = (url) => import(url)) { + // Demo helpers are intentionally absent from the public runtime entrypoint. + // Load their owning modules, as the local-runner devtool transport does. + const [server, manifests, scripted, codex] = await Promise.all([ + "../dist/mock-core/live-console-demo-server.js", + "../dist/mock-core/live-console-demo-manifests.js", + "../dist/mock-core/live-console-scripted-driver.js", + "../dist/drivers/codex/codex-app-server-driver.js", + ].map((path) => loadModule(new URL(path, import.meta.url).href))); + return { + assertLiveConsoleLoopbackBindHost: server.assertLiveConsoleLoopbackBindHost, + LiveConsoleDemoServer: server.LiveConsoleDemoServer, + liveConsoleDemoManifestCatalogue: manifests.liveConsoleDemoManifestCatalogue, + LiveConsoleScriptedDriver: scripted.LiveConsoleScriptedDriver, + CodexAppServerDriver: codex.CodexAppServerDriver, + }; } async function createWorkingDirectory() { @@ -22,7 +36,7 @@ async function createWorkingDirectory() { } export function createLiveConsoleBrowserMiddleware(options = {}) { - const load = options.loadRunner ?? loadRunner; + const load = options.loadRunner ?? loadLiveConsoleRunner; const driverMode = options.driverMode ?? process.env.PAPERCLIP_LIVE_CONSOLE_DRIVER ?? "demo"; const chunkDelayMs = Number.parseInt( options.chunkDelayMs ?? process.env.PAPERCLIP_LIVE_CONSOLE_CHUNK_DELAY_MS ?? "45", diff --git a/packages/paperclip-runner/scripts/live-console-browser-server.test.mjs b/packages/paperclip-runner/scripts/live-console-browser-server.test.mjs index cde0b7b97c..3eefda1889 100644 --- a/packages/paperclip-runner/scripts/live-console-browser-server.test.mjs +++ b/packages/paperclip-runner/scripts/live-console-browser-server.test.mjs @@ -1,8 +1,36 @@ import { describe, expect, it } from "vitest"; -import { createLiveConsoleBrowserMiddleware } from "./live-console-browser-server.mjs"; +import { createLiveConsoleBrowserMiddleware, loadLiveConsoleRunner } from "./live-console-browser-server.mjs"; describe("Live console Vite transport bootstrap", () => { + it("loads the demo helpers from their owning modules instead of the public barrel", async () => { + const paths = []; + const runner = await loadLiveConsoleRunner(async (url) => { + const path = new URL(url).pathname; + paths.push(path.slice(path.lastIndexOf("/dist/") + 6)); + // Exercise real exports without requiring generated dist in unit tests. + return import(url.replace("/dist/", "/src/").replace(/\.js$/, ".ts")); + }); + expect(paths).toEqual([ + "mock-core/live-console-demo-server.js", + "mock-core/live-console-demo-manifests.js", + "mock-core/live-console-scripted-driver.js", + "drivers/codex/codex-app-server-driver.js", + ]); + expect(runner.assertLiveConsoleLoopbackBindHost).toBeTypeOf("function"); + expect(runner.LiveConsoleDemoServer).toBeTypeOf("function"); + expect(runner.LiveConsoleScriptedDriver).toBeTypeOf("function"); + expect(runner.CodexAppServerDriver).toBeTypeOf("function"); + expect(runner.liveConsoleDemoManifestCatalogue().length).toBeGreaterThan(0); + expect(() => runner.assertLiveConsoleLoopbackBindHost("0.0.0.0")).toThrow(); + const middleware = createLiveConsoleBrowserMiddleware({ + workingDirectory: "/server-owned-workspace", + loadRunner: async () => runner, + }); + await middleware.prepare("127.0.0.1"); + await middleware.close(); + }); + it("uses the runner's shared bind guard before constructing middleware", async () => { const calls = []; const middleware = createLiveConsoleBrowserMiddleware({