Servidor
Interaja com o servidor dropstone via HTTP.
O comando dropstone serve executa um servidor HTTP headless que expõe um endpoint OpenAPI que um cliente Dropstone pode usar.
Uso
dropstone serve [--port <number>] [--hostname <string>] [--cors <origin>]
Opções
| Bandeira | Descrição | Padrão |
|---|---|---|
--port | Porta para escutar | 4096 |
--hostname | Hostname para escutar | 127.0.0.1 |
--mdns | Ativar descoberta mDNS | false |
--mdns-domain | Nome de domínio personalizado para o serviço mDNS | dropstone.local |
--cors | Origens de navegador adicionais a permitir | [] |
--cors pode ser passado várias vezes:
dropstone serve --cors http://localhost:5173 --cors https://app.example.com
Autenticação
Defina DROPSTONE_SERVER_PASSWORD para proteger o servidor com autenticação básica HTTP. O nome de usuário padrão é dropstone, ou defina DROPSTONE_SERVER_USERNAME para substituí-lo. Isso se aplica tanto a dropstone serve quanto a dropstone web.
DROPSTONE_SERVER_PASSWORD=sua-senha dropstone serve
Credenciais do agente
DROPSTONE_SERVER_PASSWORD protege o próprio servidor. Ele não informa ao agente como alcançar o Dropstone. Em uma máquina não supervisionada, não há uma conta conectada para herdar, então passe uma chave de API através da configuração do provedor:
{
"provider": {
"dropstone": {
"options": {
"apiKey": "dsk_live_...",
"baseURL": "https://api.dropstone.io/api/v1"
}
}
}
}
baseURL é importante. As chaves de API são aceitas em /api/v1, não em /v1, e uma chave enviada para /v1 é rejeitada com 403 Invalid token format. Please log in again. Defina isso aqui em vez de usar DROPSTONE_BASE_URL, que também é usado para construir os endpoints de conta, uso e memória e os quebrará se você apontá-lo para um caminho versionado.
Gere uma chave em dropstone.io/dashboard/settings.
Note
O agente build padrão pergunta antes de cada chamada de ferramenta. Nada aqui pode responder a esse prompt, então a solicitação fica pendurada em vez de falhar. Envie "agent": "accept all" ou defina uma lista de permissões explícita. Consulte Permissões.
Enviando um prompt
POST /session/:id/message requer tanto agent quanto model. Omitir model não resolve nenhum padrão: o turno retorna 200 com um corpo vazio e nada é executado.
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": "Adicione tratamento de erros a src/index.ts" }]
}'
Um turno que falha ainda retorna 200. O motivo está em data.info.error, não no nível de transporte, então verifique esse campo em vez de confiar no código de status.
Como funciona
dropstone serve expõe os recursos do Dropstone através de um endpoint HTTP OpenAPI 3.1. O mesmo endpoint é usado para gerar o SDK.
Use o servidor quando quiser controlar o Dropstone programaticamente: a partir de um script, um pipeline de CI ou uma integração própria. A sessão interativa e o servidor são independentes. Executar dropstone serve inicia um novo servidor autônomo, independentemente de você ter uma sessão interativa aberta.
Você pode substituir o endereço de bind com as bandeiras --hostname e --port.
Spec
O servidor publica uma spec OpenAPI 3.1 que pode ser visualizada em:
http://<hostname>:<port>/doc
Por exemplo, http://localhost:4096/doc. Use a spec para gerar clientes ou inspecionar tipos de solicitação e resposta. Ou visualize-a em um explorador Swagger.
APIs
O servidor dropstone expõe as seguintes APIs.
Global
| Método | Caminho | Descrição | Resposta |
|---|---|---|---|
GET | /global/health | Obter saúde e versão do servidor | { healthy: true, version: string } |
GET | /global/event | Obter eventos globais (stream SSE) | Stream de eventos |
Projeto
| Método | Caminho | Descrição | Resposta |
|---|---|---|---|
GET | /project | Listar todos os projetos | Project[] |
GET | /project/current | Obter o projeto atual | Project |
Caminho e VCS
| Método | Caminho | Descrição | Resposta |
|---|---|---|---|
GET | /path | Obter o caminho atual | Path |
GET | /vcs | Obter informações de VCS para o projeto atual | VcsInfo |
Config
| Método | Caminho | Descrição | Resposta |
|---|---|---|---|
GET | /config | Obter informações de config | Config |
PATCH | /config | Atualizar config | Config |
Sessões
| Método | Caminho | Descrição | Notas |
|---|---|---|---|
GET | /session | Listar todas as sessões | Retorna Session[] |
POST | /session | Criar uma nova sessão | corpo: { parentID?, title? }, retorna Session |
GET | /session/status | Obter status da sessão para todas as sessões | Retorna { [sessionID: string]: SessionStatus } |
GET | /session/:id | Obter detalhes da sessão | Retorna Session |
DELETE | /session/:id | Excluir uma sessão e todos os seus dados | Retorna boolean |
PATCH | /session/:id | Atualizar propriedades da sessão | corpo: { title? }, retorna Session |
GET | /session/:id/children | Obter sessões filhas de uma sessão | Retorna Session[] |
GET | /session/:id/todo | Obter a lista de tarefas de uma sessão | Retorna Todo[] |
POST | /session/:id/init | Analisar aplicativo e criar AGENTS.md | corpo: { messageID, providerID, modelID }, retorna boolean |
POST | /session/:id/fork | Bifurcar uma sessão existente em uma mensagem | corpo: { messageID? }, retorna Session |
POST | /session/:id/abort | Abortar uma sessão em execução | Retorna boolean |
GET | /session/:id/diff | Obter o diff desta sessão | consulta: messageID?, retorna FileDiff[] |
POST | /session/:id/summarize | Resumir a sessão | corpo: { providerID, modelID }, retorna boolean |
POST | /session/:id/revert | Reverter uma mensagem | corpo: { messageID, partID? }, retorna boolean |
POST | /session/:id/unrevert | Restaurar todas as mensagens revertidas | Retorna boolean |
POST | /session/:id/permissions/:permissionID | Responder a uma solicitação de permissão | corpo: { response, remember? }, retorna boolean |
Mensagens
| Método | Caminho | Descrição | Notas |
|---|---|---|---|
GET | /session/:id/message | Listar mensagens em uma sessão | consulta: limit?, retorna { info: Message, parts: Part[]}[] |
POST | /session/:id/message | Enviar uma mensagem e aguardar resposta | corpo: { messageID?, model?, agent?, noReply?, system?, tools?, parts }, retorna { info: Message, parts: Part[]} |
GET | /session/:id/message/:messageID | Obter detalhes da mensagem | Retorna { info: Message, parts: Part[]} |
POST | /session/:id/prompt_async | Enviar uma mensagem assincronamente (sem espera) | corpo: igual a /session/:id/message, retorna 204 No Content |
POST | /session/:id/command | Executar um comando de barra | corpo: { messageID?, agent?, model?, command, arguments }, retorna { info: Message, parts: Part[]} |
POST | /session/:id/shell | Executar um comando de shell | corpo: { agent, model?, command }, retorna { info: Message, parts: Part[]} |
Comandos
| Método | Caminho | Descrição | Resposta |
|---|---|---|---|
GET | /command | Listar todos os comandos | Command[] |
Arquivos
| Método | Caminho | Descrição | Resposta |
|---|---|---|---|
GET | /find?pattern=<pat> | Pesquisar texto em arquivos | Matriz de objetos de correspondência com path, lines, line_number, absolute_offset, submatches |
GET | /find/file?query=<q> | Encontrar arquivos e diretórios por nome | string[] (caminhos) |
GET | /find/symbol?query=<q> | Encontrar símbolos do workspace | Symbol[] |
GET | /file?path=<path> | Listar arquivos e diretórios | FileNode[] |
GET | /file/content?path=<p> | Ler um arquivo | FileContent |
GET | /file/status | Obter status de arquivos rastreados | File[] |
Parâmetros de consulta de /find/file
query(obrigatório): string de pesquisa (correspondência difusa)type(opcional): limitar resultados a"file"ou"directory"directory(opcional): substituir a raiz do projeto para a pesquisalimit(opcional): máximo de resultados (1–200)dirs(opcional): bandeira legada ("false"retorna apenas arquivos)
LSP, Formatadores e MCP
| Método | Caminho | Descrição | Resposta |
|---|---|---|---|
GET | /lsp | Obter status do servidor LSP | LSPStatus[] |
GET | /formatter | Obter status do formatador | FormatterStatus[] |
GET | /mcp | Obter status do servidor MCP | { [name: string]: MCPStatus } |
POST | /mcp | Adicionar servidor MCP dinamicamente | corpo: { name, config }, retorna objeto de status MCP |
Agentes
| Método | Caminho | Descrição | Resposta |
|---|---|---|---|
GET | /agent | Listar todos os agentes disponíveis | Agent[] |
Registro
| Método | Caminho | Descrição | Resposta |
|---|---|---|---|
POST | /log | Escrever entrada de registro. Corpo: { service, level, message, extra? } | boolean |
Autenticação
| Método | Caminho | Descrição | Resposta |
|---|---|---|---|
PUT | /auth/:id | Definir credenciais de autenticação para o alvo fornecido. | boolean |
Eventos
| Método | Caminho | Descrição | Resposta |
|---|---|---|---|
GET | /event | Stream de eventos enviados pelo servidor. O primeiro evento é server.connected, depois eventos de barramento | Stream de eventos enviados pelo servidor |
Documentos
| Método | Caminho | Descrição | Resposta |
|---|---|---|---|
GET | /doc | Especificação OpenAPI 3.1 | Página HTML com spec OpenAPI |