ACP は外部ハーネス用の経路であり、デフォルトの Codex 経路ではありません。 ネイティブの
Codex app-server Plugin は
/codex ... コントロールと、エージェントターン用のデフォルトの
openai/gpt-* 組み込みランタイムを所有します。一方、ACP は /acp ... コントロール
と sessions_spawn({ runtime: "acp" }) セッションを所有します。Codex または Claude Code を外部 MCP クライアントとして既存の
OpenClaw チャンネル会話に直接接続するには、ACP ではなく
openclaw mcp serve を使用します。どのページを選べばよいですか?
そのまま使えますか?
はい。公式 ACP ランタイム Plugin をインストールすると使用できます。pnpm install の後にローカルの
extensions/acpx ワークスペース Plugin を使用できます。準備状況を確認するには /acp doctor を実行します。
OpenClaw がエージェントに ACP 起動を案内するのは、ACP が実際に使用可能な場合のみです。
ACP が有効であること、ディスパッチが無効化されていないこと、現在のセッションが
サンドボックスによってブロックされていないこと、ランタイムバックエンドが読み込まれて正常であることが
必要です。いずれかの条件を満たさない場合、エージェントが利用できないバックエンドを提案しないよう、
ACP Skills と sessions_spawn ACP ガイダンスは非表示のままになります。
初回実行時の注意点
初回実行時の注意点
plugins.allowが設定されている場合、それは制限付き Plugin インベントリであり、acpxを必ず含める必要があります。含まれていない場合、インストール済み ACP バックエンドは意図的にブロックされます(/acp doctorは許可リストにエントリがないことを報告します)。- Codex ACP アダプターは
acpxPlugin に同梱され、可能な場合はローカルで起動します。 - Codex ACP は分離された
CODEX_HOMEで実行されます。OpenClaw は、信頼済みプロジェクトの信頼エントリと、安全なモデル/プロバイダーのルーティング設定(model、model_provider、model_reasoning_effort、sandbox_mode、および安全なmodel_providers.<name>フィールド)をホストの Codex 設定からコピーします。認証、通知、フックはホスト設定にのみ保持されます。 - その他の対象ハーネスアダプターは、初回使用時に
npxを使用してオンデマンドで取得される場合があります。 - そのハーネスのベンダー認証は、ホスト上にあらかじめ存在している必要があります。
- ホストで npm またはネットワークにアクセスできない場合、キャッシュを事前にウォームアップするか、別の方法でアダプターをインストールするまで、初回実行時のアダプター取得は失敗します。
ランタイムの前提条件
ランタイムの前提条件
ACP は実際の外部ハーネスプロセスを起動します。OpenClaw はルーティング、
バックグラウンドタスクの状態、配信、バインディング、ポリシーを所有し、ハーネスは
プロバイダーへのログイン、モデルカタログ、ファイルシステムの動作、ネイティブツールを所有します。OpenClaw に原因があると判断する前に、次を確認してください。
/acp doctorが、有効で正常なバックエンドを報告すること。- その許可リストが設定されている場合、対象 ID が
acp.allowedAgentsで許可されていること。 - Gateway ホスト上でハーネスコマンドを起動できること。
- そのハーネス用のプロバイダー認証が存在すること(
claude、codex、gemini、opencode、droidなど)。 - 選択したモデルがそのハーネスに存在すること。モデル ID はハーネス間で移植できません。
- 要求した
cwdが存在し、アクセス可能であること。またはcwdを省略し、バックエンドのデフォルトを使用すること。 - 権限モードが作業内容に合っていること。非対話型セッションではネイティブの権限プロンプトをクリックできないため、書き込みや実行を多用するコーディング処理では通常、ヘッドレスで処理を続行できる ACPX 権限プロファイルが必要です。
対応ハーネス対象
acpx バックエンドでは、次の ID を /acp spawn <id> または
sessions_spawn({ runtime: "acp", agentId: "<id>" }) の対象として使用します。
pi(pi-acp)も acpx バックエンドに登録されていますが、上記の他のものと
同じ意味でのコーディングハーネスではありません。
カスタム acpx エージェントエイリアスは acpx 自体で設定できますが、OpenClaw
ポリシーはディスパッチ前に、引き続き acp.allowedAgents と
agents.entries.*.runtime.acp.agent のマッピングを確認します。
運用者向け手順書
チャットからの簡単な/acp の流れ:
1
起動
/acp spawn claude --bind here、
/acp spawn gemini --mode persistent --thread auto、または明示的な
/acp spawn codex --bind here。2
作業
バインドされた会話またはスレッドで続行します(またはセッションキーを
明示的に指定します)。
3
状態を確認
/acp status4
調整
/acp model <provider/model>、/acp permissions <profile>、
/acp timeout <seconds>。5
方向修正
コンテキストを置き換えずに:
/acp steer tighten logging and continue。6
停止
/acp cancel(現在のターン)または /acp close(セッション+バインディング)。ライフサイクルの詳細
ライフサイクルの詳細
- 生成処理では、ACP ランタイムセッションを作成または再開し、OpenClaw セッションストアに ACP メタデータを記録します。また、実行が親によって所有されている場合は、バックグラウンドタスクを作成することがあります。
- 親所有の ACP セッションは、ランタイムセッションが永続的であってもバックグラウンド処理として扱われます。完了通知とサーフェス間の配信は、通常のユーザー向けチャットセッションのようには動作せず、親タスクの通知機構を通じて行われます。
- タスクのメンテナンスでは、終了済みまたは孤立した親所有のワンショット ACP セッションを閉じます。永続 ACP セッションは、有効な会話バインディングが残っている間は保持されます。有効なバインディングがない古い永続セッションは、所有タスクの完了後やタスクレコードの消失後に暗黙的に再開されないよう閉じられます。
- バインドされた後続メッセージは、バインディングが閉じられる、フォーカスが解除される、リセットされる、または期限切れになるまで、ACP セッションへ直接送られます。
- Gateway コマンドはローカルに留まります。
/acp ...、/status、/unfocusが、バインドされた ACP ハーネスへ通常のプロンプトテキストとして送信されることはありません。 cancelは、バックエンドがキャンセルをサポートしている場合にアクティブなターンを中止します。バインディングやセッションメタデータは削除しません。closeは、OpenClaw から見た ACP セッションを終了し、バインディングを削除します。ハーネスが再開をサポートしている場合、ハーネス側では独自のアップストリーム履歴を保持することがあります。- acpx Plugin は、
close後に OpenClaw 所有のラッパーおよびアダプタープロセスツリーをクリーンアップし、Gateway 起動時に古い OpenClaw 所有の ACPX 孤立プロセスを回収します。 - アイドル状態のランタイムワーカーは、組み込みのアイドル期間を過ぎるとクリーンアップ対象になります。保存されたセッションメタデータは、
/acp sessionsで引き続き利用できます。
ネイティブ Codex のルーティング規則
ネイティブ Codex のルーティング規則
有効な場合に ネイティブ Codex Plugin へルーティングされるべき
自然言語トリガー:
- 「この Discord チャンネルを Codex にバインドしてください。」
- 「このチャットを Codex スレッド
<id>に接続してください。」 - 「Codex スレッドを表示してから、これをバインドしてください。」
before_tool_call をブロックし、
after_tool_call を監視し、Codex の PermissionRequest イベントを OpenClaw の
承認経由でルーティングできます。Codex の Stop フックは
OpenClaw の before_agent_finalize に中継され、そこで Plugin は Codex が回答を
確定する前に、モデルをもう一度実行するよう要求できます。このリレーは意図的に
保守的な動作を維持します。Codex ネイティブツールの引数を変更したり、Codex
スレッドレコードを書き換えたりすることはありません。ACP ランタイム/セッション
モデルを使用したい場合にのみ、明示的な ACP を使用してください。組み込み Codex
のサポート境界については、
Codex ハーネス v1 サポート契約
を参照してください。モデル/プロバイダー/ランタイム選択早見表
モデル/プロバイダー/ランタイム選択早見表
- 従来の Codex モデル参照 - doctor によって修復される、従来の Codex OAuth/サブスクリプションモデル経路。
openai/*- OpenAI エージェントターン用のネイティブ Codex app-server 組み込みランタイム。/codex ...- ネイティブ Codex の会話制御。/acp ...またはruntime: "acp"- 明示的な ACP/acpx 制御。
ACP ルーティング用の自然言語トリガー
ACP ルーティング用の自然言語トリガー
ACP ランタイムへルーティングされるべきトリガー:
- 「これをワンショットの Claude Code ACP セッションとして実行し、結果を要約してください。」
- 「このタスクにはスレッド内で Gemini CLI を使用し、その後のやり取りも同じスレッドで続けてください。」
- 「バックグラウンドスレッドで ACP 経由の Codex を実行してください。」
runtime: "acp" を選択し、ハーネス agentId を解決し、
サポートされている場合は現在の会話またはスレッドにバインドして、閉じられるか
期限切れになるまで後続メッセージをそのセッションへルーティングします。Codex が
この経路を使用するのは、ACP/acpx が明示されている場合、または要求された操作で
ネイティブ Codex Plugin を利用できない場合のみです。sessions_spawn では、ACP が有効であり、リクエスト元がサンドボックス化されて
おらず、ACP ランタイムバックエンドが読み込まれている場合にのみ
runtime: "acp" が提示されます。acp.dispatch.enabled=false は ACP スレッドの自動
ディスパッチを一時停止しますが、明示的な sessions_spawn({ runtime: "acp" }) 呼び出しを非表示に
したりブロックしたりはしません。対象には codex、claude、
droid、gemini、opencode などの ACP ハーネス ID
を指定します。agents_list の通常の OpenClaw 設定エージェント ID は、その
エントリに agents.entries.*.runtime.type="acp" が明示的に設定されていない限り渡さないでください。
それ以外の場合は、デフォルトのサブエージェントランタイムを使用します。OpenClaw
エージェントに runtime.type="acp" が設定されている場合、OpenClaw は基盤となる
ハーネス ID として runtime.acp.agent を使用します。ACP とサブエージェントの比較
外部ハーネスランタイムを使用する場合は ACP を使用します。codex Plugin
が有効な場合、Codex の会話バインディング/制御には ネイティブ Codex
app-server を使用します。OpenClaw ネイティブの委任実行を使用する場合は、
サブエージェントを使用します。
サブエージェントも参照してください。
ACP が Claude Code を実行する仕組み
ACP 経由の Claude Code では、スタックは次のとおりです。- OpenClaw ACP セッション制御プレーン。
- 公式
@openclaw/acpxランタイム Plugin。 - Claude ACP アダプター。
- Claude 側のランタイム/セッション機構。
/acp spawn、バインド可能なセッション、ランタイム制御、または永続的なハーネス処理が必要ですか? ACP を使用します。- 生の CLI を通じた単純なローカルテキストフォールバックが必要ですか? CLI バックエンドを使用します。
バインドされたセッション
基本概念
- チャットサーフェス - ユーザーが会話を続ける場所(Discord チャンネル、Telegram トピック、iMessage チャット)。
- ACP セッション - OpenClaw がルーティングする、永続的な Codex/Claude/Gemini ランタイム状態。
- 子スレッド/トピック -
--thread ...によってのみ作成される、オプションの追加メッセージングサーフェス。 - ランタイムワークスペース - ハーネスが実行されるファイルシステム上の場所(
cwd、リポジトリのチェックアウト、バックエンドワークスペース)。チャットサーフェスとは独立しています。
現在の会話へのバインド
/acp spawn <harness> --bind here は、現在の会話を生成された ACP セッションに固定します。
子スレッドは作成されず、同じチャットサーフェスを使用します。OpenClaw は引き続き
トランスポート、認証、安全性、配信を管理します。その会話内の後続メッセージは
同じセッションへルーティングされます。/new と /reset は
セッションをその場でリセットし、/acp close はバインディングを削除します。
例:
バインディングの規則と排他性
バインディングの規則と排他性
--bind hereと--thread ...は同時に指定できません。--bind hereは、現在の会話へのバインディング対応を提示するチャンネルでのみ機能します。それ以外の場合、OpenClaw は未対応であることを示す明確なメッセージを返します。バインディングは Gateway の再起動後も保持されます。- Discord では、
spawnSessionsが制御するのは--thread auto|hereの子スレッド作成であり、--bind hereではありません。 --cwdを指定せずに別の ACP エージェントを生成すると、OpenClaw はデフォルトで 対象エージェントの ワークスペースを継承します。継承対象のパス(ENOENT/ENOTDIR)が存在しない場合はバックエンドのデフォルトにフォールバックします。それ以外のアクセスエラー(例:EACCES)は生成エラーとして提示されます。- Gateway 管理コマンドは、バインドされた会話内でもローカルに留まります。通常の後続テキストがバインドされた ACP セッションへルーティングされる場合でも、
/acp ...コマンドは OpenClaw が処理します。また、そのサーフェスでコマンド処理が有効な場合、/statusと/unfocusも常にローカルに留まります。
スレッドにバインドされたセッション
スレッドにバインドされたセッション
チャンネルアダプターでスレッドバインディングが有効な場合:
- OpenClaw はスレッドを対象 ACP セッションにバインドします。
- そのスレッド内の後続メッセージは、バインドされた ACP セッションへルーティングされます。
- ACP の出力は同じスレッドへ返されます。
- フォーカス解除、クローズ、アーカイブ、アイドルタイムアウト、または最大存続期間の満了により、バインディングが削除されます。
/acp close、/acp cancel、/acp status、/status、/unfocusは Gateway コマンドであり、ACP ハーネスへのプロンプトではありません。
acp.enabled=trueacp.dispatch.enabledはデフォルトで有効です(ACP スレッドの自動ディスパッチを一時停止するにはfalseを設定します。明示的なsessions_spawn({ runtime: "acp" })呼び出しは引き続き機能します)。- チャンネルアダプターによるスレッドセッション生成が有効(デフォルト:
true):- Discord/Telegram:
session.threadBindings.spawnSessions=true
- Discord/Telegram:
スレッド対応チャンネル
スレッド対応チャンネル
- セッション/スレッドバインディング機能を公開するすべてのチャンネルアダプター。
- 現在の組み込み対応:Discord のスレッド/チャンネル、Telegram のトピック(グループ/スーパーグループのフォーラムトピックおよび DM トピック)。
- Plugin チャンネルは、同じバインディングインターフェースを通じて対応を追加できます。
永続チャンネルバインディング
一時的ではないワークフローでは、トップレベルのbindings[] エントリに
永続 ACP バインディングを設定します。
バインディングモデル
"acp"
永続 ACP 会話バインディングであることを示します。
object
対象の会話を識別します。チャンネルごとの形式:
- Discord チャンネル/スレッド:
match.channel="discord"+match.peer.id="<channelOrThreadId>" - Slack チャンネル/DM:
match.channel="slack"+match.peer.id="<channelId|channel:<channelId>|#<channelId>|userId|user:<userId>|slack:<userId>|<@userId>>"。安定した Slack ID を優先してください。チャンネルバインディングは、そのチャンネルのスレッド内の返信にも一致します。 - Telegram フォーラムトピック:
match.channel="telegram"+match.peer.id="<chatId>:topic:<topicId>" - WhatsApp DM/グループ:
match.channel="whatsapp"+match.peer.id="<E.164|group JID>"。ダイレクトチャットには+15555550123のような E.164 番号を、グループには120363424282127706@g.usのような WhatsApp グループ JID を使用します。 - iMessage DM/グループ:
match.channel="imessage"+match.peer.id="<handle|chat_id:*|chat_guid:*|chat_identifier:*>"。安定したグループバインディングにはchat_id:*を優先してください。
string
所有する OpenClaw エージェント ID。
"persistent" | "oneshot"
オプションの ACP オーバーライド。
string
オプションのオペレーター向けラベル。
string
オプションのランタイム作業ディレクトリ。
string
オプションのバックエンドオーバーライド。
エージェントごとのランタイムデフォルト
agents.entries.*.runtime を使用して、エージェントごとに ACP デフォルトを一度定義します。
agents.entries.*.runtime.type="acp"agents.entries.*.runtime.acp.agent(ハーネス ID。例:codexまたはclaude)agents.entries.*.runtime.acp.backendagents.entries.*.runtime.acp.modeagents.entries.*.runtime.acp.cwd
bindings[].acp.*agents.entries.*.runtime.acp.*- グローバル ACP デフォルト(例:
acp.backend)
例
動作
- OpenClaw は、チャンネル固有の受け入れ判定後かつ使用前に、設定された ACP セッションが存在することを保証します。
- そのチャンネル、トピック、またはチャット内のメッセージは、設定された ACP セッションにルーティングされます。
- 設定された ACP バインディングは、そのセッションルートを所有します。チャンネルのブロードキャストファンアウトは、一致したバインディングに設定された ACP セッションを置き換えません。
- バインド済みの会話では、
/newと/resetは、同じ ACP セッションキーをその場でリセットします。 - 一時的なランタイムバインディング(たとえば、スレッドフォーカスフローによって作成されたもの)は、存在する場合には引き続き適用されます。
- 明示的な
cwdを指定しないエージェント間 ACP スポーンでは、OpenClaw はエージェント設定から対象エージェントのワークスペースを継承します。 - 継承されたワークスペースパスが存在しない場合は、バックエンドのデフォルト cwd にフォールバックします。存在するパスへのアクセス失敗は、スポーンエラーとして表示されます。
ACP セッションを開始する
ACP セッションを開始する方法は 2 つあります。- sessions_spawn から
- /acp コマンドから
エージェントターンまたはツール呼び出しから ACP セッションを開始するには、
runtime: "acp" を使用します。runtime のデフォルトは subagent なので、ACP セッションでは
runtime: "acp" を明示的に設定してください。agentId を省略すると、
設定されている場合は OpenClaw が acp.defaultAgent を使用します。
mode: "session" で永続的なバインド済み会話を維持するには、
thread: true が必要です。sessions_spawn のパラメーター
string
必須
ACP セッションに送信される最初のプロンプト。
"acp"
必須
ACP セッションでは
"acp" である必要があります。string
ACP 対象ハーネス ID。
acp.defaultAgent が設定されている場合は、これにフォールバックします。boolean
デフォルト:"false"
サポートされている場合にスレッドバインディングフローを要求します。
"run" | "session"
デフォルト:"run"
"run" はワンショット、"session" は永続的です。thread: true で
mode が省略された場合、OpenClaw はランタイムパスに応じて
デフォルトで永続的な動作を使用することがあります。mode: "session" には
thread: true が必要です。string
要求するランタイム作業ディレクトリ(バックエンド/ランタイムポリシーによって検証されます)。
省略した場合、ACP スポーンは、設定されていれば対象エージェントのワークスペースを継承します。
継承されたパスが存在しない場合はバックエンドのデフォルトにフォールバックし、
実際のアクセスエラーは返されます。
string
セッション/バナーテキストで使用されるオペレーター向けラベル。
string
新しい ACP セッションを作成する代わりに、既存のセッションを再開します。エージェントは
session/load を介して会話履歴を再生します。
runtime: "acp" が必要です。"parent"
"parent" は、最初の ACP 実行の進捗概要をシステムイベントとして要求元
セッションにストリーミングします。OpenClaw は完全なリレー履歴を子エージェントの
SQLite 状態に記録し、子セッションとともに削除します。streaming.progress.commentary=false でない限り、
親の進捗ストリームにはデフォルトでアシスタントのコメントと ACP ステータス進捗が表示されます。
ストリームモードが設定されていない場合、Discord もデフォルトで親プレビューに
進捗モードを使用します。ステータス進捗では引き続き acp.stream.tagVisibility が適用されるため、
plan のようなタグは明示的に有効にしない限り非表示のままです。sessions_spawn の実行では、デフォルトの子ターン上限として
agents.defaults.subagents.runTimeoutSeconds を使用します。このツールは呼び出しごとの
タイムアウトオーバーライドを受け付けません(runTimeoutSeconds/timeoutSeconds は、
デフォルトを設定するよう求めるエラーで拒否されます)。
string
ACP 子セッションの明示的なモデルオーバーライド。Codex ACP スポーンでは、
openai/gpt-5.4 のような OpenAI 参照を、session/new の前に
Codex ACP 起動設定へ正規化します。openai/gpt-5.4/high のようなスラッシュ形式では、
Codex ACP の推論強度も設定されます。省略した場合、sessions_spawn({ runtime: "acp" }) は、
設定されていれば既存のサブエージェントモデルデフォルト(agents.defaults.subagents.model または
agents.entries.*.subagents.model)を使用します。それ以外の場合は、ACP ハーネス独自の
デフォルトモデルを使用させます。その他のハーネスは ACP models を通知し、
session/set_model をサポートする必要があります。そうでなければ、OpenClaw/acpx は
対象エージェントのデフォルトへ暗黙的にフォールバックせず、明確に失敗します。string
明示的な思考/推論強度。Codex ACP では、
minimal は低い強度にマッピングされ、
low/medium/high/xhigh はそのままマッピングされ、
off では推論強度の起動オーバーライドが省略されます。省略した場合、
ACP スポーンは既存のサブエージェントの思考デフォルトと、選択されたモデルの
モデルごとの agents.defaults.models["provider/model"].params.thinking を使用します。スポーンのバインドモードとスレッドモード
- --bind here|off
- --thread auto|here|off
注意:
--bind hereは、「このチャンネルまたはチャットを Codex バックエンドにする」ための最も簡単なオペレーターパスです。--bind hereは子スレッドを作成しません。--bind hereは、現在の会話へのバインディングをサポートするチャンネルでのみ使用できます。--bindと--threadは、同じ/acp spawn呼び出しで併用できません。
配信モデル
ACP セッションは、対話型ワークスペースまたは親が所有するバックグラウンド作業の いずれかです。配信経路はその形態によって異なります。対話型 ACP セッション
対話型 ACP セッション
対話型セッションは、表示されているチャットサーフェス上で会話を継続することを目的としています。
/acp spawn ... --bind hereは、現在の会話を ACP セッションにバインドします。/acp spawn ... --thread ...は、チャンネルのスレッド/トピックを ACP セッションにバインドします。- 永続的に設定された
bindings[].type="acp"は、一致する会話を同じ ACP セッションにルーティングします。
- 通常の制限付きフォローアップはプロンプトテキストとして送信され、ハーネス/バックエンドが対応している場合にのみ添付ファイルも送信されます。
/acp管理コマンドとローカル Gateway コマンドは、ACP ディスパッチの前にインターセプトされます。- ランタイムが生成する完了イベントは、ターゲットごとに具体化されます。OpenClaw エージェントは OpenClaw の内部ランタイムコンテキストエンベロープを受け取り、外部 ACP ハーネスは子の結果と指示を含むプレーンなプロンプトを受け取ります。生の
<<<BEGIN_OPENCLAW_INTERNAL_CONTEXT>>>エンベロープを外部ハーネスに送信したり、ACP ユーザートランスクリプトのテキストとして永続化したりしてはなりません。 - ACP トランスクリプトのエントリには、ユーザーに表示されるトリガーテキストまたはプレーンな完了プロンプトが使用されます。内部イベントメタデータは可能な限り OpenClaw 内で構造化されたまま維持され、ユーザーが作成したチャットコンテンツとして扱われません。
親が所有するワンショット ACP セッション
親が所有するワンショット ACP セッション
別のエージェント実行によって生成されたワンショット ACP セッションは、
サブエージェントと同様のバックグラウンドの子です。
- 親は
sessions_spawn({ runtime: "acp", mode: "run" })を使用して作業を依頼します。 - 子は独自の ACP ハーネスセッションで実行されます。
- 子のターンはネイティブのサブエージェント生成と同じバックグラウンドレーンで実行されるため、低速な ACP ハーネスが無関係なメインセッションの作業をブロックすることはありません。
- 完了はタスク完了通知パスを通じて親に報告されます。OpenClaw は内部完了メタデータをプレーンな ACP プロンプトに変換してから外部ハーネスへ送信するため、ハーネスに OpenClaw 専用のランタイムコンテキストマーカーが表示されることはありません。
- ユーザー向けの応答が有用な場合、親は子の結果を通常のアシスタントの口調で書き直します。
sessions_send と A2A 配信
sessions_send と A2A 配信
sessions_send は生成後に別のセッションをターゲットにできます。通常のピア
セッションでは、OpenClaw はメッセージを注入した後に
エージェント間(A2A)フォローアップパスを使用します。- ターゲットセッションからの応答を待ちます。
- 必要に応じて、依頼元とターゲットの間で制限された回数のフォローアップターンをやり取りさせます。
- ターゲットに通知メッセージの生成を依頼します。
- その通知を表示中のチャネルまたはスレッドに配信します。
tools.sessions.visibility
設定の下で、無関係なセッションが ACP ターゲットを参照して
メッセージを送信できる場合にも有効なままです。OpenClaw が A2A フォローアップをスキップするのは、依頼元が
自身の親所有ワンショット ACP 子の親である場合のみです。この場合、
タスク完了に加えて A2A を実行すると、子の結果で親を起動し、
親の応答を子へ送り返して、親子間のエコーループを
作成する可能性があります。完了パスがすでに結果を処理するため、
この所有された子の場合、sessions_send の結果は
delivery.status="skipped" を報告します。既存セッションの再開
既存セッションの再開
新規に開始する代わりに、一般的なユースケース:
resumeSessionId を使用して以前の ACP セッションを
続行します。エージェントは session/load を介して会話履歴を再生するため、
以前の完全なコンテキストを引き継いで再開します。- Codex セッションをノートパソコンからスマートフォンへ引き継ぎ、エージェントに中断したところから再開するよう指示します。
- CLI で対話的に開始したコーディングセッションを、今度はエージェントを通じてヘッドレスで続行します。
- Gateway の再起動またはアイドルタイムアウトによって中断された作業を再開します。
resumeSessionIdはruntime: "acp"の場合にのみ適用されます。デフォルトのサブエージェントランタイムは、この ACP 専用フィールドを無視します。streamToはruntime: "acp"の場合にのみ適用されます。デフォルトのサブエージェントランタイムは、この ACP 専用フィールドを無視します。resumeSessionIdはホストローカルの ACP/ハーネス再開 ID であり、OpenClaw チャネルセッションキーではありません。OpenClaw はディスパッチ前に ACP 生成ポリシーとターゲットエージェントポリシーを引き続き確認しますが、その上流 ID を読み込むための認可は ACP バックエンドまたはハーネスが所有します。resumeSessionIdは上流 ACP の会話履歴を復元します。threadとmodeは新しく作成する OpenClaw セッションにも通常どおり適用されるため、mode: "session"には引き続きthread: trueが必要です。- ターゲットエージェントは
session/loadをサポートしている必要があります(Codex と Claude Code はサポートしています)。 - セッション ID が見つからない場合、生成は明確なエラーで失敗します。新しいセッションへの暗黙的なフォールバックはありません。
デプロイ後のスモークテスト
デプロイ後のスモークテスト
Gateway のデプロイ後は、単体テストを信頼するだけでなく、
ライブのエンドツーエンドチェックを実行します。
- ターゲットホストにデプロイされた Gateway のバージョンとコミットを確認します。
- 稼働中のエージェントへの一時的な ACPX ブリッジセッションを開きます。
- そのエージェントに、
runtime: "acp"、agentId: "codex"、mode: "run"、およびタスクReply with exactly LIVE-ACP-SPAWN-OKを指定してsessions_spawnを呼び出すよう依頼します。 accepted=yes、実際のchildSessionKey、およびバリデーターエラーがないことを確認します。- 一時的なブリッジセッションをクリーンアップします。
mode: "run" に維持し、streamTo: "parent" はスキップします。
スレッドにバインドされた mode: "session" とストリームリレーパスは、
より高度な別個の統合パスです。サンドボックスの互換性
ACP セッションは現在、OpenClaw サンドボックス内ではなく、 ホストランタイム上で実行されます。 現在の制限事項:- 依頼元セッションがサンドボックス化されている場合、
sessions_spawn({ runtime: "acp" })と/acp spawnの両方で ACP の生成がブロックされます。 runtime: "acp"を指定したsessions_spawnはsandbox: "require"をサポートしていません。
セッションターゲットの解決
ほとんどの/acp アクションは、任意のセッションターゲット(session-key、
session-id、または session-label)を受け入れます。
解決順序:
- 明示的なターゲット引数(または
/acp steerの--session)- 最初にキーを試行
- 次に UUID 形式のセッション ID
- 次にラベル
- 現在のスレッドバインディング(この会話/スレッドが ACP セッションにバインドされている場合)。
- 現在の依頼元セッションへのフォールバック。
Unable to resolve session target: ...)を返します。
ACP コントロール
ランタイムコントロール(
spawn、cancel、steer、close、status、set-mode、
set、cwd、permissions、timeout、model、および reset-options)には、
外部チャネルからの所有者 ID と、内部 Gateway クライアントからの
operator.admin が必要です。認可された所有者以外の送信者も、sessions、
doctor、install、および help は引き続き使用できます。所有者以外の送信者の場合、/acp sessions
は現在バインドされているセッションまたは依頼元セッションのみを一覧表示します。所有者 ID と
operator.admin クライアントは、最近のすべてのセッションを参照できます。
/acp status は、有効なランタイムオプションに加えて、ランタイムレベルおよび
バックエンドレベルのセッション識別子を表示します。バックエンドに機能がない場合、
サポートされていないコントロールのエラーが明確に表示されます。ターゲットトークン
(session-key、session-id、または session-label)を受け入れるコマンドは、エージェントごとのカスタム session.store ルートを含む、
Gateway のセッション検出を通じてそれらを解決します。/acp sessions は
ターゲットトークンを受け入れません。
ランタイムオプションのマッピング
/acp には便利なコマンドと汎用セッターがあります。同等の操作:
acpx ハーネス、Plugin のセットアップ、権限
acpx ハーネスの設定(Claude Code / Codex / Gemini CLI のエイリアス)、 plugin-tools および OpenClaw-tools MCP ブリッジ、ACP 権限モードについては、 ACP エージェントのセットアップを参照してください。トラブルシューティング
Command blocked by PreToolUse hook: Native hook relay unavailable は、
ACP/acpx ではなくネイティブ Codex フックリレーに属します。バインドされた Codex チャットでは、
/new または /reset で新しいセッションを開始してください。一度は機能しても、
次のネイティブツール呼び出しで再び発生する場合は、/new を繰り返すのではなく、
Codex app-server または OpenClaw Gateway を再起動してください。
Codex ハーネスのトラブルシューティングを参照してください。