@uipath/skills 1.204.0 → 1.204.1
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/CODEOWNERS +12 -14
- package/package.json +1 -1
- package/skills/uipath-agents/references/coded/embedding-in-flows.md +1 -3
- package/skills/uipath-agents/references/coded/quickstart.md +0 -2
- package/skills/uipath-agents/references/lowcode/capabilities/inline-in-flow/inline-in-flow.md +10 -8
- package/skills/uipath-agents/references/lowcode/prompting/autonomous-agent-prompting-guide.md +1 -1
- package/skills/uipath-human-in-the-loop/SKILL.md +1 -3
- package/skills/uipath-human-in-the-loop/references/hitl-node-apptask.md +0 -2
- package/skills/uipath-human-in-the-loop/references/hitl-node-coded-action-app.md +0 -2
- package/skills/uipath-human-in-the-loop/references/hitl-node-quickform.md +2 -2
- package/skills/uipath-maestro-flow/.maintenance/README.md +265 -0
- package/skills/uipath-maestro-flow/.maintenance/check-all.sh +40 -0
- package/skills/uipath-maestro-flow/.maintenance/check-anchors.sh +101 -0
- package/skills/uipath-maestro-flow/.maintenance/check-depth.sh +132 -0
- package/skills/uipath-maestro-flow/.maintenance/check-link-text.sh +123 -0
- package/skills/uipath-maestro-flow/.maintenance/check-links.sh +73 -0
- package/skills/uipath-maestro-flow/.maintenance/check-orphans.sh +93 -0
- package/skills/uipath-maestro-flow/.maintenance/check-plugin-pairs.sh +39 -0
- package/skills/uipath-maestro-flow/.maintenance/check-template.sh +42 -0
- package/skills/uipath-maestro-flow/.maintenance/check-uip-commands.sh +270 -0
- package/skills/uipath-maestro-flow/.maintenance/check-versions.sh +160 -0
- package/skills/uipath-maestro-flow/SKILL.md +69 -886
- package/skills/uipath-maestro-flow/references/author/CAPABILITY.md +207 -0
- package/skills/uipath-maestro-flow/references/author/brownfield.md +91 -0
- package/skills/uipath-maestro-flow/references/author/editing-operations-cli.md +190 -0
- package/skills/uipath-maestro-flow/references/author/editing-operations-json.md +374 -0
- package/skills/uipath-maestro-flow/references/author/editing-operations.md +104 -0
- package/skills/uipath-maestro-flow/references/author/greenfield.md +420 -0
- package/skills/uipath-maestro-flow/references/author/planning-arch.md +364 -0
- package/skills/uipath-maestro-flow/references/author/planning-impl.md +291 -0
- package/skills/uipath-maestro-flow/references/author/plugins/agent/impl.md +237 -0
- package/skills/uipath-maestro-flow/references/author/plugins/agent/planning.md +97 -0
- package/skills/uipath-maestro-flow/references/author/plugins/agentic-process/impl.md +107 -0
- package/skills/uipath-maestro-flow/references/author/plugins/agentic-process/planning.md +61 -0
- package/skills/uipath-maestro-flow/references/author/plugins/api-workflow/impl.md +108 -0
- package/skills/uipath-maestro-flow/references/author/plugins/api-workflow/planning.md +60 -0
- package/skills/uipath-maestro-flow/references/author/plugins/batch-transform/impl.md +171 -0
- package/skills/uipath-maestro-flow/references/author/plugins/batch-transform/planning.md +72 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector/impl-inline.md +120 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector/impl.md +463 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector/planning.md +186 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector-trigger/impl.md +517 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector-trigger/planning.md +115 -0
- package/skills/uipath-maestro-flow/references/author/plugins/conversational-agent/impl.md +309 -0
- package/skills/uipath-maestro-flow/references/author/plugins/conversational-agent/planning.md +133 -0
- package/skills/uipath-maestro-flow/references/author/plugins/data-fabric/impl.md +428 -0
- package/skills/uipath-maestro-flow/references/author/plugins/data-fabric/planning.md +188 -0
- package/skills/uipath-maestro-flow/references/author/plugins/decision/impl.md +83 -0
- package/skills/uipath-maestro-flow/references/author/plugins/decision/planning.md +38 -0
- package/skills/uipath-maestro-flow/references/author/plugins/delay/impl.md +38 -0
- package/skills/uipath-maestro-flow/references/author/plugins/delay/planning.md +53 -0
- package/skills/uipath-maestro-flow/references/author/plugins/end/impl.md +56 -0
- package/skills/uipath-maestro-flow/references/author/plugins/end/planning.md +28 -0
- package/skills/uipath-maestro-flow/references/author/plugins/flow/impl.md +107 -0
- package/skills/uipath-maestro-flow/references/author/plugins/flow/planning.md +58 -0
- package/skills/uipath-maestro-flow/references/author/plugins/hitl/impl.md +181 -0
- package/skills/uipath-maestro-flow/references/author/plugins/hitl/planning.md +166 -0
- package/skills/uipath-maestro-flow/references/author/plugins/http/impl-connector.md +86 -0
- package/skills/uipath-maestro-flow/references/author/plugins/http/impl-manual.md +68 -0
- package/skills/uipath-maestro-flow/references/author/plugins/http/impl.md +173 -0
- package/skills/uipath-maestro-flow/references/author/plugins/http/planning.md +107 -0
- package/skills/uipath-maestro-flow/references/author/plugins/inline-agent/impl.md +540 -0
- package/skills/uipath-maestro-flow/references/author/plugins/inline-agent/planning.md +115 -0
- package/skills/uipath-maestro-flow/references/author/plugins/inline-voice-agent/impl.md +269 -0
- package/skills/uipath-maestro-flow/references/author/plugins/inline-voice-agent/planning.md +128 -0
- package/skills/uipath-maestro-flow/references/author/plugins/ixp/impl.md +424 -0
- package/skills/uipath-maestro-flow/references/author/plugins/ixp/planning.md +95 -0
- package/skills/uipath-maestro-flow/references/author/plugins/loop/impl.md +403 -0
- package/skills/uipath-maestro-flow/references/author/plugins/loop/planning.md +60 -0
- package/skills/uipath-maestro-flow/references/author/plugins/merge/impl.md +43 -0
- package/skills/uipath-maestro-flow/references/author/plugins/merge/planning.md +24 -0
- package/skills/uipath-maestro-flow/references/author/plugins/queue/impl.md +82 -0
- package/skills/uipath-maestro-flow/references/author/plugins/queue/planning.md +44 -0
- package/skills/uipath-maestro-flow/references/author/plugins/rpa/impl.md +117 -0
- package/skills/uipath-maestro-flow/references/author/plugins/rpa/planning.md +61 -0
- package/skills/uipath-maestro-flow/references/author/plugins/scheduled-trigger/impl.md +56 -0
- package/skills/uipath-maestro-flow/references/author/plugins/scheduled-trigger/planning.md +93 -0
- package/skills/uipath-maestro-flow/references/author/plugins/script/impl.md +98 -0
- package/skills/uipath-maestro-flow/references/author/plugins/script/planning.md +42 -0
- package/skills/uipath-maestro-flow/references/author/plugins/subflow/impl.md +164 -0
- package/skills/uipath-maestro-flow/references/author/plugins/subflow/planning.md +35 -0
- package/skills/uipath-maestro-flow/references/author/plugins/summarize/impl.md +189 -0
- package/skills/uipath-maestro-flow/references/author/plugins/summarize/planning.md +66 -0
- package/skills/uipath-maestro-flow/references/author/plugins/switch/impl.md +72 -0
- package/skills/uipath-maestro-flow/references/author/plugins/switch/planning.md +34 -0
- package/skills/uipath-maestro-flow/references/author/plugins/terminate/impl.md +48 -0
- package/skills/uipath-maestro-flow/references/author/plugins/terminate/planning.md +29 -0
- package/skills/uipath-maestro-flow/references/author/plugins/transform/impl.md +252 -0
- package/skills/uipath-maestro-flow/references/author/plugins/transform/planning.md +47 -0
- package/skills/uipath-maestro-flow/references/diagnose/CAPABILITY.md +73 -0
- package/skills/uipath-maestro-flow/references/diagnose/failure-modes.md +353 -0
- package/skills/uipath-maestro-flow/references/diagnose/troubleshooting-guide.md +174 -0
- package/skills/uipath-maestro-flow/references/evaluate/CAPABILITY.md +134 -0
- package/skills/uipath-maestro-flow/references/evaluate/commands-reference.md +376 -0
- package/skills/uipath-maestro-flow/references/evaluate/eval-sets-guide.md +227 -0
- package/skills/uipath-maestro-flow/references/evaluate/evaluators-guide.md +143 -0
- package/skills/uipath-maestro-flow/references/evaluate/running-guide.md +215 -0
- package/skills/uipath-maestro-flow/references/evaluate/upload-safety.md +94 -0
- package/skills/uipath-maestro-flow/references/operate/CAPABILITY.md +77 -0
- package/skills/uipath-maestro-flow/references/operate/manage.md +39 -0
- package/skills/uipath-maestro-flow/references/operate/run.md +121 -0
- package/skills/uipath-maestro-flow/references/operate/ship.md +57 -0
- package/skills/uipath-maestro-flow/references/shared/action-nodes.md +100 -0
- package/skills/uipath-maestro-flow/references/shared/cli-commands.md +269 -0
- package/skills/uipath-maestro-flow/references/shared/cli-conventions.md +178 -0
- package/skills/uipath-maestro-flow/references/shared/file-format.md +582 -0
- package/skills/uipath-maestro-flow/references/shared/node-output-wiring.md +86 -0
- package/skills/uipath-maestro-flow/references/shared/ux-narration-and-todos.md +113 -0
- package/skills/uipath-maestro-flow/references/shared/variables-and-expressions.md +787 -0
- package/skills/uipath-platform/references/integration-service/activities.md +2 -2
- package/skills/uipath-platform/references/integration-service/activity-generation.md +8 -1
- package/skills/uipath-platform/references/integration-service/triggers.md +1 -3
- package/version-manifest.json +1 -1
- package/skills/uipath-maestro-flow/examples/AquariumSafetyStop.flow.ts +0 -26
- package/skills/uipath-maestro-flow/examples/ArchiveCardExtract.flow.ts +0 -38
- package/skills/uipath-maestro-flow/examples/BakeOffEntryForm.flow.ts +0 -27
- package/skills/uipath-maestro-flow/examples/BeeHiveLedger.flow.ts +0 -61
- package/skills/uipath-maestro-flow/examples/BeltProgression.flow.ts +0 -53
- package/skills/uipath-maestro-flow/examples/BirdCountLookup.flow.ts +0 -24
- package/skills/uipath-maestro-flow/examples/ClubDirectory.flow.ts +0 -56
- package/skills/uipath-maestro-flow/examples/ConcertSoundcheck.flow.ts +0 -59
- package/skills/uipath-maestro-flow/examples/DoorbellLog.flow.ts +0 -45
- package/skills/uipath-maestro-flow/examples/FestivalMapScaffold.flow.ts +0 -22
- package/skills/uipath-maestro-flow/examples/FieldTripQuickForm.flow.ts +0 -45
- package/skills/uipath-maestro-flow/examples/FossilCatalogEnrich.flow.ts +0 -26
- package/skills/uipath-maestro-flow/examples/GallerySubmission.flow.ts +0 -67
- package/skills/uipath-maestro-flow/examples/GreenhouseWatering.flow.ts +0 -39
- package/skills/uipath-maestro-flow/examples/HarbourRadioLine.flow.ts +0 -31
- package/skills/uipath-maestro-flow/examples/HerbariumDispatch.flow.ts +0 -34
- package/skills/uipath-maestro-flow/examples/KilnReview.flow.ts +0 -38
- package/skills/uipath-maestro-flow/examples/LibraryDeskChat.flow.ts +0 -39
- package/skills/uipath-maestro-flow/examples/LighthouseSignal.flow.ts +0 -30
- package/skills/uipath-maestro-flow/examples/MeteorShowerPages.flow.ts +0 -39
- package/skills/uipath-maestro-flow/examples/NeighborhoodWalkPlanner.flow.ts +0 -27
- package/skills/uipath-maestro-flow/examples/ObservatorySeeing.flow.ts +0 -51
- package/skills/uipath-maestro-flow/examples/OralHistoryDigest.flow.ts +0 -31
- package/skills/uipath-maestro-flow/examples/PlanetariumConfirmation.flow.ts +0 -34
- package/skills/uipath-maestro-flow/examples/PlantNameAdvisor.flow.ts +0 -28
- package/skills/uipath-maestro-flow/examples/PostcardCaption.flow.ts +0 -44
- package/skills/uipath-maestro-flow/examples/PotteryStudioCallback.flow.ts +0 -41
- package/skills/uipath-maestro-flow/examples/RecipeScaler.flow.ts +0 -62
- package/skills/uipath-maestro-flow/examples/SeedPacketReader.flow.ts +0 -49
- package/skills/uipath-maestro-flow/examples/TideTableConverter.flow.ts +0 -35
- package/skills/uipath-maestro-flow/examples/TrailLogSummary.flow.ts +0 -75
- package/skills/uipath-maestro-flow/examples/WorkshopInventory.flow.ts +0 -27
- package/skills/uipath-maestro-flow/examples/bindings.json +0 -85
- package/skills/uipath-maestro-flow/references/CLI-LOOP.md +0 -309
- package/skills/uipath-maestro-flow/references/agent-resources.md +0 -74
- package/skills/uipath-maestro-flow/references/agent.md +0 -175
- package/skills/uipath-maestro-flow/references/agentic-process.md +0 -41
- package/skills/uipath-maestro-flow/references/api-workflow.md +0 -29
- package/skills/uipath-maestro-flow/references/author.md +0 -178
- package/skills/uipath-maestro-flow/references/batch-transform.md +0 -23
- package/skills/uipath-maestro-flow/references/bindings.md +0 -178
- package/skills/uipath-maestro-flow/references/branch.md +0 -18
- package/skills/uipath-maestro-flow/references/brownfield.md +0 -152
- package/skills/uipath-maestro-flow/references/connector-params.md +0 -624
- package/skills/uipath-maestro-flow/references/conversational.md +0 -77
- package/skills/uipath-maestro-flow/references/data-fabric.md +0 -268
- package/skills/uipath-maestro-flow/references/delay.md +0 -26
- package/skills/uipath-maestro-flow/references/diagnose.md +0 -141
- package/skills/uipath-maestro-flow/references/document-pipeline.md +0 -47
- package/skills/uipath-maestro-flow/references/error-handling.md +0 -75
- package/skills/uipath-maestro-flow/references/evaluate.md +0 -168
- package/skills/uipath-maestro-flow/references/event-trigger.md +0 -155
- package/skills/uipath-maestro-flow/references/form-trigger.md +0 -41
- package/skills/uipath-maestro-flow/references/hitl.md +0 -169
- package/skills/uipath-maestro-flow/references/http.md +0 -105
- package/skills/uipath-maestro-flow/references/inline-agent.md +0 -132
- package/skills/uipath-maestro-flow/references/ixp.md +0 -167
- package/skills/uipath-maestro-flow/references/loops.md +0 -77
- package/skills/uipath-maestro-flow/references/manual-trigger.md +0 -39
- package/skills/uipath-maestro-flow/references/operate.md +0 -204
- package/skills/uipath-maestro-flow/references/or-processes.md +0 -91
- package/skills/uipath-maestro-flow/references/parallel-merge.md +0 -21
- package/skills/uipath-maestro-flow/references/placeholder.md +0 -70
- package/skills/uipath-maestro-flow/references/published-function.md +0 -66
- package/skills/uipath-maestro-flow/references/queue.md +0 -53
- package/skills/uipath-maestro-flow/references/return.md +0 -20
- package/skills/uipath-maestro-flow/references/rpa-workflow.md +0 -27
- package/skills/uipath-maestro-flow/references/scheduled-trigger.md +0 -34
- package/skills/uipath-maestro-flow/references/script.md +0 -52
- package/skills/uipath-maestro-flow/references/subflow.md +0 -33
- package/skills/uipath-maestro-flow/references/summarize.md +0 -20
- package/skills/uipath-maestro-flow/references/switch.md +0 -20
- package/skills/uipath-maestro-flow/references/terminate.md +0 -22
- package/skills/uipath-maestro-flow/references/transform.md +0 -32
- package/skills/uipath-maestro-flow/references/voice.md +0 -70
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# RPA Node — Implementation
|
|
2
|
+
|
|
3
|
+
RPA nodes invoke RPA processes using `uipath.core.rpa-workflow.{key}`.
|
|
4
|
+
|
|
5
|
+
## Discovery
|
|
6
|
+
|
|
7
|
+
**Published (tenant registry):**
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
uip maestro flow registry pull --force
|
|
11
|
+
uip maestro flow registry search "uipath.core.rpa-workflow" --output json
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Run `registry pull --force` first. Search the **node-type token** `uipath.core.rpa-workflow`, not the process name. Select the published workflow by `resourceKey` / folder path and description. `registry search` matches the Orchestrator **release name**, often unrelated to the process name or folder; match the folder path inside `resourceKey`, not a name keyword.
|
|
15
|
+
|
|
16
|
+
Treat an empty result as non-authoritative until you confirm that you searched the node-type token, refreshed the registry, and scanned returned folder paths and descriptions rather than only display names. Do not use the local-scaffold fallback after only a name-search miss.
|
|
17
|
+
|
|
18
|
+
**In-solution (local, no login required):** Run these inside the flow project directory to discover sibling RPA projects in the same `.uipx` solution:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
uip maestro flow registry list --local --output json
|
|
22
|
+
uip maestro flow registry get "<node-type>" --local --output json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Registry Validation
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
uip maestro flow registry get "uipath.core.rpa-workflow.{key}" --output json
|
|
29
|
+
uip maestro flow registry get "uipath.core.rpa-workflow.{key}" --local --output json
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Confirm:
|
|
33
|
+
|
|
34
|
+
- Input port: `input`
|
|
35
|
+
- Output port: `output`
|
|
36
|
+
- `model.serviceType`: `Orchestrator.StartJob`
|
|
37
|
+
- `model.bindings.resourceSubType`: `Process`
|
|
38
|
+
- `model.bindings.resourceKey`: the `<FolderPath>.<ResourceName>` string used to scope binding resolution
|
|
39
|
+
- `inputDefinition`: may contain typed input fields; check `properties`
|
|
40
|
+
- `outputDefinition`: always `error` (`source: "=Error"`); processes with output arguments also declare `output` (`source: "=this"`). Do not author `output` on the instance: the converter injects `=this`, and `$vars.{nodeId}.output` carries the process return value.
|
|
41
|
+
|
|
42
|
+
## Adding and Editing
|
|
43
|
+
|
|
44
|
+
For step-by-step add, delete, and wiring procedures, see [editing-operations.md](../../editing-operations.md). Use the JSON structure below for node-specific `inputs`.
|
|
45
|
+
|
|
46
|
+
### Node instance (`nodes[]`)
|
|
47
|
+
|
|
48
|
+
The instance carries per-instance data (`inputs`, `outputs`, `display`); BPMN type, serviceType, version, and binding/context templates come from `definitions[]`.
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"id": "processInvoices",
|
|
53
|
+
"type": "uipath.core.rpa-workflow.invoice-process-abc123",
|
|
54
|
+
"typeVersion": "<DEFINITION_VERSION>",
|
|
55
|
+
"display": { "label": "Process Invoices" },
|
|
56
|
+
"inputs": {
|
|
57
|
+
"documentPath": "=js:$vars.fileLocation",
|
|
58
|
+
"batchSize": 50
|
|
59
|
+
},
|
|
60
|
+
"outputs": {
|
|
61
|
+
"error": {
|
|
62
|
+
"type": "object",
|
|
63
|
+
"description": "Error information if the RPA process fails",
|
|
64
|
+
"source": "=Error",
|
|
65
|
+
"var": "error"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Declare `error` only; `output` is derived. If authored, the converter copies its `source` verbatim, so values such as `"=result.response"` resolve to null at runtime even when `flow validate` passes. See [file-format.md § Node outputs](../../../shared/file-format.md#node-outputs).
|
|
72
|
+
|
|
73
|
+
### Top-level `bindings[]`
|
|
74
|
+
|
|
75
|
+
Add one entry per `(resourceKey, propertyAttribute)` pair as a sibling of `nodes`/`edges`/`definitions`. Share entries across instances referencing the same RPA process; do not duplicate them.
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
"bindings": [
|
|
79
|
+
{
|
|
80
|
+
"id": "bProcessInvoicesName",
|
|
81
|
+
"name": "name",
|
|
82
|
+
"type": "string",
|
|
83
|
+
"resource": "process",
|
|
84
|
+
"resourceKey": "Finance/Automation.Invoice Processor",
|
|
85
|
+
"default": "Invoice Processor",
|
|
86
|
+
"propertyAttribute": "name",
|
|
87
|
+
"resourceSubType": "Process"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": "bProcessInvoicesFolderPath",
|
|
91
|
+
"name": "folderPath",
|
|
92
|
+
"type": "string",
|
|
93
|
+
"resource": "process",
|
|
94
|
+
"resourceKey": "Finance/Automation.Invoice Processor",
|
|
95
|
+
"default": "Finance/Automation",
|
|
96
|
+
"propertyAttribute": "folderPath",
|
|
97
|
+
"resourceSubType": "Process"
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
For resolution mechanics and why these entries are required, see [file-format.md — Bindings](../../../shared/file-format.md#bindings--orchestrator-resource-bindings-top-level-bindings).
|
|
103
|
+
|
|
104
|
+
## If the RPA Process Is Genuinely Not Published
|
|
105
|
+
|
|
106
|
+
Use this path only after completing the empty-result confirmation in [Discovery](#discovery) and only when no sibling RPA project provides the process. Tell the user to create the RPA project inside the same solution using `uipath-rpa`. After it exists as a sibling in the `.uipx` solution, run `uip maestro flow registry list --local --output json` and wire it directly; publishing is not required.
|
|
107
|
+
|
|
108
|
+
A freshly scaffolded RPA project has no implementation. The wired flow may pass `flow validate` but fault during debug or execution (`Robot.JobUnexpectedExitCode`) until `uipath-rpa` fills in the workflow. A validated flow is not necessarily a working one.
|
|
109
|
+
|
|
110
|
+
## Debug
|
|
111
|
+
|
|
112
|
+
| Error | Cause | Fix |
|
|
113
|
+
| --- | --- | --- |
|
|
114
|
+
| Node type not found in registry | Searched by process name (matches release name, not folder), process not published, or registry stale | Search the `uipath.core.rpa-workflow` token and match on folder path — not a name keyword. If in same solution: run `registry list --local`. Otherwise: run `uip login` then `uip maestro flow registry pull --force` |
|
|
115
|
+
| Input schema mismatch | Inputs don't match `inputDefinition` | Run `registry get` and check required inputs in `inputDefinition.properties` |
|
|
116
|
+
| Process execution failed | Underlying RPA process errored | Check `$vars.{nodeId}.error` for details |
|
|
117
|
+
| Mock placeholder still in flow | Process not yet replaced | Follow the mock replacement workflow above |
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# RPA Node — Planning
|
|
2
|
+
|
|
3
|
+
RPA nodes invoke RPA processes (XAML or coded C# workflows) from within a flow. Published processes appear in the registry after `uip login` + `uip maestro flow registry pull`. **In-solution** (unpublished) processes in sibling projects are discovered via `--local` — no login or publish required.
|
|
4
|
+
|
|
5
|
+
## Node Type Pattern
|
|
6
|
+
|
|
7
|
+
`uipath.core.rpa-workflow.{key}`
|
|
8
|
+
|
|
9
|
+
## When to Use
|
|
10
|
+
|
|
11
|
+
Use an RPA node when the flow needs desktop/browser automation via a published RPA process.
|
|
12
|
+
|
|
13
|
+
### Selection Heuristics
|
|
14
|
+
|
|
15
|
+
| Situation | Use RPA? |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| Desktop/browser automation via a published RPA process | Yes |
|
|
18
|
+
| Target system has a REST API | No — use [Connector](../connector/planning.md) or [HTTP](../http/planning.md) |
|
|
19
|
+
| RPA process in the same solution but not yet published | Yes — use `--local` discovery (see below) |
|
|
20
|
+
| RPA process does not exist yet | Create it in the same solution with `uipath-rpa`, then use `--local` discovery |
|
|
21
|
+
| Need AI reasoning, not desktop automation | No — use [Agent](../agent/planning.md) |
|
|
22
|
+
|
|
23
|
+
## Ports
|
|
24
|
+
|
|
25
|
+
| Input Port | Output Port(s) |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| `input` | `output`, `error` |
|
|
28
|
+
|
|
29
|
+
The `error` port is the implicit error port shared with all action nodes — see [Implicit error port on action nodes](../../../shared/file-format.md#implicit-error-port-on-action-nodes).
|
|
30
|
+
|
|
31
|
+
## Output Variables
|
|
32
|
+
|
|
33
|
+
- `$vars.{nodeId}.output` — the RPA process return value (structure depends on the process)
|
|
34
|
+
- `$vars.{nodeId}.error` — error details if execution fails (`code`, `message`, `detail`, `category`, `status`)
|
|
35
|
+
|
|
36
|
+
## Discovery
|
|
37
|
+
|
|
38
|
+
**Published (tenant registry):**
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
uip maestro flow registry pull --force
|
|
42
|
+
uip maestro flow registry search "uipath.core.rpa-workflow" --output json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Requires `uip login`. Only published processes from your tenant appear.
|
|
46
|
+
|
|
47
|
+
**In-solution (local, no login required):**
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
uip maestro flow registry list --local --output json
|
|
51
|
+
uip maestro flow registry get "<node-type>" --local --output json
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Run from inside the flow project directory. Discovers sibling RPA projects in the same `.uipx` solution.
|
|
55
|
+
|
|
56
|
+
## Planning Annotation
|
|
57
|
+
|
|
58
|
+
In the architectural plan:
|
|
59
|
+
|
|
60
|
+
- If the process exists: note as `resource: <name> (rpa-workflow)`
|
|
61
|
+
- If it does not exist: note as `[CREATE NEW] <description>` with skill `uipath-rpa`
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Scheduled Trigger — Implementation
|
|
2
|
+
|
|
3
|
+
## Node Type
|
|
4
|
+
|
|
5
|
+
`core.trigger.scheduled`
|
|
6
|
+
|
|
7
|
+
## Registry Validation
|
|
8
|
+
|
|
9
|
+
Run `uip maestro flow registry get core.trigger.scheduled --output json`.
|
|
10
|
+
|
|
11
|
+
Confirm that the definition has no input port, output port `output`, and the required input `timerValue`. Set the node instance `typeVersion` to the response `version` field; do not hardcode it because this node has advanced past `1.0`.
|
|
12
|
+
|
|
13
|
+
## JSON Structure
|
|
14
|
+
|
|
15
|
+
### Repeating Interval
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"id": "scheduledStart",
|
|
20
|
+
"type": "core.trigger.scheduled",
|
|
21
|
+
"typeVersion": "<DEFINITION_VERSION>",
|
|
22
|
+
"display": { "label": "Every Hour" },
|
|
23
|
+
"inputs": {
|
|
24
|
+
"entryPointId": "<uuid>",
|
|
25
|
+
"timerType": "timeCycle",
|
|
26
|
+
"timerValue": "R/PT1H"
|
|
27
|
+
},
|
|
28
|
+
"outputs": {
|
|
29
|
+
"output": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"description": "The return value of the trigger.",
|
|
32
|
+
"source": "=result.response",
|
|
33
|
+
"var": "output"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Cron Expression
|
|
40
|
+
|
|
41
|
+
Same node with a clock-aligned `timerValue`: `"timerValue": "0 0 9 ? * MON-FRI"` (weekdays at 09:00).
|
|
42
|
+
|
|
43
|
+
Do not add BPMN type (`bpmn:StartEvent`) or event definition (`bpmn:TimerEventDefinition`) to the instance; they come from the `core.trigger.scheduled` entry in `definitions[]`.
|
|
44
|
+
|
|
45
|
+
## Replacing Manual Trigger with Scheduled
|
|
46
|
+
|
|
47
|
+
Use [Edit/Write: Replace manual trigger with scheduled trigger](../../editing-operations-json.md#replace-manual-trigger-with-scheduled-trigger) for the step-by-step procedure, supplying the node-specific `inputs` above.
|
|
48
|
+
|
|
49
|
+
## Debug
|
|
50
|
+
|
|
51
|
+
| Error | Cause | Fix |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| Cycle expression must be either an ISO 8601 repeating interval or a Quartz cron expression | Malformed `timerValue` | Use `R/P[duration]` (e.g. `R/PT1H`) or a 6-7 field cron (e.g. `0 0 9 ? * MON-FRI`) |
|
|
54
|
+
| `[REQUIRED_FIELD] "timerValue" is required` | Cycle expression written to `timerPreset` | `core.trigger.scheduled` has no `timerPreset` input — put the cycle expression in `timerValue` |
|
|
55
|
+
| BPMN timer event not emitted | `core.trigger.scheduled` definition wrong or missing | Re-copy from `uip maestro flow registry get core.trigger.scheduled --output json` — the definition carries `model.eventDefinition: "bpmn:TimerEventDefinition"` |
|
|
56
|
+
| Two triggers in flow | Both manual and scheduled triggers exist | Remove one — flows must have exactly one trigger |
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Scheduled Trigger — Planning
|
|
2
|
+
|
|
3
|
+
## Node Type
|
|
4
|
+
|
|
5
|
+
`core.trigger.scheduled`
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
Use a Scheduled Trigger to start the flow on a recurring schedule instead of manual invocation.
|
|
10
|
+
|
|
11
|
+
### Selection Heuristics
|
|
12
|
+
|
|
13
|
+
| Situation | Use Scheduled Trigger? |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Flow runs on a recurring schedule (hourly, daily, weekly) | Yes |
|
|
16
|
+
| Flow is started on demand by a user or API call | No — use `core.trigger.manual` |
|
|
17
|
+
|
|
18
|
+
## Ports
|
|
19
|
+
|
|
20
|
+
| Input Port | Output Port(s) |
|
|
21
|
+
| --- | --- |
|
|
22
|
+
| — (none) | `output` |
|
|
23
|
+
|
|
24
|
+
## Key Inputs
|
|
25
|
+
|
|
26
|
+
| Input | Required | Description |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| `timerValue` | Yes | The cycle expression — ISO 8601 repeating interval or Quartz cron |
|
|
29
|
+
| `timerType` | Yes | Always `timeCycle` for scheduled triggers |
|
|
30
|
+
|
|
31
|
+
Set both. The definition's `required` array names only `timerValue`, so a flow
|
|
32
|
+
without `timerType` passes `validate`, but `model.values` maps
|
|
33
|
+
`timerType -> inputs.timerType` to build the BPMN timer event. Omitting it
|
|
34
|
+
leaves the event without its cycle type.
|
|
35
|
+
|
|
36
|
+
The definition the registry serves (1.2) has no `timerPreset` input. Every
|
|
37
|
+
frequency, common or not, goes in `timerValue`.
|
|
38
|
+
|
|
39
|
+
## Cycle Expression Formats
|
|
40
|
+
|
|
41
|
+
### ISO 8601 Repeating Interval
|
|
42
|
+
|
|
43
|
+
`R/P[duration]` — `R` means repeat indefinitely, followed by duration.
|
|
44
|
+
|
|
45
|
+
| Value | Frequency |
|
|
46
|
+
| --- | --- |
|
|
47
|
+
| `R/PT5M` | Every 5 minutes |
|
|
48
|
+
| `R/PT15M` | Every 15 minutes |
|
|
49
|
+
| `R/PT30M` | Every 30 minutes |
|
|
50
|
+
| `R/PT1H` | Every hour |
|
|
51
|
+
| `R/PT6H` | Every 6 hours |
|
|
52
|
+
| `R/PT12H` | Every 12 hours |
|
|
53
|
+
| `R/P1D` | Daily |
|
|
54
|
+
| `R/P1W` | Weekly |
|
|
55
|
+
|
|
56
|
+
Any other interval uses the same form: `R/PT10M` (every 10 min), `R/P2D` (every 2 days).
|
|
57
|
+
|
|
58
|
+
Exactly one duration unit, non-zero, and in range: `Y` 1-9999, `M` 1-12, `W` 1-52, `D` 1-31, `H` 1-23, `T…M` 1-59, `S` 1-59.
|
|
59
|
+
|
|
60
|
+
| Rejected | Why | Instead |
|
|
61
|
+
| --- | --- | --- |
|
|
62
|
+
| `R/PT24H` | out of range | `R/P1D` |
|
|
63
|
+
| `R/PT0H` | zero, never fires | any non-zero interval |
|
|
64
|
+
| `R/PT2H30M` | two units | not expressible as an interval — see below |
|
|
65
|
+
|
|
66
|
+
An interval may be anchored to a start instant: `R/2026-05-14T09:00:00Z/P1W`.
|
|
67
|
+
|
|
68
|
+
### Quartz Cron
|
|
69
|
+
|
|
70
|
+
Six or seven whitespace-separated fields. Use it for a clock-aligned schedule
|
|
71
|
+
an interval cannot express: a fixed time of day, a set of weekdays, a day of
|
|
72
|
+
the month.
|
|
73
|
+
|
|
74
|
+
Examples: `0 0 9 ? * MON-FRI` (weekdays at 09:00), `0 0 2 1 * ? *` (02:00 on the 1st)
|
|
75
|
+
|
|
76
|
+
Put `?` in day-of-month or day-of-week, never a value in both.
|
|
77
|
+
|
|
78
|
+
`validate` checks cron field shape only, never semantics: `0 0 12 * * *` (no
|
|
79
|
+
`?`) and even `ABC ABC ABC ABC ABC ABC` pass it. Read the expression back field
|
|
80
|
+
by field before shipping.
|
|
81
|
+
|
|
82
|
+
Cron does not extend the set of *periods* available. An arbitrary period is
|
|
83
|
+
expressible in neither form: the interval takes one in-range unit and no single
|
|
84
|
+
cron expression carries a sub-hour period across the hour boundary. Every 2.5
|
|
85
|
+
hours and every 90 minutes have no representation here — pick a period one of
|
|
86
|
+
the two forms accepts (`R/PT2H`, `R/PT3H`) and say so, rather than shipping a
|
|
87
|
+
cron that silently fires on a different cadence.
|
|
88
|
+
|
|
89
|
+
## Key Rules
|
|
90
|
+
|
|
91
|
+
- Every flow must have exactly one trigger node
|
|
92
|
+
- Replaces `core.trigger.manual` — do not have both
|
|
93
|
+
- The trigger is always the first node in the topology
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Script Node — Implementation
|
|
2
|
+
|
|
3
|
+
## Node Type
|
|
4
|
+
|
|
5
|
+
`core.action.script`
|
|
6
|
+
|
|
7
|
+
## Registry validation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
uip maestro flow registry get core.action.script --output json
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Confirm: input port `input`, output port `success`, required input `script` (string, non-empty). See [Action Node Structure — Registry validation](../../../shared/action-nodes.md#registry-validation) for the shared pattern.
|
|
14
|
+
|
|
15
|
+
## JSON structure
|
|
16
|
+
|
|
17
|
+
Follow the [Action Node Structure — Standard JSON skeleton](../../../shared/action-nodes.md#standard-json-skeleton). The script-specific input is a single `script` string:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"inputs": {
|
|
22
|
+
"script": "const items = $vars.fetchData.output.body.items;\nconst total = items.reduce((sum, i) => sum + i.amount, 0);\nreturn { total, count: items.length };"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Adding and editing
|
|
28
|
+
|
|
29
|
+
See [Action Node Structure — Adding and editing procedures](../../../shared/action-nodes.md#adding-and-editing-procedures). The script node uses the standard input port `input` and output port `success`; no plugin-specific wiring.
|
|
30
|
+
|
|
31
|
+
## Script rules
|
|
32
|
+
|
|
33
|
+
1. **Top-level body — no `function main()` wrapper.** Node runs the `script` text directly (as a function body); a wrapper is never called → `output` null. Read workflow variables via `$vars.<variableId>` and upstream node outputs via `$vars.<nodeId>.output`; end with top-level `return {…}`. Not a coded Function: no `main`, no injected args.
|
|
34
|
+
- Correct: `const n = $vars.ixp1.output.field; return { n };`
|
|
35
|
+
- Wrong: `function main({ ixp1 }) { … }`
|
|
36
|
+
2. **Must `return` an object** — `return { key: value }`, not a bare scalar. The return value becomes `$vars.<nodeId>.output`.
|
|
37
|
+
3. **`$vars` is a global** — use it directly: `return { upper: $vars.customerName.toUpperCase() }`
|
|
38
|
+
4. **JavaScript ES2020 (Jint engine)** — see [variables-and-expressions.md](../../../shared/variables-and-expressions.md) for supported features and Jint constraints.
|
|
39
|
+
5. **No `console.log`** — `console` is not available. Use `return { debug: value }` to inspect values.
|
|
40
|
+
6. **No external calls** — use the HTTP node or a connector node for API calls.
|
|
41
|
+
7. **30-second timeout** — long-running computations will be killed.
|
|
42
|
+
8. **Never name a variable `aggregate`** — reserved host global. On any `Identifier 'X' has already been declared`, rename `X`.
|
|
43
|
+
9. **Never default an upstream output to `{}`.** `const ctx = $vars.x.output || {}` widens the type to `T | {}`, so every `ctx.field` read warns `Property 'field' does not exist on type '{}'`. Read the output directly; if the upstream node may not have run, chain `?.` to the leaf and `??` only a scalar or array leaf, never an intermediate object: `const items = $vars.x?.output?.body?.items ?? [];`
|
|
44
|
+
|
|
45
|
+
## Common patterns
|
|
46
|
+
|
|
47
|
+
### Transform and return
|
|
48
|
+
|
|
49
|
+
```javascript
|
|
50
|
+
const items = $vars.fetchData.output.body.items;
|
|
51
|
+
const filtered = items.filter(i => i.status === "active");
|
|
52
|
+
return { items: filtered, count: filtered.length };
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Build a payload for a downstream node
|
|
56
|
+
|
|
57
|
+
```javascript
|
|
58
|
+
return {
|
|
59
|
+
subject: `Order ${$vars.orderId} - Confirmation`,
|
|
60
|
+
body: `Your order of ${$vars.orderTotal} has been processed.`,
|
|
61
|
+
recipient: $vars.customerEmail
|
|
62
|
+
};
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Error check from upstream
|
|
66
|
+
|
|
67
|
+
```javascript
|
|
68
|
+
const error = $vars.httpCall.error;
|
|
69
|
+
if (error) {
|
|
70
|
+
return { hasError: true, message: error.message };
|
|
71
|
+
}
|
|
72
|
+
return { hasError: false, data: $vars.httpCall.output.body };
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Reading a file-typed variable
|
|
76
|
+
|
|
77
|
+
A `file` variable (bound via `uip maestro flow debug --attachment <id>=<path>`) hydrates as an **object**, not a string. Read the uploaded file's name from `.FullName`:
|
|
78
|
+
|
|
79
|
+
```javascript
|
|
80
|
+
const doc = $vars.start.output.inputDoc; // file variable → object
|
|
81
|
+
return { fileName: doc.FullName }; // .FullName, not .name/.fileName
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Property access is **case-sensitive** — these casings resolve: `.FullName`, `.ID` (uppercase, not `.Id`), `.MimeType`, `.Metadata.size` (nested, lowercase `size`). `.name` / `.fileName` do not exist. See [variables-and-expressions.md — Runtime shape of a `file` variable](../../../shared/variables-and-expressions.md#file-input).
|
|
85
|
+
|
|
86
|
+
## Debug
|
|
87
|
+
|
|
88
|
+
| Error | Cause | Fix |
|
|
89
|
+
| --- | --- | --- |
|
|
90
|
+
| Script did not return a value | Missing `return` statement | Add `return { ... }` |
|
|
91
|
+
| `output` is `null` but script has a `return` | `return` is inside an uncalled `function main(){}` wrapper | Remove wrapper; code + `return` at top level (rule 1) |
|
|
92
|
+
| Return value is not an object | Returned a scalar (`return 42`) | Wrap in object: `return { value: 42 }` |
|
|
93
|
+
| `$vars.nodeId` is undefined | Upstream node not connected or wrong ID | Check edges and node IDs |
|
|
94
|
+
| Timeout after 30s | Script too expensive | Simplify logic or split into multiple scripts |
|
|
95
|
+
| `console is not defined` | Used `console.log()` | Remove — use `return { debug: val }` instead |
|
|
96
|
+
| `fetch is not defined` | Tried to make HTTP call | Use an HTTP node or connector node instead |
|
|
97
|
+
| `[300501] Error invoking script task` with `Unexpected token` | Malformed JavaScript — `flow validate` does not parse script bodies, so syntax errors surface only at runtime | Check with `node -e "new Function(<script>)"` before validate |
|
|
98
|
+
| `Identifier 'X' has already been declared` | `X` collides with a runtime-injected global (known: `aggregate`) | Rename `X` (e.g. `agg`) |
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Script Node — Planning
|
|
2
|
+
|
|
3
|
+
## Node Type
|
|
4
|
+
|
|
5
|
+
`core.action.script`
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
Use a Script node for custom logic, data transformation, computation, or formatting that does not require an external call.
|
|
10
|
+
|
|
11
|
+
### Selection Heuristics
|
|
12
|
+
|
|
13
|
+
| Situation | Use Script? |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Custom logic, string manipulation, computation | Yes |
|
|
16
|
+
| Standard map/filter/group-by on a collection | No — use [Transform](../transform/planning.md) |
|
|
17
|
+
| Ambiguous input that needs reasoning or judgment | No — use [Agent](../agent/planning.md) |
|
|
18
|
+
| Calling an external API | No — use [HTTP](../http/planning.md) or [Connector Activity](../connector/planning.md) |
|
|
19
|
+
| Natural language generation | No — use [Agent](../agent/planning.md) |
|
|
20
|
+
|
|
21
|
+
## Ports
|
|
22
|
+
|
|
23
|
+
| Input Port | Output Port(s) |
|
|
24
|
+
| --- | --- |
|
|
25
|
+
| `input` | `success`, `error` |
|
|
26
|
+
|
|
27
|
+
- `success` — primary output; fires when the script returns normally.
|
|
28
|
+
- `error` — implicit error port shared with all action nodes. Fires on uncaught script exceptions, returned non-object values, or timeout. See [Implicit error port on action nodes](../../../shared/file-format.md#implicit-error-port-on-action-nodes).
|
|
29
|
+
|
|
30
|
+
## Output Variables
|
|
31
|
+
|
|
32
|
+
- `$vars.{nodeId}.output` — the return value (must be an object)
|
|
33
|
+
- `$vars.{nodeId}.error` — error object if the script fails
|
|
34
|
+
|
|
35
|
+
## Key Constraints
|
|
36
|
+
|
|
37
|
+
- JavaScript only (ES2020 via Jint) — not TypeScript, not Python
|
|
38
|
+
- Must `return` an object: `return { key: value }` (not a bare scalar)
|
|
39
|
+
- No browser/DOM APIs (`fetch`, `document`, `window`, `setTimeout` are unavailable)
|
|
40
|
+
- Cannot make HTTP calls or access external systems
|
|
41
|
+
- 30-second execution timeout
|
|
42
|
+
- `$vars` is available as a global
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Subflow Node — Implementation
|
|
2
|
+
|
|
3
|
+
## Node Type and Registry Validation
|
|
4
|
+
|
|
5
|
+
`core.subflow`
|
|
6
|
+
|
|
7
|
+
Run:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
uip maestro flow registry get core.subflow --output json
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Confirm input port `input` and output ports `output` and `error`. Set the node instance `typeVersion` to the response's `version` field; do not hardcode it.
|
|
14
|
+
|
|
15
|
+
## Parent Node JSON
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"id": "subflow1",
|
|
20
|
+
"type": "core.subflow",
|
|
21
|
+
"typeVersion": "<DEFINITION_VERSION>",
|
|
22
|
+
"display": { "label": "Add Numbers", "icon": "layers" },
|
|
23
|
+
"inputs": { "a": 2, "b": 3 },
|
|
24
|
+
"outputs": {
|
|
25
|
+
"error": {
|
|
26
|
+
"type": "object",
|
|
27
|
+
"description": "Error information if the subflow fails",
|
|
28
|
+
"source": "=Error",
|
|
29
|
+
"var": "error"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Declare `error` only; `output` is derived. Do not author `output`: the converter copies its `source` verbatim, so `"=result.response"` resolves to null at runtime although `flow validate` passes. See [file-format.md § Node outputs](../../../shared/file-format.md#node-outputs).
|
|
36
|
+
|
|
37
|
+
## Subflow Definition
|
|
38
|
+
|
|
39
|
+
Store definitions in a top-level `subflows` object keyed by the parent node ID. Each definition contains `nodes`, `edges`, `variables`, and `layout`:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"subflows": {
|
|
44
|
+
"subflow1": {
|
|
45
|
+
"nodes": [
|
|
46
|
+
{
|
|
47
|
+
"id": "subflow1Start",
|
|
48
|
+
"type": "core.trigger.manual",
|
|
49
|
+
"typeVersion": "1.0",
|
|
50
|
+
"display": { "label": "Start" },
|
|
51
|
+
"inputs": { "entryPointId": "<unique-uuid>", "isDefaultEntryPoint": true },
|
|
52
|
+
"outputs": {
|
|
53
|
+
"output": {
|
|
54
|
+
"type": "object",
|
|
55
|
+
"description": "Data passed when manually triggering the workflow.",
|
|
56
|
+
"source": "null",
|
|
57
|
+
"var": "output"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "script1",
|
|
63
|
+
"type": "core.action.script",
|
|
64
|
+
"typeVersion": "1.0",
|
|
65
|
+
"display": { "label": "Add Numbers" },
|
|
66
|
+
"inputs": { "script": "return { result: $vars.subflow1Start.output.a + $vars.subflow1Start.output.b };" },
|
|
67
|
+
"outputs": {
|
|
68
|
+
"output": { "type": "object", "description": "The return value of the script", "source": "=result.response", "var": "output" },
|
|
69
|
+
"error": { "type": "object", "description": "Error information if the script fails", "source": "=Error", "var": "error" }
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"id": "subflow1End",
|
|
74
|
+
"type": "core.control.end",
|
|
75
|
+
"typeVersion": "1.0",
|
|
76
|
+
"display": { "label": "End" },
|
|
77
|
+
"inputs": {},
|
|
78
|
+
"outputs": { "result": { "source": "=js:$vars.script1.output.result" } }
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
"edges": [
|
|
82
|
+
{ "id": "sf-e1", "sourceNodeId": "subflow1Start", "sourcePort": "output", "targetNodeId": "script1", "targetPort": "input" },
|
|
83
|
+
{ "id": "sf-e2", "sourceNodeId": "script1", "sourcePort": "success", "targetNodeId": "subflow1End", "targetPort": "input" }
|
|
84
|
+
],
|
|
85
|
+
"variables": {
|
|
86
|
+
"globals": [
|
|
87
|
+
{ "id": "a", "direction": "in", "type": "number", "defaultValue": 0, "triggerNodeId": "subflow1Start" },
|
|
88
|
+
{ "id": "b", "direction": "in", "type": "number", "defaultValue": 0, "triggerNodeId": "subflow1Start" },
|
|
89
|
+
{ "id": "result", "direction": "out", "type": "number", "defaultValue": 0 }
|
|
90
|
+
],
|
|
91
|
+
"nodes": []
|
|
92
|
+
},
|
|
93
|
+
"layout": {
|
|
94
|
+
"nodes": {
|
|
95
|
+
"subflow1Start": { "position": { "x": 200, "y": 144 }, "size": { "width": 96, "height": 96 }, "collapsed": false },
|
|
96
|
+
"script1": { "position": { "x": 400, "y": 144 }, "size": { "width": 96, "height": 96 }, "collapsed": false },
|
|
97
|
+
"subflow1End": { "position": { "x": 600, "y": 144 }, "size": { "width": 96, "height": 96 }, "collapsed": false }
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Passing a Flow Input Into the Subflow
|
|
106
|
+
|
|
107
|
+
Set `triggerNodeId` on the parent's `in` variable when forwarding trigger input. Run `uip maestro flow validate`; do not treat **Valid** as proof that this is configured. Without `triggerNodeId`, `flow debug` shows an empty trigger output, forwards `null`, and may fault in the subflow (for example, `Cannot read property 'split' of null`).
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"variables": {
|
|
112
|
+
"globals": [
|
|
113
|
+
{ "id": "text", "direction": "in", "type": "string", "defaultValue": "", "triggerNodeId": "start" },
|
|
114
|
+
{ "id": "reversedText", "direction": "out", "type": "string", "defaultValue": "" }
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
"nodes": [
|
|
118
|
+
{
|
|
119
|
+
"id": "start",
|
|
120
|
+
"type": "core.trigger.manual",
|
|
121
|
+
"typeVersion": "1.0",
|
|
122
|
+
"inputs": { "entryPointId": "<uuid>", "isDefaultEntryPoint": true },
|
|
123
|
+
"outputs": { "output": { "type": "object", "description": "Data passed when manually triggering the process.", "source": "null", "var": "output" } }
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"id": "reverseSubflow",
|
|
127
|
+
"type": "core.subflow",
|
|
128
|
+
"typeVersion": "<DEFINITION_VERSION>",
|
|
129
|
+
"inputs": { "text": "=js:$vars.start.output.text" }
|
|
130
|
+
}
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Value flow is: caller input `text` → parent `start` through the parent's `triggerNodeId` → `$vars.start.output.text` → subflow input `text` → the subflow's `in` variable → `$vars.<subflowStart>.output.text`. Parent and subflow `in` variables are independent; set `triggerNodeId` for each.
|
|
136
|
+
|
|
137
|
+
## Subflow Rules
|
|
138
|
+
|
|
139
|
+
1. Every subflow must have its own Start node (`core.trigger.manual`) and End node (`core.control.end`).
|
|
140
|
+
2. Subflow `variables.globals` with `direction: "in"` map to parent node `inputs`.
|
|
141
|
+
3. Subflow `in` variables must set `triggerNodeId` to the subflow Start node ID, enabling `$vars.{startNodeId}.output.{varId}`.
|
|
142
|
+
4. Subflow `variables.globals` with `direction: "out"` map to parent node outputs and are accessible as `$vars.{subflowNodeId}.output` in the parent.
|
|
143
|
+
5. Parent-scope `$vars` are not visible inside the subflow; pass values explicitly through inputs.
|
|
144
|
+
6. Define inline `outputs` on every subflow node: Start needs `outputs.output`; Script nodes need `outputs.output` and `outputs.error`.
|
|
145
|
+
7. Subflows may be nested up to 3 levels.
|
|
146
|
+
8. Each subflow has its own `nodes`, `edges`, `variables`, and `layout` sections — and only those four. There is no per-subflow `definitions` array: `core.subflow` and every node type used inside a subflow take their entry in the flow's single top-level `definitions[]`. A `definitions` array under `subflows.<id>` is ignored. `flow validate` reports the omission at ``[subflows[<id>].nodes[<nodeId>].type] Node type `<type>:<version>` has no matching definition``.
|
|
147
|
+
9. Put subflow node positions in that subflow's `layout.nodes`, not the top-level `layout.nodes`; scopes are independent.
|
|
148
|
+
10. When the parent forwards an external input, its `in` variable must also set `triggerNodeId` to the parent trigger node ID. `uip maestro flow validate` does not detect this omission; the value silently arrives `null`. See [Passing a Flow Input Into the Subflow](#passing-a-flow-input-into-the-subflow).
|
|
149
|
+
|
|
150
|
+
## Creating a Subflow
|
|
151
|
+
|
|
152
|
+
For the procedure, see [Edit/Write: Create a subflow](../../editing-operations-json.md#create-a-subflow). Use the structures above for node-specific fields.
|
|
153
|
+
|
|
154
|
+
## Debug
|
|
155
|
+
|
|
156
|
+
| Error | Cause | Fix |
|
|
157
|
+
| --- | --- | --- |
|
|
158
|
+
| `$vars.inputData` undefined inside subflow script | Missing `triggerNodeId` on a subflow `in` variable, or direct use of `$vars.{varId}` | Set `triggerNodeId: "{startNodeId}"` on each `in` variable and use `$vars.{startNodeId}.output.{varId}` |
|
|
159
|
+
| Subflow script receives `null`, such as `Cannot read property 'split' of null` | Parent `in` variable lacks `triggerNodeId`, leaving parent trigger output empty | Set `triggerNodeId: "{parentStartNodeId}"` on the parent flow's `in` variable |
|
|
160
|
+
| `$vars.parentNode` undefined inside subflow | Parent scope is inaccessible | Pass values through subflow `in` variables |
|
|
161
|
+
| Subflow output is null | End node lacks output mapping | Map all `out` variables in the End node's `outputs` |
|
|
162
|
+
| Script output is null | Script lacks inline `outputs` | Add `outputs.output` and `outputs.error` inline |
|
|
163
|
+
| Missing Start/End node | Required trigger or end is absent | Add `core.trigger.manual` with `outputs` and `entryPointId`, plus `core.control.end` |
|
|
164
|
+
| Nesting limit exceeded | More than 3 levels of nesting | Flatten the structure or use resource nodes for deeper composition |
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Subflow Node — Planning
|
|
2
|
+
|
|
3
|
+
## Node Type
|
|
4
|
+
|
|
5
|
+
`core.subflow`
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
Use a Subflow node to group related steps into a drillable container with isolated variable scope. A subflow belongs to one node in one flow and cannot be called from anywhere else.
|
|
10
|
+
|
|
11
|
+
### Selection Heuristics
|
|
12
|
+
|
|
13
|
+
| Situation | Use Subflow? |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Group related steps into a container | Yes |
|
|
16
|
+
| Encapsulate logic with its own variable scope | Yes |
|
|
17
|
+
| Simple sequential steps that don't need isolation | No — wire nodes directly |
|
|
18
|
+
| Call a published flow as a subprocess | No — use [Flow](../flow/planning.md) |
|
|
19
|
+
| Same logic needed in 2+ places or flows | No. Make it its own flow project in the solution and call it with [Flow](../flow/planning.md) |
|
|
20
|
+
|
|
21
|
+
## Ports
|
|
22
|
+
|
|
23
|
+
| Input Port | Output Port(s) |
|
|
24
|
+
| --- | --- |
|
|
25
|
+
| `input` | `output`, `error` |
|
|
26
|
+
|
|
27
|
+
The `error` port is the implicit error port shared with all action nodes — see [Implicit error port on action nodes](../../../shared/file-format.md#implicit-error-port-on-action-nodes).
|
|
28
|
+
|
|
29
|
+
## Key Properties
|
|
30
|
+
|
|
31
|
+
- Subflows have their own `nodes`, `edges`, and `variables` stored in `subflows.{nodeId}`
|
|
32
|
+
- Parent-scope `$vars` are **not** visible inside the subflow — pass values explicitly via inputs
|
|
33
|
+
- Subflow inputs map to `direction: "in"` variables; outputs map to `direction: "out"` variables
|
|
34
|
+
- Nesting supported up to 3 levels deep
|
|
35
|
+
- Every subflow must have its own Start node (`core.trigger.manual`) and End node (`core.control.end`)
|