Server
Interagiere mit dem Dropstone-Server über HTTP.
Der Befehl dropstone serve startet einen headless HTTP-Server, der einen OpenAPI-Endpunkt bereitstellt, den ein Dropstone-Client verwenden kann.
Verwendung
dropstone serve [--port <number>] [--hostname <string>] [--cors <origin>]
Optionen
| Flag | Beschreibung | Standard |
|---|---|---|
--port | Port, auf dem gelauscht wird | 4096 |
--hostname | Hostname, auf dem gelauscht wird | 127.0.0.1 |
--mdns | mDNS-Erkennung aktivieren | false |
--mdns-domain | Benutzerdefinierter Domainname für den mDNS-Dienst | dropstone.local |
--cors | Zusätzliche Browser-Ursprünge erlauben | [] |
--cors kann mehrfach übergeben werden:
dropstone serve --cors http://localhost:5173 --cors https://app.example.com
Authentifizierung
Setze DROPSTONE_SERVER_PASSWORD, um den Server mit HTTP-Basisauthentifizierung zu schützen. Der Benutzername lautet standardmäßig dropstone, oder setze DROPSTONE_SERVER_USERNAME, um ihn zu überschreiben. Dies gilt sowohl für dropstone serve als auch für dropstone web.
DROPSTONE_SERVER_PASSWORD=your-password dropstone serve
Agent-Anmeldedaten
DROPSTONE_SERVER_PASSWORD schützt den Server selbst. Es teilt dem Agenten nicht mit, wie er Dropstone erreicht. Auf einem unbeaufsichtigten Rechner gibt es kein angemeldetes Konto, das geerbt werden kann. Übergebe daher einen API-Schlüssel über die Provider-Konfiguration:
{
"provider": {
"dropstone": {
"options": {
"apiKey": "dsk_live_...",
"baseURL": "https://api.dropstone.io/api/v1"
}
}
}
}
baseURL ist wichtig. API-Schlüssel werden unter /api/v1 akzeptiert, nicht unter /v1, und ein an /v1 gesendeter Schlüssel wird mit 403 Invalid token format. Please log in again. abgelehnt. Setze ihn hier und nicht über DROPSTONE_BASE_URL, da diese auch zum Erstellen der Konto-, Nutzungs- und Speicher-Endpunkte verwendet wird und diese beschädigt, wenn du sie auf einen versionierten Pfad zeigst.
Generiere einen Schlüssel unter dropstone.io/dashboard/settings.
Note
Der Standard-Agent build fragt vor jedem Tool-Aufruf nach. Nichts hier kann diese Eingabeaufforderung beantworten, daher hängt die Anfrage, anstatt fehlzuschlagen. Sende entweder "agent": "accept all" oder setze eine explizite Berechtigungs-Whitelist. Siehe Berechtigungen.
Senden einer Eingabeaufforderung
POST /session/:id/message erfordert sowohl agent als auch model. Wenn model weggelassen wird, wird kein Standard aufgelöst: Die Runde gibt 200 mit einem leeren Body zurück und es wird nichts ausgeführt.
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" }]
}'
Eine Runde, die fehlschlägt, gibt trotzdem 200 zurück. Der Grund liegt bei data.info.error, nicht auf Transportebene. Überprüfe also dieses Feld, anstatt dich auf den Statuscode zu verlassen.
So funktioniert es
dropstone serve stellt Dropstones Fähigkeiten über einen OpenAPI-3.1-HTTP-Endpunkt bereit. Derselbe Endpunkt wird verwendet, um das SDK zu generieren.
Verwende den Server, wenn du Dropstone programmatisch steuern möchtest: aus einem Skript, einer CI-Pipeline oder einer eigenen Integration. Die interaktive Sitzung und der Server sind unabhängig. Das Ausführen von dropstone serve startet einen frischen eigenständigen Server, unabhängig davon, ob du eine interaktive Sitzung geöffnet hast.
Du kannst die Bind-Adresse mit den Flags --hostname und --port überschreiben.
Spezifikation
Der Server veröffentlicht eine OpenAPI-3.1-Spezifikation, die unter folgender Adresse eingesehen werden kann:
http://<hostname>:<port>/doc
Zum Beispiel http://localhost:4096/doc. Verwende die Spezifikation, um Clients zu generieren oder Anfrage- und Antworttypen zu prüfen. Oder betrachte sie in einem Swagger-Explorer.
APIs
Der Dropstone-Server stellt die folgenden APIs bereit.
Global
| Methode | Pfad | Beschreibung | Antwort |
|---|---|---|---|
GET | /global/health | Server-Health und -Version abrufen | { healthy: true, version: string } |
GET | /global/event | Globale Ereignisse abrufen (SSE-Stream) | Ereignisstream |
Projekt
| Methode | Pfad | Beschreibung | Antwort |
|---|---|---|---|
GET | /project | Alle Projekte auflisten | Project[] |
GET | /project/current | Das aktuelle Projekt abrufen | Project |
Pfad & VCS
| Methode | Pfad | Beschreibung | Antwort |
|---|---|---|---|
GET | /path | Den aktuellen Pfad abrufen | Path |
GET | /vcs | VCS-Info für das aktuelle Projekt abrufen | VcsInfo |
Konfiguration
| Methode | Pfad | Beschreibung | Antwort |
|---|---|---|---|
GET | /config | Konfigurationsinfo abrufen | Config |
PATCH | /config | Konfiguration aktualisieren | Config |
Sitzungen
| Methode | Pfad | Beschreibung | Hinweise |
|---|---|---|---|
GET | /session | Alle Sitzungen auflisten | Gibt Session[] zurück |
POST | /session | Eine neue Sitzung erstellen | body: { parentID?, title? }, gibt Session zurück |
GET | /session/status | Sitzungsstatus für alle Sitzungen abrufen | Gibt { [sessionID: string]: SessionStatus } zurück |
GET | /session/:id | Sitzungsdetails abrufen | Gibt Session zurück |
DELETE | /session/:id | Eine Sitzung und alle ihre Daten löschen | Gibt boolean zurück |
PATCH | /session/:id | Sitzungseigenschaften aktualisieren | body: { title? }, gibt Session zurück |
GET | /session/:id/children | Untersitzungen einer Sitzung abrufen | Gibt Session[] zurück |
GET | /session/:id/todo | Die Todo-Liste für eine Sitzung abrufen | Gibt Todo[] zurück |
POST | /session/:id/init | App analysieren und AGENTS.md erstellen | body: { messageID, providerID, modelID }, gibt boolean zurück |
POST | /session/:id/fork | Eine bestehende Sitzung an einer Nachricht forken | body: { messageID? }, gibt Session zurück |
POST | /session/:id/abort | Eine laufende Sitzung abbrechen | Gibt boolean zurück |
GET | /session/:id/diff | Den Diff für diese Sitzung abrufen | query: messageID?, gibt FileDiff[] zurück |
POST | /session/:id/summarize | Die Sitzung zusammenfassen | body: { providerID, modelID }, gibt boolean zurück |
POST | /session/:id/revert | Eine Nachricht zurücksetzen | body: { messageID, partID? }, gibt boolean zurück |
POST | /session/:id/unrevert | Alle zurückgesetzten Nachrichten wiederherstellen | Gibt boolean zurück |
POST | /session/:id/permissions/:permissionID | Auf eine Berechtigungsanfrage antworten | body: { response, remember? }, gibt boolean zurück |
Nachrichten
| Methode | Pfad | Beschreibung | Hinweise |
|---|---|---|---|
GET | /session/:id/message | Nachrichten in einer Sitzung auflisten | query: limit?, gibt { info: Message, parts: Part[]}[] zurück |
POST | /session/:id/message | Eine Nachricht senden und auf Antwort warten | body: { messageID?, model?, agent?, noReply?, system?, tools?, parts }, gibt { info: Message, parts: Part[]} zurück |
GET | /session/:id/message/:messageID | Nachrichtendetails abrufen | Gibt { info: Message, parts: Part[]} zurück |
POST | /session/:id/prompt_async | Eine Nachricht asynchron senden (kein Warten) | body: wie bei /session/:id/message, gibt 204 No Content zurück |
POST | /session/:id/command | Einen Slash-Befehl ausführen | body: { messageID?, agent?, model?, command, arguments }, gibt { info: Message, parts: Part[]} zurück |
POST | /session/:id/shell | Einen Shell-Befehl ausführen | body: { agent, model?, command }, gibt { info: Message, parts: Part[]} zurück |
Befehle
| Methode | Pfad | Beschreibung | Antwort |
|---|---|---|---|
GET | /command | Alle Befehle auflisten | Command[] |
Dateien
| Methode | Pfad | Beschreibung | Antwort |
|---|---|---|---|
GET | /find?pattern=<pat> | Nach Text in Dateien suchen | Array von Übereinstimmungsobjekten mit path, lines, line_number, absolute_offset, submatches |
GET | /find/file?query=<q> | Dateien und Verzeichnisse nach Namen finden | string[] (Pfade) |
GET | /find/symbol?query=<q> | Workspace-Symbole finden | Symbol[] |
GET | /file?path=<path> | Dateien und Verzeichnisse auflisten | FileNode[] |
GET | /file/content?path=<p> | Eine Datei lesen | FileContent |
GET | /file/status | Status für verfolgte Dateien abrufen | File[] |
/find/file-Abfrageparameter
query(erforderlich): Suchzeichenfolge (Fuzzy-Match)type(optional): Ergebnisse auf"file"oder"directory"beschränkendirectory(optional): Projektstamm für die Suche überschreibenlimit(optional): Maximale Ergebnisse (1–200)dirs(optional): Legacy-Flag ("false"gibt nur Dateien zurück)
LSP, Formatierer & MCP
| Methode | Pfad | Beschreibung | Antwort |
|---|---|---|---|
GET | /lsp | LSP-Serverstatus abrufen | LSPStatus[] |
GET | /formatter | Formatiererstatus abrufen | FormatterStatus[] |
GET | /mcp | MCP-Serverstatus abrufen | { [name: string]: MCPStatus } |
POST | /mcp | MCP-Server dynamisch hinzufügen | body: { name, config }, gibt MCP-Statusobjekt zurück |
Agenten
| Methode | Pfad | Beschreibung | Antwort |
|---|---|---|---|
GET | /agent | Alle verfügbaren Agenten auflisten | Agent[] |
Protokollierung
| Methode | Pfad | Beschreibung | Antwort |
|---|---|---|---|
POST | /log | Protokolleintrag schreiben. Body: { service, level, message, extra? } | boolean |
Authentifizierung
| Methode | Pfad | Beschreibung | Antwort |
|---|---|---|---|
PUT | /auth/:id | Authentifizierungsdaten für das angegebene Ziel festlegen. | boolean |
Ereignisse
| Methode | Pfad | Beschreibung | Antwort |
|---|---|---|---|
GET | /event | Server-Sent-Events-Stream. Erstes Ereignis ist server.connected, dann Bus-Ereignisse | Server-Sent-Events-Stream |
Dokumentation
| Methode | Pfad | Beschreibung | Antwort |
|---|---|---|---|
GET | /doc | OpenAPI-3.1-Spezifikation | HTML-Seite mit OpenAPI-Spezifikation |