picked 0.0.101 → 0.0.102-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/docs/reference/dashboard/workflow-test-runs.md +40 -17
  2. package/docs/reference/management-api/schema/action.md +67 -79
  3. package/docs/reference/management-api/schema/analytics-session.md +77 -94
  4. package/docs/reference/management-api/schema/analytics.md +16 -14
  5. package/docs/reference/management-api/schema/api-key.md +43 -51
  6. package/docs/reference/management-api/schema/auth.md +271 -404
  7. package/docs/reference/management-api/schema/cms-fields.md +348 -245
  8. package/docs/reference/management-api/schema/cms-models.md +369 -378
  9. package/docs/reference/management-api/schema/common.md +69 -130
  10. package/docs/reference/management-api/schema/condition.md +63 -74
  11. package/docs/reference/management-api/schema/design-system.md +59 -51
  12. package/docs/reference/management-api/schema/experience.md +388 -364
  13. package/docs/reference/management-api/schema/external-api.md +153 -171
  14. package/docs/reference/management-api/schema/feature.md +85 -103
  15. package/docs/reference/management-api/schema/feedback.md +27 -31
  16. package/docs/reference/management-api/schema/field.md +117 -135
  17. package/docs/reference/management-api/schema/index.md +184 -184
  18. package/docs/reference/management-api/schema/integration.md +72 -78
  19. package/docs/reference/management-api/schema/label.md +81 -137
  20. package/docs/reference/management-api/schema/lead.md +80 -119
  21. package/docs/reference/management-api/schema/mcp-server.md +73 -71
  22. package/docs/reference/management-api/schema/metric.md +6 -9
  23. package/docs/reference/management-api/schema/operation.md +17 -26
  24. package/docs/reference/management-api/schema/organization.md +198 -220
  25. package/docs/reference/management-api/schema/project.md +177 -186
  26. package/docs/reference/management-api/schema/report.md +69 -65
  27. package/docs/reference/management-api/schema/saved-view.md +71 -71
  28. package/docs/reference/management-api/schema/shopify.md +331 -204
  29. package/docs/reference/management-api/schema/step.md +72 -80
  30. package/docs/reference/management-api/schema/tenant-branding.md +48 -70
  31. package/docs/reference/management-api/schema/workbench.md +54 -66
  32. package/docs/reference/management-api/schema/workflow-run.md +66 -79
  33. package/docs/reference/management-api/schema/workflow.md +310 -353
  34. package/docs/reference/management-api/schema/workspace-version.md +212 -261
  35. package/docs/reference/management-api/schema/workspace.md +275 -328
  36. package/package.json +4 -4
@@ -6,13 +6,14 @@ generated: true
6
6
 
7
7
  # Organization schema
8
8
 
9
- The operations and types that `organization.graphql` adds to the Management API. See [Management API schema](/reference/management-api/schema) for every domain, the endpoint and authentication.
9
+ See [Management API schema](/reference/management-api/schema) for every domain, the endpoint and authentication.
10
10
 
11
11
  ## Queries
12
12
 
13
13
  ### `organization`
14
14
 
15
- Fetch a single organisation by ID or slug. Requires authentication.
15
+ Reads an organisation by ID or slug. Null when no organisation matches.
16
+ Scope: `ORGANIZATION_READ`.
16
17
 
17
18
  ```graphql
18
19
  organization(input: OrganizationInput!): Organization @auth
@@ -20,7 +21,8 @@ organization(input: OrganizationInput!): Organization @auth
20
21
 
21
22
  ### `organizations`
22
23
 
23
- List organisations the authenticated user belongs to. Requires authentication.
24
+ Lists the organisations the user belongs to. `search` matches a case-insensitive substring of
25
+ the name. Empty for an API key.
24
26
 
25
27
  ```graphql
26
28
  organizations(first: Int, after: String, search: String, sortKey: OrganizationSortKeys = NAME, reverse: Boolean = false): OrganizationConnection! @auth
@@ -30,7 +32,8 @@ organizations(first: Int, after: String, search: String, sortKey: OrganizationSo
30
32
 
31
33
  ### `organizationCreate`
32
34
 
33
- Create a new organisation. Requires scope: `ORGANIZATION_CREATE`.
35
+ Creates an organisation owned by the calling user.
36
+ Scope: `ORGANIZATION_CREATE`.
34
37
 
35
38
  ```graphql
36
39
  organizationCreate(input: OrganizationCreateInput!): OrganizationCreatePayload! @auth
@@ -38,7 +41,8 @@ organizationCreate(input: OrganizationCreateInput!): OrganizationCreatePayload!
38
41
 
39
42
  ### `organizationUpdate`
40
43
 
41
- Update an organisation. Requires scope: `ORGANIZATION_UPDATE`.
44
+ Updates an organisation.
45
+ Scope: `ORGANIZATION_UPDATE`.
42
46
 
43
47
  ```graphql
44
48
  organizationUpdate(input: OrganizationUpdateInput!): OrganizationUpdatePayload! @auth
@@ -46,7 +50,8 @@ organizationUpdate(input: OrganizationUpdateInput!): OrganizationUpdatePayload!
46
50
 
47
51
  ### `organizationDelete`
48
52
 
49
- Delete an organisation. Requires scope: `ORGANIZATION_DELETE`.
53
+ Deletes an organisation.
54
+ Scope: `ORGANIZATION_DELETE`.
50
55
 
51
56
  ```graphql
52
57
  organizationDelete(input: OrganizationDeleteInput!): OrganizationDeletePayload! @auth
@@ -54,7 +59,9 @@ organizationDelete(input: OrganizationDeleteInput!): OrganizationDeletePayload!
54
59
 
55
60
  ### `organizationMemberInvite`
56
61
 
57
- Invite a member to an organisation. Requires scope: `ORGANIZATION_INVITATIONS_CREATE`.
62
+ Invites an email address to an organisation and emails the invitee. `delivery` says which
63
+ email went out.
64
+ Scope: `ORGANIZATION_INVITATIONS_CREATE`.
58
65
 
59
66
  ```graphql
60
67
  organizationMemberInvite(input: OrganizationMemberInviteInput!): OrganizationMemberInvitePayload! @auth
@@ -62,7 +69,8 @@ organizationMemberInvite(input: OrganizationMemberInviteInput!): OrganizationMem
62
69
 
63
70
  ### `organizationInvitationAccept`
64
71
 
65
- Accept an organisation invitation. Requires authentication.
72
+ Accepts an invitation, making the calling user a member with the scopes it carries. The
73
+ invitation is used up. An unknown or expired token, or an existing membership, fails.
66
74
 
67
75
  ```graphql
68
76
  organizationInvitationAccept(input: OrganizationInvitationAcceptInput!): OrganizationInvitationAcceptPayload! @auth
@@ -70,7 +78,7 @@ organizationInvitationAccept(input: OrganizationInvitationAcceptInput!): Organiz
70
78
 
71
79
  ### `organizationInvitationDecline`
72
80
 
73
- Decline an organisation invitation. Requires authentication.
81
+ Declines an invitation addressed to the calling user's email address and deletes it.
74
82
 
75
83
  ```graphql
76
84
  organizationInvitationDecline(input: OrganizationInvitationDeclineInput!): OrganizationInvitationDeclinePayload! @auth
@@ -78,7 +86,8 @@ organizationInvitationDecline(input: OrganizationInvitationDeclineInput!): Organ
78
86
 
79
87
  ### `organizationInvitationRevoke`
80
88
 
81
- Revoke an organisation invitation. Requires scope: `ORGANIZATION_INVITATIONS_DELETE`.
89
+ Revokes a pending invitation, so its token stops working.
90
+ Scope: `ORGANIZATION_INVITATIONS_DELETE`.
82
91
 
83
92
  ```graphql
84
93
  organizationInvitationRevoke(input: OrganizationInvitationRevokeInput!): OrganizationInvitationRevokePayload! @auth
@@ -86,7 +95,9 @@ organizationInvitationRevoke(input: OrganizationInvitationRevokeInput!): Organiz
86
95
 
87
96
  ### `organizationMemberRemove`
88
97
 
89
- Remove a member from an organisation. Requires scope: `ORGANIZATION_MEMBERS_DELETE`.
98
+ Removes a member from an organisation, with every scope they held there. The primary owner
99
+ cannot be removed.
100
+ Scope: `ORGANIZATION_MEMBERS_DELETE`.
90
101
 
91
102
  ```graphql
92
103
  organizationMemberRemove(input: OrganizationMemberRemoveInput!): OrganizationMemberRemovePayload! @auth
@@ -94,10 +105,10 @@ organizationMemberRemove(input: OrganizationMemberRemoveInput!): OrganizationMem
94
105
 
95
106
  ### `organizationMemberScopesUpdate`
96
107
 
97
- Set the scopes a member holds in an organisation. Requires
98
- `ORGANIZATION_MEMBERS_MANAGE_SCOPES` reaching that organisation. The target
99
- must be a member. A caller may not grant a scope they do not themselves hold,
100
- and may not edit their own scopes.
108
+ Sets the scopes a member holds in an organisation. The caller cannot edit their own scopes,
109
+ grant a scope they do not hold, or take `ORGANIZATION_MEMBERS_MANAGE_SCOPES` from the primary
110
+ owner.
111
+ Scope: `ORGANIZATION_MEMBERS_MANAGE_SCOPES`.
101
112
 
102
113
  ```graphql
103
114
  organizationMemberScopesUpdate(input: OrganizationMemberScopesUpdateInput!): OrganizationMemberScopesUpdatePayload! @auth
@@ -105,11 +116,9 @@ organizationMemberScopesUpdate(input: OrganizationMemberScopesUpdateInput!): Org
105
116
 
106
117
  ### `organizationClientManagerScopesUpdate`
107
118
 
108
- Set the scopes a client manager holds in one organisation. Requires
109
- `STAFF_INVITE_CLIENT_MANAGER` at root. The target must be a client manager,
110
- and a caller may not edit their own scopes. A client manager may add or
111
- remove only scopes their own client-manager grant in that organisation
112
- carries; a super admin may set any.
119
+ Sets the scopes a client manager holds in one organisation. The caller cannot edit their own
120
+ scopes, and a client manager can add or remove only scopes they hold there themselves.
121
+ Scope: `STAFF_INVITE_CLIENT_MANAGER`.
113
122
 
114
123
  ```graphql
115
124
  organizationClientManagerScopesUpdate(input: OrganizationClientManagerScopesUpdateInput!): OrganizationClientManagerScopesUpdatePayload! @auth
@@ -121,19 +130,14 @@ organizationClientManagerScopesUpdate(input: OrganizationClientManagerScopesUpda
121
130
 
122
131
  ```graphql
123
132
  """
124
- Sort keys accepted by `organizations(...)` and `User.organizations(...)`.
125
-
126
- Pair with `reverse: true` to flip the order (e.g. `NAME` + `reverse: false`
127
- sorts A→Z; `CREATED_AT` + `reverse: true` sorts newest-first).
133
+ The orders an organisation list can take. `reverse: true` flips the order.
128
134
  """
129
135
  enum OrganizationSortKeys {
130
- """Sort by organisation `name` (alphabetical)."""
136
+ """By name, A to Z."""
131
137
  NAME
132
- """Sort by `createdAt`."""
138
+ """By creation time, oldest first."""
133
139
  CREATED_AT
134
- """
135
- Sort by `updatedAt`. Pair with `reverse: true` for most-recently-changed first.
136
- """
140
+ """By last change, oldest first."""
137
141
  UPDATED_AT
138
142
  }
139
143
  ```
@@ -142,19 +146,13 @@ enum OrganizationSortKeys {
142
146
 
143
147
  ```graphql
144
148
  """
145
- Invitation type. Historically, organisations could issue 24-hour multi-
146
- use invitations; that capability has been retired. All invitations are
147
- now single-use with a 30-day expiry.
148
-
149
- WARNING: This enum is retained for backwards compatibility with the
150
- deprecated `invitationType` argument on `organizationMemberInvite` and
151
- the deprecated `OrganizationInvitation.invitationType` field. Do not
152
- branch on it in new code.
149
+ The kind of an invitation. Every invitation is single-use and expires 30 days after it is
150
+ created.
153
151
  """
154
152
  enum InvitationType {
155
- """Single-use invitation that expires on acceptance or after 30 days."""
153
+ """Single-use, expiring after 30 days."""
156
154
  ONE_TIME @deprecated(reason: "All invitations are now single-use with 30-day expiration")
157
- """Deprecated. Previously allowed 24-hour multi-use invitations."""
155
+ """Multi-use, expiring after 24 hours. Not issued."""
158
156
  TWENTY_FOUR_HOUR @deprecated(reason: "All invitations are now single-use with 30-day expiration")
159
157
  }
160
158
  ```
@@ -163,52 +161,51 @@ enum InvitationType {
163
161
 
164
162
  ```graphql
165
163
  """
166
- An organisation — the top-level tenancy boundary for projects, API keys,
167
- integrations, and members.
168
-
169
- Every project, API key, and integration belongs to exactly one
170
- organisation. The set of scopes the current viewer holds in this
171
- organisation is available on `viewerScopes`; use it to drive
172
- client-side UX (which buttons to show, which actions to gate).
164
+ The top level of Picked. It holds your projects, members, API keys and integrations.
173
165
  """
174
166
  type Organization {
175
- """Unique organisation identifier."""
167
+ """The ID of the organisation."""
176
168
  id: ID!
177
- """Display name of the organisation."""
169
+ """The name of the organisation."""
178
170
  name: String!
179
171
  """
180
- URL-friendly slug for the organisation. Used in dashboard URLs and as a stable handle for the organisation.
172
+ The unique handle of the organisation in dashboard URLs. Null when it has none.
181
173
  """
182
174
  slug: String
183
- """When this organisation was created."""
175
+ """When the organisation was created."""
184
176
  createdAt: DateTime!
185
- """When this organisation was last updated."""
177
+ """When the organisation last changed."""
186
178
  updatedAt: DateTime!
187
179
  """
188
- Whether every member must hold an `AAL2` session. A member of an organisation
189
- with this on is held to the MFA policy on every request, whichever
190
- organisation the request names.
180
+ Whether every member must hold an `AAL2` session. A member of such an organisation is held to
181
+ it on every request, whichever organisation the request names.
191
182
  """
192
183
  requireMfa: Boolean!
193
- """Members of this organisation."""
184
+ """
185
+ The members of the organisation. Picked staff are not listed.
186
+ Scope: `ORGANIZATION_MEMBERS_READ`.
187
+ """
194
188
  members(first: Int, after: String): OrganizationMemberConnection!
195
- """Pending invitations for this organisation."""
189
+ """
190
+ The unexpired invitations of the organisation, newest first.
191
+ Scope: `ORGANIZATION_INVITATIONS_READ`.
192
+ """
196
193
  invitations(first: Int, after: String): OrganizationInvitationConnection!
197
194
  """
198
- Projects within this organisation. Filter by name with `search`
199
- (case-insensitive substring) and order with `sortKey` (default `NAME`) plus
200
- `reverse`.
195
+ The projects in the organisation. `search` matches a case-insensitive substring of the name.
196
+ Scope: `ORGANIZATION_PROJECTS_READ`.
201
197
  """
202
198
  projects(first: Int, after: String, search: String, sortKey: ProjectSortKeys = NAME, reverse: Boolean = false): ProjectConnection!
203
- """API keys for this organisation."""
204
- apiKeys(first: Int, after: String): ApiKeyConnection!
205
199
  """
206
- Scopes available to the current viewer in this organisation. Drives client-side UX gating.
200
+ The API keys of the organisation.
201
+ Scope: `ORGANIZATION_API_KEYS_READ`.
207
202
  """
203
+ apiKeys(first: Int, after: String): ApiKeyConnection!
204
+ """The scopes the viewer holds in the organisation."""
208
205
  viewerScopes: [Scope!]!
209
206
  """
210
- Every client manager, with the scopes their client-manager grant carries in
211
- this organisation. Empty unless the viewer holds `STAFF_READ` at root.
207
+ Every client manager, with the scopes they hold in the organisation. Empty unless the viewer
208
+ holds `STAFF_READ`.
212
209
  """
213
210
  clientManagerAccess: [OrganizationClientManagerAccess!]!
214
211
  }
@@ -217,34 +214,23 @@ type Organization {
217
214
  ### `OrganizationMember`
218
215
 
219
216
  ```graphql
220
- """
221
- A user's membership in an organisation. Carries the user's identifying
222
- fields denormalised from `auth.users`, plus the role and `joinedAt`
223
- timestamp.
224
-
225
- Member-level operations (`organizationMemberScopesUpdate`,
226
- `organizationMemberRemove`) require the corresponding scope on the
227
- parent organisation.
228
- """
217
+ """A person in an organisation."""
229
218
  type OrganizationMember {
230
- """Unique member identifier (the membership row id, not the user id)."""
219
+ """The ID of the member's user."""
231
220
  id: ID!
232
- """Email address of the member."""
221
+ """The email address of the member. Null when unknown."""
233
222
  userEmail: String
234
- """First name of the member."""
223
+ """The first name of the member. Null when unknown."""
235
224
  userFirstName: String
236
- """Last name of the member."""
225
+ """The last name of the member. Null when unknown."""
237
226
  userLastName: String
238
- """When the member joined the organisation."""
227
+ """The time of the request. The join time is not recorded."""
239
228
  joinedAt: DateTime!
240
- """
241
- Whether this member holds a verified MFA factor. Resolved for the whole page in one batched lookup.
242
- """
229
+ """Whether the member has a verified MFA factor."""
243
230
  mfaState: MfaState!
244
231
  """
245
- The scope grants this member holds in the organisation, one entry per
246
- location. Empty unless the viewer holds `ORGANIZATION_MEMBERS_MANAGE_SCOPES`
247
- reaching this organisation.
232
+ The scopes the member holds in the organisation, one entry per location. Empty unless the
233
+ viewer holds `ORGANIZATION_MEMBERS_MANAGE_SCOPES` in the organisation.
248
234
  """
249
235
  scopeGrants: [MemberScopeGrant!]!
250
236
  }
@@ -253,11 +239,13 @@ type OrganizationMember {
253
239
  ### `MemberScopeGrant`
254
240
 
255
241
  ```graphql
256
- """A set of scopes a member holds at one location within an organisation."""
242
+ """The scopes a member holds at one location in an organisation."""
257
243
  type MemberScopeGrant {
258
- """The project the scopes apply to, or null for the organisation itself."""
244
+ """
245
+ The ID of the project the scopes apply to. Null for the organisation itself.
246
+ """
259
247
  projectId: ID
260
- """The scopes held at that location."""
248
+ """The scopes held at the location."""
261
249
  scopes: [Scope!]!
262
250
  }
263
251
  ```
@@ -266,15 +254,14 @@ type MemberScopeGrant {
266
254
 
267
255
  ```graphql
268
256
  """
269
- A client manager and the scopes they hold in one organisation, on top of the
270
- root grant that reaches every organisation.
257
+ A client manager and the scopes they hold in one organisation, on top of the root grant that
258
+ reaches every organisation.
271
259
  """
272
260
  type OrganizationClientManagerAccess {
273
261
  """The client manager."""
274
262
  user: AdminUser!
275
263
  """
276
- The scopes their client-manager grant carries on this organisation. Empty
277
- when they hold none here.
264
+ The scopes the client manager holds in the organisation. Empty when they hold none.
278
265
  """
279
266
  scopes: [Scope!]!
280
267
  }
@@ -283,11 +270,11 @@ type OrganizationClientManagerAccess {
283
270
  ### `OrganizationMemberEdge`
284
271
 
285
272
  ```graphql
286
- """Edge type for `OrganizationMemberConnection`."""
273
+ """A member in a page of results."""
287
274
  type OrganizationMemberEdge {
288
- """Pagination cursor for this edge."""
275
+ """The cursor of this edge."""
289
276
  cursor: String!
290
- """The organisation member."""
277
+ """The member."""
291
278
  node: OrganizationMember!
292
279
  }
293
280
  ```
@@ -295,13 +282,13 @@ type OrganizationMemberEdge {
295
282
  ### `OrganizationMemberConnection`
296
283
 
297
284
  ```graphql
298
- """Relay-style connection of organisation members."""
285
+ """A page of organisation members."""
299
286
  type OrganizationMemberConnection {
300
- """List of member edges."""
287
+ """The edges in this page."""
301
288
  edges: [OrganizationMemberEdge!]!
302
- """Pagination metadata."""
289
+ """Where this page sits in the list."""
303
290
  pageInfo: PageInfo!
304
- """Total number of members."""
291
+ """The total number of members."""
305
292
  totalCount: Int!
306
293
  }
307
294
  ```
@@ -310,27 +297,19 @@ type OrganizationMemberConnection {
310
297
 
311
298
  ```graphql
312
299
  """
313
- An invitation to join an organisation. Created via
314
- `organizationMemberInvite`, accepted via `organizationInvitationAccept`,
315
- declined via `organizationInvitationDecline`, and revoked by the inviter
316
- via `organizationInvitationRevoke`.
317
-
318
- Invitations expire 30 days after creation (server-enforced; see
319
- `expiresAt`). Once accepted, the row remains for audit but cannot be
320
- re-accepted.
300
+ An offer to join an organisation, sent to an email address. It is single-use, expires 30 days
301
+ after it is created, and is removed once accepted, declined or revoked.
321
302
  """
322
303
  type OrganizationInvitation {
323
- """Unique invitation identifier."""
304
+ """The ID of the invitation."""
324
305
  id: ID!
325
- """
326
- Invitation type — retained for backwards compatibility. All invitations are now single-use.
327
- """
306
+ """Always `ONE_TIME`."""
328
307
  invitationType: InvitationType! @deprecated(reason: "All invitations are now single-use. This field will be removed.")
329
- """When this invitation was created."""
308
+ """When the invitation was created."""
330
309
  createdAt: DateTime!
331
- """When this invitation expires."""
310
+ """When the invitation expires."""
332
311
  expiresAt: DateTime!
333
- """Email address of the invited user."""
312
+ """The email address the invitation was sent to."""
334
313
  userEmail: String
335
314
  }
336
315
  ```
@@ -338,11 +317,11 @@ type OrganizationInvitation {
338
317
  ### `OrganizationInvitationEdge`
339
318
 
340
319
  ```graphql
341
- """Edge type for `OrganizationInvitationConnection`."""
320
+ """An invitation in a page of results."""
342
321
  type OrganizationInvitationEdge {
343
- """Pagination cursor for this edge."""
322
+ """The cursor of this edge."""
344
323
  cursor: String!
345
- """The organisation invitation."""
324
+ """The invitation."""
346
325
  node: OrganizationInvitation!
347
326
  }
348
327
  ```
@@ -350,13 +329,13 @@ type OrganizationInvitationEdge {
350
329
  ### `OrganizationInvitationConnection`
351
330
 
352
331
  ```graphql
353
- """Relay-style connection of organisation invitations."""
332
+ """A page of organisation invitations."""
354
333
  type OrganizationInvitationConnection {
355
- """List of invitation edges."""
334
+ """The edges in this page."""
356
335
  edges: [OrganizationInvitationEdge!]!
357
- """Pagination metadata."""
336
+ """Where this page sits in the list."""
358
337
  pageInfo: PageInfo!
359
- """Total number of invitations."""
338
+ """The total number of unexpired invitations."""
360
339
  totalCount: Int!
361
340
  }
362
341
  ```
@@ -365,25 +344,19 @@ type OrganizationInvitationConnection {
365
344
 
366
345
  ```graphql
367
346
  """
368
- An invitation addressed to the authenticated viewer, exposed via
369
- `User.invitations`. Carries the organisation name (so the dashboard can
370
- render a "Join <Org>" CTA without an extra fetch) plus the `token` the
371
- client passes to `organizationInvitationAccept` /
372
- `organizationInvitationDecline`.
373
-
374
- WARNING: `token` is sensitive — it grants the bearer the right to join
375
- the organisation. Treat it like a one-time secret.
347
+ An invitation addressed to the viewer's email address. Its `token` lets the bearer join the
348
+ organisation, so treat it as a secret.
376
349
  """
377
350
  type ViewerInvitation {
378
- """Unique invitation identifier."""
351
+ """The ID of the invitation."""
379
352
  id: ID!
380
- """Token used to accept or decline the invitation. Treat as sensitive."""
353
+ """The token that accepts or declines the invitation."""
381
354
  token: String!
382
- """Name of the inviting organisation."""
355
+ """The name of the inviting organisation."""
383
356
  organizationName: String!
384
- """When this invitation was created."""
357
+ """When the invitation was created."""
385
358
  createdAt: DateTime!
386
- """When this invitation expires."""
359
+ """When the invitation expires."""
387
360
  expiresAt: DateTime!
388
361
  }
389
362
  ```
@@ -391,11 +364,11 @@ type ViewerInvitation {
391
364
  ### `ViewerInvitationEdge`
392
365
 
393
366
  ```graphql
394
- """Edge type for `ViewerInvitationConnection`."""
367
+ """An invitation in a page of results."""
395
368
  type ViewerInvitationEdge {
396
- """Pagination cursor for this edge."""
369
+ """The cursor of this edge."""
397
370
  cursor: String!
398
- """The viewer invitation."""
371
+ """The invitation."""
399
372
  node: ViewerInvitation!
400
373
  }
401
374
  ```
@@ -403,13 +376,13 @@ type ViewerInvitationEdge {
403
376
  ### `ViewerInvitationConnection`
404
377
 
405
378
  ```graphql
406
- """Relay-style connection of the viewer's pending invitations."""
379
+ """A page of the viewer's invitations."""
407
380
  type ViewerInvitationConnection {
408
- """List of invitation edges."""
381
+ """The edges in this page."""
409
382
  edges: [ViewerInvitationEdge!]!
410
- """Pagination metadata."""
383
+ """Where this page sits in the list."""
411
384
  pageInfo: PageInfo!
412
- """Total number of invitations."""
385
+ """The total number of invitations."""
413
386
  totalCount: Int!
414
387
  }
415
388
  ```
@@ -417,9 +390,9 @@ type ViewerInvitationConnection {
417
390
  ### `OrganizationEdge`
418
391
 
419
392
  ```graphql
420
- """Edge type for `OrganizationConnection`."""
393
+ """An organisation in a page of results."""
421
394
  type OrganizationEdge {
422
- """Pagination cursor for this edge."""
395
+ """The cursor of this edge."""
423
396
  cursor: String!
424
397
  """The organisation."""
425
398
  node: Organization!
@@ -429,13 +402,13 @@ type OrganizationEdge {
429
402
  ### `OrganizationConnection`
430
403
 
431
404
  ```graphql
432
- """Relay-style connection of organisations."""
405
+ """A page of organisations."""
433
406
  type OrganizationConnection {
434
- """List of organisation edges."""
407
+ """The edges in this page."""
435
408
  edges: [OrganizationEdge!]!
436
- """Pagination metadata."""
409
+ """Where this page sits in the list."""
437
410
  pageInfo: PageInfo!
438
- """Total number of organisations."""
411
+ """The total number of organisations."""
439
412
  totalCount: Int!
440
413
  }
441
414
  ```
@@ -444,12 +417,12 @@ type OrganizationConnection {
444
417
 
445
418
  ```graphql
446
419
  """
447
- Input for looking up a single organisation. Provide either `id` or `slug` — at least one is required.
420
+ The input of `organization`. Give `id` or `slug`; `id` wins when both are given.
448
421
  """
449
422
  input OrganizationInput {
450
- """Organisation ID to look up."""
423
+ """The ID of the organisation."""
451
424
  id: ID
452
- """Organisation slug to look up."""
425
+ """The slug of the organisation."""
453
426
  slug: String
454
427
  }
455
428
  ```
@@ -457,12 +430,13 @@ input OrganizationInput {
457
430
  ### `OrganizationCreateInput`
458
431
 
459
432
  ```graphql
460
- """Input for `organizationCreate`."""
433
+ """The input of `organizationCreate`."""
461
434
  input OrganizationCreateInput {
462
- """Name of the organisation."""
435
+ """The name of the organisation."""
463
436
  name: String!
464
437
  """
465
- URL-friendly slug for the organisation. Must be unique across all organisations.
438
+ The slug of the organisation: lowercase letters, numbers and hyphens, unique across Picked. A
439
+ few words that name dashboard pages, such as `account` and `login`, are reserved.
466
440
  """
467
441
  slug: String!
468
442
  }
@@ -471,9 +445,9 @@ input OrganizationCreateInput {
471
445
  ### `OrganizationCreatePayload`
472
446
 
473
447
  ```graphql
474
- """Payload returned by `organizationCreate`."""
448
+ """The result of `organizationCreate`."""
475
449
  type OrganizationCreatePayload {
476
- """The newly created organisation."""
450
+ """The created organisation."""
477
451
  organization: Organization
478
452
  }
479
453
  ```
@@ -481,18 +455,17 @@ type OrganizationCreatePayload {
481
455
  ### `OrganizationUpdateInput`
482
456
 
483
457
  ```graphql
484
- """Input for `organizationUpdate`."""
458
+ """The input of `organizationUpdate`. Omit a field to keep its value."""
485
459
  input OrganizationUpdateInput {
486
- """ID of the organisation to update."""
460
+ """The ID of the organisation."""
487
461
  id: ID!
488
- """New name for the organisation. Omit to keep the existing value."""
462
+ """The name of the organisation."""
489
463
  name: String
490
- """New slug for the organisation. Must remain unique."""
464
+ """The slug of the organisation, under the same rules as on create."""
491
465
  slug: String
492
466
  """
493
- Whether every member must hold an `AAL2` session. Setting it to true needs
494
- the caller's own session at `AAL2` (an `AAL1` or OAuth-client token is
495
- refused with `MFA_REQUIRED`) and revokes every member's OAuth-client sessions.
467
+ Whether every member must hold an `AAL2` session. Turning it on needs the caller's own session
468
+ at `AAL2`, else fails with `MFA_REQUIRED`, and signs every member out of their OAuth clients.
496
469
  """
497
470
  requireMfa: Boolean
498
471
  }
@@ -501,7 +474,7 @@ input OrganizationUpdateInput {
501
474
  ### `OrganizationUpdatePayload`
502
475
 
503
476
  ```graphql
504
- """Payload returned by `organizationUpdate`."""
477
+ """The result of `organizationUpdate`."""
505
478
  type OrganizationUpdatePayload {
506
479
  """The updated organisation."""
507
480
  organization: Organization
@@ -511,9 +484,9 @@ type OrganizationUpdatePayload {
511
484
  ### `OrganizationDeleteInput`
512
485
 
513
486
  ```graphql
514
- """Input for `organizationDelete`."""
487
+ """The input of `organizationDelete`."""
515
488
  input OrganizationDeleteInput {
516
- """ID of the organisation to delete."""
489
+ """The ID of the organisation."""
517
490
  id: ID!
518
491
  }
519
492
  ```
@@ -521,9 +494,9 @@ input OrganizationDeleteInput {
521
494
  ### `OrganizationDeletePayload`
522
495
 
523
496
  ```graphql
524
- """Payload returned by `organizationDelete`."""
497
+ """The result of `organizationDelete`."""
525
498
  type OrganizationDeletePayload {
526
- """ID of the deleted organisation."""
499
+ """The ID of the deleted organisation."""
527
500
  deletedOrganizationId: ID
528
501
  }
529
502
  ```
@@ -531,23 +504,20 @@ type OrganizationDeletePayload {
531
504
  ### `OrganizationMemberInviteInput`
532
505
 
533
506
  ```graphql
534
- """
535
- Input for `organizationMemberInvite` — create a pending invitation for the given email.
536
- """
507
+ """The input of `organizationMemberInvite`."""
537
508
  input OrganizationMemberInviteInput {
538
- """ID of the organisation to invite the member to."""
509
+ """The ID of the organisation."""
539
510
  organizationId: ID!
540
- """Email address of the user to invite."""
511
+ """The email address to invite."""
541
512
  email: String!
542
513
  """
543
- Scopes the invitation grants on acceptance, one entry per location. Omit to
544
- grant the preset matching `role`. The inviter may not grant a scope they do
545
- not themselves hold.
514
+ The scopes the invitation grants on acceptance, one entry per location. Omit to grant
515
+ `ORGANIZATION_READ` alone. The inviter cannot grant a scope they do not hold.
546
516
  """
547
517
  grants: [MemberScopeGrantInput!]
548
- """Invitation type. Ignored; retained for backwards compatibility."""
518
+ """Ignored."""
549
519
  invitationType: InvitationType @deprecated(reason: "All invitations are now single-use. This field is ignored.")
550
- """URL to redirect the invited user to after email verification."""
520
+ """The URL the email's link returns the invitee to."""
551
521
  redirectUrl: String
552
522
  }
553
523
  ```
@@ -560,12 +530,12 @@ enum InvitationDelivery {
560
530
  """An invitation email, for an address with no account."""
561
531
  INVITE_EMAIL
562
532
  """
563
- A sign-in email, for an address that already has an account. The invitation
564
- waits on the user's Account page.
533
+ A sign-in email, for an address that already has an account. The invitation waits on the
534
+ user's Account page.
565
535
  """
566
536
  SIGN_IN_EMAIL
567
537
  """
568
- No email went out. The invitation still waits on the Account page of a user with the address.
538
+ No email. The invitation still waits on the Account page of a user with the address.
569
539
  """
570
540
  NOT_SENT
571
541
  }
@@ -574,7 +544,7 @@ enum InvitationDelivery {
574
544
  ### `OrganizationMemberInvitePayload`
575
545
 
576
546
  ```graphql
577
- """Payload returned by `organizationMemberInvite`."""
547
+ """The result of `organizationMemberInvite`."""
578
548
  type OrganizationMemberInvitePayload {
579
549
  """The created invitation."""
580
550
  invitation: OrganizationInvitation
@@ -586,9 +556,11 @@ type OrganizationMemberInvitePayload {
586
556
  ### `OrganizationInvitationAcceptInput`
587
557
 
588
558
  ```graphql
589
- """Input for `organizationInvitationAccept`."""
559
+ """The input of `organizationInvitationAccept`."""
590
560
  input OrganizationInvitationAcceptInput {
591
- """Token from the invitation email — see `ViewerInvitation.token`."""
561
+ """
562
+ The token of the invitation, from `ViewerInvitation.token` or the invitation email.
563
+ """
592
564
  token: String!
593
565
  }
594
566
  ```
@@ -596,11 +568,11 @@ input OrganizationInvitationAcceptInput {
596
568
  ### `AcceptedMembership`
597
569
 
598
570
  ```graphql
599
- """Membership information returned after accepting an invitation."""
571
+ """The organisation a user joined by accepting an invitation."""
600
572
  type AcceptedMembership {
601
- """ID of the organisation joined."""
573
+ """The ID of the organisation."""
602
574
  organizationId: ID!
603
- """Name of the organisation joined."""
575
+ """The name of the organisation."""
604
576
  organizationName: String!
605
577
  }
606
578
  ```
@@ -608,9 +580,9 @@ type AcceptedMembership {
608
580
  ### `OrganizationInvitationAcceptPayload`
609
581
 
610
582
  ```graphql
611
- """Payload returned by `organizationInvitationAccept`."""
583
+ """The result of `organizationInvitationAccept`."""
612
584
  type OrganizationInvitationAcceptPayload {
613
- """The membership created by accepting the invitation."""
585
+ """The organisation joined."""
614
586
  membership: AcceptedMembership
615
587
  }
616
588
  ```
@@ -618,9 +590,9 @@ type OrganizationInvitationAcceptPayload {
618
590
  ### `OrganizationInvitationDeclineInput`
619
591
 
620
592
  ```graphql
621
- """Input for `organizationInvitationDecline`."""
593
+ """The input of `organizationInvitationDecline`."""
622
594
  input OrganizationInvitationDeclineInput {
623
- """Token from the invitation email."""
595
+ """The token of the invitation."""
624
596
  token: String!
625
597
  }
626
598
  ```
@@ -628,9 +600,9 @@ input OrganizationInvitationDeclineInput {
628
600
  ### `OrganizationInvitationDeclinePayload`
629
601
 
630
602
  ```graphql
631
- """Payload returned by `organizationInvitationDecline`."""
603
+ """The result of `organizationInvitationDecline`."""
632
604
  type OrganizationInvitationDeclinePayload {
633
- """Token of the declined invitation."""
605
+ """The token of the declined invitation."""
634
606
  declinedToken: String
635
607
  }
636
608
  ```
@@ -638,13 +610,11 @@ type OrganizationInvitationDeclinePayload {
638
610
  ### `OrganizationInvitationRevokeInput`
639
611
 
640
612
  ```graphql
641
- """
642
- Input for `organizationInvitationRevoke` — withdraw a pending invitation.
643
- """
613
+ """The input of `organizationInvitationRevoke`."""
644
614
  input OrganizationInvitationRevokeInput {
645
- """ID of the invitation to revoke."""
615
+ """The ID of the invitation."""
646
616
  invitationId: ID!
647
- """ID of the organisation the invitation belongs to."""
617
+ """Ignored. The invitation's own organisation applies."""
648
618
  organizationId: ID!
649
619
  }
650
620
  ```
@@ -652,9 +622,9 @@ input OrganizationInvitationRevokeInput {
652
622
  ### `OrganizationInvitationRevokePayload`
653
623
 
654
624
  ```graphql
655
- """Payload returned by `organizationInvitationRevoke`."""
625
+ """The result of `organizationInvitationRevoke`."""
656
626
  type OrganizationInvitationRevokePayload {
657
- """ID of the revoked invitation."""
627
+ """The ID of the revoked invitation."""
658
628
  revokedInvitationId: ID
659
629
  }
660
630
  ```
@@ -662,11 +632,11 @@ type OrganizationInvitationRevokePayload {
662
632
  ### `OrganizationMemberRemoveInput`
663
633
 
664
634
  ```graphql
665
- """Input for `organizationMemberRemove`."""
635
+ """The input of `organizationMemberRemove`."""
666
636
  input OrganizationMemberRemoveInput {
667
- """ID of the organisation to remove the member from."""
637
+ """The ID of the organisation."""
668
638
  organizationId: ID!
669
- """ID of the user to remove."""
639
+ """The ID of the member's user."""
670
640
  userId: ID!
671
641
  }
672
642
  ```
@@ -674,9 +644,9 @@ input OrganizationMemberRemoveInput {
674
644
  ### `OrganizationMemberRemovePayload`
675
645
 
676
646
  ```graphql
677
- """Payload returned by `organizationMemberRemove`."""
647
+ """The result of `organizationMemberRemove`."""
678
648
  type OrganizationMemberRemovePayload {
679
- """ID of the removed user."""
649
+ """The ID of the removed member's user."""
680
650
  removedUserId: ID
681
651
  }
682
652
  ```
@@ -684,11 +654,16 @@ type OrganizationMemberRemovePayload {
684
654
  ### `MemberScopeGrantInput`
685
655
 
686
656
  ```graphql
687
- """A set of scopes to grant at one location within an organisation."""
657
+ """
658
+ The scopes to grant at one location in an organisation. A grant on the organisation itself
659
+ always includes `ORGANIZATION_READ`.
660
+ """
688
661
  input MemberScopeGrantInput {
689
- """The project the scopes apply to, or null for the organisation itself."""
662
+ """
663
+ The ID of the project the scopes apply to. Null for the organisation itself.
664
+ """
690
665
  projectId: ID
691
- """The scopes to hold at that location."""
666
+ """The scopes to hold at the location."""
692
667
  scopes: [Scope!]!
693
668
  }
694
669
  ```
@@ -696,15 +671,17 @@ input MemberScopeGrantInput {
696
671
  ### `OrganizationMemberScopesUpdateInput`
697
672
 
698
673
  ```graphql
699
- """Input for `organizationMemberScopesUpdate`."""
674
+ """
675
+ The input of `organizationMemberScopesUpdate`. Every field is required.
676
+ """
700
677
  input OrganizationMemberScopesUpdateInput {
701
- """ID of the organisation."""
678
+ """The ID of the organisation."""
702
679
  organizationId: ID!
703
- """ID of the member whose scopes to set."""
680
+ """The ID of the member's user."""
704
681
  userId: ID!
705
682
  """
706
- The grants to leave in place. Locations absent from this list are cleared;
707
- grants outside this organisation are untouched.
683
+ Every grant the member keeps in the organisation, at most one per location. A location left
684
+ out loses its grant. `ORGANIZATION_MEMBERS_MANAGE_SCOPES` applies to the organisation only.
708
685
  """
709
686
  grants: [MemberScopeGrantInput!]!
710
687
  }
@@ -713,7 +690,7 @@ input OrganizationMemberScopesUpdateInput {
713
690
  ### `OrganizationMemberScopesUpdatePayload`
714
691
 
715
692
  ```graphql
716
- """Payload returned by `organizationMemberScopesUpdate`."""
693
+ """The result of `organizationMemberScopesUpdate`."""
717
694
  type OrganizationMemberScopesUpdatePayload {
718
695
  """The member whose scopes were set."""
719
696
  member: OrganizationMember
@@ -723,16 +700,17 @@ type OrganizationMemberScopesUpdatePayload {
723
700
  ### `OrganizationClientManagerScopesUpdateInput`
724
701
 
725
702
  ```graphql
726
- """Input for `organizationClientManagerScopesUpdate`."""
703
+ """
704
+ The input of `organizationClientManagerScopesUpdate`. Every field is required.
705
+ """
727
706
  input OrganizationClientManagerScopesUpdateInput {
728
- """ID of the organisation."""
707
+ """The ID of the organisation."""
729
708
  organizationId: ID!
730
- """ID of the client manager whose scopes to set."""
709
+ """The ID of the client manager's user."""
731
710
  userId: ID!
732
711
  """
733
- The scopes to hold on this organisation, replacing whatever was held before.
734
- An empty list clears the grant, leaving the root grant as their whole reach.
735
- Root-located scopes are rejected: they bind to no organisation.
712
+ The scopes to hold in the organisation, replacing the current ones. An empty list clears them,
713
+ leaving the root grant. A scope that applies to every organisation fails validation.
736
714
  """
737
715
  scopes: [Scope!]!
738
716
  }
@@ -741,9 +719,9 @@ input OrganizationClientManagerScopesUpdateInput {
741
719
  ### `OrganizationClientManagerScopesUpdatePayload`
742
720
 
743
721
  ```graphql
744
- """Payload returned by `organizationClientManagerScopesUpdate`."""
722
+ """The result of `organizationClientManagerScopesUpdate`."""
745
723
  type OrganizationClientManagerScopesUpdatePayload {
746
- """The client manager whose scopes were set."""
724
+ """The client manager and the scopes they now hold."""
747
725
  access: OrganizationClientManagerAccess
748
726
  }
749
727
  ```