Server
Interagisci con il server Dropstone tramite HTTP.
Il comando dropstone serve avvia un server HTTP headless che espone un endpoint OpenAPI che un client Dropstone può utilizzare.
Utilizzo
dropstone serve [--port <number>] [--hostname <string>] [--cors <origin>]
Opzioni
| Flag | Descrizione | Default |
|---|---|---|
--port | Porta su cui ascoltare | 4096 |
--hostname | Hostname su cui ascoltare | 127.0.0.1 |
--mdns | Abilita la scoperta mDNS | false |
--mdns-domain | Nome di dominio personalizzato per il servizio mDNS | dropstone.local |
--cors | Origini browser aggiuntive da consentire | [] |
--cors può essere passato più volte:
dropstone serve --cors http://localhost:5173 --cors https://app.example.com
Autenticazione
Imposta DROPSTONE_SERVER_PASSWORD per proteggere il server con autenticazione HTTP di base. Il nome utente predefinito è dropstone, oppure imposta DROPSTONE_SERVER_USERNAME per sovrascriverlo. Questo vale sia per dropstone serve che per dropstone web.
DROPSTONE_SERVER_PASSWORD=your-password dropstone serve
Credenziali dell'agente
DROPSTONE_SERVER_PASSWORD protegge il server stesso. Non dice all'agente come raggiungere Dropstone. Su una macchina non presidiata non c'è un account con accesso effettuato da ereditare, quindi passa una chiave API tramite la configurazione del provider:
{
"provider": {
"dropstone": {
"options": {
"apiKey": "dsk_live_...",
"baseURL": "https://api.dropstone.io/api/v1"
}
}
}
}
baseURL è importante. Le chiavi API vengono accettate su /api/v1, non su /v1, e una chiave inviata a /v1 viene rifiutata con 403 Invalid token format. Please log in again. Impostalo qui piuttosto che tramite DROPSTONE_BASE_URL, che viene utilizzato anche per costruire gli endpoint di account, utilizzo e memoria e li interromperà se lo punti a un percorso con versione.
Genera una chiave su dropstone.io/dashboard/settings.
Note
L'agente build predefinito chiede conferma prima di ogni chiamata di strumento. Nulla qui può rispondere a quel prompt, quindi la richiesta rimane in sospeso invece di fallire. Invia "agent": "accept all" oppure imposta una lista di autorizzazioni esplicita. Vedi Autorizzazioni.
Invio di un prompt
POST /session/:id/message richiede sia agent che model. Se si omette model, non viene risolto alcun default: il turno restituisce 200 con un corpo vuoto e non viene eseguito nulla.
curl -X POST "http://127.0.0.1:4096/session/$SID/message?directory=$PWD" \
-H "Content-Type: application/json" \
-d '{
"agent": "build",
"model": { "providerID": "dropstone", "modelID": "dropstone-pro" },
"parts": [{ "type": "text", "text": "Add error handling to src/index.ts" }]
}'
Un turno che fallisce restituisce comunque 200. Il motivo si trova in data.info.error, non a livello di trasporto, quindi controlla quel campo piuttosto che fare affidamento sul codice di stato.
Come funziona
dropstone serve espone le funzionalità di Dropstone tramite un endpoint HTTP OpenAPI 3.1. Lo stesso endpoint viene utilizzato per generare l'SDK.
Usa il server quando vuoi pilotare Dropstone programmaticamente: da uno script, una pipeline CI o un'integrazione tua. La sessione interattiva e il server sono indipendenti. Eseguire dropstone serve avvia un nuovo server autonomo indipendentemente dal fatto che tu abbia una sessione interattiva aperta.
Puoi sovrascrivere l'indirizzo di bind con i flag --hostname e --port.
Specifica
Il server pubblica una specifica OpenAPI 3.1 che può essere visualizzata su:
http://<hostname>:<port>/doc
Ad esempio, http://localhost:4096/doc. Usa la specifica per generare client o ispezionare i tipi di richiesta e risposta. Oppure visualizzala in un explorer Swagger.
API
Il server Dropstone espone le seguenti API.
Globali
| Metodo | Percorso | Descrizione | Risposta |
|---|---|---|---|
GET | /global/health | Ottieni salute e versione del server | { healthy: true, version: string } |
GET | /global/event | Ottieni eventi globali (stream SSE) | Stream di eventi |
Progetto
| Metodo | Percorso | Descrizione | Risposta |
|---|---|---|---|
GET | /project | Elenca tutti i progetti | Project[] |
GET | /project/current | Ottieni il progetto corrente | Project |
Percorso e VCS
| Metodo | Percorso | Descrizione | Risposta |
|---|---|---|---|
GET | /path | Ottieni il percorso corrente | Path |
GET | /vcs | Ottieni info VCS per il progetto corrente | VcsInfo |
Configurazione
| Metodo | Percorso | Descrizione | Risposta |
|---|---|---|---|
GET | /config | Ottieni info config | Config |
PATCH | /config | Aggiorna config | Config |
Sessioni
| Metodo | Percorso | Descrizione | Note |
|---|---|---|---|
GET | /session | Elenca tutte le sessioni | Restituisce Session[] |
POST | /session | Crea una nuova sessione | body: { parentID?, title? }, restituisce Session |
GET | /session/status | Ottieni stato sessione per tutte le sessioni | Restituisce { [sessionID: string]: SessionStatus } |
GET | /session/:id | Ottieni dettagli sessione | Restituisce Session |
DELETE | /session/:id | Elimina una sessione e tutti i suoi dati | Restituisce boolean |
PATCH | /session/:id | Aggiorna proprietà sessione | body: { title? }, restituisce Session |
GET | /session/:id/children | Ottieni le sessioni figlie di una sessione | Restituisce Session[] |
GET | /session/:id/todo | Ottieni la lista todo per una sessione | Restituisce Todo[] |
POST | /session/:id/init | Analizza l'app e crea AGENTS.md | body: { messageID, providerID, modelID }, restituisce boolean |
POST | /session/:id/fork | Duplica una sessione esistente a un messaggio | body: { messageID? }, restituisce Session |
POST | /session/:id/abort | Interrompi una sessione in esecuzione | Restituisce boolean |
GET | /session/:id/diff | Ottieni il diff per questa sessione | query: messageID?, restituisce FileDiff[] |
POST | /session/:id/summarize | Riepiloga la sessione | body: { providerID, modelID }, restituisce boolean |
POST | /session/:id/revert | Annulla un messaggio | body: { messageID, partID? }, restituisce boolean |
POST | /session/:id/unrevert | Ripristina tutti i messaggi annullati | Restituisce boolean |
POST | /session/:id/permissions/:permissionID | Rispondi a una richiesta di autorizzazione | body: { response, remember? }, restituisce boolean |
Messaggi
| Metodo | Percorso | Descrizione | Note |
|---|---|---|---|
GET | /session/:id/message | Elenca i messaggi in una sessione | query: limit?, restituisce { info: Message, parts: Part[]}[] |
POST | /session/:id/message | Invia un messaggio e attendi la risposta | body: { messageID?, model?, agent?, noReply?, system?, tools?, parts }, restituisce { info: Message, parts: Part[]} |
GET | /session/:id/message/:messageID | Ottieni dettagli messaggio | Restituisce { info: Message, parts: Part[]} |
POST | /session/:id/prompt_async | Invia un messaggio in modo asincrono (senza attesa) | body: come /session/:id/message, restituisce 204 No Content |
POST | /session/:id/command | Esegui un comando slash | body: { messageID?, agent?, model?, command, arguments }, restituisce { info: Message, parts: Part[]} |
POST | /session/:id/shell | Esegui un comando shell | body: { agent, model?, command }, restituisce { info: Message, parts: Part[]} |
Comandi
| Metodo | Percorso | Descrizione | Risposta |
|---|---|---|---|
GET | /command | Elenca tutti i comandi | Command[] |
File
| Metodo | Percorso | Descrizione | Risposta |
|---|---|---|---|
GET | /find?pattern=<pat> | Cerca testo nei file | Array di oggetti di corrispondenza con path, lines, line_number, absolute_offset, submatches |
GET | /find/file?query=<q> | Trova file e directory per nome | string[] (percorsi) |
GET | /find/symbol?query=<q> | Trova simboli del workspace | Symbol[] |
GET | /file?path=<path> | Elenca file e directory | FileNode[] |
GET | /file/content?path=<p> | Leggi un file | FileContent |
GET | /file/status | Ottieni stato per file tracciati | File[] |
Parametri di query /find/file
query(obbligatorio): stringa di ricerca (corrispondenza fuzzy)type(facoltativo): limita i risultati a"file"o"directory"directory(facoltativo): sovrascrive la radice del progetto per la ricercalimit(facoltativo): massimo risultati (1–200)dirs(facoltativo): flag legacy ("false"restituisce solo file)
LSP, Formatter e MCP
| Metodo | Percorso | Descrizione | Risposta |
|---|---|---|---|
GET | /lsp | Ottieni stato server LSP | LSPStatus[] |
GET | /formatter | Ottieni stato formatter | FormatterStatus[] |
GET | /mcp | Ottieni stato server MCP | { [name: string]: MCPStatus } |
POST | /mcp | Aggiungi server MCP dinamicamente | body: { name, config }, restituisce oggetto stato MCP |
Agenti
| Metodo | Percorso | Descrizione | Risposta |
|---|---|---|---|
GET | /agent | Elenca tutti gli agenti disponibili | Agent[] |
Registrazione
| Metodo | Percorso | Descrizione | Risposta |
|---|---|---|---|
POST | /log | Scrivi voce di registro. Body: { service, level, message, extra? } | boolean |
Autenticazione
| Metodo | Percorso | Descrizione | Risposta |
|---|---|---|---|
PUT | /auth/:id | Imposta le credenziali di autenticazione per il target specificato. | boolean |
Eventi
| Metodo | Percorso | Descrizione | Risposta |
|---|---|---|---|
GET | /event | Stream di eventi inviati dal server. Il primo evento è server.connected, poi eventi bus | Stream di eventi inviati dal server |
Documentazione
| Metodo | Percorso | Descrizione | Risposta |
|---|---|---|---|
GET | /doc | Specifica OpenAPI 3.1 | Pagina HTML con specifica OpenAPI |