import { resolve } from "node:path"; import { afterEach, beforeEach, describe, expect, test } from "vitest"; import { moduleAccessMounts } from "./helpers/node-modules-mount.js"; import { AgentOs } from "../src/index.js"; const MODULE_ACCESS_CWD = resolve(import.meta.dirname, ".."); describe("OpenCode VM package", () => { let vm: AgentOs; beforeEach(async () => { vm = await AgentOs.create({ mounts: moduleAccessMounts(MODULE_ACCESS_CWD), }); }); afterEach(async () => { await vm.dispose(); }); test("mounts the source-built OpenCode ACP bundle inside the VM", async () => { const script = ` const fs = require("fs"); const pkgPath = "/root/node_modules/@agentos-software/opencode/package.json"; const manifestPath = "/root/node_modules/@agentos-software/opencode/dist/opencode-acp.manifest.json"; const bundlePath = "/root/node_modules/@agentos-software/opencode/dist/opencode-acp/acp.js"; const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8")); const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8")); console.log("pkg:" + pkg.name); console.log("bundle:" + fs.existsSync(bundlePath)); console.log("sourceRepo:" + manifest.source.repository); console.log("sourceVersion:" + manifest.source.version); console.log("legacyWrapper:" + fs.existsSync("/root/node_modules/opencode-ai/package.json")); `; await vm.writeFile("/tmp/check-opencode-package.mjs", script); let stdout = ""; let stderr = ""; const { pid } = vm.spawn("node", ["/tmp/check-opencode-package.mjs"], { onStdout: (data: Uint8Array) => { stdout += new TextDecoder().decode(data); }, onStderr: (data: Uint8Array) => { stderr += new TextDecoder().decode(data); }, }); const exitCode = await vm.waitProcess(pid); expect(exitCode, `Failed. stderr: ${stderr}`).toBe(0); expect(stdout).toContain("pkg:@agentos-software/opencode"); expect(stdout).toContain("bundle:true"); expect(stdout).toContain("sourceRepo:anomalyco/opencode"); expect(stdout).toContain("sourceVersion:1.3.13"); expect(stdout).toContain("legacyWrapper:false"); }, 30_000); test("bundled ACP source exposes the expected command symbol without a host wrapper", async () => { const script = ` const fs = require("fs"); const modulePath = "/root/node_modules/@agentos-software/opencode/dist/opencode-acp/acp.js"; const source = fs.readFileSync(modulePath, "utf8"); console.log("hasAcpCommand:" + source.includes("AcpCommand")); `; await vm.writeFile("/tmp/import-opencode-acp.mjs", script); let stdout = ""; let stderr = ""; const { pid } = vm.spawn("node", ["/tmp/import-opencode-acp.mjs"], { onStdout: (data: Uint8Array) => { stdout += new TextDecoder().decode(data); }, onStderr: (data: Uint8Array) => { stderr += new TextDecoder().decode(data); }, }); const exitCode = await vm.waitProcess(pid); expect(exitCode, `Failed. stderr: ${stderr}`).toBe(0); expect(stdout).toContain("hasAcpCommand:true"); }, 30_000); });