Streams, teleport and tunnels

cua.env.v1 StreamService, PresenceService, TeleportService, TunnelService and VolumeService.

Media sessions (video and audio over the media wire, see libs/cua/proto/MEDIA.md) and presence; the receiving side of teleport (sending lives in the cua SDK), TCP port forwards, the reverse-SOCKS hotspot and the guest mount of Cua Volume. Host Spaces are on Host Spaces.

Source: libs/cua/proto/cua/env/v1/stream.proto, libs/cua/proto/cua/env/v1/presence.proto, libs/cua/proto/cua/env/v1/teleport.proto, libs/cua/proto/cua/env/v1/tunnel.proto, libs/cua/proto/cua/env/v1/volume.proto.

StreamService#

cua.env.v1.StreamService

Control plane for video streaming.

Video never travels over gRPC. This service discovers targets, negotiates codec and limits, and mints a short-lived media ticket. The client then opens the media plane (rcdp wire v2, see libs/cua/proto/MEDIA.md) on the /media WebSocket of the same port, or on direct QUIC, authenticating with the ticket. The ticket is bound to one media session and target and is safe to put in a URL; it is not the root token.

Audio is a first-class track next to video: a media session may carry zero or one video track plus any number of downlink audio tracks (desktop mix or per-app), and optionally one uplink audio track (client microphone into a guest virtual source). All tracks share one media clock; see MEDIA.md §12.

StreamService.ListTargets#

/cua.env.v1.StreamService/ListTargets, unary: ListTargetsRequest to ListTargetsResponse.

Lists streamable targets: one desktop target per display, plus windows.

StreamService.OpenMedia#

/cua.env.v1.StreamService/OpenMedia, unary: OpenMediaRequest to OpenMediaResponse.

Creates a media session for a target and returns how to attach to it.

StreamService.SetPreferences#

/cua.env.v1.StreamService/SetPreferences, unary: SetPreferencesRequest to SetPreferencesResponse.

Changes frame rate, size or bitrate of an open media session.

StreamService.RequestKeyframe#

/cua.env.v1.StreamService/RequestKeyframe, unary: RequestKeyframeRequest to RequestKeyframeResponse.

Asks the encoder for a keyframe (IDR) on the next frame.

StreamService.CloseMedia#

/cua.env.v1.StreamService/CloseMedia, unary: CloseMediaRequest to CloseMediaResponse.

Closes a media session and revokes its ticket.

PresenceService#

cua.env.v1.PresenceService

Multi-user presence: who is looking at the guest and where their cursors are. Agent cursors are published automatically when an agent principal drives ComputerService or cua-driver tools.

Cursor updates are unary (UpdateCursor) so browsers on gRPC-Web can send them; events arrive on the Join server stream.

PresenceService.Join#

/cua.env.v1.PresenceService/Join, server stream: JoinRequest to JoinResponse.

Joins presence and streams events until Leave or disconnect. The first event is PresenceJoined with the caller's participant id and the current roster.

PresenceService.UpdateCursor#

/cua.env.v1.PresenceService/UpdateCursor, unary: UpdateCursorRequest to UpdateCursorResponse.

Publishes the caller's cursor.

PresenceService.Leave#

/cua.env.v1.PresenceService/Leave, unary: LeaveRequest to LeaveResponse.

Leaves presence and ends the caller's Join stream.

TeleportService#

cua.env.v1.TeleportService

Receiving side of "teleport": moving an app session (browser profile cookies and storage, editor state) or a set of files from a user's machine into the guest.

The approval gate (biometric or explicit user consent for sensitive items) lives on the sending side, in the SDK; the guest never pulls. All uploads are unary chunks so browsers on gRPC-Web can send them.

TeleportService.GetManifest#

/cua.env.v1.TeleportService/GetManifest, unary: GetManifestRequest to GetManifestResponse.

Describes what the guest can accept for an app: whether the provider exists, whether the app is installed or running, and which bundle format version to send.

TeleportService.ImportSession#

/cua.env.v1.TeleportService/ImportSession, unary: ImportSessionRequest to ImportSessionResponse.

Uploads an rcdp-app-session bundle in offset-addressed chunks and, on the final chunk, verifies and imports it. Resumable: resend from the returned received_bytes.

TeleportService.BeginReceiveFiles#

/cua.env.v1.TeleportService/BeginReceiveFiles, unary: BeginReceiveFilesRequest to BeginReceiveFilesResponse.

Starts a file transfer into the guest's Downloads folder by declaring its manifest. Entries matching ignore rules are dropped here.

TeleportService.ReceiveFilesChunk#

/cua.env.v1.TeleportService/ReceiveFilesChunk, unary: ReceiveFilesChunkRequest to ReceiveFilesChunkResponse.

Uploads one chunk of one declared file.

TeleportService.CommitReceiveFiles#

/cua.env.v1.TeleportService/CommitReceiveFiles, unary: CommitReceiveFilesRequest to CommitReceiveFilesResponse.

Verifies every file's SHA-256 and publishes the transfer atomically.

TeleportService.AbortReceiveFiles#

/cua.env.v1.TeleportService/AbortReceiveFiles, unary: AbortReceiveFilesRequest to AbortReceiveFilesResponse.

Discards a transfer.

TeleportService.WipeImport#

/cua.env.v1.TeleportService/WipeImport, unary: WipeImportRequest to WipeImportResponse.

Removes what a committed import left in the guest: every file and directory it created and every Keychain item it installed, as recorded in the import's ledger. Guests that support it advertise the feature "teleport.wipe". An unknown import_id is NOT_FOUND.

TunnelService#

cua.env.v1.TunnelService

Network tunnels between a client and the guest, carried over WebSocket upgrades on the spacesd port so they work through gateways, the relay and gRPC-Web-only networks.

  • Forward: client-to-guest TCP. Each WebSocket connection to ws_path becomes one TCP connection to the guest port; binary frames carry the byte stream in both directions.
  • Hotspot: guest-to-client egress (reverse SOCKS5). A SOCKS5 listener on guest loopback relays each outbound connection over the client's WebSocket, and the client dials it from its own network. Replaces the unauthenticated rcdp-socks.
  • Spawn: the guest-to-host channel of child Spaces. A listener on guest loopback relays each connection over the WebSocket of the host that runs the Space, which serves this Space's own children (create, list, delete) and nothing else. The host knows which Space a connection comes from by the WebSocket it opened, never by anything the guest says.

TunnelService.Forward#

/cua.env.v1.TunnelService/Forward, unary: ForwardRequest to ForwardResponse.

Authorizes TCP forwarding to a guest port and returns the WebSocket to connect to.

TunnelService.ListForwards#

/cua.env.v1.TunnelService/ListForwards, unary: ListForwardsRequest to ListForwardsResponse.

Lists active forwards.

TunnelService.CloseForward#

/cua.env.v1.TunnelService/CloseForward, unary: CloseForwardRequest to CloseForwardResponse.

Revokes a forward and closes its connections.

TunnelService.StartHotspot#

/cua.env.v1.TunnelService/StartHotspot, unary: StartHotspotRequest to StartHotspotResponse.

Starts the reverse-SOCKS hotspot for the calling client.

TunnelService.StopHotspot#

/cua.env.v1.TunnelService/StopHotspot, unary: StopHotspotRequest to StopHotspotResponse.

Stops the hotspot.

TunnelService.GetHotspotStatus#

/cua.env.v1.TunnelService/GetHotspotStatus, unary: GetHotspotStatusRequest to GetHotspotStatusResponse.

Reports hotspot state and counters.

TunnelService.StartExit#

/cua.env.v1.TunnelService/StartExit, unary: StartExitRequest to StartExitResponse.

Makes this Space an exit for the Spaces of its tree ("Exit through" a Space): a SOCKS5 listener on guest loopback that connects from this Space's own network (under this Space's network rules, which its host enforces). It is reached only through a Forward to that loopback port. Starting it again keeps the running exit.

TunnelService.StopExit#

/cua.env.v1.TunnelService/StopExit, unary: StopExitRequest to StopExitResponse.

Stops the exit (its connections close).

TunnelService.StartHostPorts#

/cua.env.v1.TunnelService/StartHostPorts, unary: StartHostPortsRequest to StartHostPortsResponse.

Publishes host ports on the guest's loopback: for each port, a listener on 127.0.0.1:<port> whose connections the host that runs the Space carries to the same port on its own loopback (the ports the Space's localhost network setting opens, so localhost:3000 works as written). Only that host may call it; starting it again replaces the listeners.

TunnelService.StopHostPorts#

/cua.env.v1.TunnelService/StopHostPorts, unary: StopHostPortsRequest to StopHostPortsResponse.

Stops publishing host ports.

TunnelService.StartSpawn#

/cua.env.v1.TunnelService/StartSpawn, unary: StartSpawnRequest to StartSpawnResponse.

Starts the spawn channel and installs the Space's spawn capability. Only a caller holding the Space's own token (the host that runs it) may call it; starting it again replaces the channel and the capability.

TunnelService.StopSpawn#

/cua.env.v1.TunnelService/StopSpawn, unary: StopSpawnRequest to StopSpawnResponse.

Stops the spawn channel and removes the capability from the guest.

TunnelService.GetSpawnStatus#

/cua.env.v1.TunnelService/GetSpawnStatus, unary: GetSpawnStatusRequest to GetSpawnStatusResponse.

Reports the spawn channel's state.

TunnelService.PublishShareSlot#

/cua.env.v1.TunnelService/PublishShareSlot, unary: PublishShareSlotRequest to PublishShareSlotResponse.

Serves one public TCP share on a share slot: a port the cloud computer publishes from this Space (CUA_SHARE_SLOTS), forwarded to a port of this Space's own loopback only. The computer's firewall opens the slot separately. Only the Space's owner (or its host) may call it.

TunnelService.UnpublishShareSlot#

/cua.env.v1.TunnelService/UnpublishShareSlot, unary: UnpublishShareSlotRequest to UnpublishShareSlotResponse.

Stops serving a share slot (its connections close).

TunnelService.ListShareSlots#

/cua.env.v1.TunnelService/ListShareSlots, unary: ListShareSlotsRequest to ListShareSlotsResponse.

The share slots served now, with the data each moved (the daemon's data cap and its sweep of slots no share explains).

VolumeService#

cua.env.v1.VolumeService

Cua Volume in the guest: the Space's view of the user's volume, mounted at a fixed path and served by the client (the host that runs the volume).

The client calls AttachVolume and opens the returned WebSocket (/volume, ticket-authenticated), which it keeps open. Once it is attached, cua-spacesd mounts the volume in the guest; the mount's traffic travels as tunnel streams over that socket (the frame format of the hotspot, OPEN carrying the target nfs or fs), and the client answers them from its own copy of the volume, scoped to this Space. The guest never holds storage keys and never has a network path to the client. The mount goes away when the socket closes or on DetachVolume.

GuestBackendMount path
macOSnfs: the system NFS client~/Cua Volume
Linuxfs: FUSE (the file operations protocol)/volume, else ~/Cua Volume
Windowsnot yet: a preview (nfs, Client for NFS, on V:\) is off unless the guest sets CUA_VOLUME_WINDOWS_PREVIEW=1

On Windows a mount_path that is not a drive (for example C:\Users\<user>\Cua Volume) becomes a directory symbolic link to the drive the volume mounts on.

VolumeService.AttachVolume#

/cua.env.v1.VolumeService/AttachVolume, unary: AttachVolumeRequest to AttachVolumeResponse.

Prepares a mount and returns the WebSocket the client attaches.

VolumeService.DetachVolume#

/cua.env.v1.VolumeService/DetachVolume, unary: DetachVolumeRequest to DetachVolumeResponse.

Unmounts and closes the socket.

VolumeService.GetVolumeStatus#

/cua.env.v1.VolumeService/GetVolumeStatus, unary: GetVolumeStatusRequest to GetVolumeStatusResponse.

Reports the mount.

Types in cua/env/v1/stream.proto#

MediaTarget#

A streamable target.

Field#TypeDescription
display_id1string (oneof target)A whole display ("desktop" target), by display id or "primary".
window2WindowRef (oneof target)A single window.

StreamTarget#

One entry of ListTargetsResponse.

Field#TypeDescription
display1Display (oneof target)A desktop target.
window2WindowInfo (oneof target)A window target.
available3boolFalse when the target is listed but cannot be streamed right now.
limitation4stringWhy not, when available is false (for example "screen recording permission not granted").
audio5AudioSourceThe audio source that pairs with this target: the desktop mix for a display target, the owning app's audio for a window target (or the desktop mix, with AudioSource.limitation set, where per-app capture is unsupported). Unset when the guest has no audio capture.

AudioSource#

A capturable audio source.

Field#TypeDescription
source_id1stringOpaque id, stable while the source exists. "desktop" always names the desktop mix.
kind2AudioSourceKindWhat the source captures.
name3stringHuman-readable name, for example "Desktop audio" or "Firefox".
app4AppInfoOwning application, for AUDIO_SOURCE_KIND_APPLICATION.
windows5repeated WindowRefWindows of that application, for pairing with window video targets.
available6boolFalse when listed but not capturable right now.
limitation7stringWhy a source is unavailable, or degraded (for example "per-app capture needs Windows 10 2004+; falls back to desktop audio").
desktop_fallback8boolTrue if capturing this source actually captures the desktop mix because per-app capture is unsupported.

ListTargetsRequest#

Request for StreamService.ListTargets.

Field#TypeDescription
include_windows1boolInclude window targets. Desktop targets are always included.
window_filter2WindowFilterFilter for window targets.

ListTargetsResponse#

Response for StreamService.ListTargets.

Field#TypeDescription
targets1repeated StreamTargetDesktop targets first (primary display first), then windows front to back. Phantom and system windows are never listed.
codecs2repeated MediaCodecCodecs this driver can produce, in its preference order.
audio_sources3repeated AudioSourceEvery capturable audio source: the desktop mix first, then per-app sources. Empty when the guest has no audio capture.
audio_codecs4repeated AudioCodecAudio codecs this driver can produce, in its preference order.
audio_uplink_allowed5boolTrue if this caller may open an audio uplink (feature "audio.uplink" is supported and the caller's principal is allowed).
audio_uplink_limitation6stringWhy the uplink is not allowed, when it is not.

AudioEncoding#

Audio encoding parameters shared by downlink and uplink requests. Zero and unset values select the defaults noted per field.

Field#TypeDescription
codecs1repeated AudioCodecAcceptable codecs in preference order. Empty means Opus, then PCM.
sample_rate_hz2uint32Sample rate in Hz. 0 means 48000. Opus accepts 8000, 12000, 16000, 24000 and 48000.
channels3uint32Channel count, 1 or 2. 0 means 2 (downlink) or 1 (uplink).
bitrate_kbps4uint32Opus target bitrate in kbps (6 to 510). 0 means 64 for stereo, 32 for mono. Ignored for PCM.
fec5optional boolOpus in-band forward error correction. Unset means on.
dtx6optional boolOpus discontinuous transmission (send almost nothing during silence). Unset means on.
frame_ms7uint32Frame duration in milliseconds: 10, 20, 40 or 60. 0 means 20. Shorter frames lower latency at a higher packet rate.
expected_loss_percent8uint32Expected packet loss in percent (0 to 100), tuning the Opus FEC redundancy. 0 means 10 when fec is on.

AudioOptions#

Audio options for OpenMediaRequest.

Field#TypeDescription
enabled1boolEnable downlink audio. When false, no audio tracks are sent and the other fields except uplink are ignored.
source_ids2repeated stringSources to send, one track each, by AudioSource.source_id. Empty means the source that pairs with the video target (StreamTarget.audio).
encoding3AudioEncodingDownlink encoding.
uplink4AudioUplinkOptionsOptional microphone uplink.

AudioUplinkOptions#

Client-to-guest audio (for example the user's microphone), played into a guest virtual audio source so apps inside can "hear" the user.

Off by default and gated separately from video and input: it requires the "audio.uplink" feature, a session policy other than SESSION_POLICY_VIEW_ONLY, and the caller's principal to be allowed by InitRequest.audio_uplink. A denied uplink does not fail OpenMedia; the response reports why in AudioUplinkGrant.

Field#TypeDescription
enabled1boolRequest an uplink track.
encoding2AudioEncodingEncoding the client will send.
virtual_source_name3stringName of the guest virtual source (microphone) to create or reuse. Empty means "cua-uplink".
set_default_input4boolMake the virtual source the guest's default input device while the uplink is active.

OpenMediaRequest#

Request for StreamService.OpenMedia.

Field#TypeDescription
target1MediaTargetWhat to stream.
codecs2repeated MediaCodecAcceptable codecs in client preference order. Empty means any.
max_fps3uint32Maximum frames per second. 0 means 30.
max_dimension4uint32Maximum long edge in pixels. 0 means native.
bitrate_kbps5uint32Target H.264 bitrate in kbps (250 to 100000). 0 means encoder default.
policy6SessionPolicyInput policy for clients attached to this session.
geometry_control7GeometryControlGeometry control.
ticket_ttl8google.protobuf.DurationTicket lifetime for attaching. Unset means 60 seconds; at most 10 minutes. The ticket only has to be valid when the socket attaches; an attached socket stays open past expiry.
prefer_quic9boolInclude OpenMediaResponse.quic when direct QUIC media is available.
audio10AudioOptionsAudio tracks. Unset means no audio (the v2.0 behavior).
disable_video11boolOpen an audio-only session: no video track is produced. target still selects the paired audio source when audio.source_ids is empty.
presence_participant_id12stringThe viewer's presence participant, its input's owner (PRESENCE.md §7).

AudioTrack#

One negotiated downlink audio track.

Field#TypeDescription
track_id1uint32Track id carried in every audio packet header (MEDIA.md §12). Unique within the media session; never 0.
source2AudioSourceThe source it captures.

NegotiatedAudioEncoding#

Negotiated audio encoding.

Field#TypeDescription
codec1AudioCodecSelected codec.
sample_rate_hz2uint32Sample rate in Hz.
channels3uint32Channel count.
bitrate_kbps4uint32Target bitrate in kbps (0 for PCM).
fec5boolIn-band FEC on.
dtx6boolDTX on.
frame_ms7uint32Frame duration in milliseconds.

AudioUplinkGrant#

Outcome of an uplink request.

Field#TypeDescription
granted1boolTrue if the uplink is open.
denied_reason2stringWhy not, when denied (for example "principal not allowed", "view_only session", "no virtual audio device").
track_id3uint32Track id the client must put in uplink packet headers.
encoding4NegotiatedAudioEncodingEncoding the server expects.
virtual_source_name5stringName of the guest virtual source the audio is played into.

NegotiatedAudio#

Negotiated audio for a media session.

Field#TypeDescription
tracks1repeated AudioTrackDownlink tracks, in the order requested.
encoding2NegotiatedAudioEncodingDownlink encoding, shared by every downlink track.
uplink3AudioUplinkGrantUplink outcome, when an uplink was requested.

QuicEndpoint#

Direct QUIC media endpoint. Only reachable when the client can reach the guest's UDP port directly (not through a gateway or the relay).

Field#TypeDescription
port1uint32UDP port (normally 3212).
certificate_sha2562stringLowercase hex SHA-256 of the server's self-signed certificate (DER), to pin.
alpn3stringALPN protocol id, "rcdp/2".

MediaGeometry#

Geometry of a media session's frames.

Field#TypeDescription
frame_size1PixelSizeFrame size in pixels.
scale2doubleFrame pixels per logical point of the target.
logical_bounds3RectTarget bounds in global logical points when the session opened.
geometry_epoch4uint64Geometry generation; matches geometry_epoch on the media plane.

OpenMediaResponse#

Response for StreamService.OpenMedia.

Field#TypeDescription
media_session_id1stringMedia session id.
ticket2stringBearer ticket for the media socket.
ticket_expires_at3google.protobuf.TimestampWhen the ticket stops being accepted for new attaches.
ws_path4stringWebSocket path relative to the spacesd base URL, including the ticket, for example "/media?ticket=…". Works through gateways and the relay.
quic5QuicEndpointDirect QUIC endpoint, when requested and available.
codec6MediaCodecNegotiated codec.
max_fps7uint32Effective frame rate cap.
max_dimension8uint32Effective long-edge cap.
bitrate_kbps9uint32Effective bitrate in kbps, 0 when not applicable.
policy10SessionPolicyEffective policy (may be lower than requested).
geometry_control11GeometryControlEffective geometry control.
geometry12MediaGeometryInitial geometry.
wire_version13uint32Media wire protocol version. 2 for this contract.
audio14NegotiatedAudioNegotiated audio. Unset when audio was not requested or is not available (see the "audio.*" capabilities).

SetPreferencesRequest#

Request for StreamService.SetPreferences.

Field#TypeDescription
media_session_id1stringWhich session.
max_fps2uint32New frame rate cap. 0 keeps the current value.
max_dimension3uint32New long-edge cap. 0 keeps the current value.
bitrate_kbps4uint32New bitrate in kbps. 0 keeps the current value.
audio_enabled5optional boolPause (false) or resume (true) all downlink audio tracks. Unset keeps the current state. Paused tracks send nothing; the session keeps its track ids.
audio_bitrate_kbps6uint32New Opus bitrate in kbps. 0 keeps the current value.
audio_fec7optional boolTurn Opus FEC on or off. Unset keeps the current value.
audio_dtx8optional boolTurn Opus DTX on or off. Unset keeps the current value.
audio_frame_ms9uint32New frame duration in milliseconds (10, 20, 40 or 60). 0 keeps the current value. Takes effect with a new audio config epoch.
audio_expected_loss_percent10optional uint32New expected loss percentage for FEC tuning. Unset keeps the current value.
audio_uplink_muted11optional boolMute (true) or unmute (false) the uplink's virtual source. Unset keeps the current state.

SetPreferencesResponse#

Response for StreamService.SetPreferences. When this returns, capture has been reconfigured; frames from the old configuration may still be in flight and are distinguished by codec_epoch on the media plane.

Field#TypeDescription
max_fps1uint32Effective frame rate cap.
max_dimension2uint32Effective long-edge cap.
bitrate_kbps3uint32Effective bitrate in kbps.
audio_enabled4boolTrue if downlink audio is flowing (not paused).
audio_encoding5NegotiatedAudioEncodingEffective downlink audio encoding. Unset when the session has no audio.
audio_uplink_muted6boolTrue if the uplink's virtual source is muted.

RequestKeyframeRequest#

Request for StreamService.RequestKeyframe.

Field#TypeDescription
media_session_id1stringWhich session.

RequestKeyframeResponse#

Response for StreamService.RequestKeyframe.

No fields.

CloseMediaRequest#

Request for StreamService.CloseMedia.

Field#TypeDescription
media_session_id1stringWhich session.

CloseMediaResponse#

Response for StreamService.CloseMedia.

No fields.

MediaCodec#

Video codec on the media plane.

Value#Description
MEDIA_CODEC_UNSPECIFIED0Not set.
MEDIA_CODEC_H2641H.264, one Annex B access unit per packet; keyframes carry SPS/PPS.
MEDIA_CODEC_BGRA2Raw top-down BGRA, tightly packed. Loopback / debugging only.
MEDIA_CODEC_PNG3One PNG per frame. Fallback when no encoder is available.

SessionPolicy#

What a media session's attached clients may do to the target.

Value#Description
SESSION_POLICY_UNSPECIFIED0Not set. Treated as SESSION_POLICY_VIEW_ONLY.
SESSION_POLICY_VIEW_ONLY1Video only; interactive input is refused.
SESSION_POLICY_BACKGROUND_ONLY2Input allowed, but only background delivery (never activates or moves the real pointer).
SESSION_POLICY_ALLOW_ACTIVATION3Input allowed and may activate the target.

GeometryControl#

Whether a session may resize its target window to fit the viewer.

Value#Description
GEOMETRY_CONTROL_UNSPECIFIED0Not set. Treated as GEOMETRY_CONTROL_OBSERVE_ONLY.
GEOMETRY_CONTROL_OBSERVE_ONLY1Never resize the target.
GEOMETRY_CONTROL_BIDIRECTIONAL2Viewer may resize the target. Exclusive per target: a second bidirectional session fails with FAILED_PRECONDITION instead of stealing the lease. Window targets only.

AudioCodec#

Audio codec on the media plane.

Value#Description
AUDIO_CODEC_UNSPECIFIED0Not set.
AUDIO_CODEC_OPUS1Opus (RFC 6716), one Opus packet per media packet. The default.
AUDIO_CODEC_PCM_S16LE2Raw interleaved signed 16-bit little-endian PCM. Lossless, for debugging and tests; roughly 1.5 Mbit/s for 48 kHz stereo.

AudioSourceKind#

What an audio source captures.

Value#Description
AUDIO_SOURCE_KIND_UNSPECIFIED0Not reported.
AUDIO_SOURCE_KIND_DESKTOP1Everything the guest plays (the default output's mix).
AUDIO_SOURCE_KIND_APPLICATION2Audio of one application only.

Types in cua/env/v1/presence.proto#

Participant#

A participant.

Field#TypeDescription
participant_id1stringServer-assigned participant id, unique per Join.
principal2PrincipalWho it is. color is the server-assigned color, which may differ from the requested one.
joined_at3google.protobuf.TimestampWhen it joined.

CursorPosition#

Where a cursor is.

Field#TypeDescription
display_id1stringTarget the cursor is over. Unset means the primary desktop.
window2WindowRefWindow the cursor is over, when the participant is viewing a window stream.
position3PointPosition normalized to [0, 1] within the window (if set) or the display, so viewers at different scales agree.
visible4boolFalse hides the cursor (for example the pointer left the viewer).
shape5CursorShapeThe pointer shape the guest would show at position, computed by the server for participants that joined with JoinRequest.cursor_shapes. Ignored in UpdateCursorRequest. CURSOR_SHAPE_UNSPECIFIED (older daemons, or not probed yet) is drawn as the arrow.
shape_source6CursorShapeSourceHow shape was determined.

JoinRequest#

Request for PresenceService.Join.

Field#TypeDescription
principal1PrincipalWho is joining. Overrides the x-cua-principal-bin metadata.
keepalive_interval2google.protobuf.DurationInterval between keepalive events. Unset means 30 seconds.
cursor_shapes3boolAsks the server to compute cursor shapes (CursorPosition.shape) and send CursorShapeChanged. Honored only when the capability "presence.cursor_shape" is supported; otherwise shapes stay unspecified.
roster_interval4google.protobuf.DurationInterval between RosterHeartbeat events, which list everyone present so a client can drop a participant whose leave it missed. Unset or zero means no heartbeats. Clamped to at least one second.
cursor_batches5boolAsks for one CursorBatch per server tick, carrying every cursor that moved in it, instead of one CursorMoved per cursor.
cursor_datagrams6boolAsks for a presence datagram channel (PresenceJoined.datagrams): cursors as unreliable, latest-wins QUIC datagrams in both directions, with this stream kept for everything else. Ignored when the server has no QUIC listener; the stream then carries cursors as before.

PresenceJoined#

First event of a Join stream.

Field#TypeDescription
participant1ParticipantThe caller.
roster2repeated ParticipantCursorEveryone else currently present, with their last known cursors.
datagrams3PresenceDatagramsThe presence datagram channel, when requested and available. See libs/cua/proto/PRESENCE.md.

PresenceDatagrams#

Where and how to open the presence datagram channel.

Field#TypeDescription
endpoint1QuicEndpointThe QUIC listener (normally UDP 3212); alpn is "cua-presence/1".
ticket2stringSingle-use credential binding the QUIC connection to this participant.
tick3google.protobuf.DurationServer cursor tick on the channel (normally 33 ms).

ParticipantCursor#

A participant and their cursor.

Field#TypeDescription
participant1ParticipantThe participant.
cursor2CursorPositionTheir last cursor, unset if never published.

ParticipantLeft#

A participant left.

Field#TypeDescription
participant_id1stringTheir participant id.
reason2LeaveReasonWhy.

RosterHeartbeat#

Everyone present, sent every JoinRequest.roster_interval. A participant missing from it has left.

Field#TypeDescription
participant_ids1repeated stringParticipant ids present, the recipient included.
at2google.protobuf.TimestampWhen the server sent it.

CursorBatch#

Every cursor that moved in one server tick.

Field#TypeDescription
moves1repeated CursorMovedThe moves, at most one per participant.
tick2uint64Server tick number. Ticks are the server's cursor interval apart; a gap means ticks without moves.
at3google.protobuf.TimestampWhen the server sent it.

CursorMoved#

A participant's cursor moved.

Field#TypeDescription
participant_id1stringWhose cursor.
cursor2CursorPositionNew position.
at3google.protobuf.TimestampWhen the server received it.

CursorShapeChanged#

A participant's cursor shape changed. Sent to every subscriber that asked for shapes, including the participant itself, so each client can draw its own cursor with the guest's shape.

Field#TypeDescription
participant_id1stringWhose cursor.
shape2CursorShapeNew shape.
source3CursorShapeSourceHow it was determined.
at4google.protobuf.TimestampWhen the server determined it.

JoinResponse#

One message of the PresenceService.Join stream.

Field#TypeDescription
joined1PresenceJoined (oneof event)First event.
participant_joined2Participant (oneof event)Someone joined.
participant_left3ParticipantLeft (oneof event)Someone left.
cursor_moved4CursorMoved (oneof event)Someone's cursor moved. Coalesced to at most 30 per second per participant.
keepalive5KeepAlive (oneof event)Idle stream heartbeat.
cursor_shape_changed6CursorShapeChanged (oneof event)Someone's cursor shape changed (only with JoinRequest.cursor_shapes).
roster_heartbeat7RosterHeartbeat (oneof event)Everyone present (only with JoinRequest.roster_interval).
cursor_batch8CursorBatch (oneof event)Cursors that moved in one tick (only with JoinRequest.cursor_batches).

UpdateCursorRequest#

Request for PresenceService.UpdateCursor.

Field#TypeDescription
participant_id1stringThe caller's participant id from PresenceJoined.participant.
cursor2CursorPositionNew position.

UpdateCursorResponse#

Response for PresenceService.UpdateCursor.

No fields.

LeaveRequest#

Request for PresenceService.Leave.

Field#TypeDescription
participant_id1stringThe caller's participant id.

LeaveResponse#

Response for PresenceService.Leave.

No fields.

CursorShape#

A pointer shape, in a small portable vocabulary. Clients draw their own art for each value in the participant's color.

Value#Description
CURSOR_SHAPE_UNSPECIFIED0Unknown or not probed. Draw the arrow.
CURSOR_SHAPE_ARROW1The ordinary arrow.
CURSOR_SHAPE_TEXT2Text insertion (I-beam).
CURSOR_SHAPE_POINTER3A link or other clickable control (pointing hand).
CURSOR_SHAPE_RESIZE_NS4Resize along the vertical axis (top or bottom edge).
CURSOR_SHAPE_RESIZE_EW5Resize along the horizontal axis (left or right edge).
CURSOR_SHAPE_RESIZE_NESW6Resize along the rising diagonal (top-right or bottom-left corner).
CURSOR_SHAPE_RESIZE_NWSE7Resize along the falling diagonal (top-left or bottom-right corner).
CURSOR_SHAPE_WAIT8Busy; input is not accepted.
CURSOR_SHAPE_PROGRESS9Working in the background; input is still accepted.
CURSOR_SHAPE_NOT_ALLOWED10The action is not permitted here.
CURSOR_SHAPE_CROSSHAIR11Precise selection.
CURSOR_SHAPE_GRAB12Open hand over something draggable.
CURSOR_SHAPE_GRABBING13Closed hand while dragging.
CURSOR_SHAPE_MOVE14Move in any direction.

CursorShapeSource#

How a cursor shape was determined.

Value#Description
CURSOR_SHAPE_SOURCE_UNSPECIFIED0Not reported.
CURSOR_SHAPE_SOURCE_HIT_TEST1Accessibility hit-test at the participant's position (role of the element under the point, window edges). Never moves the guest pointer.
CURSOR_SHAPE_SOURCE_SYSTEM2The guest's real cursor, read while this participant's input is what positioned the pointer.
CURSOR_SHAPE_SOURCE_PROBE3The guest's real cursor, read by briefly moving the idle pointer to the participant's position and restoring it (see PresenceSettings).

LeaveReason#

Why a participant left.

Value#Description
LEAVE_REASON_UNSPECIFIED0Not reported.
LEAVE_REASON_LEFT1It called Leave.
LEAVE_REASON_DISCONNECTED2Its Join stream ended.
LEAVE_REASON_TIMEOUT3No activity within the server's timeout (agents without a stream).
LEAVE_REASON_RUN_ENDED4The agent run or driver session that owned the cursor ended.

Types in cua/env/v1/teleport.proto#

GetManifestRequest#

Request for TeleportService.GetManifest.

Field#TypeDescription
app1stringProvider / app id, for example "firefox", "chromium", "chrome", "vscode". Advertised as capability "teleport.<app>".
scope2TeleportScopeRequested scope.

GetManifestResponse#

Response for TeleportService.GetManifest.

Field#TypeDescription
supported1boolTrue if the guest has a provider for this app.
limitation2stringWhy not, when unsupported.
app_installed3boolTrue if the app is installed in the guest.
app_running4boolTrue if the app is running. Importing may require closing it.
bundle_version5uint32Bundle format version the sender must produce.
scopes6repeated TeleportScopeScopes this provider can import.
supported_apps7repeated stringEvery app id the guest can import, for discovery.

ImportOptions#

Options applied when an imported session is committed.

Field#TypeDescription
replace_existing1boolReplace existing state instead of merging.
close_running_app2boolClose the app (gracefully, then forcefully after 5 seconds) if it is running.
launch_after3boolLaunch the app after importing.
expires_at_ms4uint64Unix time in milliseconds at which the guest wipes the import on its own, as WipeImport would. 0 means no expiry. Checked every 60 seconds and when the guest daemon starts, so an expiry survives restarts.
broker_grant5stringSet by the Cua Keyvault broker when it delivers a session it authorized (a consent grant, an unattended rule or a first-party approval), to keyvault; empty for a direct SDK send. Not a secret and not verified by the guest. cua-spacesd counts deliveries with and without it (present or absent) in its opt-in aggregate telemetry; nothing else reads it.

ImportSessionRequest#

Request for TeleportService.ImportSession.

Field#TypeDescription
import_id1stringClient-chosen import id, stable across retries. The first chunk (offset 0) creates the import.
app2stringApp id as in GetManifestRequest.app.
scope3TeleportScopeScope of the bundle.
offset4uint64Offset of data[0] in the bundle. Must equal received_bytes; a chunk wholly below it is acknowledged as a duplicate.
data5bytesBundle bytes. At most Limits.max_chunk_bytes.
commit6boolTrue on the last chunk: verify and import. May carry data.
sha2567stringLowercase hex SHA-256 of the whole bundle. Required when commit.
options8ImportOptionsImport options, read when commit.

ImportResult#

Outcome of an import, returned on the final chunk.

Field#TypeDescription
imported1repeated stringItems imported (for example "cookies", "localStorage").
skipped2repeated stringItems skipped, with reasons, as "item: reason".
launched3boolTrue if the app was launched.

ImportSessionResponse#

Response for TeleportService.ImportSession.

Field#TypeDescription
received_bytes1uint64Bundle bytes received so far.
duplicate2boolTrue if the chunk was a retry and was not written again.
result3ImportResultSet on the final chunk once the import completed.

TransferEntry#

One entry of a file transfer manifest.

Field#TypeDescription
relative_path1stringPath relative to the transfer root, "/"-separated. No "..", no absolute paths.
directory2boolTrue for a directory (no content).
size3uint64File size in bytes.
sha2564stringLowercase hex SHA-256 of the file content.
mode5uint32Unix permission bits. 0 means 0o644 (files) or 0o755 (directories).
modified_at6google.protobuf.TimestampModification time to preserve.

BeginReceiveFilesRequest#

Request for TeleportService.BeginReceiveFiles.

Field#TypeDescription
transfer_id1stringClient-chosen transfer id, stable across retries. Repeating the call with the same id returns the current progress.
destination_subdir2stringSubdirectory of the guest user's Downloads folder to place the transfer in. Empty places entries directly in Downloads.
entries3repeated TransferEntryAll entries. Directories may be listed explicitly or implied by file paths.
ignore_patterns4repeated stringgitignore-syntax patterns applied relative to the transfer root.
honor_gitignore5boolAlso honor .gitignore files that are part of the transfer (their content must be uploaded first; the server evaluates them at commit).
conflict_policy6ConflictPolicyWhat to do with existing files.
ttl7google.protobuf.DurationHow long partial data is kept without progress. Unset means 1 hour.

TransferFileProgress#

Progress of one file in a transfer.

Field#TypeDescription
index1uint32Index into the accepted entries.
received_bytes2uint64Bytes received.

BeginReceiveFilesResponse#

Response for TeleportService.BeginReceiveFiles.

Field#TypeDescription
transfer_id1stringThe transfer id.
accepted2repeated TransferEntryEntries that will be received, in the order indices refer to.
ignored3repeated stringRelative paths dropped by ignore patterns.
progress4repeated TransferFileProgressProgress per accepted file, for resuming.
max_chunk_bytes5uint32Largest chunk accepted.

ReceiveFilesChunkRequest#

Request for TeleportService.ReceiveFilesChunk.

Field#TypeDescription
transfer_id1stringWhich transfer.
index2uint32Index into BeginReceiveFilesResponse.accepted.
offset3uint64Offset of data[0] in that file. Must equal its received bytes; a chunk wholly below is a duplicate.
data4bytesFile bytes. At most max_chunk_bytes.

ReceiveFilesChunkResponse#

Response for TeleportService.ReceiveFilesChunk.

Field#TypeDescription
received_bytes1uint64Bytes received for that file.
duplicate2boolTrue if the chunk was a retry.

CommitReceiveFilesRequest#

Request for TeleportService.CommitReceiveFiles.

Field#TypeDescription
transfer_id1stringWhich transfer.

ReceivedFile#

A file placed by a committed transfer.

Field#TypeDescription
path1stringFinal absolute guest path (after conflict renaming).
size2uint64Size in bytes.
sha2563stringVerified lowercase hex SHA-256.

CommitReceiveFilesResponse#

Response for TeleportService.CommitReceiveFiles.

Field#TypeDescription
destination1stringAbsolute guest path of the transfer root.
files2repeated ReceivedFileFiles placed.
skipped3repeated stringRelative paths skipped by CONFLICT_POLICY_SKIP or by .gitignore rules evaluated at commit.

AbortReceiveFilesRequest#

Request for TeleportService.AbortReceiveFiles.

Field#TypeDescription
transfer_id1stringWhich transfer.

AbortReceiveFilesResponse#

Response for TeleportService.AbortReceiveFiles.

No fields.

WipeImportRequest#

Request for TeleportService.WipeImport.

Field#TypeDescription
import_id1stringImport to wipe, as sent in ImportSessionRequest.import_id. Ignored when all is set.
all2boolWipe every ledgered import in the guest.

WipeImportResponse#

Response for TeleportService.WipeImport.

Field#TypeDescription
wiped_import_ids1repeated stringImport ids whose ledgers were wiped and removed.
removed_paths2repeated stringAbsolute guest paths removed (files, and directories the import created).
keychain_items_removed3uint32Keychain items removed (macOS guests; 0 elsewhere).
cookie_rows_removed4uint32Cookie rows deleted out of an existing Cookies database the import merged into (not itself in removed_paths: it was not the import's file to remove).

TeleportScope#

Which part of an app's state to teleport.

Value#Description
TELEPORT_SCOPE_UNSPECIFIED0Not set. Treated as TELEPORT_SCOPE_SESSION.
TELEPORT_SCOPE_SESSION1Sign-in state only: cookies, local storage, session storage.
TELEPORT_SCOPE_PROFILE2The whole profile: session plus history, bookmarks, extensions, settings.

ConflictPolicy#

What to do when a received file already exists.

Value#Description
CONFLICT_POLICY_UNSPECIFIED0Not set. Treated as CONFLICT_POLICY_RENAME.
CONFLICT_POLICY_RENAME1Keep both: the new file becomes "name (1).ext".
CONFLICT_POLICY_OVERWRITE2Replace the existing file.
CONFLICT_POLICY_SKIP3Keep the existing file and drop the new one.

Types in cua/env/v1/tunnel.proto#

PublishShareSlotRequest#

Request for TunnelService.PublishShareSlot.

Field#TypeDescription
slot1uint32The slot (one of CUA_SHARE_SLOTS).
port2uint32The Space port it reaches (on 127.0.0.1).
allow3repeated stringWho may connect (CIDRs); empty: anyone.
expect_hosts4repeated stringMinecraft Java: drop connections whose handshake names none of these hosts. Empty: no check.
ttl5google.protobuf.DurationHow long it serves. Unset: 24 hours, the most.
max_bytes6uint64The most bytes it may move (both ways); 0: no cap. Reaching it ends every connection and refuses new ones.

PublishShareSlotResponse#

Response for TunnelService.PublishShareSlot.

Field#TypeDescription
slot1uint32The slot.
expires_at2google.protobuf.TimestampWhen it stops.

UnpublishShareSlotRequest#

Request for TunnelService.UnpublishShareSlot.

Field#TypeDescription
slot1uint32The slot.

UnpublishShareSlotResponse#

Response for TunnelService.UnpublishShareSlot.

No fields.

ListShareSlotsRequest#

Request for TunnelService.ListShareSlots.

No fields.

ShareSlot#

One served share slot.

Field#TypeDescription
slot1uint32The slot.
port2uint32The Space port it reaches.
bytes3uint64Bytes moved since it was published.
max_bytes4uint64Its data cap (0: none).
connections5uint32Open connections.
expires_at6google.protobuf.TimestampWhen it stops.

ListShareSlotsResponse#

Response for TunnelService.ListShareSlots.

Field#TypeDescription
slots1repeated ShareSlotThe slots, with what each moved.

ForwardRequest#

Request for TunnelService.Forward.

Field#TypeDescription
port1uint32Guest TCP port to reach.
host2stringGuest host to connect to. Empty means "127.0.0.1". Only loopback and the guest's own addresses are allowed.
ttl3google.protobuf.DurationHow long the ticket accepts new connections. Unset means 10 minutes; at most 24 hours. Open connections survive expiry.

ForwardResponse#

Response for TunnelService.Forward.

Field#TypeDescription
forward_id1stringForward id.
ticket2stringTicket accepted by the tunnel WebSocket. Reusable for many connections until expiry.
ws_path3stringWebSocket path relative to the spacesd base URL, including the ticket, for example "/tunnel?ticket=…".
expires_at4google.protobuf.TimestampWhen the ticket expires.

ForwardInfo#

An active forward.

Field#TypeDescription
forward_id1stringForward id.
host2stringGuest host.
port3uint32Guest port.
active_connections4uint32Open connections.
bytes_in5uint64Bytes sent to the guest port.
bytes_out6uint64Bytes received from the guest port.
expires_at7google.protobuf.TimestampTicket expiry.

ListForwardsRequest#

Request for TunnelService.ListForwards.

No fields.

ListForwardsResponse#

Response for TunnelService.ListForwards.

Field#TypeDescription
forwards1repeated ForwardInfoActive forwards.

CloseForwardRequest#

Request for TunnelService.CloseForward.

Field#TypeDescription
forward_id1stringWhich forward.

CloseForwardResponse#

Response for TunnelService.CloseForward.

No fields.

StartHotspotRequest#

Request for TunnelService.StartHotspot.

Field#TypeDescription
socks_port1uint32Guest loopback port for the SOCKS5 listener. 0 means 1080.
set_system_proxy2boolPoint the guest's system proxy settings (and HTTP(S)_PROXY for new processes) at the hotspot.
bypass3repeated stringDestinations (CIDRs or host suffixes) that bypass the hotspot and use the guest's own network.
ticket_ttl4google.protobuf.DurationHow long the ticket accepts the client's WebSocket. Unset means 60 seconds.

StartHotspotResponse#

Response for TunnelService.StartHotspot.

Field#TypeDescription
hotspot_id1stringHotspot id.
ticket2stringTicket for the hotspot WebSocket.
ws_path3stringWebSocket path relative to the spacesd base URL, including the ticket, for example "/hotspot?ticket=…". The client keeps this socket open; the hotspot stops when it closes.
socks_address4stringGuest-side SOCKS5 address, for example "127.0.0.1:1080".

StartExitRequest#

Request for TunnelService.StartExit.

Field#TypeDescription
socks_port1uint32Guest loopback port; 0 picks a free one.

StartExitResponse#

Response for TunnelService.StartExit.

Field#TypeDescription
socks_address1stringWhere the exit listens on guest loopback ("127.0.0.1:41081").

StartHostPortsRequest#

Request for TunnelService.StartHostPorts.

Field#TypeDescription
ports1repeated uint32Host ports to publish on the guest's loopback, at the same numbers.
ticket_ttl2google.protobuf.DurationHow long the ticket accepts the host's WebSocket. Unset: 60 s.

HostPortSkipped#

A host port the guest could not publish.

Field#TypeDescription
port1uint32The host port.
reason2stringWhy, in plain words ("something in the Space listens there").

StartHostPortsResponse#

Response for TunnelService.StartHostPorts.

Field#TypeDescription
session_id1stringThe session to stop later.
ticket2stringOne-time ticket for the host's WebSocket.
ws_path3stringWebSocket path relative to the spacesd base URL, with the ticket.
listening4repeated uint32The ports listening on the guest's loopback now.
skipped5repeated HostPortSkippedThe ports it could not take.

StopHostPortsRequest#

Request for TunnelService.StopHostPorts.

No fields.

StopHostPortsResponse#

Response for TunnelService.StopHostPorts.

No fields.

StopExitRequest#

Request for TunnelService.StopExit.

No fields.

StopExitResponse#

Response for TunnelService.StopExit.

No fields.

StopHotspotRequest#

Request for TunnelService.StopHotspot.

Field#TypeDescription
hotspot_id1stringWhich hotspot.

StopHotspotResponse#

Response for TunnelService.StopHotspot.

No fields.

GetHotspotStatusRequest#

Request for TunnelService.GetHotspotStatus.

No fields.

GetHotspotStatusResponse#

Response for TunnelService.GetHotspotStatus.

Field#TypeDescription
state1HotspotStateState.
hotspot_id2stringHotspot id, when not stopped.
peer_principal_id3stringId of the principal whose client provides egress.
socks_address4stringGuest-side SOCKS5 address.
active_connections5uint32Open relayed connections.
bytes_out6uint64Bytes sent from the guest through the hotspot.
bytes_in7uint64Bytes received into the guest through the hotspot.

StartSpawnRequest#

Request for TunnelService.StartSpawn.

Field#TypeDescription
capability1stringThe Space's spawn capability, minted by its host. The guest writes it to the token file (0600, owner: the user cua-spacesd runs as) for clients in the Space to present on the spawn listener.
ticket_ttl2google.protobuf.DurationHow long the ticket accepts the host's WebSocket. Unset means 60 seconds.
space_id3stringThe Space's id, for the environment of new processes (CUA_SPACE).

StartSpawnResponse#

Response for TunnelService.StartSpawn.

Field#TypeDescription
spawn_id1stringSpawn channel id.
ticket2stringTicket for the spawn WebSocket.
ws_path3stringWebSocket path relative to the spacesd base URL, including the ticket, for example "/spawn?ticket=…". The host keeps this socket open; the listener refuses connections while it is closed.
address4stringGuest-side listener, as a URL clients in the Space use as their cua daemon, for example "http://127.0.0.1:41234".
token_path5stringWhere the guest wrote the capability.
address_path6stringWhere the guest wrote the listener's address (one line).

StopSpawnRequest#

Request for TunnelService.StopSpawn.

Field#TypeDescription
spawn_id1stringWhich channel. Empty stops the current one.

StopSpawnResponse#

Response for TunnelService.StopSpawn.

No fields.

GetSpawnStatusRequest#

Request for TunnelService.GetSpawnStatus.

No fields.

GetSpawnStatusResponse#

Response for TunnelService.GetSpawnStatus.

Field#TypeDescription
started1boolA channel is started.
attached2boolThe host's WebSocket is attached.
spawn_id3stringChannel id, when started.
address4stringGuest-side listener URL, when started.
active_connections5uint32Open relayed connections.

HotspotState#

Hotspot state.

Value#Description
HOTSPOT_STATE_UNSPECIFIED0Not reported.
HOTSPOT_STATE_STOPPED1No hotspot.
HOTSPOT_STATE_WAITING_FOR_PEER2Started, waiting for the client WebSocket.
HOTSPOT_STATE_ACTIVE3Relaying.

Types in cua/env/v1/volume.proto#

AttachVolumeRequest#

Request for VolumeService.AttachVolume.

Field#TypeDescription
mount_path1stringWhere to mount. Empty means the guest's default (see the table above).
ticket_ttl2google.protobuf.DurationHow long the ticket accepts the client's WebSocket. Unset means 60 seconds.
binds3repeated VolumeBindFolders of the volume to bind at other paths once it is mounted (Linux: bind mounts; macOS: symbolic links). Undone with the mount.

VolumeMount#

A named volume mounted into a Space: the folder volumes/<name>/ of the user's Cua Volume, bound at path in the guest.

Field#TypeDescription
name1stringThe volume's name: 1-63 of a-z, 0-9, ., _, -.
path2stringAbsolute path in the guest.
read_only3boolMounted read-only.
subpath4stringA folder inside the volume to mount instead of the whole volume.

VolumeBind#

A folder of the mounted volume made available at another path.

Field#TypeDescription
source1stringFolder inside the volume, relative to its root (volumes/shared/).
target2stringAbsolute path in the guest. Created when missing.
read_only3boolMounted read-only (Linux). A link on macOS cannot enforce it; the client's view of the folder does.

AttachVolumeResponse#

Response for VolumeService.AttachVolume.

Field#TypeDescription
volume_id1stringVolume session id.
ticket2stringTicket for the volume WebSocket.
ws_path3stringWebSocket path relative to the spacesd base URL, including the ticket, for example "/volume?ticket=…".
mount_path4stringWhere the volume will be mounted.
backend5stringnfs or fs: the target name the guest's streams carry, which the client answers.

DetachVolumeRequest#

Request for VolumeService.DetachVolume.

Field#TypeDescription
volume_id1stringWhich session. Empty means the current one.

DetachVolumeResponse#

Response for VolumeService.DetachVolume.

No fields.

GetVolumeStatusRequest#

Request for VolumeService.GetVolumeStatus.

No fields.

GetVolumeStatusResponse#

Response for VolumeService.GetVolumeStatus.

Field#TypeDescription
state1VolumeStateState.
volume_id2stringVolume session id (empty when detached).
mount_path3stringMount path.
backend4stringnfs or fs.
detail5stringWhy, when state is VOLUME_STATE_ERROR.
active_streams6uint32Open streams to the client.
bytes_out7uint64Bytes sent from the guest to the client.
bytes_in8uint64Bytes received from the client.
binds9repeated stringTargets of the binds that are in place.

VolumeState#

State of the guest mount.

Value#Description
VOLUME_STATE_UNSPECIFIED0Not reported.
VOLUME_STATE_DETACHED1No volume.
VOLUME_STATE_WAITING_FOR_CLIENT2Attached by RPC, waiting for the client WebSocket.
VOLUME_STATE_MOUNTING3Mounting.
VOLUME_STATE_MOUNTED4Mounted and served.
VOLUME_STATE_ERROR5The mount failed; see detail.