Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
Kit Langton
6dbd516466 fix(sdk): type SSE event payloads
Patch Effect OpenAPI generation so data-mode SSE responses expose their JSON payload schema instead of the raw data-line string wrapper. Regenerate legacy SDK types so V2Event and SessionDurableEvent remain the public payload unions.

Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
2026-06-27 04:54:23 +00:00
5 changed files with 40 additions and 14 deletions

View file

@ -1051,6 +1051,7 @@
"@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch", "@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch",
"gcp-metadata@8.1.2": "patches/gcp-metadata@8.1.2.patch", "gcp-metadata@8.1.2": "patches/gcp-metadata@8.1.2.patch",
"@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch", "@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch",
"effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch",
"@npmcli/agent@4.0.2": "patches/@npmcli%2Fagent@4.0.2.patch", "@npmcli/agent@4.0.2": "patches/@npmcli%2Fagent@4.0.2.patch",
"@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch", "@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch",
"@tanstack/solid-virtual@3.13.28": "patches/@tanstack%2Fsolid-virtual@3.13.28.patch", "@tanstack/solid-virtual@3.13.28": "patches/@tanstack%2Fsolid-virtual@3.13.28.patch",

View file

@ -153,6 +153,7 @@
"@tanstack/solid-virtual@3.13.28": "patches/@tanstack%2Fsolid-virtual@3.13.28.patch", "@tanstack/solid-virtual@3.13.28": "patches/@tanstack%2Fsolid-virtual@3.13.28.patch",
"@pierre/trees@1.0.0-beta.4": "patches/@pierre%2Ftrees@1.0.0-beta.4.patch", "@pierre/trees@1.0.0-beta.4": "patches/@pierre%2Ftrees@1.0.0-beta.4.patch",
"@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch", "@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch",
"@tanstack/virtual-core@3.17.0": "patches/@tanstack%2Fvirtual-core@3.17.0.patch" "@tanstack/virtual-core@3.17.0": "patches/@tanstack%2Fvirtual-core@3.17.0.patch",
"effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch"
} }
} }

View file

@ -2766,8 +2766,6 @@ export type SessionHistory = {
hasMore: boolean hasMore: boolean
} }
export type SessionDurableEvent1 = string
export type SessionMessagesResponse = { export type SessionMessagesResponse = {
data: Array<SessionMessage> data: Array<SessionMessage>
cursor: { cursor: {
@ -2847,7 +2845,7 @@ export type QuestionRejected2 = {
} }
} }
export type V2Event1 = export type V2Event =
| ModelsDevRefreshed | ModelsDevRefreshed
| IntegrationUpdated | IntegrationUpdated
| IntegrationConnectionUpdated | IntegrationConnectionUpdated
@ -2937,8 +2935,6 @@ export type V2Event1 =
| ServerConnected | ServerConnected
| GlobalDisposed | GlobalDisposed
export type V2Event = string
export type ForbiddenError = { export type ForbiddenError = {
_tag: "ForbiddenError" _tag: "ForbiddenError"
message: string message: string
@ -11898,11 +11894,7 @@ export type V2SessionEventsResponses = {
/** /**
* Success * Success
*/ */
200: { 200: SessionDurableEvent
id: string
event: string
data: SessionDurableEvent1
}
} }
export type V2SessionEventsResponse = V2SessionEventsResponses[keyof V2SessionEventsResponses] export type V2SessionEventsResponse = V2SessionEventsResponses[keyof V2SessionEventsResponses]

View file

@ -16,7 +16,7 @@ import type {
SessionMessageAssistantTool, SessionMessageAssistantTool,
SessionV2Info, SessionV2Info,
SkillV2Info, SkillV2Info,
V2Event1, V2Event,
} from "@opencode-ai/sdk/v2" } from "@opencode-ai/sdk/v2"
import { createStore, produce } from "solid-js/store" import { createStore, produce } from "solid-js/store"
import { createSimpleContext } from "./helper" import { createSimpleContext } from "./helper"
@ -121,7 +121,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
}, },
} }
function handleEvent(event: V2Event1) { function handleEvent(event: V2Event) {
switch (event.type) { switch (event.type) {
case "catalog.updated": case "catalog.updated":
void Promise.all([ void Promise.all([
@ -408,7 +408,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
...event, ...event,
data: event.properties, data: event.properties,
location: { directory: metadata.directory, workspaceID: metadata.workspace }, location: { directory: metadata.directory, workspaceID: metadata.workspace },
} as V2Event1) } as V2Event)
}) })
onCleanup(unsub) onCleanup(unsub)
}) })

View file

@ -0,0 +1,32 @@
diff --git a/dist/unstable/httpapi/OpenApi.js b/dist/unstable/httpapi/OpenApi.js
index 8292ab7..9c4fd5e 100644
--- a/dist/unstable/httpapi/OpenApi.js
+++ b/dist/unstable/httpapi/OpenApi.js
@@ -335,7 +335,7 @@ export function fromApi(api) {
if (HttpApiSchema.isStreamSse(stream)) {
pathOps.push({
_tag: "schema",
- ast: SchemaAST.getAST(stream.events),
+ ast: stream.sseMode === "data" ? streamDataAst(stream.events) : SchemaAST.getAST(stream.events),
path: ["paths", path, method, "responses", String(status), "content", contentType, "schema"]
});
pathOps.push({
@@ -501,6 +501,18 @@ export function fromApi(api) {
return spec;
}
const reservedStreamFailureEvent = "effect/httpapi/stream/failure";
+function streamDataAst(events) {
+ const ast = SchemaAST.getAST(events);
+ if (!SchemaAST.isObjects(ast)) {
+ return ast;
+ }
+ const data = ast.propertySignatures.find(field => field.name === "data")?.type;
+ if (data === undefined) {
+ return ast;
+ }
+ const contentSchema = data.encoding?.at(-1)?.to.annotations?.contentSchema;
+ return SchemaAST.isAST(contentSchema) ? contentSchema : data;
+}
function extractSuccessResponseBodies(endpoint) {
return extractResponseBodies(HttpApiEndpoint.getSuccessSchemas(endpoint), HttpApiSchema.getStatusSuccess, resolveDescriptionOrIdentifier);
}