Skip to content

List the roster

GET
/api/roster
curl --request GET \
--url http://127.0.0.1:7799/api/roster \
--cookie cotal_web_session=<cotal_web_session>

Return the dashboard observer’s current presence roster. Rows can include offline peers; freshness is reported separately by the presence-view SSE event.

The current snapshot or history page.

Media typeapplication/json
Array

Presence plus an optional progress signal. Working rows currently report progress.kind as unknown because the dashboard has no session-store observer.

object
activeAt

Epoch ms of the last work progress the harness reported (a turn event such as a token or a tool call). ts is only the heartbeat: a seat whose turn stopped advancing keeps heartbeating while this stays old. Missing means the connector reports none.

number
activity

Freeform “what I’m doing right now”.

string
activitySince

Epoch ms when the current activity was set. A status change does not move it, so an activity left behind while hooks flip the status every turn still reads as old.

number
attention

This instance’s current global attention mode. Advisory, within-space observability — a peer can see “they’re in focus” and choose to DM. Published from the connector’s authoritative state (presence is a mirror, never the source of truth for delivery). open/absent ⇒ receives all.

string
Allowed values: open dnd focus
card
required

A2A-inspired identity record for an endpoint or agent.

object
actor

The agent-instance actor token under {@link owner } (server-derived from the spawn ledger in user mode; the connection id in the dev default). The other half of {@link id } .

string
description

A2A-style one-line summary of what this agent does (discovery / observability).

string
id
required

Unique, stable for the lifetime of this connection. The owner+actor principal dot-form <owner>.<actor> (= principalKey().key) under the owner+actor grammar — the wire identity every msg.from.id carries and every sender guard compares against. Peers address each other by this.

string
kind
required

‘agent’ (participates in coordination) or a plain ‘endpoint’ (logger, dashboard…).

string
Allowed values: agent endpoint
meta

Free-form advisory display metadata. Reserved flat string keys are connector, model, provider (the effective provider the connector reported), host, cwd, repo, branch, head, sessionKind, and sessionId.

object
key
additional properties
name
required

Human-readable display name.

string
owner

The human/account owner token this agent acts under (opaque, per-space; "local" in the no-login dev default). One of the two halves of {@link id } ; travels in presence so peers resolve name→principal.

string
protocolVersion

Wire-contract version this participant speaks (the SPEC.md version, "0.2" today). A change signal, not negotiation: v0 has none, but a peer can detect a mismatch instead of silently misreading a future envelope. Omitted ⇒ assume the v0.x line.

string
role

Cotal addition: the role this participant plays (planner, reviewer, …).

string
skills
Array<object>
object
description
string
id
required
string
name
required
string
tags

Cotal: free-form “what it can do” tags (A2A skill-tags, flattened) — discovery only.

Array<string>
channelModes

Per-channel attention overrides this instance currently has (runtime, reset on restart). Keys are concrete channel names. Advisory: lets a peer see “locally muted #deploys → DM to reach me”. NOT access control — the broker still authorizes and delivers; this is a receive-side presentation.

object
key
additional properties

Per-channel attention override (more specific than the global {@link AttentionMode } ).

  • quiet — still delivered + buffered, but never wakes; an @-mention still wakes (per-channel dnd).
  • muted — channel messages dropped on receive, incl. @-mentions (“don’t receive this channel”).
string
Allowed values: quiet muted
condition

Structured condition reported by the harness. Missing means nothing was reported.

object
code
required

Closed, provider-neutral categories a connector may relay from its harness’s native signal.

string
Allowed values: rate_limit overloaded auth billing budget context model request server retrying approval input failed
message

Free-text detail reported by the harness.

string
since

Epoch ms when this condition began.

number
source

The harness’s native value, preserved verbatim.

string
environment

Opaque reference whose meaning belongs to the provider that issued it.

string
lifecycleUid

This incarnation’s lifecycle UID (SPEC §6/§13.1: MUST in auth mode from v0.4) — the value the alias currently maps to, published so peers/observers can attribute the alias’s live occupant. Advisory observability, never authority (authority is the ledger/broker grants).

string
runtime

The process that publishes this record, with its observed start. Status, activity, heartbeats and reconnects inside the process leave it unchanged; a new process publishes a new one. An offline record keeps it to name the process that went away, so it dates a running duration only while the record is live. Missing means the publisher reports none: unknown, not zero.

object
id
required

Opaque CSPRNG id minted once per OS process and lifecycleUid scope, never reused. A new process or lifecycle scope gets a new id; reconnect within that scope keeps it.

string
source
required

Where a {@link PresenceRuntime } start was observed. Closed: a consumer that meets any other value treats the observation as unsupported rather than guessing what it dates.

  • endpoint-process: the OS process that holds this presence’s mesh connection, observed by that process itself.
string
Allowed value: endpoint-process
startedAt
required

Epoch ms when the process started, read in-process from its own clock origin (performance.timeOrigin). Never a launch request, registration, heartbeat, status or activity time. Every lifecycle in this process shares this start, including one registered later. It does not date a separate parent, model harness or lifecycle.

number
status
required

Lifecycle status of a participant.

  • idle: connected, no active task
  • waiting: blocked — awaiting input, approval, or a peer
  • working: actively executing a task / in a turn
  • offline: disconnected or heartbeat lapsed (derived by observers, not self-set while live)
string
Allowed values: idle waiting working offline
statusSince

Epoch ms when the instance entered its current status and activity. A change to either moves it; a heartbeat or a repeated report does not, so an activity that outlived what it described reads as old even while ts stays fresh. Never carried by an offline record.

number
ts
required

Epoch ms of the last heartbeat.

number
progress
object
kind
required
string
Allowed value: unknown

Example

[
{
"attention": "open",
"card": {
"kind": "agent"
},
"channelModes": {
"additionalProperty": "quiet"
},
"condition": {
"code": "rate_limit"
},
"runtime": {
"source": "endpoint-process"
},
"status": "idle",
"progress": {
"kind": "unknown"
}
}
]

A valid one-use k query token is exchanged for a dashboard session. The response redirects to the same path without its query. A valid existing cookie takes precedence over k.

Location
string

The requested path without the query string.

Set-Cookie
string

Cotal_web_session=; Path=/; HttpOnly; SameSite=Strict. The default local listener uses HTTP.

No valid session, an invalid launch token, or a spent launch token. The readiness credential does not authorize these routes.

Media typeapplication/json
object
error
required
string
Allowed values: unauthenticated launch-token-already-used

Example

{
"error": "unauthenticated"
}

Origin is checked before session authentication. An origin outside this listener’s allowed origins is refused.

Media typeapplication/json
object
error
required
string
Allowed value: cross-origin

Example

{
"error": "cross-origin"
}

These read routes accept no request body. An announced body is refused before it is read; the connection is closed.

Media typeapplication/json
object
error
required
string

Examplegenerated

{
"error": "example"
}

The request failed. The body names the failure; a failed read does not terminate the dashboard.

Media typeapplication/json
object
error
required
string

Examplegenerated

{
"error": "example"
}