Commit 40c294a
committed
fix(session): handle Qoder requires_action idle state and SSE reconnection
When Qoder agents execute tools, the session transitions through
idle(requires_action) before resuming. Three issues caused session run
to produce no output or hang:
1. Qoder mapper treated session.status_idle with stop_reason
requires_action as terminal idle, causing poll/stream to exit before
tool results and the final reply arrived. Fixed by mapping it to
running.
2. streamWithResume did a single yield* of the SSE stream. When Qoder
closes the SSE connection after requires_action, the generator exited
without reconnecting. Added a reconnect loop with exponential backoff
that continues until a true terminal status event arrives.
3. SSE parser in base-client discarded the id: field from SSE frames,
so event.id was always undefined and stream reconnection could not
skip already-consumed events. Now extracts id: and injects it into
the parsed payload.
Additionally, polling in collectEventsUntilTerminal now uses exponential
backoff (300ms initial, doubling to 2s cap) instead of a fixed 2s
interval, reducing first-response latency.
Change-Id: Ieefe7ad827516f92fcfff3023600564d9eff0eec
Co-developed-by: OpenCode <noreply@opencode.ai>1 parent a7ea745 commit 40c294a
4 files changed
Lines changed: 56 additions & 6 deletions
File tree
- packages/sdk
- src/internal
- core
- providers
- qoder
- tests/unit
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
| 113 | + | |
113 | 114 | | |
114 | 115 | | |
115 | 116 | | |
| |||
258 | 259 | | |
259 | 260 | | |
260 | 261 | | |
261 | | - | |
| 262 | + | |
262 | 263 | | |
| 264 | + | |
263 | 265 | | |
264 | 266 | | |
265 | 267 | | |
| |||
277 | 279 | | |
278 | 280 | | |
279 | 281 | | |
280 | | - | |
| 282 | + | |
| 283 | + | |
281 | 284 | | |
282 | 285 | | |
283 | 286 | | |
| |||
287 | 290 | | |
288 | 291 | | |
289 | 292 | | |
290 | | - | |
| 293 | + | |
| 294 | + | |
291 | 295 | | |
292 | 296 | | |
293 | 297 | | |
| |||
540 | 544 | | |
541 | 545 | | |
542 | 546 | | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
543 | 550 | | |
544 | 551 | | |
545 | 552 | | |
546 | 553 | | |
547 | 554 | | |
548 | 555 | | |
549 | | - | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
550 | 581 | | |
551 | 582 | | |
552 | 583 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
104 | 104 | | |
105 | 105 | | |
106 | 106 | | |
| 107 | + | |
107 | 108 | | |
108 | 109 | | |
109 | 110 | | |
| |||
113 | 114 | | |
114 | 115 | | |
115 | 116 | | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
116 | 120 | | |
117 | 121 | | |
118 | 122 | | |
119 | 123 | | |
120 | 124 | | |
121 | | - | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
122 | 130 | | |
123 | 131 | | |
124 | 132 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
551 | 551 | | |
552 | 552 | | |
553 | 553 | | |
| 554 | + | |
554 | 555 | | |
555 | 556 | | |
556 | 557 | | |
| |||
567 | 568 | | |
568 | 569 | | |
569 | 570 | | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
570 | 574 | | |
571 | 575 | | |
| 576 | + | |
| 577 | + | |
572 | 578 | | |
573 | 579 | | |
574 | 580 | | |
575 | | - | |
| 581 | + | |
576 | 582 | | |
577 | 583 | | |
578 | 584 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
205 | 205 | | |
206 | 206 | | |
207 | 207 | | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
208 | 213 | | |
209 | 214 | | |
210 | 215 | | |
| |||
0 commit comments