import { afterEach, describe, expect, test } from "bun:test" import type { UpgradeWebSocket } from "hono/ws" import { Flag } from "@opencode-ai/core/flag/flag" import { Instance } from "../../src/project/instance" import { InstanceRoutes } from "../../src/server/routes/instance" import { ExperimentalPaths } from "../../src/server/routes/instance/httpapi/experimental" import { Log } from "../../src/util" import { resetDatabase } from "../fixture/db" import { tmpdir } from "../fixture/fixture" void Log.init({ print: false }) const original = Flag.OPENCODE_EXPERIMENTAL_HTTPAPI const websocket = (() => () => new Response(null, { status: 501 })) as unknown as UpgradeWebSocket function app() { Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = true return InstanceRoutes(websocket) } afterEach(async () => { Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = original await Instance.disposeAll() await resetDatabase() }) describe("experimental HttpApi", () => { test("serves read-only experimental endpoints through Hono bridge", async () => { await using tmp = await tmpdir({ config: { formatter: false, lsp: false, mcp: { demo: { type: "local", command: ["echo", "demo"], enabled: false, }, }, }, }) const headers = { "x-opencode-directory": tmp.path } const [consoleState, consoleOrgs, toolIDs, worktrees, resources] = await Promise.all([ app().request(ExperimentalPaths.console, { headers }), app().request(ExperimentalPaths.consoleOrgs, { headers }), app().request(ExperimentalPaths.toolIDs, { headers }), app().request(ExperimentalPaths.worktree, { headers }), app().request(ExperimentalPaths.resource, { headers }), ]) expect(consoleState.status).toBe(200) expect(await consoleState.json()).toEqual({ consoleManagedProviders: [], switchableOrgCount: 0, }) expect(consoleOrgs.status).toBe(200) expect(await consoleOrgs.json()).toEqual({ orgs: [] }) expect(toolIDs.status).toBe(200) expect(await toolIDs.json()).toContain("bash") expect(worktrees.status).toBe(200) expect(await worktrees.json()).toEqual([]) expect(resources.status).toBe(200) expect(await resources.json()).toEqual({}) }) })