外部エージェント(ACP)
Chimera は、自分で書いていないエージェント — Claude Code、Gemini CLI、あるいは Agent Client Protocol を話すあらゆるアダプタ — にコーディングの1ターン を渡せます。トランスクリプト、検証器、スナップショット、取り消しは Chimera のまま。作業だけが他人のもの です。
なぜ
Chimera の主張は「自分のループだけが良いループだ」ではありませんでした。主張はループの周りにある 統治です。汚染台帳、書き込み領域、ターン前のコピー、ターン後の判定、実際に何が起きたかを語るレシート。 これらはどの実行者にも当てはまります。すでに信頼している実行者を動かすことを拒むのは、製品のうち最も 面白くない半分に固執することです。
保証されること、されないこと
この節はセットアップより先に読んでください。この機能があなたに向いているかを決めるのはここです。
ACP エージェントは、クライアントのどの能力を使うかを宣言します。Chimera は fs/read_text_file と
fs/write_text_file を提供します。提供は強制ではありません。 動かす価値のあるエージェントは自前の
ファイル・シェルツールを持っています。Claude Code は Claude Agent SDK を通じて書き込み、こちらに先に
尋ねる義務はありません。
具体的には:
| Chimera 自身のループ | 外部エージェント | |
|---|---|---|
| 書き込み領域が領域外の書き込みを拒否 | 常に | こちらを経由する呼び出しのみ |
| シェルは設定したサンドボックスで動く | 常に | エージェントが自分のやり方で実行 |
| 汚染台帳が危険ツールのゲートを起動 | 常に | こちらが仲介するツールのみ |
| ターン前にワークスペースのスナップショット | はい | はい |
| ターン全体をワンクリックで取り消し | はい | はい |
| 与えた許可はすべてレシートに残る | — | はい |
最後の3行が本当の保証であり、外部エージェントを選んだときにコード画面の姿勢の行が約束する内容です。
その行は「/project の中を編集し、コマンドは実行しない」と言うのをやめます — その文は Chimera が所有
するツールの説明だからです — 代わりに、先にコピーを取ったこと、そしてターンを取り消せることを述べます。
強いほうの文を残す画面は、そのターンが果たせない約束をしていることになります。
Chimera は ACP のターミナル能力も辞退します。こちらがホストするターミナルは、サンドボックスの規則を 何一つ持たない第二の実行経路になってしまいます。
セットアップ
Chimera が知っているエージェントに設定は不要です:
npm i -g @agentclientprotocol/claude-agent-acp # Claude Code、Node 22+ が必要
npm i -g @google/gemini-cli # Gemini CLI(ACP モードは上流で実験的扱い)
そのうえで、このマシンが実際に何を実行できるか確認します:
chimera doctor
external_agents が各エージェントを available: true/false で報告し、false のときは解決するための行も
示します。可用性は sidecar が動いているマシン上で判定されます — パッケージ版デスクトップなら、CI が
組み立てて誰も見ていないマシンです。つまり「あるはずだ」は証拠になりません。
デスクトップアプリは入力欄の上に 実行するのは の行を表示し、doctor が見つけたものを並べます。実行
可能なものが一つも入っていなければ、この行はそもそも現れません。「まだ持っていない、入れ方はこう」は
doctor の役目です。
資格情報
Chimera が起動する子プロセスの環境からは API_KEY / TOKEN / SECRET を含む変数が取り除かれます。
シェルコマンドがプロバイダのキーを出力できないようにするためです。ACP エージェントは仕事全体にキーを
必要とするプログラムなので、各エージェントが必要な変数を名前で宣言し、その分だけが戻されます:
- Claude Code:
ANTHROPIC_API_KEY、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_BASE_URL、CLAUDE_CONFIG_DIR - Gemini CLI:
GEMINI_API_KEY、GOOGLE_API_KEY、GOOGLE_APPLICATION_CREDENTIALS
環境をまるごと渡すほうが楽ですが、それは将来のあらゆるアダプタにマシン上のあらゆるキーを手渡すことに なります。
自前のアダプタ
Codex などは、このプロジェクトが実行していないサードパーティ製アダプタ経由で ACP に届きます。未検証の コマンドを並べる — それは「確認していない」を「対応済み」に変えてしまいます — のではなく、お手元の ものを Chimera に指してください:
// POST /api/code/turn
{
"message": "失敗しているテストを直して",
"provider": "custom",
"provider_command": "npx -y some-acp-adapter --flag"
}
コマンドはシェル風に分割されますが、シェルを通さず実行されます。はぐれたパイプは第二のコマンドでは
なく単なる引数になります。Windows では、cmd.exe の構文(& | < > ^ %)を含む引数が .cmd ランチャーに
届く場合、エスケープではなく拒否します。引用符の規則はランチャーごとに違い、推測を誤れば、マシン上の
プログラムではなくマシンそのものを実行してしまうからです。
しくみ
- 子プロセスは会話ごとに1つで、ターンごとではありません。
session/promptはエージェントが保持する 文脈の中の1メッセージです。毎回新しいプロセスにすると、どのターンも1ターン目になってしまいます。 - 同時に生きているのは最大4つ。1時間触られなかったものは閉じます。それぞれがモデルへの接続を握った プロセスです。
- プロセスは自分のグループで起動し、ツリーごと終了させます — コーディングエージェントはランチャーで、
こちらが握っているプロセスだけを終了させると、実際に働いているワーカーが残り、フォルダが掴まれた
ままになります。ターンの途中でアプリを終了した場合は
atexitの回収が受け持ちます。 - エージェントの
session/update通知は、ネイティブのループが出すのと同じイベントに翻訳されます。 画面に2つ目の実装は要りません。思考の断片は回答に混ぜず捨てます。diffブロックは、トランスクリプト がすでに描画している統合パッチになります。 - ネイティブのループが持っていて、こちらが報告できない数値 —
steps、context_peak_tokens— は0ではなくnullで届きます。0 は「何もしなかった」と読まれてしまいます。
限界
- 許可の要求には
allow_onceで答え、レシートに記録します。エージェントが尋ねる義務のなかった要求を 堰き止めるのは演出です。誠実なやり方は、許可し、記録し、スナップショットに頼ること — それは一度も 尋ねてこなかった書き込みまで覆います。 - 融合、ロール、記憶、リポジトリマップは Chimera 自身のループのものです。外部ターンは
fused: falseを 返し、記憶の利用も0です。どれも起きていないからです。 - Gemini の ACP モードは上流で実験的と明示されており、リリース間で挙動が変わることがあります。