Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
205 changes: 75 additions & 130 deletions public/openapi.json

Large diffs are not rendered by default.

297 changes: 182 additions & 115 deletions src/assets/diagrams/egress-policy.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/assets/shots/snapshots.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/assets/shots/workspace.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/assets/shots/workspaces.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion src/content/docs/reference/api/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ curl -s https://app.example.com/spin.v1.WorkspaceService/ListWorkspaces \
- [RunnerTokenService](/reference/api/runnertokenservice/): 4 procedures
- [SettingsService](/reference/api/settingsservice/): 3 procedures
- [SetupService](/reference/api/setupservice/): SetupService handles initial platform setup and admin bootstrap. Most endpoints require admin authentication, except GetSetupStatus and PasswordLogin.
- [SignatureService](/reference/api/signatureservice/): SignatureService is what only people sign of themselves: who a user's keys are, who a team's. members are, and which settings their workspaces apply. A host holds every workspace's access. and settings to these (internal/roster), so the control plane can say neither which keys are. somebody's, nor who is in a team, nor what a guest applies for its owner. A workspace's access is. signed through WorkspaceService.SetOwnerWord. The control plane proposes each document from what it holds - a key registered, a member added -. and keeps what was signed; it signs nothing. A client shows a person what they are signing and. signs it with a key of theirs: `spin sign`, with the keys ssh-agent holds, or the terminal's. page, with a passkey.
- [WorkspaceService](/reference/api/workspaceservice/): 53 procedures
- [ShareService](/reference/api/shareservice/): ShareService manages snapshot sharing. Snapshots can be shared with specific users or made public. Users can create new workspaces from shared snapshots.
- [SignatureService](/reference/api/signatureservice/): SignatureService is what only people sign of themselves: who a user's keys are and who a team's. members are. A host holds every workspace's access to these (internal/roster), so a control. plane that is taken can say neither which keys are somebody's nor who is in a team. A. workspace's access is signed through WorkspaceService.SetOwnerWord. The control plane proposes each document from what it holds - a key registered, a member added -. and keeps what was signed; it signs nothing. A client shows a person what they are signing and. signs it with a key of theirs: `spin sign`, with the keys ssh-agent holds, or the terminal's. page, with a passkey.
- [SSHKeyService](/reference/api/sshkeyservice/): SSHKeyService is the user's own keys, as a registry: the ones a client offers when the owner. signs a workspace's word (OwnerWord), and the anchor a create may name. A key here logs in to. nothing on its own - only a key the owner's word for a workspace lists does, there.
- [TeamService](/reference/api/teamservice/): 18 procedures
- [Types](/reference/api/types/): every message and enum the procedures name
2 changes: 1 addition & 1 deletion src/content/docs/reference/api/shareservice.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ description: "spin.v1.ShareService: each procedure, its request and its response
source: "spin:internal/controlplane/apidocs/spin.v1.openapi.json"
editUrl: false
sidebar:
order: 12
order: 13
---

<!-- Generated by tools/refgen from spin:internal/controlplane/apidocs/spin.v1.openapi.json. Edit the source, not this file. -->
Expand Down
6 changes: 3 additions & 3 deletions src/content/docs/reference/api/signatureservice.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@ description: "spin.v1.SignatureService: each procedure, its request and its resp
source: "spin:internal/controlplane/apidocs/spin.v1.openapi.json"
editUrl: false
sidebar:
order: 13
order: 11
---

<!-- Generated by tools/refgen from spin:internal/controlplane/apidocs/spin.v1.openapi.json. Edit the source, not this file. -->

SignatureService is what only people sign of themselves: who a user's keys are and who a team's. members are. A host holds every workspace's access to these (internal/roster), so a control. plane that is taken can say neither which keys are somebody's nor who is in a team. A. workspace's access is signed through WorkspaceService.SetOwnerWord. The control plane proposes each document from what it holds - a key registered, a member added -. and keeps what was signed; it signs nothing. A client shows a person what they are signing and. signs it with a key of theirs: `spin sign`, with the keys ssh-agent holds, or the terminal's. page, with a passkey.
SignatureService is what only people sign of themselves: who a user's keys are, who a team's. members are, and which settings their workspaces apply. A host holds every workspace's access. and settings to these (internal/roster), so the control plane can say neither which keys are. somebody's, nor who is in a team, nor what a guest applies for its owner. A workspace's access is. signed through WorkspaceService.SetOwnerWord. The control plane proposes each document from what it holds - a key registered, a member added -. and keeps what was signed; it signs nothing. A client shows a person what they are signing and. signs it with a key of theirs: `spin sign`, with the keys ssh-agent holds, or the terminal's. page, with a passkey.

## ListPendingSignatures

`POST /spin.v1.SignatureService/ListPendingSignatures`

What the caller is asked to sign: their keyring when their keys changed, and the roster of each team they own when its members changed.
What the caller is asked to sign: their keyring when their keys changed, the roster of each team they own when its members changed, and their settings when they or their projects did.

**Request**

Expand Down
32 changes: 11 additions & 21 deletions src/content/docs/reference/api/types.md
Original file line number Diff line number Diff line change
Expand Up @@ -701,7 +701,7 @@ One of: `OUTSIDE_SHARE_STATE_UNSPECIFIED`, `OUTSIDE_SHARE_STATE_PREPARING`, `OUT

## OwnerWord

OwnerWord is a workspace's access, as its owner signed it with a key of their keyring (internal/ownerword): document is the access as framed JSON, signature the key's SSH signature over it (sshsig, namespace "spin-access") - what `ssh-keygen -Y sign` writes, so a FIDO2 key signs one through ssh-agent.
OwnerWord is a workspace's access, as its owner signed it with a key of their keyring (internal/ownerword): document is the access as framed JSON, signature the key's over it for namespace "spin-access": an SSH signature (sshsig) - what `ssh-keygen -Y sign` writes, so a FIDO2 key signs one through ssh-agent - or a set's (sshsig.SignSet), one passkey prompt over several documents, which ssh-keygen does not read.

| Field | Type | What it is |
|---|---|---|
Expand Down Expand Up @@ -736,6 +736,7 @@ PendingSignature is one document the caller is asked to sign.
| `signers` | list of string | signers are the keys, in authorized_keys form, any one of which may sign it. |
| `summary` | string | summary is a line saying what it changes, for a list: the document itself is what to read. |
| `deferred` | boolean | deferred is a document nothing asks for until the person uses what it gives: the roster of a team that has only ever been its one member, read only for an identity. Offered there, not on every page. |
| `previous` | string (byte) | previous is the version this one follows, as kept, for the client to show what changes against it; empty for none. |

## PlatformImage

Expand Down Expand Up @@ -796,6 +797,7 @@ A prebuild: one build of a project's ref at a commit, and the snapshot it left.
| `error` | string | |
| `createdAt` | `Timestamp` | |
| `builtAt` | `Timestamp` | |
| `workspaceCount` | integer (int32) | In ListPrebuilds: the workspaces opened from it that are not deleted, whoever's they are. |

## PrebuildState

Expand Down Expand Up @@ -835,6 +837,7 @@ A project: a repository and the shape of the workspace that opens it.
| `adminIds` | list of string | Its admins and whom it is shared with: shown to its admins, empty to everybody else. |
| `sharedUserIds` | list of string | |
| `sharedTeamIds` | list of string | |
| `readyPrebuildCount` | integer (int32) | In ListProjects: how many of its prebuilds are ready to open from. |

## QuarantineDenial

Expand Down Expand Up @@ -894,23 +897,6 @@ RekeyState is how far a disk's re-key is. - `REKEY_STATE_PENDING`: Marked by a r

One of: `REKEY_STATE_UNSPECIFIED`, `REKEY_STATE_PENDING`, `REKEY_STATE_COPYING`, `REKEY_STATE_READY`.

## RepositoryConfig

The repository a workspace opened, as its guest clones it: the project's URL, the ref the workspace was opened at, and where on the disk it goes (projects.CheckoutPath). Part of the settings the owner approves, as the environment is: a disk is written to only as its owner said.

| Field | Type | What it is |
|---|---|---|
| `url` | string | |
| `ref` | string | |
| `path` | string | |
| `authorName` | string | Who the checkout's commits are by: the workspace's owner's name and email as the installation knows them, set as the checkout's own user.name and user.email - the push goes as the team's app, and the commit says the person. Empty is neither set. |
| `authorEmail` | string | |
| `commit` | string | commit is the one a prebuild's build checks out and runs create at; empty for a workspace a person opens, which follows the ref. |
| `fromCommit` | string | from_commit is the commit the disk's checkout already is, for a disk cloned from a prebuild: the guest holds the tree to it (git fsck, no tracked file changed) before it fetches. |
| `prebuildId` | string | The prebuild the disk is a clone of, and the SHA-256 of the claim its host signed of it (PrebuildClaim): what the owner approves when the open was from one. |
| `prebuildClaimDigest` | string | |
| `pullRef` | string | pull_ref is a pull request's ref as its forge serves it (refs/pull/&lt;n>/head, GitLab's refs/merge-requests/&lt;n>/head), fetched once ref is cloned and checked out as pr-&lt;n> or mr-&lt;n>; empty for a workspace that opens at ref itself. |

## ResolverLookup

| Field | Type | What it is |
Expand Down Expand Up @@ -942,6 +928,7 @@ ResourcePreset is a class of workspace: its size, and how a workspace of it may
| `bandwidthMbps` | integer (int32) | What a workspace of it may carry each way, in megabits a second; 0 is unshaped. |
| `rpoSeconds` | integer (int32) | How far behind the object store a workspace of it may fall, in seconds; 0 is the installation's (InstallationSettings.volume_rpo_seconds). |
| `hostClass` | string | The host class its workspaces run on (HostClass). |
| `agentMinMemoryMb` | integer (int32) | What a workspace has to hold for its agent to start there, in MB, for whoever picks a preset. |

## Resources

Expand Down Expand Up @@ -1013,13 +1000,13 @@ ServiceHealth is one service over a window: the traces begun in it - what it was

## SignatureKind

- `SIGNATURE_KIND_KEYRING`: A user's keyring: the keys that may sign for them (roster.Keyring). Signed with a key of the keyring before it; the first, and one started anew, with a key it lists. - `SIGNATURE_KIND_ROSTER`: A team's roster: its members, its owners and each member's keyring (roster.Roster). Signed by an owner the roster before it lists; the first, by an owner it lists.
- `SIGNATURE_KIND_KEYRING`: A user's keyring: the keys that may sign for them (roster.Keyring). Signed with a key of the keyring before it; the first, and one started anew, with a key it lists. - `SIGNATURE_KIND_ROSTER`: A team's roster: its members, its owners and each member's keyring (roster.Roster). Signed by an owner the roster before it lists; the first, by an owner it lists. - `SIGNATURE_KIND_SETTINGS`: A user's settings: what their workspaces apply - dotfiles, shell, environment, editor, Taskfile, each workspace's own environment - and the repositories, by URL and ref, their workspaces may clone (ownersettings.Settings). Signed with a key of their newest keyring, never a session's: a host applies nothing else of theirs.

One of: `SIGNATURE_KIND_UNSPECIFIED`, `SIGNATURE_KIND_KEYRING`, `SIGNATURE_KIND_ROSTER`.
One of: `SIGNATURE_KIND_UNSPECIFIED`, `SIGNATURE_KIND_KEYRING`, `SIGNATURE_KIND_ROSTER`, `SIGNATURE_KIND_SETTINGS`.

## SignedDocument

SignedDocument is a document as framed JSON and an SSH signature over it (sshsig) - what `ssh-keygen -Y sign` writes, so a FIDO2 key signs one through ssh-agent, and a passkey's WebAuthn assertion is one too (internal/sshauth).
SignedDocument is a document as framed JSON and a signature over it: an SSH signature (sshsig) - what `ssh-keygen -Y sign` writes, so a FIDO2 key signs one through ssh-agent, and a passkey's WebAuthn assertion is one too (internal/sshauth) - or a set's (sshsig.SignSet), one passkey prompt over several documents, which ssh-keygen does not read.

| Field | Type | What it is |
|---|---|---|
Expand Down Expand Up @@ -1328,6 +1315,9 @@ VolumeRekey is a workspace's disk to re-key or being re-keyed.
| `ref` | string | |
| `wakeOnAccess` | boolean | Suspended, it is resumed by a signed-in visitor of one of its published ports (OpenWorkspaceProxySession). Never by an anonymous one: that would undo the idle suspension for whoever has a public port's URL. |
| `suspendedSnapshotId` | string | The snapshot it was suspended into: its next start resumes it rather than booting its disk. Empty when a start boots the disk - never suspended, resumed since, or the snapshot deleted. |
| `fromPrebuildId` | string | The prebuild its disk is a clone of; empty for one that opened with none. |
| `agentMinMemoryMb` | integer (int32) | What it has to hold for its agent to start there, in MB (the supervisor refuses below it). |
| `projectError` | string | project_error is what its guest last said went wrong with its project - the clone, its .spin.yaml or its create tasks - as the guest said it; empty when all of it went, or nothing has reported. The next boot tries again. |

## WorkspaceAction

Expand Down
22 changes: 8 additions & 14 deletions src/content/docs/reference/api/workspaceservice.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ description: "spin.v1.WorkspaceService: each procedure, its request and its resp
source: "spin:internal/controlplane/apidocs/spin.v1.openapi.json"
editUrl: false
sidebar:
order: 11
order: 12
---

<!-- Generated by tools/refgen from spin:internal/controlplane/apidocs/spin.v1.openapi.json. Edit the source, not this file. -->
Expand Down Expand Up @@ -71,6 +71,7 @@ Whether one request may reach one published port. The gate in front of them.
| `allowed` | boolean | |
| `access` | [PortAccess](/reference/api/types/#portaccess) | What the port's level is, so the proxy can tell a refusal that a login would fix from one it would not: an anonymous request to a PRIVATE port is a redirect, and a signed-in request to the same port is a 403 no amount of signing in changes. |
| `workspaceId` | string | The workspace the name was decided about, when allowed. The proxy pools connections by it and opens sessions for it: a name is freed by a rename and taken by someone else's workspace, and a connection pooled by name would carry the next request into the old one. |
| `sessionRefused` | boolean | The session asked with is no good here: it has ended, or is another workspace's. The proxy drops the cookie, which would otherwise be sent and refused until it expires. |

## CheckPortPublished

Expand Down Expand Up @@ -261,7 +262,7 @@ Port exposure

`POST /spin.v1.WorkspaceService/GetOwnerWord`

A workspace's newest access - who logs in, consent to collect logs, the settings approved - with what the next must say: the people the owner invited and the settings the guest would be handed now, for the owner to sign. Its owner's and its guests' to read.
A workspace's newest access - who logs in - with what the next must say: the people the owner invited, for the owner to sign. Its owner's and its guests' to read.

**Request**

Expand All @@ -275,22 +276,15 @@ A workspace's newest access - who logs in, consent to collect logs, the settings
|---|---|---|
| `word` | [OwnerWord](/reference/api/types/#ownerword) | word is the newest the owner signed; unset for a workspace whose owner has signed none. |
| `owner` | [AccessPerson](/reference/api/types/#accessperson) | owner is the workspace's owner, with their keyring as it is now: who signs the next. Empty keyring for an owner who has signed none. |
| `dotfiles` | [DotfilesConfig](/reference/api/types/#dotfilesconfig) | settings are the startup configuration the guest would be handed at its next registration: the owner's settings after the team's policy. A word approves them by their digest, which the client computes from these, as the guest does from what it is handed. |
| `defaultShell` | string | |
| `env` | map of string to string | |
| `editorSettings` | map of string to string | |
| `taskfile` | string | |
| `egressRoot` | string | egress_root is the installation's egress root, PEM: what the guest is handed at registration, and trusts only when a word names its digest. A client names it only once it has held it to the root it pinned for the installation, never on this answer's say alone. |
| `identityAudiences` | list of string | identity_audiences is who the installation gives identities for, empty for anybody: what a client offers its owner to name in a word, which a host holds every token to as well. |
| `teamId` | string | The workspace as its first access says it: team, image, and the snapshot and workspace it was cloned from. The next access says the same; the first says these. |
| `image` | string | |
| `parentSnapshotId` | string | |
| `parentWorkspaceId` | string | |
| `guests` | list of [AccessPerson](/reference/api/types/#accessperson) | guests are the people the owner invited, each with their keyring as it is now: who the next access names besides the owner. One with an empty keyring has signed none, and is named once they have. |
| `role` | string | role is the caller's: "owner", or "guest" - who reads it and signs nothing. |
| `repository` | [RepositoryConfig](/reference/api/types/#repositoryconfig) | repository is the one the workspace opened, part of the settings a word approves as the five above are: unset for a workspace that opened no project. |
| `prebuildClaim` | string (byte) | prebuild_claim is, for a workspace opened from a prebuild, the claim the host that built it signed (PrebuildClaim), whose SHA-256 repository.prebuild_claim_digest is: a client verifies it, and that it names the repository and the commit the settings do, before its word approves them. |
| `prebuildWriters` | map of string to string (byte) | prebuild_writers is the record of the claim's writer, by its id (writers/&lt;id>.json in the installation's store), which the client holds to its own anchors as it does a launch claim's. |
| `ownerKeyring` | list of [SignedDocument](/reference/api/types/#signeddocument) | owner_keyring is, answered to the owner alone, their keyring's signed versions from the first: what their client holds the key an access is signed by to (roster.VerifyKeyrings), rather than the control plane's word of whose key it is. |
| `standing` | [OwnerWord](/reference/api/types/#ownerword) | standing is the access a host lets people in by: the newest its owner signed with a key their newest keyring lists (ownerword.Newest). It is word, but where the key that signed word left the keyring: then it is what the next access is built on, which the client holds to owner_keyring before it does. Unset where no access a key of the keyring signed stands. |
| `checkoutPath` | string | checkout_path is where the workspace's project is checked out (projects.CheckoutPath), empty for a workspace that opened none: where its agent works unless told otherwise. |

## GetWorkspace

Expand Down Expand Up @@ -483,7 +477,7 @@ Keep a running workspace awake for a while: neither the idle suspension nor the

`POST /spin.v1.WorkspaceService/ListAgentThreads`

The agent's threads - T3 Code's chats - as the workspace's supervisor last reported them, which it does only while the owner's access consents (collect_logs). Titles, paths and times, never a message: the chat itself is read in T3 Code, over the owner's own session (`spin agent`).
The agent's threads - T3 Code's chats - as the workspace's supervisor last reported them. Titles, paths and times, never a message: the chat itself is read in T3 Code, over the owner's own session (`spin agent`).

**Request**

Expand All @@ -497,7 +491,7 @@ The agent's threads - T3 Code's chats - as the workspace's supervisor last repor
|---|---|---|
| `environmentId` | string | environment_id is T3 Code's id for the workspace's server: a thread's page in its web client is /&lt;environment_id>/&lt;thread id>, served at the port `spin agent` forwards. |
| `threads` | list of [AgentThread](/reference/api/types/#agentthread) | Newest first. |
| `reportedAt` | `Timestamp` | reported_at is when the supervisor last sent the index; unset where it never has - an owner who does not consent, or a workspace that ran no agent. |
| `reportedAt` | `Timestamp` | reported_at is when the supervisor last sent the index; unset where it never has - a workspace that ran no agent. |

## ListAgentVolumes

Expand Down
Loading
Loading