Interactive Session API: schemas

The request and response bodies of the operations in this API.

AttachSkillDto

Type: object

AttachWorkspaceActionDto

PropertyTypeRequiredDescription
actionone of "attach"yesDiscriminator: attach an existing workspace.
workspaceIdstringyes

AttachedSkillDto

PropertyTypeRequiredDescription
attachedBystringyesActor that attached it.
createdAtstringyesWhen it was attached, ISO-8601.
descriptionstringyesSkill description at attach time.
failureSkillAttachmentFailureDtonoPresent with status = failed. A skill_content_mismatch kind means the skill changed under the pin: re-attach to pick up the new revision.
idstringyesAttachment id.
namestringyesDisplay name at attach time.
skillSlugstringyesSlug of the attached skill.
statusSkillAttachmentStatusyesWhere the attachment is relative to the worker's bound skill set: pending and detach_pending are in flight, bound is on the worker, failed carries failure.

AttachedSkillDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of AttachedSkillDtoyes

AttachedSkillDtoDataEnvelope

PropertyTypeRequiredDescription
dataAttachedSkillDtoyes

AttachmentClass

Type: one of "uploaded_file"

AttachmentResponseDto

PropertyTypeRequiredDescription
attachmentClassAttachmentClassyes
contentTypestring or nullno
createdAtstring (date-time)yes
fileNamestring or nullno
fileSizeBytesnumber or nullno
idstringyes
objectKeystring or nullno
referenceIdstring or nullno
sessionIdstringyes
statusSessionAttachmentStatusyesUploaded files transition pending_upload → ready after the SAS upload-complete step succeeds.
uploadedAtstring (date-time) or nullnoSet when the row transitioned to ready (upload-complete).
urlstring or nullno

AttachmentResponseDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of AttachmentResponseDtoyes

AttachmentResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataAttachmentResponseDtoyes

AttachmentUploadInitResponseDto

PropertyTypeRequiredDescription
attachmentIdstringyesDraft attachment row id. Pass to POST /sessions/:id/attachments/:attachmentId/upload-complete.
expiresAtstring (date-time)yesAbsolute timestamp when the SAS stops being accepted.
objectKeystringyesObject key the SAS is bound to. Returned for diagnostics; the browser does NOT need to set it — the URL already points at the right blob.
requiredHeadersmap of stringyesHeaders the browser MUST send on the PUT verbatim.
uploadUrlstringyesPresigned PUT URL the browser uploads the bytes to.

AttachmentUploadInitResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataAttachmentUploadInitResponseDtoyes

BranchStrategy

Type: one of "auto_create", "use_existing", "none"

BranchThreadDto

PropertyTypeRequiredDescription
titlestringnoBranch title. Defaults to a title derived from the parent.

BuildImageResultDto

PropertyTypeRequiredDescription
digeststringyesResolved image manifest digest (sha256:…).
durationMsnumberyesWall-clock duration of the Kaniko build in milliseconds.
imageRefstringyesFully qualified <registry>/<repo>:<tag> reference.

BuildImageStartedResponseDto

PropertyTypeRequiredDescription
imageRefstringyesImage reference the workflow will push to on success — <registry>/<orgId>/<projectId>:sha-<short>. Surfaced up-front so the FE can show what the build is producing.
runIdstringyesTemporal run id assigned to this execution.
shastringyesSHA the build is anchored on (full git SHA of the primary repo HEAD).
workflowIdstringyesDeterministic Temporal workflow id — build:<sessionId>:<sha>.

BuildImageStartedResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataBuildImageStartedResponseDtoyes

BuildImageStatusResponseDto

PropertyTypeRequiredDescription
failureMessageobject or nullnoFailure detail — present only on terminal-failure statuses. Null otherwise. Surfaced verbatim to the FE toast.
resultBuildImageResultDto or nullnoResolved image — present only when status === COMPLETED. Null while running or on failure.
runIdstringyes
statusstring (10 values)yes
workflowIdstringyes

BuildImageStatusResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataBuildImageStatusResponseDtoyes

CommitDto

PropertyTypeRequiredDescription
messagestringyesCommit message

CompactSessionDto

PropertyTypeRequiredDescription
threadIdstringnoThread whose conversation to compact. Must belong to the session. Defaults to the session's default thread.

CreateBranchDto

PropertyTypeRequiredDescription
baseBranchstringnoBase branch to create from (default: current HEAD)
branchNamestringyesBranch name to create

CreateLaunchDefinitionDto

PropertyTypeRequiredDescription
slugstringyes

CreateSandboxSessionDto

PropertyTypeRequiredDescription
launchSessionLaunchBodyDtoyes
mockToolsbooleannoWhen true, this sandbox runs against the mcp-gateway test-mode MOCK tool bridge — tool calls return canned responses instead of hitting live MCP services. Default false (live tools).
toolMocksarray of SandboxToolMockDtonoOptional per-tool canned mock responses to register for this sandbox at create time. Supplying a non-empty array implies mockTools = true — the sandbox runs against the mcp-gateway test-mode mock bridge. Equivalent to a follow-up PUT /sessions/sandbox/{id}/tool-mocks call.
ttlMinutesnumbernoSandbox lifetime in minutes (default 30, max 240). A periodic sweeper disposes the sandbox once the TTL elapses.

CreateSessionDto

PropertyTypeRequiredDescription
approvalResumeSessionApprovalResumeDtono
internetEgressCeilingWorkerInternetEgressnoOptional narrowing of whether this session's workspace pod may open sockets to the public internet. Tighten-only and pinned for the session's life. Absent states nothing.
invocationOverlayobjectyesStrict kernel InvocationOverlay v2; unknown keys are rejected.
launchDefinitionSessionRevisionTargetDtoyes
runtimeProfileSessionRuntimeProfileChoiceDtonoOptional choice among the runtime profiles the launch definition admits. Absent: the launch definition's pinned default runtime profile (declared behaviour). Frozen for the session's life.
sessionDomainSessionDomainDtonoThe domain object this session is launched FOR. When present, the caller must hold the object's edit relation (a PDP verdict on the object, never a check of what the request says); relation states whether the object contains the session or is only referred to. Absent ⇒ a session for no domain object.
titlestringno
workspaceNoWorkspaceActionDto or AttachWorkspaceActionDto or CreateWorkspaceActionDtoyesWorkspace action. Discriminated on action.

CreateThreadDto

PropertyTypeRequiredDescription
titlestringnoThread title. Defaults to "New thread" when omitted.

CreateWorkspaceActionDto

PropertyTypeRequiredDescription
actionone of "create"yesDiscriminator: allocate a new workspace for this session.
backingSessionWorkspaceBackingDtoyes
displayNamestringyes
slugstringyes

CreateWorkspaceBackingDto

PropertyTypeRequiredDescription
kindWorkspaceBackingKindyes

CreateWorkspaceDto

PropertyTypeRequiredDescription
backingCreateWorkspaceBackingDtoyes
displayNamestringyes
slugstringyes

CursorPaginationMeta

PropertyTypeRequiredDescription
hasMorebooleanyesWhether another page exists. Mandatory for cursor pagination (§3.3).
limitnumbernoThe page size this scan was asked for.
nextCursorstring or nullyesOpaque continuation token, or null on the last page. Clients MUST NOT parse it, construct one, or derive meaning from its structure.

DeliverableReactionPhase

The phase this validation reacted in.

Type: one of "live", "checkpoint"

DeliverableValidationIssueDto

PropertyTypeRequiredDescription
codestringyesStable machine code of the defect.
messagestringyesThe validator's own words; can quote file content.
pathstring or nullyesThe deliverable path the issue is about, when it has one.
severityDeliverableValidationIssueSeverityyes

DeliverableValidationIssueSeverity

Type: one of "warning", "error"

DeliverableValidationUnavailableReason

Type: one of "peer_not_deployed", "peer_refused", "authority_unavailable", "peer_response_unreadable", "verdict_pending", "workspace_unreadable", "check_failed"

DomainLaunchAccessResponseDto

PropertyTypeRequiredDescription
allowedbooleanyesTrue when the caller holds the edit relation a launch for the object requires.

DomainLaunchAccessResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataDomainLaunchAccessResponseDtoyes

EnvironmentDriftDetectedPayloadDto

PropertyTypeRequiredDescription
currentHashstringyesHash of the freshly-resolved environment snapshot.
driftsarray of EnvironmentDriftEntryDtoyesPer-field diff between previous and current snapshot.
previousHashstringyesHash of the previously-recorded environment snapshot.

EnvironmentDriftEntryDto

PropertyTypeRequiredDescription
afterobjectnoValue at the current snapshot. Omitted when the field was removed.
beforeobjectnoValue at the previous snapshot. Omitted when the field did not exist before.
kindstringyesDrift category (e.g. "tool_added", "tool_removed", "model_changed").
pathstringyesDotted path identifying the changed field within the environment snapshot.
severitystringyesSeverity tier reported by the bootstrap drift detector.

ExactRevisionSelectorDto

PropertyTypeRequiredDescription
contentHashstringyes
kindone of "exact"yesDiscriminator: an already-immutable revision pin.
revisionIdstringyes

ForkSessionDto

PropertyTypeRequiredDescription
titlestringnoTitle for the forked session (defaults from the parent).

FrameProminence

Whether a quiet client shows the event: primary (the primary agent's answer, the asks a user must answer and their settlement, the primary agent's plan, the turn outcome) or secondary (sub-agent activity, tool calls and results, reasoning, usage, file and LSP activity, internal lifecycle). Present only on an event a runtime frame produced; absent on every other event (user messages, status, git, attachments) and on events written before this field existed. A quiet filter hides only secondary.

Type: one of "primary", "secondary"

GitCommitEntryDto

PropertyTypeRequiredDescription
authorEmailstringyes
authorNamestringyes
datestringyes
hashstringyes
messagestringyes

GitCommitEntryDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of GitCommitEntryDtoyes

GitCommitResponseDto

PropertyTypeRequiredDescription
commitHashstringyes
messagestringyes

GitCommitResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataGitCommitResponseDtoyes

GitStatusResponseDto

PropertyTypeRequiredDescription
addedarray of stringyes
branchstringyes
deletedarray of stringyes
modifiedarray of stringyes
reposarray of RepoGitStatusDtoyesPer-repository status — one entry per /workspace/repos/<slug>/.
untrackedarray of stringyes

GitStatusResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataGitStatusResponseDtoyes

HookBindingReadinessDto

PropertyTypeRequiredDescription
bindingIdstringyesOpaque binding id; quote it to an administrator.
reasonCodeHookBindingReadinessReasonnoPresent iff state is not ready.
requiredbooleanyesWhether a failure of this binding fails the tool call.
spaceKindSpaceKindyesThe tier of the Space the binding lives in (set by your organization, project or you).
stateHookBindingReadinessStateyes

HookBindingReadinessReason

Present iff state is not ready.

Type: one of "receiver-refused", "fan-out-skipped", "execute-authority-unauthorized", "execute-authority-unprovisioned", "execute-authority-ended", "receiver-check-unavailable"

HookBindingReadinessState

Type: one of "ready", "failing-closed", "skipped", "unknown"

HookEvaluationFailureCause

Why the evaluation failed as a whole; present only when outcome is failed.

Type: one of "projection-unavailable", "scope-refused", "recursion", "fan-out-saturated", "phase-failed", "receiver-refused", "timeout"

HookFailureCode

The kernel failure code of that binding.

Type: string (10 values)

HookFeedReadinessDto

PropertyTypeRequiredDescription
stateHookProjectionStateyesState of this replica's projection of the binding registry. Anything but synced fails evaluations closed.
syncedAtstring (date-time) or nullyesWhen this replica last proved the projection current; null if never.

HookMode

Type: one of "admit", "transform", "defer", "respond"

HookPhase

Type: one of "transform", "validate", "respond"

HookPointReadinessDto

PropertyTypeRequiredDescription
bindingsarray of HookBindingReadinessDtoyesEmpty when the projection is unavailable or scope resolution refused the set.
hookPointIdstringyesThe declared hook point id (e.g. agent-session.tool.execute).
realizationHookPointRealizationyesHow the point reaches this session's tool calls.
reasonCodeHookPointReadinessReasonnoPresent iff state is not ready.
stateHookPointReadinessStateyes

HookPointReadinessReason

Present iff state is not ready.

Type: one of "not-realized-by-runtime", "projection-unavailable", "scope-refused", "fan-out-saturated", "required-binding-not-ready", "receiver-check-unavailable", "optional-binding-not-ready"

HookPointReadinessState

Type: one of "unenforced", "failing-closed", "degraded", "ready"

HookPointRealization

How the point reaches this session's tool calls.

Type: one of "runtime", "unrealized"

HookProjectionState

State of this replica's projection of the binding registry. Anything but synced fails evaluations closed.

Type: one of "synced", "unhydrated", "stale", "revision-mismatched", "failed"

InitAttachmentUploadDto

PropertyTypeRequiredDescription
contentTypestringyesMIME type of the file. Pinned into the SAS — the browser MUST send the PUT request with exactly this Content-Type header or the upload fails.
fileNamestringyesOriginal filename — extension drives the allowed-file check.
fileSizeBytesnumberyesFile size in bytes. Verified against the blob HEAD on complete.

InspectStepResultDto

PropertyTypeRequiredDescription
dataobjectno
errorstringno
kindstring (15 values)yes
statusone of "ok", "error", "timeout", "page-navigated", "off-domain", "skipped", "output-surface-not-open"yes

InvitableParticipantRole

Role to assign. owner is not invitable — ownership is set at session-create time (one per session).

Type: one of "editor", "viewer"

InviteParticipantDto

PropertyTypeRequiredDescription
avatarUrlstringno
displayNamestringyes
roleInvitableParticipantRoleyesRole to assign. owner is not invitable — ownership is set at session-create time (one per session).
subjectRefstringyesKeycloak user id (Xema identity) of the user being invited. The capability-router grant check uses this as the subject ref.

LaunchDefinitionDraftResponseDto

PropertyTypeRequiredDescription
baseRevisionIdstring or nullyes
contentobjectyes
draftIdstringyes
resourceIdstringyes
restoredFromRevisionIdstring or nullyes
updatedAtstring (date-time)yes
updatedBySubjectRefResponseDtoyes

LaunchDefinitionDraftResponseDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of LaunchDefinitionDraftResponseDtoyes

LaunchDefinitionDraftResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataLaunchDefinitionDraftResponseDtoyes

LaunchDefinitionIdentityFieldsResponseDto

PropertyTypeRequiredDescription
createdAtstring (date-time)yes
createdBySubjectRefResponseDtoyes
ownerSpaceRefOwnerSpaceRefResponseDtoyes
resourceIdstringyes
resourceKindone of "launch-definition"yes
slugstringyes

LaunchDefinitionLaunchability

Whether this definition can be launched, and when it cannot, why. Present on EVERY row. Do NOT re-derive it from an absent presentation: that absence has two causes — nothing published, and nothing promoted — which need different actions from the reader, and a derived predicate labels a rolled-back definition "unpublished" to the person who published it.

Type: one of "launchable", "not-promoted", "never-published"

LaunchDefinitionListItemResponseDto

PropertyTypeRequiredDescription
identityLaunchDefinitionIdentityFieldsResponseDtoyes
launchabilityLaunchDefinitionLaunchabilityyesWhether this definition can be launched, and when it cannot, why. Present on EVERY row. Do NOT re-derive it from an absent presentation: that absence has two causes — nothing published, and nothing promoted — which need different actions from the reader, and a derived predicate labels a rolled-back definition "unpublished" to the person who published it.
pointersLaunchDefinitionPointersResponseDtoyes
presentationLaunchDefinitionPresentationResponseDtono
presentationRevisionIdstringnoWhich revision supplied presentation, so its provenance is visible. It is the revision on the stable release channel — the one a launch resolves — and NOT the newest by sequence.

LaunchDefinitionListItemResponseDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of LaunchDefinitionListItemResponseDtoyes

LaunchDefinitionPointersResponseDto

PropertyTypeRequiredDescription
draftIdstring or nullyes
resourceIdstringyes

LaunchDefinitionPresentationResponseDto

PropertyTypeRequiredDescription
iconRefstringno
labelstringyes
summarystringno
surfacesarray of LaunchSurfaceKindyes

LaunchDefinitionReleaseHistoryResponseDto

PropertyTypeRequiredDescription
actorClientIdstringyes
channelone of "stable"yes
channelVersionnumberyes
createdAtstring (date-time)yes
operationone of "promote", "rollback", "retire"yes
reasonstringyes
releaseSetIdstringyes
retiredbooleanyes
rollbackOfReleaseSetIdstringno
targetLaunchDefinitionReleaseTargetResponseDtoyes

LaunchDefinitionReleaseHistoryResponseDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of LaunchDefinitionReleaseHistoryResponseDtoyes

LaunchDefinitionReleaseSelectorResponseDto

PropertyTypeRequiredDescription
contentHashstring (sha256)yes
kindone of "exact"yes
revisionIdstringyes

LaunchDefinitionReleaseTargetResponseDto

PropertyTypeRequiredDescription
resourceIdstringyes
resourceKindone of "launch-definition"yes
selectorLaunchDefinitionReleaseSelectorResponseDtoyes

LaunchDefinitionRescopeTarget

Target owner tier. org is the only legal target — it is the only one the kernel promotion table admits from a tier this registry owns. Demotion, same-tier, and moves into or out of system/biome are refused with 422.

Type: one of "org"

LaunchDefinitionResponseDto

PropertyTypeRequiredDescription
identityLaunchDefinitionIdentityFieldsResponseDtoyes
pointersLaunchDefinitionPointersResponseDtoyes

LaunchDefinitionResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataLaunchDefinitionResponseDtoyes

LaunchDefinitionRevisionResponseDto

PropertyTypeRequiredDescription
contentobjectyes
contentHashstring (sha256)yes
createdAtstring (date-time)yes
createdBySubjectRefResponseDtoyes
idempotencyKeystringyes
resourceIdstringyes
restoredFromRevisionIdstring or nullyes
revisionIdstringyes
sequencenumberyes

LaunchDefinitionRevisionResponseDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of LaunchDefinitionRevisionResponseDtoyes

LaunchDefinitionRevisionResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataLaunchDefinitionRevisionResponseDtoyes

LaunchRevisionSelectorKind

Type: one of "exact", "release-channel"

LaunchRuntimeProfileOptionDto

PropertyTypeRequiredDescription
authModeRuntimeAuthModeyes
availabilityRuntimeProfileAvailabilityyes
isDefaultbooleanyesTrue for the launch definition's pinned default, the profile a launch naming none uses.
runtimeKindstringyesA runtime id contributed by a worker runtime adapter.
runtimeProfileSessionExactResourcePinDtoyes

LaunchRuntimeProfilesResponseDto

PropertyTypeRequiredDescription
launchDefinitionSessionExactResourcePinDtoyes
optionsarray of LaunchRuntimeProfileOptionDtoyesThe admitted runtime profiles, the pinned default first.

LaunchRuntimeProfilesResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataLaunchRuntimeProfilesResponseDtoyes

LaunchSurfaceKind

Type: one of "web", "portal", "conversation-channel"

ListSessionParticipantsResponseDto

PropertyTypeRequiredDescription
participantsarray of SessionParticipantDtoyes

ListSessionParticipantsResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataListSessionParticipantsResponseDtoyes

MemberSubjectKind

Discriminator of the authoring subject — a Xema user. An external-contact author is stamped only by an organization session's holder workload, never stated by a caller.

Type: one of "org_user"

MergeCheckResponseDto

PropertyTypeRequiredDescription
conflictsarray of stringyesFiles with merge conflicts (empty when mergeable is true)
mergeablebooleanyesWhether the session branch can merge cleanly into the target

MergeCheckResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataMergeCheckResponseDtoyes

MessageResponseDto

PropertyTypeRequiredDescription
actorSessionMessageActorDto or nullyesWho wrote this message. null for agent-authored roles (the agent is agentSlug) and for messages written before attribution existed.
agentSlugstringyes
contentstringyes
createdAtstring (date-time)yes
idstringyes
metadataobject or nullnoFree-form metadata: tool traces, model attribution, token accounting. Shape varies per producer. Consumers must treat unknown keys defensively.
roleSessionMessageRoleyes
sessionIdstringyes
threadIdstringyesConversation thread this message belongs to

MessageResponseDtoPaginatedEnvelope

PropertyTypeRequiredDescription
dataarray of MessageResponseDtoyes
paginationPaginationMetayes

NoWorkspaceActionDto

PropertyTypeRequiredDescription
actionone of "none"yesDiscriminator: launch without a workspace.

OutputSurfaceAppResponseDto

PropertyTypeRequiredDescription
createdAtstringyes
externalUrlstring or nullnoPublic share URL (https://{token}.{apex}/). Present while the app is registered with the gateway.
idstringyes
installCommandstring or nullnoExact install command that ran (or will run), space-joined.
installEcosystemstring or nullnoPackage manager / ecosystem that drove the last install step. Present when status is installing / install_failed / running (install already ran).
installStderrTailstring or nullnoTruncated stderr tail captured on install failure. Populated only when status=install_failed.
kindProjectKindyes
lastErrorstring or nullno
lastExitCodenumber or nullno
namestringyes
openApiPathstring or nullno
portnumber or nullno
repoSlugstringyes
sessionIdstringyes
statusOutputSurfaceAppStatusyes
tokenGenerationnumberyes
updatedAtstringyes

OutputSurfaceAppResponseDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of OutputSurfaceAppResponseDtoyes

OutputSurfaceAppResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataOutputSurfaceAppResponseDtoyes

OutputSurfaceAppStatus

Type: one of "detected", "declaration_needed", "installing", "install_failed", "starting", "running", "crashed", "stopped"

OutputSurfaceRemediationKindInput

Which remediation widget raised this — drives template selection.

Type: one of "install_error", "declaration_missing", "declaration_invalid", "runtime_error"

OutputSurfaceRestartMode

Type: one of "smart", "restart_only", "reinstall"

OwnerSpaceRefResponseDto

PropertyTypeRequiredDescription
fenceone of "global", "tenant"yes
orgIdstring or nullyes
spaceSpaceRefResponseDtoyes

PaginationMeta

PropertyTypeRequiredDescription
hasMorebooleanno
limitnumberno
nextCursorstring or nullno
pagenumberno
previousCursorstring or nullno
totalnumberno
totalPagesnumberno

ParticipantRole

Role inside this session. Closed set.

Type: one of "owner", "editor", "viewer"

ParticipantSubjectKind

Discriminator on subjectRef. Closed set: org_user is a Xema identity; external_contact is a person reached through a conversation channel.

Type: one of "org_user", "external_contact"

ProblemActionableBy

Who can act on this refusal: user (correct the input, sign in), org-admin (an administrator of the organisation), platform (the operators of this installation), none (nobody — it cannot succeed). ABSENT when not known; never guessed.

Type: one of "user", "org-admin", "platform", "none"

ProblemDetailsDto

RFC 9457 problem document. The declared members are the reserved core; extension members are TOP-LEVEL and OPEN, owned by the refusing plane.

PropertyTypeRequiredDescription
actionableByProblemActionableBynoWho can act on this refusal: user (correct the input, sign in), org-admin (an administrator of the organisation), platform (the operators of this installation), none (nobody — it cannot succeed). ABSENT when not known; never guessed.
codestringyesSCREAMING_SNAKE_CASE. The machine-branchable refusal, and the value a policy rule, a retry predicate and a UI branch all name.
detailstringnoHuman-readable and specific to THIS occurrence.
errorsarray of ProblemFieldIssueDtonoField-level issues, when the refusal is about the request body.
instancestringnoURI reference identifying the occurrence — a request path, a run, a row.
paramsmap of string or number or booleannoSafe i18n interpolation values for the message keyed by code — typed and allowlisted per code by its declaration. Never server-authored copy, never internal diagnostics.
retryProblemRetrynoWhat a retry can achieve: transient (later, unchanged), after-change (only after someone changes something), never (a defect until a fixed version ships). ABSENT when not known.
statusnumberyesThe HTTP status code, repeated in the body so a logged document is self-contained.
titlestringyesShort, human-readable, and STABLE for a given type. Never per-occurrence — that is detail.
traceIdstringnoW3C trace-context trace-id, present when the caller sent a traceparent. Omitted rather than invented when it did not.
typestringyesAbsolute URI identifying the refusal TYPE. Derived one-to-one from code, so a caller may branch on either and can never be told two different things. Never about:blank.

ProblemFieldIssueDto

PropertyTypeRequiredDescription
codestringnoSCREAMING_SNAKE_CASE code of THIS issue, for a frontend i18n key. Present when the issue was minted by a declared problem.
detailstringyesProse for logs and developers. A frontend localises from code + params instead.
paramsmap of string or number or booleannoSafe i18n interpolation values for this issue's code.
pointerstringyesRFC 6901 JSON Pointer into the request body. Root is "/".

ProblemRetry

What a retry can achieve: transient (later, unchanged), after-change (only after someone changes something), never (a defect until a fixed version ships). ABSENT when not known.

Type: one of "transient", "after-change", "never"

ProjectKind

Type: string (14 values)

PublishLaunchDefinitionDto

PropertyTypeRequiredDescription
contentobjectyes
expectedDraftIdstringyes
idempotencyKeystringyes

PublishLaunchDefinitionResponseDto

PropertyTypeRequiredDescription
reusedbooleanyes
revisionLaunchDefinitionRevisionResponseDtoyes

PublishLaunchDefinitionResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataPublishLaunchDefinitionResponseDtoyes

ReasoningDeltaPayloadDto

PropertyTypeRequiredDescription
textstringyesIncremental reasoning fragment from the assistant thinking stream.

ReleaseChannelRevisionSelectorDto

PropertyTypeRequiredDescription
channelstringyes
kindone of "release-channel"yesDiscriminator: unresolved authoring intent; the owning authority resolves it to an exact pin before execution.

RemediateOutputSurfaceDto

PropertyTypeRequiredDescription
outputSurfaceAppIdstringyesDatabase id of the SessionOutputSurfaceApp row (cuid). The same id the FE receives from GET /sessions/:id/output-surfaces/apps. NOT the workspace-proxy worker-side ${repoSlug}:${name} form.
remediationKindOutputSurfaceRemediationKindInputyesWhich remediation widget raised this — drives template selection.

RemediateOutputSurfaceResponseDto

PropertyTypeRequiredDescription
outputSurfaceAppIdstringyesDatabase id of the SessionOutputSurfaceApp row the remediation was dispatched for. Echoes the request value.
templateIdstringyesStable identifier of the prompt template that was rendered and injected.

RemediateOutputSurfaceResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataRemediateOutputSurfaceResponseDtoyes

ReplyToQuestionDto

PropertyTypeRequiredDescription
answersarray of array of stringyesPer-question-part answers — one inner array of selected option strings per part.

RepoGitStatusDto

PropertyTypeRequiredDescription
addedarray of stringyes
branchstringyes
deletedarray of stringyes
modifiedarray of stringyes
pathstringyesPath relative to /workspace
primarybooleanyesWhether this is the primary repo
roleRepoRoleyesRepository role
slugstringyesRepository slug
targetBranchstringyesTarget branch for merge/PR
untrackedarray of stringyes

RepoRole

Repository role

Type: one of "DELIVERABLE", "REFERENCE"

ReportInspectPresenceDto

PropertyTypeRequiredDescription
bridgeInstanceIdstringnoIdentifier of the bridge instance on the current page.
kindone of "attach", "heartbeat", "detach", "hello", "unloading"yes
outputSurfaceOriginstringno
reasonone of "navigation", "off-domain"noOnly meaningful for kind=unloading.
targetUrlstringnoBest-effort off-domain target URL (kind=unloading).
titlestringno
urlstringno

ReportInspectResultDto

PropertyTypeRequiredDescription
batchIdstringyes
commandIdstringyes
resultInspectStepResultDtoyes

RescopeLaunchDefinitionDto

PropertyTypeRequiredDescription
targetScopeLaunchDefinitionRescopeTargetyesTarget owner tier. org is the only legal target — it is the only one the kernel promotion table admits from a tier this registry owns. Demotion, same-tier, and moves into or out of system/biome are refused with 422.

RestoreLaunchDefinitionRevisionDto

PropertyTypeRequiredDescription
expectedDraftIdstring or nullyes

ResumeSessionDto

PropertyTypeRequiredDescription
agentSlugOverridestringnoReplacement primary agent slug. Provided only when recovering a session whose original agent was removed — switches the session's primary agent before resuming. Lowercase kebab-case.

RetireLaunchDefinitionDto

Type: object

RollbackLaunchDefinitionDto

PropertyTypeRequiredDescription
priorReleaseSetIdstringyes

RotateTokenResponseDto

PropertyTypeRequiredDescription
externalUrlstringyesNew stable share URL. Previous URL is now invalid.
tokenGenerationnumberyes

RotateTokenResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataRotateTokenResponseDtoyes

RunSandboxEvalTurnDto

PropertyTypeRequiredDescription
promptstringyesThe realistic user prompt to send to the sandbox agent.

RuntimeAuthMode

Type: one of "brokered"

RuntimeProfileAvailability

Type: one of "available", "account-required", "not-admitted"

SandboxEvalTurnResultDto

PropertyTypeRequiredDescription
durationMsnumberyesEnd-to-end turn duration in milliseconds.
outputstringyesThe agent’s final assistant reply text for the turn.
sessionIdstringyesThe sandbox session id.
threadIdstringyesThe thread the turn ran on.
totalTokensnumberyesSum of input + output tokens across every step of the turn (0 when the runtime emitted no step-token accounting).

SandboxEvalTurnResultDtoDataEnvelope

PropertyTypeRequiredDescription
dataSandboxEvalTurnResultDtoyes

SandboxToolMockDto

PropertyTypeRequiredDescription
isErrorbooleannoWhen true, the canned result is flagged as a tool error. Default false.
responsestringyesCanned result body returned in the single MCP text content block when the agent calls this tool inside the sandbox.
toolNamestringyesCanonical MCP tool name this mock answers for.

SandboxToolMocksResponseDto

PropertyTypeRequiredDescription
mockedToolNamesarray of stringyesCanonical tool names that currently have a registered mock.
sessionIdstringyesThe sandbox session id.

SandboxToolMocksResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataSandboxToolMocksResponseDtoyes

SaveLaunchDefinitionDraftDto

PropertyTypeRequiredDescription
contentobjectyes
expectedDraftIdstring or nullyes

SessionApprovalResumeDto

PropertyTypeRequiredDescription
decisionIdstringyes
evidenceHashstringyes
policyRequestIdstringyes
producerRefstringyes

SessionArtifactDto

PropertyTypeRequiredDescription
artifactTypeSessionArtifactTypeyesDeterministic content kind derived from the file extension.
contentstringyesThe deliverable file body, inlined. Empty string when the file exceeded the per-file read cap (see truncated). Consumers render this directly — it is NOT a URL or blob pointer.
idstringyesStable identifier for this artifact within the session — the workspace-relative path of the deliverable file (e.g. deliverables/contract.json). Unique per session.
schemaVersionstringnoSchema version parsed from the artifact body when it is a JSON manifest carrying a top-level schemaVersion field. Absent for non-manifest deliverables.
sizeBytesnumberyesTotal byte length of the deliverable file on the worker, before any read-cap truncation.
titlestringyesHuman-readable title — the deliverable file name (e.g. contract.json).
truncatedbooleanyesTrue when the file exceeded the per-file read cap and content is therefore empty or partial. The frontend surfaces this so a large deliverable is never silently shown as empty.

SessionArtifactDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of SessionArtifactDtoyes

SessionArtifactType

Deterministic content kind derived from the file extension.

Type: one of "markdown", "json", "yaml", "text"

SessionAttachmentStatus

Uploaded files transition pending_upload → ready after the SAS upload-complete step succeeds.

Type: one of "pending_upload", "ready", "upload_failed"

SessionAttendance

Whether a human answers what this session's runtime asks, fixed at launch from the door that admitted it and never changed. attended (a browser or shell launch) = a runtime permission or question opens a decision for a person. unattended (an API, workflow, schedule or agent launch) = every runtime permission is denied and every question rejected at once, with an interaction_answered_unattended event, and no decision is opened.

Type: one of "attended", "unattended"

SessionBlobAttachmentDto

PropertyTypeRequiredDescription
contentTypestringyes
downloadUrlstringyesShort-lived presigned GET URL the workspace-proxy uses to fetch the blob directly. Bearer-via-URL — never log it.
idstringyes
relPathstringyes
requiredHeadersmap of stringyesHeaders the fetcher MUST send verbatim. Empty for Azure SAS.
sizeBytesnumberyes

SessionBlobAttachmentDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of SessionBlobAttachmentDtoyes

SessionContentPinDto

PropertyTypeRequiredDescription
contentHashstringyes
refstringyesOpaque immutable resource/deployment reference.

SessionContextWindowSnapshotDto

PropertyTypeRequiredDescription
cacheReadTokensnumberyesCache-read tokens (count toward context-window usage).
cacheWriteTokensnumberyesCache-creation tokens (count toward context-window usage).
inputTokensnumberyesInput tokens of the most recent assistant turn.
modelIdstring or nullnoModel id that produced this snapshot. Used by the FE to look up the right contextWindow divisor even if the user re-pinned the session after the turn ended.
outputTokensnumberyesOutput tokens of the most recent assistant turn.
providerIdstring or nullnoProvider that produced this snapshot. Null when no per-turn override was supplied (worker fell back to the agent default — the FE then uses the session's current model to look up the context window).
updatedAtstringyesISO timestamp of the upstream OpenCode step_finished event.

SessionDebugAgentNodeDto

PropertyTypeRequiredDescription
agentSlugstringyesAgent slug at this node.
depthnumberyesTree depth — 0 is the root (primary agent).
modelOverridestring or nullnoPer-node model override resolved from the composition, when one is pinned.
skillSlugsarray of stringyesSkill slugs attached at this node.

SessionDebugInfoDto

PropertyTypeRequiredDescription
activatedSkillsarray of SessionDebugSkillDtoyesSkills currently mounted into the session, with attach provenance.
agentReferencestring or nullnoAgent reference. For a standard session this is the published slug@version; for a sandbox session this is the draft Agent row id under test.
compositionTreearray of SessionDebugAgentNodeDtoyesThe resolved composition tree (primary agent + sub-agent tree, per-node model + skills).
gapsarray of stringyesHonest list of debug data that is NOT obtainable without deeper instrumentation (e.g. exact prompt token footprint). Empty when every block resolved fully.
injectedContextSkillSlugsarray of stringyesInjected-context view: the slugs of skills + metadata loaded into the agent context. Token footprint is NOT surfaced here — see gaps.
kindSessionKindyesSession kind.
mountPlanobject or nullnoThe projected mount plan / WorkspaceSpec from the last resolved environment snapshot. Null until the session has booted once (the bootstrap path persists the first snapshot).
primaryModelDecisionSessionDebugModelDecisionDto or nullnoModel Resolution Matrix decision trace for the primary agent — which rule won and why. Null when llm-registry-api could not be reached.
sessionIdstringyesSession id.

SessionDebugInfoDtoDataEnvelope

PropertyTypeRequiredDescription
dataSessionDebugInfoDtoyes

SessionDebugModelDecisionDto

PropertyTypeRequiredDescription
matchedDimensionsarray of stringyesDimensions the winning rule matched on.
matchedRuleIdstring or nullnoId of the Model Resolution Matrix rule that won; null = implicit default fallback.
modelIdstringyesResolved concrete model id.
overriddenbooleanyesTrue when a run/realtime override pre-empted the matrix.
providerSlugstring or nullnoResolved provider slug.
reasonstringyesHuman-readable win reason.

SessionDebugSkillDto

PropertyTypeRequiredDescription
attachedAtstringyesWhen the skill was attached (ISO 8601).
attachedBystringyesActor id that attached the skill.
attachedByTypestringyesWho attached it — composition-default, a human actor, or another agent.
slugstringyesSkill slug.
snapshotobject or nullnoSkill metadata snapshot captured at attach time (name, description, source path).

SessionDeliverableAcceptanceVerdict

The verdict of the final validation at handoff.

Type: one of "accepted", "refused", "unavailable"

SessionDeliverableFinalValidationDto

PropertyTypeRequiredDescription
idstringyesAcceptance id.
issueCountnumberyesNumber of issues.
issuesarray of DeliverableValidationIssueDtoyes
recordedAtstring (date-time)yes
specRefstringyesThe deliverable spec the session is bound to (slug@version).
specVersionstring or nullyes
unavailableReasonDeliverableValidationUnavailableReason or nullyesWhy the validator could not judge; set only when verdict is unavailable.
verdictSessionDeliverableAcceptanceVerdictyesThe verdict of the final validation at handoff.

SessionDeliverableReactionValidationDto

PropertyTypeRequiredDescription
idstringyesValidation id.
issueCountnumberyesNumber of issues.
issuesarray of DeliverableValidationIssueDtoyes
phaseDeliverableReactionPhaseyesThe phase this validation reacted in.
recordedAtstring (date-time)yes
specRefstringyesThe deliverable spec the session is bound to (slug@version).
specVersionstring or nullyes
statusSessionDeliverableValidationStatusyes
unavailableReasonDeliverableValidationUnavailableReason or nullyesWhy the validator could not judge; set only when status is unavailable.

SessionDeliverableValidationStatus

Type: one of "invalid", "incomplete", "complete", "pending", "unavailable"

SessionDeliverableValidationsDto

PropertyTypeRequiredDescription
checkpointSessionDeliverableReactionValidationDto or nullyesThe latest checkpoint validation, or null when none was recorded.
finalSessionDeliverableFinalValidationDto or nullyesThe latest final validation at handoff, or null when the session has not handed off for a spec.
liveSessionDeliverableReactionValidationDto or nullyesThe latest live validation, or null when none was recorded.

SessionDeliverableValidationsDtoDataEnvelope

PropertyTypeRequiredDescription
dataSessionDeliverableValidationsDtoyes

SessionDomainDto

PropertyTypeRequiredDescription
bindingInputsmap of stringnoValues the domain object's owner supplies for the session's ${input.<name>} working-file interpolation (for example a record's layout and format). Replaced later only by the service that writes the object's authorization facts.
keystringyesThe domain object's authorization type (for example <biome>_<type>).
refstringyesThe domain object's id within the organization.
relationSessionDomainRelationyesHow the session relates to the object, stated by the launcher; never inferred and never defaulted. parent: the object is the session's authorization parent and governs who may read it. reference: context only; it widens no read and the session has no parent. Required whenever a domain object is given.

SessionDomainRelation

How the session relates to the object, stated by the launcher; never inferred and never defaulted. parent: the object is the session's authorization parent and governs who may read it. reference: context only; it widens no read and the session has no parent. Required whenever a domain object is given.

Type: one of "parent", "reference"

SessionExactResourcePinDto

PropertyTypeRequiredDescription
contentHashstringyesLowercase SHA-256 of the immutable revision bytes.
resourceIdstringyes
revisionIdstringyes

SessionExecutionMode

Whether this session ever gets a worker. worker = a pod, a volume and an allocation are provisioned for it. hosted = its agent loop runs in-service; it never allocates a worker, and that is a FINAL, READY state rather than a stage on the way to one. Derive this from nothing else: workspaceId, projectId and status are each a proxy that answers for a different axis, and a project-scoped session whose author chose backing: none holds a workspace and is hosted. A client showing worker-warmup affordances (a 'tools still loading' chip, a file browser, a terminal) must gate on this field — worker-bound operations answer 409 SESSION_WORKER_NOT_APPLICABLE for a hosted session, and retrying cannot change that.

Type: one of "hosted", "worker"

SessionHookReadinessDto

PropertyTypeRequiredDescription
bindingSetRevisionnumber or nullyesBinding-set revision of this replica's projection; null when it is not synced.
evaluatedAtstring (date-time)yes
feedHookFeedReadinessDtoyes
pointsarray of HookPointReadinessDtoyes
sessionIdstringyesThe session this readiness was evaluated for.

SessionHookReadinessDtoDataEnvelope

PropertyTypeRequiredDescription
dataSessionHookReadinessDtoyes

SessionKind

Session kind.

Type: one of "standard", "sandbox"

SessionLaunchApprovalDto

PropertyTypeRequiredDescription
decisionIdstringyes
decisionRevisionnumberyes
decisionStatusstringyes
evidenceHashstringyes
policyRequestIdstringyes
producerRefstringyes

SessionLaunchBodyDto

PropertyTypeRequiredDescription
approvalResumeSessionApprovalResumeDtono
internetEgressCeilingWorkerInternetEgressnoOptional narrowing of whether this session's workspace pod may open sockets to the public internet. Tighten-only and pinned for the session's life. Absent states nothing.
invocationOverlayobjectyesStrict kernel InvocationOverlay v2; unknown keys are rejected.
launchDefinitionSessionRevisionTargetDtoyes
runtimeProfileSessionRuntimeProfileChoiceDtonoOptional choice among the runtime profiles the launch definition admits. Absent: the launch definition's pinned default runtime profile (declared behaviour). Frozen for the session's life.
titlestringno
workspaceNoWorkspaceActionDto or AttachWorkspaceActionDto or CreateWorkspaceActionDtoyesWorkspace action. Discriminated on action.

SessionLaunchOutcome

Type: one of "created", "approval_required"

SessionLaunchResponseDto

PropertyTypeRequiredDescription
approvalSessionLaunchApprovalDtono
outcomeSessionLaunchOutcomeyes
sessionSessionResponseDtono
threadIdstringno

SessionLaunchResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataSessionLaunchResponseDtoyes

SessionLockfileDto

PropertyTypeRequiredDescription
agentsmap of stringnoMap of agent slug to chosen published semver. Optional.
biomesmap of stringyesMap of biome slug to the chosen published semver.
capabilitiesmap of stringyesMap of capability ref (sans @major) to the chosen major version string.
deliverableSpecsmap of stringnoMap of deliverable-spec slug to chosen published semver. Optional.
kernelstringyesResolved kernel semver string at the moment the session was created.
skillsmap of stringnoMap of skill slug to chosen published semver. Optional.
workflowsmap of stringnoMap of workflow slug to chosen published semver. Optional.

SessionLockfileDtoDataEnvelope

PropertyTypeRequiredDescription
dataSessionLockfileDtoyes

SessionMessageActorDto

PropertyTypeRequiredDescription
avatarUrlstringnoAvatar rendered on the message bubble.
displayNamestringyesName rendered on the message bubble.
subjectKindParticipantSubjectKindyesDiscriminator on subjectRef. Closed set: org_user is a Xema identity; external_contact is a person reached through a conversation channel.
subjectRefstringyesOpaque per-kind reference to the author.

SessionMessageRole

Type: one of "user", "assistant", "system", "tool"

SessionParticipantDto

PropertyTypeRequiredDescription
avatarUrlstringno
displayNamestringyes
idstringyesParticipant row id.
invitedAtstringyesISO-8601 timestamp of the invite.
invitedBystringyesSubject ref of the inviter.
lastSeenAtstringnoISO-8601 timestamp of the last message this participant posted on the session. Null until they post their first message.
roleParticipantRoleyesRole inside this session. Closed set.
sessionIdstringyesSession this participant belongs to.
subjectKindMemberSubjectKindyesDiscriminator on subjectRef. Closed set — org_user is a Xema-identity user (Keycloak sub).
subjectRefstringyesOpaque per-kind reference. org_user: Keycloak user id.

SessionParticipantDtoDataEnvelope

PropertyTypeRequiredDescription
dataSessionParticipantDtoyes

SessionPauseReason

Why the session left active for paused. user = explicit pause (needs an explicit resume); allocation_lost = the worker allocation was reaped out-of-band and the next user interaction auto-resumes; worker_replaced = the worker pod was replaced under the same allocation (its runtime state is gone) and the next user interaction auto-resumes. Frontend distinguishes user from the others so the user only sees the "resume required" affordance when their action is actually required.

Type: one of "user", "allocation_lost", "worker_replaced"

SessionPermissionGrantDto

PropertyTypeRequiredDescription
createdAtstring (date-time)yesWhen the grant was recorded.
decisionIdstringyesThe decision whose "Always allow" answer is the grant of record.
grantedBystringyesCanonical subject ref of the human whose "Always allow" commit is the grant.
idstringyesGrant id; pass it to the revoke route.
permissionstringyesThe runtime permission the grant answers "allow" for (e.g. edit, bash).
resourcestringyesThe resource the grant covers, verbatim; matched by exact string equality only.

SessionPermissionGrantDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of SessionPermissionGrantDtoyes

SessionProvisioningPhase

Fine-grained, monotonic provisioning phase. The launch path records worker launch, credential injection, configuration, workspace preparation, worker readiness, and the terminal ready or failed outcome. Complements the coarse status field.

Type: string (9 values)

SessionResolvedCapabilityDto

PropertyTypeRequiredDescription
authorityEffectstring or nullno
descriptorHashstringyes
effectClassstringyes
externalServiceRefstring or nullno
reachstringyes
refstringyes

SessionResolvedCompositionProofDto

PropertyTypeRequiredDescription
agentSessionExactResourcePinDtoyes
capabilityAperturearray of SessionResolvedCapabilityDtoyes
closureHashstringyes
compositionHashstringyes
environmentPolicySessionContentPinDtoyes
launchDefinitionSessionExactResourcePinDtoyes
modelDeploymentSessionContentPinDtoyes
modelRefstringyes
releaseSetIdstring or nullno
resolutionIdstringyes
resourceRefsarray of stringyesCanonical content-addressed resource binding refs admitted for this composition.
runtimeImageDigeststring or nullnoExact OCI content digest selected for a workspace worker; null for a hosted workspaceless session.
runtimeProfileSessionExactResourcePinDtoyes
skillsarray of SessionExactResourcePinDtoyes

SessionResponseDto

PropertyTypeRequiredDescription
agentRefstring or nullyesOPAQUE pinned identity — <agentResourceId>@<agentRevisionId>, both cuids. DO NOT PARSE IT AND DO NOT RESOLVE IT. Read the pin from resolvedComposition.agent instead, which carries the same two ids as separate typed fields (resourceId, revisionId) plus the content hash, and resolve with GET /agents/revisions/:revisionId/resolved. This field is NOT accepted by GET /agents/resolve/:ref: that route parses the half after @ with /^[1-9]\d*$/ — a positive INTEGER revision number — so a cuid answers 400, measured in production on 2026-09-15. Nor is it a slug@version, which this description claimed until that date; the producer writes ${composition.agentRevision.resourceId}@${composition.agentRevision.revisionId} (session-launch.service.ts), and primary-agent-slug.ts has said so all along. Even if it parsed, resolving a ref with no revision returns the LATEST published revision, while the session stays pinned to the one it composed against — so a resolvable ref would describe an Agent the session is not running. Null for a sandbox session (it resolves its DRAFT composition by sandboxAgentId) or a session created before the Phase 6 cutover backfill.
agentSlugstringyesInternal agent slug resolved from profile
attendanceSessionAttendanceyesWhether a human answers what this session's runtime asks, fixed at launch from the door that admitted it and never changed. attended (a browser or shell launch) = a runtime permission or question opens a decision for a person. unattended (an API, workflow, schedule or agent launch) = every runtime permission is denied and every question rejected at once, with an interaction_answered_unattended event, and no decision is opened.
branchNamestring or nullno
branchStrategyBranchStrategyyes
budgetLimitnumber or nullno
completedAtstring or nullno
contextWindowSnapshotSessionContextWindowSnapshotDto or nullnoLatest OpenCode context-window snapshot, mirrored from the most recent usage frame and reset to zeros on session.compacted. Null until the first turn completes — the composer chip stays hidden in that window because we cannot honestly report the system-prompt size before any usage lands.
createdAtstring (date-time)yes
createdBystringyes
executionModeSessionExecutionModeyesWhether this session ever gets a worker. worker = a pod, a volume and an allocation are provisioned for it. hosted = its agent loop runs in-service; it never allocates a worker, and that is a FINAL, READY state rather than a stage on the way to one. Derive this from nothing else: workspaceId, projectId and status are each a proxy that answers for a different axis, and a project-scoped session whose author chose backing: none holds a workspace and is hosted. A client showing worker-warmup affordances (a 'tools still loading' chip, a file browser, a terminal) must gate on this field — worker-bound operations answer 409 SESSION_WORKER_NOT_APPLICABLE for a hosted session, and retrying cannot change that.
failureCodestring or nullnoStable, machine-readable failure code paired with failureReason when the failure has structured recovery info. Frontend branches on this to render code-specific UX (e.g. REPO_EMPTY → "push your first commit"). null when the failure was unstructured (transport, timeout) — fall back to failureReason.
failureMetaJsonobject or nullnoStructured payload paired with failureCode. Shape is code-specific. For clone failures: { slug, requestedBranch, availableBranches, defaultBranchSuggestion }.
failureReasonstring or nullnoHuman-readable reason the session moved to failed status
handoffAtstring or nullnoWhen the handoff arrived. Mirrors handoffOutput presence.
handoffOutputobject or nullnoStructured deliverable contract emitted by the in-session agent (the JSON written to /workspace/deliverables/contract.json against the session's deliverableSpecRef). Captured idempotently on the first POST /sessions/:id/handoff. null until the agent has handed off.
idstringyesSession identifier (cuid)
jobRunIdstring or nullnoWorkflow-engine job-run id that spawned this session. Only meaningful when pipelineRunId is also set — together they let the workflow-runtime worker route the eventual handoff signal back to the right job-level promise.
lastActivityAtstring (date-time)yes
modelIdstring or nullno
modelSelectionobject or nullnoCurrent model selection override. Either a ConcreteModelRef {kind: "concrete", modelId, providerSlug?, temperature?} or a StrategyModelRef {kind: "strategy", modelLane, temperature?}. Null = no override; the agent's default modelLane strategy cascade resolves the model per prompt.
opencodeProvidersarray of stringyesModel routes (provider slugs) bound to the session at launch or by a later bind. The FE picker uses this to decide whether a model switch names a bound route (served directly) or one the session lacks (refused). Empty array before the first bind applies.
orgIdstringyesOwning organization ID (Keycloak group ID)
parentSessionIdstring or nullnoReference to the session this one was forked from (via POST /sessions/:id/fork). Stamped server-side from the URL; API clients cannot forge parentage. Null for sessions created directly.
pauseBlockedAttemptsnumberyesConsecutive failed pause attempts in the current streak. 0 when the session is not failing to pause. Reset when the session leaves active.
pauseBlockedEscalatedAtstring or nullnoSet once, when the failed-pause streak crossed the escalation threshold — i.e. this session now needs a HUMAN. Non-null is the flag a UI should render on: the session cannot persist its work and is holding a worker against the org concurrency quota. It is NOT a terminal state and the platform does not give up: retries continue every idle-monitor tick, and the first one that succeeds clears all four pauseBlocked* fields.
pauseBlockedReasonstring or nullnoThe most recent pause failure of the current streak, truncated. This is the attribution: an unreachable SCM remote, an expired credential and a Temporal outage are different fixes.
pauseBlockedSincestring or nullnoWhen this session first FAILED to pause in the current streak; null whenever it is not failing to pause. A pause is fail-fast on purpose — for a git-push slot the SCM remote is the only storage, so pausing over a failed push would release the worker and destroy the working tree. The platform therefore keeps the session active and RETRIES, rather than force-pausing. This timestamp is how long that has been going on; the work is still intact on the worker throughout.
pauseCausedByRuntimeLossbooleanyesTrue only when the session is paused because it lost its runtime: the worker allocation was lost (allocation_lost) or the worker was replaced (worker_replaced). False for a user or idle pause and whenever the session is not paused. It says why the session paused, not whether a message resumes it (a message wakes any paused session). Derived from the server-side rule, so clients never hard-code the set of reasons.
pauseReasonSessionPauseReason or nullnoWhy the session left active for paused. user = explicit pause (needs an explicit resume); allocation_lost = the worker allocation was reaped out-of-band and the next user interaction auto-resumes; worker_replaced = the worker pod was replaced under the same allocation (its runtime state is gone) and the next user interaction auto-resumes. Frontend distinguishes user from the others so the user only sees the "resume required" affordance when their action is actually required.
pausedAtstring or nullno
pipelineRunIdstring or nullnoPipeline run that owns this session (set when the session is created by a pipeline-run request). Sourced from RequestContext, never client-supplied.
prUrlstring or nullno
preferredModelLanestring or nullnoPer-session "smartness" preference — a Model Resolution Matrix modelLane MATCHED dimension (NOT an above-rules override, unlike modelSelection). When set, the send path resolves the turn model with this class as the matched modelLane dimension, so a managed org's tier rules CLAMP it (a user can never reach a model outside their tier); an unmapped class falls through to the org default; a BYOK org resolves directly. An explicit modelSelection pin WINS over this softer preference. Closed set: coding | review | creative | planning | utility. Null = the agent's native modelLane (today's behavior).
projectIdstring or nullyesProject this session belongs to. null for a project-less session — such a session is project-less by construction (it may still hold a project-keyed provisioning; project is switchable context inside the conversation instead).
provisioningFailureHintstring or nullnoHuman-readable hint attached when provisioning fails; null while still in progress or on success.
provisioningPhaseSessionProvisioningPhaseyesFine-grained, monotonic provisioning phase. The launch path records worker launch, credential injection, configuration, workspace preparation, worker readiness, and the terminal ready or failed outcome. Complements the coarse status field.
provisioningPhaseSincestring (date-time)yesTimestamp the session entered the current provisioningPhase. Used by UIs to render per-phase elapsed time.
repositoryIdstring or nullno
resolvedCompositionSessionResolvedCompositionProofDtoyes
resolvedConfigHashstring or nullno
runtimeImageRefstring or nullnoFully-pinned runtime image the session is running on RIGHT NOW — the repo@sha256:… coordinate the workspace-orchestrator resolved for the session's current allocation. Re-stamped on every cold resume, because a resume deliberately comes back on the CURRENT digest rather than the one the session launched with, so this can differ from the image it started on. null before the first allocation, for rows that predate the column, and when an allocation reported no ref (recorded as absent rather than guessed). Read it together with status: a paused session is running nothing, and the value then names the LAST image it ran. Reporting only — no client may use it to request an image, and nothing in the platform places against it.
sessionDomainKeystring or nullnoBiome-owned domain key attached to this session runtime. Null means generic interactive session.
sessionDomainRefstring or nullnoOpaque domain row identifier associated with sessionDomainKey (for example the id of a <biome>_<type> object when sessionDomainKey names that type).
statusSessionStatusyes
titlestring or nullnoHuman-readable session title set at creation or inherited from profile
tokenUsageSessionTokenUsageDto or nullno
toolSelectionarray of objectyesALWAYS EMPTY. Shape is ToolSelectionEntry[] from @xemahq/kernel-contracts/mcp-tool, but nothing writes the underlying column, so every session reports []. This description previously said the value is "updated via PATCH /sessions/:id/tools" — no such route exists on any surface of this service, and none ever has. Do not branch on this field: what a session may invoke is decided by the capability plane (grants, the agent aperture, its AgentReachTier ceiling), never by a per-session tool list.
updatedAtstring (date-time)yes
workspaceIdstring or nullnoCanonical Workspace identity attached for this Session; null when the session holds no workspace at all. This does NOT tell you whether a worker exists — a session may hold a workspace whose backing is none. Read executionMode for that.

SessionResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataSessionResponseDtoyes

SessionResponseDtoPaginatedEnvelope

PropertyTypeRequiredDescription
dataarray of SessionResponseDtoyes
paginationPaginationMetayes

SessionRevisionTargetDto

PropertyTypeRequiredDescription
resourceIdstringyes
resourceKindstringyes
selectorExactRevisionSelectorDto or ReleaseChannelRevisionSelectorDtoyesRevision selection. Discriminated on kind.

SessionRuntimeProfileChoiceDto

PropertyTypeRequiredDescription
resourceIdstringyesresourceId of a RuntimeProfile the launch definition admits

SessionStatus

Type: string (9 values)

SessionTimelineEntryDto

PropertyTypeRequiredDescription
createdAtstringyesWhen the row was inserted (ISO 8601). Use sequence for ordering, not this — it is the row-write time, not the producer-occurrence time.
eventTypestring (66 values)yesClosed-set event type emitted by the session.
idstringyesPer-row id (cuid).
payloadTextDeltaPayloadDto or ReasoningDeltaPayloadDto or EnvironmentDriftDetectedPayloadDto or ToolCallPayloadDto or objectyesEvent payload. Shape depends on eventType: text_delta / reasoning_delta carry TextDeltaPayload / ReasoningDeltaPayload; environment_drift_detected carries EnvironmentDriftDetectedPayload; tool_call_started / tool_call_completed carry ToolCallPayload. Every other event type carries a free-form object payload — switch on eventType and treat unknown variants as opaque.
prominenceFrameProminencenoWhether a quiet client shows the event: primary (the primary agent's answer, the asks a user must answer and their settlement, the primary agent's plan, the turn outcome) or secondary (sub-agent activity, tool calls and results, reasoning, usage, file and LSP activity, internal lifecycle). Present only on an event a runtime frame produced; absent on every other event (user messages, status, git, attachments) and on events written before this field existed. A quiet filter hides only secondary.
sequencenumberyesPer-session monotonic sequence assigned by SessionEventAppender. Strictly increasing within a session, with no gaps. Use this as the cursor for ?afterSequence=.
threadIdstringyesConversation thread this event belongs to.

SessionTimelinePageDto

PropertyTypeRequiredDescription
entriesarray of SessionTimelineEntryDtoyes
nextAfterSequencenumber or nullyesCursor for the next page. Pass back as afterSequence to resume. null when no more rows.

SessionTimelinePageDtoDataEnvelope

PropertyTypeRequiredDescription
dataSessionTimelinePageDtoyes

SessionTokenUsageDto

PropertyTypeRequiredDescription
inputTokensnumberyes
outputTokensnumberyes

SessionToolDenialDto

PropertyTypeRequiredDescription
bindingSetRevisionnumber or nullyesThe binding-set revision the call was evaluated under; null only when the evaluation threw before it had one.
decidedAtstring (date-time)yes
denialsarray of ToolDenialDtoyesThe refusing bindings; empty when failed.
failureCauseHookEvaluationFailureCausenoWhy the evaluation failed as a whole; present only when outcome is failed.
failuresarray of ToolDenialFailureDtoyesThe failed bindings; empty when denied.
hookPointstringyesThe hook point that ruled (agent-session.tool.execute).
idstringyesRecord id.
outcomeSessionToolDenialOutcomeyesdenied: a binding refused the call. failed: the evaluation failed closed.
sessionIdstringyes
toolNamestringyesName of the tool the call was for. Arguments are never recorded.

SessionToolDenialDtoCursorPaginatedEnvelope

PropertyTypeRequiredDescription
dataarray of SessionToolDenialDtoyes
paginationCursorPaginationMetayes

SessionToolDenialOutcome

denied: a binding refused the call. failed: the evaluation failed closed.

Type: one of "denied", "failed"

SessionWorkingFileDto

PropertyTypeRequiredDescription
acceptsUserEditsbooleanyesWhether the file takes user edits (bidirectional); only such a file has working-file user-edits and resync routes.
formatone of "markdown", "html", "json", "yaml", "text"yes
objectWorkingFileObjectDto or nullyesThe domain object this file is bound to, or null when the file is not backed by an object (a one-way file, or a session with no domain binding).
pathstringyesPath of the file inside the session workspace.
slugstringyesThe working file's slug; the key of its user-edits and resync routes.
syncDirectionone of "down-only", "up-only", "bidirectional"yes

SessionWorkingFileDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of SessionWorkingFileDtoyes

SessionWorkspaceBackingDto

PropertyTypeRequiredDescription
kindWorkspaceBackingKindyes

SetSandboxToolMocksDto

PropertyTypeRequiredDescription
toolMocksarray of SandboxToolMockDtoyesThe mocked tools to register for this sandbox session.

SkillAttachmentFailureDto

PropertyTypeRequiredDescription
kindstringyesTyped failure kind (a session failure code).
messagestringyesHuman-readable text; never contains a secret.

SkillAttachmentStatus

Where the attachment is relative to the worker's bound skill set: pending and detach_pending are in flight, bound is on the worker, failed carries failure.

Type: one of "pending", "bound", "failed", "detach_pending", "detached"

SmartnessLevelsResponseDto

PropertyTypeRequiredDescription
levelsarray of stringyesThe selectable "smartness" (modelLane) levels for the current org — model-lane keys. An OPEN vocabulary: the set is whatever this organisation's installed biomes have contributed, so a consumer must not treat it as a closed enum or hardcode its members. The frontend maps each raw key to a friendly label.

SmartnessLevelsResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataSmartnessLevelsResponseDtoyes

SpaceKind

The tier of the Space the binding lives in (set by your organization, project or you).

Type: one of "system", "org", "project", "app", "session", "biome", "user"

SpaceRefResponseDto

PropertyTypeRequiredDescription
appIdstringno
biomeIdstringno
orgIdstringno
projectIdstringno
sessionIdstringno
tierone of "system", "org", "project", "app", "session", "biome", "user"yes
userIdstringno

StartBuildImageDto

PropertyTypeRequiredDescription
buildArgsarray of stringnoOptional --build-arg values to inject into the build. Pass as KEY=value entries.
dockerfilePathstringnoDockerfile path inside the workspace, relative to the primary repo root. Defaults to Dockerfile.

SubjectRefResponseDto

PropertyTypeRequiredDescription
idstringyes
kindstring (12 values)yes

TerminalAction

Every right the caller holds that applies to this screen.

Type: one of "view", "control", "admin-view"

TerminalAttachAvailabilityDto

PropertyTypeRequiredDescription
availablebooleanyesWhether an attach to this screen would be admitted right now.
refusalTerminalAttachRefusalCodenoWhy an attach would be refused. Absent when available is true.

TerminalAttachRefusalCode

Why an attach would be refused. Absent when available is true.

Type: string (9 values)

TerminalDescribeResponseDto

PropertyTypeRequiredDescription
screensarray of TerminalScreenDtoyesThe screens the caller may see. The owner-only screen is present only for the session owner.

TerminalDescribeResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataTerminalDescribeResponseDtoyes

TerminalScreenDto

PropertyTypeRequiredDescription
actionsarray of TerminalActionyesEvery right the caller holds that applies to this screen.
attachTerminalAttachAvailabilityDtoyes
screenTerminalScreenParamyes

TerminalScreenParam

Type: one of "shared", "owner-only"

TextDeltaPayloadDto

PropertyTypeRequiredDescription
textstringyesIncremental text fragment from the assistant message stream.

ThreadResponseDto

PropertyTypeRequiredDescription
agentSlugstring or nullnoPer-thread primary agent override. Null = inherit Session.agentSlug.
createdAtstring (date-time)yes
idstringyesThread identifier (cuid)
lastActivityAtstring (date-time)yesLast time a message was sent or received on this thread.
modelSelectionobject or nullnoPer-thread model override. Same ModelRef-shaped JSON as Session.modelSelection. Null = inherit the Session selection.
parentThreadIdstring or nullnoParent Thread when this lane was created through the branch API.
sessionIdstringyesSession this thread belongs to
statusThreadStatusyes
titlestringyesHuman-readable thread title
turnStateTurnStateyesPer-thread turn lock state. The agent is busy on this thread iff turnState != idle.
updatedAtstring (date-time)yes

ThreadResponseDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of ThreadResponseDtoyes

ThreadResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataThreadResponseDtoyes

ThreadStatus

Type: one of "active", "archived"

ToolCallPayloadDto

PropertyTypeRequiredDescription
errorMessagestringnoError message when the tool invocation failed. Absent on success.
statusone of "started", "completed"yesLifecycle status. started is appended on first observation; completed is appended on tool_result.
toolCallIdstringnoStable id correlating started + completed rows for the same tool invocation.
toolNamestringyesCanonical tool name as reported by the MCP / OpenCode runtime.

ToolCallRuleEvaluationRequestDto

PropertyTypeRequiredDescription
correlationobjectyesThe correlation to echo (kernel HookRequestCorrelation).
hookPointIdstringyes
modeHookModeyes
operationstringyes
parametersobjectyesThe binding's rules. Each rule can only deny: the first whose match.subject matches the runtime-neutral tool subject and whose every args condition holds denies with its reason.
phaseHookPhaseyes
projectionobjectyesApproved projection: field pointer to value (/subject, /args).
synchronousChainarray of stringyes
writableFieldsarray of stringyes

ToolCallRuleEvaluationResponseDto

PropertyTypeRequiredDescription
correlationobjectyes
verdictobjectyesKernel HookVerdict: allow, or deny with the rule reason.

ToolCallRuleEvaluationResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataToolCallRuleEvaluationResponseDtoyes

ToolDenialDto

PropertyTypeRequiredDescription
bindingIdstringyesId of the binding that refused the call.
reasonToolDenialReasonDtoyes

ToolDenialFailureDto

PropertyTypeRequiredDescription
bindingIdstringyesId of the binding whose evaluation failed.
codeHookFailureCodeyesThe kernel failure code of that binding.

ToolDenialReasonDto

PropertyTypeRequiredDescription
codestringyesStable machine code of the refusal.
messagestringnoThe binding handler's own words.

ToolUsageEntryDto

PropertyTypeRequiredDescription
commandstringyesCanonical tool name (the name field of the MCP tools/call envelope).
countnumberyesNumber of successful tools/call invocations recorded for this (slug, command) within the 30-day TTL window.
mcpServiceSlugstringyesMCP service slug — ${providerKind}:${resourceId} of the relayed call.

ToolUsageResponseDto

PropertyTypeRequiredDescription
entriesarray of ToolUsageEntryDtoyesPer-(slug, command) counters sorted by count descending.
warningToolUsageWarningnoSet when the counters could not be read from their owning service. entries is empty in that case and does NOT mean "no tools were used". The relay path is unaffected — counters keep incrementing.

ToolUsageResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataToolUsageResponseDtoyes

ToolUsageWarning

Set when the counters could not be read from their owning service. entries is empty in that case and does NOT mean "no tools were used". The relay path is unaffected — counters keep incrementing.

Type: one of "TELEMETRY_UNAVAILABLE"

TurnState

Per-thread turn lock state. The agent is busy on this thread iff turnState != idle.

Type: one of "idle", "executing", "interrupting"

UpdateThreadDto

PropertyTypeRequiredDescription
statusThreadStatusnoNew thread lifecycle status (e.g. archived).
titlestringnoNew thread title.

UsageResponseDto

PropertyTypeRequiredDescription
budgetLimitobject or nullnonull if no budget set
budgetRatioobject or nullnoRatio of total tokens to budget limit (null if no budget)
inputTokensnumberyes
outputTokensnumberyes
totalTokensnumberyes

UsageResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataUsageResponseDtoyes

WorkerInternetEgress

Optional narrowing of whether this session's workspace pod may open sockets to the public internet. Tighten-only and pinned for the session's life. Absent states nothing.

Type: one of "open", "governed"

WorkingFileObjectDto

PropertyTypeRequiredDescription
keystringyesThe bound object's authorization type (for example <biome>_<type>).
refstringyesThe bound object's id within the organization.

WorkingFileUserEditDto

PropertyTypeRequiredDescription
contentstringyesThe user's new base content (their editor buffer). Empty string is valid: the file may be cleared.

WorkspaceBackingDto

PropertyTypeRequiredDescription
kindWorkspaceBackingKindyes
storageRefstringnoOpaque storage allocation reference. Required only for durable-storage backing.

WorkspaceBackingKind

Type: one of "none", "durable-storage"

WorkspaceResponseDto

PropertyTypeRequiredDescription
backingWorkspaceBackingDtoyes
contentGenerationstringyesMonotonic committed workspace content generation.
createdAtstringyes
createdByobjectyes
displayNamestringyes
idstringyes
leaseEpochstringyesMonotonic write-lease fencing epoch.
orgIdstringyes
ownerSpaceRefobjectyes
slugstringyes
statusWorkspaceStatusyes
updatedAtstringyes

WorkspaceResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataWorkspaceResponseDtoyes

WorkspaceResponseDtoPaginatedEnvelope

PropertyTypeRequiredDescription
dataarray of WorkspaceResponseDtoyes
paginationPaginationMetayes

WorkspaceStatus

Type: one of "active", "archived"