| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- import { Event } from "@opencode-ai/schema/event"
- import { EventManifest } from "@opencode-ai/schema/event-manifest"
- import { Location } from "@opencode-ai/schema/location"
- import type { Definition } from "@opencode-ai/schema/event"
- import { Schema } from "effect"
- import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema, OpenApi } from "effect/unstable/httpapi"
- const fields = {
- id: Event.ID,
- metadata: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),
- durable: Schema.optional(Schema.Struct({ aggregateID: Schema.String, seq: Schema.Int, version: Schema.Int })),
- location: Schema.optional(Location.Ref),
- }
- const schema = <const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) =>
- Schema.Union([
- ...definitions,
- ...(definitions.some((definition) => definition.type === "server.connected")
- ? []
- : [
- Schema.Struct({
- ...fields,
- type: Schema.Literal("server.connected"),
- data: Schema.Struct({}),
- }).annotate({ identifier: "V2Event.server.connected" }),
- ]),
- ]).annotate({ identifier: "V2Event" })
- const make = <const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) => {
- const EventSchema = schema(definitions)
- return {
- schema: EventSchema,
- group: HttpApiGroup.make("server.event")
- .add(
- HttpApiEndpoint.get("event.subscribe", "/api/event", {
- success: HttpApiSchema.StreamSse({ data: EventSchema }),
- }).annotateMerge(
- OpenApi.annotations({
- identifier: "v2.event.subscribe",
- summary: "Subscribe to events",
- description: "Subscribe to native event payloads for the server.",
- }),
- ),
- )
- .annotateMerge(OpenApi.annotations({ title: "events", description: "Experimental event stream route." })),
- }
- }
- export const makeEventGroup = <const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) =>
- make(definitions).group
- const event = make(EventManifest.ServerDefinitions)
- export const EventGroup = event.group
- export const OpenCodeEvent = event.schema
- export type OpenCodeEvent = typeof OpenCodeEvent.Type
- export type OpenCodeEventEncoded = typeof OpenCodeEvent.Encoded
|