# 通知設計書 20-Failed to unshare session

## 概要

本ドキュメントは、OpenCodeアプリケーションにおける「Failed to unshare session」トースト通知の設計仕様を記載する。この通知はセッションの共有解除に失敗したときにユーザーに表示される。

### 本通知の処理概要

この通知は、ユーザーがセッションの共有を解除しようとしたが、サーバー側でエラーが発生した場合に表示されるエラー通知である。

**業務上の目的・背景**：OpenCodeのセッション共有解除機能では、サーバーにリクエストを送信して共有状態を解除する。このAPI呼び出しが失敗した場合、ユーザーにエラーを通知し、再試行や問題の調査を促す必要がある。共有解除が失敗すると、セッションは引き続き公開状態のままとなるため、ユーザーはこの状況を認識する必要がある。

**通知の送信タイミング**：ユーザーが/unshareコマンドを実行し、sdk.client.session.unshare APIが例外をスローしたときに表示される。

**通知の受信者**：操作を実行したユーザー自身。アプリケーション画面上にトースト通知として表示される。

**通知内容の概要**：タイトルとして「Failed to unshare session」、説明として「An error occurred while unsharing the session」が表示され、共有解除処理中にエラーが発生したことを伝える。

**期待されるアクション**：ユーザーはネットワーク接続を確認し、再度共有解除を試みる。問題が継続する場合は、セッションが引き続き公開状態であることを認識し、必要に応じて対処する。

## 通知種別

トースト通知（アプリ内通知）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（即時表示） |
| 優先度 | 高 |
| リトライ | 無し |

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

操作を実行したユーザーのアプリケーション画面に直接表示される。

## 通知テンプレート

### トースト通知

| 項目 | 内容 |
|-----|------|
| タイトル | Failed to unshare session |
| 説明 | An error occurred while unsharing the session |
| バリアント | error |

### 本文テンプレート

```
タイトル: {toast.session.unshare.failed.title}
説明: {toast.session.unshare.failed.description}
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| toast.session.unshare.failed.title | 通知タイトル | i18n翻訳ファイル（en.ts） | Yes |
| toast.session.unshare.failed.description | 通知説明文 | i18n翻訳ファイル（en.ts） | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| API呼び出し | sdk.client.session.unshare失敗 | 例外がスローされた場合 | APIエラー |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| API成功 | 成功通知が代わりに表示される |
| 共有URLがない場合 | コマンド自体がdisabledとなり実行されない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[ユーザー操作: /unshare] --> B{セッションIDがあるか?}
    B -->|No| C[処理終了]
    B -->|Yes| D[sdk.client.session.unshare呼び出し]
    D --> E{API成功?}
    E -->|No - 例外| F[showToast: unshare.failed]
    E -->|Yes| G[showToast: unshare.success]
    G --> H[トースト表示]
    F --> H
    H --> I[処理終了]
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| セッション情報（メモリ） | 共有URLの有無確認 | info()?.share?.urlで参照 |

### テーブル別参照項目詳細

該当なし（エラー時は状態変更なし）

### 更新テーブル一覧

該当なし（エラー時は更新なし）

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| API例外 | sdk.client.session.unshareが例外をスロー | failed通知を表示 |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

制限なし（ユーザー操作起点のため）

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

- 共有解除が失敗した場合、セッションは引き続き公開状態のまま
- エラー通知には詳細なエラー情報は含まれず、一般的なメッセージのみ表示

## 備考

- ネットワーク接続の問題やサーバーの一時的な障害が主な原因
- 共有解除に失敗した場合、ユーザーは再度/unshareコマンドを試みることができる
- 共有機能がサーバー設定で無効の場合、このエラーは発生しない

---

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

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

### 推奨読解順序

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

通知に関連するi18nキーを把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | en.ts | `packages/app/src/i18n/en.ts` | L427-428: unshare.failed関連のi18nキー定義 |

**読解のコツ**: `toast.session.unshare.failed`で始まるi18nキーがこの通知に対応する。

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

ユーザー操作からトースト表示までの起点となるファイルを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | use-session-commands.tsx | `packages/app/src/pages/session/use-session-commands.tsx` | L469-475: .catch()でのエラー処理 |

**主要処理フロー**:
1. **L460-461**: sdk.client.session.unshare API呼び出し
2. **L469-475**: .catch()ブロックでshowToast呼び出し（エラー通知）

#### Step 3: API呼び出しのエラー処理を理解する

.catch()ブロックの詳細を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | use-session-commands.tsx | `packages/app/src/pages/session/use-session-commands.tsx` | L469-475: 完全なエラー処理ブロック |

**主要処理フロー**:
- **L469**: .catch()でPromise拒否をキャッチ
- **L470-474**: showToast呼び出し（エラー通知）
- **L474**: variant: "error"を指定

#### Step 4: トースト表示の実装を理解する

showToast関数の実装詳細を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | toast.tsx | `packages/ui/src/components/toast.tsx` | L118-158: showToast関数の実装 |

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

```
useSessionCommands (use-session-commands.tsx)
    │
    ├─ shareCommands (L373-479)
    │      │
    │      └─ session.unshare (L452-477)
    │             │
    │             └─ onSelect (L458-476)
    │                    │
    │                    └─ sdk.client.session.unshare (L460-461)
    │                           │
    │                           ├─ [成功] .then() → showToast: success
    │                           │
    │                           └─ [失敗] .catch() → showToast: failed (L469-475)
    │                                  │
    │                                  └─ variant: "error"
    │
    └─ language.t (翻訳テキスト取得)
           └─ i18n/en.ts (L427-428)
```

### データフロー図

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

ユーザー操作        sdk.client.session.unshare       トースト通知
(/unshare)    ───▶  API呼び出し               ───▶   showToast
                           │                         variant: "error"
                           ▼                         title + description
                    例外発生                              │
                    (.catch)                             ▼
                                                   画面上にトースト表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| use-session-commands.tsx | `packages/app/src/pages/session/use-session-commands.tsx` | ソース | コマンド定義とトースト呼び出し |
| toast.tsx | `packages/ui/src/components/toast.tsx` | ソース | トースト通知コンポーネント |
| en.ts | `packages/app/src/i18n/en.ts` | 設定 | 英語翻訳テキスト |
