picked 0.0.101-next.2 → 0.0.101

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 (175) hide show
  1. package/README.md +27 -12
  2. package/docs/explanation/conditions-and-the-logic-engine.md +94 -0
  3. package/docs/explanation/content-references.md +99 -0
  4. package/docs/explanation/feature-flag-allocation.md +218 -0
  5. package/docs/explanation/how-picked-works.md +124 -0
  6. package/docs/explanation/how-pickedql-works.md +76 -0
  7. package/docs/explanation/pages-and-flows.md +64 -0
  8. package/docs/explanation/the-content-model.md +87 -0
  9. package/docs/explanation/the-two-apis.md +68 -0
  10. package/docs/explanation/why-server-side-rendering.md +76 -0
  11. package/docs/explanation/workspaces-and-versions.md +71 -0
  12. package/docs/how-to/add-a-step-field-or-action.md +56 -0
  13. package/docs/how-to/analytics/index.md +324 -0
  14. package/docs/how-to/archive-or-delete-a-workspace.md +59 -0
  15. package/docs/how-to/authenticate-the-cli.md +101 -0
  16. package/docs/how-to/authenticate-with-a-magic-link.md +56 -0
  17. package/docs/how-to/authenticate-with-a-password.md +68 -0
  18. package/docs/how-to/authenticate-with-an-api-key.md +60 -0
  19. package/docs/how-to/authenticate-with-oauth.md +49 -0
  20. package/docs/how-to/build-a-flow.md +106 -0
  21. package/docs/how-to/call-an-external-api-from-a-workflow.md +116 -0
  22. package/docs/how-to/connect-the-mcp-server.md +46 -0
  23. package/docs/how-to/create-a-content-entry.md +58 -0
  24. package/docs/how-to/create-a-project.md +40 -0
  25. package/docs/how-to/create-an-experience.md +51 -0
  26. package/docs/how-to/create-and-revoke-an-api-key.md +54 -0
  27. package/docs/how-to/debug-with-the-chrome-extension.md +57 -0
  28. package/docs/how-to/define-a-page-layout.md +54 -0
  29. package/docs/how-to/fill-and-publish-a-page.md +82 -0
  30. package/docs/how-to/install-the-gtm-template.md +84 -0
  31. package/docs/how-to/install-the-sdk.md +93 -0
  32. package/docs/how-to/install-the-vite-plugin.md +69 -0
  33. package/docs/how-to/invite-and-remove-members.md +45 -0
  34. package/docs/how-to/point-one-entry-at-another.md +75 -0
  35. package/docs/how-to/preview-a-workspace.md +39 -0
  36. package/docs/how-to/publish-a-workspace.md +42 -0
  37. package/docs/how-to/read-a-feature-flag.md +113 -0
  38. package/docs/how-to/read-a-referenced-entry.md +109 -0
  39. package/docs/how-to/register-a-component.md +55 -0
  40. package/docs/how-to/register-an-action-handler.md +85 -0
  41. package/docs/how-to/register-an-api-that-uses-oauth2.md +107 -0
  42. package/docs/how-to/render-a-step-form.md +131 -0
  43. package/docs/how-to/render-an-unpublished-preview.md +41 -0
  44. package/docs/how-to/retry-a-failed-call-with-a-loop.md +81 -0
  45. package/docs/how-to/reuse-a-section.md +64 -0
  46. package/docs/how-to/reuse-a-step-field-or-action.md +39 -0
  47. package/docs/how-to/roll-back-a-published-version.md +39 -0
  48. package/docs/how-to/run-an-ab-test.md +59 -0
  49. package/docs/how-to/run-code-on-a-form-submission.md +125 -0
  50. package/docs/how-to/server-render-a-page.md +81 -0
  51. package/docs/how-to/set-a-content-security-policy.md +32 -0
  52. package/docs/how-to/set-up-mfa.md +126 -0
  53. package/docs/how-to/switch-workspaces.md +122 -0
  54. package/docs/how-to/upload-and-use-an-asset.mdx +87 -0
  55. package/docs/how-to/validate-a-field.md +52 -0
  56. package/docs/how-to/wait-for-an-action-response.md +182 -0
  57. package/docs/how-to/write-a-condition.md +57 -0
  58. package/docs/how-to/write-a-predicate.md +60 -0
  59. package/docs/index.md +59 -0
  60. package/docs/reference/dashboard/actions.mdx +65 -0
  61. package/docs/reference/dashboard/api-keys.mdx +47 -0
  62. package/docs/reference/dashboard/conditions.mdx +51 -0
  63. package/docs/reference/dashboard/content/asset-library.mdx +74 -0
  64. package/docs/reference/dashboard/content/blocks.mdx +66 -0
  65. package/docs/reference/dashboard/content/content-entries.mdx +109 -0
  66. package/docs/reference/dashboard/content/models.mdx +119 -0
  67. package/docs/reference/dashboard/content/pages.mdx +72 -0
  68. package/docs/reference/dashboard/experiences.mdx +61 -0
  69. package/docs/reference/dashboard/external-apis.md +182 -0
  70. package/docs/reference/dashboard/features.mdx +165 -0
  71. package/docs/reference/dashboard/fields.mdx +120 -0
  72. package/docs/reference/dashboard/flow-builder/canvas.mdx +58 -0
  73. package/docs/reference/dashboard/flow-builder/condition-builder.md +69 -0
  74. package/docs/reference/dashboard/flow-builder/keyboard-shortcuts.md +72 -0
  75. package/docs/reference/dashboard/flow-builder/nodes.md +74 -0
  76. package/docs/reference/dashboard/labels.md +321 -0
  77. package/docs/reference/dashboard/lead-search.md +235 -0
  78. package/docs/reference/dashboard/projects.mdx +53 -0
  79. package/docs/reference/dashboard/reports.mdx +53 -0
  80. package/docs/reference/dashboard/steps.mdx +47 -0
  81. package/docs/reference/dashboard/team-management.md +38 -0
  82. package/docs/reference/dashboard/workflow-runs.md +157 -0
  83. package/docs/reference/dashboard/workflow-templates.md +182 -0
  84. package/docs/reference/dashboard/workflow-test-runs.md +85 -0
  85. package/docs/reference/dashboard/workspace-versioning.mdx +42 -0
  86. package/docs/reference/dashboard/workspaces.mdx +91 -0
  87. package/docs/reference/delivery-api/experience-content.md +152 -0
  88. package/docs/reference/delivery-api/index.md +45 -0
  89. package/docs/reference/delivery-api/preview-caching-crawling.md +79 -0
  90. package/docs/reference/delivery-api/project-config.md +65 -0
  91. package/docs/reference/delivery-api/workspace-schema.md +107 -0
  92. package/docs/reference/glossary.md +201 -0
  93. package/docs/reference/management-api/authentication.md +87 -0
  94. package/docs/reference/management-api/authorization-and-scopes.md +291 -0
  95. package/docs/reference/management-api/error-handling.md +232 -0
  96. package/docs/reference/management-api/pagination.md +192 -0
  97. package/docs/reference/management-api/schema/action.md +261 -0
  98. package/docs/reference/management-api/schema/analytics-session.md +363 -0
  99. package/docs/reference/management-api/schema/analytics.md +73 -0
  100. package/docs/reference/management-api/schema/api-key.md +170 -0
  101. package/docs/reference/management-api/schema/auth.md +1177 -0
  102. package/docs/reference/management-api/schema/cms-fields.md +954 -0
  103. package/docs/reference/management-api/schema/cms-models.md +1155 -0
  104. package/docs/reference/management-api/schema/common.md +362 -0
  105. package/docs/reference/management-api/schema/condition.md +254 -0
  106. package/docs/reference/management-api/schema/design-system.md +199 -0
  107. package/docs/reference/management-api/schema/experience.md +1098 -0
  108. package/docs/reference/management-api/schema/external-api.md +637 -0
  109. package/docs/reference/management-api/schema/feature.md +350 -0
  110. package/docs/reference/management-api/schema/feedback.md +103 -0
  111. package/docs/reference/management-api/schema/field.md +400 -0
  112. package/docs/reference/management-api/schema/index.md +243 -0
  113. package/docs/reference/management-api/schema/integration.md +272 -0
  114. package/docs/reference/management-api/schema/label.md +349 -0
  115. package/docs/reference/management-api/schema/lead.md +340 -0
  116. package/docs/reference/management-api/schema/mcp-server.md +299 -0
  117. package/docs/reference/management-api/schema/metric.md +223 -0
  118. package/docs/reference/management-api/schema/operation.md +96 -0
  119. package/docs/reference/management-api/schema/organization.md +749 -0
  120. package/docs/reference/management-api/schema/project.md +607 -0
  121. package/docs/reference/management-api/schema/report.md +243 -0
  122. package/docs/reference/management-api/schema/saved-view.md +288 -0
  123. package/docs/reference/management-api/schema/shopify.md +795 -0
  124. package/docs/reference/management-api/schema/step.md +273 -0
  125. package/docs/reference/management-api/schema/tenant-branding.md +185 -0
  126. package/docs/reference/management-api/schema/workbench.md +246 -0
  127. package/docs/reference/management-api/schema/workflow-run.md +263 -0
  128. package/docs/reference/management-api/schema/workflow.md +1110 -0
  129. package/docs/reference/management-api/schema/workspace-version.md +823 -0
  130. package/docs/reference/management-api/schema/workspace.md +917 -0
  131. package/docs/reference/pickedql/data-sources.md +174 -0
  132. package/docs/reference/pickedql/dimensions.md +103 -0
  133. package/docs/reference/pickedql/filtering.md +64 -0
  134. package/docs/reference/pickedql/index.md +18 -0
  135. package/docs/reference/pickedql/schema.md +172 -0
  136. package/docs/reference/pickedql/virtual-functions.md +248 -0
  137. package/docs/reference/sdk/actions.md +154 -0
  138. package/docs/reference/sdk/analytics-events.md +453 -0
  139. package/docs/reference/sdk/conditions.md +147 -0
  140. package/docs/reference/sdk/content-security-policy.md +21 -0
  141. package/docs/reference/sdk/content.md +253 -0
  142. package/docs/reference/sdk/experiences.md +51 -0
  143. package/docs/reference/sdk/features.md +256 -0
  144. package/docs/reference/sdk/fields.md +255 -0
  145. package/docs/reference/sdk/index.md +68 -0
  146. package/docs/reference/sdk/plugins/create-experience.md +123 -0
  147. package/docs/reference/sdk/plugins/dynamic-experiences.md +74 -0
  148. package/docs/reference/sdk/plugins/fingerprintjs.md +39 -0
  149. package/docs/reference/sdk/plugins/hotjar.md +60 -0
  150. package/docs/reference/sdk/plugins/index.md +33 -0
  151. package/docs/reference/sdk/plugins/sentry.md +51 -0
  152. package/docs/reference/sdk/plugins/shopify.md +109 -0
  153. package/docs/reference/sdk/plugins/window-object.md +25 -0
  154. package/docs/reference/sdk/predicates.md +43 -0
  155. package/docs/reference/sdk/react.md +61 -0
  156. package/docs/reference/sdk/ssr/index.md +33 -0
  157. package/docs/reference/sdk/ssr/rendering-and-hydration.md +103 -0
  158. package/docs/reference/sdk/ssr/serialize.md +80 -0
  159. package/docs/reference/sdk/ssr/slots-and-placements.md +113 -0
  160. package/docs/reference/sdk/steps.md +86 -0
  161. package/docs/reference/sdk/svelte.md +74 -0
  162. package/docs/reference/sdk/type-generation.md +265 -0
  163. package/docs/reference/tools/admin-api-client.md +89 -0
  164. package/docs/reference/tools/chrome-extension.md +16 -0
  165. package/docs/reference/tools/cli.md +319 -0
  166. package/docs/reference/tools/delivery-api-client.md +60 -0
  167. package/docs/reference/tools/image-optimisation-service.md +104 -0
  168. package/docs/reference/tools/mcp-run.md +121 -0
  169. package/docs/reference/tools/mcp.md +391 -0
  170. package/docs/reference/tools/vite-plugin.md +163 -0
  171. package/docs/tutorials/first-api-call.md +253 -0
  172. package/docs/tutorials/first-experience-in-the-dashboard.mdx +160 -0
  173. package/docs/tutorials/first-experience.mdx +254 -0
  174. package/docs/tutorials/first-server-rendered-page.mdx +186 -0
  175. package/package.json +8 -7
@@ -0,0 +1,1155 @@
1
+ ---
2
+ type: reference
3
+ layout: docs
4
+ generated: true
5
+ ---
6
+
7
+ # Cms models schema
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.
10
+
11
+ ## Queries
12
+
13
+ ### `contentModels`
14
+
15
+ List CMS Content Models in a workspace, optionally filtered by category.
16
+
17
+ ```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
+ ```
20
+
21
+ ### `contentModel`
22
+
23
+ Fetch a CMS Content Model by id.
24
+
25
+ ```graphql
26
+ contentModel(id: ID!): ContentModel @auth
27
+ ```
28
+
29
+ ### `contentBlocks`
30
+
31
+ List CMS Content Blocks in a workspace, optionally filtered by category.
32
+
33
+ ```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
35
+ ```
36
+
37
+ ### `contentBlock`
38
+
39
+ Fetch a CMS Content Block by id.
40
+
41
+ ```graphql
42
+ contentBlock(id: ID!): ContentBlock @auth
43
+ ```
44
+
45
+ ### `contentEntries`
46
+
47
+ List CMS Content Entries in a workspace, optionally filtered by parent Content Model.
48
+
49
+ ```graphql
50
+ contentEntries(workspaceId: ID!, contentModelId: ID, first: Int, after: String, last: Int, before: String, sortKey: ContentEntrySortKeys = CREATED_AT, reverse: Boolean = false): ContentEntryConnection! @auth
51
+ ```
52
+
53
+ ### `contentEntry`
54
+
55
+ Fetch a CMS Content Entry by id.
56
+
57
+ ```graphql
58
+ contentEntry(id: ID!): ContentEntry @auth
59
+ ```
60
+
61
+ ### `assets`
62
+
63
+ List CMS Assets in a project, with optional text search, MIME-type filtering, and sort.
64
+
65
+ ```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
67
+ ```
68
+
69
+ ### `asset`
70
+
71
+ Fetch a CMS Asset by id.
72
+
73
+ ```graphql
74
+ asset(id: ID!): Asset @auth
75
+ ```
76
+
77
+ ### `workspaceContentEntryValidation`
78
+
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`.
84
+
85
+ ```graphql
86
+ workspaceContentEntryValidation(workspaceId: ID!, contentModelId: ID): WorkspaceContentEntryValidationPayload! @auth
87
+ ```
88
+
89
+ ## Mutations
90
+
91
+ ### `contentModelCreate`
92
+
93
+ Create a new CMS Content Model. Requires scope: `ORGANIZATION_PROJECTS_UPDATE`.
94
+
95
+ ```graphql
96
+ contentModelCreate(input: ContentModelCreateInput!): ContentModelCreatePayload! @auth
97
+ ```
98
+
99
+ ### `contentModelUpdate`
100
+
101
+ Update a CMS Content Model. Returns migration warnings when the schema change drops or coerces dependent Content Entry fields.
102
+
103
+ ```graphql
104
+ contentModelUpdate(input: ContentModelUpdateInput!): ContentModelUpdatePayload! @auth
105
+ ```
106
+
107
+ ### `contentModelDelete`
108
+
109
+ Soft-delete a CMS Content Model. Refuses if dependent Content Entry rows still exist.
110
+
111
+ ```graphql
112
+ contentModelDelete(input: ContentModelDeleteInput!): ContentModelDeletePayload! @auth
113
+ ```
114
+
115
+ ### `contentBlockCreate`
116
+
117
+ Create a new CMS Content Block. Requires scope: `ORGANIZATION_PROJECTS_UPDATE`.
118
+
119
+ ```graphql
120
+ contentBlockCreate(input: ContentBlockCreateInput!): ContentBlockCreatePayload! @auth
121
+ ```
122
+
123
+ ### `contentBlockUpdate`
124
+
125
+ Update a CMS Content Block schema.
126
+
127
+ ```graphql
128
+ contentBlockUpdate(input: ContentBlockUpdateInput!): ContentBlockUpdatePayload! @auth
129
+ ```
130
+
131
+ ### `contentBlockDelete`
132
+
133
+ Soft-delete a CMS Content Block.
134
+
135
+ ```graphql
136
+ contentBlockDelete(input: ContentBlockDeleteInput!): ContentBlockDeletePayload! @auth
137
+ ```
138
+
139
+ ### `contentEntryCreate`
140
+
141
+ Create a new CMS Content Entry against a parent Content Model.
142
+
143
+ ```graphql
144
+ contentEntryCreate(input: ContentEntryCreateInput!): ContentEntryCreatePayload! @auth
145
+ ```
146
+
147
+ ### `contentEntryUpdate`
148
+
149
+ Update a CMS Content Entry's data.
150
+
151
+ ```graphql
152
+ contentEntryUpdate(input: ContentEntryUpdateInput!): ContentEntryUpdatePayload! @auth
153
+ ```
154
+
155
+ ### `contentEntryDelete`
156
+
157
+ Soft-delete a CMS Content Entry. Refuses if a Step references it.
158
+
159
+ ```graphql
160
+ contentEntryDelete(input: ContentEntryDeleteInput!): ContentEntryDeletePayload! @auth
161
+ ```
162
+
163
+ ### `assetUploadInit`
164
+
165
+ Initiate an Asset upload — returns a pre-signed PUT URL plus the allocated asset id.
166
+
167
+ ```graphql
168
+ assetUploadInit(input: AssetUploadInitInput!): AssetUploadInitPayload! @auth
169
+ ```
170
+
171
+ ### `assetCommit`
172
+
173
+ Finalise an Asset upload — captures size, MIME, and intrinsic dimensions for images.
174
+
175
+ ```graphql
176
+ assetCommit(input: AssetCommitInput!): AssetCommitPayload! @auth
177
+ ```
178
+
179
+ ### `assetDelete`
180
+
181
+ Soft-delete an Asset. The underlying storage object is removed best-effort.
182
+
183
+ ```graphql
184
+ assetDelete(input: AssetDeleteInput!): AssetDeletePayload! @auth
185
+ ```
186
+
187
+ ## Types
188
+
189
+ ### `ContentModelCategory`
190
+
191
+ ```graphql
192
+ """
193
+ Content Model schema category. Picking a category determines where the
194
+ Content Model surfaces in the dashboard.
195
+ """
196
+ enum ContentModelCategory {
197
+ """Layout configuration for an experience Step."""
198
+ STEP_LAYOUT
199
+ """Layout configuration for an experience Page."""
200
+ PAGE_LAYOUT
201
+ }
202
+ ```
203
+
204
+ ### `ContentBlockCategory`
205
+
206
+ ```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
+ """
212
+ enum ContentBlockCategory {
213
+ """A page section (hero, feature list, testimonial, etc.)."""
214
+ SECTION
215
+ }
216
+ ```
217
+
218
+ ### `MigrationWarningType`
219
+
220
+ ```graphql
221
+ """
222
+ Kind of warning produced by an auto-migration of dependent Content Entries when a parent Content Model's schema changes.
223
+ """
224
+ enum MigrationWarningType {
225
+ """
226
+ A field was dropped from the schema; entry data for that field has been removed.
227
+ """
228
+ FIELD_REMOVED
229
+ """
230
+ A field's type changed; entry data for that field has been coerced (or set to null if coercion is not possible).
231
+ """
232
+ TYPE_CHANGE
233
+ """A field was renamed and requires manual migration in the dashboard."""
234
+ RENAME_REQUIRED
235
+ }
236
+ ```
237
+
238
+ ### `ContentModel`
239
+
240
+ ```graphql
241
+ """
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).
246
+ """
247
+ type ContentModel {
248
+ """Unique Content Model identifier."""
249
+ id: ID!
250
+ """The workspace this Content Model belongs to."""
251
+ workspace: Workspace!
252
+ """
253
+ Category — determines where this Model surfaces in the dashboard. Null for a general-purpose Content Model with no layout role.
254
+ """
255
+ category: ContentModelCategory
256
+ """Display name."""
257
+ name: String!
258
+ """Optional human-readable description."""
259
+ description: String
260
+ """Stable, human-readable key for SDK consumers."""
261
+ key: String!
262
+ """The typed schema describing the entries' shape."""
263
+ schema: ContentSchema!
264
+ """Content Entries that instantiate this Content Model."""
265
+ contentEntries(first: Int, after: String, last: Int, before: String): ContentEntryConnection!
266
+ """When this Content Model was created."""
267
+ createdAt: DateTime!
268
+ """When this Content Model was last updated."""
269
+ updatedAt: DateTime!
270
+ }
271
+ ```
272
+
273
+ ### `ContentModelEdge`
274
+
275
+ ```graphql
276
+ """Edge type for `ContentModelConnection`."""
277
+ type ContentModelEdge {
278
+ """Pagination cursor for this edge."""
279
+ cursor: String!
280
+ """The Content Model."""
281
+ node: ContentModel!
282
+ }
283
+ ```
284
+
285
+ ### `ContentModelConnection`
286
+
287
+ ```graphql
288
+ """
289
+ Relay-style connection of Content Models, with both an `edges` list and a flat `nodes` accessor.
290
+ """
291
+ type ContentModelConnection {
292
+ """List of Content Model edges."""
293
+ edges: [ContentModelEdge!]!
294
+ """Flat list of Content Models, equivalent to `edges[].node`."""
295
+ nodes: [ContentModel!]!
296
+ """Pagination metadata."""
297
+ pageInfo: PageInfo!
298
+ """Total number of Content Models."""
299
+ totalCount: Int!
300
+ }
301
+ ```
302
+
303
+ ### `ContentBlock`
304
+
305
+ ```graphql
306
+ """
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.
314
+ """
315
+ type ContentBlock {
316
+ """Unique Content Block identifier."""
317
+ id: ID!
318
+ """The workspace this Content Block belongs to."""
319
+ workspace: Workspace!
320
+ """
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.
322
+ """
323
+ category: ContentBlockCategory
324
+ """Display name."""
325
+ name: String!
326
+ """Optional human-readable description."""
327
+ description: String
328
+ """Stable, human-readable key for SDK consumers."""
329
+ key: String!
330
+ """The typed schema describing block instances' shape."""
331
+ schema: ContentSchema!
332
+ """When this Content Block was created."""
333
+ createdAt: DateTime!
334
+ """When this Content Block was last updated."""
335
+ updatedAt: DateTime!
336
+ }
337
+ ```
338
+
339
+ ### `ContentBlockEdge`
340
+
341
+ ```graphql
342
+ """Edge type for `ContentBlockConnection`."""
343
+ type ContentBlockEdge {
344
+ """Pagination cursor for this edge."""
345
+ cursor: String!
346
+ """The Content Block."""
347
+ node: ContentBlock!
348
+ }
349
+ ```
350
+
351
+ ### `ContentBlockConnection`
352
+
353
+ ```graphql
354
+ """
355
+ Relay-style connection of Content Blocks, with both an `edges` list and a flat `nodes` accessor.
356
+ """
357
+ type ContentBlockConnection {
358
+ """List of Content Block edges."""
359
+ edges: [ContentBlockEdge!]!
360
+ """Flat list of Content Blocks, equivalent to `edges[].node`."""
361
+ nodes: [ContentBlock!]!
362
+ """Pagination metadata."""
363
+ pageInfo: PageInfo!
364
+ """Total number of Content Blocks."""
365
+ totalCount: Int!
366
+ }
367
+ ```
368
+
369
+ ### `ContentEntry`
370
+
371
+ ```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
+ """
378
+ type ContentEntry {
379
+ """Unique Content Entry identifier."""
380
+ id: ID!
381
+ """The workspace this Content Entry belongs to."""
382
+ workspace: Workspace!
383
+ """Parent Content Model — defines the schema this entry conforms to."""
384
+ contentModel: ContentModel!
385
+ """
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.
389
+ """
390
+ title: String!
391
+ """The entry's data, structurally typed against the parent schema."""
392
+ data: ContentEntryData!
393
+ """When this Content Entry was created."""
394
+ createdAt: DateTime!
395
+ """When this Content Entry was last updated."""
396
+ updatedAt: DateTime!
397
+ }
398
+ ```
399
+
400
+ ### `ContentEntryEdge`
401
+
402
+ ```graphql
403
+ """Edge type for `ContentEntryConnection`."""
404
+ type ContentEntryEdge {
405
+ """Pagination cursor for this edge."""
406
+ cursor: String!
407
+ """The Content Entry."""
408
+ node: ContentEntry!
409
+ }
410
+ ```
411
+
412
+ ### `ContentEntryConnection`
413
+
414
+ ```graphql
415
+ """
416
+ Relay-style connection of Content Entries, with both an `edges` list and a flat `nodes` accessor.
417
+ """
418
+ type ContentEntryConnection {
419
+ """List of Content Entry edges."""
420
+ edges: [ContentEntryEdge!]!
421
+ """Flat list of Content Entries, equivalent to `edges[].node`."""
422
+ nodes: [ContentEntry!]!
423
+ """Pagination metadata."""
424
+ pageInfo: PageInfo!
425
+ """Total number of Content Entries."""
426
+ totalCount: Int!
427
+ }
428
+ ```
429
+
430
+ ### `Asset`
431
+
432
+ ```graphql
433
+ """
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.
442
+ """
443
+ type Asset {
444
+ """Unique Asset identifier. Stable across versions."""
445
+ id: ID!
446
+ """The project this Asset belongs to."""
447
+ project: Project!
448
+ """Original file name supplied at upload time."""
449
+ fileName: String!
450
+ """
451
+ The Workbench that owns this Asset, when it was authored/uploaded into one. Null for project-level assets.
452
+ """
453
+ owner: AssetOwner
454
+ """MIME type, resolved from the current version."""
455
+ mimeType: String!
456
+ """File size in bytes, resolved from the current version."""
457
+ sizeBytes: Int!
458
+ """
459
+ Intrinsic image width in pixels, resolved from the current version — populated only for image MIME types.
460
+ """
461
+ width: Int
462
+ """
463
+ Intrinsic image height in pixels, resolved from the current version — populated only for image MIME types.
464
+ """
465
+ height: Int
466
+ """
467
+ The path inside the `cms-assets` bucket for the current version: `cms-assets/<project>/<asset>/<version>/<file_name>`.
468
+ """
469
+ storagePath: String!
470
+ """
471
+ The proxy URL the dashboard / SDK can use to fetch the current version's binary.
472
+ """
473
+ url: String!
474
+ """
475
+ The version currently serving this Asset's byte-shaped fields (`url`, `mimeType`, `sizeBytes`, `width`, `height`).
476
+ """
477
+ currentVersion: AssetVersion!
478
+ """Every version of this Asset, oldest first."""
479
+ versions: [AssetVersion!]!
480
+ """When this Asset was created (i.e. when `assetCommit` completed)."""
481
+ createdAt: DateTime!
482
+ }
483
+ ```
484
+
485
+ ### `AssetVersion`
486
+
487
+ ```graphql
488
+ """
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.
491
+ """
492
+ type AssetVersion {
493
+ """Unique AssetVersion identifier."""
494
+ id: ID!
495
+ """MIME type captured at commit time."""
496
+ mimeType: String!
497
+ """File size in bytes."""
498
+ sizeBytes: Int!
499
+ """Intrinsic image width in pixels — populated only for image MIME types."""
500
+ width: Int
501
+ """
502
+ Intrinsic image height in pixels — populated only for image MIME types.
503
+ """
504
+ height: Int
505
+ """
506
+ True once this version has been referenced by a publish — never overwritten again.
507
+ """
508
+ isImmutable: Boolean!
509
+ """
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.
513
+ """
514
+ sha256: String
515
+ """
516
+ The proxy URL the dashboard / SDK can use to fetch this version's binary.
517
+ """
518
+ url: String!
519
+ """When this version was created."""
520
+ createdAt: DateTime!
521
+ }
522
+ ```
523
+
524
+ ### `AssetOwner`
525
+
526
+ ```graphql
527
+ """Identifies the Workbench that owns an Asset."""
528
+ type AssetOwner {
529
+ """The owner kind, currently always `"workbench"`."""
530
+ type: String!
531
+ """The owning Workbench id."""
532
+ id: String!
533
+ }
534
+ ```
535
+
536
+ ### `AssetEdge`
537
+
538
+ ```graphql
539
+ """Edge type for `AssetConnection`."""
540
+ type AssetEdge {
541
+ """Pagination cursor for this edge."""
542
+ cursor: String!
543
+ """The Asset."""
544
+ node: Asset!
545
+ }
546
+ ```
547
+
548
+ ### `AssetConnection`
549
+
550
+ ```graphql
551
+ """
552
+ Relay-style connection of Assets, with both an `edges` list and a flat `nodes` accessor.
553
+ """
554
+ type AssetConnection {
555
+ """List of Asset edges."""
556
+ edges: [AssetEdge!]!
557
+ """Flat list of Assets, equivalent to `edges[].node`."""
558
+ nodes: [Asset!]!
559
+ """Pagination metadata."""
560
+ pageInfo: PageInfo!
561
+ """Total number of Assets."""
562
+ totalCount: Int!
563
+ }
564
+ ```
565
+
566
+ ### `MigrationWarning`
567
+
568
+ ```graphql
569
+ """
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.
573
+ """
574
+ type MigrationWarning {
575
+ """The Content Entry whose data was affected."""
576
+ contentEntryId: ID!
577
+ """JSON-Pointer-style path into the entry data (e.g. `$.title`)."""
578
+ fieldPath: String!
579
+ """Kind of warning."""
580
+ warningType: MigrationWarningType!
581
+ """
582
+ Stringified previous value, when applicable (truncated for large blobs).
583
+ """
584
+ oldValue: String
585
+ }
586
+ ```
587
+
588
+ ### `WorkspaceContentEntryValidationPayload`
589
+
590
+ ```graphql
591
+ """
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).
599
+ """
600
+ type WorkspaceContentEntryValidationPayload {
601
+ """Total Content Entry rows visited."""
602
+ totalCount: Int!
603
+ """Rows whose `data` blob conforms cleanly to its Content Model schema."""
604
+ validCount: Int!
605
+ """Rows with at least one validation error."""
606
+ invalidCount: Int!
607
+ """
608
+ Per-Content-Entry outcomes, in DB-order (matches `contentEntries` query ordering).
609
+ """
610
+ outcomes: [ContentEntryValidationOutcome!]!
611
+ }
612
+ ```
613
+
614
+ ### `ContentEntryValidationOutcome`
615
+
616
+ ```graphql
617
+ """A single Content Entry's validation outcome."""
618
+ type ContentEntryValidationOutcome {
619
+ """
620
+ Identifier for the Content Entry — always present, even when `contentEntry` is null due to a soft-delete race.
621
+ """
622
+ contentEntryId: ID!
623
+ """
624
+ Identifier for the parent Content Model — always present, even when `contentModel` is null due to a soft-delete race.
625
+ """
626
+ contentModelId: ID!
627
+ """
628
+ The Content Entry that was validated. Null if it was concurrently soft-deleted.
629
+ """
630
+ contentEntry: ContentEntry
631
+ """The parent Content Model. Null if it was concurrently soft-deleted."""
632
+ contentModel: ContentModel
633
+ """
634
+ Snapshot of the parent Content Model name at validation time — non-null even if the parent was concurrently soft-deleted.
635
+ """
636
+ contentModelName: String!
637
+ """
638
+ Whether the Content Entry data conforms to the parent Content Model schema.
639
+ """
640
+ valid: Boolean!
641
+ """Per-field validation errors. Empty when `valid` is true."""
642
+ errors: [ContentEntryValidationError!]!
643
+ }
644
+ ```
645
+
646
+ ### `ContentEntryValidationError`
647
+
648
+ ```graphql
649
+ """
650
+ A single Content Entry validation error pinned to a path inside the `data` blob.
651
+ """
652
+ type ContentEntryValidationError {
653
+ """
654
+ JSON-Pointer-style path inside the Content Entry data, e.g. `$.title` or `$.sections[0].headline`.
655
+ """
656
+ path: String!
657
+ """Human-readable error message."""
658
+ message: String!
659
+ }
660
+ ```
661
+
662
+ ### `ContentModelCreateInput`
663
+
664
+ ```graphql
665
+ """Input for `contentModelCreate`."""
666
+ input ContentModelCreateInput {
667
+ """Workspace ID to create the Content Model in."""
668
+ workspaceId: ID!
669
+ """
670
+ Category — determines where the Model surfaces in the dashboard. Omit for a general-purpose Content Model with no layout role.
671
+ """
672
+ category: ContentModelCategory
673
+ """Display name."""
674
+ name: String!
675
+ """Optional human-readable description."""
676
+ description: String
677
+ """Stable, human-readable key for SDK consumers."""
678
+ key: String!
679
+ """Initial schema."""
680
+ schema: ContentSchemaInput!
681
+ }
682
+ ```
683
+
684
+ ### `ContentModelCreatePayload`
685
+
686
+ ```graphql
687
+ """Payload returned by `contentModelCreate`."""
688
+ type ContentModelCreatePayload {
689
+ """The created Content Model."""
690
+ contentModel: ContentModel
691
+ }
692
+ ```
693
+
694
+ ### `ContentModelUpdateInput`
695
+
696
+ ```graphql
697
+ """Input for `contentModelUpdate`. Omit a field to leave it unchanged."""
698
+ input ContentModelUpdateInput {
699
+ """Content Model ID."""
700
+ id: ID!
701
+ """New display name."""
702
+ name: String
703
+ """New description. Omit to leave unchanged."""
704
+ description: String
705
+ """
706
+ New schema. Schema changes auto-migrate dependent Content Entries; affected paths are returned in `migrationWarnings`.
707
+ """
708
+ schema: ContentSchemaInput
709
+ }
710
+ ```
711
+
712
+ ### `ContentModelUpdatePayload`
713
+
714
+ ```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
+ """
720
+ type ContentModelUpdatePayload {
721
+ """The updated Content Model."""
722
+ contentModel: ContentModel
723
+ """
724
+ Per-Content-Entry warnings emitted when the schema change dropped or coerced fields.
725
+ """
726
+ migrationWarnings: [MigrationWarning!]!
727
+ }
728
+ ```
729
+
730
+ ### `ContentModelDeleteInput`
731
+
732
+ ```graphql
733
+ """
734
+ Input for `contentModelDelete`. Refused if dependent Content Entry rows still exist.
735
+ """
736
+ input ContentModelDeleteInput {
737
+ """Content Model ID."""
738
+ id: ID!
739
+ }
740
+ ```
741
+
742
+ ### `ContentModelDeletePayload`
743
+
744
+ ```graphql
745
+ """Payload returned by `contentModelDelete`."""
746
+ type ContentModelDeletePayload {
747
+ """ID of the deleted Content Model."""
748
+ contentModelId: ID
749
+ }
750
+ ```
751
+
752
+ ### `ContentBlockCreateInput`
753
+
754
+ ```graphql
755
+ """Input for `contentBlockCreate`."""
756
+ input ContentBlockCreateInput {
757
+ """Workspace ID to create the Content Block in."""
758
+ workspaceId: ID!
759
+ """
760
+ Category — restricts where instances of this Block may be embedded. Omit for a general-purpose Content Block with no layout role.
761
+ """
762
+ category: ContentBlockCategory
763
+ """Display name."""
764
+ name: String!
765
+ """Optional human-readable description."""
766
+ description: String
767
+ """Stable, human-readable key for SDK consumers."""
768
+ key: String!
769
+ """Initial schema."""
770
+ schema: ContentSchemaInput!
771
+ }
772
+ ```
773
+
774
+ ### `ContentBlockCreatePayload`
775
+
776
+ ```graphql
777
+ """Payload returned by `contentBlockCreate`."""
778
+ type ContentBlockCreatePayload {
779
+ """The created Content Block."""
780
+ contentBlock: ContentBlock
781
+ }
782
+ ```
783
+
784
+ ### `ContentBlockUpdateInput`
785
+
786
+ ```graphql
787
+ """Input for `contentBlockUpdate`. Omit a field to leave it unchanged."""
788
+ input ContentBlockUpdateInput {
789
+ """Content Block ID."""
790
+ id: ID!
791
+ """New display name."""
792
+ name: String
793
+ """New description. Omit to leave unchanged."""
794
+ description: String
795
+ """
796
+ New schema. WARNING: changing a Block schema does NOT auto-migrate dependent Content Entries — run `workspaceContentEntryValidation` to find drift.
797
+ """
798
+ schema: ContentSchemaInput
799
+ }
800
+ ```
801
+
802
+ ### `ContentBlockUpdatePayload`
803
+
804
+ ```graphql
805
+ """Payload returned by `contentBlockUpdate`."""
806
+ type ContentBlockUpdatePayload {
807
+ """The updated Content Block."""
808
+ contentBlock: ContentBlock
809
+ }
810
+ ```
811
+
812
+ ### `ContentBlockDeleteInput`
813
+
814
+ ```graphql
815
+ """Input for `contentBlockDelete`."""
816
+ input ContentBlockDeleteInput {
817
+ """Content Block ID."""
818
+ id: ID!
819
+ }
820
+ ```
821
+
822
+ ### `ContentBlockDeletePayload`
823
+
824
+ ```graphql
825
+ """Payload returned by `contentBlockDelete`."""
826
+ type ContentBlockDeletePayload {
827
+ """ID of the deleted Content Block."""
828
+ contentBlockId: ID
829
+ }
830
+ ```
831
+
832
+ ### `ContentEntryCreateInput`
833
+
834
+ ```graphql
835
+ """Input for `contentEntryCreate`."""
836
+ input ContentEntryCreateInput {
837
+ """
838
+ Parent Content Model id — the entry's data must conform to this Model's schema.
839
+ """
840
+ contentModelId: ID!
841
+ """The entry's data, structurally typed against the parent schema."""
842
+ data: ContentEntryDataInput!
843
+ }
844
+ ```
845
+
846
+ ### `ContentEntryCreatePayload`
847
+
848
+ ```graphql
849
+ """Payload returned by `contentEntryCreate`."""
850
+ type ContentEntryCreatePayload {
851
+ """The created Content Entry."""
852
+ contentEntry: ContentEntry
853
+ }
854
+ ```
855
+
856
+ ### `ContentEntryUpdateInput`
857
+
858
+ ```graphql
859
+ """
860
+ Input for `contentEntryUpdate`. The entire `data` blob is replaced; partial updates are not supported.
861
+ """
862
+ input ContentEntryUpdateInput {
863
+ """Content Entry ID."""
864
+ id: ID!
865
+ """New entry data — must conform to the parent Content Model's schema."""
866
+ data: ContentEntryDataInput!
867
+ }
868
+ ```
869
+
870
+ ### `ContentEntryUpdatePayload`
871
+
872
+ ```graphql
873
+ """Payload returned by `contentEntryUpdate`."""
874
+ type ContentEntryUpdatePayload {
875
+ """The updated Content Entry."""
876
+ contentEntry: ContentEntry
877
+ }
878
+ ```
879
+
880
+ ### `ContentEntryDeleteInput`
881
+
882
+ ```graphql
883
+ """Input for `contentEntryDelete`. Refused if a Step references it."""
884
+ input ContentEntryDeleteInput {
885
+ """Content Entry ID."""
886
+ id: ID!
887
+ }
888
+ ```
889
+
890
+ ### `ContentEntryDeletePayload`
891
+
892
+ ```graphql
893
+ """Payload returned by `contentEntryDelete`."""
894
+ type ContentEntryDeletePayload {
895
+ """ID of the deleted Content Entry."""
896
+ contentEntryId: ID
897
+ }
898
+ ```
899
+
900
+ ### `AssetUploadInitInput`
901
+
902
+ ```graphql
903
+ """
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.
914
+ """
915
+ input AssetUploadInitInput {
916
+ """Project to upload the Asset into."""
917
+ projectId: ID!
918
+ """
919
+ Original file name. Stored verbatim — used for display and in the storage path.
920
+ """
921
+ fileName: String!
922
+ """
923
+ MIME type the dashboard expects to upload. Must match the uploaded bytes' content-type.
924
+ """
925
+ contentType: String!
926
+ """
927
+ Targets an existing Asset for a new write (overwrite or fork). Omit to create a new Asset.
928
+ """
929
+ assetId: ID
930
+ """The Workbench this upload belongs to."""
931
+ workbenchId: ID
932
+ """
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 `/`.
935
+ """
936
+ path: String
937
+ """
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.
941
+ """
942
+ sha256: String
943
+ }
944
+ ```
945
+
946
+ ### `AssetUploadInitPayload`
947
+
948
+ ```graphql
949
+ """
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.
956
+ """
957
+ type AssetUploadInitPayload {
958
+ """
959
+ Pre-signed PUT URL the client uploads to. Null when `deduplicated` is true.
960
+ """
961
+ uploadUrl: String
962
+ """
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.
964
+ """
965
+ assetId: ID!
966
+ """
967
+ The version id this upload targets, or the matching existing version when deduplicated. The dashboard MUST pass this to `assetCommit` when it uploads.
968
+ """
969
+ versionId: ID!
970
+ """
971
+ Storage path the URL writes to (echoed back to the commit step), or the matching version's path when deduplicated.
972
+ """
973
+ storagePath: String!
974
+ """
975
+ True when the project already holds the declared bytes and nothing needs uploading.
976
+ """
977
+ deduplicated: Boolean!
978
+ }
979
+ ```
980
+
981
+ ### `AssetCommitInput`
982
+
983
+ ```graphql
984
+ """
985
+ Input for `assetCommit` — finalise an upload by recording `sizeBytes`, `mimeType`, and intrinsic dimensions.
986
+ """
987
+ input AssetCommitInput {
988
+ """Project the Asset belongs to."""
989
+ projectId: ID!
990
+ """Asset id reserved by `assetUploadInit`."""
991
+ assetId: ID!
992
+ """Version id reserved by `assetUploadInit`."""
993
+ versionId: ID!
994
+ """Original file name (matches the `assetUploadInit` value)."""
995
+ fileName: String!
996
+ """Storage path returned by `assetUploadInit`."""
997
+ storagePath: String!
998
+ """
999
+ The Workbench this upload belongs to. Recorded as the Asset's owner only when the Asset document is first created.
1000
+ """
1001
+ workbenchId: ID
1002
+ """
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.
1006
+ """
1007
+ path: String
1008
+ """
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
+ """
1013
+ sha256: String
1014
+ }
1015
+ ```
1016
+
1017
+ ### `AssetCommitPayload`
1018
+
1019
+ ```graphql
1020
+ """Payload returned by `assetCommit`."""
1021
+ type AssetCommitPayload {
1022
+ """
1023
+ The committed Asset, now ready to be referenced from Content Entry data. Null when a `userError` was returned.
1024
+ """
1025
+ asset: Asset
1026
+ """Errors that stopped the commit. Empty on success."""
1027
+ userErrors: [AssetCommitUserError!]!
1028
+ }
1029
+ ```
1030
+
1031
+ ### `AssetCommitErrorCode`
1032
+
1033
+ ```graphql
1034
+ """Machine-readable error codes for `assetCommit`."""
1035
+ enum AssetCommitErrorCode {
1036
+ """The stored bytes do not hash to the `sha256` given in the input."""
1037
+ HASH_MISMATCH
1038
+ }
1039
+ ```
1040
+
1041
+ ### `AssetCommitUserError`
1042
+
1043
+ ```graphql
1044
+ """User-facing error for `assetCommit`."""
1045
+ type AssetCommitUserError {
1046
+ """Path to the offending input field, if applicable."""
1047
+ field: [String!]
1048
+ """Human-readable error message."""
1049
+ message: String!
1050
+ """Machine-readable error code."""
1051
+ code: AssetCommitErrorCode!
1052
+ }
1053
+ ```
1054
+
1055
+ ### `AssetDeleteInput`
1056
+
1057
+ ```graphql
1058
+ """
1059
+ Input for `assetDelete` — soft-deletes the Asset row. The underlying storage object is removed best-effort.
1060
+ """
1061
+ input AssetDeleteInput {
1062
+ """Asset ID."""
1063
+ id: ID!
1064
+ }
1065
+ ```
1066
+
1067
+ ### `AssetDeletePayload`
1068
+
1069
+ ```graphql
1070
+ """Payload returned by `assetDelete`."""
1071
+ type AssetDeletePayload {
1072
+ """ID of the deleted Asset."""
1073
+ assetId: ID
1074
+ }
1075
+ ```
1076
+
1077
+ ### `ContentBlockSortKeys`
1078
+
1079
+ ```graphql
1080
+ """
1081
+ Sort keys for `contentBlocks(...)`. Pair with `reverse: true` to flip the order.
1082
+ """
1083
+ enum ContentBlockSortKeys {
1084
+ """Sort by `name` (alphabetical)."""
1085
+ NAME
1086
+ """Sort by `createdAt`."""
1087
+ CREATED_AT
1088
+ """Sort by `updatedAt`."""
1089
+ UPDATED_AT
1090
+ }
1091
+ ```
1092
+
1093
+ ### `ContentModelSortKeys`
1094
+
1095
+ ```graphql
1096
+ """
1097
+ Sort keys for `contentModels(...)`. Pair with `reverse: true` to flip the order.
1098
+ """
1099
+ enum ContentModelSortKeys {
1100
+ """Sort by `name` (alphabetical)."""
1101
+ NAME
1102
+ """Sort by `createdAt`."""
1103
+ CREATED_AT
1104
+ """Sort by `updatedAt`."""
1105
+ UPDATED_AT
1106
+ }
1107
+ ```
1108
+
1109
+ ### `ContentEntrySortKeys`
1110
+
1111
+ ```graphql
1112
+ """
1113
+ Sort keys for `contentEntries(...)`. Entries have no name; pair with `reverse: true` to flip the order.
1114
+ """
1115
+ enum ContentEntrySortKeys {
1116
+ """Sort by `createdAt`."""
1117
+ CREATED_AT
1118
+ """Sort by `updatedAt`."""
1119
+ UPDATED_AT
1120
+ }
1121
+ ```
1122
+
1123
+ ### `AssetSortKeys`
1124
+
1125
+ ```graphql
1126
+ """
1127
+ Sort keys for `assets(...)`. Pair with `reverse: true` to flip the order.
1128
+ """
1129
+ enum AssetSortKeys {
1130
+ """Sort by `fileName` (alphabetical)."""
1131
+ NAME
1132
+ """Sort by `createdAt` (upload time)."""
1133
+ CREATED_AT
1134
+ }
1135
+ ```
1136
+
1137
+ ### `AssetKind`
1138
+
1139
+ ```graphql
1140
+ """
1141
+ A media-type bucket for browsing the asset library, matched against the current version's MIME type.
1142
+ """
1143
+ enum AssetKind {
1144
+ """`image/*`."""
1145
+ IMAGE
1146
+ """`video/*`."""
1147
+ VIDEO
1148
+ """`audio/*`."""
1149
+ AUDIO
1150
+ """Anything that is not an image, video, audio, or recognised archive."""
1151
+ DOCUMENT
1152
+ """A recognised archive type (zip, rar, gzip, 7z, tar)."""
1153
+ ARCHIVE
1154
+ }
1155
+ ```