Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

[Bug] A resumed session stream closes before a queued message is drained, so the answer never reaches the client

オープン
#527 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
55/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
typescript

調査の方向性

Start with packages/local-runtime-v2/src/application/conversation/conversation-application.ts and packages/local-runtime-v2/src/service/session-system/stream/session-stream-service.ts, tracing how resumed streams decide liveness and handle terminal events. Check the active-turn source and the replay boundary; done means a resumed live stream delivers the queued turn's answer, clears its queue row, and a stream following an ended turn closes at the replay point.

索引モデルが issue の本文から書いたものです。

説明

Title

A resumed session stream closes before a queued message is drained, so the answer never reaches the client

Where

packages/local-runtime-v2/src/application/conversation/conversation-application.ts
and packages/local-runtime-v2/src/service/session-system/stream/session-stream-service.ts

Reproduction

  1. Start a session and let a turn run.
  2. While it runs, queue a message.
  3. Reload the client, so it resumes the session.
  4. The queued message drains and its answer is produced, but the client never
    sees it, and the queue row is not cleared.

Why

Two defects stack.

The liveness check reads a lagging projection. Whether a resumed stream
is live or replay-only is decided from the session's persisted status, and
that status is an asynchronous projection of the state events. While a turn
is still running it can read as idle. The runtime then hands the client a
replay-only stream that closes, and the answer committed later never reaches
it. The runtime contradicts itself: asked "is there an active turn?" it says
yes, and in the next moment it says idle.

The authoritative answer is the active turn itself.

The stream waits for a terminal event that will not come. A stream that
follows a turn that has already ended waits for that turn's terminal event,
which was published before the client attached. The wait never resolves, so
the stream hangs instead of ending at the replay point.

The stream has to remember which turn the last terminal event belonged to,
and end at the replay point when it follows a turn that already ended.

Impact

Every client that resumes a session is affected, not only the WebUI. The
user sees a queued message that never gets an answer and a queue row that
never clears.

Expected

  • the liveness decision uses the authoritative active turn
  • a stream that follows an already-ended turn ends at the replay point
    instead of waiting forever

Notes

The client can re-read the transcript and the queue once its event channel is
ready, and that covers the projection the client holds. It cannot cover the
frame itself: the browser's event channel carries lifecycle events only, and
the live stream frames travel on their own connection. The client also must
not set the "drain queued" flag on its own, because that flag starts the
queued turn as a side effect.

主要言語
TypeScript
スター
2k
フォーク
259
平均マージ
13時間 16分
マージ済み PR(30日)
63

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

MiniMax-AI/minimax-code のほかの issue

MiniMax-AI/minimax-code の issue をすべて見る

似ている issue

TypeScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。