crouter
SDK

Resource map

Find client namespaces, their daemon routes, and the raw request escape hatch.

Every namespace exported by the client. Namespaces are camelCase. Verbs are create, retrieve, list, update, delete, and cancel, except where the product already has a literal name for the action (fork, revive, promote, pause, poke) — in which case the SDK uses that name.

NamespaceMethodsRoutes
nodescreate, retrieve, list, update, cancel, interrupt, message, outcome, waitForOutcome, createAndWait, parse, stream, events, fork, revive, reviveAll, promote, demote, recycle, yield, wait, relaunchRoot/v1/nodes…
nodes.reportslist/v1/nodes/{id}/reports
nodes.jobslist, cancel/v1/nodes/{id}/jobs
nodes.worktreeclose, abandon/v1/nodes/{id}/worktree/…
nodes.resultsubmitPOST /v1/nodes/{id}/result
profilesensure, retrieve/v1/profiles…
authstatusGET /v1/status, then GET /v1/model-auth/readiness once the daemon is ready
systemstatus, health/v1/status, /healthz
filesread, write, list/v1/files/peek, /v1/files/write, /v1/files/list
bashrun/v1/bash
canvasattention, attentionCounts, snapshot, roster, dashboard, prune/v1/canvas… and composed node/status requests for dashboard
canvas.historysearch, grep, read, stats/v1/canvas/history/…
cronscreate, retrieve, list, pause, resume, run, delete, poke/v1/crons…
human.requestscreate, retrieve, replace, respond, dismiss, cancel/v1/human/requests…
human.inboxlist, retrieve, respond, progress, cancel, history, response/v1/human/inbox…
models.credentialslist, install, remove/v1/model-auth…
models.configupdatePUT /v1/model-config
customObjectsregister, publish, unregister, ack, receive/v1/custom-objects…
memorylist, listAll, getGET /v1/memory, GET /v1/memory/document
runsstart, get, list, listAll, message, interrupt, cancel, delete, rename, trace, events, reply, stream, wait, parse/v1/runs…
uploadscreatePOST /v1/uploads
attachmentslinkGET /v1/attachments/link
sharescreate, list, delete/v1/shares…
questionsget, answer/v1/questions/{id}…
providerstools, call/v1/providers/tools, POST /v1/provider/call
grantgetGET /v1/grant
healthgetGET /v1/health

runs, uploads, attachments, shares, questions and the app side of grant and providers are the application-facing API an app reaches through the app listener; see Apps on crouter cloud and Apps with many users. memory is the person's public documents (Memory). system.health (/healthz) is the daemon's liveness check; health.get is the app listener's.

Action methods keep the product's literal name (fork, revive, promote, yield) rather than being renamed into a generic verb. Every request-capable method takes RequestOptions as its final argument after its path, body, or query arguments. RequestOptions is { headers?, signal?, timeout?, maxRetries? }; stream event options exclude timeout and add after.

Custom objects

client.customObjects registers an external service or script as an object on the canvas, with a declared event catalog and a queue, URL or argv receiver, and publishes its events to the objects watching it. register(body) returns the object and, once, its publish token; publish(ref, body) sends one declared event (a custom object may publish with that token alone); receive(ref, { after?, signal? }) is an async iterator over a queue receiver's deliveries and replays every unacknowledged delivery on each connect; ack(ref, deliveryIds) acknowledges them; unregister(ref) deletes the object. The same objects are managed from a terminal with crtr custom-object and watched with crtr canvas watch.

Files and bash

client.files reads through GET /v1/files/peek, atomically writes, and lists absolute host paths. Reads and lists report truncated; writes over 1 MiB are refused instead of truncated. client.bash runs one command in a required absolute working directory and returns non-zero exits as values.

Canvas

client.canvas.attention(), attentionCounts(body), snapshot(), roster(), and prune(body) each send their matching canvas route. dashboard(query?) composes GET /v1/nodes and GET /v1/status, because the daemon deliberately has no dashboard route. client.canvas.history.search(body), grep(body), read(query), and stats(body) wrap the four history routes.

Crons

client.crons.create(body), retrieve(id, query?), list(query?), pause(id, query?), resume(id, query?), run(id, query?), delete(id, query?), and poke() retain the daemon's cron DTOs and snake_case query fields. delete is the SDK verb for the daemon's DELETE /v1/crons/{id} route.

Human requests and inbox

client.human.requests exposes create, retrieve, replace, respond, dismiss, and cancel. client.human.inbox exposes list, retrieve, respond, progress, cancel, history, and response. The inbox methods preserve the page protocol's nested camelCase fields and the daemon envelope's snake_case fields.

Models

client.models.credentials.list(), install(provider, body), and remove(provider) wrap /v1/model-auth. client.models.config.update(body) sends PUT /v1/model-config. Credential material is accepted only by install; list responses remain sanitized daemon DTOs.

Identifier validation

Methods with node, cron, bash-job, human-request, inbox-ticket, provider, or profile identifiers validate them before calling the daemon. Invalid values throw TypeError locally and send no request. This applies to node action methods and nested node resources, cron methods that take an id, human.requests methods that take an id, human.inbox methods that take a ticket id, models.credentials.install and remove, and profile ensure and retrieve. File paths are not subject to this identifier check; the daemon validates their absolute-path contract.

Excluded from the typed surface

These /v1 routes get no SDK method, with the reason. They are still reachable through client.request().

RoutesWhy
/v1/focuses…A focus maps a node to a tmux pane. An SDK caller has no tmux. It stays on /v1 for the viewer.
POST /v1/nodes/{id}/mail/claim, …/mail/acknowledgeThese are how a node's own broker takes delivery of its inbox. An external caller claiming another node's mail would consume deliveries that node then never sees.
POST /v1/nodes/{id}/attachReturns the host-local path to a broker's viewer socket. A remote or browser caller cannot open that path, and Streaming is the application-facing way to watch a node.
Broker operations, broker recovery, node faultsThe broker's own control plane — session binding, settle directives, park completion, turn recording, provider-retry mutation, fault recording, model commit. They exist so the one process hosting a node can coordinate with crtrd about that node's runtime. An external caller invoking them introduces a second writer to state the broker and the daemon coordinate between themselves.

The escape hatch

Nothing on /v1 is unreachable. A route that is excluded above, or one added to the daemon after this SDK version was published, is reachable directly:

client.request(method, path, body?, options?)

It carries the same authentication, the same retry policy, and the same error mapping as every generated method — it is untyped, not unsupported.

const focuses = await client.request<FocusDTO[]>('GET', '/v1/focuses');

await client.request('POST', `/v1/nodes/${id}/some-new-route`, { field: 'value' }, { timeout: 5_000 });

If you find yourself reaching for client.request() for something an application genuinely needs, that route belongs in the table above. Say so rather than building on the escape hatch.

On this page