Resource map
Find client namespaces, their daemon routes, and the raw request escape hatch.
Resource map
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.
| Namespace | Methods | Routes |
|---|---|---|
| nodes | create, retrieve, list, update, cancel, interrupt, message, outcome, waitForOutcome, createAndWait, parse, stream, events, fork, revive, reviveAll, promote, demote, recycle, yield, wait, relaunchRoot | /v1/nodes… |
| nodes.reports | list | /v1/nodes/{id}/reports |
| nodes.jobs | list, cancel | /v1/nodes/{id}/jobs |
| nodes.worktree | close, abandon | /v1/nodes/{id}/worktree/… |
| nodes.result | submit | POST /v1/nodes/{id}/result |
| profiles | ensure, retrieve | /v1/profiles… |
| auth | status | GET /v1/status, then GET /v1/model-auth/readiness once the daemon is ready |
| system | status, health | /v1/status, /healthz |
| files | read, write, list | /v1/files/peek, /v1/files/write, /v1/files/list |
| bash | run | /v1/bash |
| canvas | attention, attentionCounts, snapshot, roster, dashboard, prune | /v1/canvas… and composed node/status requests for dashboard |
| canvas.history | search, grep, read, stats | /v1/canvas/history/… |
| crons | create, retrieve, list, pause, resume, run, delete, poke | /v1/crons… |
| human.requests | create, retrieve, replace, respond, dismiss, cancel | /v1/human/requests… |
| human.inbox | list, retrieve, respond, progress, cancel, history, response | /v1/human/inbox… |
| models.credentials | list, install, remove | /v1/model-auth… |
| models.config | update | PUT /v1/model-config |
| memory | list, retrieve, create, update, delete, move, search, history, resolve | /v1/memory…; see Memory |
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.
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().
| Routes | Why |
|---|---|
| /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/acknowledge | These 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}/attach | Returns 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 faults | The 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.