serve: early-return for socket, skip network options resolve

This commit is contained in:
Dax Raad 2026-05-16 02:28:34 -04:00
commit 08e4d4fe0c

View file

@ -1,6 +1,6 @@
import { Effect } from "effect" import { Effect } from "effect"
import { Server } from "../../server/server" import { Server } from "../../server/server"
import { effectCmd, fail } from "../effect-cmd" import { effectCmd } from "../effect-cmd"
import { withNetworkOptions, resolveNetworkOptions } from "../network" import { withNetworkOptions, resolveNetworkOptions } from "../network"
import { Flag } from "@opencode-ai/core/flag/flag" import { Flag } from "@opencode-ai/core/flag/flag"
@ -13,27 +13,21 @@ export const ServeCommand = effectCmd({
describe: "Unix socket path or Windows named pipe name/path to listen on", describe: "Unix socket path or Windows named pipe name/path to listen on",
}), }),
describe: "starts a headless opencode server", describe: "starts a headless opencode server",
// Server loads instances per-request via x-opencode-directory header — no
// need for an ambient project InstanceContext at startup.
instance: false, instance: false,
handler: Effect.fn("Cli.serve")(function* (args) { handler: Effect.fn("Cli.serve")(function* (args) {
if (!Flag.OPENCODE_SERVER_PASSWORD) { if (!Flag.OPENCODE_SERVER_PASSWORD) {
console.log("Warning: OPENCODE_SERVER_PASSWORD is not set; server is unsecured.") console.log("Warning: OPENCODE_SERVER_PASSWORD is not set; server is unsecured.")
} }
if (args.socket) { if (args.socket) {
const conflicts = explicitNetworkConflicts() const server = yield* Effect.promise(() =>
if (conflicts.length) yield* fail(`--socket cannot be used with ${conflicts.join(", ")}`) Server.listen({ type: "socket", socket: resolveSocketPath(args.socket) }),
} )
const opts = yield* resolveNetworkOptions(args)
const server = args.socket
? yield* Effect.promise(() =>
Server.listen({ type: "socket", socket: resolveSocketPath(args.socket), cors: opts.cors }),
)
: yield* Effect.promise(() => Server.listen(opts))
if (server.type === "socket") {
console.log(`opencode server listening on socket ${server.socket}`) console.log(`opencode server listening on socket ${server.socket}`)
yield* Effect.never yield* Effect.never
} }
const opts = yield* resolveNetworkOptions(args)
const server = yield* Effect.promise(() => Server.listen(opts))
console.log(`opencode server listening on http://${server.hostname}:${server.port}`) console.log(`opencode server listening on http://${server.hostname}:${server.port}`)
yield* Effect.never yield* Effect.never
@ -51,8 +45,4 @@ function resolveSocketPath(input: string) {
return `\\\\.\\pipe\\${name || "opencode"}` return `\\\\.\\pipe\\${name || "opencode"}`
} }
function explicitNetworkConflicts() {
return ["--port", "--hostname", "--mdns", "--mdns-domain"].filter((flag) =>
process.argv.some((arg) => arg === flag || arg.startsWith(`${flag}=`)),
)
}