Serveur
Interagissez avec le serveur Dropstone via HTTP.
La commande dropstone serve exécute un serveur HTTP headless qui expose un endpoint OpenAPI qu'un client Dropstone peut utiliser.
Utilisation
dropstone serve [--port <number>] [--hostname <string>] [--cors <origin>]
Options
| Flag | Description | Défaut |
|---|---|---|
--port | Port d'écoute | 4096 |
--hostname | Nom d'hôte d'écoute | 127.0.0.1 |
--mdns | Activer la découverte mDNS | false |
--mdns-domain | Nom de domaine personnalisé pour le service mDNS | dropstone.local |
--cors | Origines navigateur supplémentaires à autoriser | [] |
--cors peut être passé plusieurs fois :
dropstone serve --cors http://localhost:5173 --cors https://app.example.com
Authentification
Définissez DROPSTONE_SERVER_PASSWORD pour protéger le serveur avec une authentification HTTP de base. Le nom d'utilisateur par défaut est dropstone, ou définissez DROPSTONE_SERVER_USERNAME pour le remplacer. Cela s'applique à la fois à dropstone serve et à dropstone web.
DROPSTONE_SERVER_PASSWORD=your-password dropstone serve
Identifiants de l'agent
DROPSTONE_SERVER_PASSWORD protège le serveur lui-même. Il ne dit pas à l'agent comment joindre Dropstone. Sur une machine sans surveillance, il n'y a pas de compte connecté à hériter, donc transmettez une clé API via la configuration du fournisseur :
{
"provider": {
"dropstone": {
"options": {
"apiKey": "dsk_live_...",
"baseURL": "https://api.dropstone.io/api/v1"
}
}
}
}
baseURL est important. Les clés API sont acceptées sur /api/v1, pas sur /v1, et une clé envoyée à /v1 est rejetée avec 403 Invalid token format. Please log in again. Définissez-la ici plutôt que via DROPSTONE_BASE_URL, qui est également utilisé pour construire les endpoints de compte, d'utilisation et de mémoire et les cassera si vous le pointez vers un chemin versionné.
Générez une clé sur dropstone.io/dashboard/settings.
Note
L'agent build par défaut demande avant chaque appel d'outil. Rien ici ne peut répondre à cette invite, donc la requête reste bloquée plutôt que d'échouer. Envoyez soit "agent": "accept all" soit définissez une liste d'autorisations explicite. Voir Permissions.
Envoi d'une invite
POST /session/:id/message nécessite à la fois agent et model. Omettre model ne résout aucun défaut : le tour renvoie 200 avec un corps vide et rien ne s'exécute.
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 tour qui échoue renvoie toujours 200. La raison se trouve dans data.info.error, pas au niveau du transport, donc vérifiez ce champ plutôt que de vous fier au code de statut.
Comment ça fonctionne
dropstone serve expose les capacités de Dropstone via un endpoint HTTP OpenAPI 3.1. Le même endpoint est utilisé pour générer le SDK.
Utilisez le serveur lorsque vous souhaitez piloter Dropstone par programmation : depuis un script, un pipeline CI, ou une intégration personnalisée. La session interactive et le serveur sont indépendants. Lancer dropstone serve démarre un nouveau serveur autonome, que vous ayez ou non une session interactive ouverte.
Vous pouvez remplacer l'adresse de liaison avec les flags --hostname et --port.
Spécification
Le serveur publie une spécification OpenAPI 3.1 consultable à l'adresse :
http://<hostname>:<port>/doc
Par exemple, http://localhost:4096/doc. Utilisez la spécification pour générer des clients ou inspecter les types de requêtes et de réponses. Ou consultez-la dans un explorateur Swagger.
API
Le serveur Dropstone expose les API suivantes.
Global
| Méthode | Chemin | Description | Réponse |
|---|---|---|---|
GET | /global/health | Obtenir la santé et la version du serveur | { healthy: true, version: string } |
GET | /global/event | Obtenir les événements globaux (flux SSE) | Flux d'événements |
Projet
| Méthode | Chemin | Description | Réponse |
|---|---|---|---|
GET | /project | Lister tous les projets | Project[] |
GET | /project/current | Obtenir le projet actuel | Project |
Chemin et VCS
| Méthode | Chemin | Description | Réponse |
|---|---|---|---|
GET | /path | Obtenir le chemin actuel | Path |
GET | /vcs | Obtenir les informations VCS pour le projet actuel | VcsInfo |
Configuration
| Méthode | Chemin | Description | Réponse |
|---|---|---|---|
GET | /config | Obtenir les informations de configuration | Config |
PATCH | /config | Mettre à jour la configuration | Config |
Sessions
| Méthode | Chemin | Description | Notes |
|---|---|---|---|
GET | /session | Lister toutes les sessions | Renvoie Session[] |
POST | /session | Créer une nouvelle session | corps : { parentID?, title? }, renvoie Session |
GET | /session/status | Obtenir le statut des sessions pour toutes les sessions | Renvoie { [sessionID: string]: SessionStatus } |
GET | /session/:id | Obtenir les détails d'une session | Renvoie Session |
DELETE | /session/:id | Supprimer une session et toutes ses données | Renvoie boolean |
PATCH | /session/:id | Mettre à jour les propriétés d'une session | corps : { title? }, renvoie Session |
GET | /session/:id/children | Obtenir les sessions enfants d'une session | Renvoie Session[] |
GET | /session/:id/todo | Obtenir la liste de tâches d'une session | Renvoie Todo[] |
POST | /session/:id/init | Analyser l'application et créer AGENTS.md | corps : { messageID, providerID, modelID }, renvoie boolean |
POST | /session/:id/fork | Dupliquer une session existante à un message | corps : { messageID? }, renvoie Session |
POST | /session/:id/abort | Interrompre une session en cours | Renvoie boolean |
GET | /session/:id/diff | Obtenir le diff de cette session | requête : messageID?, renvoie FileDiff[] |
POST | /session/:id/summarize | Résumer la session | corps : { providerID, modelID }, renvoie boolean |
POST | /session/:id/revert | Annuler un message | corps : { messageID, partID? }, renvoie boolean |
POST | /session/:id/unrevert | Restaurer tous les messages annulés | Renvoie boolean |
POST | /session/:id/permissions/:permissionID | Répondre à une demande d'autorisation | corps : { response, remember? }, renvoie boolean |
Messages
| Méthode | Chemin | Description | Notes |
|---|---|---|---|
GET | /session/:id/message | Lister les messages d'une session | requête : limit?, renvoie { info: Message, parts: Part[]}[] |
POST | /session/:id/message | Envoyer un message et attendre la réponse | corps : { messageID?, model?, agent?, noReply?, system?, tools?, parts }, renvoie { info: Message, parts: Part[]} |
GET | /session/:id/message/:messageID | Obtenir les détails d'un message | Renvoie { info: Message, parts: Part[]} |
POST | /session/:id/prompt_async | Envoyer un message de manière asynchrone (sans attendre) | corps : identique à /session/:id/message, renvoie 204 No Content |
POST | /session/:id/command | Exécuter une commande slash | corps : { messageID?, agent?, model?, command, arguments }, renvoie { info: Message, parts: Part[]} |
POST | /session/:id/shell | Exécuter une commande shell | corps : { agent, model?, command }, renvoie { info: Message, parts: Part[]} |
Commandes
| Méthode | Chemin | Description | Réponse |
|---|---|---|---|
GET | /command | Lister toutes les commandes | Command[] |
Fichiers
| Méthode | Chemin | Description | Réponse |
|---|---|---|---|
GET | /find?pattern=<pat> | Rechercher du texte dans les fichiers | Tableau d'objets de correspondance avec path, lines, line_number, absolute_offset, submatches |
GET | /find/file?query=<q> | Trouver des fichiers et dossiers par nom | string[] (chemins) |
GET | /find/symbol?query=<q> | Trouver des symboles d'espace de travail | Symbol[] |
GET | /file?path=<path> | Lister les fichiers et dossiers | FileNode[] |
GET | /file/content?path=<p> | Lire un fichier | FileContent |
GET | /file/status | Obtenir le statut des fichiers suivis | File[] |
Paramètres de requête /find/file
query(obligatoire) : chaîne de recherche (correspondance floue)type(facultatif) : limiter les résultats à"file"ou"directory"directory(facultatif) : remplacer la racine du projet pour la recherchelimit(facultatif) : nombre maximal de résultats (1–200)dirs(facultatif) : indicateur hérité ("false"renvoie uniquement les fichiers)
LSP, Formateurs et MCP
| Méthode | Chemin | Description | Réponse |
|---|---|---|---|
GET | /lsp | Obtenir le statut du serveur LSP | LSPStatus[] |
GET | /formatter | Obtenir le statut du formateur | FormatterStatus[] |
GET | /mcp | Obtenir le statut du serveur MCP | { [name: string]: MCPStatus } |
POST | /mcp | Ajouter un serveur MCP dynamiquement | corps : { name, config }, renvoie l'objet de statut MCP |
Agents
| Méthode | Chemin | Description | Réponse |
|---|---|---|---|
GET | /agent | Lister tous les agents disponibles | Agent[] |
Journalisation
| Méthode | Chemin | Description | Réponse |
|---|---|---|---|
POST | /log | Écrire une entrée de journal. Corps : { service, level, message, extra? } | boolean |
Authentification
| Méthode | Chemin | Description | Réponse |
|---|---|---|---|
PUT | /auth/:id | Définir les identifiants d'authentification pour la cible donnée. | boolean |
Événements
| Méthode | Chemin | Description | Réponse |
|---|---|---|---|
GET | /event | Flux d'événements envoyés par le serveur. Le premier événement est server.connected, puis les événements du bus | Flux d'événements envoyés par le serveur |
Documentation
| Méthode | Chemin | Description | Réponse |
|---|---|---|---|
GET | /doc | Spécification OpenAPI 3.1 | Page HTML avec la spécification OpenAPI |