02. Cliente JavaScript¶
🎯 Objetivo¶
Usar @opencode/client para conectar uma aplicação ao servidor OpenCode pela rede, com tipos gerados e streaming de eventos.
📋 Instalar e criar¶
bun add @opencode/client
import { OpenCode } from "@opencode/client"
const client = OpenCode.make({ baseUrl: "http://localhost:4096" })
const session = await client.session.create({ location: { directory: "/workspace" } })
await client.session.prompt({ sessionID: session.id, text: "Revise as mudanças atuais" })
🔐 Headers e requisições¶
const client = OpenCode.make({
baseUrl: "https://opencode.example.com",
headers: { authorization: `Bearer ${process.env.OPENCODE_TOKEN}` },
})
await client.session.list(undefined, { signal: AbortSignal.timeout(10_000) })
Cada operação aceita opções (último argumento) para AbortSignal ou headers por requisição.
📡 Streaming de eventos¶
for await (const event of client.event.subscribe()) {
console.log(event.type)
}
- Uma conexão lazy por cliente, compartilhada entre assinantes
- Sem replay/reconexão automática: assine de novo após recuperação
- O último assinante a sair fecha a conexão
🔌 RPC de plugins¶
Importe o contrato compartilhado e passe para client.rpc:
import { OpenCode } from "@opencode/client"
import { Acme } from "opencode-acme-plugin/rpc"
const acme = client.rpc(Acme)
const result = await acme.search({ query: "hello" })
const off = acme.events.on("updated", (event) => console.log(event.data.text))
Qualquer cliente HTTP também pode chamar POST /api/rpc/{rpcID}/{method} com { "input": ... }.
🧩 Serviço de fundo local (Node)¶
Do entrypoint nativo @opencode/client/service:
import { OpenCode } from "@opencode/client"
import { Service } from "@opencode/client/service"
const endpoint = await Service.ensure() // descobre ou inicia
const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })
const info = await client.server.info()
Service.discover()— só descobre, sem iniciarService.ensure()— retorna serviço compatível (inicia se preciso)Service.stop()— para a instância registrada
❓ Desafio prático¶
- Crie um cliente, crie uma sessão e envie um prompt
- Assine
client.event.subscribe()e logue os tipos de evento - Chame um RPC de plugin de outro processo
- Use
Service.ensure()num script Node e façaserver.info()
💡 Exemplo¶
Veja exemplos/client.ts — cria sessão, envia prompt, assina eventos e usa Service.ensure().
📚 Fonte oficial¶
Próximo passo: Aula 03 — SDK, Effect e Cloudflare · Voltar ao módulo