# 機能設計書 6-Title エージェント

## 概要

本ドキュメントは、OpenCodeシステムにおけるTitle エージェントの機能設計を記述する。Title エージェントは、セッションタイトル自動生成用の内部エージェントであり、ユーザーの最初のメッセージからセッションを識別しやすいタイトルを生成する。

### 本機能の処理概要

Title エージェントは、セッション開始時やユーザーの最初のメッセージ送信後に自動的に起動され、会話の内容を分析して適切なセッションタイトルを生成する。生成されたタイトルはセッション一覧での識別や、後からセッションを検索する際に使用される。

**業務上の目的・背景**：複数のセッションを管理する際、各セッションの内容を素早く識別できることが重要である。手動でタイトルを設定する手間を省き、自動的に適切なタイトルを生成することで、ユーザー体験を向上させる。

**機能の利用シーン**：新規セッション作成後の最初のユーザーメッセージ送信時に自動実行される。生成されたタイトルは、セッション一覧のサイドバーに表示される。

**主要な処理内容**：
1. ユーザーメッセージの受信
2. メッセージ内容の分析
3. 50文字以内の簡潔なタイトル生成
4. セッションへのタイトル設定

**関連システム・外部連携**：セッション管理システムと連携し、生成されたタイトルをセッションレコードに保存。

**権限による制御**：Title エージェントは、内部エージェントとして全ツール使用が禁止（*: deny）されている。テキスト生成のみを行う。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | 内部機能 | セッション一覧でタイトル表示 |

## 機能種別

自動タイトル生成 / テキスト生成

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| name | string | Yes | エージェント名（"title"固定） | 文字列型 |
| mode | "primary" | Yes | エージェントのモード | enum値 |
| native | boolean | Yes | ネイティブエージェントかどうか（true） | boolean型 |
| hidden | boolean | Yes | 非表示フラグ（true） | boolean型 |
| temperature | number | Yes | 温度パラメータ（0.5） | 数値型 |
| prompt | string | Yes | タイトル生成用システムプロンプト（PROMPT_TITLE） | 任意の文字列 |
| permission | PermissionNext.Ruleset | Yes | 権限ルールセット（全ツールdeny） | 有効なルールセット配列 |

### 入力データソース

- ユーザーの最初のメッセージ
- セッション情報

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| title | string | 生成されたセッションタイトル（50文字以内） |

### 出力先

- セッションデータベース（titleフィールド）

## 処理フロー

### 処理シーケンス

```
1. セッション開始とユーザーメッセージ受信
   └─ 最初のユーザーメッセージをトリガーとして起動
2. タイトル生成
   └─ PROMPT_TITLEに基づきLLMでタイトル生成
3. タイトル保存
   └─ Session.setTitle()でセッションに設定
```

### フローチャート

```mermaid
flowchart TD
    A[ユーザーメッセージ送信] --> B{タイトル未設定?}
    B -->|Yes| C[Titleエージェント起動]
    B -->|No| D[スキップ]
    C --> E[メッセージ内容分析]
    E --> F[タイトル生成]
    F --> G{50文字以内?}
    G -->|Yes| H[タイトル保存]
    G -->|No| I[タイトル短縮]
    I --> H
    H --> J[完了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 文字数制限 | タイトルは50文字以内 | 常時 |
| BR-02 | 単一行 | タイトルは改行なしの単一行 | 常時 |
| BR-03 | 言語一致 | ユーザーメッセージと同じ言語でタイトル生成 | 常時 |
| BR-04 | ツール名除外 | タイトルにツール名を含めない | 常時 |
| BR-05 | 冠詞省略 | the, this, my, a, anなどの冠詞を省略 | 常時 |
| BR-06 | 技術用語保持 | 技術用語、数値、ファイル名、HTTPコードは正確に保持 | 常時 |

### 計算ロジック

特になし

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

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| タイトル保存 | session | UPDATE | titleフィールドの更新 |

### テーブル別操作詳細

#### session

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | title | 生成されたタイトル | 50文字以内 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | タイトル生成失敗 | LLM APIエラー | デフォルトタイトル使用 |

### リトライ仕様

タイトル生成は非クリティカルなため、エラー時はデフォルトタイトルで継続。

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

タイトル保存は単一のUPDATE操作。

## パフォーマンス要件

- タイトル生成はバックグラウンドで非同期実行
- ユーザーの応答待ちに影響しない

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

- 全ツールが禁止されており、ファイル操作等の副作用なし
- タイトルにセンシティブな情報が含まれないよう注意

## 備考

Title エージェントは、temperature: 0.5に設定されており、ある程度の創造性を持ちながらも安定したタイトル生成を行う。hiddenフラグがtrueのため、ユーザーからは直接選択できない。

---

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

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

### 推奨読解順序

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

Titleエージェントの設定と専用プロンプトを理解。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | agent.ts | `packages/opencode/src/agent/agent.ts` | titleエージェント定義（172-187行目） |
| 1-2 | title.txt | `packages/opencode/src/agent/prompt/title.txt` | タイトル生成用システムプロンプト |

**読解のコツ**: temperature: 0.5の設定により、ある程度のバリエーションを持たせながらも一貫したタイトルを生成する設計。

#### Step 2: システムプロンプトを理解する

タイトル生成のルールとガイドラインを把握。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | title.txt | `packages/opencode/src/agent/prompt/title.txt` | タイトル生成ルールの詳細 |

**主要処理フロー**:
1. **1行目**: "You are a title generator"という役割定義
2. **3-12行目**: タスク定義（50文字以内、単一行、説明なし）
3. **14-28行目**: ルール（言語一致、ツール名除外、冠詞省略等）
4. **33-44行目**: 具体的な例

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

```
Session.chat() [index.ts]
    │
    └─ タイトル未設定の場合
           │
           ├─ Agent.get("title") [agent.ts]
           │      └─ Titleエージェント設定取得
           │
           └─ LLM呼び出し
                  │
                  ├─ PROMPT_TITLE適用
                  │
                  └─ タイトル生成
                         │
                         └─ Session.setTitle()
```

### データフロー図

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

ユーザーメッセージ ───▶ Titleエージェント
                              │
                              ├──▶ メッセージ分析
                              │
                              ├──▶ タイトル生成
                              │        │
                              │        └─ 50文字以内に制限
                              │
                              └──▶ セッション更新
                                        │
                                        └──▶ session.title
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| agent.ts | `packages/opencode/src/agent/agent.ts` | ソース | Titleエージェント定義（172-187行目） |
| title.txt | `packages/opencode/src/agent/prompt/title.txt` | テンプレート | タイトル生成用システムプロンプト |
| index.ts | `packages/opencode/src/session/index.ts` | ソース | Session.setTitle()実装 |
