Documentation
¶
Overview ¶
Package opencode implements the local HTTP facade that lets an unmodified opencode CLI drive a hosted MARS session as if the session were a local `opencode serve` backend.
Unlike codex (a JSON-RPC-over-WebSocket app-server), opencode's TUI is natively a remote-capable HTTP client: `opencode attach <url>` points it at any server speaking the opencode REST + SSE surface. The facade implements exactly the slice of that surface a real attach exercises — captured live against `opencode serve` (see TestedVersion) — and will bridge prompts and events to the hosted session through do.HostedAgentsService in later milestones. M1 scope: the TUI attaches, renders, and idles cleanly.
Index ¶
Constants ¶
const TestedVersion = "1.18.25"
TestedVersion is the opencode CLI version the route inventory and response shapes below were captured against (`opencode serve` + `opencode attach` through a logging relay). opencode releases near-daily and a v2 API surface is rolling out alongside v1, so re-capture on upgrades rather than assuming stability; the unhandled-route log below is the drift detector.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Facade ¶
type Facade struct {
// SessionID is the hosted session this facade bridges to (already
// resolved and validated by the command layer).
SessionID string
// Sessions is the harness bridge. Unused in M1 (stubs only); the event
// loop and prompt path arrive in M2.
Sessions do.HostedAgentsService
// Dir is the directory advertised to the TUI as the workspace root
// (opencode renders it in the footer and scopes requests to it). The
// hosted workspace isn't locally mounted, so this is presentational —
// the proxy's own working directory.
Dir string
// contains filtered or unexported fields
}
Facade impersonates an opencode server for one hosted session. It is the http.Handler ServeHTTP-transport variant of the codex Facade: dispatch is by method+path instead of JSON-RPC method, and server→client traffic is a single SSE stream instead of WebSocket frames.
One Facade serves the whole listener lifetime — HTTP has no "connection" to scope state to the way the WebSocket transport does. The one genuinely connection-like resource, the /global/event stream, guards itself with a single-consumer slot instead (mirroring the WS transport's one-client rule).