Compare commits

...

3 Commits

Author SHA1 Message Date
Kit Langton 99ce234118 refactor(schema): share server event assembly 2026-06-25 13:28:13 -04:00
Kit Langton b4bad02c8b test(protocol): verify event group boundary 2026-06-25 13:28:13 -04:00
Kit Langton 6ad5ce39be refactor(protocol): define current event surface 2026-06-25 13:28:13 -04:00
3 changed files with 55 additions and 8 deletions
+1 -1
View File
@@ -54,6 +54,6 @@ const make = (definitions: ReadonlyArray<Definition>) => {
export const makeEventGroup = (definitions: ReadonlyArray<Definition>) => make(definitions).group
const event = make(EventManifest.ServerDefinitions)
const event = make(EventManifest.CurrentServerDefinitions)
export const EventGroup = event.group
export type Event = typeof event.schema.Type
@@ -0,0 +1,41 @@
import { expect, test } from "bun:test"
import { EventManifest } from "@opencode-ai/schema/event-manifest"
import { SessionV1 } from "@opencode-ai/schema/session-v1"
import { HttpApi, OpenApi } from "effect/unstable/httpapi"
import { EventGroup } from "../src/groups/event"
const currentOpenApi = OpenApi.fromApi(HttpApi.make("test").add(EventGroup))
const currentEventOpenApi = JSON.stringify(currentOpenApi.components.schemas?.V2Event)
test("current Protocol events exclude V1-only session events", () => {
const current = new Set<string>(EventManifest.CurrentServerDefinitions.map((definition) => definition.type))
const v1Only = SessionV1.Event.Definitions.filter((definition) => definition.durable !== undefined).map(
(definition) => definition.type,
)
expect(v1Only).toEqual([
"session.created",
"session.updated",
"session.deleted",
"message.updated",
"message.removed",
"message.part.updated",
"message.part.removed",
])
expect(v1Only.filter((type) => current.has(type))).toEqual([])
expect(current.has("session.next.prompted")).toBe(true)
expect(current.has("permission.v2.asked")).toBe(true)
expect(current.has("question.v2.asked")).toBe(true)
expect(current.has("command.executed")).toBe(false)
expect(currentEventOpenApi).toContain("session.next.prompted")
expect(currentEventOpenApi).not.toContain("message.updated")
expect(currentEventOpenApi).not.toContain("message.part.updated")
})
test("compatibility server inventory retains V1 events", () => {
const compatibility = new Set(EventManifest.ServerDefinitions.map((definition) => definition.type))
expect(compatibility.has("session.created")).toBe(true)
expect(compatibility.has("message.updated")).toBe(true)
expect(compatibility.has("message.part.updated")).toBe(true)
})
+13 -7
View File
@@ -34,13 +34,13 @@ import { WorktreeEvent } from "./worktree-event"
const sessionV1DurableDefinitions = SessionV1.Event.Definitions.filter((definition) => definition.durable !== undefined)
const sessionV1LiveDefinitions = SessionV1.Event.Definitions.filter((definition) => definition.durable === undefined)
const coreDefinitions = Event.inventory(...sessionV1DurableDefinitions, ...SessionEvent.Definitions)
const currentCoreDefinitions = Event.inventory(...SessionEvent.Definitions)
const compatibilityCoreDefinitions = Event.inventory(...sessionV1DurableDefinitions, ...currentCoreDefinitions)
const foundationDefinitions = Event.inventory(
...ModelsDev.Event.Definitions,
...Integration.Event.Definitions,
...Catalog.Event.Definitions,
...coreDefinitions,
)
const featureDefinitions = Event.inventory(
@@ -54,14 +54,20 @@ const featureDefinitions = Event.inventory(
...Question.Event.Definitions,
)
export const ServerDefinitions = Event.inventory(
...foundationDefinitions,
...featureDefinitions,
...SessionTodo.Event.Definitions,
)
const serverDefinitions = (coreDefinitions: ReadonlyArray<Event.Definition>) =>
Event.inventory(
...foundationDefinitions,
...coreDefinitions,
...featureDefinitions,
...SessionTodo.Event.Definitions,
)
export const CurrentServerDefinitions = serverDefinitions(currentCoreDefinitions)
export const ServerDefinitions = serverDefinitions(compatibilityCoreDefinitions)
export const Definitions = Event.inventory(
...foundationDefinitions,
...compatibilityCoreDefinitions,
...sessionV1LiveDefinitions,
...InstallationEvent.Definitions,
...featureDefinitions,