Skip to content

Feature: per-session independent Terminal instances #76

Description

@liplus-lin-lay

purpose

セッションごとに独立した Terminal インスタンスを持たせる。
セッション切り替え時にプロセスを殺さず、表示の切り替えだけで済むようにする。

premise

現在: TabState に 1 つの Terminal + 1 つの PTY。セッション切り替え = PTY 停止 → クリア → 再起動。前のセッションの内容が全て消える。

constraints

  • 各セッションの Terminal + PTY プロセスは独立に生存
  • セッション切り替え = DOM の表示/非表示のみ(PTY は触らない)
  • Start/Stop ボタンはアクティブセッションの PTY を操作
  • 新セッション作成時に自動的に新 Terminal + コンテナを生成
  • セッション削除時に PTY を停止し Terminal を破棄

設計

SessionState(新規)

```typescript
interface SessionState {
terminal: Terminal;
fitAddon: FitAddon;
containerEl: HTMLElement; // この session 用の terminal-container div
ptyId: string | null;
unlistenData: UnlistenFn | null;
unlistenExit: UnlistenFn | null;
}
```

TabState(変更)

  • terminal, fitAddon を削除(セッションに移動)
  • sessions: Map<string, SessionState> を追加
  • activeSessionId: string | null を追加
  • terminalContainerEl を terminalAreaEl にリネーム(セッション terminal-container の親)

セッション切り替えフロー

  1. 現在のセッションの containerEl を display:none
  2. 新セッションの containerEl を display:block
  3. fitAddon.fit() で新セッションのターミナルをリサイズ
  4. suppressResize でリサイズ通知を抑制

startTab / stopTab

  • アクティブセッションの SessionState を参照
  • PTY の spawn/kill はセッション単位

SessionManager との連携

  • onSessionSwitch: 表示切り替えのみ(PTY 再起動しない)
  • onSessionCreate: 新 SessionState を生成、Terminal を open
  • onSessionDelete: PTY kill、Terminal dispose、containerEl 削除

target files

  • src/tabs.ts — SessionState 導入、TabState リファクタ、startTab/stopTab をセッション対応
  • src/sessions.ts — onSessionCreate, onSessionDelete コールバック追加

Metadata

Metadata

Labels

enhancement新機能・改善要望ready本文が実装開始できる形まで収束している状態。ただし更新は継続可能

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions