セッションとエージェント–セッションモデル¶
reyn は 誰が動いているか と どの会話か を明確に分離します。これらを分けておくことが、 1 つのエージェントが複数の会話を並行して持ち、それぞれを独立に永続化できる—会話どうしが 混ざらない—理由です。
2 つのレベル¶
| レベル | 何か | 持つもの |
|---|---|---|
| Agent | アイデンティティ / ノード — 名前で addressable な長命のアクター | 名前・メモリ・パーミッション・ワークスペーススコープ・ピアアドレッシング |
| Session | Agent 配下の 会話(1 Agent → 複数 Session) | メッセージ履歴・inbox / outbox・現在のタスク・一時状態 |
階層:
これは主流のエージェントプラットフォームの形です。reyn の差別化はモデルではなく、 その 下 にあるもの: すべての Session がイベントソース・パーミッションゲート・ タイムトラベル可能である点です(後述)。
複数 Session と 複数 Agent¶
この 2 軸は混同しやすいです。境界は アイデンティティ です:
- 複数 Agent ⇒ 異なるアイデンティティ — 役割・パーミッション・メモリ・信頼境界 が異なる。「異なる 誰」。委譲・協調する専門家チーム。
- 複数 Session ⇒ 同一アイデンティティの並行会話 — メモリ・パーミッション・ ワークスペースを共有。「同じ 誰、異なる会話」。1 アクターが複数タスクを同時に捌く。
実用ルール:
役割・パーミッション・知識境界が異なる? → 新しい Agent。 同じエージェントが並行で別のことをする? → 新しい Session。
パーミッションはアイデンティティ(Agent 境界)に属し、その Agent の Session 間で 共有されるため、異なる パーミッションを要するタスクは定義上 別アイデンティティ= sub-agent であって sub-session ではありません。これで基準が単一・一意に保たれます。 同じ分割は再帰します: Session を fork(sub-session)= アイデンティティ維持で会話を 分岐、sub-agent へ委譲 = アイデンティティを変える。
Session が持つもの¶
Session は会話の単位です。メッセージ履歴・inbox / outbox・現在のタスク・一時実行状態 を持ちます。アイデンティティスコープのもの(メモリ・パーミッション・ワークスペース スコープ・ピアアドレッシング)は Agent 側にあり同 Agent の全 Session で共有、会話 スコープのものは Session ごとに隔離されます。
永続化と復旧は Session に key します:
- セッションごとの永続化 — 各 Session の状態は独立にスナップショットされ、1 つの Agent 配下の会話が別々に保存・復元される。
- タイムトラベル rewind は global cut(per-session ではない) —
/rewindは すべての Session と Agent を対象チェックポイントへ atomically に動かす(global single-seq WAL が 1 つ)。rewind は単一 Session に隔離されず、プロセス全体で一貫 する。per-session 粒度は永続化と replay(上記)にあり、rewind 操作にはない。 タイムトラベル参照。 - クラッシュ復旧 — 再起動時、単一会話でなくマルチセッション構造全体がイベント ログとスナップショットから再構築される。
トランスポートは Session にルーティングする¶
トランスポート は、メッセージが Agent に届く経路すべて — 対話 REPL、Web UI、 スケジュールされた cron ジョブ、ピアエージェント等 — です。トランスポートは会話を 所有せず、routing-key で受信メッセージを Session に ルーティング します:
- デフォルト — 決定的マッピング。 トランスポート固有の会話 id が、トランスポート で名前空間化されて Session にマップ(Web タブ、cron ジョブ名、チャットスレッド)。 最初のメッセージで Session を自動生成、同 id で resume。ゼロ設定でステートフル・ 隔離・会話ごとのルーティングになる。現在 Web UI はブラウザタブごと、cron はジョブ ごとにルーティングします。
- 明示 — 既存 Session に join。 メッセージは既存 Session を id で指定でき、これが あるトランスポートが別のトランスポートの始めた会話に橋渡しする方法です。存在しない ターゲットはエラー: Session はマッピングデフォルトか明示 spawn でのみ作られ、打ち 間違えた id で暗黙生成されることはありません。
ルーティングは 1 つの Agent 内 にスコープされます — join は同 Agent 自身の Session 間(共有アイデンティティ、安全)。異なる Agent に届くのは委譲であって join では ありません。トランスポートが追加されるたび、同じモデルでルーティングされます。