# 通知設計書 53-Update Failed (install)

## 概要

本ドキュメントは、OpenCodeデスクトップアプリケーションにおけるアップデートインストール失敗時のダイアログ通知（Update Failed - install）の設計について記載する。

### 本通知の処理概要

本通知は、OpenCodeデスクトップアプリケーション（Tauri製）において、ダウンロード済みアップデートのインストールプロセスが失敗した際にユーザーに対してシステムダイアログを表示し、エラー状況を通知する機能である。

**業務上の目的・背景**：アップデートのダウンロードが成功し、ユーザーがインストールを承認したにもかかわらず、インストール処理が失敗することがある。これは権限の問題、ディスク容量不足、ファイルロック、システムの整合性エラーなど様々な要因で発生する可能性がある。ユーザーに対して明確にエラー状況を伝えることで、問題解決のための適切な対応（管理者権限での再試行、ディスク容量確保、アプリケーション再起動等）を促す必要がある。

**通知の送信タイミング**：ユーザーがUpdate Downloadedダイアログで「Yes」を選択した後、Tauriのupdaterプラグインを使用したインストール処理（`update.install()`）が例外をスローした時点で、即座にダイアログが表示される。

**通知の受信者**：OpenCodeデスクトップアプリケーションを使用中のユーザー本人。ダイアログはアプリケーションのメインウィンドウに対してモーダルで表示される。

**通知内容の概要**：ダイアログには「Update Failed」というタイトル（i18nキー: `desktop.updater.installFailed.title`）と「Failed to install update」というメッセージ（i18nキー: `desktop.updater.installFailed.message`）が表示される。多言語対応により、ユーザーの言語設定に応じて適切な言語で表示される。

**期待されるアクション**：ユーザーはダイアログのOKボタンをクリックして閉じた後、アプリケーションの再起動、管理者権限での再試行、ディスク容量の確認、手動でのアップデートなどの対応を行うことが期待される。

## 通知種別

デスクトップダイアログ（Tauri Dialog API - `message`関数）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（await） |
| 優先度 | 高 |
| リトライ | なし（ダイアログ表示自体のリトライはなし） |

### 送信先決定ロジック

- アプリケーションを操作中のユーザーに対して、Tauriのダイアログプラグインを通じてネイティブOSのダイアログとして表示される
- インストール失敗時は常にダイアログを表示（`alertOnFail`による条件分岐なし）

## 通知テンプレート

### デスクトップダイアログの場合

| 項目 | 内容 |
|-----|------|
| ダイアログタイプ | message（情報ダイアログ） |
| タイトル | `desktop.updater.installFailed.title` |
| メッセージ | `desktop.updater.installFailed.message` |
| ボタン | OK（デフォルト） |

### 本文テンプレート

**英語（en）:**
```
Title: Update Failed
Message: Failed to install update
```

**日本語（ja）:**
```
Title: アップデートに失敗しました
Message: アップデートをインストールできませんでした
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | 本通知には動的変数なし | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| システムイベント | `update.install()`が例外をスロー | ユーザーがインストールを承認（Yes選択）後にインストール失敗 | インストール処理で例外が発生した場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| ユーザーがNo選択 | Update Downloadedダイアログでユーザーが「No」を選択した場合はインストール処理に到達しない |
| インストール成功 | `update.install()`が正常に完了した場合は表示しない |
| ダウンロード失敗 | ダウンロードが失敗した場合は別のダイアログ（Update Failed - download）を表示 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[Update Downloadedダイアログ] --> B{ユーザー選択}
    B -->|Yes| C[Windows: サイドカー終了]
    B -->|No| D[処理終了]
    C --> E[update.install実行]
    E --> F{インストール成功?}
    F -->|Yes| G[サイドカー終了]
    F -->|No - 例外発生| H[Update Failed installダイアログ表示]
    G --> I[relaunch実行]
    H --> J[処理終了 return]
    I --> K[アプリ再起動完了]
```

## データベース参照・更新仕様

### 参照テーブル一覧

該当なし（本機能はデータベースを使用しない）

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| インストール失敗 | 権限エラー、ディスク容量不足、ファイルロック等 | ダイアログ表示後、処理を終了（return） |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（自動リトライなし） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | なし |
| 1日あたり上限 | なし |

### 配信時間帯

制限なし

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

- ダイアログには具体的なエラー詳細（スタックトレースやシステム情報）を表示せず、ユーザーフレンドリーなメッセージのみを表示
- Tauriのセキュアなダイアログプラグインを使用しており、XSSやインジェクション攻撃のリスクは低い
- 多言語対応のi18n辞書は静的に定義されており、動的なテンプレート展開による脆弱性リスクはない

## 備考

- 本ダイアログはTauri専用機能であり、Web版OpenCodeでは利用不可
- `@tauri-apps/plugin-dialog`の`message`関数を使用してネイティブOSダイアログを表示
- インストール失敗後もアプリケーションは継続して使用可能（古いバージョンのまま）
- ダウンロード済みのアップデートファイルは、次回のアップデート試行時に再利用される可能性がある

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

i18n辞書の構造を理解することで、通知メッセージがどのように定義されているかを把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | en.ts | `packages/desktop/src/i18n/en.ts` | 英語の基本メッセージ定義。`desktop.updater.installFailed.title`と`.message`を確認 |
| 1-2 | ja.ts | `packages/desktop/src/i18n/ja.ts` | 日本語翻訳例。同じキーで翻訳が定義されていることを確認 |

**読解のコツ**: インストール失敗のメッセージはダウンロード失敗とは別のキー（`installFailed`）を使用している点に注意。

#### Step 2: エントリーポイントを理解する

アップデート処理の起点となるファイルを特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | updater.ts | `packages/desktop/src/updater.ts` | `runUpdater`関数内でのインストール処理のtry-catch構造 |

**主要処理フロー**:
1. **36-39行目**: `ask()`で確認後、`shouldUpdate`がfalseなら`return`
2. **41行目**: try文開始
3. **42行目**: Windows環境で`commands.killSidecar()`実行
4. **43行目**: `update.install()`でインストール実行
5. **44行目**: catch文開始（インストール失敗時）
6. **45行目**: `message()`でダイアログ表示
7. **46行目**: `return`で処理終了

#### Step 3: Tauri Dialog APIとエラーハンドリングを理解する

`message`関数の使用方法とエラーハンドリングパターンを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | updater.ts | `packages/desktop/src/updater.ts` | try-catch内での`message`関数呼び出し（44-46行目） |

**主要処理フロー**:
- **3行目**: `import { ask, message } from "@tauri-apps/plugin-dialog"`
- **44-46行目**: `catch { await message(t("desktop.updater.installFailed.message"), { title: t("desktop.updater.installFailed.title") }); return }`

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

```
Update Downloadedダイアログ（ask関数）
    │
    └─ [Yes選択時]
           │
           ├─ commands.killSidecar() [Windows only]
           │
           └─ update.install() [Tauri Updater Plugin]
                  │
                  └─ [例外発生時]
                         │
                         └─ message() [Tauri Dialog Plugin]
                                │
                                ├─ t("desktop.updater.installFailed.title")
                                └─ t("desktop.updater.installFailed.message")
                                │
                                └─ return (処理終了)
```

### データフロー図

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

Update Downloaded
ダイアログでYes選択
        │
        ▼
Windows判定  ───▶  killSidecar()（条件付き）
        │
        ▼
        install() - インストール試行
        │
        ▼
        [例外発生]
        │
        ▼
        i18n翻訳取得(t関数)    ───▶  ネイティブOSダイアログ
                                         (message関数)
        │
        ▼
        処理終了(return)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| updater.ts | `packages/desktop/src/updater.ts` | ソース | アップデート処理のメインロジック |
| en.ts | `packages/desktop/src/i18n/en.ts` | 設定 | 英語メッセージ定義 |
| ja.ts | `packages/desktop/src/i18n/ja.ts` | 設定 | 日本語メッセージ定義 |
| index.ts (i18n) | `packages/desktop/src/i18n/index.ts` | ソース | i18n初期化・翻訳関数(t)の提供 |
| bindings.ts | `packages/desktop/src/bindings.ts` | ソース | Rustバインディング（commands.killSidecar等） |
