@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.
Files changed (191) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.cursor-plugin/plugin.json +1 -1
  4. package/CODEOWNERS +12 -14
  5. package/package.json +1 -1
  6. package/skills/uipath-agents/references/coded/embedding-in-flows.md +1 -3
  7. package/skills/uipath-agents/references/coded/quickstart.md +0 -2
  8. package/skills/uipath-agents/references/lowcode/capabilities/inline-in-flow/inline-in-flow.md +10 -8
  9. package/skills/uipath-agents/references/lowcode/prompting/autonomous-agent-prompting-guide.md +1 -1
  10. package/skills/uipath-human-in-the-loop/SKILL.md +1 -3
  11. package/skills/uipath-human-in-the-loop/references/hitl-node-apptask.md +0 -2
  12. package/skills/uipath-human-in-the-loop/references/hitl-node-coded-action-app.md +0 -2
  13. package/skills/uipath-human-in-the-loop/references/hitl-node-quickform.md +2 -2
  14. package/skills/uipath-maestro-flow/.maintenance/README.md +265 -0
  15. package/skills/uipath-maestro-flow/.maintenance/check-all.sh +40 -0
  16. package/skills/uipath-maestro-flow/.maintenance/check-anchors.sh +101 -0
  17. package/skills/uipath-maestro-flow/.maintenance/check-depth.sh +132 -0
  18. package/skills/uipath-maestro-flow/.maintenance/check-link-text.sh +123 -0
  19. package/skills/uipath-maestro-flow/.maintenance/check-links.sh +73 -0
  20. package/skills/uipath-maestro-flow/.maintenance/check-orphans.sh +93 -0
  21. package/skills/uipath-maestro-flow/.maintenance/check-plugin-pairs.sh +39 -0
  22. package/skills/uipath-maestro-flow/.maintenance/check-template.sh +42 -0
  23. package/skills/uipath-maestro-flow/.maintenance/check-uip-commands.sh +270 -0
  24. package/skills/uipath-maestro-flow/.maintenance/check-versions.sh +160 -0
  25. package/skills/uipath-maestro-flow/SKILL.md +69 -886
  26. package/skills/uipath-maestro-flow/references/author/CAPABILITY.md +207 -0
  27. package/skills/uipath-maestro-flow/references/author/brownfield.md +91 -0
  28. package/skills/uipath-maestro-flow/references/author/editing-operations-cli.md +190 -0
  29. package/skills/uipath-maestro-flow/references/author/editing-operations-json.md +374 -0
  30. package/skills/uipath-maestro-flow/references/author/editing-operations.md +104 -0
  31. package/skills/uipath-maestro-flow/references/author/greenfield.md +420 -0
  32. package/skills/uipath-maestro-flow/references/author/planning-arch.md +364 -0
  33. package/skills/uipath-maestro-flow/references/author/planning-impl.md +291 -0
  34. package/skills/uipath-maestro-flow/references/author/plugins/agent/impl.md +237 -0
  35. package/skills/uipath-maestro-flow/references/author/plugins/agent/planning.md +97 -0
  36. package/skills/uipath-maestro-flow/references/author/plugins/agentic-process/impl.md +107 -0
  37. package/skills/uipath-maestro-flow/references/author/plugins/agentic-process/planning.md +61 -0
  38. package/skills/uipath-maestro-flow/references/author/plugins/api-workflow/impl.md +108 -0
  39. package/skills/uipath-maestro-flow/references/author/plugins/api-workflow/planning.md +60 -0
  40. package/skills/uipath-maestro-flow/references/author/plugins/batch-transform/impl.md +171 -0
  41. package/skills/uipath-maestro-flow/references/author/plugins/batch-transform/planning.md +72 -0
  42. package/skills/uipath-maestro-flow/references/author/plugins/connector/impl-inline.md +120 -0
  43. package/skills/uipath-maestro-flow/references/author/plugins/connector/impl.md +463 -0
  44. package/skills/uipath-maestro-flow/references/author/plugins/connector/planning.md +186 -0
  45. package/skills/uipath-maestro-flow/references/author/plugins/connector-trigger/impl.md +517 -0
  46. package/skills/uipath-maestro-flow/references/author/plugins/connector-trigger/planning.md +115 -0
  47. package/skills/uipath-maestro-flow/references/author/plugins/conversational-agent/impl.md +309 -0
  48. package/skills/uipath-maestro-flow/references/author/plugins/conversational-agent/planning.md +133 -0
  49. package/skills/uipath-maestro-flow/references/author/plugins/data-fabric/impl.md +428 -0
  50. package/skills/uipath-maestro-flow/references/author/plugins/data-fabric/planning.md +188 -0
  51. package/skills/uipath-maestro-flow/references/author/plugins/decision/impl.md +83 -0
  52. package/skills/uipath-maestro-flow/references/author/plugins/decision/planning.md +38 -0
  53. package/skills/uipath-maestro-flow/references/author/plugins/delay/impl.md +38 -0
  54. package/skills/uipath-maestro-flow/references/author/plugins/delay/planning.md +53 -0
  55. package/skills/uipath-maestro-flow/references/author/plugins/end/impl.md +56 -0
  56. package/skills/uipath-maestro-flow/references/author/plugins/end/planning.md +28 -0
  57. package/skills/uipath-maestro-flow/references/author/plugins/flow/impl.md +107 -0
  58. package/skills/uipath-maestro-flow/references/author/plugins/flow/planning.md +58 -0
  59. package/skills/uipath-maestro-flow/references/author/plugins/hitl/impl.md +181 -0
  60. package/skills/uipath-maestro-flow/references/author/plugins/hitl/planning.md +166 -0
  61. package/skills/uipath-maestro-flow/references/author/plugins/http/impl-connector.md +86 -0
  62. package/skills/uipath-maestro-flow/references/author/plugins/http/impl-manual.md +68 -0
  63. package/skills/uipath-maestro-flow/references/author/plugins/http/impl.md +173 -0
  64. package/skills/uipath-maestro-flow/references/author/plugins/http/planning.md +107 -0
  65. package/skills/uipath-maestro-flow/references/author/plugins/inline-agent/impl.md +540 -0
  66. package/skills/uipath-maestro-flow/references/author/plugins/inline-agent/planning.md +115 -0
  67. package/skills/uipath-maestro-flow/references/author/plugins/inline-voice-agent/impl.md +269 -0
  68. package/skills/uipath-maestro-flow/references/author/plugins/inline-voice-agent/planning.md +128 -0
  69. package/skills/uipath-maestro-flow/references/author/plugins/ixp/impl.md +424 -0
  70. package/skills/uipath-maestro-flow/references/author/plugins/ixp/planning.md +95 -0
  71. package/skills/uipath-maestro-flow/references/author/plugins/loop/impl.md +403 -0
  72. package/skills/uipath-maestro-flow/references/author/plugins/loop/planning.md +60 -0
  73. package/skills/uipath-maestro-flow/references/author/plugins/merge/impl.md +43 -0
  74. package/skills/uipath-maestro-flow/references/author/plugins/merge/planning.md +24 -0
  75. package/skills/uipath-maestro-flow/references/author/plugins/queue/impl.md +82 -0
  76. package/skills/uipath-maestro-flow/references/author/plugins/queue/planning.md +44 -0
  77. package/skills/uipath-maestro-flow/references/author/plugins/rpa/impl.md +117 -0
  78. package/skills/uipath-maestro-flow/references/author/plugins/rpa/planning.md +61 -0
  79. package/skills/uipath-maestro-flow/references/author/plugins/scheduled-trigger/impl.md +56 -0
  80. package/skills/uipath-maestro-flow/references/author/plugins/scheduled-trigger/planning.md +93 -0
  81. package/skills/uipath-maestro-flow/references/author/plugins/script/impl.md +98 -0
  82. package/skills/uipath-maestro-flow/references/author/plugins/script/planning.md +42 -0
  83. package/skills/uipath-maestro-flow/references/author/plugins/subflow/impl.md +164 -0
  84. package/skills/uipath-maestro-flow/references/author/plugins/subflow/planning.md +35 -0
  85. package/skills/uipath-maestro-flow/references/author/plugins/summarize/impl.md +189 -0
  86. package/skills/uipath-maestro-flow/references/author/plugins/summarize/planning.md +66 -0
  87. package/skills/uipath-maestro-flow/references/author/plugins/switch/impl.md +72 -0
  88. package/skills/uipath-maestro-flow/references/author/plugins/switch/planning.md +34 -0
  89. package/skills/uipath-maestro-flow/references/author/plugins/terminate/impl.md +48 -0
  90. package/skills/uipath-maestro-flow/references/author/plugins/terminate/planning.md +29 -0
  91. package/skills/uipath-maestro-flow/references/author/plugins/transform/impl.md +252 -0
  92. package/skills/uipath-maestro-flow/references/author/plugins/transform/planning.md +47 -0
  93. package/skills/uipath-maestro-flow/references/diagnose/CAPABILITY.md +73 -0
  94. package/skills/uipath-maestro-flow/references/diagnose/failure-modes.md +353 -0
  95. package/skills/uipath-maestro-flow/references/diagnose/troubleshooting-guide.md +174 -0
  96. package/skills/uipath-maestro-flow/references/evaluate/CAPABILITY.md +134 -0
  97. package/skills/uipath-maestro-flow/references/evaluate/commands-reference.md +376 -0
  98. package/skills/uipath-maestro-flow/references/evaluate/eval-sets-guide.md +227 -0
  99. package/skills/uipath-maestro-flow/references/evaluate/evaluators-guide.md +143 -0
  100. package/skills/uipath-maestro-flow/references/evaluate/running-guide.md +215 -0
  101. package/skills/uipath-maestro-flow/references/evaluate/upload-safety.md +94 -0
  102. package/skills/uipath-maestro-flow/references/operate/CAPABILITY.md +77 -0
  103. package/skills/uipath-maestro-flow/references/operate/manage.md +39 -0
  104. package/skills/uipath-maestro-flow/references/operate/run.md +121 -0
  105. package/skills/uipath-maestro-flow/references/operate/ship.md +57 -0
  106. package/skills/uipath-maestro-flow/references/shared/action-nodes.md +100 -0
  107. package/skills/uipath-maestro-flow/references/shared/cli-commands.md +269 -0
  108. package/skills/uipath-maestro-flow/references/shared/cli-conventions.md +178 -0
  109. package/skills/uipath-maestro-flow/references/shared/file-format.md +582 -0
  110. package/skills/uipath-maestro-flow/references/shared/node-output-wiring.md +86 -0
  111. package/skills/uipath-maestro-flow/references/shared/ux-narration-and-todos.md +113 -0
  112. package/skills/uipath-maestro-flow/references/shared/variables-and-expressions.md +787 -0
  113. package/skills/uipath-platform/references/integration-service/activities.md +2 -2
  114. package/skills/uipath-platform/references/integration-service/activity-generation.md +8 -1
  115. package/skills/uipath-platform/references/integration-service/triggers.md +1 -3
  116. package/version-manifest.json +1 -1
  117. package/skills/uipath-maestro-flow/examples/AquariumSafetyStop.flow.ts +0 -26
  118. package/skills/uipath-maestro-flow/examples/ArchiveCardExtract.flow.ts +0 -38
  119. package/skills/uipath-maestro-flow/examples/BakeOffEntryForm.flow.ts +0 -27
  120. package/skills/uipath-maestro-flow/examples/BeeHiveLedger.flow.ts +0 -61
  121. package/skills/uipath-maestro-flow/examples/BeltProgression.flow.ts +0 -53
  122. package/skills/uipath-maestro-flow/examples/BirdCountLookup.flow.ts +0 -24
  123. package/skills/uipath-maestro-flow/examples/ClubDirectory.flow.ts +0 -56
  124. package/skills/uipath-maestro-flow/examples/ConcertSoundcheck.flow.ts +0 -59
  125. package/skills/uipath-maestro-flow/examples/DoorbellLog.flow.ts +0 -45
  126. package/skills/uipath-maestro-flow/examples/FestivalMapScaffold.flow.ts +0 -22
  127. package/skills/uipath-maestro-flow/examples/FieldTripQuickForm.flow.ts +0 -45
  128. package/skills/uipath-maestro-flow/examples/FossilCatalogEnrich.flow.ts +0 -26
  129. package/skills/uipath-maestro-flow/examples/GallerySubmission.flow.ts +0 -67
  130. package/skills/uipath-maestro-flow/examples/GreenhouseWatering.flow.ts +0 -39
  131. package/skills/uipath-maestro-flow/examples/HarbourRadioLine.flow.ts +0 -31
  132. package/skills/uipath-maestro-flow/examples/HerbariumDispatch.flow.ts +0 -34
  133. package/skills/uipath-maestro-flow/examples/KilnReview.flow.ts +0 -38
  134. package/skills/uipath-maestro-flow/examples/LibraryDeskChat.flow.ts +0 -39
  135. package/skills/uipath-maestro-flow/examples/LighthouseSignal.flow.ts +0 -30
  136. package/skills/uipath-maestro-flow/examples/MeteorShowerPages.flow.ts +0 -39
  137. package/skills/uipath-maestro-flow/examples/NeighborhoodWalkPlanner.flow.ts +0 -27
  138. package/skills/uipath-maestro-flow/examples/ObservatorySeeing.flow.ts +0 -51
  139. package/skills/uipath-maestro-flow/examples/OralHistoryDigest.flow.ts +0 -31
  140. package/skills/uipath-maestro-flow/examples/PlanetariumConfirmation.flow.ts +0 -34
  141. package/skills/uipath-maestro-flow/examples/PlantNameAdvisor.flow.ts +0 -28
  142. package/skills/uipath-maestro-flow/examples/PostcardCaption.flow.ts +0 -44
  143. package/skills/uipath-maestro-flow/examples/PotteryStudioCallback.flow.ts +0 -41
  144. package/skills/uipath-maestro-flow/examples/RecipeScaler.flow.ts +0 -62
  145. package/skills/uipath-maestro-flow/examples/SeedPacketReader.flow.ts +0 -49
  146. package/skills/uipath-maestro-flow/examples/TideTableConverter.flow.ts +0 -35
  147. package/skills/uipath-maestro-flow/examples/TrailLogSummary.flow.ts +0 -75
  148. package/skills/uipath-maestro-flow/examples/WorkshopInventory.flow.ts +0 -27
  149. package/skills/uipath-maestro-flow/examples/bindings.json +0 -85
  150. package/skills/uipath-maestro-flow/references/CLI-LOOP.md +0 -309
  151. package/skills/uipath-maestro-flow/references/agent-resources.md +0 -74
  152. package/skills/uipath-maestro-flow/references/agent.md +0 -175
  153. package/skills/uipath-maestro-flow/references/agentic-process.md +0 -41
  154. package/skills/uipath-maestro-flow/references/api-workflow.md +0 -29
  155. package/skills/uipath-maestro-flow/references/author.md +0 -178
  156. package/skills/uipath-maestro-flow/references/batch-transform.md +0 -23
  157. package/skills/uipath-maestro-flow/references/bindings.md +0 -178
  158. package/skills/uipath-maestro-flow/references/branch.md +0 -18
  159. package/skills/uipath-maestro-flow/references/brownfield.md +0 -152
  160. package/skills/uipath-maestro-flow/references/connector-params.md +0 -624
  161. package/skills/uipath-maestro-flow/references/conversational.md +0 -77
  162. package/skills/uipath-maestro-flow/references/data-fabric.md +0 -268
  163. package/skills/uipath-maestro-flow/references/delay.md +0 -26
  164. package/skills/uipath-maestro-flow/references/diagnose.md +0 -141
  165. package/skills/uipath-maestro-flow/references/document-pipeline.md +0 -47
  166. package/skills/uipath-maestro-flow/references/error-handling.md +0 -75
  167. package/skills/uipath-maestro-flow/references/evaluate.md +0 -168
  168. package/skills/uipath-maestro-flow/references/event-trigger.md +0 -155
  169. package/skills/uipath-maestro-flow/references/form-trigger.md +0 -41
  170. package/skills/uipath-maestro-flow/references/hitl.md +0 -169
  171. package/skills/uipath-maestro-flow/references/http.md +0 -105
  172. package/skills/uipath-maestro-flow/references/inline-agent.md +0 -132
  173. package/skills/uipath-maestro-flow/references/ixp.md +0 -167
  174. package/skills/uipath-maestro-flow/references/loops.md +0 -77
  175. package/skills/uipath-maestro-flow/references/manual-trigger.md +0 -39
  176. package/skills/uipath-maestro-flow/references/operate.md +0 -204
  177. package/skills/uipath-maestro-flow/references/or-processes.md +0 -91
  178. package/skills/uipath-maestro-flow/references/parallel-merge.md +0 -21
  179. package/skills/uipath-maestro-flow/references/placeholder.md +0 -70
  180. package/skills/uipath-maestro-flow/references/published-function.md +0 -66
  181. package/skills/uipath-maestro-flow/references/queue.md +0 -53
  182. package/skills/uipath-maestro-flow/references/return.md +0 -20
  183. package/skills/uipath-maestro-flow/references/rpa-workflow.md +0 -27
  184. package/skills/uipath-maestro-flow/references/scheduled-trigger.md +0 -34
  185. package/skills/uipath-maestro-flow/references/script.md +0 -52
  186. package/skills/uipath-maestro-flow/references/subflow.md +0 -33
  187. package/skills/uipath-maestro-flow/references/summarize.md +0 -20
  188. package/skills/uipath-maestro-flow/references/switch.md +0 -20
  189. package/skills/uipath-maestro-flow/references/terminate.md +0 -22
  190. package/skills/uipath-maestro-flow/references/transform.md +0 -32
  191. 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`)