From e878c3c83be2ba955f7dd9413f3c9aae8138086e Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Sat, 7 Feb 2026 16:00:28 +0000 Subject: [PATCH] fix(instance-events): unwrap payload-only SSE events Accept OpenCode SSE chunks shaped as { payload: { type, ... } } even when no directory is present, and attach directory when available to avoid dropping heartbeat events as malformed. --- .../server/src/workspaces/instance-events.ts | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/server/src/workspaces/instance-events.ts b/packages/server/src/workspaces/instance-events.ts index 35ab652b..e76e8978 100644 --- a/packages/server/src/workspaces/instance-events.ts +++ b/packages/server/src/workspaces/instance-events.ts @@ -166,9 +166,24 @@ export class InstanceEventBridge { try { const parsed = JSON.parse(payload) as any - const event: InstanceStreamEvent | null = parsed && typeof parsed === "object" - ? (parsed.payload && parsed.directory && typeof parsed.payload === "object" ? { ...parsed.payload, directory: parsed.directory } : parsed) - : null + if (!parsed || typeof parsed !== "object") { + this.options.logger.warn({ workspaceId, chunk: payload }, "Dropped malformed instance event") + return + } + + // OpenCode SSE payload shapes vary across versions. + // Common variants: + // - { type, properties, ... } + // - { payload: { type, properties, ... }, directory: "/abs/path" } + // - { payload: { type, properties, ... } } + const base = parsed.payload && typeof parsed.payload === "object" ? parsed.payload : parsed + + const event: InstanceStreamEvent | null = base && typeof base === "object" ? ({ ...base } as any) : null + + // Attach directory when available (don't overwrite if already present). + if (event && !(event as any).directory && typeof (parsed as any).directory === "string") { + ;(event as any).directory = (parsed as any).directory + } if (!event || typeof (event as any).type !== "string") { this.options.logger.warn({ workspaceId, chunk: payload }, "Dropped malformed instance event")