plugin events are fired multiple times #2477

Closed
opened 2026-02-16 17:35:49 -05:00 by yindo · 1 comment
Owner

Originally created by @maxandron on GitHub (Nov 2, 2025).

Originally assigned to: @rekram1-node, @Copilot on GitHub.

Description

Happening since the update - each plugin event is fired multiple times

OpenCode version

v1.0.11

Steps to reproduce

  1. Create a simple plugin that writes the event type into a file.
export const NotificationPlugin: Plugin = async ({ client, $ }) => {
  return {
    event: async ({ event }) => {
      await $`echo ${event.type} >> /tmp/events.txt`;
    },
  }
}
  1. Run opencode, and start a conversation. e.g. hi

  2. Look at the file in /tmp/events.txt

This is the output:

session.created
session.created
session.created
session.created
session.created
session.created
session.created
session.created
session.created
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.part.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
session.idle
session.idle
session.idle
session.idle
session.idle
session.idle
session.idle
session.idle
session.idle
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
session.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated
message.updated

Screenshot and/or share link

No response

Operating System

macOS 26.0.1

Terminal

tmux inside ghostty

Originally created by @maxandron on GitHub (Nov 2, 2025). Originally assigned to: @rekram1-node, @Copilot on GitHub. ### Description Happening since the update - each plugin event is fired multiple times ### OpenCode version v1.0.11 ### Steps to reproduce 1. Create a simple plugin that writes the event type into a file. ``` export const NotificationPlugin: Plugin = async ({ client, $ }) => { return { event: async ({ event }) => { await $`echo ${event.type} >> /tmp/events.txt`; }, } } ``` 2. Run opencode, and start a conversation. e.g. `hi` 3. Look at the file in /tmp/events.txt This is the output: ``` session.created session.created session.created session.created session.created session.created session.created session.created session.created session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.part.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated session.idle session.idle session.idle session.idle session.idle session.idle session.idle session.idle session.idle session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated session.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated message.updated ``` ### Screenshot and/or share link _No response_ ### Operating System macOS 26.0.1 ### Terminal tmux inside ghostty
yindo added the opentuibug labels 2026-02-16 17:35:49 -05:00
yindo closed this issue 2026-02-16 17:35:50 -05:00
Author
Owner

@thdxr commented on GitHub (Nov 2, 2025):

fixed

@thdxr commented on GitHub (Nov 2, 2025): fixed
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: anomalyco/opencode#2477