Skip to content

fix(terminal): セッションの並びをエンジンに持たせ、どの画面からも同じ順にする - #832

Merged
aida0710 merged 2 commits into
mainfrom
fix/session-order-in-engine
Nov 15, 2026
Merged

aida0710 merged 2 commits into
mainfrom
fix/session-order-in-engine

Conversation

@aida0710

@aida0710 aida0710 commented Nov 15, 2026 •

Copy link
Copy Markdown
Owner

何をするか

ワークスペースの中のセッションの並びを、sshcエンジンに持たせます。どのブラウザやマシンから開いても同じ順になります。リモートセッションを別のマシンから開いた場合も同じです。

これまでの並べ替えは画面のメモリ(useTerminalWorkspaceControllerのuseState)にしかありませんでした。そのため、ブラウザごとに順が違い、同じブラウザでも読み込み直すと開いた順に戻っていました。ワークスペースの並びは前からエンジンのworkspaces.jsonにあります。

変えたこと

  • エンジン
    • PUT /api/v1/terminal/sessions/{id}/workspaceにbeforeIdを足しました。セッションをworkspaceIdのワークスペースへ移し、beforeIdのセッションの前に置きます。beforeIdが無ければ、そのワークスペースの最後に置きます。同じワークスペースの中での並べ替えも、この要求で行います
    • 並びはterminal.Registryの一覧の順そのものです。新しい保存先は作っていません
    • beforeIdのセッションが無いか、別のワークスペースにあるときは404 terminal_session_not_foundで断り、何も変えません。どちらも別の画面が先に閉じたり移したりしたときに起きます
    • 並び全体を送る形にはしていません。ワークスペースの並べ替えと同じく、別の画面が開いたばかりのセッションの場所を崩さないためです
    • 一覧に残す終了済みのセッション(20件まで)は、一覧の位置ではなく終わった時刻の新しい方から選ぶようにしました。並べ替えのあとは、位置を見ても新しさが分からないためです
    • 開き直すための記録(terminal-sessions.json)は一覧の順で5秒ごとに書いているので、エンジンを再起動して開き直したあとも同じ順に並びます
  • 画面
    • 画面の中だけで持っていた並び(sessionOrder)を消し、エンジンの一覧の順でそのまま描きます
    • ドラッグと[上へ移動][下へ移動]は、「このセッションをどのセッションの前に置くか」を送ります
    • 答えを待たずに、移したあとの順で描きます。リモートセッションでは答えがSSH越しに届くので、待つと、落とした行が一度元の場所に戻って見えるためです。断られたら一覧を読み直します
    • 使わなくなったorderWithGroupReorderedとorderWithSessionMovedIntoを消しました
  • […]→[ワークスペースへ移動]で移したセッションは、移した先の最後に入るようになりました。これまでは、一覧の中の元の位置によって、途中に入ることがありました
  • docs/design.mdとdocs/manual-acceptance.mdに、並びをエンジンが持つことと、その確かめ方を書きました

リモートセッションの互換の番号を上げる

remoteengine.Compatibilityを2から3へ上げました。v0.67.0までのエンジンは知らない欄のある要求を断るので、beforeIdの付いた要求には400を返します。docs/releasing.mdは、取り次ぐAPIの要求の形を古いsshcと通じない形に変えたら、同じ変更で番号を上げると定めています。

このため、次のリリースでは、リモートセッションに使うマシンのsshcも更新が必要です(接続先でsshc update)。リリースノートの「更新後に必要な操作」に書いてください。

確かめたこと

  • make test(Goのテスト、go vet、deadcode、Web の lint・単体テスト・型検査)とmake verify-generated
  • 手元でe2eを全部流しました(npx playwright test。533件が通り、7件はスキップ)
  • 新しいテストは直す前のコードで落ちることを確かめました
    • セッションを移すと、移した画面への答えにも、あとから読む一覧にも新しい順で出る
    • 前に置くセッションが無いか別のワークスペースにあると断り、順もワークスペースも変えない
    • いちばん先に終わったセッションを一覧の最後へ移しても、上限を超えたときに消えるのはそのセッション
    • エンジンの答えを待たずに移したあとの順を出し、断られたら元の順に戻す
  • 本物の2つのエンジンで確かめました。コンテナの中のsshcエンジンを、このマシンのsshcエンジンのリモートセッションに足し、2つのブラウザで開きました。並べ替えは[上へ移動][下へ移動]で行いました
    • Aで並べ替えると、Bにも同じ順で出る
    • Bで並べ替えると、Aにも次の読み直しで出る
    • Aを読み込み直しても順が変わらない
  • 本物のマウスのドラッグ(Xvfb)でも確かめました。同じワークスペースの別のセッションの上へ落とすとその前に入り、読み込み直しても順が残ります

https://claude.ai/code/session_014WPnWupTc6HnamGudjkE9L

ワークスペースの中のセッションの並べ替えは、画面のメモリにしか無かった。そのため、
ブラウザやマシンごとに順が違い、読み込み直すと開いた順に戻っていた。

PUT /api/v1/terminal/sessions/{id}/workspace に beforeId を足し、エンジンの
Registry の一覧の順を並びにする。画面は答えを待たずに移したあとの順で描き、
断られたら一覧を読み直す。一覧に残す終了済みのセッションは、位置ではなく
終わった時刻で選ぶ。

v0.67.0 までのエンジンは知らない欄の beforeId を断るので、remoteengine.Compatibility
を 3 に上げる。リモートセッションに使うマシンの sshc も更新が要る。

Claude-Session: https://claude.ai/code/session_014WPnWupTc6HnamGudjkE9L
@aida0710
aida0710 merged commit 8768a4a into main Nov 15, 2026
29 checks passed
@aida0710
aida0710 deleted the fix/session-order-in-engine branch November 15, 2026 02:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant