diff --git a/scripts/trace-daemon-dist.test.mjs b/scripts/trace-daemon-dist.test.mjs new file mode 100644 index 0000000000..a2c2149daa --- /dev/null +++ b/scripts/trace-daemon-dist.test.mjs @@ -0,0 +1,46 @@ +import assert from "node:assert/strict"; +import { execFile } from "node:child_process"; +import { cp, mkdtemp, rm } from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; +import { fileURLToPath, pathToFileURL } from "node:url"; +import { promisify } from "node:util"; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const bridgeModule = "packages/server/dist/server/server/agent/providers/opencode/bridge.js"; + +// Mirrors nix/package.nix's installPhase: copy every traced path into $out. +async function installTracedDaemon(outRoot) { + const { stdout } = await promisify(execFile)( + process.execPath, + [path.join(repoRoot, "scripts/trace-daemon.mjs")], + { cwd: repoRoot, maxBuffer: 64 * 1024 * 1024 }, + ); + for (const file of stdout.split("\n").filter(Boolean)) { + await cp(path.join(repoRoot, file), path.join(outRoot, file), { + recursive: true, + verbatimSymlinks: true, + }); + } +} + +test("traced daemon closure ships the OpenCode bridge plugin for every OpenCode version", async () => { + const outRoot = await mkdtemp(path.join(os.tmpdir(), "trace-daemon-dist-")); + try { + await installTracedDaemon(outRoot); + const installedBridgeUrl = pathToFileURL(path.join(outRoot, bridgeModule)).href; + const { loadOpenCodeBridgePluginArtifact } = await import(installedBridgeUrl); + + for (const version of [1, 2]) { + const artifact = await loadOpenCodeBridgePluginArtifact( + installedBridgeUrl, + undefined, + version, + ); + assert.ok(artifact.byteLength > 0, `OpenCode v${version} bridge plugin is empty`); + } + } finally { + await rm(outRoot, { recursive: true, force: true }); + } +}); diff --git a/scripts/trace-daemon.mjs b/scripts/trace-daemon.mjs index cb7408571f..cb80266c13 100644 --- a/scripts/trace-daemon.mjs +++ b/scripts/trace-daemon.mjs @@ -58,8 +58,9 @@ const additionalInputs = [ "packages/server/dist/server/terminal/shell-integration/**", // Silero VAD ONNX model (sherpa speech provider) "packages/server/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx", - // OpenCode loads this plugin from a content-addressed runtime copy. - "packages/server/dist/server/server/agent/providers/opencode/bridge-plugin.bundle.mjs", + // OpenCode loads these plugins from a content-addressed runtime copy, one + // bundle per supported OpenCode version (opencode/ and opencode/v2/). + "packages/server/dist/server/server/agent/providers/opencode/**/bridge-plugin.bundle.mjs", // Server runtime config files (read by path, not require) "packages/server/.env.example", // CLI shebang script wrapping dist/index.js