RPC method families for device pairing and device tokens, node pairing and invoke, approvals, Control UI commands, and automation, skills, and tools.

Device pairing and device tokens

The setup code embeds a short-lived bootstrap credential. Clients must not log or persist it beyond the pairing flow.

Pairing-scoped clients receive device.pair.setup.completed only after the exact setup handoff has delivered its credentials. Its payload is { setupId, deviceId, deviceName?, access, ts }; it never includes the bootstrap credential or token-derived identifiers.

If the response closes before delivery can be confirmed, the gateway keeps the bearer retired and emits device.pair.setup.deliveryUncertain instead of success. The presenting client should offer the operator a path to inspect or remove the paired device and generate a new setup code.

The gateway records an uncertain outcome when it consumes the bearer, then promotes it to completion only after response delivery finishes. Operator event frames are best effort and drop for slow subscribers rather than closing their socket. A client that displayed a setup code must therefore call device.pair.setupStatus before presenting the code as expired. Outcomes are retained past the credential's own expiry.

Node pairing, invoke, and pending work

Approval families

Approval lookup, history, waits, and resolution retain their original device and account authority while storage work is pending. Disconnecting the socket alone does not cancel an admitted request. Revoking that authority before commit admission prevents the verdict and withholds approval details; the pending approval remains available to another authorized reviewer. A verdict that already committed remains recorded and settles its waiting action. Resolution replies do not wait for best-effort channel or push notifications after the decision is recorded. A slow or failed notification cannot reopen the approval or delay acknowledgement of its verdict.

exec.approvals.get accepts optional expectedOwnerId; exec.approvals.set accepts file, optional baseHash, and optional expectedOwnerId. Existing snapshots require the hash returned by get; a stale or missing hash refuses the save. For an absent snapshot, an omitted hash is accepted, but a supplied hash must match. The default local CLI always carries its observed hash. Both methods return the existing redacted snapshot (path, exists, hash, file) plus resolvedDefaults; omitted socket defaults retain their existing merge behavior.

Default local CLI reads and writes negotiate their separate owner capabilities and send expectedOwnerId. Reading participates because it can initialize missing state. Existing RPC clients may omit the owner field; explicit Gateway and node targets retain their current transport and response contracts. This changes no exec policy, standing-grant, or execution-authorization semantics.

Control UI commands

Automation, skills, and tools