Host Spaces

cua.env.v1 HostSpacesService: Spaces a host creates for its owner's devices through the relay.

Spaces a machine set up with cua host setup --share both creates for its owner's enrolled devices: settings, capacity, create and delete. The host's cua-spacesd forwards each call to its cua daemon. What a host reports for placement is on Host capacity.

Source: libs/cua/proto/cua/env/v1/host.proto.

HostSpacesService#

cua.env.v1.HostSpacesService

Spaces a host provides: a machine set up with cua host setup --share both creates Spaces (macOS VMs with Lume on a Mac, Linux containers with Docker, whatever else runs locally) for the owner's enrolled devices and the accounts it is shared with, through the relay.

The host's cua-spacesd serves this service only in join mode with a host policy, and only to relay-asserted editors (the owner, or an account on the machine's allowlist) and the local token holder: a view-only share is refused. It forwards each call to the host's cua daemon, which creates and deletes the Spaces with its own runtimes, attaches each new Space to the relay as its own machine, and records every create and delete in the host's hash-chained audit log (~/.cua/host/spaces-audit.jsonl).

With share_desktop off, a relayed caller reaches only this service and GetCapabilities / Health, never the host's desktop or files.

A host set up with cua host setup --direct <ip:port> --share both also serves it on its direct listener, to the holder of its env token, by default only from loopback, Tailscale and private LAN addresses. A Space created with direct is reached on a TCP port the host forwards to it (HostSpace.direct_port).

HostSpacesService.GetHostSpaces#

/cua.env.v1.HostSpacesService/GetHostSpaces, unary: GetHostSpacesRequest to GetHostSpacesResponse.

This host's settings, capacity, the Spaces it provides to the caller (every one for the owner) and, for the owner, its recent audit.

HostSpacesService.CreateHostSpace#

/cua.env.v1.HostSpacesService/CreateHostSpace, unary: CreateHostSpaceRequest to CreateHostSpaceResponse.

Creates one Space on this host and attaches it to the relay as the machine the caller registered for it (attach). Fails with RESOURCE_EXHAUSTED when the host is at capacity (two macOS VMs per Mac, by Apple's license, or the host's max_spaces).

HostSpacesService.DeleteHostSpace#

/cua.env.v1.HostSpacesService/DeleteHostSpace, unary: DeleteHostSpaceRequest to DeleteHostSpaceResponse.

Deletes a Space this host provides (its sandbox and its relay machine). The owner deletes any; another account only the ones it created.

HostSpacesService.CancelHostSpace#

/cua.env.v1.HostSpacesService/CancelHostSpace, unary: CancelHostSpaceRequest to CancelHostSpaceResponse.

Cancels a CreateHostSpace the caller started, by the relay machine it registered for it (attach.machine_id): the create stops (an image download, a boot) and what it made is removed; one that already finished is deleted, since the caller gave up on it. Idempotent.

HostSpacesService.SetHostSpacePower#

/cua.env.v1.HostSpacesService/SetHostSpacePower, unary: SetHostSpacePowerRequest to SetHostSpacePowerResponse.

Turns a Space this host provides off or on. Off stops it with its disk kept, freeing the host's memory (a runtime that cannot start it again, QEMU, suspends it instead); on boots it again and re-attaches it to its relay machine. The owner powers any; another account only the ones it created.

HostSpacesService.SetHostWarm#

/cua.env.v1.HostSpacesService/SetHostWarm, unary: SetHostWarmRequest to SetHostWarmResponse.

Keeps Spaces of one shape ready for a prewarm (see warm.proto).

HostSpacesService.DeleteCloudSpace#

/cua.env.v1.HostSpacesService/DeleteCloudSpace, unary: DeleteCloudSpaceRequest to DeleteCloudSpaceResponse.

Deletes a Space in the owner's own cloud that this machine created (an AWS, Google Cloud, Hetzner or Modal sandbox, by the relay machine it joined as): its cloud resources, through this machine's ownership records, and its relay machine. Only the owner. Lets another of the owner's devices delete it permanently without the cloud's credentials. Works whether or not this machine provides Spaces.

HostSpacesService.SetHostSpaceEgress#

/cua.env.v1.HostSpacesService/SetHostSpaceEgress, unary: SetHostSpaceEgressRequest to SetHostSpaceEgressResponse.

Replaces the egress policy of a Space this host provides; the host enforces it outside the guest, at once. The owner sets any; another account only on the ones it created.

HostSpacesService.DiagnoseHost#

/cua.env.v1.HostSpacesService/DiagnoseHost, unary: DiagnoseHostRequest to DiagnoseHostResponse.

This machine's health as a place to run Spaces, checked by its cua daemon (the process that runs them): Local Network access and the app macOS holds responsible for it, free disk, virtualization, memory, and the permissions sharing its desktop needs. Read-only and bounded (a few seconds). Only the owner. Works whether or not this machine provides Spaces. The Machines page shows the warnings and failures as the machine's issues; cua doctor --machine prints them.

HostJobsService#

cua.env.v1.HostJobsService

Jobs on a host: each runs once in a fresh Space that the host creates, runs the command in, and deletes. A host set up to provide Spaces serves this service to the same callers as HostSpacesService (the owner, its editors, and the env token holder of a direct host), through its cua-spacesd, which forwards each call to the host's cua daemon.

The host keeps a durable ledger of the jobs it accepted, keyed by job id, so delivering a job again never runs it twice on this host, and a scheduler that restarts reads back what happened. Each job carries an attempt number that fences older deliveries: a host refuses an attempt lower than one it has seen for the job (stale), and a newer attempt cancels an older one still running here.

HostJobsService.RunHostJobs#

/cua.env.v1.HostJobsService/RunHostJobs, unary: RunHostJobsRequest to RunHostJobsResponse.

Starts jobs (a batch): each is accepted (it runs now), or refused when the host has no room for it (the scheduler places it elsewhere). Idempotent per job id and attempt.

HostJobsService.GetHostJob#

/cua.env.v1.HostJobsService/GetHostJob, unary: GetHostJobRequest to GetHostJobResponse.

One job's record on this host.

HostJobsService.ListHostJobs#

/cua.env.v1.HostJobsService/ListHostJobs, unary: ListHostJobsRequest to ListHostJobsResponse.

The jobs that changed after a ledger sequence number, oldest first: a change feed. With wait_ms the host holds the call until something changes or the wait ends (a long poll), so a scheduler hears about completions at once; the call is also the node's heartbeat.

HostJobsService.CancelHostJob#

/cua.env.v1.HostJobsService/CancelHostJob, unary: CancelHostJobRequest to CancelHostJobResponse.

Stops a job (its Space is deleted) and fences the attempt: a delivery of that attempt arriving later is refused. Idempotent; a job this host never saw is recorded as canceled for that attempt.

HostThreadService#

cua.env.v1.HostThreadService

A Space's thread and its agent members, for people on other devices. The thread of a Space a host provides lives in the host's cua daemon (its owner); a person the host is shared with reads it, posts to it and @mentions its agents through this service, from their own device.

The host's cua-spacesd serves it while the host provides Spaces (feature host_thread), to relay-verified callers including view-only shares (they read only), and to the local token holder (the owner). It forwards each call to the host's cua daemon with the verified caller, which it sets itself (a caller a client sent is never forwarded). The daemon runs the tool as that caller: the thread records them as the author, and the Space's roles and each agent's rights decide what they may do. Only the thread and agent member tools are served, and only for the Spaces the host provides.

HostThreadService.CallThreadTool#

/cua.env.v1.HostThreadService/CallThreadTool, unary: CallThreadToolRequest to CallThreadToolResponse.

Runs one thread or agent member tool (thread_read, thread_post, thread_inbox, thread_claim, thread_reply, agent_members, agent_send, and agent_message, agent_status, agent_events, agent_interrupt, agent_stop by a member's name) on a Space this host provides, as the verified caller. A tool error (a refusal included) is a result with is_error, as the MCP server answers it.

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

DiagnoseHostRequest#

Request for HostSpacesService.DiagnoseHost.

Field#TypeDescription
machine1stringAnother of the owner's machines to check instead, by id or name: the cua daemon asks that machine's own DiagnoseHost over the relay (or the mesh, or its direct address). Only for a call made on this machine itself; a host's cua-spacesd clears it on calls it forwards. Empty: this machine.

DiagnoseHostResponse#

Response for HostSpacesService.DiagnoseHost.

Field#TypeDescription
report1DiagnoseReportThe checks (ids machine.*), in the report schema cua doctor uses.
cua_version2stringThe Cua version of the daemon that ran them.
os3stringThe machine's operating system (macos, linux, windows).

HostSpacesSettings#

The host's two independent settings and its limits.

Field#TypeDescription
share_desktop1boolThe host's own desktop is a Space too (screen, input, shell, files).
provide_spaces2boolThe host accepts Space create, list and delete requests.
max_spaces3uint32At most this many provided Spaces at once (0: no limit besides the runtimes' own).
max_macos_vms4uint32At most this many macOS VMs at once on this Mac (Apple's license allows two; 0 on a host that cannot run macOS VMs).
max_memory_gb5uint32The Spaces other machines create here may use at most this much memory in total, in GB (0: no limit).
max_disk_gb6uint32The Spaces other machines create here may use at most this much disk in total, in GB (0: no limit).
max_run_minutes7uint32A Space created here by another machine stops after running this many minutes (0: no limit).

HostSpacesCapacity#

How much of one limit is in use.

Field#TypeDescription
resource1stringspaces (every provided Space), macos_vms (macOS VMs on this Mac, provided or not), memory_gb or disk_gb (what the provided Spaces were given, in GB).
used2uint32In use now.
limit3uint32The limit (0: none).
reason4stringWhy the limit exists, for people ("Apple's macOS license allows two macOS VMs per Mac").

HostSpace#

A Space this host provides.

Field#TypeDescription
relay_machine1stringThe relay machine the Space is reached as (relay:<machine>).
local_space2stringThe Space on the host (local:<name>).
name3stringDisplay name.
image4stringThe image it runs, as requested.
os5stringGuest OS family: linux, macos or windows (empty when unknown).
kind6stringcontainer or vm (empty when unknown).
runtime7stringEngine: lume, runc, gvisor, qemu (empty when unknown).
created_by8stringThe account that created it (id, or email when the relay shares it).
created_at_ms9int64When it was created (Unix milliseconds).
direct_port10uint32A Space created with CreateHostSpaceRequest.direct: the TCP port on the host's own address that the host forwards to the Space's cua-spacesd (direct:<host address>:<direct_port>). 0 for a Space reached through the relay.
direct_token11stringThe Space's cua-spacesd token, set only in the CreateHostSpace response of a direct Space (the caller stores it like any direct Space's token). Empty otherwise.
egress_enforced20stringWhere its egress policy is enforced: "host"; empty without one.
network21stringThe guest network the host applied, set only in the CreateHostSpace response: none, or empty for the default. A host older than CreateHostSpaceRequest.network leaves it empty.
disk22HostSpaceDiskWhat the Space takes on the host's disk, set only when GetHostSpacesRequest.disk asked for it and the host could measure it. A host that predates it leaves it unset.

HostSpaceDisk#

What a Space takes on its host's disk (numbers only), as the host's resource sampler measured it: at most a few minutes old.

Field#TypeDescription
bytes1optional uint64Bytes only this Space holds: what deleting it frees. Unset when they could not be measured.
allocated2uint64Blocks its files occupy, clones counted in full: an upper bound.
shares_space3boolPart of it is shared with other copies.

GetHostSpacesRequest#

Request for HostSpacesService.GetHostSpaces.

Field#TypeDescription
disk1boolAlso say what each listed Space takes on this host's disk (HostSpace.disk). The host measures each Space at most every few minutes and answers from that, so asking costs it little; another of your devices asks while a window shows the sizes.

GetHostSpacesResponse#

Response for HostSpacesService.GetHostSpaces.

Field#TypeDescription
name1stringThis host's display name.
os2stringThe host's operating system (macos, linux, windows).
settings3HostSpacesSettingsSettings and limits.
capacity4repeated HostSpacesCapacityCurrent use of each limit.
spaces5repeated HostSpaceSpaces this host provides: every one for the owner, the caller's own otherwise.
audit6repeated HostSpacesAuditEventThe most recent audit events, newest first (the owner only).
images7repeated stringImage aliases this host resolves (macos, linux, ...), for clients to offer.
creating8repeated HostSpaceCreatingThe creates this host is running now (CreateHostSpace calls that have not returned), each with what it is doing: every one for the owner, the caller's own otherwise. A client polls this while its create runs, to show the download and the boot. Empty from a host that predates it.
node9HostNodeStatusWhat a scheduler needs to place work here: capacity, what runs, the host's epoch and clock. Unset from hosts that predate it.

CreateHostSpaceRequest#

Request for HostSpacesService.CreateHostSpace.

Field#TypeDescription
image1stringImage: a registry reference or an alias (macos, macos:26, linux). Empty uses the canonical Linux image.
kind2string"auto" (empty), "container" or "vm".
runtime3string"auto" (empty) or a runtime this host offers ("lume", "runc", ...).
name4stringName on the host. Empty generates space-<hex>.
cpus5uint32vCPUs (0: the default).
memory_mb6uint64Memory in MiB (0: the default).
disk_gb7uint32Disk in GiB for a VM (0: the image's).
attach8AttachRelayRequestThe relay machine the caller registered for this Space: the host attaches the new Space's driver to it (SystemService.AttachRelay), so the Space is reached as relay:<machine_id> and the host never holds an account credential. Empty when direct is set.
direct9boolCreate the Space without the relay (a host set up with --direct): it is reached at the host's address on HostSpace.direct_port, with HostSpace.direct_token. attach must be empty.
create_key10stringA key of the caller's for this create, under which GetHostSpacesResponse.creating lists its progress (a direct create has no relay machine to name it). Empty: attach.machine_id.
network12stringGuest network: none, or empty for the default.
fork_source11stringFork this checkpoint instead of creating from image.
headless14boolNo desktop (cua.daemon.v1.CreateSpaceRequest.headless).
egress19HostEgressPolicyEgress policy, enforced by the host from the guest's first instruction. A host that does not enforce it leaves HostSpace.egress_enforced empty.
network_settings20HostNetworkSettingsNetwork settings, compiled and enforced by the host. Unset: what network and egress say.
routed13boolReached through this host's channel (no relay machine of its own).
env15map of string to stringGuest environment; the host's driver settings win on a clash.
gpu16stringA GPU option of the host's runtime; empty: none.
tree21stringThe tree this Space joins on the host, when the caller made it a child of a Space on its own machine: the tree's id, qualified with the id of the machine it started on (<machine>/local:<name>). The host keeps the Space in that tree, so the tree's members on both machines reach each other. Empty: a tree of its own.

CreateHostSpaceResponse#

Response for HostSpacesService.CreateHostSpace.

Field#TypeDescription
space1HostSpaceThe new Space.

DeleteHostSpaceRequest#

Request for HostSpacesService.DeleteHostSpace.

Field#TypeDescription
space1stringThe relay machine of the Space (or its local:<name> on the host).

DeleteHostSpaceResponse#

Response for HostSpacesService.DeleteHostSpace.

Field#TypeDescription
message1stringWhat happened, for people.

DeleteCloudSpaceRequest#

Request for HostSpacesService.DeleteCloudSpace.

Field#TypeDescription
space1stringThe relay machine the cloud Space joined as.

DeleteCloudSpaceResponse#

Response for HostSpacesService.DeleteCloudSpace.

Field#TypeDescription
message1stringWhat was deleted, for people.

CancelHostSpaceRequest#

Request for HostSpacesService.CancelHostSpace.

Field#TypeDescription
space1stringThe relay machine the caller registered for the Space.

CancelHostSpaceResponse#

Response for HostSpacesService.CancelHostSpace.

Field#TypeDescription
message1stringWhat happened, for people: what was removed and what stays.

SetHostSpacePowerRequest#

Request for HostSpacesService.SetHostSpacePower.

Field#TypeDescription
space1stringThe relay machine of the Space (or its local:<name> on the host).
on2boolTrue turns it on, false off.

SetHostSpacePowerResponse#

Response for HostSpacesService.SetHostSpacePower.

Field#TypeDescription
state1string"running", "suspended" or "stopped": the state it is in now.
power2stringHow it turns off: "stop" or "suspend".
message3stringWhat happened, for people.

HostJobSpec#

What a job runs.

Field#TypeDescription
job_id1stringUnique id, chosen by the scheduler (the idempotency key on the host).
attempt2uint32Delivery attempt, from 1. A higher attempt fences lower ones.
image3stringImage of the job's Space (a reference or an alias); empty: the canonical Linux image.
kind4string"auto" (empty: the host picks: its own Space when it is dedicated, a macOS VM for a macOS image, else a container), "container", "vm", "microvm", or "machine" (a dedicated host's own Space, on hosts that report HostNodeStatus.dedicated). "process" is refused.
runtime5string"auto" (empty) or a runtime this host offers.
millicpus6uint32CPU reserved for the job, in thousandths (0: 1000).
memory_mb7uint64Memory reserved, in MiB (0: 1024).
argv8repeated stringThe command, run without a shell (["sh", "-c", "..."] for one).
env9map of string to stringIts environment.
timeout_secs10uint32Seconds the command may run (0: 600). The Space is deleted either way.
result_path11stringA file in the Space to return as the job's result after the command ends (bounded by max_output_bytes). Empty: none.
max_output_bytes12uint32Bytes of stdout, stderr and the result kept, each (the tail; 0: 65536).
bundle13bytesFiles the job runs with: a gzip tar (at most 1 MiB) unpacked into the job's work directory (mounted into its Space; its working directory, CUA_JOB_DIR) before the command starts. Empty: none.
run_id14stringThe run the job belongs to. A run keeps a data directory on each host (CUA_JOB_DATA, mounted into its members' Spaces) that every attempt of the run there shares (checkpoints), kept 7 days after its last attempt ended.
accelerator15stringThe accelerator asked for (gpu, apple, nvidia; empty: none): the job's Space gets that GPU.
services16repeated stringHost services the member reaches on its own loopback for its lifetime (for example compat:e2b). A host refuses a name it serves no provider for.

RunHostJobsRequest#

Request for HostJobsService.RunHostJobs.

Field#TypeDescription
jobs1repeated HostJobSpecThe jobs, at most 512 per call.
scheduler2stringThe scheduler's id, recorded with each job for people.

HostJobAck#

What a host did with one delivered job.

Field#TypeDescription
job_id1stringThe job.
attempt2uint32The attempt delivered.
outcome3stringaccepted (it runs now), duplicate (this attempt was delivered before: job is its record), rejected (no room or not allowed: place it elsewhere) or stale (a newer attempt was seen, or this one was canceled).
reason4stringWhy, for rejected and stale.
job5HostJobThe job's record on this host, for accepted and duplicate.

RunHostJobsResponse#

Response for HostJobsService.RunHostJobs.

Field#TypeDescription
acks1repeated HostJobAckOne per delivered job, in order.
node2HostNodeStatusThe host after the batch.

HostJob#

A job's record on a host.

Field#TypeDescription
job_id1stringThe job.
attempt2uint32The newest attempt the host has seen for it.
state3stringrunning, succeeded (exit 0), failed (the command exited non-zero or ran out of time), error (the host could not run it: the Space did not start, the daemon restarted mid-job; running it again may work) or canceled.
exit_code4optional int32The command's exit code (succeeded and failed).
timed_out5boolThe command ran out of time.
stdout6bytesThe tail of its stdout.
stderr7bytesThe tail of its stderr.
result8bytesThe result file (HostJobSpec.result_path).
error9stringWhat went wrong, for error, canceled and a missing result file.
seq10uint64Ledger sequence number of this change.
space11stringThe Space it ran in (local:<name>).
accepted_at_ms12int64When the host accepted it (Unix milliseconds, host clock).
finished_at_ms13int64When it ended (0 while running).
create_ms14uint32Milliseconds to create its Space.
run_ms15uint32Milliseconds the command ran.
delete_ms16uint32Milliseconds to delete its Space.
truncated17boolstdout, stderr or the result were cut to their tail.

GetHostJobRequest#

Request for HostJobsService.GetHostJob.

Field#TypeDescription
job_id1stringThe job.
output_from2optional uint64Also return the job's live output (its command's merged stdout and stderr, output.log) from this byte offset: output_chunk and output_size in the answer, while it runs and after it ended.

GetHostJobResponse#

Response for HostJobsService.GetHostJob.

Field#TypeDescription
job1HostJobIts record (the call fails with NOT_FOUND when the host never saw it).
node2HostNodeStatusThe host now.
output_chunk3bytesWith output_from: the job's output from that offset, at most 256 KiB (empty when there is nothing new, or for a job that keeps no output log).
output_size4uint64With output_from: the size of the job's output so far (read the next chunk from output_from + len(output_chunk)).

ListHostJobsRequest#

Request for HostJobsService.ListHostJobs.

Field#TypeDescription
after_seq1uint64Changes after this ledger sequence number (0: from the start).
limit2uint32At most this many (0: 1000).
wait_ms3uint32Hold the call up to this long while nothing changed (0: answer now; at most 30000).
without_output4boolLeave out stdout, stderr and the result.
release5repeated HostJobRefGang members whose start barrier the scheduler releases: every member of their attempt reported ready (ListHostJobsResponse.progress). The host lets each go (CUA_BARRIER/go); sending one again is harmless.

HostJobRef#

One attempt of one job.

Field#TypeDescription
job_id1stringThe job.
attempt2uint32Its attempt.

HostJobProgress#

What a running job reported about itself (its start barrier and its progress: heartbeats from the cua jobs runtime, else its output).

Field#TypeDescription
job_id1stringThe job.
attempt2uint32Its attempt.
ready3boolIt is ready to start (its environment is up) and waits at its start barrier.
released4boolIts start barrier was released.
last_progress_ms5int64When it last reported progress, by the host's clock (Unix ms; 0: never). Compare with HostNodeStatus.host_time_ms.
step6int64The step it last reported (-1: none).

ListHostJobsResponse#

Response for HostJobsService.ListHostJobs.

Field#TypeDescription
jobs1repeated HostJobThe latest record of each job that changed, by sequence number.
next_seq2uint64Pass as after_seq next time.
more3boolMore changes are waiting (the limit cut the answer).
node4HostNodeStatusThe host now: the heartbeat.
progress5repeated HostJobProgressEach running job's start barrier and progress (only jobs that report them).

CancelHostJobRequest#

Request for HostJobsService.CancelHostJob.

Field#TypeDescription
job_id1stringThe job.
attempt2uint32Cancel this attempt and every lower one (0: whatever runs).
reason3stringWhy, for the record.

CancelHostJobResponse#

Response for HostJobsService.CancelHostJob.

Field#TypeDescription
job1HostJobThe job's record after the cancel.

HostSpacesAuditEvent#

One line of the host's Spaces audit log.

Field#TypeDescription
ts_ms1int64Unix milliseconds.
action2stringcreate, delete, refused, or config.
who3stringWho: an account (name <email> (id)), or local for this machine.
space4stringThe relay machine or Space the event is about.
detail5stringDetail for people.

HostSpaceCreating#

A create a host is running, and what it is doing now. The progress fields are those of cua.daemon.v1.CreateSpaceProgress.

Field#TypeDescription
key1stringThe create's key: CreateHostSpaceRequest.create_key, else the relay machine it attaches to (attach.machine_id).
phase2string"preparing", "pulling", "creating", "booting", "waiting_for_services", "connecting" or "ready", in that order.
fraction3optional doubleHow far through the phase, 0.0 to 1.0, when its size is known (an image pull).
detail4stringOne short line, for example the image being pulled.
bytes_done5optional uint64Bytes downloaded so far, when the step counts them (an image pull).
bytes_total6optional uint64Bytes the download has in all.
bytes_per_second7optional doubleSmoothed download rate, bytes per second.

CallThreadToolRequest#

Request for HostThreadService.CallThreadTool.

Field#TypeDescription
space1stringThe Space: relay:<machine> (or <machine>), as other devices know it, or its id on the host (local:<name>).
name2stringThe tool's name (a former name works too).
arguments_json3stringThe tool's arguments as a JSON object; its space is replaced by the host's id of space.

CallThreadToolResponse#

Response for HostThreadService.CallThreadTool.

Field#TypeDescription
content_json1stringMCP content parts, as a JSON array.
structured_json2stringMCP structured content as JSON (empty: none).
is_error3boolThe tool failed (a refusal, a bad argument): the content says why.
meta_json4stringMCP _meta as JSON (empty: none).

ThreadView#

What a person was looking at in a Space as they posted to its thread: the Space's desktop, or one of its windows. thread_post takes it as view, and every entry and task that has one returns it (thread_read, thread_inbox), as JSON with these field names (CallThreadTool's arguments_json and structured_json). Typed clients read it as this message; the daemon's thread::ViewContext is held to it by a test.

Field#TypeDescription
kind1stringdesktop or window.
app2stringThe window's app ("Firefox"); empty for the desktop.
title3stringThe window's title ("Pull requests"), at most 256 characters.
window_id4stringThe window's id in the Space, as computer_window_list gives it.