Permissions
Mengontrol tindakan mana yang memerlukan persetujuan untuk dijalankan.
Dropstone menggunakan konfigurasi permission untuk memutuskan apakah suatu tindakan harus dijalankan secara otomatis, meminta konfirmasi, atau diblokir.
Konfigurasi tools boolean lama sudah tidak digunakan lagi; telah digabungkan ke dalam permission. Konfigurasi tools lama masih didukung untuk kompatibilitas mundur.
Tindakan
Setiap aturan izin menghasilkan salah satu dari:
"allow": jalankan tanpa persetujuan"ask": minta persetujuan"deny": blokir tindakan
Konfigurasi
Anda dapat mengatur izin secara global (dengan *), dan menimpa alat tertentu.
{
"$schema": "https://dropstone.io/schema/config.json",
"permission": {
"*": "ask",
"bash": "allow",
"edit": "deny"
}
}
Anda juga dapat mengatur semua izin sekaligus:
{
"$schema": "https://dropstone.io/schema/config.json",
"permission": "allow"
}
Aturan Granular (Sintaks Objek)
Untuk sebagian besar izin, Anda dapat menggunakan objek untuk menerapkan tindakan yang berbeda berdasarkan input alat.
{
"$schema": "https://dropstone.io/schema/config.json",
"permission": {
"bash": {
"*": "ask",
"git *": "allow",
"npm *": "allow",
"rm *": "deny",
"grep *": "allow"
},
"edit": {
"*": "deny",
"packages/web/src/content/docs/*.mdx": "allow"
}
}
}
Aturan dievaluasi dengan pencocokan pola, dengan aturan yang cocok terakhir yang menang. Pola umum adalah menempatkan aturan catch-all "*" terlebih dahulu, dan aturan yang lebih spesifik setelahnya.
Wildcard
Pola izin menggunakan pencocokan wildcard sederhana:
*cocok dengan nol atau lebih karakter apa pun?cocok dengan tepat satu karakter- Semua karakter lain cocok secara literal
Ekspansi Direktori Rumah
Anda dapat menggunakan ~ atau $HOME di awal pola untuk merujuk ke direktori rumah Anda. Ini sangat berguna untuk aturan external_directory.
~/projects/*->/Users/username/projects/*$HOME/projects/*->/Users/username/projects/*~->/Users/username
Direktori Eksternal
Gunakan external_directory untuk mengizinkan panggilan alat yang menyentuh jalur di luar direktori kerja tempat Dropstone dijalankan. Ini berlaku untuk alat apa pun yang menerima jalur sebagai input (misalnya read, edit, glob, grep, dan banyak perintah bash).
Ekspansi rumah (seperti ~/...) hanya memengaruhi cara penulisan pola. Ini tidak menjadikan jalur eksternal sebagai bagian dari ruang kerja saat ini, jadi jalur di luar direktori kerja tetap harus diizinkan melalui external_directory.
Misalnya, ini mengizinkan akses ke semua yang ada di bawah ~/projects/personal/:
{
"$schema": "https://dropstone.io/schema/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow"
}
}
}
Direktori apa pun yang diizinkan di sini mewarisi default yang sama dengan ruang kerja saat ini. Karena read defaultnya allow, pembacaan juga diizinkan untuk entri di bawah external_directory kecuali ditimpa. Tambahkan aturan eksplisit ketika suatu alat harus dibatasi di jalur ini, seperti memblokir pengeditan sambil tetap mengizinkan pembacaan:
{
"$schema": "https://dropstone.io/schema/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow"
},
"edit": {
"~/projects/personal/**": "deny"
}
}
}
Jaga daftar tetap fokus pada jalur tepercaya, dan lapisi aturan izin atau penolakan tambahan sesuai kebutuhan untuk alat lain (misalnya bash).
Izin yang Tersedia
Izin Dropstone dikunci berdasarkan nama alat, ditambah beberapa pengaman:
read: membaca file (cocok dengan jalur file)edit: semua modifikasi file (mencakupedit,write,patch)glob: globbing file (cocok dengan pola glob)grep: pencarian konten (cocok dengan pola regex)bash: menjalankan perintah shell (cocok dengan perintah yang diurai sepertigit status --porcelain)task: meluncurkan subagen (cocok dengan jenis subagen)skill: memuat skill (cocok dengan nama skill)lsp: menjalankan kueri LSP (saat ini non-granular)question: mengajukan pertanyaan kepada pengguna selama eksekusiwebfetch: mengambil URL (cocok dengan URL)websearch: pencarian web (cocok dengan kueri)external_directory: dipicu ketika alat menyentuh jalur di luar direktori kerja proyekdoom_loop: dipicu ketika panggilan alat yang sama diulang 3 kali dengan input yang identik
Default
Jika Anda tidak menentukan apa pun, agen build default akan bertanya sebelum melakukan semuanya. Persetujuan adalah default, bukan pengecualian:
{
"permission": {
"*": "ask",
"read": {
"*": "ask",
"*.env": "ask",
"*.env.*": "ask",
"*.env.example": "ask"
},
"external_directory": { "*": "ask" },
"question": "deny",
"plan_enter": "deny",
"plan_exit": "deny",
"mode_switch": "deny"
}
}
Direktori yang sudah Anda setujui ditambahkan ke external_directory sebagai "allow" untuk sisa sesi.
Konfigurasi Anda digabungkan di atas default ini, dan aturan Anda menang. Ini tidak menggantikannya: mengatur edit ke "allow" membuat read tetap di "ask", jadi sebutkan setiap izin yang ingin Anda ubah.
Agen accept all dimulai dari "*": "allow" sebagai gantinya, dengan external_directory sepenuhnya diizinkan. Pembacaan .env dan .env.* masih bertanya, dengan alasan bahwa menyetujui otomatis suatu proses tidak sama dengan menyetujui untuk menyerahkan rahasia.
Mode headless dan server
Secara interaktif, "ask" tidak berbahaya: Anda akan diminta dan menyetujui. Di bawah dropstone serve, di CI, atau di tempat lain tanpa orang di keyboard, tidak ada yang bisa diminta, sehingga panggilan tetap di "status": "running" dan permintaan menggantung alih-alih gagal. Tidak ada batas waktu dan tidak ada kesalahan yang bisa ditangkap.
Karena agen build bertanya sebelum melakukan semuanya, ini adalah hasil default, bukan kasus tepi. Konfigurasi parsial juga tidak menyelamatkan Anda: mengizinkan edit membuat read tetap di "ask", dan proses menggantung pertama kali agen membuka file.
Dua cara untuk memperbaikinya. Jalankan agen accept all, yang dimulai dari "*": "allow":
curl -X POST ".../session/$SID/message" -d '{ "agent": "accept all", ... }'
Atau tetap di build dan nyatakan daftar izin lengkap, menolak secara default sehingga alat yang ditambahkan di rilis berikutnya tidak dapat diam-diam mulai menggantung proses Anda:
{
"$schema": "https://dropstone.io/schema/config.json",
"permission": {
"*": "deny",
"read": "allow",
"edit": "allow",
"glob": "allow",
"grep": "allow",
"bash": "allow"
}
}
Persempit ke apa yang sebenarnya dibutuhkan pekerjaan. Agen yang hanya membaca dan melaporkan tidak punya alasan untuk memegang edit atau bash.
Perhatikan bahwa accept all masih bertanya sebelum membaca .env dan .env.*. Jika proses tanpa pengawasan harus membaca salah satunya, izinkan secara eksplisit dan lakukan dengan sengaja.
Note
Jika proses headless berhenti menghasilkan output dan tidak pernah kembali, periksa pesan terakhir di sesi dengan GET /session/:id/message. Bagian alat yang macet di "status": "running" adalah masalah ini, bukan model yang lambat.
Apa yang dilakukan "Ask"
Ketika Dropstone meminta persetujuan, UI menawarkan tiga hasil:
once: setujui hanya permintaan inialways: setujui permintaan mendatang yang cocok dengan pola yang disarankan (untuk sisa sesi Dropstone saat ini)reject: tolak permintaan
Kumpulan pola yang akan disetujui oleh always disediakan oleh alat (misalnya, persetujuan bash biasanya memasukkan awalan perintah yang aman seperti git status*).
Agen
Anda dapat menimpa izin per agen. Izin agen digabungkan dengan konfigurasi global, dan aturan agen memiliki prioritas. Pelajari lebih lanjut tentang izin agen.
Note
Lihat bagian Aturan Granular (Sintaks Objek) di atas untuk contoh pencocokan pola yang lebih detail.
{
"$schema": "https://dropstone.io/schema/config.json",
"permission": {
"bash": {
"*": "ask",
"git *": "allow",
"git commit *": "deny",
"git push *": "deny",
"grep *": "allow"
}
},
"agent": {
"build": {
"permission": {
"bash": {
"*": "ask",
"git *": "allow",
"git commit *": "ask",
"git push *": "deny",
"grep *": "allow"
}
}
}
}
}
Anda juga dapat mengonfigurasi izin agen di Markdown:
---
description: Code review tanpa pengeditan
mode: subagent
permission:
edit: deny
bash: ask
webfetch: deny
---
Hanya analisis kode dan sarankan perubahan.
Tip
Gunakan pencocokan pola untuk perintah dengan argumen. "grep *" mengizinkan grep pattern file.txt, sementara "grep" saja akan memblokirnya. Perintah seperti git status berfungsi untuk perilaku default tetapi memerlukan izin eksplisit (seperti "git status *") ketika argumen diberikan.