Qwen Code への貢献

Alibaba Cloud の Qwen チームが公開している、自然言語で開発作業を依頼できるオープンソースのコマンドラインツールです。

貢献記録

貢献記録

01 / 07
この記録を読む

Web Shell sidebar and standalone session actions

貢献上の役割Issue の担当表明者・修正実装者・検証者。上流レビューの Critical を修正し、その後の提案も反映。新 head の CI と再レビューが進行中

現在のワークスペースなしセッションから離脱してから削除する

Web Shell は、daemon が接続中のセッションの削除を拒むため、現在のワークスペースなしセッションの Delete を無効にしていました。私の修正ではアイドル時のみ削除を許し、確認後に検証済みの detach 完了を待ってから元の ID を削除します。別タブで使用中ならサーバー側の保護が働きます。上流レビューで削除中にもダイアログを閉じられる競合が見つかり、私はこれを修正して実際の daemon の要求を一時停止させて検証しました。その後、レビューの提案に沿った修正も push しました。PR は OPEN のままで、新 head の CI と再レビューが進行中です。

上流での進捗修正実装済み・Critical 修正済み・提案の反映を push 済み・新 head の CI 実行中・再承認待ち。PR #12738 は a2b39eb405 で OPEN・MERGEABLE です。この head の CI はまだ実行中で、成功 9 件、skip 7 件、保留 5 件、現時点で失敗はありません。reviewer は Critical の修正を確認しましたが、以前の CHANGES_REQUESTED は残り、最新 review は承認ではなく COMMENTED です。merge gate は BLOCKED で、PR は未マージです。
Issue
#12669
Pull Request
#12738
関連モジュール
Web Shell sidebar and standalone session actions

プロジェクトとシステムの背景

Web Shell のサイドバーにはワークスペースなしセッションが並びます。daemon は実行中の prompt や接続中の client があるセッションの削除を拒み、バッチ削除 API は HTTP 200 の応答に含まれる各項目の errors[] で session_busy を返します。

先行する #12636 では現在の行の Delete を無効にしました。maintainer は、先に離脱してから削除する案を後続の Issue #12669 に残しました。現在のタブが detach しても、別のタブが同じセッションに接続したままの可能性があります。

発生条件と影響

未変更のソース baseline では、現在のワークスペースなしセッションの行に Delete は表示されても無効でした。ボタンを有効にするだけでは、このタブが接続中のまま削除を要求し、daemon から session_busy が返ります。

通常の New task の戻り値だけでは detach の成功を証明できません。clearSession は detach の例外を握りつぶし、SDK は clientId がない場合の detach を何もしないまま成功扱いにします。サイドバーの件数も実際の状態より遅れることがあります。

PR 初版の上流レビューでは別の Critical が見つかりました。非同期の detach や削除中でも Cancel などで確認ダイアログを閉じられ、削除処理はその後も続いてしまいました。

原因

クライアントには現在の行に対する順序付きの処理がありませんでした。削除を確認し、元のセッションから離れ、detach 完了を証明してから、固定した元の ID を削除する必要があります。daemon の busy 保護は正しく、維持します。

既存の callback は New task の結果を捨て、通常の clearSession は detach 失敗を隠し得ました。どちらも削除要求の前提にはできません。

修正方法

サイドバーの二つの Delete 入口から、アイドル状態の現在のワークスペースなしセッションに既存の確認ダイアログを開けるようにしました。確認時に App の実行状態と元のセッション ID を再確認し、実行中の作業は引き続き保護します。

削除専用の await 可能な callback は createNewSession({ kind: 'global' }) を再利用し、厳密な clearSession 検査を行います。想定したセッション ID と一致する空でない二箇所の clientId を要求し、detach 失敗を通知し、detach の完了後に固定した元の ID のバッチ削除を要求します。

removed または notFound の場合だけ行を消します。項目ごとの session_busy や要求失敗では行を残し、エラーを表示します。離脱済みなら一覧を更新します。daemon の busy 保護と別系統の /delete セレクターは変更していません。

上流レビュー後、処理中はダイアログを閉じるすべての操作を無効化し、onClose に同期的な busy ガードを追加しました。detach または削除の間は確認ダイアログが表示されたままです。

レビューの提案に沿って、commit a2b39eb405 では削除中に進捗を表示し(Deleting... と aria-busy)、セッションの接続準備が整うまで Delete を無効にし、離脱の失敗とナビゲーションの取消しを同じ通知にまとめ、省略可能な callback の不要な分岐を削除し、再試行・更新・厳密な detach の回帰テストを追加しました。英語と中国語の設計文書も合わせて更新しました。

設計上の判断

離脱は利用者の確認後にだけ始めるため、ダイアログの取消しで detach されることはありません。操作は一つの元の ID に固定され、厳密な detach が未完了または失敗した状態では削除要求を送りません。

古くなり得る clientCount を理由に UI 側で削除を無効にしません。別タブによってセッションが busy かどうかは daemon に判定させ、強制削除や無条件の再試行で保護を弱めません。

確認済みの削除処理が非同期で続く間に、取消し済みのように見えてはいけません。レビューを受けた busy ガードは daemon の削除規則を変えずにこの UI の競合を防ぎます。

検証結果

  1. 01

    初版の修正前には baseline のコンポーネントテストで現在の行の Delete が無効であると確認しました。初版の実装後、四つの対象ファイルの 1,570 件のテスト、リポジトリ全体の typecheck と build が通りました。最初のローカル code review では、後に上流が指摘したダイアログの競合を見落としました。

  2. 02

    隔離した実際の daemon、ビルド済み Web Shell、Chrome で単一タブの順序を確認しました。取消しでは両方の要求とも送られず、確認後は detach の HTTP 204 が先に返り、その後のバッチ削除 HTTP 200 の removed に元の ID が入り、行が消えました。

  3. 03

    二つの Chrome context では、最初のタブの detach で clientCount が 2 から 1 になり、続くバッチ削除は HTTP 200 の errors[] に session_busy を返しました。元の行は残り、ページはエラーを表示しました。二つ目のタブが detach して 1 から 0 になると、保持されたダイアログからの再試行で行を削除できました。detach の障害注入と実行中の prompt は対象テストで確認しており、今回の実環境テストでは実行していません。

  4. 04

    上流の Critical については、旧版で実際の daemon の detach を一時停止すると、Cancel で閉じても削除が続く現象を再現しました。commit 588cb890fd では対象の回帰テストが修正前に失敗、修正後に成功しました。実際の daemon と Chrome で detach と delete の要求を止めた間、Cancel・Esc・背景・閉じるボタンのいずれもダイアログを閉じられませんでした。上流 main を履歴の書き換えなしで通常マージした後、a179cd17af で全体の build と typecheck、関連コンポーネントテスト 50 件が成功しました。

  5. 05

    a2b39eb405 のローカル検証では、Web Shell の対象テスト 4 ファイルが 1,572/1,572、影響を受けるサイドバーの 6 ファイルが 87/87 で成功し、リポジトリ全体の build と typecheck、変更ファイルの lint と format、空白チェック、commit hook も通りました。隔離した実際の daemon と Chrome で要求を一時停止すると Deleting... と aria-busy が表示され、セッションの読み込み中は Delete が無効のままでした。ブラウザーで detach に HTTP 503 を注入すると、行は残り、削除要求も送られませんでした。この 503 はブラウザーでの注入であり、実際の daemon の通信障害ではありません。

  6. 06

    2026-09-27 00:49 UTC 時点で PR #12738 は a2b39eb405 で OPEN・MERGEABLE、reviewDecision は CHANGES_REQUESTED、mergeStateStatus は BLOCKED です。新 head の CI はまだ実行中で、成功 9 件、skip 7 件、保留 5 件、現時点で失敗はありません。前の head で終わった check の結果は引き継げません。reviewer は以前 Critical の修正を確認しましたが、最新の review は COMMENTED で新たな承認ではありません。未解決の review discussion は 13 件残り、そのうち 4 件は新しい commit により outdated になりました。補足の E2E 報告を PR に投稿しました。ローカルでは完全な preflight、他の OS、新規の固定依存関係インストールを実施していません。

  7. 07

    以前の画像検査は成功しましたが、base との差分スクリーンショットはなく、新しい Delete フローの検証にはなりません。上記のブラウザー操作の証拠は、隔離したローカル daemon での実行によるものです。

上流での進捗

  1. Issue の担当表明

    担当表明コメントを投稿。maintainer の正式な assign や修正承認はない

  2. 修正とローカル検証

    初版の対象テスト 1,570 件が成功。Critical は赤緑の回帰テスト、関連 50 件、実 daemon の一時停止検証で修正。後続の commit は対象 1,572 件とサイドバー 87 件のテストに成功

  3. Pull Request

    #12738 を作成し Fixes #12669 を関連付けた。E2E 報告と補足報告は別コメントで投稿

  4. 上流レビュー

    Critical 修正は確認済みで提案も反映したが、CHANGES_REQUESTED が残る。最新 review は COMMENTED で再承認なし

  5. 上流 CI

    新 head a2b39eb405:成功 9 件、skip 7 件、保留 5 件、現時点で失敗なし

  6. マージ

    未マージ。MERGEABLE は競合がないことを示し、mergeStateStatus は BLOCKED のまま