Team
Team displays real server state with a next action, not placeholder statistics.
Surface contract
Primary object: the membership list and the pending invitations for this workspace, each with its role and state.
Actions
- InviteCreates the invitation through POST /v1/invitations with the chosen role and optional software scope; an email is sent only when this deployment has SMTP configured, otherwise the acceptance link is shown.
- Change roleSends POST /v1/memberships/{id}/actions with action=role (owner/admin only); the server refuses demoting the last owner and the page shows that refusal.
- RevokeSends DELETE /v1/invitations/{id} for a pending invitation (owner/admin only); members themselves are suspended or removed through their own membership action, each confirmed in a dialog.
Required states and how this surface reaches them
- loading
- the session probe and each list show Loading… until the control plane answers.
- ready
- the server’s own records render as returned; the primary object is named before its details.
- empty
- no membership row for a new organization is unexpected; the server seeds the owner. No invitations yet means the list is empty and the direct action is the invite form.
- error
- the control plane’s status and detail are shown; no placeholder row replaces them.
- offline
- no control plane is reachable; nothing is rendered rather than invented.
- permission_denied
- a viewer/editor sees the member list read-only with the reason stated; the server refuses a role change, suspension or removal that the role cannot perform.
- not_configured
- when email delivery is not configured the invitation still exists and its acceptance link is shown; no email is claimed to have been sent.
- budget_paused
- a 402 (quota_exceeded / upgrade_required) pauses spending; the budget row shows the cap and consumption that caused it.
- requires_approval
- mutations the server reserves for an explicit human owner/admin are refused with its own detail and never auto-approved here.
Scope: workspace membership. The server decides who may manage members (owner/admin); the page disables what the role cannot do and shows the reason, and every refusal keeps the control plane’s own detail.
Members
Memberships come from the control plane; role changes, suspensions and removals are its decisions.
Loading…
Pending invitations
Invitations created through the control plane. Resend and revoke apply to pending invitations only.
Loading…
Invite a member
The invitation is created by the control plane; whether an email can be sent depends on this deployment's email configuration.
Loading…