Permissions
Controlla quali azioni richiedono approvazione per essere eseguite.
Dropstone usa la configurazione permission per decidere se una determinata azione debba essere eseguita automaticamente, richiedere una conferma, o essere bloccata.
La configurazione legacy tools di tipo booleano è deprecata; è stata integrata in permission. La vecchia configurazione tools è ancora supportata per compatibilità con le versioni precedenti.
Azioni
Ogni regola di permesso si risolve in uno dei seguenti valori:
"allow": esegui senza approvazione"ask": chiedi approvazione"deny": blocca l'azione
Configurazione
Puoi impostare i permessi a livello globale (con *) e sovrascrivere strumenti specifici.
{
"$schema": "https://dropstone.io/schema/config.json",
"permission": {
"*": "ask",
"bash": "allow",
"edit": "deny"
}
}
Puoi anche impostare tutti i permessi in una volta:
{
"$schema": "https://dropstone.io/schema/config.json",
"permission": "allow"
}
Regole Granulari (Sintassi a Oggetto)
Per la maggior parte dei permessi, puoi usare un oggetto per applicare azioni diverse in base all'input dello strumento.
{
"$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"
}
}
}
Le regole vengono valutate tramite corrispondenza di pattern, con l'ultima regola corrispondente che vince. Un pattern comune è mettere la regola catch-all "*" per prima, e le regole più specifiche dopo.
Wildcard
I pattern di permesso usano una semplice corrispondenza con wildcard:
*corrisponde a zero o più caratteri qualsiasi?corrisponde esattamente a un carattere- Tutti gli altri caratteri corrispondono letteralmente
Espansione della Directory Home
Puoi usare ~ o $HOME all'inizio di un pattern per fare riferimento alla tua directory home. Questo è particolarmente utile per le regole external_directory.
~/projects/*->/Users/username/projects/*$HOME/projects/*->/Users/username/projects/*~->/Users/username
Directory Esterne
Usa external_directory per consentire chiamate a strumenti che toccano percorsi al di fuori della directory di lavoro in cui è stato avviato Dropstone. Questo si applica a qualsiasi strumento che accetta un percorso come input (ad esempio read, edit, glob, grep e molti comandi bash).
L'espansione della home (come ~/...) influisce solo su come viene scritto un pattern. Non rende un percorso esterno parte del workspace corrente, quindi i percorsi al di fuori della directory di lavoro devono comunque essere consentiti tramite external_directory.
Ad esempio, questo consente l'accesso a tutto ciò che si trova sotto ~/projects/personal/:
{
"$schema": "https://dropstone.io/schema/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow"
}
}
}
Qualsiasi directory consentita qui eredita le stesse impostazioni predefinite del workspace corrente. Poiché read è predefinito su allow, le letture sono consentite anche per le voci sotto external_directory a meno che non vengano sovrascritte. Aggiungi regole esplicite quando uno strumento deve essere limitato in questi percorsi, come bloccare le modifiche mantenendo le letture:
{
"$schema": "https://dropstone.io/schema/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow"
},
"edit": {
"~/projects/personal/**": "deny"
}
}
}
Mantieni l'elenco concentrato su percorsi attendibili e aggiungi regole extra di consenso o diniego come necessario per altri strumenti (ad esempio bash).
Permessi Disponibili
I permessi di Dropstone sono indicizzati per nome dello strumento, più un paio di protezioni di sicurezza:
read: lettura di un file (corrisponde al percorso del file)edit: tutte le modifiche ai file (copreedit,write,patch)glob: globbing dei file (corrisponde al pattern glob)grep: ricerca di contenuti (corrisponde al pattern regex)bash: esecuzione di comandi shell (corrisponde a comandi analizzati comegit status --porcelain)task: avvio di subagent (corrisponde al tipo di subagent)skill: caricamento di una skill (corrisponde al nome della skill)lsp: esecuzione di query LSP (attualmente non granulare)question: fare domande all'utente durante l'esecuzionewebfetch: recupero di un URL (corrisponde all'URL)websearch: ricerca web (corrisponde alla query)external_directory: attivato quando uno strumento tocca percorsi al di fuori della directory di lavoro del progettodoom_loop: attivato quando la stessa chiamata a uno strumento si ripete 3 volte con input identico
Predefiniti
Se non specifichi nulla, l'agente build predefinito chiede prima di ogni cosa. L'approvazione è il default, non un'eccezione:
{
"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"
}
}
Le directory che hai già approvato vengono aggiunte a external_directory come "allow" per il resto della sessione.
La tua configurazione viene unita sopra questi predefiniti, e le tue regole vincono. Non li sostituisce: impostare edit su "allow" lascia read su "ask", quindi nomina ogni permesso che intendi modificare.
L'agente accept all parte invece da "*": "allow", con external_directory completamente consentito. Le letture di .env e .env.* chiedono comunque conferma, con il ragionamento che approvare automaticamente un'esecuzione non equivale a dare il consenso alla consegna di segreti.
Modalità headless e server
In modalità interattiva, "ask" è innocuo: ricevi una richiesta e approvi. Sotto dropstone serve, in CI, o ovunque non ci sia una persona alla tastiera, non c'è nessuno a cui chiedere, quindi la chiamata rimane su "status": "running" e la richiesta resta in sospeso invece di fallire. Non c'è timeout né errore da catturare.
Poiché l'agente build chiede prima di ogni cosa, questo è il risultato predefinito piuttosto che un caso limite. Una configurazione parziale non ti salva nemmeno: consentire edit lascia read su "ask", e l'esecuzione si blocca la prima volta che l'agente apre un file.
Due modi per risolvere. O esegui l'agente accept all, che parte da "*": "allow":
curl -X POST ".../session/$SID/message" -d '{ "agent": "accept all", ... }'
Oppure resta su build e dichiara l'allowlist completa, negando per impostazione predefinita così uno strumento aggiunto in una versione successiva non può iniziare silenziosamente a bloccare le tue esecuzioni:
{
"$schema": "https://dropstone.io/schema/config.json",
"permission": {
"*": "deny",
"read": "allow",
"edit": "allow",
"glob": "allow",
"grep": "allow",
"bash": "allow"
}
}
Restringilo a ciò di cui il lavoro ha realmente bisogno. Un agente che legge e riporta soltanto non ha motivo di avere edit o bash.
Nota che accept all chiede comunque prima di leggere .env e .env.*. Se un'esecuzione non presidiata deve leggerne uno, consentilo esplicitamente e sii deliberato al riguardo.
Note
Se un'esecuzione headless smette di produrre output e non ritorna mai, controlla l'ultimo messaggio nella sessione con GET /session/:id/message. Una parte di strumento bloccata su "status": "running" è questo problema, non un modello lento.
Cosa fa "Ask"
Quando Dropstone richiede approvazione, l'interfaccia offre tre risultati:
once: approva solo questa richiestaalways: approva le richieste future che corrispondono ai pattern suggeriti (per il resto della sessione corrente di Dropstone)reject: nega la richiesta
L'insieme di pattern che always approverebbe è fornito dallo strumento (ad esempio, le approvazioni bash tipicamente mettono in whitelist un prefisso di comando sicuro come git status*).
Agenti
Puoi sovrascrivere i permessi per singolo agente. I permessi dell'agente vengono uniti alla configurazione globale, e le regole dell'agente hanno precedenza. Scopri di più sui permessi degli agenti.
Note
Fai riferimento alla sezione Regole Granulari (Sintassi a Oggetto) sopra per esempi più dettagliati di corrispondenza dei pattern.
{
"$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"
}
}
}
}
}
Puoi anche configurare i permessi degli agenti in Markdown:
---
description: Code review without edits
mode: subagent
permission:
edit: deny
bash: ask
webfetch: deny
---
Only analyze code and suggest changes.
Tip
Usa la corrispondenza dei pattern per i comandi con argomenti. "grep *" consente grep pattern file.txt, mentre "grep" da solo lo bloccherebbe. Comandi come git status funzionano per il comportamento predefinito ma richiedono un permesso esplicito (come "git status *") quando vengono passati argomenti.