@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,582 @@
|
|
|
1
|
+
# UiPath Flow File Format
|
|
2
|
+
|
|
3
|
+
The `.flow` file is a JSON document at `<ProjectName>.flow` in the project root. It is the **only file you should edit** — other generated files will be overwritten.
|
|
4
|
+
|
|
5
|
+
## Table of contents
|
|
6
|
+
|
|
7
|
+
- [Top-level structure](#top-level-structure)
|
|
8
|
+
- [Project structure (generated scaffold)](#project-structure-generated-scaffold)
|
|
9
|
+
- [Node instance](#node-instance)
|
|
10
|
+
- [Layout](#layout)
|
|
11
|
+
- [Edge — both ports required](#edge--both-ports-required)
|
|
12
|
+
- [Definition entry](#definition-entry)
|
|
13
|
+
- [Common node types](#common-node-types)
|
|
14
|
+
- [Standard ports by node type](#standard-ports-by-node-type)
|
|
15
|
+
- [Implicit error port on action nodes](#implicit-error-port-on-action-nodes)
|
|
16
|
+
- [Minimal working example — dice roller](#minimal-working-example--dice-roller)
|
|
17
|
+
- [entry-points.json — auto-generated, do not edit](#entry-pointsjson--auto-generated-do-not-edit)
|
|
18
|
+
- [Bindings — Orchestrator resource bindings (top-level `bindings[]`)](#bindings--orchestrator-resource-bindings-top-level-bindings)
|
|
19
|
+
- [Bindings — Data Fabric entity bindings](#bindings--data-fabric-entity-bindings)
|
|
20
|
+
- [Bindings — connector connection binding](#bindings--connector-connection-binding)
|
|
21
|
+
|
|
22
|
+
## Top-level structure
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"id": "<uuid>",
|
|
27
|
+
"version": "<scaffolded file-format version>",
|
|
28
|
+
"name": "MyFlow",
|
|
29
|
+
"nodes": [],
|
|
30
|
+
"edges": [],
|
|
31
|
+
"definitions": [],
|
|
32
|
+
"bindings": [],
|
|
33
|
+
"variables": {},
|
|
34
|
+
"layout": {
|
|
35
|
+
"nodes": {}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
> **Key order is NOT guaranteed — never anchor edits on it.** The skeleton above is illustrative; the CLI does not commit to a stable top-level key sequence or to which optional keys are present. Real flows vary: `runtime` may appear (and has been observed *before* `nodes`, not after `definitions`) or be absent entirely; `bindings`, `variables`, `solutionId`, `projectId`, and a trailing `metadata` object surface in different positions depending on CLI version and what the flow contains. When editing a `.flow`, anchor each `Edit` on the **target array's own key** (`"nodes": [`, `"edges": [`, `"definitions": [`, or `layout.nodes`) located in the text you just `Read` — never on "the key that follows X." See [greenfield.md — Anchoring parallel `.flow` Edits](../author/greenfield.md#anchoring-parallel-flow-edits--anchor-on-what-you-read-not-on-key-order).
|
|
41
|
+
|
|
42
|
+
Optional top-level `runtime`: a CLI-managed object that appears on some flows (e.g. after `uip maestro flow node add` for an HTTP/connector node) and is absent on others. It is not user-authored — do not add, remove, or anchor on it. Its presence and position are not guaranteed.
|
|
43
|
+
|
|
44
|
+
**Top-level `version`** = workflow file-format version. **Use the exact value `uip maestro flow init` scaffolds** — do not hand-pick, hardcode, or downgrade it. It is not a semver string; the schema gates on an exact literal for the current file-format version, so an older value (e.g. `"1.0"`, `"1.0.0"`) that worked for a legacy parser will fail for a new flow. `init` always writes the accepted value; preserve it. To see the current value, scaffold a throwaway flow with `init` and read its top-level `version`, or read it from an existing `init`-generated `.flow`.
|
|
45
|
+
|
|
46
|
+
> **Don't confuse top-level `version` with `definitions[].version` / `typeVersion`.** Node-definition `version` (and matching node-instance `typeVersion`) are validated by `versionSchema`, a regex that accepts both `x.y` and `x.y.z` (`/^\d+\.\d+(\.\d+)?$/`, error `'Version must be in format "x.y" or "x.y.z"'`). Both layers are canonically `x.y`, but the node-level regex still accepts legacy 3-part strings so registry definitions (`"1.0"`) and older scaffolded nodes (`"1.0.0"`) both parse. The two layers report distinct errors, but Zod may collapse a node-level mismatch to path `(root)`. If you see a version-related error at `(root)`, audit the top-level `version` first; if it's correct, check each node's `typeVersion` against the matching `definitions[].version`.
|
|
47
|
+
|
|
48
|
+
`solutionId` and `projectId` may also appear at the top level — these are auto-populated by the project scaffold and packaging. Preserve the generated values.
|
|
49
|
+
|
|
50
|
+
> **`bindings[]`** holds Orchestrator resource references for `uipath.core.*` resource nodes (rpa, agent, flow, agentic-process, api-workflow, hitl) and for connector-node connections. See [Bindings — Orchestrator resource bindings](#bindings--orchestrator-resource-bindings-top-level-bindings) below and the [connector plugin](../author/plugins/connector/impl.md) for the connector-binding shape.
|
|
51
|
+
|
|
52
|
+
## Project structure (generated scaffold)
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
<ProjectName>/
|
|
56
|
+
├── project.uiproj # { "Name": "...", "ProjectType": "Flow" }
|
|
57
|
+
├── <ProjectName>.flow # ← edit this
|
|
58
|
+
├── bindings_v2.json # resource bindings
|
|
59
|
+
├── entry-points.json # input/output schema declarations
|
|
60
|
+
├── operate.json # runtime options
|
|
61
|
+
└── package-descriptor.json # packaging manifest
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Node instance
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"id": "rollDice",
|
|
69
|
+
"type": "core.action.script",
|
|
70
|
+
"typeVersion": "1.0",
|
|
71
|
+
"display": { "label": "Roll Dice" },
|
|
72
|
+
"inputs": {
|
|
73
|
+
"script": "return { roll: Math.floor(Math.random() * 6) + 1 };"
|
|
74
|
+
},
|
|
75
|
+
"outputs": {
|
|
76
|
+
"output": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"description": "The return value of the script",
|
|
79
|
+
"source": "=result.response",
|
|
80
|
+
"var": "output"
|
|
81
|
+
},
|
|
82
|
+
"error": {
|
|
83
|
+
"type": "object",
|
|
84
|
+
"description": "Error information if the script fails",
|
|
85
|
+
"source": "=Error",
|
|
86
|
+
"var": "error"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Required fields on every node**: `id`, `type`, `typeVersion`, **`display`** (with at least a `label`). This applies to **every** node — triggers (`core.trigger.manual`, `core.trigger.scheduled`, connector triggers), action nodes, control-flow nodes (`core.control.end`, `core.logic.terminate`), and human-task nodes. The Zod `nodeSchema` declares `display: displayConfigSchema` without `.optional()`, so no node type is exempt — even ones that "feel" trivial.
|
|
93
|
+
|
|
94
|
+
`typeVersion` must match the corresponding `definitions[].version` exactly. The registry often returns versions such as `"1.0"` while older examples or scaffolded files may show `"1.0.0"`. If a node uses `typeVersion: "1.0.0"` but the copied definition is `"version": "1.0"`, validation reports "Node type `<type>:1.0.0` has no matching definition." When direct-authoring a new node from `registry get`, set `typeVersion` to the copied definition's `version`; when preserving an existing node, preserve its existing node/definition pair unless you intentionally update both together. <!-- version-check-skip --> (explains the x.y vs x.y.z mismatch mechanic; literals are illustrative, not pinned)
|
|
95
|
+
|
|
96
|
+
> **Gotcha — vague schema-validation error on missing `display`.** Omitting `display` on any node produces:
|
|
97
|
+
>
|
|
98
|
+
> ```
|
|
99
|
+
> [error] [(root)] Schema validation failed: Invalid input: expected object, received undefined
|
|
100
|
+
> ```
|
|
101
|
+
>
|
|
102
|
+
> The error path is `(root)` and does NOT pinpoint which node or which field is missing. If you see this error after editing a `.flow` file, audit every node for a `display` block before doing anything else.
|
|
103
|
+
|
|
104
|
+
> **No instance `model` block.** BPMN type, serviceType, event definition, and binding/context templates all live in the node's **definition** (the manifest copied from the registry into `definitions[]`). The runtime hydrates them from the definition at serialization time — instances carry only per-instance data (`inputs`, `outputs`, `display`). This applies to every inline-agent-related node too: `uipath.agent.autonomous` plus every attached `uipath.agent.resource.*` node (tool, escalation, context) carries source identity at `inputs.source`. Their definitions declare `model.source: true`; flow-core hoists that identity onto each instance's `inputs.source`. Do not write a `"model": { "source": ... }` block on the instance.
|
|
105
|
+
>
|
|
106
|
+
> **No `ui` block on nodes.** Position and size are stored in the top-level `layout` object, not on individual nodes. See [Layout](#layout) below.
|
|
107
|
+
|
|
108
|
+
### Instance-specific identity fields
|
|
109
|
+
|
|
110
|
+
A few per-instance identity fields live on the node instance:
|
|
111
|
+
|
|
112
|
+
| Field | Used by | Purpose |
|
|
113
|
+
|-------|---------|---------|
|
|
114
|
+
| `inputs.entryPointId` | All trigger nodes (`core.trigger.manual`, `core.trigger.scheduled`, connector triggers) | Stable UUID identifying the entry point |
|
|
115
|
+
| `inputs.isDefaultEntryPoint` | Trigger nodes in subflows | Boolean marking the default entry point when a subflow has multiple triggers |
|
|
116
|
+
| `inputs.source` | `uipath.agent.autonomous` and every attached `uipath.agent.resource.*` node (tool, escalation, context) | For `uipath.agent.autonomous`: the inline agent's `projectId`. For resource nodes: the attached resource UUID. Definitions declare `model.source: true`; flow-core hoists onto the instance — no instance `model` block. |
|
|
117
|
+
| `inputs.color`, `inputs.content` | Sticky-note nodes | Visual content of the sticky note |
|
|
118
|
+
|
|
119
|
+
Example — manual start trigger:
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"id": "start",
|
|
124
|
+
"type": "core.trigger.manual",
|
|
125
|
+
"typeVersion": "1.0",
|
|
126
|
+
"display": { "label": "Manual trigger" },
|
|
127
|
+
"inputs": {
|
|
128
|
+
"entryPointId": "3d4a8c34-5682-4ebe-a6bc-d92a18830bb5"
|
|
129
|
+
},
|
|
130
|
+
"outputs": {
|
|
131
|
+
"output": { "type": "object", "description": "Data passed when manually triggering the process.", "source": "null", "var": "output" }
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Node outputs
|
|
137
|
+
|
|
138
|
+
`$vars.<sourceNodeId>.<outputId>` resolution at runtime is driven by **`variables.nodes[]`**, not by the node instance's `outputs` block. The BPMN emitter walks `variables.nodes[]` to write the process-level `<uipath:inputOutput id="<nodeId>.<outputId>">` declarations the runtime needs; the action-node instance `outputs` block is ignored at serialization (the manifest's `outputDefinition` supplies the activity-side mapping). End / terminate nodes are the exception — their instance `outputs` block IS consumed to map workflow-level `out` variables. See [end/impl.md](../author/plugins/end/impl.md).
|
|
139
|
+
|
|
140
|
+
The canonical recipe for a data-producing node is therefore:
|
|
141
|
+
|
|
142
|
+
- `definitions[]` entry copied verbatim from `uip maestro flow registry get` (carries the manifest `outputDefinition`).
|
|
143
|
+
- `variables.nodes[]` entry per output: `{ "id": "<nodeId>.<outputId>", "type": "object", "binding": { "nodeId": "<nodeId>", "outputId": "<outputId>" } }`.
|
|
144
|
+
- Optional instance `outputs` block matching the manifest — harmless and matches the canonical examples below for clarity, but **not** what controls runtime variable visibility.
|
|
145
|
+
|
|
146
|
+
Skipping `variables.nodes[]` produces a flow that passes `flow validate` but resolves `$vars.<sourceNodeId>.output` to `undefined` at runtime. `uip maestro flow format` regenerates `variables.nodes[]` from `nodes[]` + `definitions[]`, so always run it after structural edits — the omission becomes self-healing.
|
|
147
|
+
|
|
148
|
+
When you DO author the instance `outputs` block (for documentation / parity with manifest schema), use the shape below. Each output entry has:
|
|
149
|
+
|
|
150
|
+
- `type` — data type (usually `"object"`)
|
|
151
|
+
- `description` — human-readable description
|
|
152
|
+
- `source` — runtime binding expression, copied from the manifest `outputDefinition`. `"=Error"` for errors, always.
|
|
153
|
+
- `var` — the variable name (matches the output ID, e.g., `"output"`, `"error"`)
|
|
154
|
+
|
|
155
|
+
**Orchestrator-job nodes (api-workflow, rpa-workflow, agent, agentic-process, function): declare `error` only — `output` is derived.** They are the one family whose instance block the converter reads: it copies an authored `source` verbatim, and injects `{output, jsonSchema, "=this"}` when a non-empty `outputs` omits `output`. So `"=result.response"` there — the connector/script source — leaves `$vars.<nodeId>.output` null at runtime while `flow validate` passes. Studio Web serializes `error`-only instances too (verified on api-workflow, published-flow, and inline-agent nodes). Subflow and published-flow (`uipath.core.flow.*`) instance blocks are never read — still declare `error` only.
|
|
156
|
+
|
|
157
|
+
The standard `outputs` block for most action nodes (script, HTTP, transform, connector):
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
"outputs": {
|
|
161
|
+
"output": {
|
|
162
|
+
"type": "object",
|
|
163
|
+
"description": "The return value of the <node type>",
|
|
164
|
+
"source": "=result.response",
|
|
165
|
+
"var": "output"
|
|
166
|
+
},
|
|
167
|
+
"error": {
|
|
168
|
+
"type": "object",
|
|
169
|
+
"description": "Error information if the <node type> fails",
|
|
170
|
+
"source": "=Error",
|
|
171
|
+
"var": "error"
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Trigger nodes (manual, scheduled, connector triggers) have a single output — no error port. A manual trigger carries the literal string `"null"` as its `source`, matching what Studio Web writes:
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
"outputs": {
|
|
180
|
+
"output": {
|
|
181
|
+
"type": "object",
|
|
182
|
+
"description": "Data passed when manually triggering the process.",
|
|
183
|
+
"source": "null",
|
|
184
|
+
"var": "output"
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
End/terminate nodes do **not** use this pattern — their `outputs` maps workflow-level output variables (see the [Author end plugin reference](../author/plugins/end/impl.md)).
|
|
190
|
+
|
|
191
|
+
## Layout
|
|
192
|
+
|
|
193
|
+
Node positioning is stored in a **top-level `layout` object**, keyed by node `id`. The same shape applies inside each subflow as `subflows[<id>].layout`. Layout data is owned by `uip maestro flow format` (see [cli-commands.md](cli-commands.md#uip-maestro-flow-format)) — you should not need to hand-write it.
|
|
194
|
+
|
|
195
|
+
```json
|
|
196
|
+
"layout": {
|
|
197
|
+
"nodes": {
|
|
198
|
+
"start": {
|
|
199
|
+
"position": { "x": 200, "y": 144 },
|
|
200
|
+
"size": { "width": 96, "height": 96 },
|
|
201
|
+
"collapsed": false
|
|
202
|
+
},
|
|
203
|
+
"rollDice": {
|
|
204
|
+
"position": { "x": 400, "y": 144 },
|
|
205
|
+
"size": { "width": 96, "height": 96 },
|
|
206
|
+
"collapsed": false
|
|
207
|
+
},
|
|
208
|
+
"end": {
|
|
209
|
+
"position": { "x": 600, "y": 144 },
|
|
210
|
+
"size": { "width": 96, "height": 96 },
|
|
211
|
+
"collapsed": false
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Each key in `layout.nodes` is a node `id`. `flow format` creates an entry for every node and populates `position` + `size`.
|
|
218
|
+
|
|
219
|
+
**What format does:**
|
|
220
|
+
- Arranges nodes horizontally (left-to-right) with `nodeSpacing: 96`, anchored to the leftmost node's original position
|
|
221
|
+
- Sets each node's `size` to match its canvas shape: inline agents (`uipath.agent.autonomous` / `uipath.agent.conversational`, `shape: rectangle`) → `{ "width": 288, "height": 96 }`; containers (loops/groups) → `{ "width": 560, "height": 320 }`; everything else — including referenced `uipath.core.agent.<guid>` nodes — → `{ "width": 96, "height": 96 }`. A size that disagrees with the node's shape renders misshapen in Studio Web.
|
|
222
|
+
- Skips `stickyNote` nodes from layout (they keep their custom position and size)
|
|
223
|
+
- Recurses into every subflow and rewrites its `subflows[<id>].layout` map
|
|
224
|
+
|
|
225
|
+
**Subflow layout is scoped.** Each subflow entry in `subflows[<id>]` has its **own** `layout.nodes` map for the nodes inside that subflow — they do NOT live in the top-level `layout.nodes`. Format handles both passes. See the [Author subflow plugin reference](../author/plugins/subflow/impl.md).
|
|
226
|
+
|
|
227
|
+
## Edge — both ports required
|
|
228
|
+
|
|
229
|
+
```json
|
|
230
|
+
{
|
|
231
|
+
"id": "edge-start-rollDice",
|
|
232
|
+
"sourceNodeId": "start",
|
|
233
|
+
"sourcePort": "output",
|
|
234
|
+
"targetNodeId": "rollDice",
|
|
235
|
+
"targetPort": "input"
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
> **Gotcha**: `targetPort` is required. Omitting it produces `[error] [edges[N].targetPort] Invalid input: expected string, received undefined` at validate time.
|
|
240
|
+
>
|
|
241
|
+
> **Gotcha**: the source field is `sourcePort`, not `sourceHandle`. If you write `sourceHandle`, validation fails with `[error] [edges[N].sourcePort] Invalid input: expected string, received undefined` — the path identifies the offending edge entry exactly.
|
|
242
|
+
>
|
|
243
|
+
> **Gotcha — edge `id` MUST start with a letter (XML NCName).** Never use a bare UUID or any id with a leading digit (`"12bd09dd-…"`, `"1edge-start"`). Edge ids become BPMN `<bpmn:incoming>/<bpmn:outgoing>` IDREFs; a leading digit makes the converter silently drop those references while still emitting the `sequenceFlow`, so `flow validate` passes and upload succeeds — but the engine cannot traverse: the run reports **Completed having executed only the start node**, every output null. Use descriptive ids (`e-<source>-<target>`, e.g. `e-start-agent`); prefixing a letter (`e12bd09dd-…`) also works. Same rule applies to node ids.
|
|
244
|
+
|
|
245
|
+
## Definition entry
|
|
246
|
+
|
|
247
|
+
Every node type appearing in `nodes` must have a matching entry in `definitions`. Get the correct definition from:
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
uip maestro flow registry get core.action.script --output json
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Copy the returned node definition object into your `definitions` array. Depending on CLI/plugin version, that object may appear at `Data.Node` or as the top-level object containing fields such as `nodeType`, `version`, and `handleConfiguration`. Do not write definitions by hand — always pull from the registry to ensure schema compliance.
|
|
254
|
+
|
|
255
|
+
## Common node types
|
|
256
|
+
|
|
257
|
+
| Type | Purpose | Key inputs |
|
|
258
|
+
|------|---------|------------|
|
|
259
|
+
| `core.trigger.manual` | Entry point | `entryPointId` |
|
|
260
|
+
| `core.trigger.scheduled` | Recurring schedule trigger | `entryPointId`, `timerType`, `timerValue` |
|
|
261
|
+
| `core.action.script` | Run JavaScript | `script` |
|
|
262
|
+
| `core.action.http.v2` | HTTP request | `method`, `url`, `headers`, `body` |
|
|
263
|
+
| `core.action.transform` | Map/filter/group data | `collection`, `operations` |
|
|
264
|
+
| `core.logic.decision` | If/else branch | `expression` |
|
|
265
|
+
| `core.logic.switch` | Multi-way branch | `cases` |
|
|
266
|
+
| `core.logic.loop` | Iterate collection | `collection`, `parallel` |
|
|
267
|
+
| `core.logic.merge` | Sync parallel paths | — |
|
|
268
|
+
| `core.control.end` | Graceful end | — |
|
|
269
|
+
| `core.logic.terminate` | Abort workflow | — |
|
|
270
|
+
|
|
271
|
+
> The BPMN type for each node (e.g., `bpmn:StartEvent`, `bpmn:ScriptTask`) lives in the `definitions` entry copied from `uip maestro flow registry get`. Instances do not carry the BPMN type.
|
|
272
|
+
|
|
273
|
+
For full details on each node (ports, inputs, outputs, when to use), see the [Author planning architecture guide](../author/planning-arch.md). For implementation resolution (registry lookups, connection binding, reference field resolution), see the [Author planning implementation guide](../author/planning-impl.md).
|
|
274
|
+
|
|
275
|
+
Discover all available types:
|
|
276
|
+
```bash
|
|
277
|
+
uip maestro flow registry list --output json
|
|
278
|
+
uip maestro flow registry search <keyword>
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## Standard ports by node type
|
|
282
|
+
|
|
283
|
+
| Node type | Source ports (outgoing) | Target ports (incoming) |
|
|
284
|
+
|-----------|------------------------|------------------------|
|
|
285
|
+
| `core.trigger.manual` | `output` | — |
|
|
286
|
+
| `core.action.script` | `success`, `error` | `input` |
|
|
287
|
+
| `core.action.http.v2` | `default`, `error`, `branch-{id}` (dynamic) | `input` |
|
|
288
|
+
| `core.action.transform` | `output`, `error` | `input` |
|
|
289
|
+
| `core.logic.decision` | `true`, `false` | `input` |
|
|
290
|
+
| `core.logic.switch` | `case-{id}` (dynamic), `default` | `input` |
|
|
291
|
+
| `core.logic.loop` | `success`, `error` (outer), `start` (inner) | `input` (outer), `continue`, `break` (inner) |
|
|
292
|
+
| `core.logic.merge` | `output` | `input` |
|
|
293
|
+
| `core.control.end` | — | `input` |
|
|
294
|
+
| `core.logic.terminate` | — | `input` |
|
|
295
|
+
|
|
296
|
+
Connector activities, agent nodes, and RPA nodes follow the same pattern as the generic action nodes above: a primary source port plus an implicit `error` port. The `core.datafabric.*` nodes are the exception — `input` and `output` only.
|
|
297
|
+
|
|
298
|
+
Verify exact ports for any node type:
|
|
299
|
+
```bash
|
|
300
|
+
uip maestro flow registry get <node-type> --output json
|
|
301
|
+
# Look at Data.Node.handleConfiguration[].handles[].id
|
|
302
|
+
# Also check Data.Node.supportsErrorHandling — see "Implicit error port" below
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## Implicit error port on action nodes
|
|
306
|
+
|
|
307
|
+
Any node with `supportsErrorHandling: true` in the registry exposes an implicit `error` source port for catching node-level failures. This applies to HTTP, Script, Transform (all variants), connector activities, agent nodes, and RPA nodes — most action nodes, but not all: the `core.datafabric.*` family does not declare it and has no `error` port ([data-fabric/impl.md](../author/plugins/data-fabric/impl.md#no-error-port)). Check the registry rather than assuming.
|
|
308
|
+
|
|
309
|
+
The port is **not** listed in the registry's `handleConfiguration`. Studio Web only exposes it when the source node has `inputs.errorHandlingEnabled: true`; when the flow contains an outgoing edge with `sourcePort: "error"` from that node, the serializer emits a BPMN boundary error event attached to the node. Because of this gate, `uip maestro flow validate` reports an error when a node has an outgoing `sourcePort: "error"` edge but `inputs.errorHandlingEnabled` is not `true` — so the inconsistency is caught before publish rather than surfacing as a hidden edge in Studio Web.
|
|
310
|
+
|
|
311
|
+
### Default: off — enable only for a failure the flow actually handles
|
|
312
|
+
|
|
313
|
+
`inputs.errorHandlingEnabled` is **opt-in, and stays off unless the requirements name a failure fallback.** Turning it on suppresses the node's fault: the node returns instead of faulting and execution continues. Enable it only when both hold:
|
|
314
|
+
|
|
315
|
+
1. The requirements state what should happen when this node fails ("if the call fails, …", "return X for invalid input", "handle timeouts") — **and**
|
|
316
|
+
2. You wire the node's `error` port to a handler that produces an outcome distinguishable from success.
|
|
317
|
+
|
|
318
|
+
Never set the flag on a node that has no outgoing `error` edge — it suppresses the fault with nothing to catch it, converting a real failure into a run that reports success. Let the CLI own the flag: `uip maestro flow edge add --source-port error` and `uip maestro flow format` set it from the error edges actually present. If you find the flag on a node with no error edge, remove it.
|
|
319
|
+
|
|
320
|
+
### Do not swallow the failure
|
|
321
|
+
|
|
322
|
+
An `error` edge must not rejoin the happy path. When it does, every failure walks the success route and the run reports `Completed` while the work never happened — the flow "always looks successful."
|
|
323
|
+
|
|
324
|
+
| | Error-path target | Result |
|
|
325
|
+
| --- | --- | --- |
|
|
326
|
+
| ✗ | The next node on the happy path | Failure is invisible; downstream nodes run on missing data |
|
|
327
|
+
| ✗ | The same End node the success path reaches | Success path's output mappings run against the failed node's empty output |
|
|
328
|
+
| ✓ | A **distinct** End node mapping an error/status `out` variable | Caller can tell failure from success |
|
|
329
|
+
| ✓ | `core.logic.terminate` | Aborts the flow when recovery is impossible — see [terminate/impl.md](../author/plugins/terminate/impl.md) |
|
|
330
|
+
| ✓ | A recovery branch that rejoins **only after obtaining valid data** — a retry that succeeded, or a fallback source that returned data | Downstream runs on real data, not on the failed node's empty output |
|
|
331
|
+
|
|
332
|
+
```text
|
|
333
|
+
Trigger -> HTTP Request
|
|
334
|
+
|-- default -> Process -> End (success — status: "ok")
|
|
335
|
+
|-- error -> Log Error -> End (failure — status: "failed", message from $vars.httpCall.error)
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### When the error port fires
|
|
339
|
+
|
|
340
|
+
- Network failures, DNS errors, TLS errors
|
|
341
|
+
- Request timeouts
|
|
342
|
+
- Non-2xx HTTP responses (unless caught by a configured `inputs.branches` entry)
|
|
343
|
+
- Script exceptions (`throw`, undefined reference, etc.)
|
|
344
|
+
- Transform operation failures (invalid collection, missing field)
|
|
345
|
+
- Any unhandled runtime exception inside the node
|
|
346
|
+
|
|
347
|
+
Without a wired error edge, any of these fails the whole flow with `finalStatus: "Faulted"`. **That is the correct default, not a defect to design around** — a faulted run is visible to the operator; a swallowed failure is not. Only trade the fault for an error path when the requirements say what that path should do.
|
|
348
|
+
|
|
349
|
+
### Wiring the error port
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
# Confirm the node supports error handling
|
|
353
|
+
uip maestro flow registry get <node-type> --output json --output-filter "Node.SupportsErrorHandling"
|
|
354
|
+
|
|
355
|
+
# Add an outgoing edge with sourcePort: "error"
|
|
356
|
+
uip maestro flow edge add <Project>.flow <actionNodeId> <errorHandlerId> \
|
|
357
|
+
--source-port error --target-port input --output json
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
`uip maestro flow edge add --source-port error` and `uip maestro flow format` set `inputs.errorHandlingEnabled: true` on the source node automatically — only for nodes that have an error edge. When editing `.flow` JSON directly, set the flag yourself **on those nodes only**:
|
|
361
|
+
|
|
362
|
+
```json
|
|
363
|
+
{
|
|
364
|
+
"id": "<actionNodeId>",
|
|
365
|
+
"inputs": {
|
|
366
|
+
"errorHandlingEnabled": true
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
Inside the error handler, `$vars.{actionNodeId}.error` resolves to the error object. For HTTP it's `{ code, message, detail, category, status }`; other nodes have similar shapes — check the node's `outputDefinition.error.schema` in the registry.
|
|
372
|
+
|
|
373
|
+
### Error port vs other branching
|
|
374
|
+
|
|
375
|
+
| Mechanism | When to use |
|
|
376
|
+
| --- | --- |
|
|
377
|
+
| **`error` source port** (any action node) | The node failed (exception, timeout, non-2xx not caught by a branch). Generic "something went wrong" handler. |
|
|
378
|
+
| **`branch-{id}` ports** (HTTP only, `inputs.branches`) | The call succeeded and you want to route on response *content* — different paths for e.g. empty vs non-empty results. |
|
|
379
|
+
| **`core.logic.decision` downstream** | Simple yes/no routing on the node's successful output. Doesn't help if the node itself fails. |
|
|
380
|
+
| **`core.logic.switch` downstream** | Multi-way routing on the node's successful output. Same — doesn't catch failures. |
|
|
381
|
+
|
|
382
|
+
## Minimal working example — dice roller
|
|
383
|
+
|
|
384
|
+
Building a flow is a two-step process: write the nodes/edges structure, then populate `definitions` from the registry.
|
|
385
|
+
|
|
386
|
+
### Step 1 — Write nodes and edges
|
|
387
|
+
|
|
388
|
+
Replace `<uuid>` with any generated UUID (e.g. `crypto.randomUUID()` in Node.js, or any UUID v4 generator) — this applies ONLY to the top-level flow `id` and `entryPointId` (the same UUID must appear in `entry-points.json` as `uniqueId`). **Node and edge ids are NOT UUIDs** — they must start with a letter (see the Edge gotcha above). Set top-level `version` to the value `uip maestro flow init` scaffolds — never hand-pick it (see [Top-level structure](#top-level-structure)).
|
|
389
|
+
|
|
390
|
+
```json
|
|
391
|
+
{
|
|
392
|
+
"id": "3d4a8c34-5682-4ebe-a6bc-d92a18830bb5",
|
|
393
|
+
"version": "<scaffolded file-format version>",
|
|
394
|
+
"name": "DiceRoller",
|
|
395
|
+
"nodes": [
|
|
396
|
+
{
|
|
397
|
+
"id": "start",
|
|
398
|
+
"type": "core.trigger.manual",
|
|
399
|
+
"typeVersion": "1.0",
|
|
400
|
+
"display": { "label": "Manual trigger" },
|
|
401
|
+
"inputs": {
|
|
402
|
+
"entryPointId": "<uuid>"
|
|
403
|
+
},
|
|
404
|
+
"outputs": {
|
|
405
|
+
"output": {
|
|
406
|
+
"type": "object",
|
|
407
|
+
"description": "Data passed when manually triggering the process.",
|
|
408
|
+
"source": "null",
|
|
409
|
+
"var": "output"
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
"id": "rollDice",
|
|
415
|
+
"type": "core.action.script",
|
|
416
|
+
"typeVersion": "1.0",
|
|
417
|
+
"display": { "label": "Roll Dice" },
|
|
418
|
+
"inputs": {
|
|
419
|
+
"script": "return { roll: Math.floor(Math.random() * 6) + 1 };"
|
|
420
|
+
},
|
|
421
|
+
"outputs": {
|
|
422
|
+
"output": {
|
|
423
|
+
"type": "object",
|
|
424
|
+
"description": "The return value of the script",
|
|
425
|
+
"source": "=result.response",
|
|
426
|
+
"var": "output"
|
|
427
|
+
},
|
|
428
|
+
"error": {
|
|
429
|
+
"type": "object",
|
|
430
|
+
"description": "Error information if the script fails",
|
|
431
|
+
"source": "=Error",
|
|
432
|
+
"var": "error"
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
"id": "end",
|
|
438
|
+
"type": "core.logic.terminate",
|
|
439
|
+
"typeVersion": "1.0",
|
|
440
|
+
"display": { "label": "End" },
|
|
441
|
+
"inputs": {}
|
|
442
|
+
}
|
|
443
|
+
],
|
|
444
|
+
"edges": [
|
|
445
|
+
{
|
|
446
|
+
"id": "edge-start-roll",
|
|
447
|
+
"sourceNodeId": "start",
|
|
448
|
+
"sourcePort": "output",
|
|
449
|
+
"targetNodeId": "rollDice",
|
|
450
|
+
"targetPort": "input"
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
"id": "edge-roll-end",
|
|
454
|
+
"sourceNodeId": "rollDice",
|
|
455
|
+
"sourcePort": "success",
|
|
456
|
+
"targetNodeId": "end",
|
|
457
|
+
"targetPort": "input"
|
|
458
|
+
}
|
|
459
|
+
],
|
|
460
|
+
"definitions": [],
|
|
461
|
+
"bindings": [],
|
|
462
|
+
"variables": {},
|
|
463
|
+
"layout": {
|
|
464
|
+
"nodes": {
|
|
465
|
+
"start": {
|
|
466
|
+
"position": { "x": 200, "y": 144 },
|
|
467
|
+
"size": { "width": 96, "height": 96 },
|
|
468
|
+
"collapsed": false
|
|
469
|
+
},
|
|
470
|
+
"rollDice": {
|
|
471
|
+
"position": { "x": 400, "y": 144 },
|
|
472
|
+
"size": { "width": 96, "height": 96 },
|
|
473
|
+
"collapsed": false
|
|
474
|
+
},
|
|
475
|
+
"end": {
|
|
476
|
+
"position": { "x": 600, "y": 144 },
|
|
477
|
+
"size": { "width": 96, "height": 96 },
|
|
478
|
+
"collapsed": false
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
### Step 2 — Populate definitions from the registry
|
|
486
|
+
|
|
487
|
+
Run one command per node type used in `nodes`. Copy the returned node definition object from each response into the `definitions` array, and set each matching node instance's `typeVersion` to the copied definition's exact `version`.
|
|
488
|
+
|
|
489
|
+
```bash
|
|
490
|
+
uip maestro flow registry get core.trigger.manual --output json
|
|
491
|
+
uip maestro flow registry get core.action.script --output json
|
|
492
|
+
uip maestro flow registry get core.logic.terminate --output json
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
The `definitions` array must contain exactly one entry per unique `type:typeVersion` used — not one per node instance. If two nodes share the same type and version, one definition covers both.
|
|
496
|
+
|
|
497
|
+
> **Never write definitions by hand.** The registry is the authoritative source; hand-written definitions will fail validation or cause runtime errors.
|
|
498
|
+
|
|
499
|
+
## entry-points.json — auto-generated, do not edit
|
|
500
|
+
|
|
501
|
+
`entry-points.json` declares the flow's external interface (input/output schemas and trigger entry points). Preserve its lifecycle-generated contents; project scaffolding creates it, and the Flow lifecycle regenerates it before execution or publication.
|
|
502
|
+
|
|
503
|
+
Flow input and output parameters are declared through **variables** in the `.flow` file:
|
|
504
|
+
- **Flow inputs**: Add entries to `variables.nodes[]` whose `binding.nodeId` is the start node and whose `binding.outputId` names each input value — the start node "outputs" input values to downstream nodes
|
|
505
|
+
- **Flow outputs**: Add output variables to the end/terminate node
|
|
506
|
+
- Downstream nodes reference inputs via `$vars.start.output.<paramName>`
|
|
507
|
+
|
|
508
|
+
The packaging/debug step derives `entry-points.json` from these variable declarations.
|
|
509
|
+
|
|
510
|
+
## Bindings — Orchestrator resource bindings (top-level `bindings[]`)
|
|
511
|
+
|
|
512
|
+
The top-level `bindings` array (a sibling of `nodes`, `edges`, `definitions`, `variables`, `layout`) holds resource-reference indirections for **Orchestrator resource nodes** — RPA workflows, agents, flows, agentic processes, API workflows, and HITL apps.
|
|
513
|
+
|
|
514
|
+
Folder-scoped Data Fabric entities also write rows into this same array, but resolve them by a **different rule**. Everything in this section describes the Orchestrator-resource form; see [Bindings — Data Fabric entity bindings](#bindings--data-fabric-entity-bindings) below for how the `Entity` kind differs.
|
|
515
|
+
|
|
516
|
+
Each resource node needs two binding entries (one for `name`, one for `folderPath`). The node instance itself has no binding or context data — just `inputs`. The definition (copied verbatim from the registry) carries `model.context[]` templates like `<bindings.name>` and `<bindings.folderPath>`. At BPMN emit time the runtime rewrites those placeholders to `=bindings.<id>` by matching the placeholder name against a workflow-level binding, scoped by the definition's `model.bindings.resourceKey`.
|
|
517
|
+
|
|
518
|
+
```json
|
|
519
|
+
"bindings": [
|
|
520
|
+
{
|
|
521
|
+
"id": "<UNIQUE_ID>",
|
|
522
|
+
"name": "name",
|
|
523
|
+
"type": "string",
|
|
524
|
+
"resource": "process",
|
|
525
|
+
"resourceKey": "<FolderPath>.<ResourceName>",
|
|
526
|
+
"default": "<ResourceName>",
|
|
527
|
+
"propertyAttribute": "name",
|
|
528
|
+
"resourceSubType": "Process"
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
"id": "<UNIQUE_ID_2>",
|
|
532
|
+
"name": "folderPath",
|
|
533
|
+
"type": "string",
|
|
534
|
+
"resource": "process",
|
|
535
|
+
"resourceKey": "<FolderPath>.<ResourceName>",
|
|
536
|
+
"default": "<FolderPath>",
|
|
537
|
+
"propertyAttribute": "folderPath",
|
|
538
|
+
"resourceSubType": "Process"
|
|
539
|
+
}
|
|
540
|
+
]
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
**Rules:**
|
|
544
|
+
|
|
545
|
+
- Add **two entries** per resource node (one for `name`, one for `folderPath`).
|
|
546
|
+
- **Share** entries across node instances that reference the same resource — do not duplicate. Matching is by `(resourceKey, name)`, so any node whose definition has the same `resourceKey` resolves to the same binding pair.
|
|
547
|
+
- Entry IDs are unique strings within the file. Descriptive IDs (e.g. `bDepositRpaName`) are preferred over short random IDs.
|
|
548
|
+
- The node instance has no `model` block — it carries only `inputs`, `outputs`, and `display`.
|
|
549
|
+
- `resourceKey` must exactly match the definition's `model.bindings.resourceKey` (verbatim from the registry). The runtime uses this key to scope placeholder resolution so that binding names like `name` / `folderPath` (shared across resource kinds) don't cross-alias.
|
|
550
|
+
- `resourceSubType` mirrors the definition's `model.bindings.resourceSubType`: `Process` (rpa), `Agent` (agent), `Flow` (flow), `ProcessOrchestration` (agentic-process), `Api` (api-workflow), or the app type for HITL.
|
|
551
|
+
|
|
552
|
+
**Why this is required.** The definition's `model.context[].value` fields are placeholders of the form `<bindings.{name}>` — deliberately invalid as runtime expressions, so they can't be confused with one. Before the BPMN is emitted, the runtime rewrites each placeholder to `=bindings.<id>` by finding a workflow-level binding with `(resourceKey, name)` matching the node's manifest `model.bindings.resourceKey` + the placeholder name. Without matching entries in top-level `bindings[]`, `uip maestro flow debug` fails with "Folder does not exist or the user does not have access to the folder" even though `uip maestro flow validate` passes.
|
|
553
|
+
|
|
554
|
+
**Definitions stay verbatim.** Do NOT rewrite `<bindings.*>` placeholders inside the `definitions` entry — the definition is the authoring template. See "Every node type needs a `definitions` entry" in [author/CAPABILITY.md](../author/CAPABILITY.md).
|
|
555
|
+
|
|
556
|
+
See each resource plugin's `impl.md` for the full JSON per node type: [rpa](../author/plugins/rpa/impl.md), [agent](../author/plugins/agent/impl.md), [flow](../author/plugins/flow/impl.md), [agentic-process](../author/plugins/agentic-process/impl.md), [api-workflow](../author/plugins/api-workflow/impl.md), [hitl](../author/plugins/hitl/impl.md).
|
|
557
|
+
|
|
558
|
+
**Not to be confused with `bindings_v2.json`.** That file holds connector connection bindings for Integration Service nodes — a separate system. A flow may have both: a top-level `bindings[]` for resource references and a `bindings_v2.json` file for connector connections.
|
|
559
|
+
|
|
560
|
+
## Bindings — Data Fabric entity bindings
|
|
561
|
+
|
|
562
|
+
A **folder-scoped** Data Fabric entity (`core.datafabric.*` nodes) writes two rows into the same top-level `bindings[]` array, but they are not Orchestrator resource bindings and most of the rules in the section above do not carry over:
|
|
563
|
+
|
|
564
|
+
| Aspect | Orchestrator resource nodes | Data Fabric `Entity` |
|
|
565
|
+
| --- | --- | --- |
|
|
566
|
+
| `resource` | `process`, `agent`, … | `Entity` — capitalized; a lowercase row is ignored by packaging, so deploy emits no override |
|
|
567
|
+
| Matched by | `(resourceKey, name)` | `(resourceKey, propertyAttribute)`, falling back to `name` only when `propertyAttribute` is absent |
|
|
568
|
+
| `name` holds | the placeholder name (`name` / `folderPath`) | a **display label** — the entity name, and `<entityName>Folder` for the folder row |
|
|
569
|
+
| `propertyAttribute` | `name` / `folderPath` | `name` / **`folderKey`** — never `folderPath` |
|
|
570
|
+
| `resourceSubType` | required, mirrors the definition | **absent** — Entity bindings have no definition-side `model.bindings` |
|
|
571
|
+
|
|
572
|
+
The value is in `default` for both forms. There is also no `<bindings.{name}>` placeholder to rewrite: the entity has no definition-side `model.context[]`, and the serializer emits `bindings.<id>` tokens directly into the `=datafabric[...]` expression it builds.
|
|
573
|
+
|
|
574
|
+
`folderKey` rather than `folderPath` is load-bearing. The platform's deploy-time override for an `Entity` resource carries `{ name, folderPath, folderKey }` and rewrites binding defaults by `propertyAttribute`; a `folderPath` row receives the Orchestrator FQN, which the Data Fabric query rejects even in the source org.
|
|
575
|
+
|
|
576
|
+
Tenant-scoped entities need no bindings at all — they serialize as a dotted literal. See [data-fabric/impl.md — Folder-scoped entities and bindings](../author/plugins/data-fabric/impl.md#folder-scoped-entities-and-bindings) for the full JSON and when to hand-author it.
|
|
577
|
+
|
|
578
|
+
## Bindings — connector connection binding
|
|
579
|
+
|
|
580
|
+
When a flow uses connector nodes, the runtime needs to know **which authenticated connection** to use for each connector. This is configured in `content/bindings_v2.json`.
|
|
581
|
+
|
|
582
|
+
See the relevant node guide in `nodes/` for the full `bindings_v2.json` schema, connection resource field reference, JSON examples, and the connection fetching workflow.
|