fix(runner): load live console helpers from owning modules

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-09-29 13:31:40 -05:00
1 parent 792ae6082e
commit 28c82b358e
2 files changed
+46 -4

No files matched your search

@@ -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",
@@ -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({