背景
PR #22 (ChatRunner long-lived Query 化) で runOAuthCallback を long-lived query 経由 (this.input.push) に統合した。CodeRabbit から複数回「OAuth callback を長寿命 prompt に流すのは危険」との指摘があったが、本 PR では設計トレードオフのため見送り判断とした。
設計トレードオフ
| 案 |
長所 |
短所 |
| long-lived (現状) |
OAuth state を turn 跨ぎで保持、再認証 avoid (PR-C の主目的) |
callback URL の code / state が会話 context に turn 跨ぎで残る、allowedTools 単一制約が prompt 依存 |
| ephemeral (CR 推奨) |
callback URL 完全分離、allowedTools 単一強制 |
subprocess 分離で OAuth state が引き継がれず、次 turn で再認証必要 |
検討項目
- SDK API の進化を待つ: Claude Agent SDK の MCP HTTP transport が subprocess 跨ぎで OAuth state を共有する API (例: token store の外部注入) を提供すれば、ephemeral 経路で OAuth state を保てるようになる
- 独自 token store: Tally 側で OAuth state を
.tally/oauth-state/<mcpServerId>.yaml 等に永続化し、ephemeral subprocess 起動時に MCP server 経由で inject する仕組みを自前実装
- turn 単位の動的 allowedTools: SDK に「同 query 内で allowedTools を turn ごとに切替」する API があれば、long-lived のまま callback turn だけ単一 tool に絞れる
関連
優先度
低 (現状の prompt 指示でモデルが従う前提で MVP は機能する)。複数 MCP server 同時運用や厳密な allowedTools 制約が必要になった時点で再検討。
背景
PR #22 (ChatRunner long-lived Query 化) で
runOAuthCallbackを long-lived query 経由 (this.input.push) に統合した。CodeRabbit から複数回「OAuth callback を長寿命 prompt に流すのは危険」との指摘があったが、本 PR では設計トレードオフのため見送り判断とした。設計トレードオフ
code/stateが会話 context に turn 跨ぎで残る、allowedTools単一制約が prompt 依存allowedTools単一強制検討項目
.tally/oauth-state/<mcpServerId>.yaml等に永続化し、ephemeral subprocess 起動時に MCP server 経由で inject する仕組みを自前実装関連
packages/ai-engine/src/chat-runner.tsのrunOAuthCallback優先度
低 (現状の prompt 指示でモデルが従う前提で MVP は機能する)。複数 MCP server 同時運用や厳密な allowedTools 制約が必要になった時点で再検討。