Talk and TTS
talk.catalogreturns the read-only Talk provider catalog for speech, streaming transcription, and realtime voice: canonical provider ids, registry aliases, labels, configured state, an optional group-levelreadyresult, exposed model/voice ids, canonical modes, transports, brain strategies, and realtime audio/capability flags, without returning provider secrets or mutating global config. Current gateways setreadyafter applying runtime provider selection; treat its absence as unverified on older gateways.talk.configreturns the effective Talk config payload;includeSecretsrequiresoperator.talk.secrets(oroperator.admin).talk.session.create(operator.talk) creates a gateway-owned Talk session forrealtime/gateway-relay,transcription/gateway-relay, orstt-tts/managed-room. Forstt-tts/managed-room, non-admin callers that passsessionKeymust also passspawnedByfor scoped session-key visibility; unscopedsessionKeycreation andbrain: "direct-tools"requireoperator.admin.talk.session.appendAudioappends base64 PCM input audio to gateway-owned realtime relay and transcription sessions.talk.session.cancelOutputstops assistant audio output, primarily for VAD-gated barge-in in gateway relay sessions. Send the currenttalk.event.turnId; the result isapplied,stale, oridle.talk.session.submitToolResultcompletes a provider tool call emitted by a gateway-owned realtime relay session. The request waits for any asynchronous completion signal exposed by the provider bridge; failed submissions keep the linked run active and do not emit a successful tool-result event. Passoptions: { willContinue: true }for interim tool output oroptions: { suppressResponse: true }when the provider bridge advertises suppression support and the result should not start another response.talk.session.steersends active-run voice control into a gateway-owned agent-backed Talk session:{ sessionId, text, mode? }, wheremodeisstatus,steer,cancel, orfollowup; omitted mode is classified from the spoken text. It selects only work bound to that logical voice call, not another call sharing the connection and agent session.talk.session.closecloses a gateway-owned relay, transcription, or managed-room session and emits terminal Talk events.talk.modesets/broadcasts the current Talk mode state for WebChat/Control UI clients.talk.client.createcreates or resumes a client-owned realtime provider session usingwebrtcorprovider-websocketwhile the gateway owns credentials, instructions, tool policy, and the returnedvoiceSessionId. Clients passsessionKeyand reusevoiceSessionIdwhen replacing the provider transport during one call. Clients that negotiategateway-control-v1keep WebRTC media direct but move the provider control channel and tool lifecycle to the Gateway.talk.client.transcriptappends one finalized{ role, text }item to the normal agent session. The requiredentryIdis idempotent withinvoiceSessionId; retries do not duplicate transcript messages.talk.client.closecloses the logical voice session after pending transcript writes. Closing is idempotent and may deliver a mutation-only call digest to the session’s last non-WebChat channel.talk.client.toolCalllets client-owned realtime transports forward provider tool calls to gateway policy. The first supported tool isopenclaw_agent_consult; clients getrunId,agentId, and canonicalagentSessionKeyand wait for normal chat lifecycle events before submitting the provider-specific tool result. Use the returned target forchat.abortandchat.history; keep the original key for voice-session requests. Voice-bound high-impact actions returnVOICE_CONFIRMATION_REQUIRED:<id>until a later finalized user utterance explicitly confirms that exact final execution action and the next consult supplies theconfirmationId; policy or hook rewrites require confirmation again.talk.client.steersends session-scoped active-run voice control for client-owned realtime transports. The gateway resolves owned active work fromsessionKey, without a voice call ID, and returns a structured accepted/rejected result instead of silently dropping steering. Provider-attached Gateway controls are call-scoped instead.talk.eventis the single Talk event channel for realtime, transcription, STT/TTS, managed-room, telephony, and meeting adapters.talk.speaksynthesizes speech through the active Talk speech provider.tts.statusreturns TTS enabled state, active provider, fallback providers, and provider config state.tts.providersreturns the visible TTS provider inventory.tts.enableandtts.disabletoggle TTS prefs state.tts.setProviderupdates the preferred TTS provider.tts.convertruns one-shot text-to-speech conversion.tts.speak(operator.write) renders non-emptytextwith the configured general TTS provider chain and returns one whole clip inline asaudioBase64, plusproviderand optionaloutputFormat,mimeType, andfileExtensionmetadata. Unliketts.convert, it does not return a Gateway-local path; unliketalk.speak, it does not require a Talk provider. Text abovetts.maxTextLengthreturnsINVALID_REQUEST; synthesis failures returnUNAVAILABLE.
Secrets, config, update, and wizard
secrets.reloadre-resolves active SecretRefs and atomically publishes owner-aware runtime state. Eligible owner failures can publish as cold or stale degradation withwarningCount; strict or unmapped failures reject the reload and preserve the active snapshot.secrets.resolveresolves command-target secret assignments for a specific command/target set.secrets.store.list(operator.admin) returns team-scoped metadata and values only forkind: "env"entries.kind: "secret"entries use a distinct result shape with no value field; there is no reveal method.secrets.store.setandsecrets.store.delete(operator.admin) create/update or soft-delete one team-scoped entry. After a successful write, the Gateway refreshes the active secrets runtime only when the name is referenced by astoreSecretRef in the active source config.config.getreturns the current on-disk config snapshot, raw root-filehash, resolvedconfigRevisionHash, and optionalappliedConfigHashfor the resolved revision accepted by the active Gateway runtime.config.setwrites a validated config payload.config.patchmerges a partial config update. Destructive array replacement requires the affected path inreplacePaths; nested arrays under array entries use[]paths such asagents.entries.*.skills.config.applyvalidates + replaces the full config payload.config.schemareturns the live config schema payload used by Control UI and CLI tooling: schema,uiHints, version, generation metadata, plugin + channel schema metadata when loadable. It includestitle/descriptionmetadata from the same labels/help text as the UI, including nested object, wildcard, array-item, andanyOf/oneOf/allOfcomposition branches when matching field documentation exists.config.schema.lookupreturns a path-scoped lookup payload for one config path: normalized path, a shallow schema node, matched hint +hintPath, optionalreloadKind, and immediate child summaries for UI/CLI drill-down.reloadKindis one ofrestart,hot, ornone(src/config/schema.ts) and mirrors the gateway config reload planner for the requested path. Lookup schema nodes keep the user-facing docs and common validation fields (title,description,type,enum,const,format,pattern, numeric/string/array/object bounds,additionalProperties,deprecated,readOnly,writeOnly). Child summaries exposekey, normalizedpath,type,required,hasChildren, optionalreloadKind, plus the matchedhint/hintPath.update.runruns the gateway update flow and schedules a restart only if the update succeeded; callers with a session can includecontinuationMessageso startup resumes one follow-up agent turn through the restart continuation queue. Package-manager updates and supervised git-checkout updates from the control plane use a detached managed-service handoff instead of replacing the package tree or mutating checkout/build output inside the live gateway. A started handoff returnsok: truewithresult.reason: "managed-service-handoff-started"andhandoff.status: "started". A second concurrentupdate.runhandled by the same Gateway process returnsok: falsewithresult.reason: "managed-service-handoff-already-running"andhandoff.status: "already-running"; its continuation is not accepted, so the caller can retry after the active update completes. Standalone CLI updaters and replacement Gateway processes are outside this process-local guard. Unavailable or failed handoffs returnok: falsewithmanaged-service-handoff-unavailableormanaged-service-handoff-failed, plushandoff.commandwhen a manual shell update is required. Unavailable means OpenClaw lacks a safe supervisor boundary or durable service identity, such asOPENCLAW_SYSTEMD_UNITfor systemd. During a started handoff, the restart sentinel may briefly reportstats.reason: "restart-health-pending"; the continuation is delayed until the CLI verifies the restarted gateway and writes the finaloksentinel.update.statusrefreshes and returns the latest update restart sentinel, including the post-restart running version when available.wizard.start,wizard.next,wizard.status, andwizard.cancelexpose the onboarding wizard over WS RPC.
Agent and workspace helpers
agents.listreturns gateway-visible agent entries, including effective model/runtime metadata and optional semantickind(agentorsystem). Entries with recorded creation provenance also includecreatedVia(operator,agent, orclaw), nullablecreatorAgentId, and millisecondcreatedAt; entries without provenance omit those fields. Clients advertise theagent-kindhandshake capability to receive the complete typed roster; clients without it keep the legacy selector-safe roster without system rows. Kind-aware clients excludesystemrows from ordinary selectors while retaining them in diagnostic views. Older v4 gateways may return rows withoutkind.agents.create,agents.update, andagents.deletemanage agent records and workspace wiring.claws.monitors(operator.admin, rate-limited as a control-plane write for all phases) supports Claw removal. Every request includesbinding: { configPath, statePath, cronStorePath }for the local profile, checked against the serving owner.{ phase: "inspect", agentId, binding }returns at most two corroborated config-owned monitor snapshots, each withid,name,enabled,agentId, nullownerAgentId,storeKey,declarationKey, andrevision.{ phase: "quiesce", agentId, operationId, monitors, binding }validates the current deletion journal and exact consented snapshots before cancelling scheduled work.{ phase: "drain", agentId, operationId, binding }also requires applied agent removal and monitor convergence. Successful quiescence or drainage returns{ drained: true }; incomplete drainage returnsUNAVAILABLEafter a five-second wait. The operation id must match the live journal in the serving Gateway’s state; it is not standalone cleanup authority. Extra request fields are rejected.agents.files.list,agents.files.get, andagents.files.setmanage the bootstrap workspace files exposed for an agent.agents.files.getandagents.files.setreturn the file’s contenthash(SHA-256 hex of the on-disk bytes, the same tokensessions.files.setuses).agents.files.setaccepts an optionalexpectedHash; when the file’s current hash differs, the write is refused with anINVALID_REQUESTerror whosedetails.typeisagent_file_conflictand whosedetails.currentHashcarries the hash to re-read and rebase against. OmittingexpectedHashkeeps the unconditional overwrite.audit.activity.listreturns the versioned metadata-only activity ledger;audit.run.inspectdiscovers execution ids or inspects one exact execution identity context;audit.listremains the compatibility-safe run/tool RPC.agents.workspace.listandagents.workspace.get(operator.read) expose read-only, paginated browsing of an agent’s workspace directory for clients in the trusted operator domain described in Operator scopes. Requests accept workspace-relative paths only; reads stay confined to the realpathed workspace root (symlink and hardlink escapes rejected), size-capped, and limited to UTF-8 text plus common image types (base64). Responses do not expose the host workspace path. There are no write operations in this namespace.transcripts.list(operator.read) lists durable meeting captures newest first. Optionallimitaccepts 1–200 (default 50);providerIdfilters the source. Thesessionsresult includes selectors, provider/source locators, times, active state, utterance counts, participants, summary availability, optional model/heuristic provenance, and an overview preview capped at 280 characters. Source locators expose onlyproviderId,accountId,guildId,channelId, andmeetingUrl, never free-form metadata.transcripts.get(operator.read) acceptsselectorand optionalincludeUtterances. It returns the session and stored summary, including its canonical Markdown; requested utterances are sanitized and bounded by the capture limit of 2,000. Missing summaries omitsummaryrather than generating notes. Both transcript methods read across one trusted Gateway domain, likeagents.workspace.*; separate domains are required for reader isolation. They do not export files or change capture state. See Transcripts CLI.tasks.list,tasks.get, andtasks.cancelexpose the gateway task ledger to SDK and operator clients. See Task ledger RPCs.artifacts.list,artifacts.get, andartifacts.downloadexpose transcript-derived artifact summaries and downloads for an explicitsessionKey,runId, ortaskIdscope. Run and task queries resolve the owning session server-side and only return transcript media with matching provenance; unsafe or local URL sources return unsupported downloads instead of fetching server-side.environments.listandenvironments.status(operator.read) remain available without cloud-worker profiles and preserve gateway-local and node environment discovery.environments.listalso accepts an optionalruntimeIdfrom callers withoperator.write. That request adds one Gateway-ownedrequiredNodeCommandresult to each connected node when the runtime requires a node command. Its closed state isinvocable,pending-approval,undeclared, orunauthorized; it never exposes the node’s full pending declaration. Node environments include the durablesessionHostidentity used to keep a known offline host visible, while current connected inventory is authoritative over that history. Missing identity means false. Exact bounded{ total, available }worker slots are live-only and omitted offline; worker-turn admission consumes a slot, while node-backed remote-exec does not. Configured profile summaries expose their bounded, canonically orderedexecutionModesarray plus the existing singularexecutionModeprimary/default display projection. Current clients select profiles only by membership inexecutionModes. Configured cloud workers and durable records left by earlier profiles addworkermetadata withproviderId, optionalleaseId,state,ageMs, optionalidleMs, andattachedSessionIds. Worker lifecycle states arerequested,provisioning,bootstrapping,ready,attached,idle,draining,destroying,destroyed,failed, andorphaned. A connected node may also includeworkerBundle: { status: "installed", version }orworkerBundle: { status: "missing" }. This optional observation is reconnect-scoped and reports validation of one Gateway-retained bundle; it is not launch authority. The public result never exposes the bundle hash, Gateway namespace, node filesystem path, receipt, or protocol-feature details.environments.create({ profileId, idempotencyKey }) provisions an environment from a configured plugin provider profile; retries with the same key reuse the durable operation. Direct creation without a session does not select an execution mode, so the provider uses its intentional default; Crabbox preparesworker-turn.environments.destroy({ environmentId }) requests idempotent teardown of a durable worker environment. Both requireoperator.admin, are control-plane writes, and return the same environment summary shape used by status responses.worker.desktop.observe({ environmentId, control? },operator.admin) starts or reuses the environment’s desktop forward and returns{ transport, wsPath, expiresAtMs, control, vncPassword? }.wsPathcarries a single-use 60-second token for the Gateway’s desktop observer WebSocket; reconnecting requires a fresh observe call. Environments with an observable desktop advertiseworker.desktop: trueinenvironments.list. The method is advertised only when thecloudWorkers.desktoplab is enabled. See Cloud workers.agent.identity.getreturns the effective assistant identity for an agent or session.agent.waitwaits for a run to finish and returns the terminal snapshot when available.