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,21 +6,36 @@ generated: true
6
6
 
7
7
  # Cms models schema
8
8
 
9
- The operations and types that `cms-models.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
  ### `contentModels`
14
14
 
15
- List CMS Content Models in a workspace, optionally filtered by category.
15
+ Lists the models in a workspace.
16
+ Scope: `ORGANIZATION_WORKSPACE_READ`.
16
17
 
17
18
  ```graphql
18
- contentModels(workspaceId: ID!, category: ContentModelCategory, first: Int, after: String, last: Int, before: String, search: String, sortKey: ContentModelSortKeys = NAME, reverse: Boolean = false): ContentModelConnection! @auth
19
+ contentModels(
20
+ workspaceId: ID!
21
+ """The role to filter by. Omit it for every model."""
22
+ category: ContentModelCategory
23
+ first: Int
24
+ after: String
25
+ last: Int
26
+ before: String
27
+ """Text that the model name contains, ignoring case."""
28
+ search: String
29
+ sortKey: ContentModelSortKeys = NAME
30
+ """Whether to reverse the order of `sortKey`."""
31
+ reverse: Boolean = false
32
+ ): ContentModelConnection! @auth
19
33
  ```
20
34
 
21
35
  ### `contentModel`
22
36
 
23
- Fetch a CMS Content Model by id.
37
+ Reads a model.
38
+ Scope: `ORGANIZATION_WORKSPACE_READ`.
24
39
 
25
40
  ```graphql
26
41
  contentModel(id: ID!): ContentModel @auth
@@ -28,15 +43,30 @@ contentModel(id: ID!): ContentModel @auth
28
43
 
29
44
  ### `contentBlocks`
30
45
 
31
- List CMS Content Blocks in a workspace, optionally filtered by category.
46
+ Lists the blocks in a workspace.
47
+ Scope: `ORGANIZATION_WORKSPACE_READ`.
32
48
 
33
49
  ```graphql
34
- contentBlocks(workspaceId: ID!, category: ContentBlockCategory, first: Int, after: String, last: Int, before: String, search: String, sortKey: ContentBlockSortKeys = NAME, reverse: Boolean = false): ContentBlockConnection! @auth
50
+ contentBlocks(
51
+ workspaceId: ID!
52
+ """The role to filter by. Omit it for every block."""
53
+ category: ContentBlockCategory
54
+ first: Int
55
+ after: String
56
+ last: Int
57
+ before: String
58
+ """Text that the block name contains, ignoring case."""
59
+ search: String
60
+ sortKey: ContentBlockSortKeys = NAME
61
+ """Whether to reverse the order of `sortKey`."""
62
+ reverse: Boolean = false
63
+ ): ContentBlockConnection! @auth
35
64
  ```
36
65
 
37
66
  ### `contentBlock`
38
67
 
39
- Fetch a CMS Content Block by id.
68
+ Reads a block.
69
+ Scope: `ORGANIZATION_WORKSPACE_READ`.
40
70
 
41
71
  ```graphql
42
72
  contentBlock(id: ID!): ContentBlock @auth
@@ -44,15 +74,28 @@ contentBlock(id: ID!): ContentBlock @auth
44
74
 
45
75
  ### `contentEntries`
46
76
 
47
- List CMS Content Entries in a workspace, optionally filtered by parent Content Model.
77
+ Lists the content entries in a workspace.
78
+ Scope: `ORGANIZATION_WORKSPACE_READ`.
48
79
 
49
80
  ```graphql
50
- contentEntries(workspaceId: ID!, contentModelId: ID, first: Int, after: String, last: Int, before: String, sortKey: ContentEntrySortKeys = CREATED_AT, reverse: Boolean = false): ContentEntryConnection! @auth
81
+ contentEntries(
82
+ workspaceId: ID!
83
+ """The ID of the model to filter by. Omit it for every content entry."""
84
+ contentModelId: ID
85
+ first: Int
86
+ after: String
87
+ last: Int
88
+ before: String
89
+ sortKey: ContentEntrySortKeys = CREATED_AT
90
+ """Whether to reverse the order of `sortKey`."""
91
+ reverse: Boolean = false
92
+ ): ContentEntryConnection! @auth
51
93
  ```
52
94
 
53
95
  ### `contentEntry`
54
96
 
55
- Fetch a CMS Content Entry by id.
97
+ Reads a content entry.
98
+ Scope: `ORGANIZATION_WORKSPACE_READ`.
56
99
 
57
100
  ```graphql
58
101
  contentEntry(id: ID!): ContentEntry @auth
@@ -60,15 +103,34 @@ contentEntry(id: ID!): ContentEntry @auth
60
103
 
61
104
  ### `assets`
62
105
 
63
- List CMS Assets in a project, with optional text search, MIME-type filtering, and sort.
106
+ Lists the assets in a project, newest first by default.
107
+ Scope: `ORGANIZATION_PROJECTS_READ`.
64
108
 
65
109
  ```graphql
66
- assets(projectId: ID!, first: Int, after: String, last: Int, before: String, search: String, kind: AssetKind, acceptedMimeTypes: [String!], sortKey: AssetSortKeys = CREATED_AT, reverse: Boolean = true): AssetConnection! @auth
110
+ assets(
111
+ projectId: ID!
112
+ first: Int
113
+ after: String
114
+ last: Int
115
+ before: String
116
+ """Text that the file name contains, ignoring case."""
117
+ search: String
118
+ """The media type group to filter by."""
119
+ kind: AssetKind
120
+ """
121
+ The MIME types to filter by. An entry such as `image/*` matches every subtype.
122
+ """
123
+ acceptedMimeTypes: [String!]
124
+ sortKey: AssetSortKeys = CREATED_AT
125
+ """Whether to reverse the order of `sortKey`."""
126
+ reverse: Boolean = true
127
+ ): AssetConnection! @auth
67
128
  ```
68
129
 
69
130
  ### `asset`
70
131
 
71
- Fetch a CMS Asset by id.
132
+ Reads an asset.
133
+ Scope: `ORGANIZATION_PROJECTS_READ`.
72
134
 
73
135
  ```graphql
74
136
  asset(id: ID!): Asset @auth
@@ -76,21 +138,24 @@ asset(id: ID!): Asset @auth
76
138
 
77
139
  ### `workspaceContentEntryValidation`
78
140
 
79
- Run schema validation across every Content Entry in a workspace and
80
- report which rows no longer conform. Read-only — does not auto-fix.
81
- Useful as a pre-publish sanity gate, especially after a Content Block
82
- schema change. Optionally narrow the sweep to a single Content Model
83
- with `contentModelId`.
141
+ Verifies each content entry in a workspace against its model's schema, including embedded blocks.
142
+ It changes no data.
143
+ Scope: `ORGANIZATION_WORKSPACE_READ`.
84
144
 
85
145
  ```graphql
86
- workspaceContentEntryValidation(workspaceId: ID!, contentModelId: ID): WorkspaceContentEntryValidationPayload! @auth
146
+ workspaceContentEntryValidation(
147
+ workspaceId: ID!
148
+ """The ID of a model, to check only its content entries."""
149
+ contentModelId: ID
150
+ ): WorkspaceContentEntryValidationPayload! @auth
87
151
  ```
88
152
 
89
153
  ## Mutations
90
154
 
91
155
  ### `contentModelCreate`
92
156
 
93
- Create a new CMS Content Model. Requires scope: `ORGANIZATION_PROJECTS_UPDATE`.
157
+ Creates a model.
158
+ Scope: `ORGANIZATION_WORKSPACE_UPDATE`.
94
159
 
95
160
  ```graphql
96
161
  contentModelCreate(input: ContentModelCreateInput!): ContentModelCreatePayload! @auth
@@ -98,7 +163,9 @@ contentModelCreate(input: ContentModelCreateInput!): ContentModelCreatePayload!
98
163
 
99
164
  ### `contentModelUpdate`
100
165
 
101
- Update a CMS Content Model. Returns migration warnings when the schema change drops or coerces dependent Content Entry fields.
166
+ Updates a model. A schema change migrates the data of its content entries and lists each
167
+ removed value in `migrationWarnings`.
168
+ Scope: `ORGANIZATION_WORKSPACE_UPDATE`.
102
169
 
103
170
  ```graphql
104
171
  contentModelUpdate(input: ContentModelUpdateInput!): ContentModelUpdatePayload! @auth
@@ -106,7 +173,9 @@ contentModelUpdate(input: ContentModelUpdateInput!): ContentModelUpdatePayload!
106
173
 
107
174
  ### `contentModelDelete`
108
175
 
109
- Soft-delete a CMS Content Model. Refuses if dependent Content Entry rows still exist.
176
+ Deletes a model. Fails with `CONFLICT` while content entries use it, or while another schema's
177
+ reference field targets it.
178
+ Scope: `ORGANIZATION_WORKSPACE_UPDATE`.
110
179
 
111
180
  ```graphql
112
181
  contentModelDelete(input: ContentModelDeleteInput!): ContentModelDeletePayload! @auth
@@ -114,7 +183,8 @@ contentModelDelete(input: ContentModelDeleteInput!): ContentModelDeletePayload!
114
183
 
115
184
  ### `contentBlockCreate`
116
185
 
117
- Create a new CMS Content Block. Requires scope: `ORGANIZATION_PROJECTS_UPDATE`.
186
+ Creates a block.
187
+ Scope: `ORGANIZATION_WORKSPACE_UPDATE`.
118
188
 
119
189
  ```graphql
120
190
  contentBlockCreate(input: ContentBlockCreateInput!): ContentBlockCreatePayload! @auth
@@ -122,7 +192,8 @@ contentBlockCreate(input: ContentBlockCreateInput!): ContentBlockCreatePayload!
122
192
 
123
193
  ### `contentBlockUpdate`
124
194
 
125
- Update a CMS Content Block schema.
195
+ Updates a block. A schema change does not migrate the content entries that embed it.
196
+ Scope: `ORGANIZATION_WORKSPACE_UPDATE`.
126
197
 
127
198
  ```graphql
128
199
  contentBlockUpdate(input: ContentBlockUpdateInput!): ContentBlockUpdatePayload! @auth
@@ -130,7 +201,8 @@ contentBlockUpdate(input: ContentBlockUpdateInput!): ContentBlockUpdatePayload!
130
201
 
131
202
  ### `contentBlockDelete`
132
203
 
133
- Soft-delete a CMS Content Block.
204
+ Deletes a block.
205
+ Scope: `ORGANIZATION_WORKSPACE_UPDATE`.
134
206
 
135
207
  ```graphql
136
208
  contentBlockDelete(input: ContentBlockDeleteInput!): ContentBlockDeletePayload! @auth
@@ -138,7 +210,9 @@ contentBlockDelete(input: ContentBlockDeleteInput!): ContentBlockDeletePayload!
138
210
 
139
211
  ### `contentEntryCreate`
140
212
 
141
- Create a new CMS Content Entry against a parent Content Model.
213
+ Creates a content entry of a model. Each asset reference without a version is pinned to the
214
+ asset's current version.
215
+ Scope: `ORGANIZATION_WORKSPACE_UPDATE`.
142
216
 
143
217
  ```graphql
144
218
  contentEntryCreate(input: ContentEntryCreateInput!): ContentEntryCreatePayload! @auth
@@ -146,7 +220,9 @@ contentEntryCreate(input: ContentEntryCreateInput!): ContentEntryCreatePayload!
146
220
 
147
221
  ### `contentEntryUpdate`
148
222
 
149
- Update a CMS Content Entry's data.
223
+ Updates the data of a content entry. Each asset reference without a version is pinned to the
224
+ asset's current version.
225
+ Scope: `ORGANIZATION_WORKSPACE_UPDATE`.
150
226
 
151
227
  ```graphql
152
228
  contentEntryUpdate(input: ContentEntryUpdateInput!): ContentEntryUpdatePayload! @auth
@@ -154,7 +230,9 @@ contentEntryUpdate(input: ContentEntryUpdateInput!): ContentEntryUpdatePayload!
154
230
 
155
231
  ### `contentEntryDelete`
156
232
 
157
- Soft-delete a CMS Content Entry. Refuses if a Step references it.
233
+ Deletes a content entry. Fails with `CONFLICT` while a step uses it as its layout, or while
234
+ another content entry references it.
235
+ Scope: `ORGANIZATION_WORKSPACE_UPDATE`.
158
236
 
159
237
  ```graphql
160
238
  contentEntryDelete(input: ContentEntryDeleteInput!): ContentEntryDeletePayload! @auth
@@ -162,7 +240,9 @@ contentEntryDelete(input: ContentEntryDeleteInput!): ContentEntryDeletePayload!
162
240
 
163
241
  ### `assetUploadInit`
164
242
 
165
- Initiate an Asset upload — returns a pre-signed PUT URL plus the allocated asset id.
243
+ Starts an asset upload and returns a pre-signed URL to PUT the bytes to. Nothing is stored until
244
+ `assetCommit`.
245
+ Scope: `ORGANIZATION_PROJECTS_UPDATE`.
166
246
 
167
247
  ```graphql
168
248
  assetUploadInit(input: AssetUploadInitInput!): AssetUploadInitPayload! @auth
@@ -170,7 +250,9 @@ assetUploadInit(input: AssetUploadInitInput!): AssetUploadInitPayload! @auth
170
250
 
171
251
  ### `assetCommit`
172
252
 
173
- Finalise an Asset upload — captures size, MIME, and intrinsic dimensions for images.
253
+ Commits an uploaded file as the asset's current version, recording its size, MIME type and image
254
+ dimensions. Fails when the bytes do not match the claimed content type.
255
+ Scope: `ORGANIZATION_PROJECTS_UPDATE`.
174
256
 
175
257
  ```graphql
176
258
  assetCommit(input: AssetCommitInput!): AssetCommitPayload! @auth
@@ -178,7 +260,9 @@ assetCommit(input: AssetCommitInput!): AssetCommitPayload! @auth
178
260
 
179
261
  ### `assetDelete`
180
262
 
181
- Soft-delete an Asset. The underlying storage object is removed best-effort.
263
+ Deletes an asset and its stored files. Fails with `CONFLICT` once a publish uses any of its
264
+ versions; content entries that reference it are not checked.
265
+ Scope: `ORGANIZATION_PROJECTS_UPDATE`.
182
266
 
183
267
  ```graphql
184
268
  assetDelete(input: AssetDeleteInput!): AssetDeletePayload! @auth
@@ -189,14 +273,11 @@ assetDelete(input: AssetDeleteInput!): AssetDeletePayload! @auth
189
273
  ### `ContentModelCategory`
190
274
 
191
275
  ```graphql
192
- """
193
- Content Model schema category. Picking a category determines where the
194
- Content Model surfaces in the dashboard.
195
- """
276
+ """The role of a model, which decides what its entries lay out."""
196
277
  enum ContentModelCategory {
197
- """Layout configuration for an experience Step."""
278
+ """The layout of one step inside a flow."""
198
279
  STEP_LAYOUT
199
- """Layout configuration for an experience Page."""
280
+ """The layout of a page."""
200
281
  PAGE_LAYOUT
201
282
  }
202
283
  ```
@@ -204,13 +285,9 @@ enum ContentModelCategory {
204
285
  ### `ContentBlockCategory`
205
286
 
206
287
  ```graphql
207
- """
208
- Content Block schema category. Blocks of a given category can only be
209
- embedded inside Models / Blocks whose schema declares a
210
- `ContentBlockFieldDefinition` accepting that category.
211
- """
288
+ """The role of a block, which decides which block fields accept it."""
212
289
  enum ContentBlockCategory {
213
- """A page section (hero, feature list, testimonial, etc.)."""
290
+ """A page section, such as a hero, a feature list or a testimonial."""
214
291
  SECTION
215
292
  }
216
293
  ```
@@ -218,19 +295,15 @@ enum ContentBlockCategory {
218
295
  ### `MigrationWarningType`
219
296
 
220
297
  ```graphql
221
- """
222
- Kind of warning produced by an auto-migration of dependent Content Entries when a parent Content Model's schema changes.
223
- """
298
+ """What a model schema change did to the data of one content entry."""
224
299
  enum MigrationWarningType {
225
- """
226
- A field was dropped from the schema; entry data for that field has been removed.
227
- """
300
+ """The field left the schema, and its value was removed."""
228
301
  FIELD_REMOVED
229
302
  """
230
- A field's type changed; entry data for that field has been coerced (or set to null if coercion is not possible).
303
+ The field changed type, and its value could not be converted, so it was removed.
231
304
  """
232
305
  TYPE_CHANGE
233
- """A field was renamed and requires manual migration in the dashboard."""
306
+ """The field was renamed, and its value needs moving by hand."""
234
307
  RENAME_REQUIRED
235
308
  }
236
309
  ```
@@ -239,33 +312,31 @@ enum MigrationWarningType {
239
312
 
240
313
  ```graphql
241
314
  """
242
- A workspace-scoped CMS Content Model — the structural schema that
243
- dependent Content Entries conform to. Changing a Content Model's schema
244
- auto-migrates dependent entries (see `migrationWarnings` on the
245
- update payload).
315
+ A reusable schema that sets which fields a content entry can hold. Changing its schema migrates
316
+ the data of its entries.
246
317
  """
247
318
  type ContentModel {
248
- """Unique Content Model identifier."""
319
+ """The ID of the model."""
249
320
  id: ID!
250
- """The workspace this Content Model belongs to."""
321
+ """The workspace that holds the model."""
251
322
  workspace: Workspace!
252
323
  """
253
- Category — determines where this Model surfaces in the dashboard. Null for a general-purpose Content Model with no layout role.
324
+ The role of the model. Null for general content, which has no layout role.
254
325
  """
255
326
  category: ContentModelCategory
256
- """Display name."""
327
+ """The name of the model."""
257
328
  name: String!
258
- """Optional human-readable description."""
329
+ """The description of the model. Null when it has none."""
259
330
  description: String
260
- """Stable, human-readable key for SDK consumers."""
331
+ """The stable identifier of the model. It cannot change."""
261
332
  key: String!
262
- """The typed schema describing the entries' shape."""
333
+ """The fields that the model's entries hold."""
263
334
  schema: ContentSchema!
264
- """Content Entries that instantiate this Content Model."""
335
+ """The content entries of the model."""
265
336
  contentEntries(first: Int, after: String, last: Int, before: String): ContentEntryConnection!
266
- """When this Content Model was created."""
337
+ """When the model was created."""
267
338
  createdAt: DateTime!
268
- """When this Content Model was last updated."""
339
+ """When the model last changed."""
269
340
  updatedAt: DateTime!
270
341
  }
271
342
  ```
@@ -273,11 +344,11 @@ type ContentModel {
273
344
  ### `ContentModelEdge`
274
345
 
275
346
  ```graphql
276
- """Edge type for `ContentModelConnection`."""
347
+ """A model in a page of results."""
277
348
  type ContentModelEdge {
278
- """Pagination cursor for this edge."""
349
+ """The cursor of this edge."""
279
350
  cursor: String!
280
- """The Content Model."""
351
+ """The model."""
281
352
  node: ContentModel!
282
353
  }
283
354
  ```
@@ -285,17 +356,17 @@ type ContentModelEdge {
285
356
  ### `ContentModelConnection`
286
357
 
287
358
  ```graphql
288
- """
289
- Relay-style connection of Content Models, with both an `edges` list and a flat `nodes` accessor.
290
- """
359
+ """A page of models."""
291
360
  type ContentModelConnection {
292
- """List of Content Model edges."""
361
+ """The edges in this page."""
293
362
  edges: [ContentModelEdge!]!
294
- """Flat list of Content Models, equivalent to `edges[].node`."""
363
+ """The models in this page."""
295
364
  nodes: [ContentModel!]!
296
- """Pagination metadata."""
365
+ """Where this page sits in the list."""
297
366
  pageInfo: PageInfo!
298
- """Total number of Content Models."""
367
+ """
368
+ The number of models that match `category`. `search` does not narrow it.
369
+ """
299
370
  totalCount: Int!
300
371
  }
301
372
  ```
@@ -304,34 +375,30 @@ type ContentModelConnection {
304
375
 
305
376
  ```graphql
306
377
  """
307
- A workspace-scoped CMS Content Block — an embeddable schema fragment for
308
- use inside Content Models.
309
-
310
- WARNING: Unlike Content Models, changing a Content Block's schema does
311
- NOT auto-migrate dependent Content Entries that embed it. Run
312
- `workspaceContentEntryValidation` as a pre-publish sanity gate after
313
- modifying a Content Block schema.
378
+ A reusable schema fragment that you put inside one or more models. Changing its schema does not
379
+ migrate the content entries that embed it; `workspaceContentEntryValidation` finds the entries
380
+ that do not match.
314
381
  """
315
382
  type ContentBlock {
316
- """Unique Content Block identifier."""
383
+ """The ID of the block."""
317
384
  id: ID!
318
- """The workspace this Content Block belongs to."""
385
+ """The workspace that holds the block."""
319
386
  workspace: Workspace!
320
387
  """
321
- Category — restricts which Content Models / Blocks may embed instances of this Block. Null for a general-purpose Content Block with no layout role, which only a `ContentBlockFieldDefinition` that itself sets no category may embed.
388
+ The role of the block. Null for general content, which has no layout role.
322
389
  """
323
390
  category: ContentBlockCategory
324
- """Display name."""
391
+ """The name of the block."""
325
392
  name: String!
326
- """Optional human-readable description."""
393
+ """The description of the block. Null when it has none."""
327
394
  description: String
328
- """Stable, human-readable key for SDK consumers."""
395
+ """The stable identifier of the block. It cannot change."""
329
396
  key: String!
330
- """The typed schema describing block instances' shape."""
397
+ """The fields that each instance of the block holds."""
331
398
  schema: ContentSchema!
332
- """When this Content Block was created."""
399
+ """When the block was created."""
333
400
  createdAt: DateTime!
334
- """When this Content Block was last updated."""
401
+ """When the block last changed."""
335
402
  updatedAt: DateTime!
336
403
  }
337
404
  ```
@@ -339,11 +406,11 @@ type ContentBlock {
339
406
  ### `ContentBlockEdge`
340
407
 
341
408
  ```graphql
342
- """Edge type for `ContentBlockConnection`."""
409
+ """A block in a page of results."""
343
410
  type ContentBlockEdge {
344
- """Pagination cursor for this edge."""
411
+ """The cursor of this edge."""
345
412
  cursor: String!
346
- """The Content Block."""
413
+ """The block."""
347
414
  node: ContentBlock!
348
415
  }
349
416
  ```
@@ -351,17 +418,17 @@ type ContentBlockEdge {
351
418
  ### `ContentBlockConnection`
352
419
 
353
420
  ```graphql
354
- """
355
- Relay-style connection of Content Blocks, with both an `edges` list and a flat `nodes` accessor.
356
- """
421
+ """A page of blocks."""
357
422
  type ContentBlockConnection {
358
- """List of Content Block edges."""
423
+ """The edges in this page."""
359
424
  edges: [ContentBlockEdge!]!
360
- """Flat list of Content Blocks, equivalent to `edges[].node`."""
425
+ """The blocks in this page."""
361
426
  nodes: [ContentBlock!]!
362
- """Pagination metadata."""
427
+ """Where this page sits in the list."""
363
428
  pageInfo: PageInfo!
364
- """Total number of Content Blocks."""
429
+ """
430
+ The number of blocks that match `category`. `search` does not narrow it.
431
+ """
365
432
  totalCount: Int!
366
433
  }
367
434
  ```
@@ -369,30 +436,24 @@ type ContentBlockConnection {
369
436
  ### `ContentEntry`
370
437
 
371
438
  ```graphql
372
- """
373
- A workspace-scoped CMS Content Entry — an instance of a parent Content
374
- Model's schema. The `data` field is strongly typed: a single codec
375
- encodes / decodes the underlying `jsonb` column against the parent
376
- schema.
377
- """
439
+ """One instance of a model, filled with real values."""
378
440
  type ContentEntry {
379
- """Unique Content Entry identifier."""
441
+ """The ID of the content entry."""
380
442
  id: ID!
381
- """The workspace this Content Entry belongs to."""
443
+ """The workspace that holds the content entry."""
382
444
  workspace: Workspace!
383
- """Parent Content Model — defines the schema this entry conforms to."""
445
+ """The model that the content entry is an instance of."""
384
446
  contentModel: ContentModel!
385
447
  """
386
- Server-derived display name: the value of the first populated
387
- single-line-text field in the parent schema, falling back to the entry
388
- `id` when none is present.
448
+ The name that the entries list shows: the first filled single-line text field, or `Untitled`
449
+ when there is none.
389
450
  """
390
451
  title: String!
391
- """The entry's data, structurally typed against the parent schema."""
452
+ """The values of the content entry, typed by its model's schema."""
392
453
  data: ContentEntryData!
393
- """When this Content Entry was created."""
454
+ """When the content entry was created."""
394
455
  createdAt: DateTime!
395
- """When this Content Entry was last updated."""
456
+ """When the content entry last changed."""
396
457
  updatedAt: DateTime!
397
458
  }
398
459
  ```
@@ -400,11 +461,11 @@ type ContentEntry {
400
461
  ### `ContentEntryEdge`
401
462
 
402
463
  ```graphql
403
- """Edge type for `ContentEntryConnection`."""
464
+ """A content entry in a page of results."""
404
465
  type ContentEntryEdge {
405
- """Pagination cursor for this edge."""
466
+ """The cursor of this edge."""
406
467
  cursor: String!
407
- """The Content Entry."""
468
+ """The content entry."""
408
469
  node: ContentEntry!
409
470
  }
410
471
  ```
@@ -412,17 +473,15 @@ type ContentEntryEdge {
412
473
  ### `ContentEntryConnection`
413
474
 
414
475
  ```graphql
415
- """
416
- Relay-style connection of Content Entries, with both an `edges` list and a flat `nodes` accessor.
417
- """
476
+ """A page of content entries."""
418
477
  type ContentEntryConnection {
419
- """List of Content Entry edges."""
478
+ """The edges in this page."""
420
479
  edges: [ContentEntryEdge!]!
421
- """Flat list of Content Entries, equivalent to `edges[].node`."""
480
+ """The content entries in this page."""
422
481
  nodes: [ContentEntry!]!
423
- """Pagination metadata."""
482
+ """Where this page sits in the list."""
424
483
  pageInfo: PageInfo!
425
- """Total number of Content Entries."""
484
+ """The number of content entries that match the filters."""
426
485
  totalCount: Int!
427
486
  }
428
487
  ```
@@ -431,53 +490,45 @@ type ContentEntryConnection {
431
490
 
432
491
  ```graphql
433
492
  """
434
- A project-scoped binary asset (image, video, document) stored in the
435
- `cms-assets` Supabase Storage bucket.
436
-
437
- Lifecycle: `assetUploadInit` reserves an id and returns a pre-signed
438
- PUT URL; the dashboard uploads directly to storage; `assetCommit`
439
- finalises the row with `sizeBytes`, `mimeType`, and (for images)
440
- `width` / `height`. Soft-delete via `assetDelete` — the underlying
441
- object is removed best-effort.
493
+ A file that your content points at: an image, a video, a document, or HTML. It belongs to a
494
+ project, and each upload of new bytes makes or replaces an asset version.
442
495
  """
443
496
  type Asset {
444
- """Unique Asset identifier. Stable across versions."""
497
+ """The ID of the asset."""
445
498
  id: ID!
446
- """The project this Asset belongs to."""
499
+ """The project that holds the asset."""
447
500
  project: Project!
448
- """Original file name supplied at upload time."""
501
+ """The file name given at upload."""
449
502
  fileName: String!
450
503
  """
451
- The Workbench that owns this Asset, when it was authored/uploaded into one. Null for project-level assets.
504
+ The workbench that owns the asset. Null for an asset in the project's asset library.
452
505
  """
453
506
  owner: AssetOwner
454
- """MIME type, resolved from the current version."""
507
+ """The MIME type of the current version."""
455
508
  mimeType: String!
456
- """File size in bytes, resolved from the current version."""
509
+ """The size of the current version, in bytes."""
457
510
  sizeBytes: Int!
458
511
  """
459
- Intrinsic image width in pixels, resolved from the current version — populated only for image MIME types.
512
+ The width of the current version, in pixels. Null when it is not an image.
460
513
  """
461
514
  width: Int
462
515
  """
463
- Intrinsic image height in pixels, resolved from the current version — populated only for image MIME types.
516
+ The height of the current version, in pixels. Null when it is not an image.
464
517
  """
465
518
  height: Int
466
519
  """
467
- The path inside the `cms-assets` bucket for the current version: `cms-assets/<project>/<asset>/<version>/<file_name>`.
520
+ The storage path of the current version: `<project>/<asset>/<version>/<file name>`.
468
521
  """
469
522
  storagePath: String!
470
- """
471
- The proxy URL the dashboard / SDK can use to fetch the current version's binary.
472
- """
523
+ """The public URL of the current version's file."""
473
524
  url: String!
474
525
  """
475
- The version currently serving this Asset's byte-shaped fields (`url`, `mimeType`, `sizeBytes`, `width`, `height`).
526
+ The version whose bytes `url`, `mimeType`, `sizeBytes`, `width` and `height` describe.
476
527
  """
477
528
  currentVersion: AssetVersion!
478
- """Every version of this Asset, oldest first."""
529
+ """Every version of the asset, oldest first."""
479
530
  versions: [AssetVersion!]!
480
- """When this Asset was created (i.e. when `assetCommit` completed)."""
531
+ """When the asset was created."""
481
532
  createdAt: DateTime!
482
533
  }
483
534
  ```
@@ -486,37 +537,30 @@ type Asset {
486
537
 
487
538
  ```graphql
488
539
  """
489
- A single byte-state of an Asset. Immutable versions (flagged at publish) are
490
- never overwritten — the next edit forks a new version instead of reusing it.
540
+ One file that somebody uploaded for an asset. Once a publish uses a version, the version never
541
+ changes, and the next upload makes a new version.
491
542
  """
492
543
  type AssetVersion {
493
- """Unique AssetVersion identifier."""
544
+ """The ID of the asset version."""
494
545
  id: ID!
495
- """MIME type captured at commit time."""
546
+ """The MIME type of the file."""
496
547
  mimeType: String!
497
- """File size in bytes."""
548
+ """The size of the file, in bytes."""
498
549
  sizeBytes: Int!
499
- """Intrinsic image width in pixels — populated only for image MIME types."""
550
+ """The width of the file, in pixels. Null when it is not an image."""
500
551
  width: Int
501
- """
502
- Intrinsic image height in pixels — populated only for image MIME types.
503
- """
552
+ """The height of the file, in pixels. Null when it is not an image."""
504
553
  height: Int
505
- """
506
- True once this version has been referenced by a publish — never overwritten again.
507
- """
554
+ """Whether a publish uses the version, so that it never changes."""
508
555
  isImmutable: Boolean!
509
556
  """
510
- Lowercase hex SHA-256 of this version's stored bytes, computed by the server
511
- during `assetCommit`. Null for versions committed before content hashing, and
512
- while an upload that overwrites this version in place is not yet committed.
557
+ The lowercase hex SHA-256 of the stored bytes. Null when no hash was recorded, and while an
558
+ upload that replaces this version is not committed.
513
559
  """
514
560
  sha256: String
515
- """
516
- The proxy URL the dashboard / SDK can use to fetch this version's binary.
517
- """
561
+ """The public URL of the version's file."""
518
562
  url: String!
519
- """When this version was created."""
563
+ """When the version was created."""
520
564
  createdAt: DateTime!
521
565
  }
522
566
  ```
@@ -524,11 +568,11 @@ type AssetVersion {
524
568
  ### `AssetOwner`
525
569
 
526
570
  ```graphql
527
- """Identifies the Workbench that owns an Asset."""
571
+ """The workbench that owns an asset."""
528
572
  type AssetOwner {
529
- """The owner kind, currently always `"workbench"`."""
573
+ """The kind of owner. Always `"workbench"`."""
530
574
  type: String!
531
- """The owning Workbench id."""
575
+ """The ID of the workbench."""
532
576
  id: String!
533
577
  }
534
578
  ```
@@ -536,11 +580,11 @@ type AssetOwner {
536
580
  ### `AssetEdge`
537
581
 
538
582
  ```graphql
539
- """Edge type for `AssetConnection`."""
583
+ """An asset in a page of results."""
540
584
  type AssetEdge {
541
- """Pagination cursor for this edge."""
585
+ """The cursor of this edge."""
542
586
  cursor: String!
543
- """The Asset."""
587
+ """The asset."""
544
588
  node: Asset!
545
589
  }
546
590
  ```
@@ -548,17 +592,15 @@ type AssetEdge {
548
592
  ### `AssetConnection`
549
593
 
550
594
  ```graphql
551
- """
552
- Relay-style connection of Assets, with both an `edges` list and a flat `nodes` accessor.
553
- """
595
+ """A page of assets."""
554
596
  type AssetConnection {
555
- """List of Asset edges."""
597
+ """The edges in this page."""
556
598
  edges: [AssetEdge!]!
557
- """Flat list of Assets, equivalent to `edges[].node`."""
599
+ """The assets in this page."""
558
600
  nodes: [Asset!]!
559
- """Pagination metadata."""
601
+ """Where this page sits in the list."""
560
602
  pageInfo: PageInfo!
561
- """Total number of Assets."""
603
+ """The number of assets that match the filters."""
562
604
  totalCount: Int!
563
605
  }
564
606
  ```
@@ -567,19 +609,17 @@ type AssetConnection {
567
609
 
568
610
  ```graphql
569
611
  """
570
- A single Content-Entry-migration warning produced when a parent Content
571
- Model's schema changes and dependent entries' data needed to be
572
- auto-coerced or dropped.
612
+ A change that a model schema update made to the data of one content entry.
573
613
  """
574
614
  type MigrationWarning {
575
- """The Content Entry whose data was affected."""
615
+ """The ID of the content entry whose data changed."""
576
616
  contentEntryId: ID!
577
- """JSON-Pointer-style path into the entry data (e.g. `$.title`)."""
617
+ """The path of the field in the entry data, such as `$.title`."""
578
618
  fieldPath: String!
579
- """Kind of warning."""
619
+ """What happened to the value."""
580
620
  warningType: MigrationWarningType!
581
621
  """
582
- Stringified previous value, when applicable (truncated for large blobs).
622
+ The value before the change, cut to 80 characters. Null when the value was null.
583
623
  """
584
624
  oldValue: String
585
625
  }
@@ -589,24 +629,17 @@ type MigrationWarning {
589
629
 
590
630
  ```graphql
591
631
  """
592
- Result of validating every Content Entry in a workspace against its
593
- parent Content Model schema (recursively walking embedded Content Block
594
- instances).
595
-
596
- Useful as a pre-publish sanity gate, especially after a Content Block
597
- schema change (which does NOT auto-migrate dependent Content Entries
598
- the way Content Model schema changes do).
632
+ The result of `workspaceContentEntryValidation`. It checks each content entry against its model's
633
+ schema, including embedded blocks.
599
634
  """
600
635
  type WorkspaceContentEntryValidationPayload {
601
- """Total Content Entry rows visited."""
636
+ """The number of content entries checked."""
602
637
  totalCount: Int!
603
- """Rows whose `data` blob conforms cleanly to its Content Model schema."""
638
+ """The number of content entries that match their schema."""
604
639
  validCount: Int!
605
- """Rows with at least one validation error."""
640
+ """The number of content entries with at least one validation error."""
606
641
  invalidCount: Int!
607
- """
608
- Per-Content-Entry outcomes, in DB-order (matches `contentEntries` query ordering).
609
- """
642
+ """The outcome for each content entry, oldest first."""
610
643
  outcomes: [ContentEntryValidationOutcome!]!
611
644
  }
612
645
  ```
@@ -614,31 +647,23 @@ type WorkspaceContentEntryValidationPayload {
614
647
  ### `ContentEntryValidationOutcome`
615
648
 
616
649
  ```graphql
617
- """A single Content Entry's validation outcome."""
650
+ """The validation outcome of one content entry."""
618
651
  type ContentEntryValidationOutcome {
619
- """
620
- Identifier for the Content Entry — always present, even when `contentEntry` is null due to a soft-delete race.
621
- """
652
+ """The ID of the content entry."""
622
653
  contentEntryId: ID!
623
- """
624
- Identifier for the parent Content Model — always present, even when `contentModel` is null due to a soft-delete race.
625
- """
654
+ """The ID of the content entry's model."""
626
655
  contentModelId: ID!
627
- """
628
- The Content Entry that was validated. Null if it was concurrently soft-deleted.
629
- """
656
+ """The content entry. Null when it was deleted during the check."""
630
657
  contentEntry: ContentEntry
631
- """The parent Content Model. Null if it was concurrently soft-deleted."""
658
+ """The content entry's model. Null when it was deleted during the check."""
632
659
  contentModel: ContentModel
633
660
  """
634
- Snapshot of the parent Content Model name at validation time — non-null even if the parent was concurrently soft-deleted.
661
+ The name of the model at the time of the check, or `(unknown)` when the model is missing.
635
662
  """
636
663
  contentModelName: String!
637
- """
638
- Whether the Content Entry data conforms to the parent Content Model schema.
639
- """
664
+ """Whether the content entry matches its model's schema."""
640
665
  valid: Boolean!
641
- """Per-field validation errors. Empty when `valid` is true."""
666
+ """The validation errors. Empty when `valid` is true."""
642
667
  errors: [ContentEntryValidationError!]!
643
668
  }
644
669
  ```
@@ -646,15 +671,13 @@ type ContentEntryValidationOutcome {
646
671
  ### `ContentEntryValidationError`
647
672
 
648
673
  ```graphql
649
- """
650
- A single Content Entry validation error pinned to a path inside the `data` blob.
651
- """
674
+ """A report that one field in a content entry does not match its schema."""
652
675
  type ContentEntryValidationError {
653
676
  """
654
- JSON-Pointer-style path inside the Content Entry data, e.g. `$.title` or `$.sections[0].headline`.
677
+ The path of the field in the entry data, such as `$.sections[0].headline`.
655
678
  """
656
679
  path: String!
657
- """Human-readable error message."""
680
+ """A human-readable description of the error."""
658
681
  message: String!
659
682
  }
660
683
  ```
@@ -662,21 +685,21 @@ type ContentEntryValidationError {
662
685
  ### `ContentModelCreateInput`
663
686
 
664
687
  ```graphql
665
- """Input for `contentModelCreate`."""
688
+ """The input of `contentModelCreate`."""
666
689
  input ContentModelCreateInput {
667
- """Workspace ID to create the Content Model in."""
690
+ """The ID of the workspace to create the model in."""
668
691
  workspaceId: ID!
669
692
  """
670
- Category — determines where the Model surfaces in the dashboard. Omit for a general-purpose Content Model with no layout role.
693
+ The role of the model. Omit it for general content. It cannot change later.
671
694
  """
672
695
  category: ContentModelCategory
673
- """Display name."""
696
+ """The name of the model. It must not be blank."""
674
697
  name: String!
675
- """Optional human-readable description."""
698
+ """The description of the model."""
676
699
  description: String
677
- """Stable, human-readable key for SDK consumers."""
700
+ """The stable identifier of the model. It cannot change later."""
678
701
  key: String!
679
- """Initial schema."""
702
+ """The fields that the model's entries hold."""
680
703
  schema: ContentSchemaInput!
681
704
  }
682
705
  ```
@@ -684,9 +707,9 @@ input ContentModelCreateInput {
684
707
  ### `ContentModelCreatePayload`
685
708
 
686
709
  ```graphql
687
- """Payload returned by `contentModelCreate`."""
710
+ """The result of `contentModelCreate`."""
688
711
  type ContentModelCreatePayload {
689
- """The created Content Model."""
712
+ """The created model."""
690
713
  contentModel: ContentModel
691
714
  }
692
715
  ```
@@ -694,17 +717,15 @@ type ContentModelCreatePayload {
694
717
  ### `ContentModelUpdateInput`
695
718
 
696
719
  ```graphql
697
- """Input for `contentModelUpdate`. Omit a field to leave it unchanged."""
720
+ """The input of `contentModelUpdate`. Omit a field to keep its value."""
698
721
  input ContentModelUpdateInput {
699
- """Content Model ID."""
722
+ """The ID of the model. Required."""
700
723
  id: ID!
701
- """New display name."""
724
+ """The new name. It must not be blank."""
702
725
  name: String
703
- """New description. Omit to leave unchanged."""
726
+ """The new description."""
704
727
  description: String
705
- """
706
- New schema. Schema changes auto-migrate dependent Content Entries; affected paths are returned in `migrationWarnings`.
707
- """
728
+ """The new schema. The data of the model's entries migrates to it."""
708
729
  schema: ContentSchemaInput
709
730
  }
710
731
  ```
@@ -712,16 +733,12 @@ input ContentModelUpdateInput {
712
733
  ### `ContentModelUpdatePayload`
713
734
 
714
735
  ```graphql
715
- """
716
- Payload returned by `contentModelUpdate`. `migrationWarnings` lists
717
- every per-Content-Entry coercion or field-removal performed when the
718
- schema change required it.
719
- """
736
+ """The result of `contentModelUpdate`."""
720
737
  type ContentModelUpdatePayload {
721
- """The updated Content Model."""
738
+ """The updated model."""
722
739
  contentModel: ContentModel
723
740
  """
724
- Per-Content-Entry warnings emitted when the schema change dropped or coerced fields.
741
+ The values that the schema change removed from content entries. Empty when none.
725
742
  """
726
743
  migrationWarnings: [MigrationWarning!]!
727
744
  }
@@ -730,11 +747,9 @@ type ContentModelUpdatePayload {
730
747
  ### `ContentModelDeleteInput`
731
748
 
732
749
  ```graphql
733
- """
734
- Input for `contentModelDelete`. Refused if dependent Content Entry rows still exist.
735
- """
750
+ """The input of `contentModelDelete`."""
736
751
  input ContentModelDeleteInput {
737
- """Content Model ID."""
752
+ """The ID of the model."""
738
753
  id: ID!
739
754
  }
740
755
  ```
@@ -742,9 +757,9 @@ input ContentModelDeleteInput {
742
757
  ### `ContentModelDeletePayload`
743
758
 
744
759
  ```graphql
745
- """Payload returned by `contentModelDelete`."""
760
+ """The result of `contentModelDelete`."""
746
761
  type ContentModelDeletePayload {
747
- """ID of the deleted Content Model."""
762
+ """The ID of the deleted model."""
748
763
  contentModelId: ID
749
764
  }
750
765
  ```
@@ -752,21 +767,21 @@ type ContentModelDeletePayload {
752
767
  ### `ContentBlockCreateInput`
753
768
 
754
769
  ```graphql
755
- """Input for `contentBlockCreate`."""
770
+ """The input of `contentBlockCreate`."""
756
771
  input ContentBlockCreateInput {
757
- """Workspace ID to create the Content Block in."""
772
+ """The ID of the workspace to create the block in."""
758
773
  workspaceId: ID!
759
774
  """
760
- Category — restricts where instances of this Block may be embedded. Omit for a general-purpose Content Block with no layout role.
775
+ The role of the block. Omit it for general content. It cannot change later.
761
776
  """
762
777
  category: ContentBlockCategory
763
- """Display name."""
778
+ """The name of the block. It must not be blank."""
764
779
  name: String!
765
- """Optional human-readable description."""
780
+ """The description of the block."""
766
781
  description: String
767
- """Stable, human-readable key for SDK consumers."""
782
+ """The stable identifier of the block. It cannot change later."""
768
783
  key: String!
769
- """Initial schema."""
784
+ """The fields that each instance of the block holds."""
770
785
  schema: ContentSchemaInput!
771
786
  }
772
787
  ```
@@ -774,9 +789,9 @@ input ContentBlockCreateInput {
774
789
  ### `ContentBlockCreatePayload`
775
790
 
776
791
  ```graphql
777
- """Payload returned by `contentBlockCreate`."""
792
+ """The result of `contentBlockCreate`."""
778
793
  type ContentBlockCreatePayload {
779
- """The created Content Block."""
794
+ """The created block."""
780
795
  contentBlock: ContentBlock
781
796
  }
782
797
  ```
@@ -784,16 +799,16 @@ type ContentBlockCreatePayload {
784
799
  ### `ContentBlockUpdateInput`
785
800
 
786
801
  ```graphql
787
- """Input for `contentBlockUpdate`. Omit a field to leave it unchanged."""
802
+ """The input of `contentBlockUpdate`. Omit a field to keep its value."""
788
803
  input ContentBlockUpdateInput {
789
- """Content Block ID."""
804
+ """The ID of the block. Required."""
790
805
  id: ID!
791
- """New display name."""
806
+ """The new name. It must not be blank."""
792
807
  name: String
793
- """New description. Omit to leave unchanged."""
808
+ """The new description."""
794
809
  description: String
795
810
  """
796
- New schema. WARNING: changing a Block schema does NOT auto-migrate dependent Content Entries — run `workspaceContentEntryValidation` to find drift.
811
+ The new schema. The data of content entries that embed the block does not migrate.
797
812
  """
798
813
  schema: ContentSchemaInput
799
814
  }
@@ -802,9 +817,9 @@ input ContentBlockUpdateInput {
802
817
  ### `ContentBlockUpdatePayload`
803
818
 
804
819
  ```graphql
805
- """Payload returned by `contentBlockUpdate`."""
820
+ """The result of `contentBlockUpdate`."""
806
821
  type ContentBlockUpdatePayload {
807
- """The updated Content Block."""
822
+ """The updated block."""
808
823
  contentBlock: ContentBlock
809
824
  }
810
825
  ```
@@ -812,9 +827,9 @@ type ContentBlockUpdatePayload {
812
827
  ### `ContentBlockDeleteInput`
813
828
 
814
829
  ```graphql
815
- """Input for `contentBlockDelete`."""
830
+ """The input of `contentBlockDelete`."""
816
831
  input ContentBlockDeleteInput {
817
- """Content Block ID."""
832
+ """The ID of the block."""
818
833
  id: ID!
819
834
  }
820
835
  ```
@@ -822,9 +837,9 @@ input ContentBlockDeleteInput {
822
837
  ### `ContentBlockDeletePayload`
823
838
 
824
839
  ```graphql
825
- """Payload returned by `contentBlockDelete`."""
840
+ """The result of `contentBlockDelete`."""
826
841
  type ContentBlockDeletePayload {
827
- """ID of the deleted Content Block."""
842
+ """The ID of the deleted block."""
828
843
  contentBlockId: ID
829
844
  }
830
845
  ```
@@ -832,13 +847,14 @@ type ContentBlockDeletePayload {
832
847
  ### `ContentEntryCreateInput`
833
848
 
834
849
  ```graphql
835
- """Input for `contentEntryCreate`."""
850
+ """The input of `contentEntryCreate`."""
836
851
  input ContentEntryCreateInput {
852
+ """The ID of the model whose schema the data must match."""
853
+ contentModelId: ID!
837
854
  """
838
- Parent Content Model id — the entry's data must conform to this Model's schema.
855
+ The values of the content entry. Empty data makes an empty entry; data with any value must hold
856
+ every required field.
839
857
  """
840
- contentModelId: ID!
841
- """The entry's data, structurally typed against the parent schema."""
842
858
  data: ContentEntryDataInput!
843
859
  }
844
860
  ```
@@ -846,9 +862,9 @@ input ContentEntryCreateInput {
846
862
  ### `ContentEntryCreatePayload`
847
863
 
848
864
  ```graphql
849
- """Payload returned by `contentEntryCreate`."""
865
+ """The result of `contentEntryCreate`."""
850
866
  type ContentEntryCreatePayload {
851
- """The created Content Entry."""
867
+ """The created content entry."""
852
868
  contentEntry: ContentEntry
853
869
  }
854
870
  ```
@@ -856,13 +872,14 @@ type ContentEntryCreatePayload {
856
872
  ### `ContentEntryUpdateInput`
857
873
 
858
874
  ```graphql
859
- """
860
- Input for `contentEntryUpdate`. The entire `data` blob is replaced; partial updates are not supported.
861
- """
875
+ """The input of `contentEntryUpdate`. Every field is required."""
862
876
  input ContentEntryUpdateInput {
863
- """Content Entry ID."""
877
+ """The ID of the content entry."""
864
878
  id: ID!
865
- """New entry data — must conform to the parent Content Model's schema."""
879
+ """
880
+ The new values of the content entry. They replace all of its data and must hold every required
881
+ field.
882
+ """
866
883
  data: ContentEntryDataInput!
867
884
  }
868
885
  ```
@@ -870,9 +887,9 @@ input ContentEntryUpdateInput {
870
887
  ### `ContentEntryUpdatePayload`
871
888
 
872
889
  ```graphql
873
- """Payload returned by `contentEntryUpdate`."""
890
+ """The result of `contentEntryUpdate`."""
874
891
  type ContentEntryUpdatePayload {
875
- """The updated Content Entry."""
892
+ """The updated content entry."""
876
893
  contentEntry: ContentEntry
877
894
  }
878
895
  ```
@@ -880,9 +897,9 @@ type ContentEntryUpdatePayload {
880
897
  ### `ContentEntryDeleteInput`
881
898
 
882
899
  ```graphql
883
- """Input for `contentEntryDelete`. Refused if a Step references it."""
900
+ """The input of `contentEntryDelete`."""
884
901
  input ContentEntryDeleteInput {
885
- """Content Entry ID."""
902
+ """The ID of the content entry."""
886
903
  id: ID!
887
904
  }
888
905
  ```
@@ -890,9 +907,9 @@ input ContentEntryDeleteInput {
890
907
  ### `ContentEntryDeletePayload`
891
908
 
892
909
  ```graphql
893
- """Payload returned by `contentEntryDelete`."""
910
+ """The result of `contentEntryDelete`."""
894
911
  type ContentEntryDeletePayload {
895
- """ID of the deleted Content Entry."""
912
+ """The ID of the deleted content entry."""
896
913
  contentEntryId: ID
897
914
  }
898
915
  ```
@@ -901,43 +918,35 @@ type ContentEntryDeletePayload {
901
918
 
902
919
  ```graphql
903
920
  """
904
- Input for `assetUploadInit` — reserve an Asset id and obtain a pre-signed PUT
905
- URL. Passing `assetId` targets an existing Asset for a new write: the write
906
- overwrites the current version in place while it is mutable, or forks a new
907
- version once the current version has been published (copy-on-write).
908
-
909
- Passing `sha256` on a new project-level upload (no `assetId`, no `workbenchId`)
910
- deduplicates it: when a non-deleted, project-level (not Workbench-owned) Asset
911
- in the same project already has a version with those bytes, the payload returns that Asset and version with
912
- `deduplicated: true` and no `uploadUrl`, and there is nothing to upload or
913
- commit.
921
+ The input of `assetUploadInit`. With `assetId`, the upload replaces the current version while no
922
+ publish uses it, and makes a new version once one does.
914
923
  """
915
924
  input AssetUploadInitInput {
916
- """Project to upload the Asset into."""
925
+ """The ID of the project to upload the asset into."""
917
926
  projectId: ID!
918
927
  """
919
- Original file name. Stored verbatim — used for display and in the storage path.
928
+ The file name. It must not contain `/` or `\`. Ignored when `path` is given.
920
929
  """
921
930
  fileName: String!
922
- """
923
- MIME type the dashboard expects to upload. Must match the uploaded bytes' content-type.
924
- """
931
+ """The MIME type of the bytes to upload."""
925
932
  contentType: String!
926
933
  """
927
- Targets an existing Asset for a new write (overwrite or fork). Omit to create a new Asset.
934
+ The ID of an existing asset to upload new bytes for. Omit it to create an asset.
928
935
  """
929
936
  assetId: ID
930
- """The Workbench this upload belongs to."""
937
+ """
938
+ The ID of the workbench the upload belongs to. It must be in the same project.
939
+ """
931
940
  workbenchId: ID
932
941
  """
933
- Logical path within the Workbench (for example `drafts/outline-v1.md`).
934
- When given, the server derives `fileName` from the segment after the last `/`.
942
+ The path of the file in the workbench, such as `drafts/outline-v1.md`. The file name is the part
943
+ after the last `/`.
935
944
  """
936
945
  path: String
937
946
  """
938
- Hex SHA-256 of the bytes the client will upload (64 characters, either case).
939
- Enables deduplication for new project-level uploads. Pass the same value to
940
- `assetCommit`, which rejects bytes that hash differently.
947
+ The hex SHA-256 of the bytes to upload, 64 characters in either case. On a new upload with no
948
+ `assetId` and no `workbenchId`, an asset-library asset that already holds these bytes is
949
+ returned.
941
950
  """
942
951
  sha256: String
943
952
  }
@@ -947,32 +956,29 @@ input AssetUploadInitInput {
947
956
 
948
957
  ```graphql
949
958
  """
950
- Payload returned by `assetUploadInit`.
951
-
952
- When `deduplicated` is false, PUT the bytes to `uploadUrl` and then call
953
- `assetCommit` with `assetId`, `versionId` and `storagePath`. When it is true,
954
- `assetId` and `versionId` name an existing committed version whose bytes match
955
- the declared `sha256`; reference them directly, with no upload and no commit.
959
+ The result of `assetUploadInit`. When `deduplicated` is false, PUT the bytes to `uploadUrl`, then
960
+ call `assetCommit`; when it is true, the existing version holds the bytes and needs no upload or
961
+ commit.
956
962
  """
957
963
  type AssetUploadInitPayload {
958
964
  """
959
- Pre-signed PUT URL the client uploads to. Null when `deduplicated` is true.
965
+ The pre-signed URL to PUT the bytes to. Null when `deduplicated` is true.
960
966
  """
961
967
  uploadUrl: String
962
968
  """
963
- The asset id — pre-allocated for a new Asset, the `assetId` passed in for an existing one, or the Asset owning the matching version when deduplicated. The dashboard MUST pass this to `assetCommit` when it uploads.
969
+ The ID of the asset: a new ID, the `assetId` given, or the asset that holds matching bytes.
964
970
  """
965
971
  assetId: ID!
966
972
  """
967
- The version id this upload targets, or the matching existing version when deduplicated. The dashboard MUST pass this to `assetCommit` when it uploads.
973
+ The ID of the version that the upload writes, or of the existing version that matches.
968
974
  """
969
975
  versionId: ID!
970
976
  """
971
- Storage path the URL writes to (echoed back to the commit step), or the matching version's path when deduplicated.
977
+ The storage path that the upload writes to, or the path of the matching version.
972
978
  """
973
979
  storagePath: String!
974
980
  """
975
- True when the project already holds the declared bytes and nothing needs uploading.
981
+ Whether the project already holds the bytes, so nothing needs uploading.
976
982
  """
977
983
  deduplicated: Boolean!
978
984
  }
@@ -981,34 +987,29 @@ type AssetUploadInitPayload {
981
987
  ### `AssetCommitInput`
982
988
 
983
989
  ```graphql
984
- """
985
- Input for `assetCommit` — finalise an upload by recording `sizeBytes`, `mimeType`, and intrinsic dimensions.
986
- """
990
+ """The input of `assetCommit`."""
987
991
  input AssetCommitInput {
988
- """Project the Asset belongs to."""
992
+ """The ID of the project that holds the asset."""
989
993
  projectId: ID!
990
- """Asset id reserved by `assetUploadInit`."""
994
+ """The ID of the asset that `assetUploadInit` returned."""
991
995
  assetId: ID!
992
- """Version id reserved by `assetUploadInit`."""
996
+ """The ID of the version that `assetUploadInit` returned."""
993
997
  versionId: ID!
994
- """Original file name (matches the `assetUploadInit` value)."""
998
+ """The file name given to `assetUploadInit`."""
995
999
  fileName: String!
996
- """Storage path returned by `assetUploadInit`."""
1000
+ """The storage path that `assetUploadInit` returned."""
997
1001
  storagePath: String!
998
1002
  """
999
- The Workbench this upload belongs to. Recorded as the Asset's owner only when the Asset document is first created.
1003
+ The ID of the workbench the upload belongs to. It becomes the owner of a new asset only.
1000
1004
  """
1001
1005
  workbenchId: ID
1002
1006
  """
1003
- Logical path within the Workbench (for example `drafts/outline-v1.md`).
1004
- When given with `workbenchId`, stored on `workbench_assets.path`; `fileName` is
1005
- derived from the segment after the last `/` when omitted.
1007
+ The path of the file in the workbench, such as `drafts/outline-v1.md`. It applies only with
1008
+ `workbenchId`.
1006
1009
  """
1007
1010
  path: String
1008
1011
  """
1009
- Hex SHA-256 the client declared to `assetUploadInit`. When given, the commit
1010
- returns a `HASH_MISMATCH` user error, and records no version, if the stored
1011
- bytes hash to anything else.
1012
+ The hex SHA-256 given to `assetUploadInit`. Bytes that hash differently fail the commit.
1012
1013
  """
1013
1014
  sha256: String
1014
1015
  }
@@ -1017,13 +1018,11 @@ input AssetCommitInput {
1017
1018
  ### `AssetCommitPayload`
1018
1019
 
1019
1020
  ```graphql
1020
- """Payload returned by `assetCommit`."""
1021
+ """The result of `assetCommit`."""
1021
1022
  type AssetCommitPayload {
1022
- """
1023
- The committed Asset, now ready to be referenced from Content Entry data. Null when a `userError` was returned.
1024
- """
1023
+ """The committed asset. Null when the commit failed with a user error."""
1025
1024
  asset: Asset
1026
- """Errors that stopped the commit. Empty on success."""
1025
+ """The errors that stopped the commit. Empty on success."""
1027
1026
  userErrors: [AssetCommitUserError!]!
1028
1027
  }
1029
1028
  ```
@@ -1031,9 +1030,9 @@ type AssetCommitPayload {
1031
1030
  ### `AssetCommitErrorCode`
1032
1031
 
1033
1032
  ```graphql
1034
- """Machine-readable error codes for `assetCommit`."""
1033
+ """The reason an `assetCommit` failed."""
1035
1034
  enum AssetCommitErrorCode {
1036
- """The stored bytes do not hash to the `sha256` given in the input."""
1035
+ """The stored bytes do not hash to the `sha256` in the input."""
1037
1036
  HASH_MISMATCH
1038
1037
  }
1039
1038
  ```
@@ -1041,13 +1040,15 @@ enum AssetCommitErrorCode {
1041
1040
  ### `AssetCommitUserError`
1042
1041
 
1043
1042
  ```graphql
1044
- """User-facing error for `assetCommit`."""
1043
+ """An error that stopped an `assetCommit`."""
1045
1044
  type AssetCommitUserError {
1046
- """Path to the offending input field, if applicable."""
1045
+ """
1046
+ The path to the input field that caused the error. Null when no field did.
1047
+ """
1047
1048
  field: [String!]
1048
- """Human-readable error message."""
1049
+ """A human-readable description of the error."""
1049
1050
  message: String!
1050
- """Machine-readable error code."""
1051
+ """The reason for the error."""
1051
1052
  code: AssetCommitErrorCode!
1052
1053
  }
1053
1054
  ```
@@ -1055,11 +1056,9 @@ type AssetCommitUserError {
1055
1056
  ### `AssetDeleteInput`
1056
1057
 
1057
1058
  ```graphql
1058
- """
1059
- Input for `assetDelete` — soft-deletes the Asset row. The underlying storage object is removed best-effort.
1060
- """
1059
+ """The input of `assetDelete`."""
1061
1060
  input AssetDeleteInput {
1062
- """Asset ID."""
1061
+ """The ID of the asset."""
1063
1062
  id: ID!
1064
1063
  }
1065
1064
  ```
@@ -1067,9 +1066,9 @@ input AssetDeleteInput {
1067
1066
  ### `AssetDeletePayload`
1068
1067
 
1069
1068
  ```graphql
1070
- """Payload returned by `assetDelete`."""
1069
+ """The result of `assetDelete`."""
1071
1070
  type AssetDeletePayload {
1072
- """ID of the deleted Asset."""
1071
+ """The ID of the deleted asset."""
1073
1072
  assetId: ID
1074
1073
  }
1075
1074
  ```
@@ -1077,15 +1076,13 @@ type AssetDeletePayload {
1077
1076
  ### `ContentBlockSortKeys`
1078
1077
 
1079
1078
  ```graphql
1080
- """
1081
- Sort keys for `contentBlocks(...)`. Pair with `reverse: true` to flip the order.
1082
- """
1079
+ """The order of `contentBlocks`."""
1083
1080
  enum ContentBlockSortKeys {
1084
- """Sort by `name` (alphabetical)."""
1081
+ """By name, A to Z."""
1085
1082
  NAME
1086
- """Sort by `createdAt`."""
1083
+ """By creation time, oldest first."""
1087
1084
  CREATED_AT
1088
- """Sort by `updatedAt`."""
1085
+ """By last change, oldest first."""
1089
1086
  UPDATED_AT
1090
1087
  }
1091
1088
  ```
@@ -1093,15 +1090,13 @@ enum ContentBlockSortKeys {
1093
1090
  ### `ContentModelSortKeys`
1094
1091
 
1095
1092
  ```graphql
1096
- """
1097
- Sort keys for `contentModels(...)`. Pair with `reverse: true` to flip the order.
1098
- """
1093
+ """The order of `contentModels`."""
1099
1094
  enum ContentModelSortKeys {
1100
- """Sort by `name` (alphabetical)."""
1095
+ """By name, A to Z."""
1101
1096
  NAME
1102
- """Sort by `createdAt`."""
1097
+ """By creation time, oldest first."""
1103
1098
  CREATED_AT
1104
- """Sort by `updatedAt`."""
1099
+ """By last change, oldest first."""
1105
1100
  UPDATED_AT
1106
1101
  }
1107
1102
  ```
@@ -1109,13 +1104,11 @@ enum ContentModelSortKeys {
1109
1104
  ### `ContentEntrySortKeys`
1110
1105
 
1111
1106
  ```graphql
1112
- """
1113
- Sort keys for `contentEntries(...)`. Entries have no name; pair with `reverse: true` to flip the order.
1114
- """
1107
+ """The order of `contentEntries`."""
1115
1108
  enum ContentEntrySortKeys {
1116
- """Sort by `createdAt`."""
1109
+ """By creation time, oldest first."""
1117
1110
  CREATED_AT
1118
- """Sort by `updatedAt`."""
1111
+ """By last change, oldest first."""
1119
1112
  UPDATED_AT
1120
1113
  }
1121
1114
  ```
@@ -1123,13 +1116,11 @@ enum ContentEntrySortKeys {
1123
1116
  ### `AssetSortKeys`
1124
1117
 
1125
1118
  ```graphql
1126
- """
1127
- Sort keys for `assets(...)`. Pair with `reverse: true` to flip the order.
1128
- """
1119
+ """The order of `assets`."""
1129
1120
  enum AssetSortKeys {
1130
- """Sort by `fileName` (alphabetical)."""
1121
+ """By file name, A to Z."""
1131
1122
  NAME
1132
- """Sort by `createdAt` (upload time)."""
1123
+ """By upload time, oldest first."""
1133
1124
  CREATED_AT
1134
1125
  }
1135
1126
  ```
@@ -1138,7 +1129,7 @@ enum AssetSortKeys {
1138
1129
 
1139
1130
  ```graphql
1140
1131
  """
1141
- A media-type bucket for browsing the asset library, matched against the current version's MIME type.
1132
+ A media type group of assets, matched against the MIME type of the current version.
1142
1133
  """
1143
1134
  enum AssetKind {
1144
1135
  """`image/*`."""
@@ -1147,9 +1138,9 @@ enum AssetKind {
1147
1138
  VIDEO
1148
1139
  """`audio/*`."""
1149
1140
  AUDIO
1150
- """Anything that is not an image, video, audio, or recognised archive."""
1141
+ """Any file that is not an image, video, audio or archive."""
1151
1142
  DOCUMENT
1152
- """A recognised archive type (zip, rar, gzip, 7z, tar)."""
1143
+ """An archive: zip, rar, gzip, 7z or tar."""
1153
1144
  ARCHIVE
1154
1145
  }
1155
1146
  ```