# 機能設計書 85-アンドゥ

## 概要

本ドキュメントは、Ghosttyターミナルエミュレータにおけるアンドゥ（Undo）機能の設計仕様を記載する。

### 本機能の処理概要

アンドゥ機能は、ウィンドウ、タブ、スプリットの閉じる操作を取り消し、閉じた要素を復元する機能である。一定時間内であれば、誤って閉じた端末セッションを元に戻すことができる。

**業務上の目的・背景**：
ユーザーが誤ってターミナルウィンドウやタブを閉じてしまった場合、実行中のプロセスや作業状態を失う可能性がある。アンドゥ機能により、一定時間内であれば閉じた操作を取り消し、作業を継続できるようにする。

**機能の利用シーン**：
- 誤ってタブやスプリットを閉じてしまった場合
- 誤ってウィンドウを閉じてしまった場合
- キーボードショートカット（Cmd+Z等）で素早く復元

**主要な処理内容**：
1. キーバインドアクション`undo`を受け取る
2. アンドゥスタックから最新の取り消し可能な操作を取得
3. 操作の種類（ウィンドウ/タブ/スプリット）に応じて復元処理を実行
4. タイムアウト内であれば復元が成功

**関連システム・外部連携**：
- macOS AppKit（macOSのみ実装）

**権限による制御**：
特に権限による制御はない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | メインターミナルウィンドウ | 主画面 | ウィンドウ/タブ/スプリットの復元 |

## 機能種別

ユーザー操作 / 状態管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| (なし) | - | - | パラメータなしのアクション | - |

### 入力データソース

- キーバインドアクション
- メニュー操作

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 復元されたウィンドウ/タブ/スプリット | UI要素 | 取り消された操作に対応する要素を復元 |

### 出力先

アプリケーションUI

## 処理フロー

### 処理シーケンス

```
1. アクション受信
   └─ undoアクション
2. アンドゥスタック確認
   └─ 取り消し可能な操作があるか確認
3. タイムアウト確認
   └─ undo-timeout設定内かどうか確認
4. 復元処理実行
   ├─ ウィンドウ復元
   ├─ タブ復元
   └─ スプリット復元
5. 状態更新
   └─ アンドゥスタックから操作を除去、リドゥスタックに追加
```

### フローチャート

```mermaid
flowchart TD
    A[undo アクション] --> B{macOS環境?}
    B -->|No| C[何もしない]
    B -->|Yes| D{アンドゥスタックに操作あり?}
    D -->|No| C
    D -->|Yes| E{タイムアウト内?}
    E -->|No| F[操作を破棄]
    E -->|Yes| G{操作種別}
    G -->|ウィンドウ| H[ウィンドウ復元]
    G -->|タブ| I[タブ復元]
    G -->|スプリット| J[スプリット復元]
    H --> K[リドゥスタックに追加]
    I --> K
    J --> K
    K --> L[終了]
    C --> L
    F --> L
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-85-01 | macOS限定 | 本機能はmacOSでのみ実装 | 常時 |
| BR-85-02 | タイムアウト制限 | undo-timeout設定で指定された時間内のみ復元可能 | 常時 |
| BR-85-03 | 対象操作限定 | ウィンドウ/タブ/スプリットの閉じる操作のみが対象 | 常時 |
| BR-85-04 | メモリ管理 | タイムアウト後は閉じたサーフェスのメモリを解放 | タイムアウト時 |

### 計算ロジック

タイムアウト判定: `現在時刻 - 操作時刻 < undo-timeout`

## データベース操作仕様

本機能はデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 無視 | 非macOS環境での実行 | 何もしない |
| - | 無視 | アンドゥスタックが空 | 何もしない |
| - | 無視 | タイムアウト超過 | 操作を破棄して何もしない |

### リトライ仕様

リトライは行わない。

## トランザクション仕様

該当なし。

## パフォーマンス要件

- アンドゥスタックのサイズはメモリ使用量に影響
- タイムアウト機能によりメモリ使用量を制限

## セキュリティ考慮事項

- 閉じたターミナルのプロセスはタイムアウトまでバックグラウンドで継続
- 機密情報を含むセッションの取り扱いに注意

## 備考

- GTK（Linux）環境では本機能は未実装
- 復元可能な操作はNew window/Close window、New tab/Close tab、New split/Close splitのペア

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: アクション定義を理解する

まず、アクションの定義を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Binding.zig | `src/input/Binding.zig` | undo アクション定義（826-848行目） |
| 1-2 | action.zig | `src/apprt/action.zig` | undo アクション定義（295-297行目） |

**読解のコツ**: `undo`アクションはmacOSのみ実装されており、GTKでは`isActionSupportedOnGtk`でフィルタされる。

**主要処理フロー**:
- **Binding.zig 826-848行目**: アクションのドキュメント（対象操作、タイムアウト、プラットフォーム制限）

#### Step 2: App.zigでのアクション処理を理解する

アクションがAppでどのように処理されるか。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | App.zig | `src/App.zig` | undoアクションのperformAction呼び出し（453行目） |

**主要処理フロー**:
- **453行目**: `rt_app.performAction(.app, .undo, {})`

### プログラム呼び出し階層図

```
キーバインドアクション
    │
    └─ undo
           │
           ▼
    App.zig
           │
           └─ rt_app.performAction(.app, .undo)
                  │
                  ▼
           [macOS環境のみ]
                  │
                  ▼
           macOS AppKit Undo Manager
                  │
                  ├─ ウィンドウ復元
                  ├─ タブ復元
                  └─ スプリット復元
```

### データフロー図

```
[入力]               [処理]                    [出力]

キーバインド ───▶ アクション判定 ───▶ プラットフォーム判定
                                              │
                                              ▼
                                    [macOS環境のみ]
                                              │
                                              ▼
                                    アンドゥスタック確認
                                              │
                                              ▼
                                    タイムアウト確認
                                              │
                                              ▼
                                    復元処理
                                              │
                                              ▼
                                    UI更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Binding.zig | `src/input/Binding.zig` | ソース | アクション定義（undo, redo） |
| action.zig | `src/apprt/action.zig` | ソース | apprレベルのアクション定義 |
| App.zig | `src/App.zig` | ソース | アクション処理のディスパッチ |
| Config.zig | `src/config/Config.zig` | ソース | undo-timeout設定の定義 |
| command_palette.zig | `src/apprt/gtk/class/command_palette.zig` | ソース | GTKでのフィルタリング |
