# 通知設計書 11-Stopped auto-accepting edits

## 概要

本ドキュメントは、OpenCodeアプリケーションにおける「Stopped auto-accepting edits」トースト通知の設計仕様を記載する。この通知は編集の自動承認機能が無効化されたときにユーザーに表示される。

### 本通知の処理概要

この通知は、ユーザーがセッション中のエージェントによる編集操作の自動承認を無効化したときに表示されるトースト通知である。

**業務上の目的・背景**：OpenCodeでは、AIエージェントがファイル編集操作を行う際に権限確認が求められる。作業効率化のために自動承認機能があるが、セキュリティ上の観点やレビューの必要性から、いつでも自動承認を無効化できることが重要である。この通知により、ユーザーは自動承認が無効化されたことを明確に認識でき、以降の編集操作には承認が必要になることを理解できる。

**通知の送信タイミング**：ユーザーがキーボードショートカット（Cmd/Ctrl+Shift+A）を押下するか、コマンドパレットから「Stop auto-accepting edits」コマンドを実行したときに、自動承認が有効な状態から無効な状態に切り替わると即座に表示される。

**通知の受信者**：操作を実行したユーザー自身。アプリケーション画面上にトースト通知として表示されるため、現在アクティブなユーザーのみが受信する。

**通知内容の概要**：タイトルとして「Stopped auto-accepting edits」、説明として「Edit and write permissions will require approval」が表示され、自動承認が無効化されたことと、今後は編集・書き込み権限に承認が必要になることを伝える。

**期待されるアクション**：ユーザーは通知を確認し、以降のエージェントによる編集操作に対して手動で承認・拒否を行う。必要に応じて、同じコマンドで自動承認を再度有効化することもできる。

## 通知種別

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

## 送信仕様

### 基本情報

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

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

操作を実行したユーザーのアプリケーション画面に直接表示される。ローカルのUI操作であるため、特別な送信先決定ロジックは不要。

## 通知テンプレート

### トースト通知

| 項目 | 内容 |
|-----|------|
| タイトル | Stopped auto-accepting edits |
| 説明 | Edit and write permissions will require approval |
| バリアント | default |

### 本文テンプレート

```
タイトル: {toast.permissions.autoaccept.off.title}
説明: {toast.permissions.autoaccept.off.description}
```

### 添付ファイル

該当なし

## テンプレート変数

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

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 画面操作 | キーボードショートカット（mod+shift+a） | 自動承認が有効→無効に切り替わったとき | コマンドパレットまたはショートカットからの実行 |
| 画面操作 | コマンドパレットから「Stop auto-accepting edits」選択 | 自動承認が有効→無効に切り替わったとき | permissionsコマンドの実行 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| 自動承認が既に無効の場合 | 有効→無効への切り替え時のみ表示 |
| パーミッション機能が無効の場合 | permissionsEnabled()がfalseの場合はコマンド自体が無効化される |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[ユーザー操作: mod+shift+a] --> B{セッションIDが存在するか?}
    B -->|No| C[処理終了]
    B -->|Yes| D[permission.toggleAutoAccept実行]
    D --> E{自動承認の新しい状態を確認}
    E -->|無効になった| F[showToast: autoaccept.off]
    E -->|有効になった| G[showToast: autoaccept.on]
    F --> H[トースト表示]
    G --> H
    H --> I[処理終了]
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| ローカルストレージ（permission.v3） | 自動承認状態の永続化 | ブラウザのローカルストレージを使用 |

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

#### ローカルストレージ（permission.v3）

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| autoAcceptEdits | セッションごとの自動承認状態 | sessionIDをキーとして取得 |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| ローカルストレージ（permission.v3） | UPDATE/DELETE | 自動承認状態をfalseに設定または削除 |

#### 送信ログテーブル

該当なし（トースト通知はログを永続化しない）

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| セッションID不在 | paramsにセッションIDがない | 処理をスキップ |
| パーミッション機能無効 | permissionsEnabled()がfalse | コマンドが無効化され実行不可 |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

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

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

- 本通知には個人情報や機密情報は含まれない
- ローカルで完結する操作のため、ネットワーク経由での情報漏洩リスクはない
- 自動承認状態はローカルストレージに保存されるため、ブラウザのセキュリティポリシーに依存

## 備考

- 英語以外の言語では、各言語の翻訳ファイル（ja.ts、zh.ts等）で定義されたテキストが表示される
- 対となる通知として「Auto-accepting edits」（自動承認有効化時）がある

---

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

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

### 推奨読解順序

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

通知に関連するi18nキーとトースト通知のオプション構造を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | en.ts | `packages/app/src/i18n/en.ts` | L405-408: autoaccept関連のi18nキー定義を確認 |
| 1-2 | toast.tsx | `packages/ui/src/components/toast.tsx` | L101-116: ToastOptionsインターフェースの構造を確認 |

**読解のコツ**: i18nファイルでは`toast.permissions.autoaccept.off`で始まるキーを検索すると、この通知に関連する全テキストを特定できる。

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | use-session-commands.tsx | `packages/app/src/pages/session/use-session-commands.tsx` | L264-287: permissionsCommand定義とshowToast呼び出し |

**主要処理フロー**:
1. **L264-271**: permissionsCommandの定義。自動承認状態に応じてコマンドタイトルを動的に切り替え
2. **L272**: `disabled`条件でセッションID不在やパーミッション機能無効時にコマンドを無効化
3. **L273-286**: `onSelect`ハンドラ内で`toggleAutoAccept`実行後、状態に応じてトースト表示

#### Step 3: パーミッション管理ロジックを理解する

自動承認状態の管理とトグル処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | permission.tsx | `packages/app/src/context/permission.tsx` | L63-68, L108-116, L162-195: 状態管理と切り替えロジック |

**主要処理フロー**:
- **L63-68**: ローカルストレージへの永続化設定（persisted関数）
- **L108-116**: acceptKey関数とisAutoAccepting関数で状態判定
- **L162-171**: disable関数で自動承認を無効化し、ストレージから削除
- **L180-187**: toggleAutoAccept関数で状態をトグル

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

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

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

**主要処理フロー**:
- **L118-119**: オプションが文字列の場合の変換処理
- **L120-157**: Kobalte toasterを使用したトーストコンポーネントのレンダリング

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

```
useSessionCommands (use-session-commands.tsx)
    │
    ├─ permissionsCommand.onSelect (L273-286)
    │      │
    │      ├─ permission.toggleAutoAccept (permission.tsx L180-187)
    │      │      │
    │      │      └─ disable (permission.tsx L162-171)
    │      │             └─ setStore (ローカルストレージ更新)
    │      │
    │      └─ showToast (toast.tsx L118-158)
    │             └─ toaster.show (Kobalteトースター)
    │
    └─ language.t (翻訳テキスト取得)
           └─ i18n/en.ts (L407-408)
```

### データフロー図

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

ユーザー操作         permissionコンテキスト           トースト通知
(mod+shift+a)   ───▶  toggleAutoAccept     ───▶   showToast
                      isAutoAccepting              title + description
                           │                            │
                           ▼                            ▼
                    ローカルストレージ            画面上にトースト表示
                    (permission.v3)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| use-session-commands.tsx | `packages/app/src/pages/session/use-session-commands.tsx` | ソース | コマンド定義とトースト呼び出し |
| permission.tsx | `packages/app/src/context/permission.tsx` | ソース | 自動承認状態の管理 |
| toast.tsx | `packages/ui/src/components/toast.tsx` | ソース | トースト通知コンポーネント |
| en.ts | `packages/app/src/i18n/en.ts` | 設定 | 英語翻訳テキスト |
| ja.ts | `packages/app/src/i18n/ja.ts` | 設定 | 日本語翻訳テキスト |
