Servidor
Interactúa con el servidor de Dropstone a través de HTTP.
El comando dropstone serve ejecuta un servidor HTTP sin interfaz gráfica que expone un endpoint OpenAPI que un cliente de Dropstone puede utilizar.
Uso
dropstone serve [--port <number>] [--hostname <string>] [--cors <origin>]
Opciones
| Flag | Descripción | Valor por defecto |
|---|---|---|
--port | Puerto en el que escuchar | 4096 |
--hostname | Nombre de host en el que escuchar | 127.0.0.1 |
--mdns | Habilitar descubrimiento mDNS | false |
--mdns-domain | Nombre de dominio personalizado para el servicio mDNS | dropstone.local |
--cors | Orígenes de navegador adicionales a permitir | [] |
--cors se puede pasar varias veces:
dropstone serve --cors http://localhost:5173 --cors https://app.example.com
Autenticación
Establece DROPSTONE_SERVER_PASSWORD para proteger el servidor con autenticación básica HTTP. El nombre de usuario por defecto es dropstone, o establece DROPSTONE_SERVER_USERNAME para cambiarlo. Esto se aplica tanto a dropstone serve como a dropstone web.
DROPSTONE_SERVER_PASSWORD=tu-contraseña dropstone serve
Credenciales del agente
DROPSTONE_SERVER_PASSWORD protege el servidor en sí. No le indica al agente cómo conectarse a Dropstone. En una máquina desatendida no hay una cuenta iniciada de la que heredar, así que pasa una clave de API a través de la configuración del proveedor:
{
"provider": {
"dropstone": {
"options": {
"apiKey": "dsk_live_...",
"baseURL": "https://api.dropstone.io/api/v1"
}
}
}
}
baseURL es importante. Las claves de API se aceptan en /api/v1, no en /v1, y una clave enviada a /v1 se rechaza con 403 Invalid token format. Please log in again. Establécelo aquí en lugar de a través de DROPSTONE_BASE_URL, que también se usa para construir los endpoints de cuenta, uso y memoria, y los romperá si lo apuntas a una ruta con versión.
Genera una clave en dropstone.io/dashboard/settings.
Note
El agente build por defecto pregunta antes de cada llamada a una herramienta. Nada aquí puede responder a esa solicitud, por lo que la petición se queda colgada en lugar de fallar. O envía "agent": "accept all" o establece una lista de permisos explícita. Consulta Permisos.
Enviar una solicitud
POST /session/:id/message requiere tanto agent como model. Si se omite model, no se resuelve ningún valor por defecto: el turno devuelve 200 con un cuerpo vacío y no se ejecuta nada.
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 que falla aún devuelve 200. El motivo está en data.info.error, no a nivel de transporte, así que revisa ese campo en lugar de confiar en el código de estado.
Cómo funciona
dropstone serve expone las capacidades de Dropstone a través de un endpoint HTTP OpenAPI 3.1. El mismo endpoint se usa para generar el SDK.
Usa el servidor cuando quieras controlar Dropstone programáticamente: desde un script, una canalización de CI o una integración propia. La sesión interactiva y el servidor son independientes. Ejecutar dropstone serve inicia un servidor independiente nuevo, sin importar si tienes una sesión interactiva abierta.
Puedes cambiar la dirección de enlace con las banderas --hostname y --port.
Especificación
El servidor publica una especificación OpenAPI 3.1 que se puede ver en:
http://<hostname>:<port>/doc
Por ejemplo, http://localhost:4096/doc. Usa la especificación para generar clientes o inspeccionar los tipos de solicitud y respuesta. O mírala en un explorador de Swagger.
APIs
El servidor de Dropstone expone las siguientes APIs.
Global
| Método | Ruta | Descripción | Respuesta |
|---|---|---|---|
GET | /global/health | Obtener salud y versión del servidor | { healthy: true, version: string } |
GET | /global/event | Obtener eventos globales (flujo SSE) | Flujo de eventos |
Proyecto
| Método | Ruta | Descripción | Respuesta |
|---|---|---|---|
GET | /project | Listar todos los proyectos | Project[] |
GET | /project/current | Obtener el proyecto actual | Project |
Ruta y VCS
| Método | Ruta | Descripción | Respuesta |
|---|---|---|---|
GET | /path | Obtener la ruta actual | Path |
GET | /vcs | Obtener información de VCS para el proyecto actual | VcsInfo |
Configuración
| Método | Ruta | Descripción | Respuesta |
|---|---|---|---|
GET | /config | Obtener información de configuración | Config |
PATCH | /config | Actualizar configuración | Config |
Sesiones
| Método | Ruta | Descripción | Notas |
|---|---|---|---|
GET | /session | Listar todas las sesiones | Devuelve Session[] |
POST | /session | Crear una nueva sesión | cuerpo: { parentID?, title? }, devuelve Session |
GET | /session/status | Obtener estado de sesión para todas las sesiones | Devuelve { [sessionID: string]: SessionStatus } |
GET | /session/:id | Obtener detalles de la sesión | Devuelve Session |
DELETE | /session/:id | Eliminar una sesión y todos sus datos | Devuelve boolean |
PATCH | /session/:id | Actualizar propiedades de la sesión | cuerpo: { title? }, devuelve Session |
GET | /session/:id/children | Obtener las sesiones hijas de una sesión | Devuelve Session[] |
GET | /session/:id/todo | Obtener la lista de tareas de una sesión | Devuelve Todo[] |
POST | /session/:id/init | Analizar la aplicación y crear AGENTS.md | cuerpo: { messageID, providerID, modelID }, devuelve boolean |
POST | /session/:id/fork | Bifurcar una sesión existente en un mensaje | cuerpo: { messageID? }, devuelve Session |
POST | /session/:id/abort | Abortar una sesión en ejecución | Devuelve boolean |
GET | /session/:id/diff | Obtener el diff de esta sesión | consulta: messageID?, devuelve FileDiff[] |
POST | /session/:id/summarize | Resumir la sesión | cuerpo: { providerID, modelID }, devuelve boolean |
POST | /session/:id/revert | Revertir un mensaje | cuerpo: { messageID, partID? }, devuelve boolean |
POST | /session/:id/unrevert | Restaurar todos los mensajes revertidos | Devuelve boolean |
POST | /session/:id/permissions/:permissionID | Responder a una solicitud de permiso | cuerpo: { response, remember? }, devuelve boolean |
Mensajes
| Método | Ruta | Descripción | Notas |
|---|---|---|---|
GET | /session/:id/message | Listar mensajes en una sesión | consulta: limit?, devuelve { info: Message, parts: Part[]}[] |
POST | /session/:id/message | Enviar un mensaje y esperar respuesta | cuerpo: { messageID?, model?, agent?, noReply?, system?, tools?, parts }, devuelve { info: Message, parts: Part[]} |
GET | /session/:id/message/:messageID | Obtener detalles del mensaje | Devuelve { info: Message, parts: Part[]} |
POST | /session/:id/prompt_async | Enviar un mensaje de forma asíncrona (sin espera) | cuerpo: igual que /session/:id/message, devuelve 204 No Content |
POST | /session/:id/command | Ejecutar un comando de barra | cuerpo: { messageID?, agent?, model?, command, arguments }, devuelve { info: Message, parts: Part[]} |
POST | /session/:id/shell | Ejecutar un comando de shell | cuerpo: { agent, model?, command }, devuelve { info: Message, parts: Part[]} |
Comandos
| Método | Ruta | Descripción | Respuesta |
|---|---|---|---|
GET | /command | Listar todos los comandos | Command[] |
Archivos
| Método | Ruta | Descripción | Respuesta |
|---|---|---|---|
GET | /find?pattern=<pat> | Buscar texto en archivos | Matriz de objetos de coincidencia con path, lines, line_number, absolute_offset, submatches |
GET | /find/file?query=<q> | Buscar archivos y directorios por nombre | string[] (rutas) |
GET | /find/symbol?query=<q> | Buscar símbolos del espacio de trabajo | Symbol[] |
GET | /file?path=<path> | Listar archivos y directorios | FileNode[] |
GET | /file/content?path=<p> | Leer un archivo | FileContent |
GET | /file/status | Obtener estado de los archivos rastreados | File[] |
Parámetros de consulta de /find/file
query(obligatorio): cadena de búsqueda (coincidencia difusa)type(opcional): limitar resultados a"file"o"directory"directory(opcional): anular la raíz del proyecto para la búsquedalimit(opcional): máximo de resultados (1–200)dirs(opcional): bandera heredada ("false"devuelve solo archivos)
LSP, Formateadores y MCP
| Método | Ruta | Descripción | Respuesta |
|---|---|---|---|
GET | /lsp | Obtener estado del servidor LSP | LSPStatus[] |
GET | /formatter | Obtener estado del formateador | FormatterStatus[] |
GET | /mcp | Obtener estado del servidor MCP | { [name: string]: MCPStatus } |
POST | /mcp | Añadir servidor MCP dinámicamente | cuerpo: { name, config }, devuelve objeto de estado MCP |
Agentes
| Método | Ruta | Descripción | Respuesta |
|---|---|---|---|
GET | /agent | Listar todos los agentes disponibles | Agent[] |
Registro
| Método | Ruta | Descripción | Respuesta |
|---|---|---|---|
POST | /log | Escribir entrada de registro. Cuerpo: { service, level, message, extra? } | boolean |
Autenticación
| Método | Ruta | Descripción | Respuesta |
|---|---|---|---|
PUT | /auth/:id | Establecer credenciales de autenticación para el destino dado. | boolean |
Eventos
| Método | Ruta | Descripción | Respuesta |
|---|---|---|---|
GET | /event | Flujo de eventos enviados por el servidor. El primer evento es server.connected, luego eventos del bus | Flujo de eventos enviados por el servidor |
Documentación
| Método | Ruta | Descripción | Respuesta |
|---|---|---|---|
GET | /doc | Especificación OpenAPI 3.1 | Página HTML con especificación OpenAPI |