Dispach
Guides

TypeScript client

The published dispach package includes a typed client with no terminal UI import on its client path.

Install and connect

npm install dispach
import { createClient } from "dispach/client"

const client = createClient({
  baseUrl: "http://localhost:7420",
  token: process.env.DISPACH_API_TOKEN,
})

const agent = client.agent("milo")

Send and render text

const turn = await agent.send("Summarize today's incidents", {
  idempotencyKey: crypto.randomUUID(),
})

for await (const token of turn.tokens()) {
  process.stdout.write(token)
}

send() resolves when the server accepts the turn. Dropping the iterator does not cancel it.

Persist turn.turnId when work must survive a process or page reload:

const text = await agent.turn(savedTurnId).text()

Handle the complete stream

Use stream() when the application needs tools, approvals, replay state, or lifecycle events:

for await (const item of turn.stream({ chunks: true })) {
  switch (item.kind) {
    case "replay":
      if (item.report.truncated) console.warn("early events are unavailable")
      break
    case "event":
      if (item.event.type === "tool.call") console.log(item.event.data.slug)
      break
    case "ended":
      console.log(item.status)
      break
    case "unavailable":
      console.log(await turn.get())
      break
  }
}

tokens() refuses a truncated replay by default because concatenating it would produce incomplete text without an obvious error. Use the full stream report before deliberately accepting a fragment.

The package guide at packages/client/README.md covers approvals, scoped keys, sessions, errors, and server-wide event streams.

On this page