@nocobase/plugin-flow-engine 2.1.0-alpha.15 → 2.1.0-alpha.16

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 (116) hide show
  1. package/dist/externalVersion.js +10 -10
  2. package/dist/node_modules/ses/package.json +1 -1
  3. package/dist/node_modules/zod/package.json +1 -1
  4. package/dist/server/flow-surfaces/{compiler.d.ts → apply/compiler.d.ts} +1 -10
  5. package/dist/server/flow-surfaces/{compiler.js → apply/compiler.js} +41 -280
  6. package/dist/server/flow-surfaces/apply/layout.d.ts +34 -0
  7. package/dist/server/flow-surfaces/apply/layout.js +175 -0
  8. package/dist/server/flow-surfaces/apply/matching.d.ts +16 -0
  9. package/dist/server/flow-surfaces/apply/matching.js +181 -0
  10. package/dist/server/flow-surfaces/association-title-field.d.ts +20 -0
  11. package/dist/server/flow-surfaces/association-title-field.js +158 -0
  12. package/dist/server/flow-surfaces/blueprint/compile-blocks.d.ts +14 -0
  13. package/dist/server/flow-surfaces/blueprint/compile-blocks.js +706 -0
  14. package/dist/server/flow-surfaces/blueprint/compile-plan.d.ts +13 -0
  15. package/dist/server/flow-surfaces/blueprint/compile-plan.js +308 -0
  16. package/dist/server/flow-surfaces/blueprint/compile-reaction.d.ts +11 -0
  17. package/dist/server/flow-surfaces/blueprint/compile-reaction.js +72 -0
  18. package/dist/server/flow-surfaces/blueprint/index.d.ts +12 -0
  19. package/dist/server/flow-surfaces/blueprint/index.js +44 -0
  20. package/dist/server/flow-surfaces/blueprint/normalize-document.d.ts +10 -0
  21. package/dist/server/flow-surfaces/blueprint/normalize-document.js +296 -0
  22. package/dist/server/flow-surfaces/blueprint/private-utils.d.ts +26 -0
  23. package/dist/server/flow-surfaces/blueprint/private-utils.js +182 -0
  24. package/dist/server/flow-surfaces/blueprint/public-types.d.ts +153 -0
  25. package/dist/server/flow-surfaces/blueprint/public-types.js +24 -0
  26. package/dist/server/flow-surfaces/catalog-smart.d.ts +18 -0
  27. package/dist/server/flow-surfaces/catalog-smart.js +239 -0
  28. package/dist/server/flow-surfaces/catalog-smart.projector.d.ts +15 -0
  29. package/dist/server/flow-surfaces/catalog-smart.projector.js +157 -0
  30. package/dist/server/flow-surfaces/catalog-smart.types.d.ts +99 -0
  31. package/dist/server/flow-surfaces/catalog-smart.types.js +24 -0
  32. package/dist/server/flow-surfaces/catalog.d.ts +3 -0
  33. package/dist/server/flow-surfaces/catalog.js +163 -34
  34. package/dist/server/flow-surfaces/compose-compiler.d.ts +104 -0
  35. package/dist/server/flow-surfaces/compose-compiler.js +162 -0
  36. package/dist/server/flow-surfaces/compose-runtime.d.ts +89 -0
  37. package/dist/server/flow-surfaces/compose-runtime.js +338 -0
  38. package/dist/server/flow-surfaces/configure-options.js +12 -3
  39. package/dist/server/flow-surfaces/constants.d.ts +3 -2
  40. package/dist/server/flow-surfaces/constants.js +36 -3
  41. package/dist/server/flow-surfaces/default-action-popup.d.ts +52 -0
  42. package/dist/server/flow-surfaces/default-action-popup.js +258 -0
  43. package/dist/server/flow-surfaces/executor.d.ts +10 -0
  44. package/dist/server/flow-surfaces/executor.js +59 -24
  45. package/dist/server/flow-surfaces/field-binding-registry.d.ts +23 -0
  46. package/dist/server/flow-surfaces/field-binding-registry.js +391 -0
  47. package/dist/server/flow-surfaces/field-semantics.d.ts +1 -1
  48. package/dist/server/flow-surfaces/index.js +75 -0
  49. package/dist/server/flow-surfaces/node-use-sets.d.ts +15 -0
  50. package/dist/server/flow-surfaces/node-use-sets.js +114 -0
  51. package/dist/server/flow-surfaces/payload-shape.d.ts +9 -0
  52. package/dist/server/flow-surfaces/payload-shape.js +64 -0
  53. package/dist/server/flow-surfaces/placement.js +2 -6
  54. package/dist/server/flow-surfaces/planning/action-specs.d.ts +179 -0
  55. package/dist/server/flow-surfaces/planning/action-specs.js +190 -0
  56. package/dist/server/flow-surfaces/planning/compiler.d.ts +37 -0
  57. package/dist/server/flow-surfaces/planning/compiler.js +376 -0
  58. package/dist/server/flow-surfaces/planning/context.d.ts +30 -0
  59. package/dist/server/flow-surfaces/planning/context.js +139 -0
  60. package/dist/server/flow-surfaces/planning/created-keys.d.ts +34 -0
  61. package/dist/server/flow-surfaces/planning/created-keys.js +375 -0
  62. package/dist/server/flow-surfaces/planning/key-kind.d.ts +11 -0
  63. package/dist/server/flow-surfaces/planning/key-kind.js +86 -0
  64. package/dist/server/flow-surfaces/planning/key-persistence.d.ts +34 -0
  65. package/dist/server/flow-surfaces/planning/key-persistence.js +148 -0
  66. package/dist/server/flow-surfaces/planning/key-registry.d.ts +40 -0
  67. package/dist/server/flow-surfaces/planning/key-registry.js +206 -0
  68. package/dist/server/flow-surfaces/planning/runtime.d.ts +37 -0
  69. package/dist/server/flow-surfaces/planning/runtime.js +259 -0
  70. package/dist/server/flow-surfaces/planning/step-link.d.ts +14 -0
  71. package/dist/server/flow-surfaces/planning/step-link.js +104 -0
  72. package/dist/server/flow-surfaces/planning/types.d.ts +55 -0
  73. package/dist/server/flow-surfaces/planning/types.js +24 -0
  74. package/dist/server/flow-surfaces/reaction/errors.d.ts +20 -0
  75. package/dist/server/flow-surfaces/reaction/errors.js +69 -0
  76. package/dist/server/flow-surfaces/reaction/field-value.d.ts +34 -0
  77. package/dist/server/flow-surfaces/reaction/field-value.js +181 -0
  78. package/dist/server/flow-surfaces/reaction/fingerprint.d.ts +16 -0
  79. package/dist/server/flow-surfaces/reaction/fingerprint.js +71 -0
  80. package/dist/server/flow-surfaces/reaction/linkage.d.ts +136 -0
  81. package/dist/server/flow-surfaces/reaction/linkage.js +882 -0
  82. package/dist/server/flow-surfaces/reaction/meta.d.ts +11 -0
  83. package/dist/server/flow-surfaces/reaction/meta.js +451 -0
  84. package/dist/server/flow-surfaces/reaction/registry.d.ts +136 -0
  85. package/dist/server/flow-surfaces/reaction/registry.js +186 -0
  86. package/dist/server/flow-surfaces/reaction/resolver.d.ts +22 -0
  87. package/dist/server/flow-surfaces/reaction/resolver.js +202 -0
  88. package/dist/server/flow-surfaces/reaction/types.d.ts +241 -0
  89. package/dist/server/flow-surfaces/reaction/types.js +24 -0
  90. package/dist/server/flow-surfaces/reaction/utils.d.ts +17 -0
  91. package/dist/server/flow-surfaces/reaction/utils.js +67 -0
  92. package/dist/server/flow-surfaces/reaction/value-expr.d.ts +15 -0
  93. package/dist/server/flow-surfaces/reaction/value-expr.js +209 -0
  94. package/dist/server/flow-surfaces/reference-guards.d.ts +19 -0
  95. package/dist/server/flow-surfaces/reference-guards.js +103 -0
  96. package/dist/server/flow-surfaces/service-helpers.d.ts +42 -0
  97. package/dist/server/flow-surfaces/service-helpers.js +377 -0
  98. package/dist/server/flow-surfaces/service-utils.d.ts +105 -0
  99. package/dist/server/flow-surfaces/service-utils.js +760 -0
  100. package/dist/server/flow-surfaces/service.d.ts +189 -103
  101. package/dist/server/flow-surfaces/service.js +3975 -1770
  102. package/dist/server/flow-surfaces/template-compatibility.d.ts +42 -0
  103. package/dist/server/flow-surfaces/template-compatibility.js +189 -0
  104. package/dist/server/flow-surfaces/template-service-utils.d.ts +62 -0
  105. package/dist/server/flow-surfaces/template-service-utils.js +281 -0
  106. package/dist/server/flow-surfaces/types.d.ts +129 -37
  107. package/dist/swagger/flow-surfaces.d.ts +3773 -1581
  108. package/dist/swagger/flow-surfaces.examples.d.ts +1215 -0
  109. package/dist/swagger/flow-surfaces.examples.js +1363 -0
  110. package/dist/swagger/flow-surfaces.js +2209 -1684
  111. package/dist/swagger/flow-surfaces.template-action-docs.d.ts +62 -0
  112. package/dist/swagger/flow-surfaces.template-action-docs.js +121 -0
  113. package/dist/swagger/flow-surfaces.template-schemas.d.ts +239 -0
  114. package/dist/swagger/flow-surfaces.template-schemas.js +255 -0
  115. package/dist/swagger/index.d.ts +3773 -1581
  116. package/package.json +2 -2
@@ -30,6 +30,9 @@ __export(flow_surfaces_exports, {
30
30
  });
31
31
  module.exports = __toCommonJS(flow_surfaces_exports);
32
32
  var import_constants = require("../server/flow-surfaces/constants");
33
+ var import_flow_surfaces = require("./flow-surfaces.examples");
34
+ var import_flow_surfaces2 = require("./flow-surfaces.template-action-docs");
35
+ var import_flow_surfaces3 = require("./flow-surfaces.template-schemas");
33
36
  const FLOW_SURFACES_TAG = "flowSurfaces";
34
37
  const ANY_OBJECT_SCHEMA = {
35
38
  type: "object",
@@ -107,6 +110,24 @@ const RECORD_ACTION_TYPE_ENUM = [
107
110
  "delete",
108
111
  "updateRecord"
109
112
  ];
113
+ const APPLY_BLUEPRINT_BLOCK_TYPE_ENUM = [
114
+ "table",
115
+ "createForm",
116
+ "editForm",
117
+ "details",
118
+ "filterForm",
119
+ "list",
120
+ "gridCard",
121
+ "markdown",
122
+ "iframe",
123
+ "chart",
124
+ "actionPanel",
125
+ "jsBlock"
126
+ ];
127
+ const REACTION_FINGERPRINT_DESCRIPTION = "Optional optimistic-concurrency fingerprint from `getReactionMeta.capabilities[].fingerprint`. When provided, the write fails with HTTP 409 if the current slot fingerprint no longer matches.";
128
+ const REACTION_RULES_REPLACE_DESCRIPTION = "Full replacement payload for the resolved reaction slot. Pass `[]` to clear all rules from that slot.";
129
+ const REACTION_LOCALIZED_FORM_TARGET_DESCRIPTION = "Reaction write target. Use the live block/action uid for localized edits. For form field-value and form field-linkage writes, keep passing the outer form block uid; the backend resolves the inner form-grid slot automatically.";
130
+ const REACTION_OUTER_FORM_TARGET_NOTE = "Pass the outer form block uid, not the inner form-grid uid.";
110
131
  function ref(name) {
111
132
  return {
112
133
  $ref: `#/components/schemas/${name}`
@@ -175,1075 +196,244 @@ function valuesCompatibilityNote(description) {
175
196
  "The request schema in this Swagger document describes the final business payload, not the outer SDK `values` wrapper."
176
197
  ].join("\n");
177
198
  }
178
- const examples = {
179
- catalog: {
180
- target: {
181
- uid: "table-block-uid"
182
- }
183
- },
184
- context: {
185
- target: {
186
- uid: "details-block-uid"
187
- },
188
- path: "record",
189
- maxDepth: 3
190
- },
191
- compose: {
192
- target: {
193
- uid: "page-grid-uid"
194
- },
195
- mode: "append",
196
- blocks: [
197
- {
198
- key: "filter",
199
- type: "filterForm",
200
- resource: {
201
- dataSourceKey: "main",
202
- collectionName: "users"
203
- },
204
- fields: [
205
- {
206
- fieldPath: "username",
207
- target: "table"
208
- },
209
- {
210
- fieldPath: "nickname",
211
- target: "table"
212
- }
213
- ],
214
- actions: ["submit", "reset", "collapse"]
199
+ function buildReactionWriteRequestSchema(ruleSchemaName) {
200
+ return {
201
+ type: "object",
202
+ required: ["target", "rules"],
203
+ properties: {
204
+ target: {
205
+ allOf: [ref("FlowSurfaceWriteTarget")],
206
+ description: REACTION_LOCALIZED_FORM_TARGET_DESCRIPTION
215
207
  },
216
- {
217
- key: "table",
218
- type: "table",
219
- resource: {
220
- dataSourceKey: "main",
221
- collectionName: "users"
222
- },
223
- fields: ["username", "nickname", { fieldPath: "roles.title" }],
224
- actions: ["filter", "addNew", "refresh", "bulkDelete", "link"],
225
- recordActions: [
226
- "view",
227
- "edit",
228
- {
229
- type: "popup",
230
- popup: {
231
- mode: "replace",
232
- blocks: [
233
- {
234
- key: "details",
235
- type: "details",
236
- resource: {
237
- dataSourceKey: "main",
238
- collectionName: "users"
239
- },
240
- fields: ["username", "nickname"]
241
- }
242
- ]
243
- }
244
- },
245
- "updateRecord",
246
- "delete"
247
- ]
248
- }
249
- ],
250
- layout: {
251
- rows: [
252
- [
253
- {
254
- key: "filter",
255
- span: 3
256
- },
257
- {
258
- key: "table",
259
- span: 7
260
- }
261
- ]
262
- ]
263
- }
264
- },
265
- composeStatic: {
266
- target: {
267
- uid: "page-grid-uid"
268
- },
269
- blocks: [
270
- {
271
- key: "markdown",
272
- type: "markdown",
273
- settings: {
274
- content: "# Team handbook"
275
- }
208
+ rules: {
209
+ type: "array",
210
+ items: ref(ruleSchemaName),
211
+ description: REACTION_RULES_REPLACE_DESCRIPTION
276
212
  },
277
- {
278
- key: "iframe",
279
- type: "iframe",
280
- settings: {
281
- mode: "url",
282
- url: "https://example.com/embed",
283
- height: 360
284
- }
213
+ expectedFingerprint: {
214
+ type: "string",
215
+ description: REACTION_FINGERPRINT_DESCRIPTION
285
216
  },
286
- {
287
- key: "panel",
288
- type: "actionPanel",
289
- settings: {
290
- layout: "list",
291
- ellipsis: false
292
- }
293
- }
294
- ],
295
- layout: {
296
- rows: [["markdown", "iframe"], ["panel"]]
297
- }
298
- },
299
- composeListRich: {
300
- target: {
301
- uid: "page-grid-uid"
302
- },
303
- blocks: [
304
- {
305
- key: "employeesList",
306
- type: "list",
307
- resource: {
308
- dataSourceKey: "main",
309
- collectionName: "employees"
310
- },
311
- fields: [
312
- "nickname",
313
- {
314
- fieldPath: "department.name"
315
- }
316
- ],
317
- actions: ["addNew", "refresh"],
318
- recordActions: [
319
- "view",
320
- "edit",
321
- {
322
- type: "popup",
323
- popup: {
324
- mode: "replace",
325
- blocks: [
326
- {
327
- key: "details",
328
- type: "details",
329
- resource: {
330
- dataSourceKey: "main",
331
- collectionName: "employees"
332
- },
333
- fields: ["nickname"]
334
- }
335
- ]
336
- }
337
- },
338
- "delete"
339
- ],
340
- settings: {
341
- pageSize: 20,
342
- layout: "vertical"
343
- }
344
- }
345
- ]
346
- },
347
- composeGridCardRich: {
348
- target: {
349
- uid: "page-grid-uid"
350
- },
351
- blocks: [
352
- {
353
- key: "employeeCards",
354
- type: "gridCard",
355
- resource: {
356
- dataSourceKey: "main",
357
- collectionName: "employees"
358
- },
359
- fields: [
360
- "nickname",
361
- {
362
- fieldPath: "department.name"
363
- }
364
- ],
365
- actions: ["addNew", "refresh"],
366
- recordActions: ["view", "edit", "updateRecord", "delete"],
367
- settings: {
368
- columns: 3,
369
- rowCount: 2,
370
- layout: "vertical"
371
- }
372
- }
373
- ]
374
- },
375
- composeJsBlock: {
376
- target: {
377
- uid: "page-grid-uid"
378
- },
379
- blocks: [
380
- {
381
- key: "customHero",
382
- type: "jsBlock",
383
- settings: {
384
- title: "Custom hero",
385
- description: "Rendered by JS block runtime",
386
- className: "hero-shell",
387
- version: "1.0.0",
388
- code: "ctx.render('<div>Hello from JS block</div>');"
389
- }
390
- }
391
- ]
392
- },
393
- configure: {
394
- target: {
395
- uid: "details-field-uid"
396
- },
397
- changes: {
398
- clickToOpen: true,
399
- openView: {
400
- dataSourceKey: "main",
401
- collectionName: "departments",
402
- associationName: "users.department",
403
- mode: "drawer"
404
- }
405
- }
406
- },
407
- configureAssociationPopup: {
408
- target: {
409
- uid: "roles-field-wrapper-uid"
410
- },
411
- changes: {
412
- clickToOpen: true,
413
- openView: {
414
- dataSourceKey: "main",
415
- collectionName: "roles",
416
- associationName: "users.roles",
417
- mode: "drawer"
217
+ verify: {
218
+ type: "boolean",
219
+ description: "Reserved compatibility flag. Current v1 writes are full replace and return normalized output directly."
418
220
  }
419
- }
420
- },
421
- configureBlock: {
422
- target: {
423
- uid: "list-block-uid"
424
221
  },
425
- changes: {
426
- pageSize: 50,
427
- dataScope: {
428
- logic: "$and",
429
- items: [
430
- {
431
- path: "nickname",
432
- operator: "$eq",
433
- value: "beta"
434
- }
435
- ]
222
+ additionalProperties: false
223
+ };
224
+ }
225
+ function buildReactionWriteResultSchema(ruleSchemaName) {
226
+ return {
227
+ type: "object",
228
+ required: ["target", "resolvedScene", "resolvedSlot", "fingerprint", "normalizedRules", "canonicalRules"],
229
+ properties: {
230
+ target: {
231
+ allOf: [ref("FlowSurfaceReactionTargetSummary")],
232
+ description: "Resolved public reaction target after target normalization."
436
233
  },
437
- sorting: [
438
- {
439
- field: "username",
440
- direction: "asc"
234
+ resolvedScene: {
235
+ allOf: [ref("FlowSurfaceReactionScene")],
236
+ description: "Concrete reaction scene that the backend resolved for this write, such as `form`, `details`, `subForm`, `block`, or `action`."
237
+ },
238
+ resolvedSlot: {
239
+ allOf: [ref("FlowSurfaceReactionSlot")],
240
+ description: "Concrete persisted slot selected by the backend for this write."
241
+ },
242
+ fingerprint: {
243
+ type: "string",
244
+ description: "Fresh slot fingerprint after the write completes."
245
+ },
246
+ normalizedRules: {
247
+ type: "array",
248
+ items: ref(ruleSchemaName),
249
+ description: "Normalized public rules persisted by the write."
250
+ },
251
+ canonicalRules: {
252
+ type: "array",
253
+ items: ANY_OBJECT_SCHEMA,
254
+ description: "Canonical internal rules compiled from the normalized public rules."
255
+ },
256
+ updateAssociationValues: {
257
+ type: "array",
258
+ items: {
259
+ type: "string"
441
260
  }
442
- ],
443
- layout: "vertical"
444
- }
445
- },
446
- createMenu: {
447
- title: "Employees",
448
- type: "item",
449
- parentMenuRouteId: 1001
450
- },
451
- updateMenu: {
452
- menuRouteId: 1002,
453
- title: "Employees Center",
454
- parentMenuRouteId: null
455
- },
456
- configureAction: {
457
- target: {
458
- uid: "update-record-action-uid"
459
- },
460
- changes: {
461
- title: "Quick update",
462
- type: "primary",
463
- color: "gold",
464
- htmlType: "button",
465
- position: "end",
466
- confirm: {
467
- enable: true,
468
- title: "Confirm update",
469
- content: "Apply assigned values?"
470
- },
471
- assignValues: {
472
- status: "active"
473
261
  }
474
- }
475
- },
476
- configureJsBlock: {
477
- target: {
478
- uid: "js-block-uid"
479
- },
480
- changes: {
481
- title: "Users hero",
482
- description: "Rendered from FlowSurfaces configure",
483
- className: "users-hero",
484
- version: "1.0.1",
485
- code: "ctx.render('<div>Users hero</div>');"
486
- }
487
- },
488
- configureJsAction: {
489
- target: {
490
- uid: "js-action-uid"
491
262
  },
492
- changes: {
493
- title: "Run diagnostics",
494
- type: "primary",
495
- version: "1.0.1",
496
- code: `await ctx.runjs('console.log("diagnostics")');`
497
- }
498
- },
499
- configureJsItemAction: {
500
- target: {
501
- uid: "js-item-action-uid"
502
- },
503
- changes: {
504
- title: "Run item diagnostics",
505
- type: "default",
506
- version: "1.0.1",
507
- code: `await ctx.runjs('console.log("item diagnostics")');`
508
- }
509
- },
510
- configureJsField: {
511
- target: {
512
- uid: "js-field-wrapper-uid"
263
+ additionalProperties: false
264
+ };
265
+ }
266
+ function buildReactionCapabilitySchema(kind, ruleSchemaName, extraProperties = {}) {
267
+ return {
268
+ type: "object",
269
+ required: ["kind", "resolvedScene", "resolvedSlot", "fingerprint", "normalizedRules", "canonicalRules", "context"],
270
+ properties: {
271
+ kind: {
272
+ type: "string",
273
+ enum: [kind]
274
+ },
275
+ resolvedScene: ref("FlowSurfaceReactionScene"),
276
+ resolvedSlot: ref("FlowSurfaceReactionSlot"),
277
+ fingerprint: {
278
+ type: "string"
279
+ },
280
+ normalizedRules: {
281
+ type: "array",
282
+ items: ref(ruleSchemaName)
283
+ },
284
+ canonicalRules: {
285
+ type: "array",
286
+ items: ANY_OBJECT_SCHEMA
287
+ },
288
+ context: ref("FlowSurfaceContextResponse"),
289
+ ...extraProperties
513
290
  },
514
- changes: {
515
- label: "Custom renderer",
516
- version: "1.0.1",
517
- code: "ctx.render(String(ctx.record?.nickname?.toUpperCase?.() || ''));"
518
- }
291
+ additionalProperties: false
292
+ };
293
+ }
294
+ const FLOW_SURFACES_READ_ACL_NOTE = "Read actions (`get` / `describeSurface` / `catalog` / `context` / `getReactionMeta` / `listTemplates` / `getTemplate`) are open to `loggedIn` by default. Write actions still require the `ui.flowSurfaces` snippet.";
295
+ const templateActionDocs = (0, import_flow_surfaces2.createFlowSurfaceTemplateActionDocs)({
296
+ tag: FLOW_SURFACES_TAG,
297
+ readAclNote: FLOW_SURFACES_READ_ACL_NOTE,
298
+ requestBody,
299
+ responses,
300
+ valuesCompatibilityNote
301
+ });
302
+ const templateSchemas = (0, import_flow_surfaces3.createFlowSurfaceTemplateSchemas)({
303
+ ref,
304
+ stringOrIntegerSchema: STRING_OR_INTEGER_SCHEMA,
305
+ actionTypeEnum: ACTION_TYPE_ENUM
306
+ });
307
+ const actionDocs = {
308
+ catalog: {
309
+ tags: [FLOW_SURFACES_TAG],
310
+ summary: "List capabilities available in the current surface context",
311
+ description: valuesCompatibilityNote(
312
+ `Returns the block / field / action capabilities that can be created under the current target context, together with the recommended \`configureOptions\`, the underlying settings contract, event capabilities, and layout capabilities for the current node. The returned \`blocks[] / actions[] / recordActions[]\` only represent the truly available public capabilities under plugins enabled in the current instance. When \`sections\` is omitted, the server smart-selects the sections for the current target scenario, and clients should treat \`selectedSections\` in the response as the final authoritative result. For advanced field-value or linkage authoring, prefer \`getReactionMeta\` + \`set*Rules\` instead of guessing raw \`configureOptions\` keys. ${FLOW_SURFACES_READ_ACL_NOTE}`
313
+ ),
314
+ requestBody: requestBody("FlowSurfaceCatalogRequest", import_flow_surfaces.flowSurfaceExamples.catalog),
315
+ responses: responses("FlowSurfaceCatalogResponse")
519
316
  },
520
- configureJsColumn: {
521
- target: {
522
- uid: "js-column-uid"
523
- },
524
- changes: {
525
- title: "JS column",
526
- width: 240,
527
- fixed: "left",
528
- version: "1.0.1",
529
- code: "ctx.render(String(ctx.record?.username || ''));"
530
- }
317
+ context: {
318
+ tags: [FLOW_SURFACES_TAG],
319
+ summary: "Read ctx variable tree available under the current target",
320
+ description: valuesCompatibilityNote(
321
+ `Returns the low-level \`ctx\` variable tree available under the current target. \`path\` only accepts bare paths such as \`record\`, \`popup.record\`, and \`item.parentItem.value\`. Do not pass \`ctx.record\` or \`{{ ctx.record }}\`. For reaction authoring, use \`getReactionMeta\` as the main discovery endpoint first and use \`context\` only as a lower-level supplement when you need to inspect raw variable paths. ${FLOW_SURFACES_READ_ACL_NOTE}`
322
+ ),
323
+ requestBody: requestBody("FlowSurfaceContextRequest", import_flow_surfaces.flowSurfaceExamples.context),
324
+ responses: responses("FlowSurfaceContextResponse")
531
325
  },
532
- configureJsItem: {
533
- target: {
534
- uid: "js-item-uid"
535
- },
536
- changes: {
537
- label: "JS item",
538
- showLabel: true,
539
- labelWidth: 120,
540
- version: "1.0.1",
541
- code: "ctx.render(String(ctx.record?.nickname || ''));"
542
- }
326
+ getReactionMeta: {
327
+ tags: [FLOW_SURFACES_TAG],
328
+ summary: "Read reaction capabilities, current rules, and contextual authoring metadata",
329
+ description: valuesCompatibilityNote(
330
+ `Returns the current advanced reaction capabilities for the target, including resolved scene/slot, normalized rules, canonical rules, available \`targetFields\`, \`supportedActions\`, and \`conditionMeta\` / \`valueExprMeta\` authoring metadata. This is the main discovery endpoint for CLI or AI callers before configuring field values or linkage rules. For form \`fieldValue\` / \`fieldLinkage\` authoring, callers still pass the outer form block uid; the backend resolves the concrete form-grid slot automatically. Use \`context\` only as a supplement when you need to inspect the raw variable tree behind the returned metadata. ${FLOW_SURFACES_READ_ACL_NOTE}`
331
+ ),
332
+ requestBody: requestBody("FlowSurfaceGetReactionMetaRequest", import_flow_surfaces.flowSurfaceExamples.getReactionMeta),
333
+ responses: responses("FlowSurfaceGetReactionMetaResult")
543
334
  },
544
- configurePage: {
545
- target: {
546
- uid: "employees-page-uid"
547
- },
548
- changes: {
549
- icon: "UserOutlined",
550
- enableHeader: false
551
- }
335
+ setFieldValueRules: {
336
+ tags: [FLOW_SURFACES_TAG],
337
+ summary: "Replace field value rules on a create/edit form block",
338
+ description: valuesCompatibilityNote(
339
+ `Fully replaces the field-value slot on the target form block. ${REACTION_OUTER_FORM_TARGET_NOTE} \`rules: []\` clears the slot. \`expectedFingerprint\` should usually come from \`getReactionMeta.capabilities[].fingerprint\` and enables optimistic concurrency against the current slot state.`
340
+ ),
341
+ requestBody: requestBody("FlowSurfaceSetFieldValueRulesRequest", import_flow_surfaces.flowSurfaceExamples.setFieldValueRules),
342
+ responses: responses("FlowSurfaceSetFieldValueRulesResult")
552
343
  },
553
- configureTableAdvanced: {
554
- target: {
555
- uid: "tree-table-block-uid"
556
- },
557
- changes: {
558
- quickEdit: true,
559
- treeTable: true,
560
- defaultExpandAllRows: true,
561
- dragSort: true,
562
- dragSortBy: "sort"
563
- }
344
+ setBlockLinkageRules: {
345
+ tags: [FLOW_SURFACES_TAG],
346
+ summary: "Replace block-level linkage rules on a supported block",
347
+ description: valuesCompatibilityNote(
348
+ "Fully replaces the block-linkage slot on the target block. `rules: []` clears the slot. `expectedFingerprint` should usually come from `getReactionMeta.capabilities[].fingerprint` and enables optimistic concurrency against the current slot state."
349
+ ),
350
+ requestBody: requestBody("FlowSurfaceSetBlockLinkageRulesRequest", import_flow_surfaces.flowSurfaceExamples.setBlockLinkageRules),
351
+ responses: responses("FlowSurfaceSetBlockLinkageRulesResult")
564
352
  },
565
- configureEditForm: {
566
- target: {
567
- uid: "edit-form-block-uid"
568
- },
569
- changes: {
570
- colon: false,
571
- dataScope: {
572
- logic: "$and",
573
- items: [
574
- {
575
- path: "status",
576
- operator: "$eq",
577
- value: "draft"
578
- }
579
- ]
580
- }
581
- }
353
+ setFieldLinkageRules: {
354
+ tags: [FLOW_SURFACES_TAG],
355
+ summary: "Replace field-level linkage rules on a supported form/details/sub-form target",
356
+ description: valuesCompatibilityNote(
357
+ "Fully replaces the field-linkage slot on the target. The backend resolves the concrete scene automatically (`form`, `details`, or `subForm`) and returns it in `resolvedScene` / `resolvedSlot`. Supported actions are surfaced by `getReactionMeta`, commonly including `setFieldState`, `assignField`, and scene-specific defaults. For form scenes, keep passing the outer form block uid and let the backend resolve the inner grid slot. `expectedFingerprint` should usually come from `getReactionMeta.capabilities[].fingerprint`."
358
+ ),
359
+ requestBody: requestBody("FlowSurfaceSetFieldLinkageRulesRequest", import_flow_surfaces.flowSurfaceExamples.setFieldLinkageRules),
360
+ responses: responses("FlowSurfaceSetFieldLinkageRulesResult")
582
361
  },
583
- configureDetails: {
584
- target: {
585
- uid: "details-block-uid"
586
- },
587
- changes: {
588
- colon: true,
589
- linkageRules: [
590
- {
591
- when: {
592
- path: "status",
593
- operator: "$eq",
594
- value: "archived"
595
- },
596
- set: {
597
- hidden: true
598
- }
599
- }
600
- ]
601
- }
362
+ setActionLinkageRules: {
363
+ tags: [FLOW_SURFACES_TAG],
364
+ summary: "Replace action-level linkage rules on a supported action",
365
+ description: valuesCompatibilityNote(
366
+ "Fully replaces the action-linkage slot on the target action. `rules: []` clears the slot. `expectedFingerprint` should usually come from `getReactionMeta.capabilities[].fingerprint` and enables optimistic concurrency against the current slot state."
367
+ ),
368
+ requestBody: requestBody("FlowSurfaceSetActionLinkageRulesRequest", import_flow_surfaces.flowSurfaceExamples.setActionLinkageRules),
369
+ responses: responses("FlowSurfaceSetActionLinkageRulesResult")
602
370
  },
603
- composePopupCurrentRecord: {
604
- target: {
605
- uid: "view-action-uid"
606
- },
607
- mode: "replace",
608
- blocks: [
609
- {
610
- key: "details",
611
- type: "details",
612
- resource: {
613
- binding: "currentRecord"
614
- },
615
- fields: ["nickname", "department.title"]
616
- }
617
- ]
371
+ get: {
372
+ tags: [FLOW_SURFACES_TAG],
373
+ summary: "Read normalized surface tree and route metadata",
374
+ description: [
375
+ "Reads the normalized Flow surface readback result as the stable read endpoint for CLI and orchestration tools.",
376
+ "",
377
+ "Only root-level locator fields are accepted. Exactly one of the following four fields must be used as the locator.",
378
+ "Do not wrap the payload with `{ target: { ... } }`.",
379
+ "Do not wrap the payload with `{ values: { ... } }`.",
380
+ FLOW_SURFACES_READ_ACL_NOTE,
381
+ "The `target` in the response only keeps lightweight locator information. Read the full node tree from `tree`.",
382
+ "Tabs for route-backed pages are always read from `tree.subModels.tabs`. Top-level `tabs` / `tabTrees` are no longer returned separately.",
383
+ "",
384
+ `Example: GET /api/flowSurfaces:get?uid=${import_flow_surfaces.flowSurfaceExamples.getPopupQuery.uid}`,
385
+ `Example: GET /api/flowSurfaces:get?pageSchemaUid=${import_flow_surfaces.flowSurfaceExamples.getPageQuery.pageSchemaUid}`
386
+ ].join("\n"),
387
+ parameters: [
388
+ parameterRef("flowSurfaceTargetUid"),
389
+ parameterRef("flowSurfaceTargetPageSchemaUid"),
390
+ parameterRef("flowSurfaceTargetTabSchemaUid"),
391
+ parameterRef("flowSurfaceTargetRouteId")
392
+ ],
393
+ responses: responses("FlowSurfaceGetResponse")
618
394
  },
619
- composePopupAssociatedRecords: {
620
- target: {
621
- uid: "association-popup-action-uid"
622
- },
623
- mode: "replace",
624
- blocks: [
625
- {
626
- key: "employees",
627
- type: "table",
628
- resource: {
629
- binding: "associatedRecords",
630
- associationField: "employee"
631
- },
632
- fields: ["nickname", "status"],
633
- actions: ["refresh"],
634
- recordActions: ["view", "edit"]
635
- }
636
- ]
395
+ describeSurface: {
396
+ tags: [FLOW_SURFACES_TAG],
397
+ summary: "Read surface tree with stable keys and fingerprint",
398
+ description: valuesCompatibilityNote(
399
+ `Reads the current surface together with request-scoped bind keys, persisted declared keys, and an optimistic-concurrency fingerprint. The fingerprint is computed from the public surface tree together with the resolved key bindings and ignores key source differences such as \`request\` vs \`declared\`. The public readback strips the internal declared-key metadata path from node.stepParams. ${FLOW_SURFACES_READ_ACL_NOTE}`
400
+ ),
401
+ requestBody: requestBody("FlowSurfaceDescribeSurfaceRequest", import_flow_surfaces.flowSurfaceExamples.describeSurface),
402
+ responses: responses("FlowSurfaceDescribeSurfaceResponse")
637
403
  },
638
- configureActionModes: {
639
- target: {
640
- uid: "compose-email-action-uid"
641
- },
642
- changes: {
643
- linkageRules: [
644
- {
645
- when: {
646
- path: "status",
647
- operator: "$eq",
648
- value: "draft"
649
- },
650
- set: {
651
- disabled: true
404
+ applyBlueprint: {
405
+ tags: [FLOW_SURFACES_TAG],
406
+ summary: "Apply a page blueprint to create or replace one Modern page",
407
+ description: valuesCompatibilityNote(
408
+ 'Accepts one simplified JSON page blueprint and compiles it to internal flow-surface operations. The public blueprint describes page structure (`create` or `replace`, page metadata, ordered tabs, blocks, fields, actions, inline popups, optional reusable assets) and optional top-level `reaction.items[]` for whole-page interaction authoring. Each reaction item targets an explicit local key / bind key produced by the same blueprint run. Only explicitly listed reaction items are written. `rules: []` clears the targeted slot. Repeating the same `(type, target)` reaction slot in one blueprint is invalid. In `replace`, reaction targets always bind to the newly produced blueprint result, not historical nodes from the previous page version; if a slot must exist in the resulting surface, include it explicitly instead of relying on omission. Localized reaction edits on an existing surface should use `getReactionMeta` + `set*Rules` instead of applying a whole page blueprint again. The request body is that page-document JSON object itself and must not be JSON-stringified. Wrong: `{ "requestBody": "{\\"version\\":\\"1\\"}" }`. Internal planning details stay hidden. In `create`, `navigation.group.routeId` is the preferred way to target an existing menu group. It is exact-targeting only and cannot be mixed with existing-group metadata such as `icon`, `tooltip`, or `hideInMenu`; applyBlueprint create mode does not mutate existing group metadata, so callers should use `updateMenu` separately when that is required. When only `navigation.group.title` is provided, applyBlueprint reuses one existing same-title group when it is unique, creates a new group when none exists, and rejects ambiguous multi-match cases. Same-title reuse is title-only; if an existing group\'s metadata must change, use low-level `updateMenu` instead of applyBlueprint create. `replace` uses `target.pageSchemaUid`, updates only the explicit page-level fields provided in `page`, maps blueprint tabs to existing route-backed tab slots by index, rewrites each slot in order, removes trailing old tabs, and appends extra new tabs when needed. Tab and block keys are optional in the public blueprint; omit them unless custom layout or cross-block targeting needs a stable in-document identifier. `layout` is only allowed on tabs and inline popup documents; blocks themselves do not accept a `layout` property. Public applyBlueprint blocks do not support generic `form`; use `editForm` or `createForm`. Custom `edit` popups that provide `popup.blocks` must include exactly one `editForm` block; that `editForm` may omit `resource` and then inherits the opener\'s current-record context. When layout is omitted, applyBlueprint auto-generates a simple top-to-bottom layout. When a `replace` run expands a page to multiple tabs while the current page still has `enableTabs=false`, callers must set `page.enableTabs=true` explicitly. The response hides execution internals and returns only the resolved page target and final surface readback.'
409
+ ),
410
+ requestBody: {
411
+ required: true,
412
+ description: "The JSON request body. Send the page document object itself under requestBody as an object; do not JSON.stringify it and do not wrap it in { values: ... }.",
413
+ content: {
414
+ "application/json": {
415
+ schema: ref("FlowSurfaceApplyBlueprintRequest"),
416
+ examples: {
417
+ createPage: {
418
+ summary: "Create one Modern page from a page blueprint",
419
+ value: import_flow_surfaces.flowSurfaceExamples.applyBlueprint
420
+ },
421
+ replacePage: {
422
+ summary: "Replace one existing Modern page by pageSchemaUid",
423
+ value: import_flow_surfaces.flowSurfaceExamples.applyBlueprintReplace
424
+ }
652
425
  }
653
426
  }
654
- ],
655
- editMode: "drawer",
656
- updateMode: "overwrite",
657
- duplicateMode: "popup",
658
- collapsedRows: 2,
659
- defaultCollapsed: true,
660
- emailFieldNames: ["email", "backupEmail"],
661
- defaultSelectAllRecords: true
662
- }
663
- },
664
- createPage: {
665
- menuRouteId: 1002,
666
- title: "Employees",
667
- tabTitle: "Overview",
668
- enableTabs: true,
669
- displayTitle: true,
670
- documentTitle: "Employees workspace",
671
- tabDocumentTitle: "Employees overview"
672
- },
673
- addTab: {
674
- target: {
675
- uid: "employees-page-uid"
676
- },
677
- title: "Details",
678
- icon: "TableOutlined",
679
- documentTitle: "Employee details tab"
680
- },
681
- updateTab: {
682
- target: {
683
- uid: "details-tab-schema"
684
- },
685
- title: "Details",
686
- icon: "TableOutlined",
687
- documentTitle: "Employee details tab",
688
- flowRegistry: {
689
- beforeRenderApply: {
690
- key: "beforeRenderApply",
691
- on: "beforeRender",
692
- steps: {}
693
427
  }
694
- }
695
- },
696
- addPopupTab: {
697
- target: {
698
- uid: "view-action-popup-page-uid"
699
428
  },
700
- title: "Popup details",
701
- icon: "TableOutlined",
702
- documentTitle: "Popup details tab"
703
- },
704
- updatePopupTab: {
705
- target: {
706
- uid: "popup-secondary-tab-uid"
707
- },
708
- title: "Popup details updated",
709
- icon: "AppstoreOutlined",
710
- documentTitle: "Popup details updated tab",
711
- flowRegistry: {
712
- beforeRenderApply: {
713
- key: "beforeRenderApply",
714
- on: "beforeRender",
715
- steps: {}
716
- }
717
- }
718
- },
719
- movePopupTab: {
720
- sourceUid: "popup-secondary-tab-uid",
721
- targetUid: "popup-primary-tab-uid",
722
- position: "before"
723
- },
724
- removePopupTab: {
725
- target: {
726
- uid: "popup-secondary-tab-uid"
727
- }
728
- },
729
- addBlock: {
730
- target: {
731
- uid: "view-action-uid"
732
- },
733
- type: "details",
734
- resource: {
735
- binding: "currentRecord"
736
- }
737
- },
738
- addPopupAssociatedBlock: {
739
- target: {
740
- uid: "association-popup-action-uid"
741
- },
742
- type: "table",
743
- resource: {
744
- binding: "associatedRecords",
745
- associationField: "employee"
746
- }
747
- },
748
- addPopupOtherRecordsBlock: {
749
- target: {
750
- uid: "popup-action-uid"
751
- },
752
- type: "table",
753
- resource: {
754
- binding: "otherRecords",
755
- dataSourceKey: "main",
756
- collectionName: "departments"
757
- }
758
- },
759
- addJsBlock: {
760
- target: {
761
- uid: "page-grid-uid"
762
- },
763
- type: "jsBlock",
764
- settings: {
765
- title: "Users banner",
766
- description: "Custom JS rendered banner",
767
- version: "1.0.0",
768
- code: "ctx.render('<div>Users banner</div>');"
769
- }
770
- },
771
- addField: {
772
- target: {
773
- uid: "create-form-block-uid"
774
- },
775
- fieldPath: "nickname",
776
- renderer: "js",
777
- settings: {
778
- label: "Nickname (JS)",
779
- code: "ctx.render(String(ctx.value?.toUpperCase?.() || ctx.value || ''));",
780
- version: "1.0.0"
781
- }
782
- },
783
- addAssociationField: {
784
- target: {
785
- uid: "table-block-uid"
786
- },
787
- fieldPath: "title",
788
- associationPathName: "department",
789
- settings: {
790
- title: "Department title",
791
- width: 240
792
- },
793
- popup: {
794
- mode: "replace",
795
- blocks: [
796
- {
797
- key: "departmentDetails",
798
- type: "details",
799
- resource: {
800
- binding: "currentRecord"
801
- },
802
- fields: ["title", "manager.nickname"]
803
- }
804
- ]
805
- }
806
- },
807
- addJsColumn: {
808
- target: {
809
- uid: "table-block-uid"
810
- },
811
- type: "jsColumn",
812
- settings: {
813
- title: "Runtime column",
814
- width: 240,
815
- version: "1.0.0",
816
- code: "ctx.render(String(ctx.record?.nickname || ''));"
817
- }
818
- },
819
- addJsItem: {
820
- target: {
821
- uid: "create-form-grid-uid"
822
- },
823
- type: "jsItem",
824
- settings: {
825
- label: "Runtime item",
826
- showLabel: true,
827
- version: "1.0.0",
828
- code: "ctx.render(String(ctx.record?.nickname || ''));"
829
- }
830
- },
831
- addAction: {
832
- target: {
833
- uid: "filter-form-block-uid"
834
- },
835
- type: "submit",
836
- settings: {
837
- title: "Apply filters",
838
- confirm: false
839
- }
840
- },
841
- addLinkAction: {
842
- target: {
843
- uid: "table-block-uid"
844
- },
845
- type: "link",
846
- settings: {
847
- title: "Open docs"
848
- }
849
- },
850
- addJsAction: {
851
- target: {
852
- uid: "action-panel-uid"
853
- },
854
- type: "js",
855
- settings: {
856
- title: "Run JS",
857
- type: "primary",
858
- version: "1.0.0",
859
- code: `await ctx.runjs('console.log("hello")');`
860
- }
861
- },
862
- addJsItemAction: {
863
- target: {
864
- uid: "create-form-uid"
865
- },
866
- type: "jsItem",
867
- settings: {
868
- title: "Run item JS",
869
- type: "default",
870
- version: "1.0.0",
871
- code: `await ctx.runjs('console.log("item")');`
872
- }
873
- },
874
- addRecordAction: {
875
- target: {
876
- uid: "table-block-uid"
877
- },
878
- type: "view",
879
- settings: {
880
- title: "View user",
881
- openView: {
882
- dataSourceKey: "main",
883
- collectionName: "users",
884
- mode: "drawer"
885
- }
886
- },
887
- popup: {
888
- mode: "replace",
889
- blocks: [
890
- {
891
- key: "details",
892
- type: "details",
893
- resource: {
894
- dataSourceKey: "main",
895
- collectionName: "users"
896
- },
897
- fields: ["username", "nickname"]
898
- }
899
- ]
900
- }
901
- },
902
- addRecordJsAction: {
903
- target: {
904
- uid: "details-block-uid"
905
- },
906
- type: "js",
907
- settings: {
908
- title: "Inspect record",
909
- type: "default",
910
- version: "1.0.0",
911
- code: "return currentRecord?.id;"
912
- }
913
- },
914
- addBlocks: {
915
- target: {
916
- uid: "page-grid-uid"
917
- },
918
- blocks: [
919
- {
920
- key: "usersTable",
921
- type: "table",
922
- resourceInit: {
923
- dataSourceKey: "main",
924
- collectionName: "users"
925
- },
926
- settings: {
927
- title: "Users table",
928
- pageSize: 50
929
- }
930
- },
931
- {
932
- key: "teamNotes",
933
- type: "markdown",
934
- settings: {
935
- content: "# Team notes"
936
- }
937
- }
938
- ]
939
- },
940
- addFields: {
941
- target: {
942
- uid: "table-block-uid"
943
- },
944
- fields: [
945
- {
946
- key: "username",
947
- fieldPath: "username",
948
- settings: {
949
- title: "User name",
950
- width: 220
951
- },
952
- popup: {
953
- mode: "replace",
954
- blocks: [
955
- {
956
- key: "details",
957
- type: "details",
958
- resource: {
959
- binding: "currentRecord"
960
- },
961
- fields: ["username", "nickname"]
962
- }
963
- ]
964
- }
965
- },
966
- {
967
- key: "nickname",
968
- fieldPath: "nickname",
969
- renderer: "js",
970
- settings: {
971
- label: "Nickname (JS)",
972
- code: "return value;",
973
- version: "1.0.0"
974
- }
975
- }
976
- ]
977
- },
978
- addActions: {
979
- target: {
980
- uid: "filter-form-block-uid"
981
- },
982
- actions: [
983
- {
984
- key: "submit",
985
- type: "submit",
986
- settings: {
987
- title: "Search",
988
- confirm: false
989
- }
990
- },
991
- {
992
- key: "reset",
993
- type: "reset",
994
- settings: {
995
- title: "Reset filters"
996
- }
997
- }
998
- ]
999
- },
1000
- addRecordActions: {
1001
- target: {
1002
- uid: "table-block-uid"
1003
- },
1004
- recordActions: [
1005
- {
1006
- key: "view",
1007
- type: "view",
1008
- settings: {
1009
- title: "View user",
1010
- openView: {
1011
- dataSourceKey: "main",
1012
- collectionName: "users",
1013
- mode: "drawer"
1014
- }
1015
- },
1016
- popup: {
1017
- mode: "replace",
1018
- blocks: [
1019
- {
1020
- key: "details",
1021
- type: "details",
1022
- resource: {
1023
- dataSourceKey: "main",
1024
- collectionName: "users"
1025
- },
1026
- fields: ["username"]
1027
- }
1028
- ]
1029
- }
1030
- },
1031
- {
1032
- key: "edit",
1033
- type: "edit",
1034
- settings: {
1035
- title: "Edit user"
1036
- }
1037
- },
1038
- {
1039
- key: "delete",
1040
- type: "delete",
1041
- settings: {
1042
- title: "Delete user"
1043
- }
1044
- }
1045
- ]
1046
- },
1047
- updateSettings: {
1048
- target: {
1049
- uid: "table-block-uid"
1050
- },
1051
- stepParams: {
1052
- tableSettings: {
1053
- pageSize: {
1054
- pageSize: 50
1055
- },
1056
- tableDensity: {
1057
- size: "middle"
1058
- }
1059
- }
1060
- },
1061
- flowRegistry: {
1062
- beforeRenderApply: {
1063
- key: "beforeRenderApply",
1064
- on: "beforeRender",
1065
- steps: {}
1066
- }
1067
- }
1068
- },
1069
- setEventFlows: {
1070
- target: {
1071
- uid: "view-action-uid"
1072
- },
1073
- flowRegistry: {
1074
- popupSettings: {
1075
- key: "popupSettings",
1076
- on: "click",
1077
- steps: {
1078
- openView: {
1079
- params: {
1080
- title: "Employee details",
1081
- size: "large"
1082
- }
1083
- }
1084
- }
1085
- }
1086
- }
1087
- },
1088
- setLayout: {
1089
- target: {
1090
- uid: "page-grid-uid"
1091
- },
1092
- rows: {
1093
- row1: [["block-a"], ["block-b"]]
1094
- },
1095
- sizes: {
1096
- row1: [12, 12]
1097
- },
1098
- rowOrder: ["row1"]
1099
- },
1100
- moveNode: {
1101
- sourceUid: "block-b",
1102
- targetUid: "block-a",
1103
- position: "before"
1104
- },
1105
- removeNode: {
1106
- target: {
1107
- uid: "obsolete-block-uid"
1108
- }
1109
- },
1110
- mutate: {
1111
- atomic: true,
1112
- ops: [
1113
- {
1114
- opId: "menu",
1115
- type: "createMenu",
1116
- values: {
1117
- title: "Employees",
1118
- type: "item"
1119
- }
1120
- },
1121
- {
1122
- opId: "page",
1123
- type: "createPage",
1124
- values: {
1125
- menuRouteId: {
1126
- ref: "menu.routeId"
1127
- },
1128
- tabTitle: "Overview"
1129
- }
1130
- },
1131
- {
1132
- opId: "table",
1133
- type: "addBlock",
1134
- values: {
1135
- target: {
1136
- uid: {
1137
- ref: "page.tabSchemaUid"
1138
- }
1139
- },
1140
- type: "table",
1141
- resourceInit: {
1142
- dataSourceKey: "main",
1143
- collectionName: "employees"
1144
- }
1145
- }
1146
- },
1147
- {
1148
- type: "addField",
1149
- values: {
1150
- target: {
1151
- uid: {
1152
- ref: "table.uid"
1153
- }
1154
- },
1155
- fieldPath: "nickname"
1156
- }
1157
- }
1158
- ]
1159
- },
1160
- apply: {
1161
- target: {
1162
- uid: "page-grid-uid"
1163
- },
1164
- mode: "replace",
1165
- spec: {
1166
- subModels: {
1167
- items: [
1168
- {
1169
- clientKey: "table-a",
1170
- use: "TableBlockModel",
1171
- stepParams: {
1172
- resourceSettings: {
1173
- init: {
1174
- dataSourceKey: "main",
1175
- collectionName: "employees"
1176
- }
1177
- }
1178
- }
1179
- },
1180
- {
1181
- clientKey: "markdown-a",
1182
- use: "MarkdownBlockModel",
1183
- props: {
1184
- content: "Employee handbook"
1185
- }
1186
- }
1187
- ]
1188
- }
1189
- }
1190
- },
1191
- getPopupQuery: {
1192
- uid: "view-action-uid"
1193
- },
1194
- getPageQuery: {
1195
- pageSchemaUid: "employees-page-schema"
1196
- }
1197
- };
1198
- const FLOW_SURFACES_READ_ACL_NOTE = "Read actions (`get` / `catalog` / `context`) are open to `loggedIn` by default. Write actions still require the `ui.flowSurfaces` snippet.";
1199
- const actionDocs = {
1200
- catalog: {
1201
- tags: [FLOW_SURFACES_TAG],
1202
- summary: "List capabilities available in the current surface context",
1203
- description: valuesCompatibilityNote(
1204
- `Returns the block / field / action capabilities that can be created under the current target context, together with the recommended \`configureOptions\`, the underlying settings contract, event capabilities, and layout capabilities for the current node. The returned \`blocks[] / actions[] / recordActions[]\` only represent the truly available public capabilities under plugins enabled in the current instance. ${FLOW_SURFACES_READ_ACL_NOTE}`
1205
- ),
1206
- requestBody: requestBody("FlowSurfaceCatalogRequest", examples.catalog),
1207
- responses: responses("FlowSurfaceCatalogResponse")
1208
- },
1209
- context: {
1210
- tags: [FLOW_SURFACES_TAG],
1211
- summary: "Read ctx variable tree available under the current target",
1212
- description: valuesCompatibilityNote(
1213
- `Returns the \`ctx\` variable tree available under the current target. \`path\` only accepts bare paths such as \`record\`, \`popup.record\`, and \`item.parentItem.value\`. Do not pass \`ctx.record\` or \`{{ ctx.record }}\`. ${FLOW_SURFACES_READ_ACL_NOTE}`
1214
- ),
1215
- requestBody: requestBody("FlowSurfaceContextRequest", examples.context),
1216
- responses: responses("FlowSurfaceContextResponse")
1217
- },
1218
- get: {
1219
- tags: [FLOW_SURFACES_TAG],
1220
- summary: "Read normalized surface tree and route metadata",
1221
- description: [
1222
- "Reads the normalized Flow surface readback result as the stable read endpoint for CLI and orchestration tools.",
1223
- "",
1224
- "Only root-level locator fields are accepted. Exactly one of the following four fields must be used as the locator.",
1225
- "Do not wrap the payload with `{ target: { ... } }`.",
1226
- "Do not wrap the payload with `{ values: { ... } }`.",
1227
- FLOW_SURFACES_READ_ACL_NOTE,
1228
- "The `target` in the response only keeps lightweight locator information. Read the full node tree from `tree`.",
1229
- "Tabs for route-backed pages are always read from `tree.subModels.tabs`. Top-level `tabs` / `tabTrees` are no longer returned separately.",
1230
- "",
1231
- `Example: GET /api/flowSurfaces:get?uid=${examples.getPopupQuery.uid}`,
1232
- `Example: GET /api/flowSurfaces:get?pageSchemaUid=${examples.getPageQuery.pageSchemaUid}`
1233
- ].join("\n"),
1234
- parameters: [
1235
- parameterRef("flowSurfaceTargetUid"),
1236
- parameterRef("flowSurfaceTargetPageSchemaUid"),
1237
- parameterRef("flowSurfaceTargetTabSchemaUid"),
1238
- parameterRef("flowSurfaceTargetRouteId")
1239
- ],
1240
- responses: responses("FlowSurfaceGetResponse")
429
+ responses: responses("FlowSurfaceApplyBlueprintResponse")
1241
430
  },
431
+ ...templateActionDocs,
1242
432
  compose: {
1243
433
  tags: [FLOW_SURFACES_TAG],
1244
434
  summary: "Compose blocks, fields, actions and simple layout under an existing surface",
1245
435
  description: valuesCompatibilityNote(
1246
- "Organizes content under an existing page/tab/grid/popup using the public block/action/field semantics. This is the preferred creation entry for AI callers. The caller does not need to pass raw `use`, `fieldUse`, or `stepParams`. For collection blocks under a popup, check `catalog.blocks[].resourceBindings` first. The `select / subForm / bulkEditForm` scene is currently recognized only, and popup collection block creation is not supported in that scene."
436
+ 'Organizes content under an existing page/tab/grid/popup using the public block/action/field semantics as a low-level building primitive. The caller does not need to pass raw `use`, `fieldUse`, or `stepParams`. Blocks, fields, and actions can declare stable `key` values, and the compose result returns the same keys so later orchestration can reference nested popup or form nodes deterministically. Blocks may be created from `template`, and form templates can set `template.usage="fields"` to import only their grid fields. Popup-capable actions and fields may reuse `popup.template`. For collection blocks under a popup, check `catalog.blocks[].resourceBindings` first. The `select / subForm / bulkEditForm` scene is currently recognized only, and popup collection block creation is not supported in that scene.'
1247
437
  ),
1248
438
  requestBody: {
1249
439
  required: true,
@@ -1253,31 +443,31 @@ const actionDocs = {
1253
443
  examples: {
1254
444
  filterTable: {
1255
445
  summary: "Compose a filter-form and table with block actions, record actions and a simple 3:7 row layout",
1256
- value: examples.compose
446
+ value: import_flow_surfaces.flowSurfaceExamples.compose
1257
447
  },
1258
448
  popupCurrentRecord: {
1259
449
  summary: "Compose a current-record details block under a record popup surface",
1260
- value: examples.composePopupCurrentRecord
450
+ value: import_flow_surfaces.flowSurfaceExamples.composePopupCurrentRecord
1261
451
  },
1262
452
  popupAssociatedRecords: {
1263
453
  summary: "Compose an associated-records table under an association-field popup surface",
1264
- value: examples.composePopupAssociatedRecords
454
+ value: import_flow_surfaces.flowSurfaceExamples.composePopupAssociatedRecords
1265
455
  },
1266
456
  staticBlocks: {
1267
457
  summary: "Compose markdown, iframe and action-panel blocks with simple settings",
1268
- value: examples.composeStatic
458
+ value: import_flow_surfaces.flowSurfaceExamples.composeStatic
1269
459
  },
1270
460
  listRich: {
1271
461
  summary: "Compose a list block with item fields, block actions and record actions",
1272
- value: examples.composeListRich
462
+ value: import_flow_surfaces.flowSurfaceExamples.composeListRich
1273
463
  },
1274
464
  gridCardRich: {
1275
465
  summary: "Compose a grid-card block with item fields, block actions and record actions",
1276
- value: examples.composeGridCardRich
466
+ value: import_flow_surfaces.flowSurfaceExamples.composeGridCardRich
1277
467
  },
1278
468
  jsBlock: {
1279
469
  summary: "Compose a JS block with simple code/version/title settings",
1280
- value: examples.composeJsBlock
470
+ value: import_flow_surfaces.flowSurfaceExamples.composeJsBlock
1281
471
  }
1282
472
  }
1283
473
  }
@@ -1289,7 +479,7 @@ const actionDocs = {
1289
479
  tags: [FLOW_SURFACES_TAG],
1290
480
  summary: "Apply simple semantic changes to a page, tab, block, field or action",
1291
481
  description: valuesCompatibilityNote(
1292
- "Uses simple `changes` to update high-frequency settings such as page/tab titles, table pageSize, field clickToOpen, and action openView/confirm without requiring the caller to know internal paths. Check `catalog(target).configureOptions` before calling this action."
482
+ "Uses simple `changes` to update high-frequency settings such as page/tab titles, table pageSize, field clickToOpen, and action openView/confirm without requiring the caller to know internal paths. For advanced reaction authoring, prefer `getReactionMeta` + `set*Rules`; the raw `assignRules` / `linkageRules` examples here are compatibility-only. Check `catalog.node.configureOptions` together with the relevant catalog item `configureOptions` before calling this action."
1293
483
  ),
1294
484
  requestBody: {
1295
485
  required: true,
@@ -1299,63 +489,63 @@ const actionDocs = {
1299
489
  examples: {
1300
490
  fieldOpenView: {
1301
491
  summary: "Configure a field to click and open a popup view",
1302
- value: examples.configure
492
+ value: import_flow_surfaces.flowSurfaceExamples.configure
1303
493
  },
1304
494
  associationFieldPopup: {
1305
495
  summary: "Configure a to-many association display field to open the clicked associated record in a popup",
1306
- value: examples.configureAssociationPopup
496
+ value: import_flow_surfaces.flowSurfaceExamples.configureAssociationPopup
1307
497
  },
1308
498
  blockSettings: {
1309
499
  summary: "Configure a list block with simple pageSize/dataScope/sorting/layout changes",
1310
- value: examples.configureBlock
500
+ value: import_flow_surfaces.flowSurfaceExamples.configureBlock
1311
501
  },
1312
502
  actionSettings: {
1313
503
  summary: "Configure an action with button appearance, confirm dialog and assign values",
1314
- value: examples.configureAction
504
+ value: import_flow_surfaces.flowSurfaceExamples.configureAction
1315
505
  },
1316
506
  jsBlockSettings: {
1317
507
  summary: "Configure a JS block with decorator props and runJs code/version",
1318
- value: examples.configureJsBlock
508
+ value: import_flow_surfaces.flowSurfaceExamples.configureJsBlock
1319
509
  },
1320
510
  jsActionSettings: {
1321
511
  summary: "Configure a JS action with button text and runJs code/version",
1322
- value: examples.configureJsAction
512
+ value: import_flow_surfaces.flowSurfaceExamples.configureJsAction
1323
513
  },
1324
514
  jsItemActionSettings: {
1325
515
  summary: "Configure a form JS item action with button text and runJs code/version",
1326
- value: examples.configureJsItemAction
516
+ value: import_flow_surfaces.flowSurfaceExamples.configureJsItemAction
1327
517
  },
1328
518
  jsFieldSettings: {
1329
519
  summary: "Configure a JS field wrapper and inner JS field with code/version",
1330
- value: examples.configureJsField
520
+ value: import_flow_surfaces.flowSurfaceExamples.configureJsField
1331
521
  },
1332
522
  jsColumnSettings: {
1333
523
  summary: "Configure a JS column with width/fixed/code/version",
1334
- value: examples.configureJsColumn
524
+ value: import_flow_surfaces.flowSurfaceExamples.configureJsColumn
1335
525
  },
1336
526
  jsItemSettings: {
1337
527
  summary: "Configure a JS item with label and runJs code/version",
1338
- value: examples.configureJsItem
528
+ value: import_flow_surfaces.flowSurfaceExamples.configureJsItem
1339
529
  },
1340
530
  pageHeaderSettings: {
1341
531
  summary: "Configure page icon and enableHeader using configureOptions",
1342
- value: examples.configurePage
532
+ value: import_flow_surfaces.flowSurfaceExamples.configurePage
1343
533
  },
1344
534
  tableAdvancedSettings: {
1345
535
  summary: "Configure advanced table simple keys such as quickEdit/treeTable/dragSort",
1346
- value: examples.configureTableAdvanced
536
+ value: import_flow_surfaces.flowSurfaceExamples.configureTableAdvanced
1347
537
  },
1348
538
  editFormSettings: {
1349
539
  summary: "Configure edit form colon and dataScope with a FilterGroup",
1350
- value: examples.configureEditForm
540
+ value: import_flow_surfaces.flowSurfaceExamples.configureEditForm
1351
541
  },
1352
- detailsSettings: {
1353
- summary: "Configure details colon and linkageRules",
1354
- value: examples.configureDetails
542
+ detailsCompatibilitySettings: {
543
+ summary: "Configure details colon and raw low-level linkageRules compatibility payload",
544
+ value: import_flow_surfaces.flowSurfaceExamples.configureDetailsCompatibility
1355
545
  },
1356
- actionBehaviorSettings: {
1357
- summary: "Configure action linkageRules, edit/update/duplicate modes, collapsed rows and email selection defaults",
1358
- value: examples.configureActionModes
546
+ actionBehaviorCompatibilitySettings: {
547
+ summary: "Configure action edit/update/duplicate modes plus raw low-level linkageRules compatibility payload",
548
+ value: import_flow_surfaces.flowSurfaceExamples.configureActionModesCompatibility
1359
549
  }
1360
550
  }
1361
551
  }
@@ -1369,7 +559,7 @@ const actionDocs = {
1369
559
  description: valuesCompatibilityNote(
1370
560
  'Creates a FlowSurfaces menu node. `type="group"` creates a menu group. `type="item"` creates a menu item that can be bound to a modern page (v2), and automatically fills in the flowPage route, the default hidden tab route, and the RootPageModel anchor.'
1371
561
  ),
1372
- requestBody: requestBody("FlowSurfaceCreateMenuRequest", examples.createMenu),
562
+ requestBody: requestBody("FlowSurfaceCreateMenuRequest", import_flow_surfaces.flowSurfaceExamples.createMenu),
1373
563
  responses: responses("FlowSurfaceCreateMenuResult")
1374
564
  },
1375
565
  updateMenu: {
@@ -1378,7 +568,7 @@ const actionDocs = {
1378
568
  description: valuesCompatibilityNote(
1379
569
  "Updates menu display information, or moves a group / item to the top level or under another group. Only `group` and `flowPage` menu nodes are supported."
1380
570
  ),
1381
- requestBody: requestBody("FlowSurfaceUpdateMenuRequest", examples.updateMenu),
571
+ requestBody: requestBody("FlowSurfaceUpdateMenuRequest", import_flow_surfaces.flowSurfaceExamples.updateMenu),
1382
572
  responses: responses("FlowSurfaceUpdateMenuResult")
1383
573
  },
1384
574
  createPage: {
@@ -1387,7 +577,7 @@ const actionDocs = {
1387
577
  description: valuesCompatibilityNote(
1388
578
  "Initializes a modern page (v2) for an existing bindable menu item through `menuRouteId` first, and fills in the default BlockGridModel. In compatibility mode, if `menuRouteId` is omitted, the old behavior still applies and a top-level menu plus page will be created automatically. Before initialization, do not call page/tab lifecycle actions such as `addTab`, `updateTab`, `moveTab`, `removeTab`, or `destroyPage`."
1389
579
  ),
1390
- requestBody: requestBody("FlowSurfaceCreatePageRequest", examples.createPage),
580
+ requestBody: requestBody("FlowSurfaceCreatePageRequest", import_flow_surfaces.flowSurfaceExamples.createPage),
1391
581
  responses: responses("FlowSurfaceCreatePageResult")
1392
582
  },
1393
583
  destroyPage: {
@@ -1407,7 +597,7 @@ const actionDocs = {
1407
597
  description: valuesCompatibilityNote(
1408
598
  "Adds a route-backed tab under a page and fills in the corresponding grid anchor. Only `target.uid` is accepted, and it must be the canonical uid of the page. For menu-first pages, `createPage(menuRouteId=...)` must finish initialization first."
1409
599
  ),
1410
- requestBody: requestBody("FlowSurfaceAddTabRequest", examples.addTab),
600
+ requestBody: requestBody("FlowSurfaceAddTabRequest", import_flow_surfaces.flowSurfaceExamples.addTab),
1411
601
  responses: responses("FlowSurfaceAddTabResult")
1412
602
  },
1413
603
  updateTab: {
@@ -1416,7 +606,7 @@ const actionDocs = {
1416
606
  description: valuesCompatibilityNote(
1417
607
  "Updates the route-backed fields on the tab route and its matching synthetic RootPageTabModel. Only `target.uid` is accepted, and it must be a tab uid. Pre-created tabs under uninitialized pages are not supported by this action."
1418
608
  ),
1419
- requestBody: requestBody("FlowSurfaceUpdateTabRequest", examples.updateTab),
609
+ requestBody: requestBody("FlowSurfaceUpdateTabRequest", import_flow_surfaces.flowSurfaceExamples.updateTab),
1420
610
  responses: responses("FlowSurfaceUpdateTabResult")
1421
611
  },
1422
612
  moveTab: {
@@ -1449,7 +639,7 @@ const actionDocs = {
1449
639
  description: valuesCompatibilityNote(
1450
640
  "Adds a persisted child-tab subtree under an existing popup page (`ChildPageModel`). It only works on `ChildPageModel / ChildPageTabModel`, does not read or write `desktopRoutes`, and does not auto-create a popup page."
1451
641
  ),
1452
- requestBody: requestBody("FlowSurfaceAddPopupTabRequest", examples.addPopupTab),
642
+ requestBody: requestBody("FlowSurfaceAddPopupTabRequest", import_flow_surfaces.flowSurfaceExamples.addPopupTab),
1453
643
  responses: responses("FlowSurfaceAddPopupTabResult")
1454
644
  },
1455
645
  updatePopupTab: {
@@ -1458,7 +648,7 @@ const actionDocs = {
1458
648
  description: valuesCompatibilityNote(
1459
649
  "Updates the props / stepParams / flowRegistry of a popup child tab (`ChildPageTabModel`) itself. Route-backed tab semantics are not involved."
1460
650
  ),
1461
- requestBody: requestBody("FlowSurfaceUpdatePopupTabRequest", examples.updatePopupTab),
651
+ requestBody: requestBody("FlowSurfaceUpdatePopupTabRequest", import_flow_surfaces.flowSurfaceExamples.updatePopupTab),
1462
652
  responses: responses("FlowSurfaceUpdatePopupTabResult")
1463
653
  },
1464
654
  movePopupTab: {
@@ -1467,7 +657,7 @@ const actionDocs = {
1467
657
  description: valuesCompatibilityNote(
1468
658
  "Reorders `subModels.tabs` under the same popup page. Only root-level `sourceUid` / `targetUid` are accepted, and both must be sibling popup-tab uids."
1469
659
  ),
1470
- requestBody: requestBody("FlowSurfaceMovePopupTabRequest", examples.movePopupTab),
660
+ requestBody: requestBody("FlowSurfaceMovePopupTabRequest", import_flow_surfaces.flowSurfaceExamples.movePopupTab),
1471
661
  responses: responses("FlowSurfaceMovePopupTabResult")
1472
662
  },
1473
663
  removePopupTab: {
@@ -1476,14 +666,14 @@ const actionDocs = {
1476
666
  description: valuesCompatibilityNote(
1477
667
  "Removes the specified popup child-tab subtree. It is valid for the popup to end with 0 tabs. `removePopup` is not provided in this iteration, and the popup page is not required to keep at least one tab."
1478
668
  ),
1479
- requestBody: requestBody("FlowSurfaceRemovePopupTabRequest", examples.removePopupTab),
669
+ requestBody: requestBody("FlowSurfaceRemovePopupTabRequest", import_flow_surfaces.flowSurfaceExamples.removePopupTab),
1480
670
  responses: responses("FlowSurfaceRemovePopupTabResult")
1481
671
  },
1482
672
  addBlock: {
1483
673
  tags: [FLOW_SURFACES_TAG],
1484
674
  summary: "Add a block under a surface or grid container",
1485
675
  description: valuesCompatibilityNote(
1486
- "Creates a block by catalog key or an explicitly supported block use. Popup-capable host nodes automatically receive the popup shell. For collection blocks under a popup, check `catalog.blocks[].resourceBindings` first, then pass the semantic `resource.binding`. The lower-level `resourceInit` is still accepted for compatibility, but the server validates it against popup semantics. `resource` and `resourceInit` are mutually exclusive. The `select / subForm / bulkEditForm` scene is currently recognized only, and popup collection block creation is not supported in that scene. Direct add does not accept raw `props` / `decoratorProps` / `stepParams` / `flowRegistry`. Use `settings` and reuse the public configuration semantics from `configure.changes` / `catalog.configureOptions`."
676
+ 'Creates a block by catalog key or an explicitly supported block use. It can also create from `template`, using `mode="reference"` or `mode="copy"`. Form templates may set `template.usage="fields"` to create a fresh host block and import only its grid fields. Popup-capable host nodes automatically receive the popup shell. For collection blocks under a popup, check `catalog.blocks[].resourceBindings` first, then pass the semantic `resource.binding`. The lower-level `resourceInit` is still accepted for compatibility, but the server validates it against popup semantics. `resource` and `resourceInit` are mutually exclusive. The `select / subForm / bulkEditForm` scene is currently recognized only, and popup collection block creation is not supported in that scene. Direct add does not accept raw `props` / `decoratorProps` / `stepParams` / `flowRegistry`. Use `settings` and reuse the public configuration semantics from `configure.changes` plus the catalog item/node `configureOptions`.'
1487
677
  ),
1488
678
  requestBody: {
1489
679
  required: true,
@@ -1493,19 +683,19 @@ const actionDocs = {
1493
683
  examples: {
1494
684
  popupCurrentRecord: {
1495
685
  summary: "Create a current-record details block under a popup-capable host node",
1496
- value: examples.addBlock
686
+ value: import_flow_surfaces.flowSurfaceExamples.addBlock
1497
687
  },
1498
688
  popupAssociatedRecords: {
1499
689
  summary: "Create an associated-records table block under an association-field popup host node",
1500
- value: examples.addPopupAssociatedBlock
690
+ value: import_flow_surfaces.flowSurfaceExamples.addPopupAssociatedBlock
1501
691
  },
1502
692
  popupOtherRecords: {
1503
693
  summary: "Create a table bound to another collection explicitly under a popup host node",
1504
- value: examples.addPopupOtherRecordsBlock
694
+ value: import_flow_surfaces.flowSurfaceExamples.addPopupOtherRecordsBlock
1505
695
  },
1506
696
  jsBlock: {
1507
697
  summary: "Create a JS block directly under a page/tab/grid container",
1508
- value: examples.addJsBlock
698
+ value: import_flow_surfaces.flowSurfaceExamples.addJsBlock
1509
699
  }
1510
700
  }
1511
701
  }
@@ -1517,7 +707,7 @@ const actionDocs = {
1517
707
  tags: [FLOW_SURFACES_TAG],
1518
708
  summary: "Add a field wrapper and inner field under a field container",
1519
709
  description: valuesCompatibilityNote(
1520
- "Automatically derives the wrapper/inner-field combination from the container use and the field interface. `fieldUse` is only kept as a compatibility check and is no longer an arbitrary creation entry. Direct add does not accept raw `wrapperProps` / `fieldProps` / `props` / `decoratorProps` / `stepParams` / `flowRegistry`. Use `settings` and reuse the public configuration semantics from `configure.changes` / `catalog.configureOptions`. Popup-capable fields can also pass `popup` directly to append a popup subtree. If local openView is enabled but no popup content is provided, the server fills in the popup page/tab/grid shell automatically."
710
+ "Automatically derives the wrapper/inner-field combination from the container use and the field interface. It can also import a form template through `template`, using `reference` or `copy` mode for the target form grid. `fieldUse` is only kept as a compatibility check and is no longer an arbitrary creation entry. Direct add does not accept raw `wrapperProps` / `fieldProps` / `props` / `decoratorProps` / `stepParams` / `flowRegistry`. Use `settings` and reuse the public configuration semantics from `configure.changes` plus the catalog item/node `configureOptions`. Popup-capable fields can also pass `popup` directly to append a local popup subtree or `popup.template` to reuse a saved popup template in `reference` / `copy` mode. If local openView is enabled but no popup content is provided, the server fills in the popup page/tab/grid shell automatically."
1521
711
  ),
1522
712
  requestBody: {
1523
713
  required: true,
@@ -1527,19 +717,23 @@ const actionDocs = {
1527
717
  examples: {
1528
718
  directField: {
1529
719
  summary: "Create a JS renderer bound field under a create form",
1530
- value: examples.addField
720
+ value: import_flow_surfaces.flowSurfaceExamples.addField
1531
721
  },
1532
722
  associationField: {
1533
723
  summary: "Create an association-path field under a table block",
1534
- value: examples.addAssociationField
724
+ value: import_flow_surfaces.flowSurfaceExamples.addAssociationField
1535
725
  },
1536
726
  jsColumn: {
1537
727
  summary: "Create a standalone JS column under a table field container",
1538
- value: examples.addJsColumn
728
+ value: import_flow_surfaces.flowSurfaceExamples.addJsColumn
1539
729
  },
1540
730
  jsItem: {
1541
731
  summary: "Create a standalone JS item under a form field container",
1542
- value: examples.addJsItem
732
+ value: import_flow_surfaces.flowSurfaceExamples.addJsItem
733
+ },
734
+ popupTemplate: {
735
+ summary: "Create a bound field that reuses a saved popup template",
736
+ value: import_flow_surfaces.flowSurfaceExamples.addFieldPopupTemplate
1543
737
  }
1544
738
  }
1545
739
  }
@@ -1551,7 +745,7 @@ const actionDocs = {
1551
745
  tags: [FLOW_SURFACES_TAG],
1552
746
  summary: "Add a non-record action under an allowed block/form/filter-form/action-panel container",
1553
747
  description: valuesCompatibilityNote(
1554
- "Only non-record actions that are public in the catalog and visible in the current container may be created. Typical cases include table block actions, form submit, filter-form reset, and action-panel actions. Use `addRecordAction` for record actions. Direct add does not accept raw `props` / `decoratorProps` / `stepParams` / `flowRegistry`. Use `settings` and reuse `configure.changes` / `catalog.configureOptions`. Popup-capable actions may also include `popup` directly to append a popup subtree."
748
+ "Only non-record actions that are public in the catalog and visible in the current container may be created. Typical cases include table block actions, form submit, filter-form reset, and action-panel actions. Use `addRecordAction` for record actions. Direct add does not accept raw `props` / `decoratorProps` / `stepParams` / `flowRegistry`. Use `settings` and reuse `configure.changes` plus the catalog item/node `configureOptions`. Popup-capable actions may also include `popup` directly to append a popup subtree or `popup.template` to reuse a saved popup template in `reference` / `copy` mode."
1555
749
  ),
1556
750
  requestBody: {
1557
751
  required: true,
@@ -1561,19 +755,19 @@ const actionDocs = {
1561
755
  examples: {
1562
756
  submit: {
1563
757
  summary: "Create a submit action under a filter-form action container",
1564
- value: examples.addAction
758
+ value: import_flow_surfaces.flowSurfaceExamples.addAction
1565
759
  },
1566
760
  link: {
1567
761
  summary: "Create a link action under a table block action container",
1568
- value: examples.addLinkAction
762
+ value: import_flow_surfaces.flowSurfaceExamples.addLinkAction
1569
763
  },
1570
764
  js: {
1571
765
  summary: "Create a JS action under an action-panel container",
1572
- value: examples.addJsAction
766
+ value: import_flow_surfaces.flowSurfaceExamples.addJsAction
1573
767
  },
1574
768
  jsItem: {
1575
769
  summary: "Create a form JS item action under a create/edit/form action container",
1576
- value: examples.addJsItemAction
770
+ value: import_flow_surfaces.flowSurfaceExamples.addJsItemAction
1577
771
  }
1578
772
  }
1579
773
  }
@@ -1585,7 +779,7 @@ const actionDocs = {
1585
779
  tags: [FLOW_SURFACES_TAG],
1586
780
  summary: "Add a record action under a record-capable owner target",
1587
781
  description: valuesCompatibilityNote(
1588
- "Only record actions that are public in the catalog and visible in the current container may be created. The public target must be a record-capable owner target such as table/details/list/gridCard. Do not pass internal container uids such as a table actions column or a list/gridCard item. Direct add does not accept raw `props` / `decoratorProps` / `stepParams` / `flowRegistry`. Use `settings` and reuse `configure.changes` / `catalog.configureOptions`. Popup-capable actions may also include `popup` directly to append a popup subtree."
782
+ "Only record actions that are public in the catalog and visible in the current container may be created. The public target must be a record-capable owner target such as table/details/list/gridCard. Do not pass internal container uids such as a table actions column or a list/gridCard item. Direct add does not accept raw `props` / `decoratorProps` / `stepParams` / `flowRegistry`. Use `settings` and reuse `configure.changes` plus the catalog item/node `configureOptions`. Popup-capable actions may also include `popup` directly to append a popup subtree or `popup.template` to reuse a saved popup template in `reference` / `copy` mode."
1589
783
  ),
1590
784
  requestBody: {
1591
785
  required: true,
@@ -1595,11 +789,11 @@ const actionDocs = {
1595
789
  examples: {
1596
790
  view: {
1597
791
  summary: "Create a view action under a table record-action owner target",
1598
- value: examples.addRecordAction
792
+ value: import_flow_surfaces.flowSurfaceExamples.addRecordAction
1599
793
  },
1600
794
  js: {
1601
795
  summary: "Create a JS record action under a details block owner target",
1602
- value: examples.addRecordJsAction
796
+ value: import_flow_surfaces.flowSurfaceExamples.addRecordJsAction
1603
797
  }
1604
798
  }
1605
799
  }
@@ -1611,18 +805,18 @@ const actionDocs = {
1611
805
  tags: [FLOW_SURFACES_TAG],
1612
806
  summary: "Add multiple blocks sequentially under the same target",
1613
807
  description: valuesCompatibilityNote(
1614
- "Creates multiple blocks sequentially under the same target. Each item may include `settings`, but raw `props` / `decoratorProps` / `stepParams` / `flowRegistry` are not accepted. Partial-success semantics apply: a failure in one item does not roll back the others. Results are returned in input order as `index/key/ok/result/error`, and each `error` always includes `message/type/code/status`."
808
+ "Creates multiple blocks sequentially under the same target. Each item may include `settings` or `template`, but raw `props` / `decoratorProps` / `stepParams` / `flowRegistry` are not accepted. Partial-success semantics apply: a failure in one item does not roll back the others. Results are returned in input order as `index/key/ok/result/error`, and each `error` always includes `message/type/code/status`."
1615
809
  ),
1616
- requestBody: requestBody("FlowSurfaceAddBlocksRequest", examples.addBlocks),
810
+ requestBody: requestBody("FlowSurfaceAddBlocksRequest", import_flow_surfaces.flowSurfaceExamples.addBlocks),
1617
811
  responses: responses("FlowSurfaceAddBlocksResult")
1618
812
  },
1619
813
  addFields: {
1620
814
  tags: [FLOW_SURFACES_TAG],
1621
815
  summary: "Add multiple fields sequentially under the same target",
1622
816
  description: valuesCompatibilityNote(
1623
- "Creates multiple fields sequentially under the same target. Each item may include `settings`, and popup-capable fields may also include `popup`, but raw `wrapperProps` / `fieldProps` / `props` / `decoratorProps` / `stepParams` / `flowRegistry` are not accepted. Partial-success semantics apply: a failure in one item does not roll back the others. Results are returned in input order as `index/key/ok/result/error`, and each `error` always includes `message/type/code/status`."
817
+ "Creates multiple fields sequentially under the same target. The request may either import one shared `template` or create explicit `fields[]`. Each item may include `settings`, and popup-capable fields may also include `popup` directly for local popup content or `popup.template` to reuse a saved popup template in `reference` / `copy` mode. Raw `wrapperProps` / `fieldProps` / `props` / `decoratorProps` / `stepParams` / `flowRegistry` are not accepted. Partial-success semantics apply: a failure in one item does not roll back the others. Results are returned in input order as `index/key/ok/result/error`, and each `error` always includes `message/type/code/status`."
1624
818
  ),
1625
- requestBody: requestBody("FlowSurfaceAddFieldsRequest", examples.addFields),
819
+ requestBody: requestBody("FlowSurfaceAddFieldsRequest", import_flow_surfaces.flowSurfaceExamples.addFields),
1626
820
  responses: responses("FlowSurfaceAddFieldsResult")
1627
821
  },
1628
822
  addActions: {
@@ -1631,7 +825,7 @@ const actionDocs = {
1631
825
  description: valuesCompatibilityNote(
1632
826
  "Creates multiple non-record actions sequentially under the same target. Each item may include `settings`, and popup-capable actions may also include `popup`, but raw `props` / `decoratorProps` / `stepParams` / `flowRegistry` are not accepted. Partial-success semantics apply. Record actions do not belong to this entry and should use `addRecordActions` instead. Each failed item always returns an `error` with `message/type/code/status`."
1633
827
  ),
1634
- requestBody: requestBody("FlowSurfaceAddActionsRequest", examples.addActions),
828
+ requestBody: requestBody("FlowSurfaceAddActionsRequest", import_flow_surfaces.flowSurfaceExamples.addActions),
1635
829
  responses: responses("FlowSurfaceAddActionsResult")
1636
830
  },
1637
831
  addRecordActions: {
@@ -1640,7 +834,7 @@ const actionDocs = {
1640
834
  description: valuesCompatibilityNote(
1641
835
  "Creates multiple record actions sequentially under the same target. The target must be a record-capable owner target, and the server resolves the canonical record-action container automatically. Do not pass internal container uids such as a table actions column or a list/gridCard item. Each item may include `settings`, and popup-capable actions may also include `popup`, but raw `props` / `decoratorProps` / `stepParams` / `flowRegistry` are not accepted. Partial-success semantics apply: a failure in one item does not roll back the others. Each failed item always returns an `error` with `message/type/code/status`."
1642
836
  ),
1643
- requestBody: requestBody("FlowSurfaceAddRecordActionsRequest", examples.addRecordActions),
837
+ requestBody: requestBody("FlowSurfaceAddRecordActionsRequest", import_flow_surfaces.flowSurfaceExamples.addRecordActions),
1644
838
  responses: responses("FlowSurfaceAddRecordActionsResult")
1645
839
  },
1646
840
  updateSettings: {
@@ -1649,7 +843,7 @@ const actionDocs = {
1649
843
  description: valuesCompatibilityNote(
1650
844
  "Updates the specified domain according to the path-level contract exposed by the catalog. Arbitrary raw tree-field patches are not accepted."
1651
845
  ),
1652
- requestBody: requestBody("FlowSurfaceUpdateSettingsRequest", examples.updateSettings),
846
+ requestBody: requestBody("FlowSurfaceUpdateSettingsRequest", import_flow_surfaces.flowSurfaceExamples.updateSettings),
1653
847
  responses: responses("FlowSurfaceUpdateSettingsResult")
1654
848
  },
1655
849
  setEventFlows: {
@@ -1658,7 +852,7 @@ const actionDocs = {
1658
852
  description: valuesCompatibilityNote(
1659
853
  "Fully replaces the instance-level event flows on the current node. The server validates whether eventName, flowKey, stepKey, and the node context are all valid."
1660
854
  ),
1661
- requestBody: requestBody("FlowSurfaceSetEventFlowsRequest", examples.setEventFlows),
855
+ requestBody: requestBody("FlowSurfaceSetEventFlowsRequest", import_flow_surfaces.flowSurfaceExamples.setEventFlows),
1662
856
  responses: responses("FlowSurfaceSetEventFlowsResult")
1663
857
  },
1664
858
  setLayout: {
@@ -1667,14 +861,14 @@ const actionDocs = {
1667
861
  description: valuesCompatibilityNote(
1668
862
  "Fully writes the grid layout. The server strictly validates that every child is covered completely and exactly once."
1669
863
  ),
1670
- requestBody: requestBody("FlowSurfaceSetLayoutRequest", examples.setLayout),
864
+ requestBody: requestBody("FlowSurfaceSetLayoutRequest", import_flow_surfaces.flowSurfaceExamples.setLayout),
1671
865
  responses: responses("FlowSurfaceSetLayoutResult")
1672
866
  },
1673
867
  moveNode: {
1674
868
  tags: [FLOW_SURFACES_TAG],
1675
869
  summary: "Move a node before or after a sibling under the same parent",
1676
870
  description: valuesCompatibilityNote("Only sibling-node reordering under the same parent/subKey is supported."),
1677
- requestBody: requestBody("FlowSurfaceMoveNodeRequest", examples.moveNode),
871
+ requestBody: requestBody("FlowSurfaceMoveNodeRequest", import_flow_surfaces.flowSurfaceExamples.moveNode),
1678
872
  responses: responses("FlowSurfaceMoveNodeResult")
1679
873
  },
1680
874
  removeNode: {
@@ -1683,16 +877,16 @@ const actionDocs = {
1683
877
  description: valuesCompatibilityNote(
1684
878
  "Removes the specified normal node and its subtree. Only `target.uid` is accepted. If you only have `pageSchemaUid / tabSchemaUid / routeId`, call `flowSurfaces:get` first. `removeNode` is not used for page/tab deletion. Use `destroyPage` for pages and `removeTab` for tabs."
1685
879
  ),
1686
- requestBody: requestBody("FlowSurfaceRemoveNodeRequest", examples.removeNode),
880
+ requestBody: requestBody("FlowSurfaceRemoveNodeRequest", import_flow_surfaces.flowSurfaceExamples.removeNode),
1687
881
  responses: responses("FlowSurfaceRemoveNodeResult")
1688
882
  },
1689
883
  mutate: {
1690
884
  tags: [FLOW_SURFACES_TAG],
1691
885
  summary: "Execute multiple operations atomically",
1692
886
  description: valuesCompatibilityNote(
1693
- 'Executes `ops[]` in order and supports `opId` plus `{ref:"<opId>.<field>"}` references to earlier results. V1 only supports `atomic=true`.'
887
+ 'Executes `ops[]` in order and supports `opId` plus `{ step: "<opId>", path: "<field>" }` references to earlier results. `{ key: "<opId>" }` reads the whole previous result object. V1 only supports `atomic=true`.'
1694
888
  ),
1695
- requestBody: requestBody("FlowSurfaceMutateRequest", examples.mutate),
889
+ requestBody: requestBody("FlowSurfaceMutateRequest", import_flow_surfaces.flowSurfaceExamples.mutate),
1696
890
  responses: responses("FlowSurfaceMutationResponse")
1697
891
  },
1698
892
  apply: {
@@ -1701,7 +895,7 @@ const actionDocs = {
1701
895
  description: valuesCompatibilityNote(
1702
896
  'Accepts a complete subtree spec and compiles it into an operation sequence isomorphic to `mutate`. V1 only supports `mode="replace"`.'
1703
897
  ),
1704
- requestBody: requestBody("FlowSurfaceApplyRequest", examples.apply),
898
+ requestBody: requestBody("FlowSurfaceApplyRequest", import_flow_surfaces.flowSurfaceExamples.apply),
1705
899
  responses: responses("FlowSurfaceMutationResponse")
1706
900
  }
1707
901
  };
@@ -1714,7 +908,7 @@ const parameters = {
1714
908
  schema: {
1715
909
  type: "string"
1716
910
  },
1717
- example: examples.getPopupQuery.uid
911
+ example: import_flow_surfaces.flowSurfaceExamples.getPopupQuery.uid
1718
912
  },
1719
913
  flowSurfaceTargetPageSchemaUid: {
1720
914
  name: "pageSchemaUid",
@@ -1748,22 +942,22 @@ const parameters = {
1748
942
  }
1749
943
  };
1750
944
  const schemas = {
1751
- FlowSurfaceMutateRef: {
945
+ FlowSurfaceMutateKey: {
1752
946
  type: "object",
1753
- required: ["ref"],
947
+ required: ["key"],
1754
948
  properties: {
1755
- ref: {
949
+ key: {
1756
950
  type: "string",
1757
- description: "Reference to a previous mutate op result field, for example `page.tabSchemaUid`."
951
+ description: "Reference to a previously created runtime key, for example a prior mutate `opId`."
1758
952
  }
1759
953
  },
1760
954
  additionalProperties: false
1761
955
  },
1762
956
  FlowSurfaceResolvableString: {
1763
- oneOf: [{ type: "string" }, ref("FlowSurfaceMutateRef")]
957
+ oneOf: [{ type: "string" }, ref("FlowSurfaceMutateKey"), ref("FlowSurfacePlanSelectorByStep")]
1764
958
  },
1765
959
  FlowSurfaceResolvableIdentifier: {
1766
- oneOf: [{ type: "string" }, { type: "integer" }, ref("FlowSurfaceMutateRef")]
960
+ oneOf: [{ type: "string" }, { type: "integer" }, ref("FlowSurfaceMutateKey"), ref("FlowSurfacePlanSelectorByStep")]
1767
961
  },
1768
962
  FlowSurfaceWriteTarget: {
1769
963
  type: "object",
@@ -1841,53 +1035,130 @@ const schemas = {
1841
1035
  },
1842
1036
  additionalProperties: false
1843
1037
  },
1844
- FlowSurfaceConfigureOption: {
1038
+ FlowSurfacePlanSelectorByStep: {
1845
1039
  type: "object",
1040
+ required: ["step"],
1846
1041
  properties: {
1847
- type: {
1848
- type: "string",
1849
- enum: ["string", "number", "boolean", "object", "array"]
1850
- },
1851
- description: {
1042
+ step: {
1852
1043
  type: "string"
1853
1044
  },
1854
- enum: {
1855
- type: "array",
1856
- items: {
1857
- oneOf: [{ type: "string" }, { type: "number" }, { type: "boolean" }]
1858
- }
1859
- },
1860
- example: {},
1861
- supportsFlowContext: {
1862
- type: "boolean"
1045
+ path: {
1046
+ type: "string"
1863
1047
  }
1864
1048
  },
1865
- required: ["type"],
1866
1049
  additionalProperties: false
1867
1050
  },
1868
- FlowSurfaceConfigureOptions: {
1869
- type: "object",
1870
- additionalProperties: ref("FlowSurfaceConfigureOption")
1871
- },
1872
- FlowSurfaceNodeDomain: {
1873
- type: "string",
1874
- enum: ["props", "decoratorProps", "stepParams", "flowRegistry"]
1875
- },
1876
- FlowSurfaceMergeStrategy: {
1877
- type: "string",
1878
- enum: ["deep", "replace"]
1879
- },
1880
- FlowSurfaceFilterCondition: {
1051
+ FlowSurfaceBindKey: {
1881
1052
  type: "object",
1053
+ required: ["key", "locator"],
1882
1054
  properties: {
1883
- path: {
1055
+ key: {
1884
1056
  type: "string"
1885
1057
  },
1886
- operator: {
1887
- type: "string"
1058
+ locator: ref("FlowSurfaceReadLocator"),
1059
+ expectedKind: {
1060
+ type: "string",
1061
+ enum: ["page", "tab", "grid", "block", "fieldHost", "action", "popupHost", "popupPage", "popupTab", "node"]
1888
1062
  },
1889
- value: {}
1890
- },
1063
+ rebind: {
1064
+ type: "boolean"
1065
+ }
1066
+ },
1067
+ additionalProperties: false
1068
+ },
1069
+ FlowSurfaceKeyInfo: {
1070
+ type: "object",
1071
+ properties: {
1072
+ uid: {
1073
+ type: "string"
1074
+ },
1075
+ kind: {
1076
+ type: "string"
1077
+ },
1078
+ source: {
1079
+ type: "string",
1080
+ enum: ["declared", "request", "system"]
1081
+ },
1082
+ locator: ref("FlowSurfaceReadLocator")
1083
+ },
1084
+ additionalProperties: false
1085
+ },
1086
+ FlowSurfaceKeysMap: {
1087
+ type: "object",
1088
+ additionalProperties: ref("FlowSurfaceKeyInfo")
1089
+ },
1090
+ FlowSurfaceResolvedSelectorSummary: {
1091
+ type: "object",
1092
+ properties: {
1093
+ uid: {
1094
+ type: "string"
1095
+ },
1096
+ kind: {
1097
+ type: "string"
1098
+ },
1099
+ key: {
1100
+ type: "string"
1101
+ },
1102
+ source: {
1103
+ type: "string",
1104
+ enum: ["declared", "request", "system", "step"]
1105
+ },
1106
+ step: {
1107
+ type: "string"
1108
+ },
1109
+ path: {
1110
+ type: "string"
1111
+ }
1112
+ },
1113
+ additionalProperties: false
1114
+ },
1115
+ FlowSurfaceConfigureOption: {
1116
+ type: "object",
1117
+ properties: {
1118
+ type: {
1119
+ type: "string",
1120
+ enum: ["string", "number", "boolean", "object", "array"]
1121
+ },
1122
+ description: {
1123
+ type: "string"
1124
+ },
1125
+ enum: {
1126
+ type: "array",
1127
+ items: {
1128
+ oneOf: [{ type: "string" }, { type: "number" }, { type: "boolean" }]
1129
+ }
1130
+ },
1131
+ example: {},
1132
+ supportsFlowContext: {
1133
+ type: "boolean"
1134
+ }
1135
+ },
1136
+ required: ["type"],
1137
+ additionalProperties: false
1138
+ },
1139
+ FlowSurfaceConfigureOptions: {
1140
+ type: "object",
1141
+ additionalProperties: ref("FlowSurfaceConfigureOption")
1142
+ },
1143
+ FlowSurfaceNodeDomain: {
1144
+ type: "string",
1145
+ enum: ["props", "decoratorProps", "stepParams", "flowRegistry"]
1146
+ },
1147
+ FlowSurfaceMergeStrategy: {
1148
+ type: "string",
1149
+ enum: ["deep", "replace"]
1150
+ },
1151
+ FlowSurfaceFilterCondition: {
1152
+ type: "object",
1153
+ properties: {
1154
+ path: {
1155
+ type: "string"
1156
+ },
1157
+ operator: {
1158
+ type: "string"
1159
+ },
1160
+ value: {}
1161
+ },
1891
1162
  required: ["path", "operator"],
1892
1163
  additionalProperties: true
1893
1164
  },
@@ -1968,505 +1239,1762 @@ const schemas = {
1968
1239
  },
1969
1240
  additionalProperties: false
1970
1241
  },
1971
- FlowSurfaceDomainContract: {
1242
+ FlowSurfaceDomainContract: {
1243
+ type: "object",
1244
+ properties: {
1245
+ allowedKeys: {
1246
+ type: "array",
1247
+ items: {
1248
+ type: "string"
1249
+ }
1250
+ },
1251
+ wildcard: {
1252
+ type: "boolean"
1253
+ },
1254
+ mergeStrategy: ref("FlowSurfaceMergeStrategy"),
1255
+ schema: ANY_OBJECT_SCHEMA,
1256
+ groups: {
1257
+ type: "object",
1258
+ additionalProperties: ref("FlowSurfaceDomainGroupContract")
1259
+ }
1260
+ },
1261
+ additionalProperties: false
1262
+ },
1263
+ FlowSurfaceNodeContract: {
1264
+ type: "object",
1265
+ properties: {
1266
+ editableDomains: {
1267
+ type: "array",
1268
+ items: ref("FlowSurfaceNodeDomain")
1269
+ },
1270
+ domains: {
1271
+ type: "object",
1272
+ properties: {
1273
+ props: ref("FlowSurfaceDomainContract"),
1274
+ decoratorProps: ref("FlowSurfaceDomainContract"),
1275
+ stepParams: ref("FlowSurfaceDomainContract"),
1276
+ flowRegistry: ref("FlowSurfaceDomainContract")
1277
+ },
1278
+ additionalProperties: false
1279
+ },
1280
+ eventCapabilities: ref("FlowSurfaceEventCapabilities"),
1281
+ layoutCapabilities: ref("FlowSurfaceLayoutCapabilities"),
1282
+ eventBindings: ANY_OBJECT_SCHEMA
1283
+ },
1284
+ additionalProperties: false
1285
+ },
1286
+ FlowSurfaceCatalogItem: {
1287
+ type: "object",
1288
+ properties: {
1289
+ key: {
1290
+ type: "string"
1291
+ },
1292
+ label: {
1293
+ type: "string"
1294
+ },
1295
+ use: {
1296
+ type: "string"
1297
+ },
1298
+ kind: {
1299
+ type: "string",
1300
+ enum: ["page", "tab", "block", "field", "action"]
1301
+ },
1302
+ scope: {
1303
+ type: "string",
1304
+ enum: ["block", "record", "form", "filterForm", "actionPanel"]
1305
+ },
1306
+ scene: {
1307
+ type: "string"
1308
+ },
1309
+ fieldUse: {
1310
+ type: "string"
1311
+ },
1312
+ wrapperUse: {
1313
+ type: "string"
1314
+ },
1315
+ associationPathName: {
1316
+ type: "string",
1317
+ nullable: true
1318
+ },
1319
+ defaultTargetUid: {
1320
+ type: "string"
1321
+ },
1322
+ targetBlockUid: {
1323
+ type: "string"
1324
+ },
1325
+ requiredInitParams: {
1326
+ type: "array",
1327
+ items: {
1328
+ type: "string"
1329
+ }
1330
+ },
1331
+ allowedContainerUses: {
1332
+ type: "array",
1333
+ items: {
1334
+ type: "string"
1335
+ }
1336
+ },
1337
+ editableDomains: {
1338
+ type: "array",
1339
+ items: ref("FlowSurfaceNodeDomain")
1340
+ },
1341
+ configureOptions: ref("FlowSurfaceConfigureOptions"),
1342
+ resourceBindings: {
1343
+ type: "array",
1344
+ items: ref("FlowSurfaceResourceBindingOption")
1345
+ },
1346
+ settingsSchema: ANY_OBJECT_SCHEMA,
1347
+ settingsContract: {
1348
+ type: "object",
1349
+ properties: {
1350
+ props: ref("FlowSurfaceDomainContract"),
1351
+ decoratorProps: ref("FlowSurfaceDomainContract"),
1352
+ stepParams: ref("FlowSurfaceDomainContract"),
1353
+ flowRegistry: ref("FlowSurfaceDomainContract")
1354
+ },
1355
+ additionalProperties: false
1356
+ },
1357
+ eventCapabilities: ref("FlowSurfaceEventCapabilities"),
1358
+ layoutCapabilities: ref("FlowSurfaceLayoutCapabilities"),
1359
+ createSupported: {
1360
+ type: "boolean"
1361
+ }
1362
+ },
1363
+ additionalProperties: true
1364
+ },
1365
+ FlowSurfaceCatalogSection: {
1366
+ type: "string",
1367
+ enum: ["blocks", "fields", "actions", "recordActions", "node"]
1368
+ },
1369
+ FlowSurfaceCatalogExpand: {
1370
+ type: "string",
1371
+ enum: ["item.configureOptions", "item.contracts", "item.allowedContainerUses", "node.contracts"]
1372
+ },
1373
+ FlowSurfaceCatalogPopupScenario: {
1374
+ type: "object",
1375
+ required: ["kind", "scene", "hasCurrentRecord", "hasAssociationContext"],
1376
+ properties: {
1377
+ kind: {
1378
+ type: "string",
1379
+ enum: ["plainPopup", "recordPopup", "associationPopup"]
1380
+ },
1381
+ scene: {
1382
+ type: "string",
1383
+ enum: ["new", "one", "many", "select", "subForm", "bulkEditForm", "generic"]
1384
+ },
1385
+ hasCurrentRecord: {
1386
+ type: "boolean"
1387
+ },
1388
+ hasAssociationContext: {
1389
+ type: "boolean"
1390
+ }
1391
+ },
1392
+ additionalProperties: false
1393
+ },
1394
+ FlowSurfaceCatalogFieldContainerScenario: {
1395
+ type: "object",
1396
+ required: ["kind"],
1397
+ properties: {
1398
+ kind: {
1399
+ type: "string",
1400
+ enum: ["form", "details", "table", "filter-form"]
1401
+ },
1402
+ targetMode: {
1403
+ type: "string",
1404
+ enum: ["single", "multiple"]
1405
+ }
1406
+ },
1407
+ additionalProperties: false
1408
+ },
1409
+ FlowSurfaceCatalogActionContainerScenario: {
1410
+ type: "object",
1411
+ required: ["scope"],
1412
+ properties: {
1413
+ scope: {
1414
+ type: "string",
1415
+ enum: ["block", "record", "form", "filterForm", "actionPanel"]
1416
+ },
1417
+ ownerUse: {
1418
+ type: "string"
1419
+ },
1420
+ recordActionContainerUse: {
1421
+ type: "string"
1422
+ }
1423
+ },
1424
+ additionalProperties: false
1425
+ },
1426
+ FlowSurfaceCatalogScenario: {
1427
+ type: "object",
1428
+ required: ["surfaceKind"],
1429
+ properties: {
1430
+ surfaceKind: {
1431
+ type: "string",
1432
+ enum: ["global", "page", "tab", "grid", "block", "node"]
1433
+ },
1434
+ popup: ref("FlowSurfaceCatalogPopupScenario"),
1435
+ fieldContainer: ref("FlowSurfaceCatalogFieldContainerScenario"),
1436
+ actionContainer: ref("FlowSurfaceCatalogActionContainerScenario")
1437
+ },
1438
+ additionalProperties: false
1439
+ },
1440
+ FlowSurfaceCatalogNodeInfo: {
1441
+ type: "object",
1442
+ required: ["editableDomains", "configureOptions"],
1443
+ properties: {
1444
+ editableDomains: {
1445
+ type: "array",
1446
+ items: ref("FlowSurfaceNodeDomain")
1447
+ },
1448
+ configureOptions: ref("FlowSurfaceConfigureOptions"),
1449
+ settingsSchema: ANY_OBJECT_SCHEMA,
1450
+ settingsContract: {
1451
+ type: "object",
1452
+ properties: {
1453
+ props: ref("FlowSurfaceDomainContract"),
1454
+ decoratorProps: ref("FlowSurfaceDomainContract"),
1455
+ stepParams: ref("FlowSurfaceDomainContract"),
1456
+ flowRegistry: ref("FlowSurfaceDomainContract")
1457
+ },
1458
+ additionalProperties: false
1459
+ },
1460
+ eventCapabilities: ref("FlowSurfaceEventCapabilities"),
1461
+ layoutCapabilities: ref("FlowSurfaceLayoutCapabilities")
1462
+ },
1463
+ additionalProperties: false
1464
+ },
1465
+ FlowSurfaceGetTreeNode: {
1466
+ type: "object",
1467
+ properties: {
1468
+ uid: {
1469
+ type: "string"
1470
+ },
1471
+ use: {
1472
+ type: "string"
1473
+ },
1474
+ subKey: {
1475
+ type: "string"
1476
+ },
1477
+ subType: {
1478
+ type: "string"
1479
+ },
1480
+ fieldUse: {
1481
+ type: "string"
1482
+ },
1483
+ schemaUid: {
1484
+ type: "string"
1485
+ },
1486
+ props: ANY_OBJECT_SCHEMA,
1487
+ decoratorProps: ANY_OBJECT_SCHEMA,
1488
+ stepParams: ANY_OBJECT_SCHEMA,
1489
+ flowRegistry: ANY_OBJECT_SCHEMA,
1490
+ template: ref("FlowSurfaceBlockTemplateRef"),
1491
+ fieldsTemplate: ref("FlowSurfaceTemplateRef"),
1492
+ popup: ref("FlowSurfacePopupSummary"),
1493
+ subModels: {
1494
+ type: "object",
1495
+ additionalProperties: {
1496
+ oneOf: [
1497
+ ref("FlowSurfaceGetTreeNode"),
1498
+ {
1499
+ type: "array",
1500
+ items: ref("FlowSurfaceGetTreeNode")
1501
+ }
1502
+ ]
1503
+ }
1504
+ }
1505
+ },
1506
+ additionalProperties: true
1507
+ },
1508
+ FlowSurfaceNodeMap: {
1509
+ type: "object",
1510
+ additionalProperties: ref("FlowSurfaceGetTreeNode")
1511
+ },
1512
+ FlowSurfaceRouteMeta: {
1513
+ type: "object",
1514
+ properties: {
1515
+ id: STRING_OR_INTEGER_SCHEMA,
1516
+ type: {
1517
+ type: "string"
1518
+ },
1519
+ title: {
1520
+ type: "string"
1521
+ },
1522
+ icon: {
1523
+ type: "string",
1524
+ nullable: true
1525
+ },
1526
+ schemaUid: {
1527
+ type: "string"
1528
+ },
1529
+ tabSchemaName: {
1530
+ type: "string"
1531
+ },
1532
+ enableTabs: {
1533
+ type: "boolean"
1534
+ },
1535
+ hidden: {
1536
+ type: "boolean"
1537
+ },
1538
+ displayTitle: {
1539
+ type: "boolean"
1540
+ },
1541
+ sort: {
1542
+ type: "number"
1543
+ },
1544
+ options: ANY_OBJECT_SCHEMA,
1545
+ children: {
1546
+ type: "array",
1547
+ items: ref("FlowSurfaceRouteMeta")
1548
+ }
1549
+ },
1550
+ additionalProperties: true
1551
+ },
1552
+ FlowSurfaceNodeSpec: {
1553
+ type: "object",
1554
+ required: ["use"],
1555
+ properties: {
1556
+ uid: {
1557
+ type: "string"
1558
+ },
1559
+ clientKey: {
1560
+ type: "string"
1561
+ },
1562
+ use: {
1563
+ type: "string"
1564
+ },
1565
+ props: ANY_OBJECT_SCHEMA,
1566
+ decoratorProps: ANY_OBJECT_SCHEMA,
1567
+ stepParams: ANY_OBJECT_SCHEMA,
1568
+ flowRegistry: ANY_OBJECT_SCHEMA,
1569
+ subModels: {
1570
+ type: "object",
1571
+ additionalProperties: {
1572
+ oneOf: [
1573
+ ref("FlowSurfaceNodeSpec"),
1574
+ {
1575
+ type: "array",
1576
+ items: ref("FlowSurfaceNodeSpec")
1577
+ }
1578
+ ]
1579
+ }
1580
+ }
1581
+ },
1582
+ additionalProperties: false
1583
+ },
1584
+ FlowSurfaceApplySpec: {
1585
+ type: "object",
1586
+ properties: {
1587
+ props: ANY_OBJECT_SCHEMA,
1588
+ decoratorProps: ANY_OBJECT_SCHEMA,
1589
+ stepParams: ANY_OBJECT_SCHEMA,
1590
+ flowRegistry: ANY_OBJECT_SCHEMA,
1591
+ subModels: {
1592
+ type: "object",
1593
+ additionalProperties: {
1594
+ oneOf: [
1595
+ ref("FlowSurfaceNodeSpec"),
1596
+ {
1597
+ type: "array",
1598
+ items: ref("FlowSurfaceNodeSpec")
1599
+ }
1600
+ ]
1601
+ }
1602
+ }
1603
+ },
1604
+ additionalProperties: false
1605
+ },
1606
+ FlowSurfaceClientKeyMap: {
1607
+ type: "object",
1608
+ additionalProperties: {
1609
+ type: "string"
1610
+ }
1611
+ },
1612
+ FlowSurfaceResourceInit: {
1613
+ type: "object",
1614
+ properties: {
1615
+ dataSourceKey: {
1616
+ type: "string"
1617
+ },
1618
+ collectionName: {
1619
+ type: "string"
1620
+ },
1621
+ associationName: {
1622
+ type: "string"
1623
+ },
1624
+ associationPathName: {
1625
+ type: "string"
1626
+ },
1627
+ sourceId: STRING_OR_INTEGER_SCHEMA,
1628
+ filterByTk: STRING_OR_INTEGER_SCHEMA
1629
+ },
1630
+ additionalProperties: false
1631
+ },
1632
+ FlowSurfaceResourceBindingAssociationField: {
1633
+ type: "object",
1634
+ properties: {
1635
+ key: {
1636
+ type: "string"
1637
+ },
1638
+ label: {
1639
+ type: "string"
1640
+ },
1641
+ collectionName: {
1642
+ type: "string"
1643
+ },
1644
+ associationName: {
1645
+ type: "string"
1646
+ }
1647
+ },
1648
+ required: ["key", "label", "collectionName"],
1649
+ additionalProperties: false
1650
+ },
1651
+ FlowSurfaceResourceBindingOption: {
1652
+ type: "object",
1653
+ properties: {
1654
+ key: {
1655
+ type: "string",
1656
+ enum: ["currentCollection", "currentRecord", "associatedRecords", "otherRecords"]
1657
+ },
1658
+ label: {
1659
+ type: "string"
1660
+ },
1661
+ description: {
1662
+ type: "string"
1663
+ },
1664
+ requires: {
1665
+ type: "array",
1666
+ items: {
1667
+ type: "string"
1668
+ }
1669
+ },
1670
+ dataSourceKey: {
1671
+ type: "string"
1672
+ },
1673
+ collectionName: {
1674
+ type: "string"
1675
+ },
1676
+ associationFields: {
1677
+ type: "array",
1678
+ items: ref("FlowSurfaceResourceBindingAssociationField")
1679
+ }
1680
+ },
1681
+ required: ["key", "label"],
1682
+ additionalProperties: false
1683
+ },
1684
+ FlowSurfaceSemanticResourceInput: {
1685
+ type: "object",
1686
+ required: ["binding"],
1687
+ properties: {
1688
+ binding: {
1689
+ type: "string",
1690
+ enum: ["currentCollection", "currentRecord", "associatedRecords", "otherRecords"]
1691
+ },
1692
+ dataSourceKey: {
1693
+ type: "string"
1694
+ },
1695
+ collectionName: {
1696
+ type: "string"
1697
+ },
1698
+ associationField: {
1699
+ type: "string",
1700
+ description: "Canonical association field name for popup `associatedRecords` binding. In applyBlueprint authoring, prefer `associationField`; `associationPathName` is only normalized to this field for convenience when it is a single association field name."
1701
+ }
1702
+ },
1703
+ additionalProperties: false
1704
+ },
1705
+ FlowSurfaceBlockResourceInput: {
1706
+ oneOf: [ref("FlowSurfaceSemanticResourceInput"), ref("FlowSurfaceResourceInit")]
1707
+ },
1708
+ FlowSurfaceMutateResourceInit: {
1709
+ type: "object",
1710
+ properties: {
1711
+ dataSourceKey: ref("FlowSurfaceResolvableString"),
1712
+ collectionName: ref("FlowSurfaceResolvableString"),
1713
+ associationName: ref("FlowSurfaceResolvableString"),
1714
+ associationPathName: ref("FlowSurfaceResolvableString"),
1715
+ sourceId: ref("FlowSurfaceResolvableIdentifier"),
1716
+ filterByTk: ref("FlowSurfaceResolvableIdentifier")
1717
+ },
1718
+ additionalProperties: false
1719
+ },
1720
+ FlowSurfaceCatalogRequest: {
1721
+ type: "object",
1722
+ properties: {
1723
+ target: ref("FlowSurfaceWriteTarget"),
1724
+ sections: {
1725
+ type: "array",
1726
+ items: ref("FlowSurfaceCatalogSection")
1727
+ },
1728
+ expand: {
1729
+ type: "array",
1730
+ items: ref("FlowSurfaceCatalogExpand")
1731
+ }
1732
+ },
1733
+ additionalProperties: false
1734
+ },
1735
+ FlowSurfaceCatalogResponse: {
1736
+ type: "object",
1737
+ properties: {
1738
+ target: {
1739
+ allOf: [ref("FlowSurfaceResolvedTarget")],
1740
+ nullable: true
1741
+ },
1742
+ scenario: ref("FlowSurfaceCatalogScenario"),
1743
+ selectedSections: {
1744
+ type: "array",
1745
+ description: "Final sections returned by the server. When `sections` is omitted from the request, the server smart-selects sections for the current target scenario and clients should treat this field as authoritative.",
1746
+ items: ref("FlowSurfaceCatalogSection")
1747
+ },
1748
+ blocks: {
1749
+ type: "array",
1750
+ items: ref("FlowSurfaceCatalogItem")
1751
+ },
1752
+ fields: {
1753
+ type: "array",
1754
+ items: ref("FlowSurfaceCatalogItem")
1755
+ },
1756
+ actions: {
1757
+ type: "array",
1758
+ description: "Public block/form/filter-form/action-panel actions available under the resolved target.",
1759
+ items: ref("FlowSurfaceCatalogItem")
1760
+ },
1761
+ recordActions: {
1762
+ type: "array",
1763
+ description: "Public record/item-level actions exposed for record-capable targets such as table/details/list/gridCard.",
1764
+ items: ref("FlowSurfaceCatalogItem")
1765
+ },
1766
+ node: ref("FlowSurfaceCatalogNodeInfo")
1767
+ },
1768
+ additionalProperties: false
1769
+ },
1770
+ FlowSurfaceContextVarInfo: {
1771
+ type: "object",
1772
+ properties: {
1773
+ title: {
1774
+ type: "string"
1775
+ },
1776
+ type: {
1777
+ type: "string"
1778
+ },
1779
+ interface: {
1780
+ type: "string"
1781
+ },
1782
+ description: {
1783
+ type: "string"
1784
+ },
1785
+ disabled: {
1786
+ type: "boolean"
1787
+ },
1788
+ disabledReason: {
1789
+ type: "string"
1790
+ },
1791
+ properties: {
1792
+ type: "object",
1793
+ additionalProperties: ref("FlowSurfaceContextVarInfo")
1794
+ }
1795
+ },
1796
+ additionalProperties: false
1797
+ },
1798
+ FlowSurfaceContextRequest: {
1799
+ type: "object",
1800
+ required: ["target"],
1801
+ properties: {
1802
+ target: ref("FlowSurfaceWriteTarget"),
1803
+ path: {
1804
+ type: "string",
1805
+ description: "Bare path only, for example 'record', 'popup.record' or 'item.parentItem.value'."
1806
+ },
1807
+ maxDepth: {
1808
+ type: "integer",
1809
+ minimum: 1
1810
+ }
1811
+ },
1812
+ additionalProperties: false
1813
+ },
1814
+ FlowSurfaceContextResponse: {
1815
+ type: "object",
1816
+ properties: {
1817
+ vars: {
1818
+ type: "object",
1819
+ additionalProperties: ref("FlowSurfaceContextVarInfo")
1820
+ }
1821
+ },
1822
+ additionalProperties: false
1823
+ },
1824
+ FlowSurfaceDescribeSurfaceRequest: {
1825
+ type: "object",
1826
+ required: ["locator"],
1827
+ properties: {
1828
+ locator: ref("FlowSurfaceReadLocator"),
1829
+ bindKeys: {
1830
+ type: "array",
1831
+ items: ref("FlowSurfaceBindKey")
1832
+ }
1833
+ },
1834
+ additionalProperties: false
1835
+ },
1836
+ FlowSurfaceGetResponse: {
1837
+ type: "object",
1838
+ properties: {
1839
+ target: ref("FlowSurfaceReadTarget"),
1840
+ tree: ref("FlowSurfaceGetTreeNode"),
1841
+ nodeMap: ref("FlowSurfaceNodeMap"),
1842
+ pageRoute: ref("FlowSurfaceRouteMeta"),
1843
+ route: ref("FlowSurfaceRouteMeta")
1844
+ },
1845
+ additionalProperties: false
1846
+ },
1847
+ FlowSurfaceDescribeSurfaceResponse: {
1848
+ type: "object",
1849
+ properties: {
1850
+ target: ref("FlowSurfaceReadTarget"),
1851
+ tree: ref("FlowSurfaceGetTreeNode"),
1852
+ nodeMap: ref("FlowSurfaceNodeMap"),
1853
+ pageRoute: ref("FlowSurfaceRouteMeta"),
1854
+ route: ref("FlowSurfaceRouteMeta"),
1855
+ fingerprint: {
1856
+ type: "string"
1857
+ },
1858
+ keys: ref("FlowSurfaceKeysMap")
1859
+ },
1860
+ additionalProperties: false
1861
+ },
1862
+ FlowSurfacePopupSummary: {
1863
+ type: "object",
1864
+ properties: {
1865
+ mode: {
1866
+ type: "string",
1867
+ enum: ["local", "copy"]
1868
+ },
1869
+ pageUid: {
1870
+ type: "string"
1871
+ },
1872
+ tabUid: {
1873
+ type: "string"
1874
+ },
1875
+ gridUid: {
1876
+ type: "string"
1877
+ },
1878
+ template: ref("FlowSurfacePopupTemplateRef")
1879
+ },
1880
+ additionalProperties: false
1881
+ },
1882
+ ...templateSchemas,
1883
+ FlowSurfaceComposeLayoutCell: {
1884
+ oneOf: [
1885
+ {
1886
+ type: "string"
1887
+ },
1888
+ {
1889
+ type: "object",
1890
+ anyOf: [{ required: ["key"] }, { required: ["uid"] }],
1891
+ properties: {
1892
+ key: {
1893
+ type: "string"
1894
+ },
1895
+ uid: {
1896
+ type: "string"
1897
+ },
1898
+ span: {
1899
+ type: "number"
1900
+ }
1901
+ },
1902
+ additionalProperties: false
1903
+ }
1904
+ ]
1905
+ },
1906
+ FlowSurfaceComposeLayout: {
1907
+ type: "object",
1908
+ properties: {
1909
+ rows: {
1910
+ type: "array",
1911
+ items: {
1912
+ type: "array",
1913
+ items: ref("FlowSurfaceComposeLayoutCell")
1914
+ }
1915
+ }
1916
+ },
1917
+ additionalProperties: false
1918
+ },
1919
+ FlowSurfaceComposeFieldSpec: {
1920
+ oneOf: [
1921
+ {
1922
+ type: "string"
1923
+ },
1924
+ {
1925
+ type: "object",
1926
+ required: ["fieldPath"],
1927
+ properties: {
1928
+ key: {
1929
+ type: "string",
1930
+ description: "Optional stable field key returned in compose results."
1931
+ },
1932
+ fieldPath: {
1933
+ type: "string"
1934
+ },
1935
+ renderer: {
1936
+ type: "string",
1937
+ enum: ["js"],
1938
+ description: "Optional public renderer variant for a bound field."
1939
+ },
1940
+ associationPathName: {
1941
+ type: "string"
1942
+ },
1943
+ target: {
1944
+ type: "string",
1945
+ description: "Reference to another compose block key, typically used by filter-form fields."
1946
+ },
1947
+ settings: ANY_OBJECT_SCHEMA,
1948
+ popup: ref("FlowSurfaceComposeFieldPopup")
1949
+ },
1950
+ additionalProperties: false
1951
+ },
1952
+ {
1953
+ type: "object",
1954
+ required: ["type"],
1955
+ properties: {
1956
+ key: {
1957
+ type: "string",
1958
+ description: "Optional stable field key returned in compose results."
1959
+ },
1960
+ type: {
1961
+ type: "string",
1962
+ enum: ["jsColumn", "jsItem"],
1963
+ description: "Standalone synthetic public field capability. Does not accept fieldPath."
1964
+ },
1965
+ settings: ANY_OBJECT_SCHEMA
1966
+ },
1967
+ additionalProperties: false
1968
+ }
1969
+ ]
1970
+ },
1971
+ FlowSurfaceTemplateRef: {
1972
+ type: "object",
1973
+ required: ["uid"],
1974
+ properties: {
1975
+ uid: {
1976
+ type: "string",
1977
+ description: "Saved template uid."
1978
+ },
1979
+ mode: {
1980
+ type: "string",
1981
+ enum: ["reference", "copy"],
1982
+ default: "reference"
1983
+ }
1984
+ },
1985
+ additionalProperties: false
1986
+ },
1987
+ FlowSurfaceBlockTemplateRef: {
1988
+ type: "object",
1989
+ required: ["uid"],
1990
+ properties: {
1991
+ uid: {
1992
+ type: "string"
1993
+ },
1994
+ mode: {
1995
+ type: "string",
1996
+ enum: ["reference", "copy"],
1997
+ default: "reference"
1998
+ },
1999
+ usage: {
2000
+ type: "string",
2001
+ enum: ["block", "fields"],
2002
+ description: "For form templates, choose whether to create the whole block or only import its fields."
2003
+ }
2004
+ },
2005
+ additionalProperties: false
2006
+ },
2007
+ FlowSurfacePopupTemplateRef: {
2008
+ allOf: [ref("FlowSurfaceTemplateRef")]
2009
+ },
2010
+ FlowSurfaceComposeActionPopup: {
2011
+ type: "object",
2012
+ oneOf: [
2013
+ {
2014
+ required: ["template"]
2015
+ },
2016
+ {
2017
+ anyOf: [{ required: ["mode"] }, { required: ["blocks"] }, { required: ["layout"] }]
2018
+ }
2019
+ ],
2020
+ properties: {
2021
+ template: ref("FlowSurfacePopupTemplateRef"),
2022
+ mode: {
2023
+ type: "string",
2024
+ enum: ["append", "replace"]
2025
+ },
2026
+ blocks: {
2027
+ type: "array",
2028
+ items: ref("FlowSurfaceComposeBlockSpec")
2029
+ },
2030
+ layout: ref("FlowSurfaceComposeLayout")
2031
+ },
2032
+ additionalProperties: false
2033
+ },
2034
+ FlowSurfaceComposeFieldPopup: {
2035
+ type: "object",
2036
+ oneOf: [
2037
+ {
2038
+ required: ["template"]
2039
+ },
2040
+ {
2041
+ anyOf: [{ required: ["mode"] }, { required: ["blocks"] }, { required: ["layout"] }]
2042
+ }
2043
+ ],
2044
+ properties: {
2045
+ template: ref("FlowSurfacePopupTemplateRef"),
2046
+ mode: {
2047
+ type: "string",
2048
+ enum: ["append", "replace"]
2049
+ },
2050
+ blocks: {
2051
+ type: "array",
2052
+ items: ref("FlowSurfaceComposeBlockSpec")
2053
+ },
2054
+ layout: ref("FlowSurfaceComposeLayout")
2055
+ },
2056
+ additionalProperties: false
2057
+ },
2058
+ FlowSurfaceComposeActionSpec: {
2059
+ oneOf: [
2060
+ {
2061
+ type: "string"
2062
+ },
2063
+ {
2064
+ type: "object",
2065
+ required: ["type"],
2066
+ properties: {
2067
+ key: {
2068
+ type: "string"
2069
+ },
2070
+ type: {
2071
+ type: "string",
2072
+ enum: NON_RECORD_ACTION_TYPE_ENUM
2073
+ },
2074
+ settings: ANY_OBJECT_SCHEMA,
2075
+ popup: ref("FlowSurfaceComposeActionPopup")
2076
+ },
2077
+ additionalProperties: false
2078
+ }
2079
+ ]
2080
+ },
2081
+ FlowSurfaceComposeRecordActionSpec: {
2082
+ oneOf: [
2083
+ {
2084
+ type: "string"
2085
+ },
2086
+ {
2087
+ type: "object",
2088
+ required: ["type"],
2089
+ properties: {
2090
+ key: {
2091
+ type: "string"
2092
+ },
2093
+ type: {
2094
+ type: "string",
2095
+ enum: RECORD_ACTION_TYPE_ENUM
2096
+ },
2097
+ settings: ANY_OBJECT_SCHEMA,
2098
+ popup: ref("FlowSurfaceComposeActionPopup")
2099
+ },
2100
+ additionalProperties: false
2101
+ }
2102
+ ]
2103
+ },
2104
+ FlowSurfaceComposeBlockSpec: {
2105
+ type: "object",
2106
+ required: ["key"],
2107
+ anyOf: [{ required: ["type"] }, { required: ["template"] }],
2108
+ properties: {
2109
+ key: {
2110
+ type: "string"
2111
+ },
2112
+ type: {
2113
+ type: "string",
2114
+ enum: [
2115
+ "table",
2116
+ "createForm",
2117
+ "editForm",
2118
+ "details",
2119
+ "filterForm",
2120
+ "list",
2121
+ "gridCard",
2122
+ "markdown",
2123
+ "iframe",
2124
+ "chart",
2125
+ "actionPanel",
2126
+ "jsBlock"
2127
+ ]
2128
+ },
2129
+ template: ref("FlowSurfaceBlockTemplateRef"),
2130
+ resource: ref("FlowSurfaceBlockResourceInput"),
2131
+ settings: ANY_OBJECT_SCHEMA,
2132
+ fields: {
2133
+ type: "array",
2134
+ items: ref("FlowSurfaceComposeFieldSpec")
2135
+ },
2136
+ actions: {
2137
+ type: "array",
2138
+ description: "Block-level actions. For table/list/gridCard, prefer block-wide collection actions here.",
2139
+ items: ref("FlowSurfaceComposeActionSpec")
2140
+ },
2141
+ recordActions: {
2142
+ type: "array",
2143
+ description: "Public semantic group for record/item-level actions on record-capable blocks such as table/details/list/gridCard.",
2144
+ items: ref("FlowSurfaceComposeRecordActionSpec")
2145
+ }
2146
+ },
2147
+ additionalProperties: false
2148
+ },
2149
+ FlowSurfaceComposeRequest: {
2150
+ type: "object",
2151
+ required: ["target"],
2152
+ properties: {
2153
+ target: ref("FlowSurfaceWriteTarget"),
2154
+ mode: {
2155
+ type: "string",
2156
+ enum: ["append", "replace"],
2157
+ default: "append"
2158
+ },
2159
+ blocks: {
2160
+ type: "array",
2161
+ items: ref("FlowSurfaceComposeBlockSpec")
2162
+ },
2163
+ layout: ref("FlowSurfaceComposeLayout")
2164
+ },
2165
+ additionalProperties: false
2166
+ },
2167
+ FlowSurfaceComposeFieldResult: {
2168
+ type: "object",
2169
+ properties: {
2170
+ key: {
2171
+ type: "string"
2172
+ },
2173
+ fieldPath: {
2174
+ type: "string"
2175
+ },
2176
+ renderer: {
2177
+ type: "string",
2178
+ enum: ["js"]
2179
+ },
2180
+ type: {
2181
+ type: "string",
2182
+ enum: ["jsColumn", "jsItem"]
2183
+ },
2184
+ uid: {
2185
+ type: "string"
2186
+ },
2187
+ associationPathName: {
2188
+ type: "string",
2189
+ nullable: true
2190
+ },
2191
+ target: {
2192
+ type: "string"
2193
+ },
2194
+ wrapperUid: {
2195
+ type: "string"
2196
+ },
2197
+ fieldUid: {
2198
+ type: "string"
2199
+ },
2200
+ innerFieldUid: {
2201
+ type: "string"
2202
+ },
2203
+ popupPageUid: {
2204
+ type: "string"
2205
+ },
2206
+ popupTabUid: {
2207
+ type: "string"
2208
+ },
2209
+ popupGridUid: {
2210
+ type: "string"
2211
+ }
2212
+ },
2213
+ additionalProperties: false
2214
+ },
2215
+ FlowSurfaceComposeActionResult: {
2216
+ type: "object",
2217
+ properties: {
2218
+ key: {
2219
+ type: "string"
2220
+ },
2221
+ type: {
2222
+ type: "string",
2223
+ enum: ACTION_TYPE_ENUM
2224
+ },
2225
+ scope: {
2226
+ type: "string"
2227
+ },
2228
+ uid: {
2229
+ type: "string"
2230
+ },
2231
+ parentUid: {
2232
+ type: "string"
2233
+ },
2234
+ assignFormUid: {
2235
+ type: "string"
2236
+ },
2237
+ assignFormGridUid: {
2238
+ type: "string"
2239
+ },
2240
+ popupPageUid: {
2241
+ type: "string"
2242
+ },
2243
+ popupTabUid: {
2244
+ type: "string"
2245
+ },
2246
+ popupGridUid: {
2247
+ type: "string"
2248
+ }
2249
+ },
2250
+ additionalProperties: false
2251
+ },
2252
+ FlowSurfaceComposeBlockResult: {
2253
+ type: "object",
2254
+ properties: {
2255
+ key: {
2256
+ type: "string"
2257
+ },
2258
+ type: {
2259
+ type: "string",
2260
+ enum: [
2261
+ "table",
2262
+ "createForm",
2263
+ "editForm",
2264
+ "details",
2265
+ "filterForm",
2266
+ "list",
2267
+ "gridCard",
2268
+ "markdown",
2269
+ "iframe",
2270
+ "chart",
2271
+ "actionPanel",
2272
+ "jsBlock"
2273
+ ]
2274
+ },
2275
+ uid: {
2276
+ type: "string"
2277
+ },
2278
+ gridUid: {
2279
+ type: "string"
2280
+ },
2281
+ itemUid: {
2282
+ type: "string"
2283
+ },
2284
+ itemGridUid: {
2285
+ type: "string"
2286
+ },
2287
+ actionsColumnUid: {
2288
+ type: "string"
2289
+ },
2290
+ fields: {
2291
+ type: "array",
2292
+ items: ref("FlowSurfaceComposeFieldResult")
2293
+ },
2294
+ actions: {
2295
+ type: "array",
2296
+ items: ref("FlowSurfaceComposeActionResult")
2297
+ },
2298
+ recordActions: {
2299
+ type: "array",
2300
+ description: "Returned record/item-level action results for record-capable public compose semantics such as table/details/list/gridCard.",
2301
+ items: ref("FlowSurfaceComposeActionResult")
2302
+ }
2303
+ },
2304
+ additionalProperties: false
2305
+ },
2306
+ FlowSurfaceComposeResult: {
2307
+ type: "object",
2308
+ properties: {
2309
+ target: ref("FlowSurfaceWriteTarget"),
2310
+ mode: {
2311
+ type: "string",
2312
+ enum: ["append", "replace"]
2313
+ },
2314
+ blocks: {
2315
+ type: "array",
2316
+ items: ref("FlowSurfaceComposeBlockResult")
2317
+ },
2318
+ layout: ref("FlowSurfaceSetLayoutResult")
2319
+ },
2320
+ additionalProperties: false
2321
+ },
2322
+ FlowSurfaceReactionKind: {
2323
+ type: "string",
2324
+ enum: ["fieldValue", "blockLinkage", "fieldLinkage", "actionLinkage"]
2325
+ },
2326
+ FlowSurfaceReactionScene: {
2327
+ type: "string",
2328
+ enum: ["form", "block", "action", "details", "subForm"]
2329
+ },
2330
+ FlowSurfaceReactionSlot: {
2331
+ type: "object",
2332
+ required: ["flowKey", "stepKey"],
2333
+ properties: {
2334
+ flowKey: {
2335
+ type: "string",
2336
+ description: "Resolved flow-settings namespace that owns this reaction slot."
2337
+ },
2338
+ stepKey: {
2339
+ type: "string",
2340
+ description: "Resolved step key inside the flow-settings namespace."
2341
+ },
2342
+ valuePath: {
2343
+ type: "string",
2344
+ nullable: true,
2345
+ description: "Optional nested value path when the actual rules array is stored below the step root."
2346
+ }
2347
+ },
2348
+ additionalProperties: false
2349
+ },
2350
+ FlowSurfaceReactionTargetSummary: {
2351
+ type: "object",
2352
+ required: ["uid"],
2353
+ properties: {
2354
+ uid: {
2355
+ type: "string",
2356
+ description: "Resolved live target uid."
2357
+ },
2358
+ publicPath: {
2359
+ type: "string",
2360
+ description: "Resolved public path or bind-key style path when available."
2361
+ }
2362
+ },
2363
+ additionalProperties: false
2364
+ },
2365
+ FlowSurfaceReactionFilter: {
2366
+ type: "object",
2367
+ description: "Recursive public reaction filter object. Paths must use bare ctx-style paths such as `formValues.status` or `record.id`.",
2368
+ additionalProperties: true,
2369
+ example: FILTER_GROUP_EXAMPLE
2370
+ },
2371
+ FlowSurfaceReactionLiteralValueExpr: {
2372
+ type: "object",
2373
+ required: ["source", "value"],
2374
+ properties: {
2375
+ source: {
2376
+ type: "string",
2377
+ enum: ["literal"]
2378
+ },
2379
+ value: {}
2380
+ },
2381
+ additionalProperties: false
2382
+ },
2383
+ FlowSurfaceReactionPathValueExpr: {
2384
+ type: "object",
2385
+ required: ["source", "path"],
2386
+ properties: {
2387
+ source: {
2388
+ type: "string",
2389
+ enum: ["path"]
2390
+ },
2391
+ path: {
2392
+ type: "string",
2393
+ description: "Bare reaction context path such as `formValues.status` or `record.id`."
2394
+ }
2395
+ },
2396
+ additionalProperties: false
2397
+ },
2398
+ FlowSurfaceReactionRunJsValueExpr: {
2399
+ type: "object",
2400
+ required: ["source", "code"],
2401
+ properties: {
2402
+ source: {
2403
+ type: "string",
2404
+ enum: ["runjs"]
2405
+ },
2406
+ code: {
2407
+ type: "string"
2408
+ },
2409
+ version: {
2410
+ type: "string",
2411
+ enum: ["v1", "v2"]
2412
+ }
2413
+ },
2414
+ additionalProperties: false
2415
+ },
2416
+ FlowSurfaceReactionValueExpr: {
2417
+ oneOf: [
2418
+ ref("FlowSurfaceReactionLiteralValueExpr"),
2419
+ ref("FlowSurfaceReactionPathValueExpr"),
2420
+ ref("FlowSurfaceReactionRunJsValueExpr")
2421
+ ]
2422
+ },
2423
+ FlowSurfaceReactionValueExprMeta: {
2424
+ type: "object",
2425
+ required: ["supportedSources", "runjsScene"],
2426
+ properties: {
2427
+ supportedSources: {
2428
+ type: "array",
2429
+ items: {
2430
+ type: "string",
2431
+ enum: ["literal", "path", "runjs"]
2432
+ }
2433
+ },
2434
+ runjsScene: {
2435
+ type: "string",
2436
+ enum: ["fieldValue", "linkage"],
2437
+ description: 'RunJS evaluation scene used by this capability when `source: "runjs"` is allowed.'
2438
+ }
2439
+ },
2440
+ additionalProperties: false
2441
+ },
2442
+ FlowSurfaceReactionConditionMeta: {
2443
+ type: "object",
2444
+ required: ["operatorsByPath"],
2445
+ properties: {
2446
+ operatorsByPath: {
2447
+ type: "object",
2448
+ description: "Allowed operators keyed by bare reaction context path. Use this to drive condition builders instead of guessing path/operator pairs.",
2449
+ additionalProperties: {
2450
+ type: "array",
2451
+ items: {
2452
+ type: "string"
2453
+ }
2454
+ }
2455
+ }
2456
+ },
2457
+ additionalProperties: false
2458
+ },
2459
+ FlowSurfaceReactionSupportedAction: {
1972
2460
  type: "object",
2461
+ required: ["type"],
1973
2462
  properties: {
1974
- allowedKeys: {
2463
+ type: {
2464
+ type: "string",
2465
+ description: "Public reaction action type available in the resolved scene."
2466
+ },
2467
+ states: {
1975
2468
  type: "array",
2469
+ description: "Supported state names when the action type is state-based.",
1976
2470
  items: {
1977
2471
  type: "string"
1978
2472
  }
1979
- },
1980
- wildcard: {
1981
- type: "boolean"
1982
- },
1983
- mergeStrategy: ref("FlowSurfaceMergeStrategy"),
1984
- schema: ANY_OBJECT_SCHEMA,
1985
- groups: {
1986
- type: "object",
1987
- additionalProperties: ref("FlowSurfaceDomainGroupContract")
1988
2473
  }
1989
2474
  },
1990
2475
  additionalProperties: false
1991
2476
  },
1992
- FlowSurfaceNodeContract: {
2477
+ FlowSurfaceReactionUnavailableCapability: {
1993
2478
  type: "object",
2479
+ required: ["kind", "code", "reason"],
1994
2480
  properties: {
1995
- editableDomains: {
1996
- type: "array",
1997
- items: ref("FlowSurfaceNodeDomain")
1998
- },
1999
- domains: {
2000
- type: "object",
2001
- properties: {
2002
- props: ref("FlowSurfaceDomainContract"),
2003
- decoratorProps: ref("FlowSurfaceDomainContract"),
2004
- stepParams: ref("FlowSurfaceDomainContract"),
2005
- flowRegistry: ref("FlowSurfaceDomainContract")
2006
- },
2007
- additionalProperties: false
2481
+ kind: ref("FlowSurfaceReactionKind"),
2482
+ code: {
2483
+ type: "string"
2008
2484
  },
2009
- eventCapabilities: ref("FlowSurfaceEventCapabilities"),
2010
- layoutCapabilities: ref("FlowSurfaceLayoutCapabilities"),
2011
- eventBindings: ANY_OBJECT_SCHEMA
2485
+ reason: {
2486
+ type: "string"
2487
+ }
2012
2488
  },
2013
2489
  additionalProperties: false
2014
2490
  },
2015
- FlowSurfaceCatalogItem: {
2491
+ FlowSurfaceFieldOption: {
2016
2492
  type: "object",
2493
+ required: ["path", "label"],
2017
2494
  properties: {
2018
- key: {
2019
- type: "string"
2020
- },
2021
- label: {
2022
- type: "string"
2023
- },
2024
- use: {
2025
- type: "string"
2026
- },
2027
- kind: {
2495
+ path: {
2028
2496
  type: "string",
2029
- enum: ["page", "tab", "block", "field", "action"]
2497
+ description: "Targetable field path in the resolved scene."
2030
2498
  },
2031
- scene: {
2032
- type: "string"
2033
- },
2034
- fieldUse: {
2499
+ label: {
2035
2500
  type: "string"
2036
2501
  },
2037
- wrapperUse: {
2502
+ interface: {
2038
2503
  type: "string"
2039
2504
  },
2040
- associationPathName: {
2041
- type: "string",
2042
- nullable: true
2043
- },
2044
- defaultTargetUid: {
2505
+ type: {
2045
2506
  type: "string"
2046
2507
  },
2047
- targetBlockUid: {
2048
- type: "string"
2508
+ supportsDefault: {
2509
+ type: "boolean",
2510
+ description: "Whether this field can be targeted by default-value semantics."
2049
2511
  },
2050
- requiredInitParams: {
2051
- type: "array",
2052
- items: {
2053
- type: "string"
2054
- }
2512
+ supportsAssign: {
2513
+ type: "boolean",
2514
+ description: "Whether this field can be targeted by assignment semantics."
2055
2515
  },
2056
- allowedContainerUses: {
2516
+ supportsState: {
2057
2517
  type: "array",
2518
+ description: "Field-state transitions supported for this field in the resolved scene.",
2058
2519
  items: {
2059
2520
  type: "string"
2060
2521
  }
2061
- },
2062
- editableDomains: {
2063
- type: "array",
2064
- items: ref("FlowSurfaceNodeDomain")
2065
- },
2066
- configureOptions: ref("FlowSurfaceConfigureOptions"),
2067
- resourceBindings: {
2068
- type: "array",
2069
- items: ref("FlowSurfaceResourceBindingOption")
2070
- },
2071
- settingsSchema: ANY_OBJECT_SCHEMA,
2072
- settingsContract: {
2073
- type: "object",
2074
- properties: {
2075
- props: ref("FlowSurfaceDomainContract"),
2076
- decoratorProps: ref("FlowSurfaceDomainContract"),
2077
- stepParams: ref("FlowSurfaceDomainContract"),
2078
- flowRegistry: ref("FlowSurfaceDomainContract")
2079
- },
2080
- additionalProperties: false
2081
- },
2082
- eventCapabilities: ref("FlowSurfaceEventCapabilities"),
2083
- layoutCapabilities: ref("FlowSurfaceLayoutCapabilities"),
2084
- createSupported: {
2085
- type: "boolean"
2086
2522
  }
2087
2523
  },
2088
- additionalProperties: true
2524
+ additionalProperties: false
2089
2525
  },
2090
- FlowSurfaceGetTreeNode: {
2526
+ FlowSurfaceFieldValueRule: {
2091
2527
  type: "object",
2528
+ required: ["targetPath", "value"],
2092
2529
  properties: {
2093
- uid: {
2094
- type: "string"
2095
- },
2096
- use: {
2530
+ key: {
2097
2531
  type: "string"
2098
2532
  },
2099
- subKey: {
2533
+ title: {
2100
2534
  type: "string"
2101
2535
  },
2102
- subType: {
2103
- type: "string"
2536
+ enabled: {
2537
+ type: "boolean"
2104
2538
  },
2105
- fieldUse: {
2106
- type: "string"
2539
+ targetPath: {
2540
+ type: "string",
2541
+ description: "Field path that receives the computed/default value."
2107
2542
  },
2108
- schemaUid: {
2109
- type: "string"
2543
+ mode: {
2544
+ type: "string",
2545
+ enum: ["default", "assign"],
2546
+ description: "`default` writes default-value semantics, while `assign` writes reactive assignment semantics for the target field."
2110
2547
  },
2111
- props: ANY_OBJECT_SCHEMA,
2112
- decoratorProps: ANY_OBJECT_SCHEMA,
2113
- stepParams: ANY_OBJECT_SCHEMA,
2114
- flowRegistry: ANY_OBJECT_SCHEMA,
2115
- subModels: {
2116
- type: "object",
2117
- additionalProperties: {
2118
- oneOf: [
2119
- ref("FlowSurfaceGetTreeNode"),
2120
- {
2121
- type: "array",
2122
- items: ref("FlowSurfaceGetTreeNode")
2123
- }
2124
- ]
2125
- }
2126
- }
2548
+ when: ref("FlowSurfaceReactionFilter"),
2549
+ value: ref("FlowSurfaceReactionValueExpr")
2127
2550
  },
2128
- additionalProperties: true
2129
- },
2130
- FlowSurfaceNodeMap: {
2131
- type: "object",
2132
- additionalProperties: ref("FlowSurfaceGetTreeNode")
2551
+ additionalProperties: false
2133
2552
  },
2134
- FlowSurfaceRouteMeta: {
2553
+ FlowSurfaceReactionRunJsAction: {
2135
2554
  type: "object",
2555
+ required: ["type", "code"],
2136
2556
  properties: {
2137
- id: STRING_OR_INTEGER_SCHEMA,
2138
- type: {
2139
- type: "string"
2140
- },
2141
- title: {
2557
+ key: {
2142
2558
  type: "string"
2143
2559
  },
2144
- icon: {
2560
+ type: {
2145
2561
  type: "string",
2146
- nullable: true
2562
+ enum: ["runjs"]
2147
2563
  },
2148
- schemaUid: {
2564
+ code: {
2149
2565
  type: "string"
2150
2566
  },
2151
- tabSchemaName: {
2567
+ version: {
2568
+ type: "string",
2569
+ enum: ["v1", "v2"]
2570
+ }
2571
+ },
2572
+ additionalProperties: false
2573
+ },
2574
+ FlowSurfaceBlockLinkageActionSetBlockState: {
2575
+ type: "object",
2576
+ required: ["type", "state"],
2577
+ properties: {
2578
+ key: {
2152
2579
  type: "string"
2153
2580
  },
2154
- enableTabs: {
2155
- type: "boolean"
2156
- },
2157
- hidden: {
2158
- type: "boolean"
2159
- },
2160
- displayTitle: {
2161
- type: "boolean"
2162
- },
2163
- sort: {
2164
- type: "number"
2581
+ type: {
2582
+ type: "string",
2583
+ enum: ["setBlockState"]
2165
2584
  },
2166
- options: ANY_OBJECT_SCHEMA,
2167
- children: {
2168
- type: "array",
2169
- items: ref("FlowSurfaceRouteMeta")
2585
+ state: {
2586
+ type: "string",
2587
+ enum: ["visible", "hidden"]
2170
2588
  }
2171
2589
  },
2172
- additionalProperties: true
2590
+ additionalProperties: false
2173
2591
  },
2174
- FlowSurfaceNodeSpec: {
2592
+ FlowSurfaceBlockLinkageAction: {
2593
+ oneOf: [ref("FlowSurfaceBlockLinkageActionSetBlockState"), ref("FlowSurfaceReactionRunJsAction")]
2594
+ },
2595
+ FlowSurfaceBlockLinkageRule: {
2175
2596
  type: "object",
2176
- required: ["use"],
2597
+ required: ["then"],
2177
2598
  properties: {
2178
- uid: {
2599
+ key: {
2179
2600
  type: "string"
2180
2601
  },
2181
- clientKey: {
2602
+ title: {
2182
2603
  type: "string"
2183
2604
  },
2184
- use: {
2185
- type: "string"
2605
+ enabled: {
2606
+ type: "boolean"
2186
2607
  },
2187
- props: ANY_OBJECT_SCHEMA,
2188
- decoratorProps: ANY_OBJECT_SCHEMA,
2189
- stepParams: ANY_OBJECT_SCHEMA,
2190
- flowRegistry: ANY_OBJECT_SCHEMA,
2191
- subModels: {
2192
- type: "object",
2193
- additionalProperties: {
2194
- oneOf: [
2195
- ref("FlowSurfaceNodeSpec"),
2196
- {
2197
- type: "array",
2198
- items: ref("FlowSurfaceNodeSpec")
2199
- }
2200
- ]
2201
- }
2608
+ when: ref("FlowSurfaceReactionFilter"),
2609
+ then: {
2610
+ type: "array",
2611
+ items: ref("FlowSurfaceBlockLinkageAction")
2202
2612
  }
2203
2613
  },
2204
2614
  additionalProperties: false
2205
2615
  },
2206
- FlowSurfaceApplySpec: {
2616
+ FlowSurfaceActionLinkageActionSetActionState: {
2207
2617
  type: "object",
2618
+ required: ["type", "state"],
2208
2619
  properties: {
2209
- props: ANY_OBJECT_SCHEMA,
2210
- decoratorProps: ANY_OBJECT_SCHEMA,
2211
- stepParams: ANY_OBJECT_SCHEMA,
2212
- flowRegistry: ANY_OBJECT_SCHEMA,
2213
- subModels: {
2214
- type: "object",
2215
- additionalProperties: {
2216
- oneOf: [
2217
- ref("FlowSurfaceNodeSpec"),
2218
- {
2219
- type: "array",
2220
- items: ref("FlowSurfaceNodeSpec")
2221
- }
2222
- ]
2223
- }
2620
+ key: {
2621
+ type: "string"
2622
+ },
2623
+ type: {
2624
+ type: "string",
2625
+ enum: ["setActionState"]
2626
+ },
2627
+ state: {
2628
+ type: "string",
2629
+ enum: ["visible", "hidden", "hiddenText", "enabled", "disabled"]
2224
2630
  }
2225
2631
  },
2226
2632
  additionalProperties: false
2227
2633
  },
2228
- FlowSurfaceClientKeyMap: {
2229
- type: "object",
2230
- additionalProperties: {
2231
- type: "string"
2232
- }
2634
+ FlowSurfaceActionLinkageAction: {
2635
+ oneOf: [ref("FlowSurfaceActionLinkageActionSetActionState"), ref("FlowSurfaceReactionRunJsAction")]
2233
2636
  },
2234
- FlowSurfaceResourceInit: {
2637
+ FlowSurfaceActionLinkageRule: {
2235
2638
  type: "object",
2639
+ required: ["then"],
2236
2640
  properties: {
2237
- dataSourceKey: {
2238
- type: "string"
2239
- },
2240
- collectionName: {
2641
+ key: {
2241
2642
  type: "string"
2242
2643
  },
2243
- associationName: {
2644
+ title: {
2244
2645
  type: "string"
2245
2646
  },
2246
- associationPathName: {
2247
- type: "string"
2647
+ enabled: {
2648
+ type: "boolean"
2248
2649
  },
2249
- sourceId: STRING_OR_INTEGER_SCHEMA,
2250
- filterByTk: STRING_OR_INTEGER_SCHEMA
2650
+ when: ref("FlowSurfaceReactionFilter"),
2651
+ then: {
2652
+ type: "array",
2653
+ items: ref("FlowSurfaceActionLinkageAction")
2654
+ }
2251
2655
  },
2252
2656
  additionalProperties: false
2253
2657
  },
2254
- FlowSurfaceResourceBindingAssociationField: {
2658
+ FlowSurfaceFieldLinkageAssignItem: {
2255
2659
  type: "object",
2660
+ required: ["targetPath", "value"],
2256
2661
  properties: {
2257
2662
  key: {
2258
2663
  type: "string"
2259
2664
  },
2260
- label: {
2261
- type: "string"
2262
- },
2263
- collectionName: {
2264
- type: "string"
2665
+ enabled: {
2666
+ type: "boolean"
2265
2667
  },
2266
- associationName: {
2668
+ targetPath: {
2267
2669
  type: "string"
2268
- }
2670
+ },
2671
+ when: ref("FlowSurfaceReactionFilter"),
2672
+ value: ref("FlowSurfaceReactionValueExpr")
2269
2673
  },
2270
- required: ["key", "label", "collectionName"],
2271
2674
  additionalProperties: false
2272
2675
  },
2273
- FlowSurfaceResourceBindingOption: {
2676
+ FlowSurfaceFieldLinkageActionSetFieldState: {
2274
2677
  type: "object",
2678
+ required: ["type", "fieldPaths", "state"],
2275
2679
  properties: {
2276
2680
  key: {
2277
- type: "string",
2278
- enum: ["currentCollection", "currentRecord", "associatedRecords", "otherRecords"]
2279
- },
2280
- label: {
2281
2681
  type: "string"
2282
2682
  },
2283
- description: {
2284
- type: "string"
2683
+ type: {
2684
+ type: "string",
2685
+ enum: ["setFieldState"]
2285
2686
  },
2286
- requires: {
2687
+ fieldPaths: {
2287
2688
  type: "array",
2288
2689
  items: {
2289
2690
  type: "string"
2290
2691
  }
2291
2692
  },
2292
- dataSourceKey: {
2693
+ state: {
2694
+ type: "string",
2695
+ enum: ["visible", "hidden", "hiddenReservedValue", "required", "notRequired", "disabled", "enabled"]
2696
+ }
2697
+ },
2698
+ additionalProperties: false
2699
+ },
2700
+ FlowSurfaceFieldLinkageActionAssignField: {
2701
+ type: "object",
2702
+ required: ["type", "items"],
2703
+ properties: {
2704
+ key: {
2293
2705
  type: "string"
2294
2706
  },
2295
- collectionName: {
2296
- type: "string"
2707
+ type: {
2708
+ type: "string",
2709
+ enum: ["assignField"]
2297
2710
  },
2298
- associationFields: {
2711
+ items: {
2299
2712
  type: "array",
2300
- items: ref("FlowSurfaceResourceBindingAssociationField")
2713
+ items: ref("FlowSurfaceFieldLinkageAssignItem")
2301
2714
  }
2302
2715
  },
2303
- required: ["key", "label"],
2304
2716
  additionalProperties: false
2305
2717
  },
2306
- FlowSurfaceSemanticResourceInput: {
2718
+ FlowSurfaceFieldLinkageActionSetFieldDefaultValue: {
2307
2719
  type: "object",
2308
- required: ["binding"],
2720
+ required: ["type", "items"],
2309
2721
  properties: {
2310
- binding: {
2722
+ key: {
2723
+ type: "string"
2724
+ },
2725
+ type: {
2311
2726
  type: "string",
2312
- enum: ["currentCollection", "currentRecord", "associatedRecords", "otherRecords"]
2727
+ enum: ["setFieldDefaultValue"]
2313
2728
  },
2314
- dataSourceKey: {
2729
+ items: {
2730
+ type: "array",
2731
+ items: ref("FlowSurfaceFieldLinkageAssignItem")
2732
+ }
2733
+ },
2734
+ additionalProperties: false
2735
+ },
2736
+ FlowSurfaceFieldLinkageAction: {
2737
+ oneOf: [
2738
+ ref("FlowSurfaceFieldLinkageActionSetFieldState"),
2739
+ ref("FlowSurfaceFieldLinkageActionAssignField"),
2740
+ ref("FlowSurfaceFieldLinkageActionSetFieldDefaultValue"),
2741
+ ref("FlowSurfaceReactionRunJsAction")
2742
+ ]
2743
+ },
2744
+ FlowSurfaceFieldLinkageRule: {
2745
+ type: "object",
2746
+ required: ["then"],
2747
+ properties: {
2748
+ key: {
2315
2749
  type: "string"
2316
2750
  },
2317
- collectionName: {
2751
+ title: {
2318
2752
  type: "string"
2319
2753
  },
2320
- associationField: {
2321
- type: "string"
2754
+ enabled: {
2755
+ type: "boolean"
2756
+ },
2757
+ when: ref("FlowSurfaceReactionFilter"),
2758
+ then: {
2759
+ type: "array",
2760
+ items: ref("FlowSurfaceFieldLinkageAction")
2322
2761
  }
2323
2762
  },
2324
2763
  additionalProperties: false
2325
2764
  },
2326
- FlowSurfaceBlockResourceInput: {
2327
- oneOf: [ref("FlowSurfaceSemanticResourceInput"), ref("FlowSurfaceResourceInit")]
2765
+ FlowSurfaceFieldValueCapability: buildReactionCapabilitySchema("fieldValue", "FlowSurfaceFieldValueRule", {
2766
+ targetFields: {
2767
+ type: "array",
2768
+ description: "Fields that can receive field-value writes in the resolved scene.",
2769
+ items: ref("FlowSurfaceFieldOption")
2770
+ },
2771
+ valueExprMeta: {
2772
+ allOf: [ref("FlowSurfaceReactionValueExprMeta")],
2773
+ description: "Allowed value-expression sources for this capability."
2774
+ }
2775
+ }),
2776
+ FlowSurfaceBlockLinkageCapability: buildReactionCapabilitySchema("blockLinkage", "FlowSurfaceBlockLinkageRule", {
2777
+ supportedActions: {
2778
+ type: "array",
2779
+ description: "Block-level reaction actions supported in the resolved scene.",
2780
+ items: ref("FlowSurfaceReactionSupportedAction")
2781
+ },
2782
+ conditionMeta: {
2783
+ allOf: [ref("FlowSurfaceReactionConditionMeta")],
2784
+ description: "Condition-authoring metadata for this capability."
2785
+ }
2786
+ }),
2787
+ FlowSurfaceFieldLinkageCapability: buildReactionCapabilitySchema("fieldLinkage", "FlowSurfaceFieldLinkageRule", {
2788
+ supportedActions: {
2789
+ type: "array",
2790
+ description: "Field-linkage actions supported in the resolved scene.",
2791
+ items: ref("FlowSurfaceReactionSupportedAction")
2792
+ },
2793
+ targetFields: {
2794
+ type: "array",
2795
+ description: "Fields that can be targeted by field-linkage actions in the resolved scene.",
2796
+ items: ref("FlowSurfaceFieldOption")
2797
+ },
2798
+ conditionMeta: {
2799
+ allOf: [ref("FlowSurfaceReactionConditionMeta")],
2800
+ description: "Condition-authoring metadata for this capability."
2801
+ },
2802
+ valueExprMeta: {
2803
+ allOf: [ref("FlowSurfaceReactionValueExprMeta")],
2804
+ description: "Allowed value-expression sources for assignment/default actions in this capability."
2805
+ }
2806
+ }),
2807
+ FlowSurfaceActionLinkageCapability: buildReactionCapabilitySchema("actionLinkage", "FlowSurfaceActionLinkageRule", {
2808
+ supportedActions: {
2809
+ type: "array",
2810
+ description: "Action-linkage actions supported in the resolved scene.",
2811
+ items: ref("FlowSurfaceReactionSupportedAction")
2812
+ },
2813
+ conditionMeta: {
2814
+ allOf: [ref("FlowSurfaceReactionConditionMeta")],
2815
+ description: "Condition-authoring metadata for this capability."
2816
+ }
2817
+ }),
2818
+ FlowSurfaceReactionCapability: {
2819
+ oneOf: [
2820
+ ref("FlowSurfaceFieldValueCapability"),
2821
+ ref("FlowSurfaceBlockLinkageCapability"),
2822
+ ref("FlowSurfaceFieldLinkageCapability"),
2823
+ ref("FlowSurfaceActionLinkageCapability")
2824
+ ]
2328
2825
  },
2329
- FlowSurfaceMutateResourceInit: {
2826
+ FlowSurfaceGetReactionMetaRequest: {
2330
2827
  type: "object",
2828
+ required: ["target"],
2331
2829
  properties: {
2332
- dataSourceKey: ref("FlowSurfaceResolvableString"),
2333
- collectionName: ref("FlowSurfaceResolvableString"),
2334
- associationName: ref("FlowSurfaceResolvableString"),
2335
- associationPathName: ref("FlowSurfaceResolvableString"),
2336
- sourceId: ref("FlowSurfaceResolvableIdentifier"),
2337
- filterByTk: ref("FlowSurfaceResolvableIdentifier")
2830
+ target: ref("FlowSurfaceWriteTarget")
2338
2831
  },
2339
2832
  additionalProperties: false
2340
2833
  },
2341
- FlowSurfaceCatalogRequest: {
2834
+ FlowSurfaceGetReactionMetaResult: {
2342
2835
  type: "object",
2836
+ required: ["target", "capabilities", "unavailable"],
2343
2837
  properties: {
2344
- target: ref("FlowSurfaceWriteTarget")
2838
+ target: ref("FlowSurfaceReactionTargetSummary"),
2839
+ capabilities: {
2840
+ type: "array",
2841
+ items: ref("FlowSurfaceReactionCapability")
2842
+ },
2843
+ unavailable: {
2844
+ type: "array",
2845
+ items: ref("FlowSurfaceReactionUnavailableCapability")
2846
+ }
2345
2847
  },
2346
2848
  additionalProperties: false
2347
2849
  },
2348
- FlowSurfaceCatalogResponse: {
2850
+ FlowSurfaceSetFieldValueRulesRequest: buildReactionWriteRequestSchema("FlowSurfaceFieldValueRule"),
2851
+ FlowSurfaceSetFieldValueRulesResult: buildReactionWriteResultSchema("FlowSurfaceFieldValueRule"),
2852
+ FlowSurfaceSetBlockLinkageRulesRequest: buildReactionWriteRequestSchema("FlowSurfaceBlockLinkageRule"),
2853
+ FlowSurfaceSetBlockLinkageRulesResult: buildReactionWriteResultSchema("FlowSurfaceBlockLinkageRule"),
2854
+ FlowSurfaceSetFieldLinkageRulesRequest: buildReactionWriteRequestSchema("FlowSurfaceFieldLinkageRule"),
2855
+ FlowSurfaceSetFieldLinkageRulesResult: buildReactionWriteResultSchema("FlowSurfaceFieldLinkageRule"),
2856
+ FlowSurfaceSetActionLinkageRulesRequest: buildReactionWriteRequestSchema("FlowSurfaceActionLinkageRule"),
2857
+ FlowSurfaceSetActionLinkageRulesResult: buildReactionWriteResultSchema("FlowSurfaceActionLinkageRule"),
2858
+ FlowSurfaceApplyBlueprintReactionItemSetFieldValueRules: {
2349
2859
  type: "object",
2860
+ required: ["type", "target", "rules"],
2350
2861
  properties: {
2351
- target: {
2352
- allOf: [ref("FlowSurfaceResolvedTarget")],
2353
- nullable: true
2862
+ type: {
2863
+ type: "string",
2864
+ enum: ["setFieldValueRules"]
2354
2865
  },
2355
- blocks: {
2356
- type: "array",
2357
- items: ref("FlowSurfaceCatalogItem")
2866
+ target: {
2867
+ type: "string",
2868
+ description: "Bind key or local key of the reaction target resolved from the same blueprint run. The referenced node must have an explicit key/bind key in that blueprint result. For form field-value writes, point to the form block key/path, not the inner grid node."
2358
2869
  },
2359
- fields: {
2870
+ rules: {
2360
2871
  type: "array",
2361
- items: ref("FlowSurfaceCatalogItem")
2872
+ items: ref("FlowSurfaceFieldValueRule")
2362
2873
  },
2363
- actions: {
2364
- type: "array",
2365
- description: "Public block/form/filter-form/action-panel actions available under the resolved target.",
2366
- items: ref("FlowSurfaceCatalogItem")
2874
+ expectedFingerprint: {
2875
+ type: "string",
2876
+ description: "Optional optimistic-concurrency fingerprint from a prior `getReactionMeta` read of the same slot."
2877
+ }
2878
+ },
2879
+ additionalProperties: false
2880
+ },
2881
+ FlowSurfaceApplyBlueprintReactionItemSetBlockLinkageRules: {
2882
+ type: "object",
2883
+ required: ["type", "target", "rules"],
2884
+ properties: {
2885
+ type: {
2886
+ type: "string",
2887
+ enum: ["setBlockLinkageRules"]
2367
2888
  },
2368
- recordActions: {
2369
- type: "array",
2370
- description: "Public record/item-level actions exposed for record-capable targets such as table/details/list/gridCard.",
2371
- items: ref("FlowSurfaceCatalogItem")
2889
+ target: {
2890
+ type: "string",
2891
+ description: "Bind key or local key of the reaction target resolved from the same blueprint run. The referenced node must have an explicit key/bind key in that blueprint result."
2372
2892
  },
2373
- editableDomains: {
2893
+ rules: {
2374
2894
  type: "array",
2375
- items: ref("FlowSurfaceNodeDomain")
2376
- },
2377
- configureOptions: ref("FlowSurfaceConfigureOptions"),
2378
- settingsSchema: ANY_OBJECT_SCHEMA,
2379
- settingsContract: {
2380
- type: "object",
2381
- properties: {
2382
- props: ref("FlowSurfaceDomainContract"),
2383
- decoratorProps: ref("FlowSurfaceDomainContract"),
2384
- stepParams: ref("FlowSurfaceDomainContract"),
2385
- flowRegistry: ref("FlowSurfaceDomainContract")
2386
- },
2387
- additionalProperties: false
2895
+ items: ref("FlowSurfaceBlockLinkageRule")
2388
2896
  },
2389
- eventCapabilities: ref("FlowSurfaceEventCapabilities"),
2390
- layoutCapabilities: ref("FlowSurfaceLayoutCapabilities")
2897
+ expectedFingerprint: {
2898
+ type: "string",
2899
+ description: "Optional optimistic-concurrency fingerprint from a prior `getReactionMeta` read of the same slot."
2900
+ }
2391
2901
  },
2392
2902
  additionalProperties: false
2393
2903
  },
2394
- FlowSurfaceContextVarInfo: {
2904
+ FlowSurfaceApplyBlueprintReactionItemSetFieldLinkageRules: {
2395
2905
  type: "object",
2906
+ required: ["type", "target", "rules"],
2396
2907
  properties: {
2397
- title: {
2398
- type: "string"
2399
- },
2400
2908
  type: {
2401
- type: "string"
2402
- },
2403
- interface: {
2404
- type: "string"
2405
- },
2406
- description: {
2407
- type: "string"
2909
+ type: "string",
2910
+ enum: ["setFieldLinkageRules"]
2408
2911
  },
2409
- disabled: {
2410
- type: "boolean"
2912
+ target: {
2913
+ type: "string",
2914
+ description: "Bind key or local key of the reaction target resolved from the same blueprint run. The referenced node must have an explicit key/bind key in that blueprint result. Form-scene field linkage still targets the form block key/path, and the backend resolves the concrete grid slot."
2411
2915
  },
2412
- disabledReason: {
2413
- type: "string"
2916
+ rules: {
2917
+ type: "array",
2918
+ items: ref("FlowSurfaceFieldLinkageRule")
2414
2919
  },
2415
- properties: {
2416
- type: "object",
2417
- additionalProperties: ref("FlowSurfaceContextVarInfo")
2920
+ expectedFingerprint: {
2921
+ type: "string",
2922
+ description: "Optional optimistic-concurrency fingerprint from a prior `getReactionMeta` read of the same slot."
2418
2923
  }
2419
2924
  },
2420
2925
  additionalProperties: false
2421
2926
  },
2422
- FlowSurfaceContextRequest: {
2927
+ FlowSurfaceApplyBlueprintReactionItemSetActionLinkageRules: {
2423
2928
  type: "object",
2424
- required: ["target"],
2929
+ required: ["type", "target", "rules"],
2425
2930
  properties: {
2426
- target: ref("FlowSurfaceWriteTarget"),
2427
- path: {
2931
+ type: {
2428
2932
  type: "string",
2429
- description: "Bare path only, for example 'record', 'popup.record' or 'item.parentItem.value'."
2933
+ enum: ["setActionLinkageRules"]
2430
2934
  },
2431
- maxDepth: {
2432
- type: "integer",
2433
- minimum: 1
2935
+ target: {
2936
+ type: "string",
2937
+ description: "Bind key or local key of the reaction target resolved from the same blueprint run. The referenced node must have an explicit key/bind key in that blueprint result."
2938
+ },
2939
+ rules: {
2940
+ type: "array",
2941
+ items: ref("FlowSurfaceActionLinkageRule")
2942
+ },
2943
+ expectedFingerprint: {
2944
+ type: "string",
2945
+ description: "Optional optimistic-concurrency fingerprint from a prior `getReactionMeta` read of the same slot."
2434
2946
  }
2435
2947
  },
2436
2948
  additionalProperties: false
2437
2949
  },
2438
- FlowSurfaceContextResponse: {
2950
+ FlowSurfaceApplyBlueprintReactionItem: {
2951
+ oneOf: [
2952
+ ref("FlowSurfaceApplyBlueprintReactionItemSetFieldValueRules"),
2953
+ ref("FlowSurfaceApplyBlueprintReactionItemSetBlockLinkageRules"),
2954
+ ref("FlowSurfaceApplyBlueprintReactionItemSetFieldLinkageRules"),
2955
+ ref("FlowSurfaceApplyBlueprintReactionItemSetActionLinkageRules")
2956
+ ]
2957
+ },
2958
+ FlowSurfaceApplyBlueprintReaction: {
2439
2959
  type: "object",
2960
+ required: ["items"],
2961
+ description: "Optional whole-page reaction authoring section for blueprint-driven interaction logic. Each item must target an explicit same-run local key / bind key. Only explicitly listed items are written. Repeating the same `(type, target)` slot is invalid. In `replace`, include every slot that must exist in the resulting surface instead of relying on omission. Use localized `getReactionMeta` + `set*Rules` for edits on existing live surfaces.",
2440
2962
  properties: {
2441
- vars: {
2442
- type: "object",
2443
- additionalProperties: ref("FlowSurfaceContextVarInfo")
2963
+ items: {
2964
+ type: "array",
2965
+ items: ref("FlowSurfaceApplyBlueprintReactionItem")
2444
2966
  }
2445
2967
  },
2446
2968
  additionalProperties: false
2447
2969
  },
2448
- FlowSurfaceGetResponse: {
2970
+ FlowSurfaceApplyBlueprintAssets: {
2449
2971
  type: "object",
2450
2972
  properties: {
2451
- target: ref("FlowSurfaceReadTarget"),
2452
- tree: ref("FlowSurfaceGetTreeNode"),
2453
- nodeMap: ref("FlowSurfaceNodeMap"),
2454
- pageRoute: ref("FlowSurfaceRouteMeta"),
2455
- route: ref("FlowSurfaceRouteMeta")
2973
+ scripts: {
2974
+ type: "object",
2975
+ additionalProperties: ANY_OBJECT_SCHEMA
2976
+ },
2977
+ charts: {
2978
+ type: "object",
2979
+ additionalProperties: ANY_OBJECT_SCHEMA
2980
+ }
2456
2981
  },
2457
2982
  additionalProperties: false
2458
2983
  },
2459
- FlowSurfaceComposeLayoutCell: {
2984
+ FlowSurfaceApplyBlueprintLayoutCell: {
2460
2985
  oneOf: [
2461
2986
  {
2462
- type: "string"
2987
+ type: "string",
2988
+ description: "Local block key string in the current tab or popup scope."
2463
2989
  },
2464
2990
  {
2465
2991
  type: "object",
2992
+ description: "Layout cell object in the public applyBlueprint contract. Use only { key, span } to reference a local block key.",
2466
2993
  required: ["key"],
2467
2994
  properties: {
2468
2995
  key: {
2469
- type: "string"
2996
+ type: "string",
2997
+ description: "Local block key in the current tab or popup scope."
2470
2998
  },
2471
2999
  span: {
2472
3000
  type: "number"
@@ -2476,108 +3004,97 @@ const schemas = {
2476
3004
  }
2477
3005
  ]
2478
3006
  },
2479
- FlowSurfaceComposeLayout: {
3007
+ FlowSurfaceApplyBlueprintLayout: {
2480
3008
  type: "object",
3009
+ description: "Layout object allowed only on tabs and inline popup documents, never on individual blocks.",
2481
3010
  properties: {
2482
- rows: {
2483
- type: "array",
2484
- items: {
2485
- type: "array",
2486
- items: ref("FlowSurfaceComposeLayoutCell")
2487
- }
2488
- }
2489
- },
2490
- additionalProperties: false
2491
- },
2492
- FlowSurfaceComposeFieldSpec: {
2493
- oneOf: [
2494
- {
2495
- type: "string"
2496
- },
2497
- {
2498
- type: "object",
2499
- required: ["fieldPath"],
2500
- properties: {
2501
- key: {
2502
- type: "string"
2503
- },
2504
- fieldPath: {
2505
- type: "string"
2506
- },
2507
- renderer: {
2508
- type: "string",
2509
- enum: ["js"],
2510
- description: "Optional public renderer variant for a bound field."
2511
- },
2512
- associationPathName: {
2513
- type: "string"
2514
- },
2515
- target: {
2516
- type: "string",
2517
- description: "Reference to another compose block key, typically used by filter-form fields."
2518
- },
2519
- settings: ANY_OBJECT_SCHEMA,
2520
- popup: ref("FlowSurfaceComposeActionPopup")
2521
- },
2522
- additionalProperties: false
2523
- },
2524
- {
2525
- type: "object",
2526
- required: ["type"],
2527
- properties: {
2528
- key: {
2529
- type: "string"
2530
- },
2531
- type: {
2532
- type: "string",
2533
- enum: ["jsColumn", "jsItem"],
2534
- description: "Standalone synthetic public field capability. Does not accept fieldPath."
2535
- },
2536
- settings: ANY_OBJECT_SCHEMA
2537
- },
2538
- additionalProperties: false
3011
+ rows: {
3012
+ type: "array",
3013
+ description: "Two-dimensional layout grid. Each cell is either a block key string or an object { key, span }.",
3014
+ items: {
3015
+ type: "array",
3016
+ items: ref("FlowSurfaceApplyBlueprintLayoutCell")
3017
+ }
2539
3018
  }
2540
- ]
3019
+ },
3020
+ additionalProperties: false
2541
3021
  },
2542
- FlowSurfaceComposeActionPopup: {
3022
+ FlowSurfaceApplyBlueprintPopup: {
2543
3023
  type: "object",
2544
3024
  properties: {
3025
+ title: {
3026
+ type: "string"
3027
+ },
2545
3028
  mode: {
2546
3029
  type: "string",
2547
3030
  enum: ["append", "replace"]
2548
3031
  },
3032
+ template: ref("FlowSurfacePopupTemplateRef"),
2549
3033
  blocks: {
2550
3034
  type: "array",
2551
- items: ref("FlowSurfaceComposeBlockSpec")
3035
+ description: "Inline popup blocks. For custom `edit` popups, provide exactly one `editForm` block plus any optional sibling blocks.",
3036
+ items: ref("FlowSurfaceApplyBlueprintBlockSpec")
2552
3037
  },
2553
- layout: ref("FlowSurfaceComposeLayout")
3038
+ layout: {
3039
+ allOf: [ref("FlowSurfaceApplyBlueprintLayout")],
3040
+ description: "Popup-scoped layout. Layout is only allowed on tabs and popup documents, not on individual blocks."
3041
+ }
2554
3042
  },
2555
3043
  additionalProperties: false
2556
3044
  },
2557
- FlowSurfaceComposeActionSpec: {
3045
+ FlowSurfaceApplyBlueprintFieldSpec: {
2558
3046
  oneOf: [
2559
3047
  {
2560
3048
  type: "string"
2561
3049
  },
2562
3050
  {
2563
3051
  type: "object",
2564
- required: ["type"],
2565
3052
  properties: {
2566
- key: {
2567
- type: "string"
3053
+ key: { type: "string" },
3054
+ field: { type: "string" },
3055
+ associationPathName: { type: "string" },
3056
+ renderer: { type: "string" },
3057
+ type: { type: "string" },
3058
+ label: { type: "string" },
3059
+ target: {
3060
+ type: "string",
3061
+ description: "String block key on the same tab or popup scope, typically used by filter-form fields."
2568
3062
  },
3063
+ settings: ANY_OBJECT_SCHEMA,
3064
+ popup: ref("FlowSurfaceApplyBlueprintPopup"),
3065
+ script: { type: "string" },
3066
+ chart: { type: "string" }
3067
+ },
3068
+ additionalProperties: false
3069
+ }
3070
+ ]
3071
+ },
3072
+ FlowSurfaceApplyBlueprintActionSpec: {
3073
+ oneOf: [
3074
+ {
3075
+ type: "string"
3076
+ },
3077
+ {
3078
+ type: "object",
3079
+ required: ["type"],
3080
+ properties: {
3081
+ key: { type: "string" },
2569
3082
  type: {
2570
3083
  type: "string",
2571
- enum: NON_RECORD_ACTION_TYPE_ENUM
3084
+ enum: ACTION_TYPE_ENUM,
3085
+ description: "Action type. On record-capable blocks (`table`, `details`, `list`, `gridCard`), record actions such as `view`, `edit`, `updateRecord`, and `delete` should normally be authored under `recordActions`; applyBlueprint also auto-promotes them from `actions` for convenience. For custom `edit` popups, include exactly one `editForm` block inside popup.blocks."
2572
3086
  },
3087
+ title: { type: "string" },
2573
3088
  settings: ANY_OBJECT_SCHEMA,
2574
- popup: ref("FlowSurfaceComposeActionPopup")
3089
+ popup: ref("FlowSurfaceApplyBlueprintPopup"),
3090
+ script: { type: "string" },
3091
+ chart: { type: "string" }
2575
3092
  },
2576
3093
  additionalProperties: false
2577
3094
  }
2578
3095
  ]
2579
3096
  },
2580
- FlowSurfaceComposeRecordActionSpec: {
3097
+ FlowSurfaceApplyBlueprintRecordActionSpec: {
2581
3098
  oneOf: [
2582
3099
  {
2583
3100
  type: "string"
@@ -2586,231 +3103,210 @@ const schemas = {
2586
3103
  type: "object",
2587
3104
  required: ["type"],
2588
3105
  properties: {
2589
- key: {
2590
- type: "string"
2591
- },
3106
+ key: { type: "string" },
2592
3107
  type: {
2593
3108
  type: "string",
2594
- enum: RECORD_ACTION_TYPE_ENUM
3109
+ enum: RECORD_ACTION_TYPE_ENUM,
3110
+ description: "Record-action type for record-capable blocks such as `table`, `details`, `list`, and `gridCard`. For custom `edit` popups, include exactly one `editForm` block inside popup.blocks."
2595
3111
  },
3112
+ title: { type: "string" },
2596
3113
  settings: ANY_OBJECT_SCHEMA,
2597
- popup: ref("FlowSurfaceComposeActionPopup")
3114
+ popup: ref("FlowSurfaceApplyBlueprintPopup"),
3115
+ script: { type: "string" },
3116
+ chart: { type: "string" }
2598
3117
  },
2599
3118
  additionalProperties: false
2600
3119
  }
2601
3120
  ]
2602
3121
  },
2603
- FlowSurfaceComposeBlockSpec: {
3122
+ FlowSurfaceApplyBlueprintBlockSpec: {
2604
3123
  type: "object",
2605
- required: ["key", "type"],
3124
+ description: "Public applyBlueprint block spec. Blocks do not accept a `layout` property; use tab.layout or popup.layout instead. Generic `form` is not supported here; use `editForm` or `createForm`.",
3125
+ anyOf: [{ required: ["type"] }, { required: ["template"] }],
2606
3126
  properties: {
2607
- key: {
2608
- type: "string"
2609
- },
3127
+ key: { type: "string" },
2610
3128
  type: {
2611
3129
  type: "string",
2612
- enum: [
2613
- "table",
2614
- "createForm",
2615
- "editForm",
2616
- "details",
2617
- "filterForm",
2618
- "list",
2619
- "gridCard",
2620
- "markdown",
2621
- "iframe",
2622
- "chart",
2623
- "actionPanel",
2624
- "jsBlock"
2625
- ]
3130
+ enum: APPLY_BLUEPRINT_BLOCK_TYPE_ENUM,
3131
+ description: "Public applyBlueprint block type. Generic `form` is not supported; use `editForm` or `createForm`."
3132
+ },
3133
+ title: { type: "string" },
3134
+ collection: {
3135
+ type: "string",
3136
+ description: "Block-level shorthand collection name. When using the nested resource object instead, use resource.collectionName there."
3137
+ },
3138
+ dataSourceKey: { type: "string" },
3139
+ associationPathName: {
3140
+ type: "string",
3141
+ description: "Association field path used by raw resource-init shorthand. For popup association tables, prefer `resource.binding='associatedRecords'` with `associationField`; applyBlueprint only normalizes `currentRecord|associatedRecords + associationPathName` to that canonical form when `associationPathName` is a single association field name."
3142
+ },
3143
+ binding: {
3144
+ type: "string",
3145
+ enum: ["currentCollection", "currentRecord", "associatedRecords", "otherRecords"]
3146
+ },
3147
+ associationField: {
3148
+ type: "string",
3149
+ description: "Canonical association field name for popup `associatedRecords` binding. Prefer this over `associationPathName` when authoring relation tables inside record popups."
2626
3150
  },
2627
3151
  resource: ref("FlowSurfaceBlockResourceInput"),
3152
+ template: ref("FlowSurfaceBlockTemplateRef"),
2628
3153
  settings: ANY_OBJECT_SCHEMA,
2629
3154
  fields: {
2630
3155
  type: "array",
2631
- items: ref("FlowSurfaceComposeFieldSpec")
3156
+ items: ref("FlowSurfaceApplyBlueprintFieldSpec")
2632
3157
  },
2633
3158
  actions: {
2634
3159
  type: "array",
2635
- description: "Block-level actions. For table/list/gridCard, prefer block-wide collection actions here.",
2636
- items: ref("FlowSurfaceComposeActionSpec")
3160
+ description: "Block-level actions. On record-capable blocks, `view`, `edit`, `updateRecord`, and `delete` should normally go to `recordActions`; applyBlueprint auto-promotes those common record actions when they are written here.",
3161
+ items: ref("FlowSurfaceApplyBlueprintActionSpec")
2637
3162
  },
2638
3163
  recordActions: {
2639
3164
  type: "array",
2640
- description: "Public semantic group for record/item-level actions on record-capable blocks such as table/details/list/gridCard.",
2641
- items: ref("FlowSurfaceComposeRecordActionSpec")
2642
- }
3165
+ items: ref("FlowSurfaceApplyBlueprintRecordActionSpec")
3166
+ },
3167
+ script: { type: "string" },
3168
+ chart: { type: "string" }
2643
3169
  },
2644
3170
  additionalProperties: false
2645
3171
  },
2646
- FlowSurfaceComposeRequest: {
3172
+ FlowSurfaceApplyBlueprintTab: {
2647
3173
  type: "object",
2648
- required: ["target"],
3174
+ required: ["blocks"],
2649
3175
  properties: {
2650
- target: ref("FlowSurfaceWriteTarget"),
2651
- mode: {
3176
+ key: {
2652
3177
  type: "string",
2653
- enum: ["append", "replace"],
2654
- default: "append"
3178
+ description: "Optional local tab key used only inside the current applyBlueprint document for layout or in-document references. It is not used to match existing route-backed tabs in replace mode. When omitted, the server generates one."
2655
3179
  },
3180
+ title: { type: "string" },
3181
+ icon: { type: "string" },
3182
+ documentTitle: { type: "string" },
2656
3183
  blocks: {
2657
3184
  type: "array",
2658
- items: ref("FlowSurfaceComposeBlockSpec")
3185
+ minItems: 1,
3186
+ items: ref("FlowSurfaceApplyBlueprintBlockSpec")
2659
3187
  },
2660
- layout: ref("FlowSurfaceComposeLayout")
3188
+ layout: {
3189
+ allOf: [ref("FlowSurfaceApplyBlueprintLayout")],
3190
+ description: "Tab-scoped layout. Layout is allowed here and on popup documents, not on individual blocks."
3191
+ }
2661
3192
  },
2662
3193
  additionalProperties: false
2663
3194
  },
2664
- FlowSurfaceComposeFieldResult: {
3195
+ FlowSurfaceApplyBlueprintNavigationGroup: {
2665
3196
  type: "object",
2666
3197
  properties: {
2667
- key: {
2668
- type: "string"
2669
- },
2670
- fieldPath: {
2671
- type: "string"
3198
+ routeId: {
3199
+ ...STRING_OR_INTEGER_SCHEMA,
3200
+ description: "Preferred existing menu-group route id for exact targeting. Do not mix it with title/icon/tooltip/hideInMenu. applyBlueprint create mode does not mutate existing group metadata; use low-level updateMenu separately when needed."
2672
3201
  },
2673
- renderer: {
3202
+ title: {
2674
3203
  type: "string",
2675
- enum: ["js"]
3204
+ description: "Group title for create mode. When `routeId` is omitted, applyBlueprint reuses a same-title group if the match is unique, creates one when no group exists, and rejects ambiguous multi-match cases. Same-title reuse is title-only; if an existing group's metadata must change, use low-level updateMenu instead of applyBlueprint create."
2676
3205
  },
2677
- type: {
3206
+ icon: {
2678
3207
  type: "string",
2679
- enum: ["jsColumn", "jsItem"]
3208
+ description: "Group icon used only when create mode actually creates a new menu group. Not allowed together with routeId."
2680
3209
  },
2681
- uid: {
2682
- type: "string"
2683
- },
2684
- associationPathName: {
3210
+ tooltip: {
2685
3211
  type: "string",
2686
- nullable: true
2687
- },
2688
- target: {
2689
- type: "string"
2690
- },
2691
- wrapperUid: {
2692
- type: "string"
2693
- },
2694
- fieldUid: {
2695
- type: "string"
2696
- },
2697
- innerFieldUid: {
2698
- type: "string"
2699
- },
2700
- popupPageUid: {
2701
- type: "string"
2702
- },
2703
- popupTabUid: {
2704
- type: "string"
3212
+ description: "Group tooltip used only when create mode actually creates a new menu group. Not allowed together with routeId."
2705
3213
  },
2706
- popupGridUid: {
2707
- type: "string"
3214
+ hideInMenu: {
3215
+ type: "boolean",
3216
+ description: "Group hidden-state used only when create mode actually creates a new menu group. Not allowed together with routeId."
2708
3217
  }
2709
3218
  },
2710
3219
  additionalProperties: false
2711
3220
  },
2712
- FlowSurfaceComposeActionResult: {
3221
+ FlowSurfaceApplyBlueprintNavigation: {
2713
3222
  type: "object",
2714
3223
  properties: {
2715
- key: {
2716
- type: "string"
2717
- },
2718
- type: {
2719
- type: "string",
2720
- enum: ACTION_TYPE_ENUM
2721
- },
2722
- uid: {
2723
- type: "string"
2724
- },
2725
- parentUid: {
2726
- type: "string"
2727
- },
2728
- assignFormUid: {
2729
- type: "string"
2730
- },
2731
- assignFormGridUid: {
2732
- type: "string"
2733
- },
2734
- popupPageUid: {
2735
- type: "string"
2736
- },
2737
- popupTabUid: {
2738
- type: "string"
2739
- },
2740
- popupGridUid: {
2741
- type: "string"
3224
+ group: ref("FlowSurfaceApplyBlueprintNavigationGroup"),
3225
+ item: {
3226
+ type: "object",
3227
+ properties: {
3228
+ title: { type: "string" },
3229
+ icon: { type: "string" },
3230
+ tooltip: { type: "string" },
3231
+ hideInMenu: { type: "boolean" }
3232
+ },
3233
+ additionalProperties: false
2742
3234
  }
2743
3235
  },
2744
3236
  additionalProperties: false
2745
3237
  },
2746
- FlowSurfaceComposeBlockResult: {
3238
+ FlowSurfaceApplyBlueprintPage: {
2747
3239
  type: "object",
2748
3240
  properties: {
2749
- key: {
2750
- type: "string"
2751
- },
2752
- type: {
3241
+ title: { type: "string" },
3242
+ icon: { type: "string" },
3243
+ documentTitle: { type: "string" },
3244
+ enableHeader: { type: "boolean" },
3245
+ enableTabs: { type: "boolean" },
3246
+ displayTitle: { type: "boolean" }
3247
+ },
3248
+ additionalProperties: false
3249
+ },
3250
+ FlowSurfaceApplyBlueprintTarget: {
3251
+ type: "object",
3252
+ required: ["pageSchemaUid"],
3253
+ properties: {
3254
+ pageSchemaUid: { type: "string" }
3255
+ },
3256
+ additionalProperties: false
3257
+ },
3258
+ FlowSurfaceApplyBlueprintRequest: {
3259
+ type: "object",
3260
+ required: ["mode", "tabs"],
3261
+ description: "Simplified page-structure request object for applyBlueprint. `version` may be omitted and defaults to '1'. Runtime validation enforces mode-specific rules: create does not accept target, while replace requires target.pageSchemaUid and does not use navigation.",
3262
+ properties: {
3263
+ version: {
2753
3264
  type: "string",
2754
- enum: [
2755
- "table",
2756
- "createForm",
2757
- "editForm",
2758
- "details",
2759
- "filterForm",
2760
- "list",
2761
- "gridCard",
2762
- "markdown",
2763
- "iframe",
2764
- "chart",
2765
- "actionPanel",
2766
- "jsBlock"
2767
- ]
2768
- },
2769
- uid: {
2770
- type: "string"
3265
+ enum: ["1"]
2771
3266
  },
2772
- gridUid: {
2773
- type: "string"
3267
+ mode: {
3268
+ type: "string",
3269
+ enum: ["create", "replace"]
2774
3270
  },
2775
- itemUid: {
2776
- type: "string"
3271
+ target: ref("FlowSurfaceApplyBlueprintTarget"),
3272
+ navigation: ref("FlowSurfaceApplyBlueprintNavigation"),
3273
+ page: ref("FlowSurfaceApplyBlueprintPage"),
3274
+ tabs: {
3275
+ type: "array",
3276
+ minItems: 1,
3277
+ items: ref("FlowSurfaceApplyBlueprintTab")
2777
3278
  },
2778
- itemGridUid: {
3279
+ assets: ref("FlowSurfaceApplyBlueprintAssets"),
3280
+ reaction: ref("FlowSurfaceApplyBlueprintReaction")
3281
+ },
3282
+ additionalProperties: false
3283
+ },
3284
+ FlowSurfaceApplyBlueprintResponseTarget: {
3285
+ type: "object",
3286
+ properties: {
3287
+ pageSchemaUid: {
2779
3288
  type: "string"
2780
3289
  },
2781
- actionsColumnUid: {
3290
+ pageUid: {
2782
3291
  type: "string"
2783
- },
2784
- fields: {
2785
- type: "array",
2786
- items: ref("FlowSurfaceComposeFieldResult")
2787
- },
2788
- actions: {
2789
- type: "array",
2790
- items: ref("FlowSurfaceComposeActionResult")
2791
- },
2792
- recordActions: {
2793
- type: "array",
2794
- description: "Returned record/item-level action results for record-capable public compose semantics such as table/details/list/gridCard.",
2795
- items: ref("FlowSurfaceComposeActionResult")
2796
3292
  }
2797
3293
  },
2798
3294
  additionalProperties: false
2799
3295
  },
2800
- FlowSurfaceComposeResult: {
3296
+ FlowSurfaceApplyBlueprintResponse: {
2801
3297
  type: "object",
3298
+ required: ["version", "mode", "target", "surface"],
2802
3299
  properties: {
2803
- target: ref("FlowSurfaceWriteTarget"),
2804
- mode: {
3300
+ version: {
2805
3301
  type: "string",
2806
- enum: ["append", "replace"]
3302
+ enum: ["1"]
2807
3303
  },
2808
- keyToUid: ref("FlowSurfaceClientKeyMap"),
2809
- blocks: {
2810
- type: "array",
2811
- items: ref("FlowSurfaceComposeBlockResult")
3304
+ mode: {
3305
+ type: "string",
3306
+ enum: ["create", "replace"]
2812
3307
  },
2813
- layout: ref("FlowSurfaceSetLayoutResult")
3308
+ target: ref("FlowSurfaceApplyBlueprintResponseTarget"),
3309
+ surface: ref("FlowSurfaceGetResponse")
2814
3310
  },
2815
3311
  additionalProperties: false
2816
3312
  },
@@ -3305,6 +3801,7 @@ const schemas = {
3305
3801
  use: {
3306
3802
  type: "string"
3307
3803
  },
3804
+ template: ref("FlowSurfaceBlockTemplateRef"),
3308
3805
  resource: ref("FlowSurfaceBlockResourceInput"),
3309
3806
  resourceInit: ref("FlowSurfaceResourceInit"),
3310
3807
  settings: ANY_OBJECT_SCHEMA
@@ -3359,8 +3856,17 @@ const schemas = {
3359
3856
  FlowSurfaceAddFieldRequest: {
3360
3857
  type: "object",
3361
3858
  required: ["target"],
3859
+ oneOf: [
3860
+ {
3861
+ required: ["template"]
3862
+ },
3863
+ {
3864
+ anyOf: [{ required: ["fieldPath"] }, { required: ["type"] }]
3865
+ }
3866
+ ],
3362
3867
  properties: {
3363
3868
  target: ref("FlowSurfaceWriteTarget"),
3869
+ template: ref("FlowSurfaceTemplateRef"),
3364
3870
  fieldPath: {
3365
3871
  type: "string",
3366
3872
  description: "Required for bound fields. Omit when using synthetic standalone types such as jsColumn/jsItem."
@@ -3396,10 +3902,10 @@ const schemas = {
3396
3902
  },
3397
3903
  targetUid: {
3398
3904
  type: "string",
3399
- description: "Legacy alias used by filter-form target selection. This is not the same field as `target.uid`."
3905
+ description: "Optional filter-form target selection key. This is not the same field as `target.uid`."
3400
3906
  },
3401
3907
  settings: ANY_OBJECT_SCHEMA,
3402
- popup: ref("FlowSurfaceComposeActionPopup")
3908
+ popup: ref("FlowSurfaceComposeFieldPopup")
3403
3909
  },
3404
3910
  additionalProperties: false
3405
3911
  },
@@ -3572,6 +4078,7 @@ const schemas = {
3572
4078
  use: {
3573
4079
  type: "string"
3574
4080
  },
4081
+ template: ref("FlowSurfaceBlockTemplateRef"),
3575
4082
  resource: ref("FlowSurfaceBlockResourceInput"),
3576
4083
  resourceInit: ref("FlowSurfaceResourceInit"),
3577
4084
  settings: ANY_OBJECT_SCHEMA
@@ -3580,10 +4087,19 @@ const schemas = {
3580
4087
  },
3581
4088
  FlowSurfaceAddFieldItem: {
3582
4089
  type: "object",
4090
+ oneOf: [
4091
+ {
4092
+ required: ["template"]
4093
+ },
4094
+ {
4095
+ anyOf: [{ required: ["fieldPath"] }, { required: ["type"] }]
4096
+ }
4097
+ ],
3583
4098
  properties: {
3584
4099
  key: {
3585
4100
  type: "string"
3586
4101
  },
4102
+ template: ref("FlowSurfaceTemplateRef"),
3587
4103
  fieldPath: {
3588
4104
  type: "string"
3589
4105
  },
@@ -3617,7 +4133,7 @@ const schemas = {
3617
4133
  type: "string"
3618
4134
  },
3619
4135
  settings: ANY_OBJECT_SCHEMA,
3620
- popup: ref("FlowSurfaceComposeActionPopup")
4136
+ popup: ref("FlowSurfaceComposeFieldPopup")
3621
4137
  },
3622
4138
  additionalProperties: false
3623
4139
  },
@@ -3673,9 +4189,18 @@ const schemas = {
3673
4189
  },
3674
4190
  FlowSurfaceAddFieldsRequest: {
3675
4191
  type: "object",
3676
- required: ["target", "fields"],
4192
+ required: ["target"],
4193
+ oneOf: [
4194
+ {
4195
+ required: ["template"]
4196
+ },
4197
+ {
4198
+ required: ["fields"]
4199
+ }
4200
+ ],
3677
4201
  properties: {
3678
4202
  target: ref("FlowSurfaceWriteTarget"),
4203
+ template: ref("FlowSurfaceTemplateRef"),
3679
4204
  fields: {
3680
4205
  type: "array",
3681
4206
  items: ref("FlowSurfaceAddFieldItem")
@@ -4167,7 +4692,7 @@ const schemas = {
4167
4692
  target: ref("FlowSurfaceMutateWriteTarget"),
4168
4693
  values: {
4169
4694
  ...ANY_OBJECT_SCHEMA,
4170
- description: 'Business payload for the corresponding `/flowSurfaces:<type>` action. Nested refs must use `{ ref: "<opId>.<path>" }`.'
4695
+ description: 'Business payload for the corresponding `/flowSurfaces:<type>` action. Nested runtime values must use `{ step: "<opId>", path: "<field>" }` or `{ key: "<opId>" }`.'
4171
4696
  }
4172
4697
  },
4173
4698
  additionalProperties: false