Most UIs should not touch this. Reach for the React bindings in
/reference/gateway-react, which hold one client
for you and expose live hooks. Drop down to the client only for non-React hosts,
custom transports, or scripts.smithers-orchestrator/gateway-client, not on the bare
smithers-orchestrator facade. Import from the subpath or the build fails.
SmithersGatewayClient
The typed client. Construct it with a base URL (and optional auth token); call a named RPC method, or open a WebSocket and subscribe to a run’s event stream.RPC methods
Each method is a thin typed wrapper overrpc(method, params), which POSTs to
/v1/rpc/<method> and unwraps the response frame. Params and return shapes come
from the method catalog; see /rpc/launch-run for one method
in full.
launchRun, resumeRun, pauseRun, cancelRun, hijackRun, rewindRun.submitApproval, submitSignal, listApprovals.getRun, listRuns, listWorkflows, getNodeOutput, getNodeDiff, getRunDiff,
whatHappened.cronList, cronCreate, cronDelete, cronRun.rpc(method, params, { signal? }) for any typed method, rpcRaw(method, params?, { signal? }) for an untyped one, and extensionRpc(namespace, key, params?) / streamExtension(namespace, key, params?) for gateway extensions.Subscribing to events
connect() opens a SmithersGatewayConnection. The higher-level generators
filter and yield frames for you, so most callers iterate one of those instead of
driving the connection directly.
Subscribes to one run and yields its
run.* frames (run.event,
run.gap_resync, run.heartbeat, run.error). Pass afterSeq to resume.
Closes the socket when iteration ends.Same frames, but reconnects with backoff + jitter on a silent drop and resumes
from the last observed
seq. Stops on terminal completion or abort. Options:
signal, backoff (GatewayBackoffOptions),
healthyAfterMs, and onReconnect(event).Subscribes to a run’s DevTools snapshot stream.
Opens the WebSocket, performs the
connect handshake (protocol + auth), and
returns the live connection. Use this only when you need request/response over
the socket or raw event frames.SmithersGatewayConnection
A single open WebSocket. RPC over the socket viarequest / requestRaw, and a
single in-order async stream of server event frames via events(signal?). One
consumer per connection; the generators above own a connection each.
Typed request/response over the socket.
Untyped request/response over the socket.
In-order server event frames. Ends on close; throws on an error or invalid
frame.
Closes the socket, rejects pending requests, and ends
events().SmithersGatewayClient.ts · SmithersGatewayConnection.ts · Tests SmithersGatewayClient.test.ts · See also /rpc/launch-run, Gateway integration
GatewayRpcError
The error every RPC rejects with on a failed frame or HTTP error. Inspectcode
to branch (for example, requiredScope is set on an authorization failure).
The RPC method that failed (or
"websocket" for a malformed socket frame).Machine-readable error code, e.g.
HTTP_ERROR, INVALID_GATEWAY_RESPONSE, or
the gateway’s own code from the response frame.HTTP status when the failure came over HTTP RPC.
The scope the call needed, on an authorization failure.
Set when the gateway asks the client to refresh credentials.
Extra context attached by the gateway.
GatewayRpcError.ts · Tests gateway-client.test.ts
isGatewayUnavailableError
True when an error means nothing that speaks the gateway protocol answered the URL: a 2xx response whose body is not an{ ok, ... } envelope, or a
fetch-level rejection (connection refused, DNS failure) because nothing is
listening at all. The usual cause is a host app’s SPA fallback serving
index.html for /v1/api/* because no gateway is wired. The data client
throws these with code
GATEWAY_UNAVAILABLE, and the QueryCollection layer already degrades them
quietly: collections settle on the last rows a real gateway served (empty
before the first success), a single session-level console.info notice
replaces the per-collection [QueryCollection] error spam, and the SSE change
stream refuses non-text/event-stream answers so the connection status parks
offline instead of flapping online. Recovery is automatic: the stream’s
reconnect backoff keeps probing, and the reset emitted on a real reconnect
refetches every collection. Branch on it when you call api.* directly and
want the same behavior.
isGatewayUnavailableError.ts · Tests gatewayUnavailableQuietDegrade.test.ts
gatewayBackoffDelay
Exponential backoff with full jitter for one 0-based attempt. The resilient stream uses it internally; call it directly when you write your own reconnect loop.0-based attempt index. The base delay grows by
factor ** attempt, capped at
maxMs.Milliseconds to wait, never negative.
gatewayBackoffDelay.ts · Tests gatewayBackoffDelay.test.ts
createSmithersCollections
Builds the TanStack DB collection registry. Local mode uses the Gateway REST domain API plus/v1/api/stream SSE invalidation. Multiplayer mode uses
Electric shapes from electricBaseUrl for reads and keeps the same domain API
write path.
{ kind: "local", apiBaseUrl, token? } or { kind: "multiplayer", apiBaseUrl, electricBaseUrl, workspaceId, token? }.The TanStack Query client used by QueryCollection and invalidation.
Registry methods include
runs, run, runTree, runEvents, nodes,
approvals, workflows, docs, prompts, scores, tickets,
memoryFacts, and crons, plus connect, invalidate, and close.createSmithersCollections.ts · Tests smithers-collections
createSmithersDataClient
Creates the domain API client that collection mutation handlers call. Reads and writes target/v1/api/*; stream.subscribe opens /v1/api/stream and emits
change, reset, and heartbeat invalidation events.
Workspace mode and auth token.
Fetch override for tests or custom runtimes.
SSE implementation override. When omitted, the client falls back to streaming
fetch.{ mode, api, stream, close }. The api object covers run lifecycle,
approvals, signals, crons, docs, prompts, memory facts, scores, tickets, node
output, node diffs, and schema signatures.Collection keys and row types
smithersCollectionKeys contains the TanStack Query keys used by the registry.
The row types are exported from the same package, including GatewayRunRow,
GatewayRunSummaryRow, GatewayRunEventRow, GatewayRunNode,
GatewayApprovalRow, GatewayWorkflowRow, GatewayCronRow,
GatewayMemoryFactRow, GatewayScoreRow, GatewayTicketRow, and
GatewayPromptRow.
Run-tree helpers remain public for custom inspectors:
flattenGatewayRunNode, snapshotToGatewayRunNode, and
reconcileSnapshotNodes.
Source
index.ts · Tests packages/gateway-client/tests · See also Gateway React API, Gateway integration, /rpc/launch-run