Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter) - #2704

Closed
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible
Closed

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)#2704
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible

Conversation

@eersnington

@eersningtoneersnington commented May 14, 2026

Copy link
Copy Markdown

Heya, I started using T3 code 2 days ago with the Openchud integration and I was quite surprised at it not working at all. I've forked T3 code to fix a lot of issues and I'm using the local build for now, but this change would make OpenCode adapter from currently unusable to slightly above usable.

What Changed

  • use/global/event from Opencood for runtime event ingestion and filter wrapped events by session directory
  • ignore malformed global event payloads before provider event projection
  • fall back to legacy /event subscription when global events are unavailable (a lot of chaps within the issue thread below downgraded to <=0.14.40, so this fix would make it work for older sessions too)

Why

Fixes#2644

UI Changes

(sound on 👁️👃👁️🦻)

t3code.pr.1.mp4

Checklist

  • [yep] This PR is small and focused
  • [sí] I explained what changed and why
  • [oui oui] I included before/after screenshots for any UI changes
  • [ya po my Chile hombre] I included a video for animation/interaction changes

Note

Medium Risk
Changes OpenCode session event ingestion to prefer a new global event stream and adds fallback logic, which can affect turn completion and session lifecycle behavior if event formats or error detection differ across OpenCode versions.

Overview
Switches the OpenCode adapter’s event pump to prefer global.event (wrapped events) and projects provider runtime events only after filtering by session directory and validating the wrapped payload shape.

Adds compatibility fallback: if global.event is unavailable (e.g. 404 / TypeError), the adapter falls back to event.subscribe (now called with { directory }). Updates tests to cover global ingestion, directory filtering, malformed payload handling, and the fallback path.

Reviewed by Cursor Bugbot for commit bd4ac1a. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix hanging "waiting..." state in OpenCode adapter by preferring global.event stream over legacy event.subscribe

  • The event pump in OpenCodeAdapter.ts now first attempts to stream events from a global.event endpoint, filtering by context.directory to ignore events from other sessions and skipping malformed payloads.
  • Falls back to the legacy event.subscribe path (passing { directory } as a parameter) when global.event returns a 404 or a TypeError indicating the method is absent.
  • Both paths use a session-scoped AbortController that is cancelled on scope close.
  • Test coverage in OpenCodeAdapter.test.ts adds four new cases covering global events, directory filtering, malformed payload tolerance, and legacy fallback.

Macroscope summarized bd4ac1a.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 3257aff6-b5d0-448c-ae0c-8b1a639b1871

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

This PR might seem like a duplicate of #2673, and it kind of is, but 2673 removes the old event stream which would break and regress T3 code experience for users on Opencode versions that are lesser than <=0.14.40 (which relatively recent)

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR modifies runtime event ingestion behavior by introducing a new global event API with fallback to legacy subscription. While well-tested with comprehensive coverage, changes to event processing pipelines that affect session state tracking warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@eersningtoneersnington changed the title Fix: OpenCode event ingestion compatibility (fixes hanging "waiting..." state with OpenCode Adapter)Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

I'll hold off on updating the base branch as mr the O hates rebasing. If this is planned to be merged and the change looks good, do tag me and i'll update that asap

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…-29f.5)
Assessed PR pingdotgg#2704 from pingdotgg/t3code which fixes OpenCode adapter
event ingestion for CLI versions >= 1.14.40.
The PR switches from legacy event.subscribe() to global.event endpoint,
adding directory filtering and payload validation. The root cause: newer
OpenCode versions wrap events in {directory, payload} envelopes, but
handleSubscribedEvent reads event.properties directly, silently
discarding all events. This causes the "working..." hang (pingdotgg#2644),
blank chat (pingdotgg#2652), and frozen sessions (pingdotgg#2691).
Verdict: Apply. Low merge risk — additive changes to OpenCodeAdapter.ts
with graceful fallback for SDKs < 1.4.7. All three issues share the
same root cause and are addressed.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
Verified via git merge-tree: zero conflicts between upstream PR pingdotgg#2704
and fork HEAD. Both files diverge from merge base but changes land in
non-overlapping regions — fork's Crypto.randomUUIDv4 refactor and
buildEventBase rewrite don't touch the PR's new types, helpers, or
startEventPump regions.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…e (t3-29f.9)
Cherry-picked from upstream PR pingdotgg#2704 (bd4ac1a) by eersnington.
Fixes OpenCode event ingestion for CLI >= 1.14.40 where events are
wrapped in a { directory, payload } envelope via /global/event. The
legacy event.subscribe path returned raw events that the adapter's
handleSubscribedEvent couldn't unwrap, causing ALL events to be
silently discarded — sessions hung in "working..." indefinitely.
Changes:
- Prefer global.event endpoint with directory filtering to prevent
cross-session event contamination
- Add parseOpenCodeSubscribedEvent() runtime validation to squelch
malformed payloads instead of crashing the event pump
- Fall back to legacy event.subscribe({ directory }) when global.event
is unavailable (404 or TypeError)
- Both paths use a session-scoped AbortController cancelled on scope close
Tests: 18/18 pass (4 new cases: global events, directory filtering,
malformed payload tolerance, legacy fallback).
Fixes issues pingdotgg#2644, pingdotgg#2652, pingdotgg#2691 (all share the same root cause).
@eersnington

Copy link
Copy Markdown
Author

no longer an issue in opencode 1.15.x+

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Chat shows 'working...' indefinitely after opencode CLI already finished responding

1 participant

@eersnington
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter) - #2704

Closed
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible
Closed

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)#2704
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible

Conversation

@eersnington

@eersningtoneersnington commented May 14, 2026

Copy link
Copy Markdown

Heya, I started using T3 code 2 days ago with the Openchud integration and I was quite surprised at it not working at all. I've forked T3 code to fix a lot of issues and I'm using the local build for now, but this change would make OpenCode adapter from currently unusable to slightly above usable.

What Changed

  • use/global/event from Opencood for runtime event ingestion and filter wrapped events by session directory
  • ignore malformed global event payloads before provider event projection
  • fall back to legacy /event subscription when global events are unavailable (a lot of chaps within the issue thread below downgraded to <=0.14.40, so this fix would make it work for older sessions too)

Why

Fixes#2644

UI Changes

(sound on 👁️👃👁️🦻)

t3code.pr.1.mp4

Checklist

  • [yep] This PR is small and focused
  • [sí] I explained what changed and why
  • [oui oui] I included before/after screenshots for any UI changes
  • [ya po my Chile hombre] I included a video for animation/interaction changes

Note

Medium Risk
Changes OpenCode session event ingestion to prefer a new global event stream and adds fallback logic, which can affect turn completion and session lifecycle behavior if event formats or error detection differ across OpenCode versions.

Overview
Switches the OpenCode adapter’s event pump to prefer global.event (wrapped events) and projects provider runtime events only after filtering by session directory and validating the wrapped payload shape.

Adds compatibility fallback: if global.event is unavailable (e.g. 404 / TypeError), the adapter falls back to event.subscribe (now called with { directory }). Updates tests to cover global ingestion, directory filtering, malformed payload handling, and the fallback path.

Reviewed by Cursor Bugbot for commit bd4ac1a. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix hanging "waiting..." state in OpenCode adapter by preferring global.event stream over legacy event.subscribe

  • The event pump in OpenCodeAdapter.ts now first attempts to stream events from a global.event endpoint, filtering by context.directory to ignore events from other sessions and skipping malformed payloads.
  • Falls back to the legacy event.subscribe path (passing { directory } as a parameter) when global.event returns a 404 or a TypeError indicating the method is absent.
  • Both paths use a session-scoped AbortController that is cancelled on scope close.
  • Test coverage in OpenCodeAdapter.test.ts adds four new cases covering global events, directory filtering, malformed payload tolerance, and legacy fallback.

Macroscope summarized bd4ac1a.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 3257aff6-b5d0-448c-ae0c-8b1a639b1871

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

This PR might seem like a duplicate of #2673, and it kind of is, but 2673 removes the old event stream which would break and regress T3 code experience for users on Opencode versions that are lesser than <=0.14.40 (which relatively recent)

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR modifies runtime event ingestion behavior by introducing a new global event API with fallback to legacy subscription. While well-tested with comprehensive coverage, changes to event processing pipelines that affect session state tracking warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@eersningtoneersnington changed the title Fix: OpenCode event ingestion compatibility (fixes hanging "waiting..." state with OpenCode Adapter)Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

I'll hold off on updating the base branch as mr the O hates rebasing. If this is planned to be merged and the change looks good, do tag me and i'll update that asap

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…-29f.5)
Assessed PR pingdotgg#2704 from pingdotgg/t3code which fixes OpenCode adapter
event ingestion for CLI versions >= 1.14.40.
The PR switches from legacy event.subscribe() to global.event endpoint,
adding directory filtering and payload validation. The root cause: newer
OpenCode versions wrap events in {directory, payload} envelopes, but
handleSubscribedEvent reads event.properties directly, silently
discarding all events. This causes the "working..." hang (pingdotgg#2644),
blank chat (pingdotgg#2652), and frozen sessions (pingdotgg#2691).
Verdict: Apply. Low merge risk — additive changes to OpenCodeAdapter.ts
with graceful fallback for SDKs < 1.4.7. All three issues share the
same root cause and are addressed.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
Verified via git merge-tree: zero conflicts between upstream PR pingdotgg#2704
and fork HEAD. Both files diverge from merge base but changes land in
non-overlapping regions — fork's Crypto.randomUUIDv4 refactor and
buildEventBase rewrite don't touch the PR's new types, helpers, or
startEventPump regions.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…e (t3-29f.9)
Cherry-picked from upstream PR pingdotgg#2704 (bd4ac1a) by eersnington.
Fixes OpenCode event ingestion for CLI >= 1.14.40 where events are
wrapped in a { directory, payload } envelope via /global/event. The
legacy event.subscribe path returned raw events that the adapter's
handleSubscribedEvent couldn't unwrap, causing ALL events to be
silently discarded — sessions hung in "working..." indefinitely.
Changes:
- Prefer global.event endpoint with directory filtering to prevent
cross-session event contamination
- Add parseOpenCodeSubscribedEvent() runtime validation to squelch
malformed payloads instead of crashing the event pump
- Fall back to legacy event.subscribe({ directory }) when global.event
is unavailable (404 or TypeError)
- Both paths use a session-scoped AbortController cancelled on scope close
Tests: 18/18 pass (4 new cases: global events, directory filtering,
malformed payload tolerance, legacy fallback).
Fixes issues pingdotgg#2644, pingdotgg#2652, pingdotgg#2691 (all share the same root cause).
@eersnington

Copy link
Copy Markdown
Author

no longer an issue in opencode 1.15.x+

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Chat shows 'working...' indefinitely after opencode CLI already finished responding

1 participant

@eersnington
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter) - #2704

Closed
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible
Closed

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)#2704
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible

Conversation

@eersnington

@eersningtoneersnington commented May 14, 2026

Copy link
Copy Markdown

Heya, I started using T3 code 2 days ago with the Openchud integration and I was quite surprised at it not working at all. I've forked T3 code to fix a lot of issues and I'm using the local build for now, but this change would make OpenCode adapter from currently unusable to slightly above usable.

What Changed

  • use/global/event from Opencood for runtime event ingestion and filter wrapped events by session directory
  • ignore malformed global event payloads before provider event projection
  • fall back to legacy /event subscription when global events are unavailable (a lot of chaps within the issue thread below downgraded to <=0.14.40, so this fix would make it work for older sessions too)

Why

Fixes#2644

UI Changes

(sound on 👁️👃👁️🦻)

t3code.pr.1.mp4

Checklist

  • [yep] This PR is small and focused
  • [sí] I explained what changed and why
  • [oui oui] I included before/after screenshots for any UI changes
  • [ya po my Chile hombre] I included a video for animation/interaction changes

Note

Medium Risk
Changes OpenCode session event ingestion to prefer a new global event stream and adds fallback logic, which can affect turn completion and session lifecycle behavior if event formats or error detection differ across OpenCode versions.

Overview
Switches the OpenCode adapter’s event pump to prefer global.event (wrapped events) and projects provider runtime events only after filtering by session directory and validating the wrapped payload shape.

Adds compatibility fallback: if global.event is unavailable (e.g. 404 / TypeError), the adapter falls back to event.subscribe (now called with { directory }). Updates tests to cover global ingestion, directory filtering, malformed payload handling, and the fallback path.

Reviewed by Cursor Bugbot for commit bd4ac1a. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix hanging "waiting..." state in OpenCode adapter by preferring global.event stream over legacy event.subscribe

  • The event pump in OpenCodeAdapter.ts now first attempts to stream events from a global.event endpoint, filtering by context.directory to ignore events from other sessions and skipping malformed payloads.
  • Falls back to the legacy event.subscribe path (passing { directory } as a parameter) when global.event returns a 404 or a TypeError indicating the method is absent.
  • Both paths use a session-scoped AbortController that is cancelled on scope close.
  • Test coverage in OpenCodeAdapter.test.ts adds four new cases covering global events, directory filtering, malformed payload tolerance, and legacy fallback.

Macroscope summarized bd4ac1a.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 3257aff6-b5d0-448c-ae0c-8b1a639b1871

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

This PR might seem like a duplicate of #2673, and it kind of is, but 2673 removes the old event stream which would break and regress T3 code experience for users on Opencode versions that are lesser than <=0.14.40 (which relatively recent)

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR modifies runtime event ingestion behavior by introducing a new global event API with fallback to legacy subscription. While well-tested with comprehensive coverage, changes to event processing pipelines that affect session state tracking warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@eersningtoneersnington changed the title Fix: OpenCode event ingestion compatibility (fixes hanging "waiting..." state with OpenCode Adapter)Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

I'll hold off on updating the base branch as mr the O hates rebasing. If this is planned to be merged and the change looks good, do tag me and i'll update that asap

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…-29f.5)
Assessed PR pingdotgg#2704 from pingdotgg/t3code which fixes OpenCode adapter
event ingestion for CLI versions >= 1.14.40.
The PR switches from legacy event.subscribe() to global.event endpoint,
adding directory filtering and payload validation. The root cause: newer
OpenCode versions wrap events in {directory, payload} envelopes, but
handleSubscribedEvent reads event.properties directly, silently
discarding all events. This causes the "working..." hang (pingdotgg#2644),
blank chat (pingdotgg#2652), and frozen sessions (pingdotgg#2691).
Verdict: Apply. Low merge risk — additive changes to OpenCodeAdapter.ts
with graceful fallback for SDKs < 1.4.7. All three issues share the
same root cause and are addressed.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
Verified via git merge-tree: zero conflicts between upstream PR pingdotgg#2704
and fork HEAD. Both files diverge from merge base but changes land in
non-overlapping regions — fork's Crypto.randomUUIDv4 refactor and
buildEventBase rewrite don't touch the PR's new types, helpers, or
startEventPump regions.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…e (t3-29f.9)
Cherry-picked from upstream PR pingdotgg#2704 (bd4ac1a) by eersnington.
Fixes OpenCode event ingestion for CLI >= 1.14.40 where events are
wrapped in a { directory, payload } envelope via /global/event. The
legacy event.subscribe path returned raw events that the adapter's
handleSubscribedEvent couldn't unwrap, causing ALL events to be
silently discarded — sessions hung in "working..." indefinitely.
Changes:
- Prefer global.event endpoint with directory filtering to prevent
cross-session event contamination
- Add parseOpenCodeSubscribedEvent() runtime validation to squelch
malformed payloads instead of crashing the event pump
- Fall back to legacy event.subscribe({ directory }) when global.event
is unavailable (404 or TypeError)
- Both paths use a session-scoped AbortController cancelled on scope close
Tests: 18/18 pass (4 new cases: global events, directory filtering,
malformed payload tolerance, legacy fallback).
Fixes issues pingdotgg#2644, pingdotgg#2652, pingdotgg#2691 (all share the same root cause).
@eersnington

Copy link
Copy Markdown
Author

no longer an issue in opencode 1.15.x+

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Chat shows 'working...' indefinitely after opencode CLI already finished responding

1 participant

@eersnington
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter) - #2704

Closed
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible
Closed

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)#2704
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible

Conversation

@eersnington

@eersningtoneersnington commented May 14, 2026

Copy link
Copy Markdown

Heya, I started using T3 code 2 days ago with the Openchud integration and I was quite surprised at it not working at all. I've forked T3 code to fix a lot of issues and I'm using the local build for now, but this change would make OpenCode adapter from currently unusable to slightly above usable.

What Changed

  • use/global/event from Opencood for runtime event ingestion and filter wrapped events by session directory
  • ignore malformed global event payloads before provider event projection
  • fall back to legacy /event subscription when global events are unavailable (a lot of chaps within the issue thread below downgraded to <=0.14.40, so this fix would make it work for older sessions too)

Why

Fixes#2644

UI Changes

(sound on 👁️👃👁️🦻)

t3code.pr.1.mp4

Checklist

  • [yep] This PR is small and focused
  • [sí] I explained what changed and why
  • [oui oui] I included before/after screenshots for any UI changes
  • [ya po my Chile hombre] I included a video for animation/interaction changes

Note

Medium Risk
Changes OpenCode session event ingestion to prefer a new global event stream and adds fallback logic, which can affect turn completion and session lifecycle behavior if event formats or error detection differ across OpenCode versions.

Overview
Switches the OpenCode adapter’s event pump to prefer global.event (wrapped events) and projects provider runtime events only after filtering by session directory and validating the wrapped payload shape.

Adds compatibility fallback: if global.event is unavailable (e.g. 404 / TypeError), the adapter falls back to event.subscribe (now called with { directory }). Updates tests to cover global ingestion, directory filtering, malformed payload handling, and the fallback path.

Reviewed by Cursor Bugbot for commit bd4ac1a. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix hanging "waiting..." state in OpenCode adapter by preferring global.event stream over legacy event.subscribe

  • The event pump in OpenCodeAdapter.ts now first attempts to stream events from a global.event endpoint, filtering by context.directory to ignore events from other sessions and skipping malformed payloads.
  • Falls back to the legacy event.subscribe path (passing { directory } as a parameter) when global.event returns a 404 or a TypeError indicating the method is absent.
  • Both paths use a session-scoped AbortController that is cancelled on scope close.
  • Test coverage in OpenCodeAdapter.test.ts adds four new cases covering global events, directory filtering, malformed payload tolerance, and legacy fallback.

Macroscope summarized bd4ac1a.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 3257aff6-b5d0-448c-ae0c-8b1a639b1871

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

This PR might seem like a duplicate of #2673, and it kind of is, but 2673 removes the old event stream which would break and regress T3 code experience for users on Opencode versions that are lesser than <=0.14.40 (which relatively recent)

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR modifies runtime event ingestion behavior by introducing a new global event API with fallback to legacy subscription. While well-tested with comprehensive coverage, changes to event processing pipelines that affect session state tracking warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@eersningtoneersnington changed the title Fix: OpenCode event ingestion compatibility (fixes hanging "waiting..." state with OpenCode Adapter)Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

I'll hold off on updating the base branch as mr the O hates rebasing. If this is planned to be merged and the change looks good, do tag me and i'll update that asap

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…-29f.5)
Assessed PR pingdotgg#2704 from pingdotgg/t3code which fixes OpenCode adapter
event ingestion for CLI versions >= 1.14.40.
The PR switches from legacy event.subscribe() to global.event endpoint,
adding directory filtering and payload validation. The root cause: newer
OpenCode versions wrap events in {directory, payload} envelopes, but
handleSubscribedEvent reads event.properties directly, silently
discarding all events. This causes the "working..." hang (pingdotgg#2644),
blank chat (pingdotgg#2652), and frozen sessions (pingdotgg#2691).
Verdict: Apply. Low merge risk — additive changes to OpenCodeAdapter.ts
with graceful fallback for SDKs < 1.4.7. All three issues share the
same root cause and are addressed.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
Verified via git merge-tree: zero conflicts between upstream PR pingdotgg#2704
and fork HEAD. Both files diverge from merge base but changes land in
non-overlapping regions — fork's Crypto.randomUUIDv4 refactor and
buildEventBase rewrite don't touch the PR's new types, helpers, or
startEventPump regions.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…e (t3-29f.9)
Cherry-picked from upstream PR pingdotgg#2704 (bd4ac1a) by eersnington.
Fixes OpenCode event ingestion for CLI >= 1.14.40 where events are
wrapped in a { directory, payload } envelope via /global/event. The
legacy event.subscribe path returned raw events that the adapter's
handleSubscribedEvent couldn't unwrap, causing ALL events to be
silently discarded — sessions hung in "working..." indefinitely.
Changes:
- Prefer global.event endpoint with directory filtering to prevent
cross-session event contamination
- Add parseOpenCodeSubscribedEvent() runtime validation to squelch
malformed payloads instead of crashing the event pump
- Fall back to legacy event.subscribe({ directory }) when global.event
is unavailable (404 or TypeError)
- Both paths use a session-scoped AbortController cancelled on scope close
Tests: 18/18 pass (4 new cases: global events, directory filtering,
malformed payload tolerance, legacy fallback).
Fixes issues pingdotgg#2644, pingdotgg#2652, pingdotgg#2691 (all share the same root cause).
@eersnington

Copy link
Copy Markdown
Author

no longer an issue in opencode 1.15.x+

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Chat shows 'working...' indefinitely after opencode CLI already finished responding

1 participant

@eersnington
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter) - #2704

Closed
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible
Closed

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)#2704
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible

Conversation

@eersnington

@eersningtoneersnington commented May 14, 2026

Copy link
Copy Markdown

Heya, I started using T3 code 2 days ago with the Openchud integration and I was quite surprised at it not working at all. I've forked T3 code to fix a lot of issues and I'm using the local build for now, but this change would make OpenCode adapter from currently unusable to slightly above usable.

What Changed

  • use/global/event from Opencood for runtime event ingestion and filter wrapped events by session directory
  • ignore malformed global event payloads before provider event projection
  • fall back to legacy /event subscription when global events are unavailable (a lot of chaps within the issue thread below downgraded to <=0.14.40, so this fix would make it work for older sessions too)

Why

Fixes#2644

UI Changes

(sound on 👁️👃👁️🦻)

t3code.pr.1.mp4

Checklist

  • [yep] This PR is small and focused
  • [sí] I explained what changed and why
  • [oui oui] I included before/after screenshots for any UI changes
  • [ya po my Chile hombre] I included a video for animation/interaction changes

Note

Medium Risk
Changes OpenCode session event ingestion to prefer a new global event stream and adds fallback logic, which can affect turn completion and session lifecycle behavior if event formats or error detection differ across OpenCode versions.

Overview
Switches the OpenCode adapter’s event pump to prefer global.event (wrapped events) and projects provider runtime events only after filtering by session directory and validating the wrapped payload shape.

Adds compatibility fallback: if global.event is unavailable (e.g. 404 / TypeError), the adapter falls back to event.subscribe (now called with { directory }). Updates tests to cover global ingestion, directory filtering, malformed payload handling, and the fallback path.

Reviewed by Cursor Bugbot for commit bd4ac1a. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix hanging "waiting..." state in OpenCode adapter by preferring global.event stream over legacy event.subscribe

  • The event pump in OpenCodeAdapter.ts now first attempts to stream events from a global.event endpoint, filtering by context.directory to ignore events from other sessions and skipping malformed payloads.
  • Falls back to the legacy event.subscribe path (passing { directory } as a parameter) when global.event returns a 404 or a TypeError indicating the method is absent.
  • Both paths use a session-scoped AbortController that is cancelled on scope close.
  • Test coverage in OpenCodeAdapter.test.ts adds four new cases covering global events, directory filtering, malformed payload tolerance, and legacy fallback.

Macroscope summarized bd4ac1a.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 3257aff6-b5d0-448c-ae0c-8b1a639b1871

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

This PR might seem like a duplicate of #2673, and it kind of is, but 2673 removes the old event stream which would break and regress T3 code experience for users on Opencode versions that are lesser than <=0.14.40 (which relatively recent)

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR modifies runtime event ingestion behavior by introducing a new global event API with fallback to legacy subscription. While well-tested with comprehensive coverage, changes to event processing pipelines that affect session state tracking warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@eersningtoneersnington changed the title Fix: OpenCode event ingestion compatibility (fixes hanging "waiting..." state with OpenCode Adapter)Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

I'll hold off on updating the base branch as mr the O hates rebasing. If this is planned to be merged and the change looks good, do tag me and i'll update that asap

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…-29f.5)
Assessed PR pingdotgg#2704 from pingdotgg/t3code which fixes OpenCode adapter
event ingestion for CLI versions >= 1.14.40.
The PR switches from legacy event.subscribe() to global.event endpoint,
adding directory filtering and payload validation. The root cause: newer
OpenCode versions wrap events in {directory, payload} envelopes, but
handleSubscribedEvent reads event.properties directly, silently
discarding all events. This causes the "working..." hang (pingdotgg#2644),
blank chat (pingdotgg#2652), and frozen sessions (pingdotgg#2691).
Verdict: Apply. Low merge risk — additive changes to OpenCodeAdapter.ts
with graceful fallback for SDKs < 1.4.7. All three issues share the
same root cause and are addressed.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
Verified via git merge-tree: zero conflicts between upstream PR pingdotgg#2704
and fork HEAD. Both files diverge from merge base but changes land in
non-overlapping regions — fork's Crypto.randomUUIDv4 refactor and
buildEventBase rewrite don't touch the PR's new types, helpers, or
startEventPump regions.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…e (t3-29f.9)
Cherry-picked from upstream PR pingdotgg#2704 (bd4ac1a) by eersnington.
Fixes OpenCode event ingestion for CLI >= 1.14.40 where events are
wrapped in a { directory, payload } envelope via /global/event. The
legacy event.subscribe path returned raw events that the adapter's
handleSubscribedEvent couldn't unwrap, causing ALL events to be
silently discarded — sessions hung in "working..." indefinitely.
Changes:
- Prefer global.event endpoint with directory filtering to prevent
cross-session event contamination
- Add parseOpenCodeSubscribedEvent() runtime validation to squelch
malformed payloads instead of crashing the event pump
- Fall back to legacy event.subscribe({ directory }) when global.event
is unavailable (404 or TypeError)
- Both paths use a session-scoped AbortController cancelled on scope close
Tests: 18/18 pass (4 new cases: global events, directory filtering,
malformed payload tolerance, legacy fallback).
Fixes issues pingdotgg#2644, pingdotgg#2652, pingdotgg#2691 (all share the same root cause).
@eersnington

Copy link
Copy Markdown
Author

no longer an issue in opencode 1.15.x+

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Chat shows 'working...' indefinitely after opencode CLI already finished responding

1 participant

@eersnington
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter) - #2704

Closed
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible
Closed

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)#2704
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible

Conversation

@eersnington

@eersningtoneersnington commented May 14, 2026

Copy link
Copy Markdown

Heya, I started using T3 code 2 days ago with the Openchud integration and I was quite surprised at it not working at all. I've forked T3 code to fix a lot of issues and I'm using the local build for now, but this change would make OpenCode adapter from currently unusable to slightly above usable.

What Changed

  • use/global/event from Opencood for runtime event ingestion and filter wrapped events by session directory
  • ignore malformed global event payloads before provider event projection
  • fall back to legacy /event subscription when global events are unavailable (a lot of chaps within the issue thread below downgraded to <=0.14.40, so this fix would make it work for older sessions too)

Why

Fixes#2644

UI Changes

(sound on 👁️👃👁️🦻)

t3code.pr.1.mp4

Checklist

  • [yep] This PR is small and focused
  • [sí] I explained what changed and why
  • [oui oui] I included before/after screenshots for any UI changes
  • [ya po my Chile hombre] I included a video for animation/interaction changes

Note

Medium Risk
Changes OpenCode session event ingestion to prefer a new global event stream and adds fallback logic, which can affect turn completion and session lifecycle behavior if event formats or error detection differ across OpenCode versions.

Overview
Switches the OpenCode adapter’s event pump to prefer global.event (wrapped events) and projects provider runtime events only after filtering by session directory and validating the wrapped payload shape.

Adds compatibility fallback: if global.event is unavailable (e.g. 404 / TypeError), the adapter falls back to event.subscribe (now called with { directory }). Updates tests to cover global ingestion, directory filtering, malformed payload handling, and the fallback path.

Reviewed by Cursor Bugbot for commit bd4ac1a. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix hanging "waiting..." state in OpenCode adapter by preferring global.event stream over legacy event.subscribe

  • The event pump in OpenCodeAdapter.ts now first attempts to stream events from a global.event endpoint, filtering by context.directory to ignore events from other sessions and skipping malformed payloads.
  • Falls back to the legacy event.subscribe path (passing { directory } as a parameter) when global.event returns a 404 or a TypeError indicating the method is absent.
  • Both paths use a session-scoped AbortController that is cancelled on scope close.
  • Test coverage in OpenCodeAdapter.test.ts adds four new cases covering global events, directory filtering, malformed payload tolerance, and legacy fallback.

Macroscope summarized bd4ac1a.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 3257aff6-b5d0-448c-ae0c-8b1a639b1871

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

This PR might seem like a duplicate of #2673, and it kind of is, but 2673 removes the old event stream which would break and regress T3 code experience for users on Opencode versions that are lesser than <=0.14.40 (which relatively recent)

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR modifies runtime event ingestion behavior by introducing a new global event API with fallback to legacy subscription. While well-tested with comprehensive coverage, changes to event processing pipelines that affect session state tracking warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@eersningtoneersnington changed the title Fix: OpenCode event ingestion compatibility (fixes hanging "waiting..." state with OpenCode Adapter)Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

I'll hold off on updating the base branch as mr the O hates rebasing. If this is planned to be merged and the change looks good, do tag me and i'll update that asap

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…-29f.5)
Assessed PR pingdotgg#2704 from pingdotgg/t3code which fixes OpenCode adapter
event ingestion for CLI versions >= 1.14.40.
The PR switches from legacy event.subscribe() to global.event endpoint,
adding directory filtering and payload validation. The root cause: newer
OpenCode versions wrap events in {directory, payload} envelopes, but
handleSubscribedEvent reads event.properties directly, silently
discarding all events. This causes the "working..." hang (pingdotgg#2644),
blank chat (pingdotgg#2652), and frozen sessions (pingdotgg#2691).
Verdict: Apply. Low merge risk — additive changes to OpenCodeAdapter.ts
with graceful fallback for SDKs < 1.4.7. All three issues share the
same root cause and are addressed.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
Verified via git merge-tree: zero conflicts between upstream PR pingdotgg#2704
and fork HEAD. Both files diverge from merge base but changes land in
non-overlapping regions — fork's Crypto.randomUUIDv4 refactor and
buildEventBase rewrite don't touch the PR's new types, helpers, or
startEventPump regions.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…e (t3-29f.9)
Cherry-picked from upstream PR pingdotgg#2704 (bd4ac1a) by eersnington.
Fixes OpenCode event ingestion for CLI >= 1.14.40 where events are
wrapped in a { directory, payload } envelope via /global/event. The
legacy event.subscribe path returned raw events that the adapter's
handleSubscribedEvent couldn't unwrap, causing ALL events to be
silently discarded — sessions hung in "working..." indefinitely.
Changes:
- Prefer global.event endpoint with directory filtering to prevent
cross-session event contamination
- Add parseOpenCodeSubscribedEvent() runtime validation to squelch
malformed payloads instead of crashing the event pump
- Fall back to legacy event.subscribe({ directory }) when global.event
is unavailable (404 or TypeError)
- Both paths use a session-scoped AbortController cancelled on scope close
Tests: 18/18 pass (4 new cases: global events, directory filtering,
malformed payload tolerance, legacy fallback).
Fixes issues pingdotgg#2644, pingdotgg#2652, pingdotgg#2691 (all share the same root cause).
@eersnington

Copy link
Copy Markdown
Author

no longer an issue in opencode 1.15.x+

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Chat shows 'working...' indefinitely after opencode CLI already finished responding

1 participant

@eersnington
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter) - #2704

Closed
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible
Closed

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)#2704
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible

Conversation

@eersnington

@eersningtoneersnington commented May 14, 2026

Copy link
Copy Markdown

Heya, I started using T3 code 2 days ago with the Openchud integration and I was quite surprised at it not working at all. I've forked T3 code to fix a lot of issues and I'm using the local build for now, but this change would make OpenCode adapter from currently unusable to slightly above usable.

What Changed

  • use/global/event from Opencood for runtime event ingestion and filter wrapped events by session directory
  • ignore malformed global event payloads before provider event projection
  • fall back to legacy /event subscription when global events are unavailable (a lot of chaps within the issue thread below downgraded to <=0.14.40, so this fix would make it work for older sessions too)

Why

Fixes#2644

UI Changes

(sound on 👁️👃👁️🦻)

t3code.pr.1.mp4

Checklist

  • [yep] This PR is small and focused
  • [sí] I explained what changed and why
  • [oui oui] I included before/after screenshots for any UI changes
  • [ya po my Chile hombre] I included a video for animation/interaction changes

Note

Medium Risk
Changes OpenCode session event ingestion to prefer a new global event stream and adds fallback logic, which can affect turn completion and session lifecycle behavior if event formats or error detection differ across OpenCode versions.

Overview
Switches the OpenCode adapter’s event pump to prefer global.event (wrapped events) and projects provider runtime events only after filtering by session directory and validating the wrapped payload shape.

Adds compatibility fallback: if global.event is unavailable (e.g. 404 / TypeError), the adapter falls back to event.subscribe (now called with { directory }). Updates tests to cover global ingestion, directory filtering, malformed payload handling, and the fallback path.

Reviewed by Cursor Bugbot for commit bd4ac1a. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix hanging "waiting..." state in OpenCode adapter by preferring global.event stream over legacy event.subscribe

  • The event pump in OpenCodeAdapter.ts now first attempts to stream events from a global.event endpoint, filtering by context.directory to ignore events from other sessions and skipping malformed payloads.
  • Falls back to the legacy event.subscribe path (passing { directory } as a parameter) when global.event returns a 404 or a TypeError indicating the method is absent.
  • Both paths use a session-scoped AbortController that is cancelled on scope close.
  • Test coverage in OpenCodeAdapter.test.ts adds four new cases covering global events, directory filtering, malformed payload tolerance, and legacy fallback.

Macroscope summarized bd4ac1a.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 3257aff6-b5d0-448c-ae0c-8b1a639b1871

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

This PR might seem like a duplicate of #2673, and it kind of is, but 2673 removes the old event stream which would break and regress T3 code experience for users on Opencode versions that are lesser than <=0.14.40 (which relatively recent)

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR modifies runtime event ingestion behavior by introducing a new global event API with fallback to legacy subscription. While well-tested with comprehensive coverage, changes to event processing pipelines that affect session state tracking warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@eersningtoneersnington changed the title Fix: OpenCode event ingestion compatibility (fixes hanging "waiting..." state with OpenCode Adapter)Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

I'll hold off on updating the base branch as mr the O hates rebasing. If this is planned to be merged and the change looks good, do tag me and i'll update that asap

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…-29f.5)
Assessed PR pingdotgg#2704 from pingdotgg/t3code which fixes OpenCode adapter
event ingestion for CLI versions >= 1.14.40.
The PR switches from legacy event.subscribe() to global.event endpoint,
adding directory filtering and payload validation. The root cause: newer
OpenCode versions wrap events in {directory, payload} envelopes, but
handleSubscribedEvent reads event.properties directly, silently
discarding all events. This causes the "working..." hang (pingdotgg#2644),
blank chat (pingdotgg#2652), and frozen sessions (pingdotgg#2691).
Verdict: Apply. Low merge risk — additive changes to OpenCodeAdapter.ts
with graceful fallback for SDKs < 1.4.7. All three issues share the
same root cause and are addressed.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
Verified via git merge-tree: zero conflicts between upstream PR pingdotgg#2704
and fork HEAD. Both files diverge from merge base but changes land in
non-overlapping regions — fork's Crypto.randomUUIDv4 refactor and
buildEventBase rewrite don't touch the PR's new types, helpers, or
startEventPump regions.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…e (t3-29f.9)
Cherry-picked from upstream PR pingdotgg#2704 (bd4ac1a) by eersnington.
Fixes OpenCode event ingestion for CLI >= 1.14.40 where events are
wrapped in a { directory, payload } envelope via /global/event. The
legacy event.subscribe path returned raw events that the adapter's
handleSubscribedEvent couldn't unwrap, causing ALL events to be
silently discarded — sessions hung in "working..." indefinitely.
Changes:
- Prefer global.event endpoint with directory filtering to prevent
cross-session event contamination
- Add parseOpenCodeSubscribedEvent() runtime validation to squelch
malformed payloads instead of crashing the event pump
- Fall back to legacy event.subscribe({ directory }) when global.event
is unavailable (404 or TypeError)
- Both paths use a session-scoped AbortController cancelled on scope close
Tests: 18/18 pass (4 new cases: global events, directory filtering,
malformed payload tolerance, legacy fallback).
Fixes issues pingdotgg#2644, pingdotgg#2652, pingdotgg#2691 (all share the same root cause).
@eersnington

Copy link
Copy Markdown
Author

no longer an issue in opencode 1.15.x+

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Chat shows 'working...' indefinitely after opencode CLI already finished responding

1 participant

@eersnington
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter) - #2704

Closed
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible
Closed

Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)#2704
eersnington wants to merge 1 commit into
pingdotgg:mainfrom
eersnington:fix/opencode-global-event-compatible

Conversation

@eersnington

@eersningtoneersnington commented May 14, 2026

Copy link
Copy Markdown

Heya, I started using T3 code 2 days ago with the Openchud integration and I was quite surprised at it not working at all. I've forked T3 code to fix a lot of issues and I'm using the local build for now, but this change would make OpenCode adapter from currently unusable to slightly above usable.

What Changed

  • use/global/event from Opencood for runtime event ingestion and filter wrapped events by session directory
  • ignore malformed global event payloads before provider event projection
  • fall back to legacy /event subscription when global events are unavailable (a lot of chaps within the issue thread below downgraded to <=0.14.40, so this fix would make it work for older sessions too)

Why

Fixes#2644

UI Changes

(sound on 👁️👃👁️🦻)

t3code.pr.1.mp4

Checklist

  • [yep] This PR is small and focused
  • [sí] I explained what changed and why
  • [oui oui] I included before/after screenshots for any UI changes
  • [ya po my Chile hombre] I included a video for animation/interaction changes

Note

Medium Risk
Changes OpenCode session event ingestion to prefer a new global event stream and adds fallback logic, which can affect turn completion and session lifecycle behavior if event formats or error detection differ across OpenCode versions.

Overview
Switches the OpenCode adapter’s event pump to prefer global.event (wrapped events) and projects provider runtime events only after filtering by session directory and validating the wrapped payload shape.

Adds compatibility fallback: if global.event is unavailable (e.g. 404 / TypeError), the adapter falls back to event.subscribe (now called with { directory }). Updates tests to cover global ingestion, directory filtering, malformed payload handling, and the fallback path.

Reviewed by Cursor Bugbot for commit bd4ac1a. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix hanging "waiting..." state in OpenCode adapter by preferring global.event stream over legacy event.subscribe

  • The event pump in OpenCodeAdapter.ts now first attempts to stream events from a global.event endpoint, filtering by context.directory to ignore events from other sessions and skipping malformed payloads.
  • Falls back to the legacy event.subscribe path (passing { directory } as a parameter) when global.event returns a 404 or a TypeError indicating the method is absent.
  • Both paths use a session-scoped AbortController that is cancelled on scope close.
  • Test coverage in OpenCodeAdapter.test.ts adds four new cases covering global events, directory filtering, malformed payload tolerance, and legacy fallback.

Macroscope summarized bd4ac1a.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 3257aff6-b5d0-448c-ae0c-8b1a639b1871

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

This PR might seem like a duplicate of #2673, and it kind of is, but 2673 removes the old event stream which would break and regress T3 code experience for users on Opencode versions that are lesser than <=0.14.40 (which relatively recent)

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR modifies runtime event ingestion behavior by introducing a new global event API with fallback to legacy subscription. While well-tested with comprehensive coverage, changes to event processing pipelines that affect session state tracking warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@eersningtoneersnington changed the title Fix: OpenCode event ingestion compatibility (fixes hanging "waiting..." state with OpenCode Adapter)Fix: OpenCode event ingestion compatibility (fixes hanging "working..." state with OpenCode Adapter)May 14, 2026
@eersnington

Copy link
Copy Markdown
Author

I'll hold off on updating the base branch as mr the O hates rebasing. If this is planned to be merged and the change looks good, do tag me and i'll update that asap

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…-29f.5)
Assessed PR pingdotgg#2704 from pingdotgg/t3code which fixes OpenCode adapter
event ingestion for CLI versions >= 1.14.40.
The PR switches from legacy event.subscribe() to global.event endpoint,
adding directory filtering and payload validation. The root cause: newer
OpenCode versions wrap events in {directory, payload} envelopes, but
handleSubscribedEvent reads event.properties directly, silently
discarding all events. This causes the "working..." hang (pingdotgg#2644),
blank chat (pingdotgg#2652), and frozen sessions (pingdotgg#2691).
Verdict: Apply. Low merge risk — additive changes to OpenCodeAdapter.ts
with graceful fallback for SDKs < 1.4.7. All three issues share the
same root cause and are addressed.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
Verified via git merge-tree: zero conflicts between upstream PR pingdotgg#2704
and fork HEAD. Both files diverge from merge base but changes land in
non-overlapping regions — fork's Crypto.randomUUIDv4 refactor and
buildEventBase rewrite don't touch the PR's new types, helpers, or
startEventPump regions.
duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 1, 2026
…e (t3-29f.9)
Cherry-picked from upstream PR pingdotgg#2704 (bd4ac1a) by eersnington.
Fixes OpenCode event ingestion for CLI >= 1.14.40 where events are
wrapped in a { directory, payload } envelope via /global/event. The
legacy event.subscribe path returned raw events that the adapter's
handleSubscribedEvent couldn't unwrap, causing ALL events to be
silently discarded — sessions hung in "working..." indefinitely.
Changes:
- Prefer global.event endpoint with directory filtering to prevent
cross-session event contamination
- Add parseOpenCodeSubscribedEvent() runtime validation to squelch
malformed payloads instead of crashing the event pump
- Fall back to legacy event.subscribe({ directory }) when global.event
is unavailable (404 or TypeError)
- Both paths use a session-scoped AbortController cancelled on scope close
Tests: 18/18 pass (4 new cases: global events, directory filtering,
malformed payload tolerance, legacy fallback).
Fixes issues pingdotgg#2644, pingdotgg#2652, pingdotgg#2691 (all share the same root cause).
@eersnington

Copy link
Copy Markdown
Author

no longer an issue in opencode 1.15.x+

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Chat shows 'working...' indefinitely after opencode CLI already finished responding

1 participant

@eersnington