ドキュメント · 03

エージェントと 常設の権限付与.

CommandAGI のエージェントは、実際の機械をリアルタイムで制御できます。権限は一つの場所から生まれます。人が行った常設の権限付与です。そして、すべての操作は実行の前に記録されます。

人の確認は入りません(設計による)

CommandAGI は、無人で動く機械のために作られています。権限付与を持つエージェントは、ユニットをアームし、プログラムを実行し、コマンドをリアルタイムで送ります。ワークベンチ、API、MCP のどれを通しても、操作ごとの確認は必要ありません。安全を守るのは人の監視ではありません。付与、ドライバーの上限、そして記録です。

プリンシパル

操作するものはすべて プリンシパル です。形式は agent:<name> または person:<name> です。プリンシパルは認証情報で自分が誰かを証明します。名前を名乗るだけでは認められません。自分が誰かを 言う だけのリクエストは拒否されます。

  • ホストの認証情報 — cagp_…。commandagi grant token --principal agent:<name> で一度発行されます(または、権限付与を追加するときに発行されます)。ホストが保存するのは SHA-256 だけです。grant token で更新し、grant forget で削除します。
  • アカウントの認証情報 — cagc.<payload>.<signature>。クラウドで動くエージェント用に、アカウントの鍵(Ed25519)で署名されます。プリンシパル、アカウント、有効期限、必要に応じて一つのホストを示します。この認証情報は、そのアカウントが行った付与に対してだけ有効です。grant revoke-credential で取り消します。

常設の権限付与

常設の権限付与 は、アカウントが一つのプリンシパルに与える権限です。人の明示的な操作で行われます。ツールもエージェントのルートも、付与を作ったり広げたりはしません。エージェントの API キーは、権限を変えるすべてのルートで拒否されます。

shell
commandagi grant add --principal agent:night-shift \
  --world shop --unit mill-1 --channel gcode \
  --verb open --verb arm --verb run --verb send \
  --for 8h --note "night shift"
commandagi grant list
commandagi grant revoke g-3f9a1c20b7de

付与は、ワールドと、必要に応じてユニット、チャンネル、動詞を指定します。省略すると、すべてが対象になります。期限を付けられます(--for 8h、--expires <ISO 時刻>)。付与は ~/.commandagi/grants.json に保存され、操作のたびに読み込まれます。ワークベンチの 設定 → 付与 からも作れます。付与ファイルが壊れている場合、どの付与も有効になりません。

json
{ "grants": [ { "id": "g-3f9a1c20b7de", "principal": "agent:night-shift",
  "grantedBy": "acct:user:u_8f2k", "world": "shop", "units": ["mill-1"],
  "channels": ["gcode"], "verbs": ["open", "arm", "run", "send"],
  "expires": "2026-10-01T06:00:00Z", "note": "night shift" } ] }

同じコマンドで、ほかに三種類の付与を作れます。--file PREFIX…(パスの下にファイルを書く)、--outreach APP… --per-day N(接続されたアプリでメッセージを送る)、--market VENUE… --symbol S --max-qty N --max-notional N --per-day N(注文を出す)です。

付与は 物理 ワールドに適用されます。シミュレーションのワールドには付与が要りません。

動詞、アームと安全化

付与で与えられる動詞は四つです。チャンネルを open する、ユニットを arm する、プログラムを run する、コマンドを send する、です。

  • ハードウェアを動かすドライバーは アームなし で開きます。ユニットに付与を持つプリンシパルなら、だれでもアームできます。五分間アイドルのままのアーム済みセッションは、自動でアームを解除します。
  • 入力だけを受け取るドライバー(シェル、Python カーネル、ジョブの引き渡し)は、アームが要りません。付与は入力のたびに確認されます。
  • 安全化は常に許可されます。 stop、disarm、close、そして送り保持、一時停止、非常停止、トルクオフなどの安全化コマンドは、そのユニットに期限内の付与を持つ全員、セッションを開いた人、アカウントの本人に許可されます。注文の取り消しも安全化です。

すべての操作が従うルール

  • 送信の前に記録されます。 ドライバーを呼ぶ前に、プリンシパルと操作の記録が実行のストリームに追記され、書き出されます。読み取り専用のプロジェクトは、記録なしに操作することを拒否します。
  • 確認応答は状態ではありません。 返信や ok は、指令した状態に達したことを意味しません。機械が状態を報告するまで、コマンドは保留のままです。
  • 不明は不明のまま残します。 通信が切れた場合は state: unknown と記録されます。終了の記録がないまま終わったストリームは 中断: 状態は不明 と表示されます。
  • 黙って再試行しません。 物理コマンドをシステムが再試行することはありません。エージェントは再試行を決められます。その決定は、それ自体が記録されるコマンドになります。
  • 上限はドライバーの仕事です。 宣言された上限、間隔、許可された動詞は、人ではなくドライバーが守ります。入力ストリームは間隔を置いて送られます。一度に一つの操作を、少なくとも 30 ミリ秒の間隔で行います。
  • シミュレーションと物理は混ざりません。 実行は一つのワールドに属し、その記録のソースはワールドの種類と一致しなければなりません。

会話とそのエージェント

物理ワールドで会話を始めると、その会話のエージェント(既定では threads.agent、agent:mcp)に、そのワールドのユニットに対するすべての動詞が、最長 24 時間付与されます。会話を閉じると、その付与は取り消されます。この動作は設定 "threads.agentControl": false で止められます。

次へ

MCP を通じてエージェントをこれらすべてに接続します。SDK と MCP を読んでください。