From 6ad5ce39beb88ababd7d429e45769ea61b2795d2 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Wed, 24 Jun 2026 23:17:41 -0400 Subject: [PATCH] refactor(protocol): define current event surface --- packages/protocol/src/groups/event.ts | 2 +- packages/protocol/test/event-boundary.test.ts | 33 +++++++++++++++++++ packages/schema/src/event-manifest.ts | 24 +++++++++++--- 3 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 packages/protocol/test/event-boundary.test.ts diff --git a/packages/protocol/src/groups/event.ts b/packages/protocol/src/groups/event.ts index 862337e54b..83fac66e12 100644 --- a/packages/protocol/src/groups/event.ts +++ b/packages/protocol/src/groups/event.ts @@ -54,6 +54,6 @@ const make = (definitions: ReadonlyArray) => { export const makeEventGroup = (definitions: ReadonlyArray) => 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 diff --git a/packages/protocol/test/event-boundary.test.ts b/packages/protocol/test/event-boundary.test.ts new file mode 100644 index 0000000000..f25a67951f --- /dev/null +++ b/packages/protocol/test/event-boundary.test.ts @@ -0,0 +1,33 @@ +import { expect, test } from "bun:test" +import { EventManifest } from "@opencode-ai/schema/event-manifest" +import { SessionV1 } from "@opencode-ai/schema/session-v1" + +test("current Protocol events exclude V1-only session events", () => { + const current = new Set(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) +}) + +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) +}) diff --git a/packages/schema/src/event-manifest.ts b/packages/schema/src/event-manifest.ts index b681362e83..498e098cc3 100644 --- a/packages/schema/src/event-manifest.ts +++ b/packages/schema/src/event-manifest.ts @@ -34,13 +34,21 @@ 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( +const currentFoundationDefinitions = Event.inventory( ...ModelsDev.Event.Definitions, ...Integration.Event.Definitions, ...Catalog.Event.Definitions, - ...coreDefinitions, + ...currentCoreDefinitions, +) + +const compatibilityFoundationDefinitions = Event.inventory( + ...ModelsDev.Event.Definitions, + ...Integration.Event.Definitions, + ...Catalog.Event.Definitions, + ...compatibilityCoreDefinitions, ) const featureDefinitions = Event.inventory( @@ -54,14 +62,20 @@ const featureDefinitions = Event.inventory( ...Question.Event.Definitions, ) +export const CurrentServerDefinitions = Event.inventory( + ...currentFoundationDefinitions, + ...featureDefinitions, + ...SessionTodo.Event.Definitions, +) + export const ServerDefinitions = Event.inventory( - ...foundationDefinitions, + ...compatibilityFoundationDefinitions, ...featureDefinitions, ...SessionTodo.Event.Definitions, ) export const Definitions = Event.inventory( - ...foundationDefinitions, + ...compatibilityFoundationDefinitions, ...sessionV1LiveDefinitions, ...InstallationEvent.Definitions, ...featureDefinitions,