event.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { Event } from "@opencode-ai/schema/event"
  2. import { EventManifest } from "@opencode-ai/schema/event-manifest"
  3. import { Location } from "@opencode-ai/schema/location"
  4. import type { Definition } from "@opencode-ai/schema/event"
  5. import { Schema } from "effect"
  6. import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema, OpenApi } from "effect/unstable/httpapi"
  7. const fields = {
  8. id: Event.ID,
  9. metadata: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),
  10. durable: Schema.optional(Schema.Struct({ aggregateID: Schema.String, seq: Schema.Int, version: Schema.Int })),
  11. location: Schema.optional(Location.Ref),
  12. }
  13. const schema = <const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) =>
  14. Schema.Union([
  15. ...definitions,
  16. ...(definitions.some((definition) => definition.type === "server.connected")
  17. ? []
  18. : [
  19. Schema.Struct({
  20. ...fields,
  21. type: Schema.Literal("server.connected"),
  22. data: Schema.Struct({}),
  23. }).annotate({ identifier: "V2Event.server.connected" }),
  24. ]),
  25. ]).annotate({ identifier: "V2Event" })
  26. const make = <const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) => {
  27. const EventSchema = schema(definitions)
  28. return {
  29. schema: EventSchema,
  30. group: HttpApiGroup.make("server.event")
  31. .add(
  32. HttpApiEndpoint.get("event.subscribe", "/api/event", {
  33. success: HttpApiSchema.StreamSse({ data: EventSchema }),
  34. }).annotateMerge(
  35. OpenApi.annotations({
  36. identifier: "v2.event.subscribe",
  37. summary: "Subscribe to events",
  38. description: "Subscribe to native event payloads for the server.",
  39. }),
  40. ),
  41. )
  42. .annotateMerge(OpenApi.annotations({ title: "events", description: "Experimental event stream route." })),
  43. }
  44. }
  45. export const makeEventGroup = <const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) =>
  46. make(definitions).group
  47. const event = make(EventManifest.ServerDefinitions)
  48. export const EventGroup = event.group
  49. export const OpenCodeEvent = event.schema
  50. export type OpenCodeEvent = typeof OpenCodeEvent.Type
  51. export type OpenCodeEventEncoded = typeof OpenCodeEvent.Encoded