OpenCode executor: unrecognized `message.part.delta` event causes warnings and garbled text

Author: Jack47Created Mar 13, 2026Updated Jul 9, 2026

Problem

When using the OpenCode executor with recent versions of OpenCode (sst/opencode), the following warning is repeatedly emitted during streaming:

Unrecognized OpenCode SDK event type `message.part.delta`: {"sessionID":"ses_...","messageID":"msg_...","partID":"prt_...","field":"text","delta":"The user is pointing"}

Two user-visible issues:

  1. Warning spam in the VK message panel during every streaming response
  2. Garbled characters — raw JSON payload (containing Unicode text in delta field) rendered as system message, producing mojibake

Root Cause

OpenCode added message.part.delta as a streaming optimization (source). Instead of sending full Part object on every text chunk (message.part.updated), it sends lightweight deltas:

typescript
PartUpdated: BusEvent.define("message.part.updated", z.object({ part: Part }))
PartDelta: BusEvent.define("message.part.delta", z.object({
  sessionID, messageID, partID,
  field: z.string(),
  delta: z.string(),
}))

In crates/executors/src/executors/opencode/types.rs, SdkEvent recognizes message.part.updated but not message.part.delta. Unrecognized events fall through to Unknown, which normalize_logs.rs renders as a visible system message (~line 309).

Suggested Fix

  1. Add MessagePartDelta variant to SdkEvent in types.rs
  2. Handle in normalize_logs.rs — either apply delta to streaming text (similar to handle_part_update), or silently ignore if message.part.updated is still sent alongside

Environment

  • vibe-kanban: v0.1.29
  • OpenCode: latest dev branch
  • Platform: macOS arm64