Dokumentasi · 03

Agen dan izin tetap.

Agen di CommandAGI memiliki kendali waktu nyata atas mesin sungguhan. Wewenang berasal dari satu tempat — izin tetap yang dibuat seseorang — dan setiap tindakan tercatat sebelum terjadi.

Tanpa manusia dalam loop — sesuai rancangan

CommandAGI dibuat untuk mesin yang berjalan tanpa diawasi. Agen yang memegang izin mengaktifkan unit, menjalankan program dan mengirim perintah secara waktu nyata, melalui meja kerja, API atau MCP, tanpa konfirmasi untuk setiap tindakan. Yang menjaga keamanan bukan seseorang yang mengawasi; melainkan izin, batas driver, dan rekaman.

Prinsipal

Semua yang bertindak adalah prinsipal: agent:<name> atau person:<name>. Prinsipal membuktikan siapa dirinya dengan kredensial — ia tidak pernah hanya menyebut dirinya sendiri. Permintaan yang hanya menyatakan siapa dirinya ditolak.

  • Kredensial host — cagp_…, diterbitkan sekali oleh commandagi grant token --principal agent:<name> (atau saat izin ditambahkan). Host hanya menyimpan SHA-256-nya. grant token memutar ulang kredensial, dan grant forget menghapusnya.
  • Kredensial akun — cagc.<payload>.<signature>, ditandatangani dengan kunci akun Anda (Ed25519) untuk agen yang berjalan di cloud. Kredensial ini menyebut prinsipal, akun, waktu kedaluwarsa, dan opsional satu host. Kredensial ini hanya diterima untuk izin yang dibuat oleh akun itu. Cabut dengan grant revoke-credential.

Izin tetap

Izin tetap adalah wewenang yang diberikan akun kepada satu prinsipal, dibuat oleh tindakan eksplisit seseorang. Tidak ada tool atau rute agen yang membuat atau memperluas izin. Kunci API agen ditolak pada setiap rute yang mengubah wewenang.

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

Sebuah izin menyebut sebuah dunia dan, secara opsional, unit, saluran dan verba. Jika ada yang dilewati, berarti semuanya. Izin dapat kedaluwarsa (--for 8h, --expires <waktu ISO>). Izin disimpan di ~/.commandagi/grants.json, dibaca pada setiap tindakan, dan juga dapat dibuat di meja kerja, di pengaturan → izin. Berkas izin yang rusak tidak memberlakukan izin apa pun.

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" } ] }

Perintah yang sama membuat tiga jenis izin lain: --file PREFIX… (menulis berkas di bawah path), --outreach APP… --per-day N (mengirim pesan melalui aplikasi yang terhubung) dan --market VENUE… --symbol S --max-qty N --max-notional N --per-day N (menempatkan pesanan).

Izin berlaku untuk dunia fisik. Dunia simulasi tidak memerlukan izin.

Verba, pengaktifan dan pengamanan

Sebuah izin dapat memberi empat verba: open saluran, arm unit, run program, dan send perintah.

  • Driver yang menggerakkan perangkat keras terbuka dalam keadaan nonaktif. Prinsipal mana pun yang memiliki izin atas unit dapat mengaktifkannya. Sesi aktif yang menganggur selama lima menit menonaktifkan dirinya sendiri.
  • Driver yang hanya menerima masukan — shell, kernel Python, penyerahan pekerjaan — tidak memerlukan pengaktifan. Izin diperiksa pada setiap masukan.
  • Pengamanan selalu diizinkan. stop, disarm dan close — dan perintah pengamanan seperti feed hold, pause, emergency stop dan torque off — diizinkan bagi siapa pun yang memegang izin yang belum kedaluwarsa atas unit, bagi siapa pun yang membuka sesi, dan bagi person akun itu sendiri. Membatalkan pesanan yang menunggu juga merupakan pengamanan.

Aturan yang diikuti setiap tindakan

  • Dicatat sebelum dikirim. Sebelum driver dipanggil, sebuah catatan — prinsipal dan tindakannya — ditambahkan ke aliran eksekusi dan di-flush. Proyek hanya-baca menolak tindakan daripada bertindak tanpa rekaman.
  • Pengakuan bukan keadaan. Balasan atau ok tidak pernah berarti keadaan yang diperintahkan telah tercapai. Perintah tetap menunggu sampai mesin melaporkan suatu keadaan.
  • Yang tidak diketahui tetap tidak diketahui. Tautan yang terputus dicatat sebagai state: unknown. Aliran yang berakhir tanpa rekaman akhir terbaca terputus: keadaan tidak diketahui.
  • Tidak ada percobaan ulang diam-diam. Perintah fisik tidak pernah diulang oleh sistem. Agen dapat memutuskan untuk mencoba lagi; keputusan itu dicatat sebagai perintahnya sendiri.
  • Batas adalah tugas driver. Batas, interval dan verba yang diizinkan yang dinyatakan ditegakkan oleh driver, bukan oleh seseorang. Aliran masukan diatur iramanya: satu tindakan dalam satu waktu, dengan jarak minimal 30 ms.
  • Simulasi dan fisik tidak pernah bercampur. Sebuah eksekusi milik satu dunia, dan sumber rekamannya harus sesuai dengan jenis dunia.

Percakapan dan agennya

Memulai percakapan di dunia fisik memberi agen percakapan (threads.agent, secara default agent:mcp) setiap verba atas unit dunia itu, untuk paling lama 24 jam, dan mencabutnya saat percakapan ditutup. Matikan dengan pengaturan "threads.agentControl": false.

Berikutnya

Hubungkan agen ke semua ini melalui MCP: SDK dan MCP.