| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- import { OpenCode, type OpenCodeEvent } from "@opencode-ai/client"
- export const worktree = "/tmp/opencode"
- export const directory = `${worktree}/packages/tui`
- export function json(data: unknown, init?: ResponseInit) {
- const headers = new Headers(init?.headers)
- if (!headers.has("content-type")) headers.set("content-type", "application/json")
- return new Response(JSON.stringify(data), {
- ...init,
- headers,
- })
- }
- export function createEventStream() {
- const encoder = new TextEncoder()
- const v2 = new Set<ReadableStreamDefaultController<Uint8Array>>()
- const pending: Uint8Array[] = []
- const response = (
- controllers: Set<ReadableStreamDefaultController<Uint8Array>>,
- queued: Uint8Array[],
- initial?: unknown,
- ) => {
- let current: ReadableStreamDefaultController<Uint8Array> | undefined
- return new Response(
- new ReadableStream<Uint8Array>({
- start(controller) {
- current = controller
- controllers.add(controller)
- if (initial) controller.enqueue(encoder.encode(`data: ${JSON.stringify(initial)}\n\n`))
- for (const chunk of queued.splice(0)) controller.enqueue(chunk)
- },
- cancel() {
- if (current) controllers.delete(current)
- },
- }),
- { headers: { "content-type": "text/event-stream" } },
- )
- }
- const send = (
- controllers: Set<ReadableStreamDefaultController<Uint8Array>>,
- queued: Uint8Array[],
- event: unknown,
- ) => {
- const chunk = encoder.encode(`data: ${JSON.stringify(event)}\n\n`)
- if (controllers.size === 0) {
- queued.push(chunk)
- return
- }
- for (const controller of controllers) controller.enqueue(chunk)
- }
- return {
- emit(event: OpenCodeEvent) {
- send(v2, pending, event)
- },
- v2() {
- return response(v2, pending, { id: "evt_connected", type: "server.connected", data: {} })
- },
- disconnect() {
- for (const controller of v2) controller.close()
- v2.clear()
- },
- }
- }
- export type FetchHandler = (url: URL, request: Request) => Response | undefined | Promise<Response | undefined>
- export function createFetch(override?: FetchHandler, events?: ReturnType<typeof createEventStream>) {
- const session = [] as URL[]
- async function fetch(input: RequestInfo | URL, init?: RequestInit) {
- const request = input instanceof Request ? input : new Request(input, init)
- const url = new URL(request.url)
- if (url.pathname === "/session") session.push(url)
- const overridden = await override?.(url, request)
- if (overridden) return overridden
- if (url.pathname === "/api/event" && events) return events.v2()
- if (
- [
- "/agent",
- "/command",
- "/experimental/workspace",
- "/experimental/workspace/status",
- "/formatter",
- "/lsp",
- ].includes(url.pathname)
- )
- return json([])
- if (["/config", "/experimental/resource", "/mcp", "/provider/auth", "/session/status"].includes(url.pathname))
- return json({})
- if (url.pathname === "/config/providers") return json({ providers: {}, default: {} })
- if (url.pathname === "/experimental/console") return json({ consoleManagedProviders: [], switchableOrgCount: 0 })
- if (url.pathname === "/experimental/capabilities") return json({ backgroundSubagents: true })
- if (url.pathname === "/path") return json({ home: "", state: "", config: "", worktree, directory })
- if (url.pathname === "/api/location")
- return json({ directory, project: { id: "proj_test", directory: worktree, canonical: worktree } })
- if (url.pathname === "/api/vcs")
- return json({
- location: { directory, project: { id: "proj_test", directory: worktree, canonical: worktree } },
- data: { branch: { current: "main", default: "main" } },
- })
- if (url.pathname === "/api/fs/list")
- return json({
- location: { directory, project: { id: "proj_test", directory: worktree, canonical: worktree } },
- data: [],
- })
- if (url.pathname === "/api/project/current") return json({ id: "proj_test", directory: worktree })
- if (url.pathname === "/api/project") return json([])
- if (url.pathname === "/api/project/proj_test/directories") return json([{ directory: worktree }])
- if (url.pathname === "/api/shell")
- return json({
- location: { directory, project: { id: "proj_test", directory: worktree, canonical: worktree } },
- data: [],
- })
- if (url.pathname === "/api/mcp")
- return json({
- location: { directory, project: { id: "proj_test", directory: worktree, canonical: worktree } },
- data: [],
- })
- if (url.pathname === "/api/mcp/resource")
- return json({
- location: { directory, project: { id: "proj_test", directory: worktree, canonical: worktree } },
- data: { resources: [], templates: [] },
- })
- if (url.pathname === "/api/session") return json({ data: [], cursor: {} })
- if (url.pathname === "/api/session/active") return json({ data: {} })
- if (url.pathname === "/api/permission/request")
- return json({
- location: { directory, project: { id: "proj_test", directory: worktree, canonical: worktree } },
- data: [],
- })
- if (url.pathname === "/api/form/request")
- return json({ location: { directory, project: { id: "proj_test", directory: worktree } }, data: [] })
- if (/^\/api\/session\/[^/]+\/form$/.test(url.pathname)) return json({ data: [] })
- if (
- ["/api/agent", "/api/model", "/api/provider", "/api/integration", "/api/command", "/api/skill"].includes(
- url.pathname,
- )
- )
- return json({
- location: { directory, project: { id: "proj_test", directory: worktree, canonical: worktree } },
- data: [],
- })
- if (url.pathname === "/api/reference")
- return json({ location: { directory, project: { id: "proj_test", directory, canonical: directory } }, data: [] })
- if (url.pathname === "/api/websearch/provider") {
- return json({ location: { directory, project: { id: "proj_test", directory, canonical: directory } }, data: [] })
- }
- if (url.pathname === "/provider") return json({ all: [], default: {}, connected: [] })
- if (url.pathname === "/session") return json([])
- if (url.pathname === "/vcs") return json({ branch: "main" })
- if (url.pathname === "/api/experimental/migration/v1") return json({ status: "completed" })
- throw new Error(`unexpected request: ${url.pathname}`)
- }
- fetch.preconnect = () => {}
- return { fetch, session }
- }
- export function createApi(fetch: typeof globalThis.fetch) {
- return OpenCode.make({ baseUrl: "http://test", fetch })
- }
|