Files
Kit Langton 727f9f46a0 chore: merge origin/dev into v2
Brings the latest dev (45 commits) into v2. Conflict resolutions:

- core/src/session.ts: keep v2's Service (BusyError active-checks in
  revert.stage/clear/commit, rename method + Renamed event) and add
  dev's history method. v2's Renamed event flows through the merged
  SessionEvent.Definitions into the OpenCodeEvent union, so it encodes
  correctly on the SSE stream.
- server/src/handlers/event.ts: take dev's OpenCodeEvent encoder, which
  supersedes v2's PublicEventManifest handler wiring. This also brings
  dev's live event stream (allBounded + heartbeat + keepalive headers)
  onto v2.
- Removed the now-orphaned public-event-manifest.ts (only self-referenced
  after taking dev's handler).
- Generated client + sdk types regenerated via codegen (not hand-merged);
  they pick up dev's effect SSE OpenAPI-naming patch (V2EventStream).
2026-06-27 22:43:38 -04:00
..
2026-06-27 22:43:38 -04:00
2026-06-25 12:15:34 -04:00

@opencode-ai/client

Private generation target for clients derived directly from OpenCode's authoritative Effect HttpApi.

Entrypoints

  • @opencode-ai/client: zero-Effect Promise client using fetch.
  • @opencode-ai/client/effect: rich Effect network client using an environment-provided HttpClient.

The generated surface includes every standard HTTP group from Server's concrete API. The build compiler reads @opencode-ai/server/api; the generated Effect runtime imports a client-local projection built from Protocol, with a generation-equivalence test preventing transport drift. Custom transports such as the PTY WebSocket connection remain outside the generic HTTP client. Run bun run generate after changing the contract and bun run check:generated to detect committed-output drift.

The Effect entrypoint uses canonical decoded values such as Session.ID, Location.Ref, and Prompt. These datatypes come from the lightweight @opencode-ai/schema package and are re-exported so callers depend only on the client surface. Protocol owns endpoint construction and middleware placement; Server supplies the concrete middleware keys used by the build-time API.

The Promise root remains structural and has no Core or Effect runtime dependency. /effect depends only on Effect, Schema, and Protocol and is browser-bundle safe. Bundle-boundary tests enforce both import graphs.

Effect consumers construct canonical decoded inputs:

import { AbsolutePath, Location, OpenCode, Prompt } from "@opencode-ai/client/effect"

const client = yield * OpenCode.make({ baseUrl: "https://opencode.example" })
yield *
  client.sessions.create({
    location: Location.Ref.make({ directory: AbsolutePath.make("/workspace") }),
  })
yield * client.sessions.prompt({ sessionID, prompt: Prompt.make({ text: "Hello" }) })