@uipath/maestro-builder-sdk 6.18.10 → 6.20.0

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 (134) hide show
  1. package/dist/api-index.md +185 -184
  2. package/dist/api-members.md +506 -473
  3. package/dist/check.js +358 -695
  4. package/dist/cli/commands/flow.js +3 -0
  5. package/dist/compile-cli.js +51 -0
  6. package/dist/core/actions.d.ts +132 -765
  7. package/dist/core/actions.js +1 -307
  8. package/dist/core/binding-identity.d.ts +22 -0
  9. package/dist/core/binding-identity.js +28 -0
  10. package/dist/core/context-index.d.ts +34 -0
  11. package/dist/core/context-index.js +38 -0
  12. package/dist/core/definitionless-node-types.d.ts +16 -0
  13. package/dist/core/definitionless-node-types.js +16 -0
  14. package/dist/core/error-port.d.ts +6 -0
  15. package/dist/core/error-port.js +9 -0
  16. package/dist/core/form-field-type.d.ts +33 -0
  17. package/dist/core/form-field-type.js +30 -0
  18. package/dist/core/hitl-routing.d.ts +8 -0
  19. package/dist/core/hitl-routing.js +17 -1
  20. package/dist/core/node-classes.d.ts +4 -63
  21. package/dist/core/node-classes.js +0 -112
  22. package/dist/core/nodes/family.d.ts +36 -0
  23. package/dist/core/nodes/family.js +1 -0
  24. package/dist/core/nodes/node-type.d.ts +136 -0
  25. package/dist/core/nodes/node-type.js +1 -0
  26. package/dist/core/nodes/registry.d.ts +57 -0
  27. package/dist/core/nodes/registry.js +122 -0
  28. package/dist/core/nodes/versioned.d.ts +50 -0
  29. package/dist/core/nodes/versioned.js +46 -0
  30. package/dist/core/process-resource-sort-order.d.ts +40 -0
  31. package/dist/core/process-resource-sort-order.js +44 -0
  32. package/dist/core/typed-raw-node.d.ts +13 -62
  33. package/dist/core/typed-raw-node.js +40 -154
  34. package/dist/core/wire-expr.d.ts +27 -0
  35. package/dist/core/wire-expr.js +34 -0
  36. package/dist/decompile-cli.js +11 -1
  37. package/dist/decompile.d.ts +8 -3
  38. package/dist/decompile.js +665 -354
  39. package/dist/flow-definitions.d.ts +10 -0
  40. package/dist/flow-definitions.js +35 -0
  41. package/dist/flow-expr-check.js +1 -1
  42. package/dist/flow-node-registry.d.ts +13 -0
  43. package/dist/flow-node-registry.js +19 -0
  44. package/dist/flow-node-type.d.ts +192 -0
  45. package/dist/flow-node-type.js +1 -0
  46. package/dist/flow-sdk.d.ts +40 -1
  47. package/dist/flow-sdk.js +29 -2
  48. package/dist/flow-step-tree.js +2 -1
  49. package/dist/index.d.ts +2 -1
  50. package/dist/index.js +1 -0
  51. package/dist/merge-cli.js +25 -8
  52. package/dist/merge-roundtrip.d.ts +81 -0
  53. package/dist/merge-roundtrip.js +404 -0
  54. package/dist/merge.d.ts +35 -6
  55. package/dist/merge.js +124 -24
  56. package/dist/node-placement.d.ts +93 -0
  57. package/dist/node-placement.js +163 -0
  58. package/dist/nodes/data-fabric/flow/check.d.ts +13 -0
  59. package/dist/nodes/data-fabric/flow/check.js +164 -0
  60. package/dist/nodes/data-fabric/flow/factories.d.ts +113 -0
  61. package/dist/nodes/data-fabric/flow/factories.js +134 -0
  62. package/dist/nodes/data-fabric/flow/family.d.ts +7 -0
  63. package/dist/nodes/data-fabric/flow/family.js +9 -0
  64. package/dist/nodes/data-fabric/flow/index.d.ts +8 -0
  65. package/dist/nodes/data-fabric/flow/index.js +8 -0
  66. package/dist/nodes/data-fabric/flow/raw.d.ts +32 -0
  67. package/dist/nodes/data-fabric/flow/raw.js +100 -0
  68. package/dist/nodes/data-fabric/flow/shared.d.ts +77 -0
  69. package/dist/nodes/data-fabric/flow/shared.js +174 -0
  70. package/dist/nodes/data-fabric/flow/spec.d.ts +238 -0
  71. package/dist/nodes/data-fabric/flow/spec.js +1 -0
  72. package/dist/nodes/data-fabric/flow/verbs.d.ts +29 -0
  73. package/dist/nodes/data-fabric/flow/verbs.js +239 -0
  74. package/dist/nodes/delay/flow/check.d.ts +16 -0
  75. package/dist/nodes/delay/flow/check.js +86 -0
  76. package/dist/nodes/delay/flow/factories.d.ts +28 -0
  77. package/dist/nodes/delay/flow/factories.js +38 -0
  78. package/dist/nodes/delay/flow/family.d.ts +3 -0
  79. package/dist/nodes/delay/flow/family.js +8 -0
  80. package/dist/nodes/delay/flow/index.d.ts +3 -0
  81. package/dist/nodes/delay/flow/index.js +3 -0
  82. package/dist/nodes/delay/flow/node-type.d.ts +13 -0
  83. package/dist/nodes/delay/flow/node-type.js +71 -0
  84. package/dist/nodes/delay/flow/spec.d.ts +43 -0
  85. package/dist/nodes/delay/flow/spec.js +16 -0
  86. package/dist/nodes/document/flow/factories.d.ts +27 -0
  87. package/dist/nodes/document/flow/factories.js +30 -0
  88. package/dist/nodes/document/flow/family.d.ts +3 -0
  89. package/dist/nodes/document/flow/family.js +7 -0
  90. package/dist/nodes/document/flow/index.d.ts +3 -0
  91. package/dist/nodes/document/flow/index.js +3 -0
  92. package/dist/nodes/document/flow/node-type.d.ts +14 -0
  93. package/dist/nodes/document/flow/node-type.js +150 -0
  94. package/dist/nodes/document/flow/spec.d.ts +65 -0
  95. package/dist/nodes/document/flow/spec.js +1 -0
  96. package/dist/nodes/mock/flow/factories.d.ts +51 -0
  97. package/dist/nodes/mock/flow/factories.js +47 -0
  98. package/dist/nodes/mock/flow/family.d.ts +3 -0
  99. package/dist/nodes/mock/flow/family.js +7 -0
  100. package/dist/nodes/mock/flow/index.d.ts +2 -0
  101. package/dist/nodes/mock/flow/index.js +2 -0
  102. package/dist/nodes/mock/flow/node-type.d.ts +11 -0
  103. package/dist/nodes/mock/flow/node-type.js +51 -0
  104. package/dist/nodes/script/flow/check.d.ts +19 -0
  105. package/dist/nodes/script/flow/check.js +49 -0
  106. package/dist/nodes/script/flow/factories.d.ts +14 -0
  107. package/dist/nodes/script/flow/factories.js +15 -0
  108. package/dist/nodes/script/flow/family.d.ts +3 -0
  109. package/dist/nodes/script/flow/family.js +8 -0
  110. package/dist/nodes/script/flow/index.d.ts +3 -0
  111. package/dist/nodes/script/flow/index.js +3 -0
  112. package/dist/nodes/script/flow/node-type.d.ts +7 -0
  113. package/dist/nodes/script/flow/node-type.js +125 -0
  114. package/dist/nodes/script/flow/spec.d.ts +52 -0
  115. package/dist/nodes/script/flow/spec.js +1 -0
  116. package/dist/nodes/transform/flow/check.d.ts +6 -0
  117. package/dist/nodes/transform/flow/check.js +229 -0
  118. package/dist/nodes/transform/flow/factories.d.ts +52 -0
  119. package/dist/nodes/transform/flow/factories.js +53 -0
  120. package/dist/nodes/transform/flow/family.d.ts +3 -0
  121. package/dist/nodes/transform/flow/family.js +8 -0
  122. package/dist/nodes/transform/flow/index.d.ts +3 -0
  123. package/dist/nodes/transform/flow/index.js +3 -0
  124. package/dist/nodes/transform/flow/node-type.d.ts +7 -0
  125. package/dist/nodes/transform/flow/node-type.js +245 -0
  126. package/dist/nodes/transform/flow/spec.d.ts +116 -0
  127. package/dist/nodes/transform/flow/spec.js +10 -0
  128. package/dist/raw-node-advice.d.ts +16 -0
  129. package/dist/raw-node-advice.js +36 -0
  130. package/dist/raw-node.d.ts +71 -0
  131. package/dist/raw-node.js +116 -0
  132. package/dist/registry/uip/pipeline-front-door.js +5 -3
  133. package/dist/serialize.js +246 -549
  134. package/package.json +2 -2
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The palette `sortOrder` of a process-resource node (an RPA workflow, API
3
+ * workflow, function, agent, or agentic process, published or in-solution),
4
+ * derived the way the platform derives it.
5
+ *
6
+ * flow-core's `buildNodeManifest` (`@uipath/flow-core/manifest`) does not keep a
7
+ * per-family number. It writes `categorySortOrders[baseCategory] +
8
+ * DYNAMIC_NODE_SORT_OFFSET`, where `baseCategory` is the resource type's category
9
+ * (`agent`, `flow`, …) before any `published` / `in-solution` listing suffix. So
10
+ * this module keeps the same two inputs and the same sum, not five literals.
11
+ *
12
+ * The base values are flow-core 0.115.4's `baseCategorySortOrders` for these
13
+ * categories (read 2026-10-08). They match what the platform writes today:
14
+ * `registry get` on alpha/codereval returns agent 510, flow 600, agentic-process
15
+ * 610, case-management 620, rpa-workflow 630, api-workflow 640, function 650, and
16
+ * 54 of 54 v1 in-solution agent `.flow` files (09-01 to 10-08) carry 510.
17
+ *
18
+ * flow-core renumbered these once already (agent was 5, api-workflow 10,
19
+ * rpa-workflow 30). `tests/process-resource-sort-order.test.ts` compares this
20
+ * table with a local flow-core when one is present, so the next renumber shows
21
+ * up as a red test rather than as a silent diff.
22
+ */
23
+ export declare const PROCESS_RESOURCE_CATEGORY_SORT_ORDERS: {
24
+ readonly agent: 10;
25
+ readonly flow: 100;
26
+ readonly 'agentic-process': 110;
27
+ readonly 'case-management': 120;
28
+ readonly 'rpa-workflow': 130;
29
+ readonly 'api-workflow': 140;
30
+ readonly function: 150;
31
+ };
32
+ /** flow-core's `DYNAMIC_NODE_SORT_OFFSET`: every tenant-built node sorts after every static one. */
33
+ export declare const DYNAMIC_NODE_SORT_OFFSET = 500;
34
+ /** A process-resource node category, e.g. `'agent'` or `'rpa-workflow'`. */
35
+ export type ProcessResourceCategory = keyof typeof PROCESS_RESOURCE_CATEGORY_SORT_ORDERS;
36
+ /**
37
+ * The `sortOrder` the platform writes for a process-resource node of this
38
+ * category. For instance `resourceNodeSortOrder('agent')` is 510.
39
+ */
40
+ export declare function resourceNodeSortOrder(category: ProcessResourceCategory): number;
@@ -0,0 +1,44 @@
1
+ import { ownEntry } from './own-entry.js';
2
+ /**
3
+ * The palette `sortOrder` of a process-resource node (an RPA workflow, API
4
+ * workflow, function, agent, or agentic process, published or in-solution),
5
+ * derived the way the platform derives it.
6
+ *
7
+ * flow-core's `buildNodeManifest` (`@uipath/flow-core/manifest`) does not keep a
8
+ * per-family number. It writes `categorySortOrders[baseCategory] +
9
+ * DYNAMIC_NODE_SORT_OFFSET`, where `baseCategory` is the resource type's category
10
+ * (`agent`, `flow`, …) before any `published` / `in-solution` listing suffix. So
11
+ * this module keeps the same two inputs and the same sum, not five literals.
12
+ *
13
+ * The base values are flow-core 0.115.4's `baseCategorySortOrders` for these
14
+ * categories (read 2026-10-08). They match what the platform writes today:
15
+ * `registry get` on alpha/codereval returns agent 510, flow 600, agentic-process
16
+ * 610, case-management 620, rpa-workflow 630, api-workflow 640, function 650, and
17
+ * 54 of 54 v1 in-solution agent `.flow` files (09-01 to 10-08) carry 510.
18
+ *
19
+ * flow-core renumbered these once already (agent was 5, api-workflow 10,
20
+ * rpa-workflow 30). `tests/process-resource-sort-order.test.ts` compares this
21
+ * table with a local flow-core when one is present, so the next renumber shows
22
+ * up as a red test rather than as a silent diff.
23
+ */
24
+ export const PROCESS_RESOURCE_CATEGORY_SORT_ORDERS = {
25
+ agent: 10,
26
+ flow: 100,
27
+ 'agentic-process': 110,
28
+ 'case-management': 120,
29
+ 'rpa-workflow': 130,
30
+ 'api-workflow': 140,
31
+ function: 150,
32
+ };
33
+ /** flow-core's `DYNAMIC_NODE_SORT_OFFSET`: every tenant-built node sorts after every static one. */
34
+ export const DYNAMIC_NODE_SORT_OFFSET = 500;
35
+ /**
36
+ * The `sortOrder` the platform writes for a process-resource node of this
37
+ * category. For instance `resourceNodeSortOrder('agent')` is 510.
38
+ */
39
+ export function resourceNodeSortOrder(category) {
40
+ const base = ownEntry(PROCESS_RESOURCE_CATEGORY_SORT_ORDERS, category);
41
+ if (base === undefined)
42
+ throw new Error(`no sortOrder for process-resource category '${category}'`);
43
+ return base + DYNAMIC_NODE_SORT_OFFSET;
44
+ }
@@ -1,19 +1,14 @@
1
1
  /**
2
- * Internal: what `check` and `compile` say about a `rawNode` for a node type
3
- * the SDK has a typed factory for, and the Data Fabric input keys it may carry.
2
+ * Internal: what `check` says about a `rawNode` for a node type the SDK has a
3
+ * typed factory for, for the families not yet on the node-type registry. A
4
+ * registered type carries its own advice (FlowNodeType.rawNode; raw-node.ts asks
5
+ * the registry first), so a family's entries leave this table when it is ported.
4
6
  * Not re-exported from the package entry point.
5
7
  */
6
- /** The factory to use for one node type, and the versions of it the SDK bundles. */
8
+ /** The factory to use for one node type. */
7
9
  export interface TypedFactory {
8
- /** The typed spelling, as the refusal names it. */
10
+ /** The typed spelling, as the warning names it. */
9
11
  factory: string;
10
- /**
11
- * Every `<version>` with a `<nodeType>@<version>` entry in `core-definitions.json`.
12
- * Listed here rather than read from the file because this module sits under
13
- * `node-classes.ts`, which must not import `node:*`; `raw-node-typed-family.test.ts`
14
- * pins the two equal.
15
- */
16
- bundled: readonly string[];
17
12
  }
18
13
  /**
19
14
  * Every node type the SDK authors as a STEP through a typed factory, with the
@@ -26,33 +21,10 @@ export interface TypedFactory {
26
21
  * (`uipath.agent.resource.*`, attached to an agent). `decompile` keeps an
27
22
  * orphaned one as a `rawNode`, and a warning on that round trip would be noise.
28
23
  *
29
- * The Data Fabric verbs name their options, because the query and write keys
30
- * an author reaches for by hand (`_filters`, `_sort`, `fieldValues`, …) each
31
- * have a typed spelling.
24
+ * A REGISTERED family's types are not here: they carry the same advice
25
+ * themselves (the Data Fabric verbs, since Phase 3).
32
26
  */
33
27
  export declare const TYPED_FACTORIES: Readonly<Record<string, TypedFactory>>;
34
- /**
35
- * Every `entityConfig` key the product reads or persists on a Data Fabric node,
36
- * across the four verbs. flow-workbench develop `eed682f19`:
37
- *
38
- * - services `serialization/entity-vdo.ts` `interface EntityConfig` (:229-272):
39
- * `entityName`, `resultMode`, `_recordLimit`, `_skip`, `_sort`,
40
- * `_selectedFieldNames`, `_filters`, `_entityFields`, `_relatedFields`,
41
- * `_folderKey`, `_entityKey`, `_resourceKey`, `_outputSchema`;
42
- * `CreateEntityConfig` (:719) adds `fieldValues`; `UpdateEntityConfig` (:744)
43
- * adds `recordSource`, `readEntityNodeId`, `recordId`, `fieldUpdates`.
44
- * - canvas `properties-panel/EntityConfigField.tsx` `EntityConfigInputs`
45
- * (:85-110) and `entity/useEntityPanelState.ts` `EntitySelectionPatch`
46
- * (:248-270), which the panels persist on an entity pick:
47
- * `_entityDisplayName`, `_choiceSets`, `_folderPath`, `_entitySubType`.
48
- * - Create/Update/DeleteEntityConfigField.tsx declare nothing beyond these.
49
- *
50
- * One union rather than one set per verb: a key another verb reads is at worst
51
- * ignored, and a per-verb split would refuse a canvas-written key on a verb
52
- * whose panel happens not to declare it. The test pins every key the typed
53
- * factories write to this set.
54
- */
55
- export declare const DATAFABRIC_ENTITY_CONFIG_KEYS: ReadonlySet<string>;
56
28
  /**
57
29
  * A reminder, as a `warning`, that a `rawNode` stands in for a typed factory,
58
30
  * or `undefined` for a type with no factory.
@@ -62,36 +34,15 @@ export declare const DATAFABRIC_ENTITY_CONFIG_KEYS: ReadonlySet<string>;
62
34
  * related-path filter needs), and nothing checks factory coverage family by
63
35
  * family. So the raw node keeps compiling at every version. The one failure
64
36
  * the eval archive measured, an invented key the node never reads, is refused
65
- * by {@link dataFabricUnknownInputs} instead.
37
+ * by the node type's own `rawNode.inputProblem` instead (Data Fabric).
66
38
  *
67
39
  * @param nodeType - The definition's `nodeType`, as passed to `rawNode`.
68
40
  * @returns The warning, or `undefined` for a type with no typed factory.
69
41
  */
70
42
  export declare function typedFamilyRawNodeWarning(nodeType: string): string | undefined;
71
43
  /**
72
- * Why a `core.datafabric.*` node's inputs carry a key the product never reads,
73
- * or `undefined` when they do not.
74
- *
75
- * This is where the eval failure became possible. A raw node renders its inputs
76
- * verbatim, and `core.datafabric.read@1.4`'s registry definition declares only
77
- * `entityName` and `resultMode`, so `validate` cannot see any other key. Measured
78
- * on the eval archive (2026-09-23, skill-flow-datafabric-native-contract-intake-pipeline):
79
- * the agent wrote `_sortOptions: [{ fieldName, isDescending }]` in place of
80
- * `_sort`, `check` printed "no issues", `validate` said Valid, and the query
81
- * would have run unsorted. The allowed set is what the product reads
82
- * ({@link DATAFABRIC_ENTITY_CONFIG_KEYS}), so `_entityFields` and the other
83
- * canvas snapshots stay legal.
84
- *
85
- * Severity follows the version: at a bundled `<nodeType>@<version>` the key set
86
- * is known, so the key is refused (`error`); at a version this SDK has not
87
- * synced, a newer node could read a new key, so it is reported (`warning`).
88
- *
89
- * @param nodeType - The node's type.
90
- * @param version - The version the node is emitted at.
91
- * @param inputs - The node's inputs, before rendering.
92
- * @returns The diagnostic, or `undefined` for a clean node or a non-Data-Fabric type.
44
+ * The RAW_NODE_TYPED_FAMILY sentence for `nodeType`, naming its typed `factory`
45
+ * and appending a family's `hint`. One spelling for the not-yet-ported table
46
+ * above and for a registered node type's own advice (raw-node.ts).
93
47
  */
94
- export declare function dataFabricUnknownInputs(nodeType: string, version: string, inputs: unknown): {
95
- severity: 'error' | 'warning';
96
- message: string;
97
- } | undefined;
48
+ export declare function typedFactoryWarning(nodeType: string, factory: string, hint?: string): string;
@@ -1,6 +1,8 @@
1
1
  /**
2
- * Internal: what `check` and `compile` say about a `rawNode` for a node type
3
- * the SDK has a typed factory for, and the Data Fabric input keys it may carry.
2
+ * Internal: what `check` says about a `rawNode` for a node type the SDK has a
3
+ * typed factory for, for the families not yet on the node-type registry. A
4
+ * registered type carries its own advice (FlowNodeType.rawNode; raw-node.ts asks
5
+ * the registry first), so a family's entries leave this table when it is ported.
4
6
  * Not re-exported from the package entry point.
5
7
  */
6
8
  import { ownEntry } from './own-entry.js';
@@ -15,110 +17,41 @@ import { ownEntry } from './own-entry.js';
15
17
  * (`uipath.agent.resource.*`, attached to an agent). `decompile` keeps an
16
18
  * orphaned one as a `rawNode`, and a warning on that round trip would be noise.
17
19
  *
18
- * The Data Fabric verbs name their options, because the query and write keys
19
- * an author reaches for by hand (`_filters`, `_sort`, `fieldValues`, …) each
20
- * have a typed spelling.
20
+ * A REGISTERED family's types are not here: they carry the same advice
21
+ * themselves (the Data Fabric verbs, since Phase 3).
21
22
  */
22
23
  export const TYPED_FACTORIES = {
23
- 'core.action.http': { factory: 'http({ managed: false })', bundled: ['1.0.0'] },
24
- 'core.action.http.v2': { factory: 'http({ managed: true })', bundled: ['2.3'] },
25
- 'core.action.queue.create': { factory: 'queueItem()', bundled: ['1.2'] },
26
- 'core.action.queue.create-and-wait': { factory: 'queueItem({ wait: true })', bundled: ['1.2'] },
27
- 'core.action.script': { factory: 'script()', bundled: ['1.0.0', '1.1'] },
28
- 'core.action.transform': { factory: 'transform()', bundled: ['1.0.0', '1.1'] },
29
- 'core.action.transform.filter': { factory: "transform({ variant: 'filter' })", bundled: ['1.0.0', '1.1'] },
30
- 'core.action.transform.group-by': { factory: "transform({ variant: 'group-by' })", bundled: ['1.0.0', '1.1'] },
31
- 'core.action.transform.map': { factory: "transform({ variant: 'map' })", bundled: ['1.0.0', '1.1'] },
32
- 'core.control.end': { factory: '.return()', bundled: ['1.0.0', '1.0'] },
33
- 'core.datafabric.read': {
34
- factory: "dataFabricRead({ entity, resultMode: 'single' | 'multiple', filters: [{ field, operator, value, or }], "
35
- + 'sort: { field, direction }, limit, skip, fields, folderKey })',
36
- bundled: ['1.0', '1.4'],
37
- },
38
- 'core.datafabric.create': {
39
- factory: 'dataFabricCreate({ entity, values: { <field>: <value> }, folderKey })',
40
- bundled: ['1.3'],
41
- },
42
- 'core.datafabric.update': {
43
- factory: 'dataFabricUpdate({ entity, record: { byId } | { fromRead }, set: { <field>: <value> }, folderKey })',
44
- bundled: ['1.0', '1.3'],
45
- },
46
- 'core.datafabric.delete': {
47
- factory: 'dataFabricDelete({ entity, record: { byId } | { fromRead }, folderKey })',
48
- bundled: ['1.3'],
49
- },
50
- 'core.logic.decision': { factory: '.branch()', bundled: ['1.0.0', '1.3'] },
51
- 'core.logic.delay': { factory: 'delay({ duration })', bundled: ['1.0.0', '1.0'] },
52
- 'core.logic.dowhile': { factory: '.doWhile(name, condition, body, { limit, breakEnabled })', bundled: ['1.0'] },
53
- 'core.logic.loop': { factory: '.loop()', bundled: ['1.0.0', '2.4'] },
54
- 'core.logic.merge': { factory: '.parallel() rejoin', bundled: ['1.0.0', '1.0'] },
55
- 'core.logic.mock': { factory: 'mock()', bundled: ['1.0.0', '1.0'] },
56
- 'core.logic.switch': { factory: '.switch()', bundled: ['1.0.0', '1.1'] },
57
- 'core.logic.terminate': { factory: '.terminate()', bundled: ['1.0.0', '1.0'] },
58
- 'core.subflow': { factory: 'subflow(child, inputs)', bundled: ['1.0.0', '1.0'] },
59
- 'uipath.agent.autonomous': { factory: 'inlineAgent()', bundled: ['1.2', '1.3', '1.4'] },
60
- 'uipath.agent.conversational': { factory: 'conversationalAgent()', bundled: ['1.6', '1.7'] },
61
- 'uipath.agent.voice': { factory: 'voiceAgent()', bundled: ['1.0', '1.1'] },
62
- 'uipath.conversational.get-conversation-context': { factory: 'conversationContext()', bundled: ['1.0'] },
63
- 'uipath.conversational.send-message': { factory: 'sendMessage()', bundled: ['1.0', '1.1'] },
64
- 'uipath.conversational.voice.create-outgoing-call': { factory: 'createOutgoingCall()', bundled: ['1.0'] },
65
- 'uipath.conversational.voice.end-call': { factory: 'endCall()', bundled: ['1.0'] },
66
- 'uipath.conversational.wait-for-message': { factory: 'waitForMessage()', bundled: ['1.0', '1.1'] },
67
- 'uipath.document.classify': { factory: 'documentClassify()', bundled: ['1.0'] },
68
- 'uipath.human-in-the-loop': { factory: 'hitl()', bundled: ['1.0', '1.1', '1.2'] },
24
+ 'core.action.http': { factory: 'http({ managed: false })' },
25
+ 'core.action.http.v2': { factory: 'http({ managed: true })' },
26
+ 'core.action.queue.create': { factory: 'queueItem()' },
27
+ 'core.action.queue.create-and-wait': { factory: 'queueItem({ wait: true })' },
28
+ 'core.control.end': { factory: '.return()' },
29
+ 'core.logic.decision': { factory: '.branch()' },
30
+ 'core.logic.dowhile': { factory: '.doWhile(name, condition, body, { limit, breakEnabled })' },
31
+ 'core.logic.loop': { factory: '.loop()' },
32
+ 'core.logic.merge': { factory: '.parallel() rejoin' },
33
+ 'core.logic.switch': { factory: '.switch()' },
34
+ 'core.logic.terminate': { factory: '.terminate()' },
35
+ 'core.subflow': { factory: 'subflow(child, inputs)' },
36
+ 'uipath.agent.autonomous': { factory: 'inlineAgent()' },
37
+ 'uipath.agent.conversational': { factory: 'conversationalAgent()' },
38
+ 'uipath.agent.voice': { factory: 'voiceAgent()' },
39
+ 'uipath.conversational.get-conversation-context': { factory: 'conversationContext()' },
40
+ 'uipath.conversational.send-message': { factory: 'sendMessage()' },
41
+ 'uipath.conversational.voice.create-outgoing-call': { factory: 'createOutgoingCall()' },
42
+ 'uipath.conversational.voice.end-call': { factory: 'endCall()' },
43
+ 'uipath.conversational.wait-for-message': { factory: 'waitForMessage()' },
44
+ 'uipath.human-in-the-loop': { factory: 'hitl()' },
69
45
  'uipath.human-in-the-loop.coded-action-app': {
70
46
  factory: "hitl({ variant: 'action-app' })",
71
- bundled: ['1.0', '1.1'],
72
47
  },
73
48
  'uipath.human-in-the-loop.document-validation': {
74
49
  factory: "hitl({ variant: 'document-validation' })",
75
- bundled: ['1.0'],
76
50
  },
77
- 'uipath.human-in-the-loop.quick-form': { factory: "hitl({ variant: 'quick-form' })", bundled: ['1.0', '1.1'] },
78
- 'uipath.pattern.batch-transform': { factory: 'batchTransform()', bundled: ['1.0'] },
79
- 'uipath.pattern.deep-rag': { factory: 'summarize()', bundled: ['1.0'] },
80
- 'uipath.ixp.extract-document-builder': { factory: 'dynamicExtract()', bundled: ['1.0.0'] },
51
+ 'uipath.human-in-the-loop.quick-form': { factory: "hitl({ variant: 'quick-form' })" },
52
+ 'uipath.pattern.batch-transform': { factory: 'batchTransform()' },
53
+ 'uipath.pattern.deep-rag': { factory: 'summarize()' },
81
54
  };
82
- /**
83
- * Every `entityConfig` key the product reads or persists on a Data Fabric node,
84
- * across the four verbs. flow-workbench develop `eed682f19`:
85
- *
86
- * - services `serialization/entity-vdo.ts` `interface EntityConfig` (:229-272):
87
- * `entityName`, `resultMode`, `_recordLimit`, `_skip`, `_sort`,
88
- * `_selectedFieldNames`, `_filters`, `_entityFields`, `_relatedFields`,
89
- * `_folderKey`, `_entityKey`, `_resourceKey`, `_outputSchema`;
90
- * `CreateEntityConfig` (:719) adds `fieldValues`; `UpdateEntityConfig` (:744)
91
- * adds `recordSource`, `readEntityNodeId`, `recordId`, `fieldUpdates`.
92
- * - canvas `properties-panel/EntityConfigField.tsx` `EntityConfigInputs`
93
- * (:85-110) and `entity/useEntityPanelState.ts` `EntitySelectionPatch`
94
- * (:248-270), which the panels persist on an entity pick:
95
- * `_entityDisplayName`, `_choiceSets`, `_folderPath`, `_entitySubType`.
96
- * - Create/Update/DeleteEntityConfigField.tsx declare nothing beyond these.
97
- *
98
- * One union rather than one set per verb: a key another verb reads is at worst
99
- * ignored, and a per-verb split would refuse a canvas-written key on a verb
100
- * whose panel happens not to declare it. The test pins every key the typed
101
- * factories write to this set.
102
- */
103
- export const DATAFABRIC_ENTITY_CONFIG_KEYS = new Set([
104
- 'entityName', 'resultMode',
105
- '_recordLimit', '_skip', '_sort', '_selectedFieldNames', '_filters',
106
- '_entityFields', '_relatedFields', '_choiceSets', '_outputSchema',
107
- '_folderKey', '_folderPath', '_entityKey', '_resourceKey', '_entityDisplayName', '_entitySubType',
108
- 'fieldValues', 'fieldUpdates', 'recordSource', 'readEntityNodeId', 'recordId',
109
- ]);
110
- /**
111
- * What the Data Fabric factories write, and what they do not, as the typed-family
112
- * warning states it. The factories do not author the canvas's column snapshots,
113
- * so a related-path filter (`customer.Name`) still needs a raw node carrying
114
- * `_entityFields` (core/actions.ts `DataFabricFilter.field`).
115
- */
116
- const DATAFABRIC_HINT = ' The factory writes the query and write keys: `filters` becomes `_filters` (flat rows; `or: true` '
117
- + 'starts each OR alternative), `sort` is `_sort`, `limit`/`skip`/`fields` are '
118
- + '`_recordLimit`/`_skip`/`_selectedFieldNames`, `values`/`set` are `fieldValues`/`fieldUpdates`, '
119
- + 'and `record` is `recordSource`. It does not write the column snapshots `_entityFields`, '
120
- + '`_relatedFields`, `_choiceSets` or `_outputSchema`; a related-path filter such as '
121
- + '`customer.Name` needs `_entityFields`, so for that a raw node is still the way.';
122
55
  /**
123
56
  * A reminder, as a `warning`, that a `rawNode` stands in for a typed factory,
124
57
  * or `undefined` for a type with no factory.
@@ -128,7 +61,7 @@ const DATAFABRIC_HINT = ' The factory writes the query and write keys: `filters`
128
61
  * related-path filter needs), and nothing checks factory coverage family by
129
62
  * family. So the raw node keeps compiling at every version. The one failure
130
63
  * the eval archive measured, an invented key the node never reads, is refused
131
- * by {@link dataFabricUnknownInputs} instead.
64
+ * by the node type's own `rawNode.inputProblem` instead (Data Fabric).
132
65
  *
133
66
  * @param nodeType - The definition's `nodeType`, as passed to `rawNode`.
134
67
  * @returns The warning, or `undefined` for a type with no typed factory.
@@ -139,63 +72,16 @@ export function typedFamilyRawNodeWarning(nodeType) {
139
72
  const entry = ownEntry(TYPED_FACTORIES, nodeType);
140
73
  if (entry === undefined)
141
74
  return undefined;
142
- const hint = nodeType.startsWith('core.datafabric.') ? DATAFABRIC_HINT : '';
143
- return `rawNode("${nodeType}"): this SDK has a typed factory, ${entry.factory}. A raw node keeps its `
144
- + `inputs verbatim, and \`validate\` cannot see a key the registry definition does not declare, so a `
145
- + `misspelled input compiles and is ignored at run time. Prefer the factory unless you need an input it `
146
- + `does not write.${hint}`;
75
+ return typedFactoryWarning(nodeType, entry.factory);
147
76
  }
148
- const isPlainObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v) && Object.getPrototypeOf(v) === Object.prototype;
149
77
  /**
150
- * Why a `core.datafabric.*` node's inputs carry a key the product never reads,
151
- * or `undefined` when they do not.
152
- *
153
- * This is where the eval failure became possible. A raw node renders its inputs
154
- * verbatim, and `core.datafabric.read@1.4`'s registry definition declares only
155
- * `entityName` and `resultMode`, so `validate` cannot see any other key. Measured
156
- * on the eval archive (2026-09-23, skill-flow-datafabric-native-contract-intake-pipeline):
157
- * the agent wrote `_sortOptions: [{ fieldName, isDescending }]` in place of
158
- * `_sort`, `check` printed "no issues", `validate` said Valid, and the query
159
- * would have run unsorted. The allowed set is what the product reads
160
- * ({@link DATAFABRIC_ENTITY_CONFIG_KEYS}), so `_entityFields` and the other
161
- * canvas snapshots stay legal.
162
- *
163
- * Severity follows the version: at a bundled `<nodeType>@<version>` the key set
164
- * is known, so the key is refused (`error`); at a version this SDK has not
165
- * synced, a newer node could read a new key, so it is reported (`warning`).
166
- *
167
- * @param nodeType - The node's type.
168
- * @param version - The version the node is emitted at.
169
- * @param inputs - The node's inputs, before rendering.
170
- * @returns The diagnostic, or `undefined` for a clean node or a non-Data-Fabric type.
78
+ * The RAW_NODE_TYPED_FAMILY sentence for `nodeType`, naming its typed `factory`
79
+ * and appending a family's `hint`. One spelling for the not-yet-ported table
80
+ * above and for a registered node type's own advice (raw-node.ts).
171
81
  */
172
- export function dataFabricUnknownInputs(nodeType, version, inputs) {
173
- if (typeof nodeType !== 'string' || !nodeType.startsWith('core.datafabric.'))
174
- return undefined;
175
- if (!isPlainObject(inputs))
176
- return undefined;
177
- const unknown = Object.keys(inputs).filter((k) => k !== 'entityConfig');
178
- const cfg = inputs.entityConfig;
179
- if (isPlainObject(cfg)) {
180
- for (const k of Object.keys(cfg))
181
- if (!DATAFABRIC_ENTITY_CONFIG_KEYS.has(k))
182
- unknown.push(`entityConfig.${k}`);
183
- }
184
- if (unknown.length === 0)
185
- return undefined;
186
- const bundled = ownEntry(TYPED_FACTORIES, nodeType)?.bundled.includes(version) ?? false;
187
- const named = unknown.map((k) => `\`${k}\``).join(', ');
188
- const factory = ownEntry(TYPED_FACTORIES, nodeType)?.factory;
189
- const base = `${nodeType}@${version} carries ${named}, which the platform never reads: Data Fabric `
190
- + `nodes read only \`inputs.entityConfig\`, with the keys ${[...DATAFABRIC_ENTITY_CONFIG_KEYS].join(', ')} `
191
- + `(flow-workbench entity-vdo.ts \`EntityConfig\` and the entity panels). \`validate\` cannot see `
192
- + `the key, so it compiles and is ignored at run time; for example a sort is \`_sort: { field, direction }\`, `
193
- + `not \`_sortOptions\`.${factory ? ` The typed factory, ${factory}, writes only keys the node reads.` : ''}`;
194
- if (bundled)
195
- return { severity: 'error', message: base };
196
- return {
197
- severity: 'warning',
198
- message: `${base} This SDK does not bundle ${nodeType}@${version}, so a newer node may read the key; `
199
- + 'it compiles as written.',
200
- };
82
+ export function typedFactoryWarning(nodeType, factory, hint = '') {
83
+ return `rawNode("${nodeType}"): this SDK has a typed factory, ${factory}. A raw node keeps its `
84
+ + `inputs verbatim, and \`validate\` cannot see a key the registry definition does not declare, so a `
85
+ + `misspelled input compiles and is ignored at run time. Prefer the factory unless you need an input it `
86
+ + `does not write.${hint}`;
201
87
  }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * core/wire-expr — reading an expression back out of the wire format.
3
+ *
4
+ * Shared by decompile and by every node family's deserializer, so the set of
5
+ * accepted spellings lives in one place.
6
+ */
7
+ /**
8
+ * The JS body of a value in an EXPRESSION SLOT: a field that always holds an
9
+ * expression and never literal text (a branch condition, a loop collection, an
10
+ * agent input binding, an app input binding, a field binding).
11
+ *
12
+ * The wire format has more than one spelling for one expression there, and this
13
+ * is the one place that knows them all:
14
+ *
15
+ * - `=js:<body>` -- what SDK compile writes.
16
+ * - `=<body>` (bare `=`) -- what the product writes for bindings: the CLI's
17
+ * agent-input encoder emits `=$vars.<node>.output.<field>` (uipath-cli
18
+ * `agent-input-encoding-utils.ts`), and `=$metadata.<key>` the same way.
19
+ * - `=vars.<path>` / `=metadata.<path>` -- the PATH form flow-v1 writes for app
20
+ * and field bindings. It names the same variable the SDK spells `$vars.<path>`.
21
+ * - no prefix -- the slot stores a bare JS body (decision/switch conditions).
22
+ *
23
+ * A VALUE slot (an ordinary node input) is different: there only `=js:` marks an
24
+ * expression and any other string is literal text, as the product reads it
25
+ * (flow-schema `coerceToExpressionValue`). Do not use this for one.
26
+ */
27
+ export declare function wireExprBody(raw: string): string;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * core/wire-expr — reading an expression back out of the wire format.
3
+ *
4
+ * Shared by decompile and by every node family's deserializer, so the set of
5
+ * accepted spellings lives in one place.
6
+ */
7
+ /**
8
+ * The JS body of a value in an EXPRESSION SLOT: a field that always holds an
9
+ * expression and never literal text (a branch condition, a loop collection, an
10
+ * agent input binding, an app input binding, a field binding).
11
+ *
12
+ * The wire format has more than one spelling for one expression there, and this
13
+ * is the one place that knows them all:
14
+ *
15
+ * - `=js:<body>` -- what SDK compile writes.
16
+ * - `=<body>` (bare `=`) -- what the product writes for bindings: the CLI's
17
+ * agent-input encoder emits `=$vars.<node>.output.<field>` (uipath-cli
18
+ * `agent-input-encoding-utils.ts`), and `=$metadata.<key>` the same way.
19
+ * - `=vars.<path>` / `=metadata.<path>` -- the PATH form flow-v1 writes for app
20
+ * and field bindings. It names the same variable the SDK spells `$vars.<path>`.
21
+ * - no prefix -- the slot stores a bare JS body (decision/switch conditions).
22
+ *
23
+ * A VALUE slot (an ordinary node input) is different: there only `=js:` marks an
24
+ * expression and any other string is literal text, as the product reads it
25
+ * (flow-schema `coerceToExpressionValue`). Do not use this for one.
26
+ */
27
+ export function wireExprBody(raw) {
28
+ if (raw.startsWith('=js:'))
29
+ return raw.slice(4);
30
+ if (!raw.startsWith('='))
31
+ return raw;
32
+ const body = raw.slice(1);
33
+ return /^(?:vars|metadata)(?:\.[A-Za-z_$][\w$]*|\[\d+\])*$/.test(body.trim()) ? `$${body.trim()}` : body;
34
+ }
@@ -129,7 +129,17 @@ if (!existsSync(BASELINE)) {
129
129
  // ask for confirmation before the write. Left as a no-op for now.
130
130
  // ---------------------------------------------------------------------------
131
131
 
132
- const args = [ORIGINAL, EDITED, '-o', MERGED];
132
+ // \`merge <edited> --original <original>\` is the grammar; the positional
133
+ // \`merge <original> <edited>\` pair is deprecated. A \`uip\` from before
134
+ // UiPath/cli#4526 knows only the pair, so ask its \`merge --help\` first.
135
+ // Key on the door, not the file name: on Windows \`uip\` resolves to node.exe
136
+ // or a full uip.exe path.
137
+ const mergeHelp = frontDoor.via === 'uip'
138
+ ? spawnSync(frontDoor.file, [...frontDoor.prefix, 'merge', '--help'], { encoding: 'utf8' })
139
+ : undefined;
140
+ const namedOriginal = mergeHelp === undefined
141
+ || \`\${mergeHelp.stdout ?? ''}\${mergeHelp.stderr ?? ''}\`.includes('--original');
142
+ const args = namedOriginal ? [EDITED, '--original', ORIGINAL, '-o', MERGED] : [ORIGINAL, EDITED, '-o', MERGED];
133
143
  if (existsSync(BASELINE)) args.push('--baseline', BASELINE);
134
144
  run('merge', args);
135
145
  console.log('\\n>>> Wrote ' + ${JSON.stringify(base + '.merged.flow')});
@@ -128,9 +128,11 @@ export interface DecompileOptions {
128
128
  /**
129
129
  * Receives each non-fatal finding about the file, one message per finding:
130
130
  * a node no trigger reaches (the builder cannot express a detached node, so
131
- * the source omits it — strict mode throws instead), and a core
132
- * `(type, typeVersion)` pair this SDK does not bundle (the source keeps it;
133
- * `compile` will refuse it). The CLI prints these on stderr.
131
+ * the source omits it — strict mode throws instead), and a
132
+ * `(type, typeVersion)` pair this SDK cannot resolve for a type it ships at
133
+ * other versions (the source omits that `{ version }`, so the node compiles at
134
+ * the SDK's default; `merge` with a baseline keeps the untouched original
135
+ * node at its version — strict mode throws instead). The CLI prints these on stderr.
134
136
  */
135
137
  warn?: (message: string) => void;
136
138
  /**
@@ -142,6 +144,9 @@ export interface DecompileOptions {
142
144
  * (`{{input.start__output__notes}}`), so the recovered source declares its
143
145
  * inputs under those names — the same flow, not the same spelling. Without a
144
146
  * reader, a shell agent decompiles with empty prompts and a warning.
147
+ * A context index placed by the canvas or the CLI keeps its real name and
148
+ * folder only in `<agent source>/resources/<inputs.source>/resource.json`,
149
+ * which is read the same way.
145
150
  */
146
151
  readSidecar?: (relativePath: string) => string | undefined;
147
152
  }