@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.
- package/dist/api-index.md +185 -184
- package/dist/api-members.md +506 -473
- package/dist/check.js +358 -695
- package/dist/cli/commands/flow.js +3 -0
- package/dist/compile-cli.js +51 -0
- package/dist/core/actions.d.ts +132 -765
- package/dist/core/actions.js +1 -307
- package/dist/core/binding-identity.d.ts +22 -0
- package/dist/core/binding-identity.js +28 -0
- package/dist/core/context-index.d.ts +34 -0
- package/dist/core/context-index.js +38 -0
- package/dist/core/definitionless-node-types.d.ts +16 -0
- package/dist/core/definitionless-node-types.js +16 -0
- package/dist/core/error-port.d.ts +6 -0
- package/dist/core/error-port.js +9 -0
- package/dist/core/form-field-type.d.ts +33 -0
- package/dist/core/form-field-type.js +30 -0
- package/dist/core/hitl-routing.d.ts +8 -0
- package/dist/core/hitl-routing.js +17 -1
- package/dist/core/node-classes.d.ts +4 -63
- package/dist/core/node-classes.js +0 -112
- package/dist/core/nodes/family.d.ts +36 -0
- package/dist/core/nodes/family.js +1 -0
- package/dist/core/nodes/node-type.d.ts +136 -0
- package/dist/core/nodes/node-type.js +1 -0
- package/dist/core/nodes/registry.d.ts +57 -0
- package/dist/core/nodes/registry.js +122 -0
- package/dist/core/nodes/versioned.d.ts +50 -0
- package/dist/core/nodes/versioned.js +46 -0
- package/dist/core/process-resource-sort-order.d.ts +40 -0
- package/dist/core/process-resource-sort-order.js +44 -0
- package/dist/core/typed-raw-node.d.ts +13 -62
- package/dist/core/typed-raw-node.js +40 -154
- package/dist/core/wire-expr.d.ts +27 -0
- package/dist/core/wire-expr.js +34 -0
- package/dist/decompile-cli.js +11 -1
- package/dist/decompile.d.ts +8 -3
- package/dist/decompile.js +665 -354
- package/dist/flow-definitions.d.ts +10 -0
- package/dist/flow-definitions.js +35 -0
- package/dist/flow-expr-check.js +1 -1
- package/dist/flow-node-registry.d.ts +13 -0
- package/dist/flow-node-registry.js +19 -0
- package/dist/flow-node-type.d.ts +192 -0
- package/dist/flow-node-type.js +1 -0
- package/dist/flow-sdk.d.ts +40 -1
- package/dist/flow-sdk.js +29 -2
- package/dist/flow-step-tree.js +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -0
- package/dist/merge-cli.js +25 -8
- package/dist/merge-roundtrip.d.ts +81 -0
- package/dist/merge-roundtrip.js +404 -0
- package/dist/merge.d.ts +35 -6
- package/dist/merge.js +124 -24
- package/dist/node-placement.d.ts +93 -0
- package/dist/node-placement.js +163 -0
- package/dist/nodes/data-fabric/flow/check.d.ts +13 -0
- package/dist/nodes/data-fabric/flow/check.js +164 -0
- package/dist/nodes/data-fabric/flow/factories.d.ts +113 -0
- package/dist/nodes/data-fabric/flow/factories.js +134 -0
- package/dist/nodes/data-fabric/flow/family.d.ts +7 -0
- package/dist/nodes/data-fabric/flow/family.js +9 -0
- package/dist/nodes/data-fabric/flow/index.d.ts +8 -0
- package/dist/nodes/data-fabric/flow/index.js +8 -0
- package/dist/nodes/data-fabric/flow/raw.d.ts +32 -0
- package/dist/nodes/data-fabric/flow/raw.js +100 -0
- package/dist/nodes/data-fabric/flow/shared.d.ts +77 -0
- package/dist/nodes/data-fabric/flow/shared.js +174 -0
- package/dist/nodes/data-fabric/flow/spec.d.ts +238 -0
- package/dist/nodes/data-fabric/flow/spec.js +1 -0
- package/dist/nodes/data-fabric/flow/verbs.d.ts +29 -0
- package/dist/nodes/data-fabric/flow/verbs.js +239 -0
- package/dist/nodes/delay/flow/check.d.ts +16 -0
- package/dist/nodes/delay/flow/check.js +86 -0
- package/dist/nodes/delay/flow/factories.d.ts +28 -0
- package/dist/nodes/delay/flow/factories.js +38 -0
- package/dist/nodes/delay/flow/family.d.ts +3 -0
- package/dist/nodes/delay/flow/family.js +8 -0
- package/dist/nodes/delay/flow/index.d.ts +3 -0
- package/dist/nodes/delay/flow/index.js +3 -0
- package/dist/nodes/delay/flow/node-type.d.ts +13 -0
- package/dist/nodes/delay/flow/node-type.js +71 -0
- package/dist/nodes/delay/flow/spec.d.ts +43 -0
- package/dist/nodes/delay/flow/spec.js +16 -0
- package/dist/nodes/document/flow/factories.d.ts +27 -0
- package/dist/nodes/document/flow/factories.js +30 -0
- package/dist/nodes/document/flow/family.d.ts +3 -0
- package/dist/nodes/document/flow/family.js +7 -0
- package/dist/nodes/document/flow/index.d.ts +3 -0
- package/dist/nodes/document/flow/index.js +3 -0
- package/dist/nodes/document/flow/node-type.d.ts +14 -0
- package/dist/nodes/document/flow/node-type.js +150 -0
- package/dist/nodes/document/flow/spec.d.ts +65 -0
- package/dist/nodes/document/flow/spec.js +1 -0
- package/dist/nodes/mock/flow/factories.d.ts +51 -0
- package/dist/nodes/mock/flow/factories.js +47 -0
- package/dist/nodes/mock/flow/family.d.ts +3 -0
- package/dist/nodes/mock/flow/family.js +7 -0
- package/dist/nodes/mock/flow/index.d.ts +2 -0
- package/dist/nodes/mock/flow/index.js +2 -0
- package/dist/nodes/mock/flow/node-type.d.ts +11 -0
- package/dist/nodes/mock/flow/node-type.js +51 -0
- package/dist/nodes/script/flow/check.d.ts +19 -0
- package/dist/nodes/script/flow/check.js +49 -0
- package/dist/nodes/script/flow/factories.d.ts +14 -0
- package/dist/nodes/script/flow/factories.js +15 -0
- package/dist/nodes/script/flow/family.d.ts +3 -0
- package/dist/nodes/script/flow/family.js +8 -0
- package/dist/nodes/script/flow/index.d.ts +3 -0
- package/dist/nodes/script/flow/index.js +3 -0
- package/dist/nodes/script/flow/node-type.d.ts +7 -0
- package/dist/nodes/script/flow/node-type.js +125 -0
- package/dist/nodes/script/flow/spec.d.ts +52 -0
- package/dist/nodes/script/flow/spec.js +1 -0
- package/dist/nodes/transform/flow/check.d.ts +6 -0
- package/dist/nodes/transform/flow/check.js +229 -0
- package/dist/nodes/transform/flow/factories.d.ts +52 -0
- package/dist/nodes/transform/flow/factories.js +53 -0
- package/dist/nodes/transform/flow/family.d.ts +3 -0
- package/dist/nodes/transform/flow/family.js +8 -0
- package/dist/nodes/transform/flow/index.d.ts +3 -0
- package/dist/nodes/transform/flow/index.js +3 -0
- package/dist/nodes/transform/flow/node-type.d.ts +7 -0
- package/dist/nodes/transform/flow/node-type.js +245 -0
- package/dist/nodes/transform/flow/spec.d.ts +116 -0
- package/dist/nodes/transform/flow/spec.js +10 -0
- package/dist/raw-node-advice.d.ts +16 -0
- package/dist/raw-node-advice.js +36 -0
- package/dist/raw-node.d.ts +71 -0
- package/dist/raw-node.js +116 -0
- package/dist/registry/uip/pipeline-front-door.js +5 -3
- package/dist/serialize.js +246 -549
- 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`
|
|
3
|
-
*
|
|
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
|
|
8
|
+
/** The factory to use for one node type. */
|
|
7
9
|
export interface TypedFactory {
|
|
8
|
-
/** The typed spelling, as the
|
|
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
|
-
*
|
|
30
|
-
*
|
|
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
|
|
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
|
-
*
|
|
73
|
-
*
|
|
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
|
|
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`
|
|
3
|
-
*
|
|
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
|
-
*
|
|
19
|
-
*
|
|
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 })'
|
|
24
|
-
'core.action.http.v2': { factory: 'http({ managed: true })'
|
|
25
|
-
'core.action.queue.create': { factory: 'queueItem()'
|
|
26
|
-
'core.action.queue.create-and-wait': { factory: 'queueItem({ wait: true })'
|
|
27
|
-
'core.
|
|
28
|
-
'core.
|
|
29
|
-
'core.
|
|
30
|
-
'core.
|
|
31
|
-
'core.
|
|
32
|
-
'core.
|
|
33
|
-
'core.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
},
|
|
38
|
-
'
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
},
|
|
42
|
-
'
|
|
43
|
-
|
|
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' })"
|
|
78
|
-
'uipath.pattern.batch-transform': { factory: 'batchTransform()'
|
|
79
|
-
'uipath.pattern.deep-rag': { factory: 'summarize()'
|
|
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
|
|
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
|
-
|
|
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
|
-
*
|
|
151
|
-
*
|
|
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
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
+
}
|
package/dist/decompile-cli.js
CHANGED
|
@@ -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
|
-
|
|
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')});
|
package/dist/decompile.d.ts
CHANGED
|
@@ -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
|
|
132
|
-
* `(type, typeVersion)` pair this SDK
|
|
133
|
-
*
|
|
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
|
}
|