@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,83 @@
|
|
|
1
|
+
# Decision Node — Implementation
|
|
2
|
+
|
|
3
|
+
## Node Type
|
|
4
|
+
|
|
5
|
+
`core.logic.decision`
|
|
6
|
+
|
|
7
|
+
## Registry Validation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
uip maestro flow registry get core.logic.decision --output json
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Confirm: input port `input`, output ports `true` and `false`, required input `expression`. Set the node instance `typeVersion` to the `version` field from this response — do not hardcode it.
|
|
14
|
+
|
|
15
|
+
## JSON Structure
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"id": "checkStatus",
|
|
20
|
+
"type": "core.logic.decision",
|
|
21
|
+
"typeVersion": "<DEFINITION_VERSION>",
|
|
22
|
+
"display": { "label": "Check Status" },
|
|
23
|
+
"inputs": {
|
|
24
|
+
"expression": "$vars.fetchData.output.statusCode === 200"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Adding / Editing
|
|
30
|
+
|
|
31
|
+
For step-by-step add, delete, and wiring procedures, see [editing-operations.md](../../editing-operations.md). Use the JSON structure above for the node-specific `inputs`.
|
|
32
|
+
|
|
33
|
+
## Expression Examples
|
|
34
|
+
|
|
35
|
+
```javascript
|
|
36
|
+
// Simple comparison
|
|
37
|
+
$vars.fetchData.output.statusCode === 200
|
|
38
|
+
|
|
39
|
+
// Boolean field
|
|
40
|
+
$vars.processData.output.isValid
|
|
41
|
+
|
|
42
|
+
// Compound condition
|
|
43
|
+
$vars.httpCall.output.statusCode === 200 && $vars.httpCall.output.body.count > 0
|
|
44
|
+
|
|
45
|
+
// String check
|
|
46
|
+
$vars.classify.output.category === "urgent"
|
|
47
|
+
|
|
48
|
+
// Null check
|
|
49
|
+
$vars.lookupUser.output.user !== null
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Wiring
|
|
53
|
+
|
|
54
|
+
Output ports: `true` and `false`. Both branches must be wired. See [editing-operations.md](../../editing-operations.md) for edge add procedures.
|
|
55
|
+
|
|
56
|
+
## Outputs
|
|
57
|
+
|
|
58
|
+
`registry get` shows a Decision declaring two outputs, `matchedCase` and `matchedCaseId`, and `flow format` writes them into `variables.nodes[]`. **Ignore both. Neither is ever assigned at runtime.**
|
|
59
|
+
|
|
60
|
+
They are synthetic. The scope resolver suppresses a gateway's outputs for every reader except the gateway itself, and the flow→BPMN serializer emits no writer for them — a Decision compiles to a gateway whose branch choice lives on the outgoing sequence flows' `conditionExpression`, never in a variable. They hold real values only in the Studio Web canvas, which evaluates gateways client-side. Because the variable is *declared* but never assigned, a downstream read fails **silently**: `undefined` flows into the reader's own logic and yields a wrong result instead of a fault.
|
|
61
|
+
|
|
62
|
+
| What you write | What happens |
|
|
63
|
+
| --- | --- |
|
|
64
|
+
| `$vars.<decisionId>.matchedCaseId` or `.matchedCase` | validate passes with `[EXPRESSION_DIAGNOSTIC] Property '<decisionId>' does not exist on type '{…}'`; reads `undefined` at runtime |
|
|
65
|
+
| `$vars.<decisionId>.output.matchedCaseId` | validate **fails**: `node "<decisionId>" has no output named "output" — its outputs are: matchedCase, matchedCaseId` |
|
|
66
|
+
|
|
67
|
+
> That second message then recommends `$vars.<decisionId>.matchedCaseId`. Take only half of it: drop the `.output.` segment **and** stop reading the gateway. The cross-reference check reads the registry's declared outputs and does not know the scope resolver suppresses them.
|
|
68
|
+
|
|
69
|
+
To act on which branch ran, use one of:
|
|
70
|
+
|
|
71
|
+
- **Recompute the condition** from a node upstream of the Decision, which is still in scope — `$vars.getWeather.output.tempF > 60` rather than the Decision's result. Cheapest when the condition's inputs are still reachable.
|
|
72
|
+
- **Write an `inout` global on each branch** with [`variables.variableUpdates`](../../editing-operations-json.md#add-a-variable-update), then read `$vars.<globalId>` where the branches rejoin. Use this when the condition cannot be recomputed. Map the global on every End node or it raises `MISSING_OUTPUT_MAPPING`.
|
|
73
|
+
|
|
74
|
+
This holds whether or not the branches rejoin, and applies identically to [Switch](../switch/impl.md#outputs).
|
|
75
|
+
|
|
76
|
+
## Debug
|
|
77
|
+
|
|
78
|
+
| Error | Cause | Fix |
|
|
79
|
+
| --- | --- | --- |
|
|
80
|
+
| Expression does not evaluate to boolean | Expression returns non-boolean value | Ensure expression uses comparison operators (`===`, `>`, etc.) |
|
|
81
|
+
| `$vars.nodeId` is undefined | Upstream node not connected or wrong ID | Check edges and node IDs |
|
|
82
|
+
| `[400302] Error evaluating outgoing flow expression from gateway` | `expression` reads a node that runs *after* the Decision (typical after moving the Decision earlier in the flow) | Point `expression` at a node that still runs before the Decision (e.g. the HTTP node's `$vars.<node>.output…`), not at the node the branches lead to |
|
|
83
|
+
| Only one branch wired | Missing true or false edge | Add the missing edge — both branches are required |
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Decision Node — Planning
|
|
2
|
+
|
|
3
|
+
## Node Type
|
|
4
|
+
|
|
5
|
+
`core.logic.decision`
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
Use a Decision node for binary branching (if/else) based on a boolean condition.
|
|
10
|
+
|
|
11
|
+
### Selection Heuristics
|
|
12
|
+
|
|
13
|
+
| Situation | Use Decision? |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Two-path branch based on a boolean condition | Yes |
|
|
16
|
+
| Three or more paths | No — use [Switch](../switch/planning.md) |
|
|
17
|
+
| Branch on HTTP response status codes | No — use [HTTP](../http/planning.md) built-in branches |
|
|
18
|
+
| Branch requires reasoning on ambiguous input | No — use [Agent](../agent/planning.md) |
|
|
19
|
+
|
|
20
|
+
## Ports
|
|
21
|
+
|
|
22
|
+
| Input Port | Output Port(s) |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `input` | `true`, `false` |
|
|
25
|
+
|
|
26
|
+
## Key Inputs
|
|
27
|
+
|
|
28
|
+
| Input | Required | Description |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| `expression` | Yes | Boolean JavaScript expression (e.g., `$vars.fetchData.output.statusCode === 200`) |
|
|
31
|
+
| `trueLabel` | No | Custom label for the true branch |
|
|
32
|
+
| `falseLabel` | No | Custom label for the false branch |
|
|
33
|
+
|
|
34
|
+
## Wiring Rules
|
|
35
|
+
|
|
36
|
+
- Decision nodes produce exactly **two** outgoing edges: one from `true`, one from `false`
|
|
37
|
+
- Both branches must lead to a downstream node (no dangling branches)
|
|
38
|
+
- Each branch typically ends at its own End node or merges back into a shared path
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Delay Node — Implementation
|
|
2
|
+
|
|
3
|
+
## Node Type
|
|
4
|
+
|
|
5
|
+
`core.logic.delay`
|
|
6
|
+
|
|
7
|
+
## Registry Validation
|
|
8
|
+
|
|
9
|
+
Run `uip maestro flow registry get core.logic.delay --output json`.
|
|
10
|
+
|
|
11
|
+
Confirm input port `input`, output port `output`, and required inputs `timerType` and `timerPreset`. Set the node instance `typeVersion` to the response `version` field; do not hardcode it.
|
|
12
|
+
|
|
13
|
+
## JSON Structure
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"id": "<id>",
|
|
18
|
+
"type": "core.logic.delay",
|
|
19
|
+
"typeVersion": "<DEFINITION_VERSION>",
|
|
20
|
+
"display": { "label": "<label>" },
|
|
21
|
+
"inputs": { "timerType": "<timerType>", "timerPreset": "<preset>" }
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
- Duration preset: use `timerType: "timeDuration"` and `timerPreset: "<preset>"` (for example, `"PT15M"`).
|
|
26
|
+
- Custom duration: use `timerPreset: "custom"` and add `timerValue` as an ISO 8601 duration (for example, `"P1DT5H30M"`).
|
|
27
|
+
- Wait until a date: use `timerType: "timeDate"`, `timerPreset: "custom"`, and `timerDate` as an ISO 8601 datetime or `=js:` expression (for example, `"=js:$vars.scheduledDate"`).
|
|
28
|
+
|
|
29
|
+
For step-by-step add, delete, and wiring procedures, see [editing-operations.md](../../editing-operations.md). BPMN type and event definition come from `definitions[]`.
|
|
30
|
+
|
|
31
|
+
## Debug
|
|
32
|
+
|
|
33
|
+
| Error | Cause | Fix |
|
|
34
|
+
| --- | --- | --- |
|
|
35
|
+
| Invalid timer value | Malformed ISO 8601 string | Check format: `P[n]Y[n]M[n]W[n]DT[n]H[n]M[n]S` |
|
|
36
|
+
| Missing `timerValue` | `timerPreset: "custom"` but no `timerValue` | Add `timerValue` with ISO 8601 duration |
|
|
37
|
+
| Missing `timerDate` | `timerType: "timeDate"` but no `timerDate` | Add `timerDate` with ISO 8601 datetime or `=js:` expression |
|
|
38
|
+
| BPMN timer event not emitted | Wrong `core.logic.delay` definition in `definitions[]` | Re-copy from `uip maestro flow registry get core.logic.delay --output json` — the definition carries `model.eventDefinition: "bpmn:TimerEventDefinition"` |
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Delay Node — Planning
|
|
2
|
+
|
|
3
|
+
## Node Type
|
|
4
|
+
|
|
5
|
+
`core.logic.delay`
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
Use a Delay node to pause execution for a duration or until a specific date.
|
|
10
|
+
|
|
11
|
+
### Selection Heuristics
|
|
12
|
+
|
|
13
|
+
| Situation | Use Delay? |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Fixed duration pause (wait 15 minutes, wait 1 day) | Yes |
|
|
16
|
+
| Wait until a specific date/time | Yes |
|
|
17
|
+
| Wait for external work to complete | No — use [Queue](../queue/planning.md) (`create-and-wait`) |
|
|
18
|
+
| Wait for human input | No — use [HITL](../hitl/planning.md) |
|
|
19
|
+
|
|
20
|
+
## Ports
|
|
21
|
+
|
|
22
|
+
| Input Port | Output Port(s) |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `input` | `output` |
|
|
25
|
+
|
|
26
|
+
## Key Inputs
|
|
27
|
+
|
|
28
|
+
| Input | Required | Description |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| `timerType` | Yes | `timeDuration` or `timeDate` |
|
|
31
|
+
| `timerPreset` | Yes | Preset value or `custom` |
|
|
32
|
+
| `timerValue` | Conditional | Required when `timerPreset: "custom"` (ISO 8601 duration) |
|
|
33
|
+
| `timerDate` | Conditional | Required when `timerType: "timeDate"` (ISO 8601 datetime or `=js:` expression) |
|
|
34
|
+
|
|
35
|
+
## Duration Presets
|
|
36
|
+
|
|
37
|
+
| Preset Value | Duration |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| `PT5M` | 5 minutes |
|
|
40
|
+
| `PT15M` | 15 minutes |
|
|
41
|
+
| `PT30M` | 30 minutes |
|
|
42
|
+
| `PT1H` | 1 hour |
|
|
43
|
+
| `PT6H` | 6 hours |
|
|
44
|
+
| `PT12H` | 12 hours |
|
|
45
|
+
| `P1D` | 1 day |
|
|
46
|
+
| `P1W` | 1 week |
|
|
47
|
+
| `custom` | Use `timerValue` for custom ISO 8601 duration |
|
|
48
|
+
|
|
49
|
+
## ISO 8601 Duration Format
|
|
50
|
+
|
|
51
|
+
`P[n]Y[n]M[n]W[n]DT[n]H[n]M[n]S`
|
|
52
|
+
|
|
53
|
+
Examples: `PT30S` (30 seconds), `PT2H30M` (2.5 hours), `P3DT12H` (3 days 12 hours)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# End Node — Implementation
|
|
2
|
+
|
|
3
|
+
## Node Type
|
|
4
|
+
|
|
5
|
+
`core.control.end`
|
|
6
|
+
|
|
7
|
+
## Registry Validation
|
|
8
|
+
|
|
9
|
+
Run `uip maestro flow registry get core.control.end --output json`. Confirm input port `input` and no output ports. Set the node instance `typeVersion` to the response `version` field; do not hardcode it.
|
|
10
|
+
|
|
11
|
+
## JSON Structure
|
|
12
|
+
|
|
13
|
+
Without output variables:
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"id": "<END_NODE_ID>",
|
|
18
|
+
"type": "core.control.end",
|
|
19
|
+
"typeVersion": "<DEFINITION_VERSION>",
|
|
20
|
+
"display": { "label": "<LABEL>" },
|
|
21
|
+
"inputs": {}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
When the workflow declares `out` variables, map every one on every End node:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"id": "<END_NODE_ID>",
|
|
30
|
+
"type": "core.control.end",
|
|
31
|
+
"typeVersion": "<DEFINITION_VERSION>",
|
|
32
|
+
"display": { "label": "<LABEL>" },
|
|
33
|
+
"inputs": {},
|
|
34
|
+
"outputs": {
|
|
35
|
+
"<VAR_ID>": {
|
|
36
|
+
"source": "=js:$vars.<UPSTREAM_NODE>.output.<FIELD>"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Each `outputs` key must match a variable `id` in `variables.globals` with `direction: "out"`.
|
|
43
|
+
|
|
44
|
+
## Adding / Editing
|
|
45
|
+
|
|
46
|
+
For step-by-step add, delete, and wiring procedures, see [editing-operations.md](../../editing-operations.md). Use the JSON structure above for node-specific `inputs` and `outputs`.
|
|
47
|
+
|
|
48
|
+
Add output mappings with `Edit` against the `.flow` file; see [Edit/Write: Add output mapping](../../editing-operations-json.md#add-output-mapping-on-an-end-node).
|
|
49
|
+
|
|
50
|
+
## Debug
|
|
51
|
+
|
|
52
|
+
| Error | Cause | Fix |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| Missing output mapping | An `out` variable is not mapped on this End node | Add `outputs.{varId}.source` for every `out` variable |
|
|
55
|
+
| Output expression unresolvable | The `$vars` reference points to an unreachable node | Ensure the node is upstream and connected via edges |
|
|
56
|
+
| Runtime silent failure | A reachable End node lacks an output mapping | Check **all** End nodes, not just the primary path |
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# End Node — Planning
|
|
2
|
+
|
|
3
|
+
## Node Type
|
|
4
|
+
|
|
5
|
+
`core.control.end`
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
Use an End node for graceful workflow completion. Each terminal path in the flow needs its own End node.
|
|
10
|
+
|
|
11
|
+
### Selection Heuristics
|
|
12
|
+
|
|
13
|
+
| Situation | Use End? |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Normal completion of an execution path | Yes |
|
|
16
|
+
| Fatal error — abort everything immediately | No — use [Terminate](../terminate/planning.md) |
|
|
17
|
+
|
|
18
|
+
## Ports
|
|
19
|
+
|
|
20
|
+
| Input Port | Output Port(s) |
|
|
21
|
+
| --- | --- |
|
|
22
|
+
| `input` | — (none) |
|
|
23
|
+
|
|
24
|
+
## Key Rules
|
|
25
|
+
|
|
26
|
+
- A flow can have multiple End nodes (one per terminal path)
|
|
27
|
+
- Every `out` variable in `variables.globals` **must** be mapped on **every** reachable End node via `outputs`
|
|
28
|
+
- End nodes only terminate their own path — other parallel branches continue
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Flow Node — Implementation
|
|
2
|
+
|
|
3
|
+
Flow nodes invoke other flows as subprocesses. Pattern: `uipath.core.flow.{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.flow" --output json
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### In-solution (sibling projects)
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
uip maestro flow registry list --local --output json
|
|
18
|
+
uip maestro flow registry get "<node-type>" --local --output json
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Registry Validation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Published
|
|
25
|
+
uip maestro flow registry get "uipath.core.flow.{key}" --output json
|
|
26
|
+
|
|
27
|
+
# In-solution
|
|
28
|
+
uip maestro flow registry get "uipath.core.flow.{key}" --local --output json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Confirm:
|
|
32
|
+
|
|
33
|
+
- Input port: `input`
|
|
34
|
+
- Output port: `output`
|
|
35
|
+
- `model.serviceType` — `Orchestrator.StartAgenticProcess` (shared with agentic-process nodes; `resourceSubType: "Flow"` differentiates)
|
|
36
|
+
- `model.bindings.resourceSubType` — `Flow`
|
|
37
|
+
- `model.bindings.resourceKey` — the `<FolderPath>.<FlowName>` string used to scope binding resolution
|
|
38
|
+
- `inputDefinition` — typically empty
|
|
39
|
+
- `outputDefinition.error` — error schema
|
|
40
|
+
|
|
41
|
+
## Adding / Editing
|
|
42
|
+
|
|
43
|
+
For step-by-step add, delete, and wiring procedures, see [editing-operations.md](../../editing-operations.md). Use the JSON structure below for the node-specific `inputs`.
|
|
44
|
+
|
|
45
|
+
## JSON Structure
|
|
46
|
+
|
|
47
|
+
### Node instance (inside `nodes[]`)
|
|
48
|
+
|
|
49
|
+
The instance carries only per-instance data (`inputs`, `outputs`, `display`). BPMN type, serviceType, version, and binding/context templates come from the definition in `definitions[]`.
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"id": "validateData",
|
|
54
|
+
"type": "uipath.core.flow.629edef0-8ce8-428e-a922-3f8bf19ea682",
|
|
55
|
+
"typeVersion": "<DEFINITION_VERSION>",
|
|
56
|
+
"display": { "label": "Validate Data" },
|
|
57
|
+
"inputs": {},
|
|
58
|
+
"outputs": {
|
|
59
|
+
"error": {
|
|
60
|
+
"type": "object",
|
|
61
|
+
"description": "Error information if the flow fails",
|
|
62
|
+
"source": "=Error",
|
|
63
|
+
"var": "error"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Declare `error` only — `output` is derived.** Authoring it makes the converter copy your `source` verbatim; `"=result.response"` then resolves to null at runtime while `flow validate` passes. See [file-format.md § Node outputs](../../../shared/file-format.md#node-outputs).
|
|
70
|
+
|
|
71
|
+
### Top-level `bindings[]` entries (sibling of `nodes`/`edges`/`definitions`)
|
|
72
|
+
|
|
73
|
+
Add one entry per `(resourceKey, propertyAttribute)` pair. Share entries across node instances that reference the same flow — do NOT create duplicates.
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
"bindings": [
|
|
77
|
+
{
|
|
78
|
+
"id": "bValidateDataName",
|
|
79
|
+
"name": "name",
|
|
80
|
+
"type": "string",
|
|
81
|
+
"resource": "process",
|
|
82
|
+
"resourceKey": "Shared.Validate Data Flow",
|
|
83
|
+
"default": "Validate Data Flow",
|
|
84
|
+
"propertyAttribute": "name",
|
|
85
|
+
"resourceSubType": "Flow"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"id": "bValidateDataFolderPath",
|
|
89
|
+
"name": "folderPath",
|
|
90
|
+
"type": "string",
|
|
91
|
+
"resource": "process",
|
|
92
|
+
"resourceKey": "Shared.Validate Data Flow",
|
|
93
|
+
"default": "Shared",
|
|
94
|
+
"propertyAttribute": "folderPath",
|
|
95
|
+
"resourceSubType": "Flow"
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
> For the resolution mechanics and why these entries are required, see [file-format.md — Bindings](../../../shared/file-format.md#bindings--orchestrator-resource-bindings-top-level-bindings).
|
|
101
|
+
|
|
102
|
+
## Debug
|
|
103
|
+
|
|
104
|
+
| Error | Cause | Fix |
|
|
105
|
+
| --- | --- | --- |
|
|
106
|
+
| Node type not found in registry | Flow not published or registry stale | Run `uip login` then `uip maestro flow registry pull --force`; for in-solution flows use `--local` |
|
|
107
|
+
| Flow execution failed | Underlying flow errored | Check `$vars.{nodeId}.error` for details |
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Flow Node — Planning
|
|
2
|
+
|
|
3
|
+
Flow nodes invoke other flows as subprocesses from within a flow. Published flows appear in the registry after `uip login` + `uip maestro flow registry pull`. **In-solution** (unpublished) flows in sibling projects are discovered via `--local` — no login or publish required.
|
|
4
|
+
|
|
5
|
+
## Node Type Pattern
|
|
6
|
+
|
|
7
|
+
`uipath.core.flow.{key}`
|
|
8
|
+
|
|
9
|
+
## When to Use
|
|
10
|
+
|
|
11
|
+
Use a Flow node when you need to call another published flow as a subprocess.
|
|
12
|
+
|
|
13
|
+
### Selection Heuristics
|
|
14
|
+
|
|
15
|
+
| Situation | Use Flow? |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| Call another published flow as a subprocess | Yes |
|
|
18
|
+
| Group related steps with isolated scope (within same project) | No — use [Subflow](../subflow/planning.md) |
|
|
19
|
+
| Invoke a published orchestration process | No — use [Agentic Process](../agentic-process/planning.md) |
|
|
20
|
+
| Flow not yet published but in the same solution | Yes — discover with `--local` (no login or publish needed) |
|
|
21
|
+
| Flow does not exist yet | Create it in the same solution with `uipath-maestro-flow`, then use `--local` discovery |
|
|
22
|
+
|
|
23
|
+
## Ports
|
|
24
|
+
|
|
25
|
+
| Input Port | Output Port(s) |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| `input` | `output` |
|
|
28
|
+
|
|
29
|
+
## Output Variables
|
|
30
|
+
|
|
31
|
+
- `$vars.{nodeId}.error` — error details if execution fails (`code`, `message`, `detail`, `category`, `status`)
|
|
32
|
+
|
|
33
|
+
## Discovery
|
|
34
|
+
|
|
35
|
+
### Published (tenant registry)
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
uip maestro flow registry pull --force
|
|
39
|
+
uip maestro flow registry search "uipath.core.flow" --output json
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Requires `uip login`. Only published flows from your tenant appear.
|
|
43
|
+
|
|
44
|
+
### In-solution (sibling projects)
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
uip maestro flow registry list --local --output json
|
|
48
|
+
uip maestro flow registry get "<node-type>" --local --output json
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
No login or publish required. Discovers unpublished flows in sibling projects within the same solution.
|
|
52
|
+
|
|
53
|
+
## Planning Annotation
|
|
54
|
+
|
|
55
|
+
In the architectural plan:
|
|
56
|
+
|
|
57
|
+
- If the flow exists: note as `resource: <name> (flow)`
|
|
58
|
+
- If it does not exist: note as `[CREATE NEW] <description>` with skill `uipath-maestro-flow`
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# HITL Node — Implementation
|
|
2
|
+
|
|
3
|
+
Choose one checkpoint: an inline QuickForm or an existing deployed Action Center app.
|
|
4
|
+
|
|
5
|
+
## Option 1 — `uipath.human-in-the-loop.quick-form` (Inline Schema — OOTB)
|
|
6
|
+
|
|
7
|
+
Preferred: no registry pull, app publishing, or tenant dependency. Write the node directly into the `.flow` file as JSON.
|
|
8
|
+
|
|
9
|
+
For schema design, node writing, JSON examples, and schema conversion rules, see [`uipath-human-in-the-loop` skill — hitl-node-quickform.md](../../../../../uipath-human-in-the-loop/references/hitl-node-quickform.md). Skills are self-contained: this cross-skill reference is for documentation context only — per Critical Rule 4, offer the handoff and let the user choose. This guide covers implementation-phase topology resolution only, not schema design or node writing.
|
|
10
|
+
|
|
11
|
+
For add, delete, and wiring procedures, see [editing-operations.md](../../editing-operations.md). **Use `Edit` / `Write` for HITL node authoring.** Do not use the dedicated HITL CLI for this non-carve-out structural edit. Wire one output edge per outcome — port `outcome-<outcome.id>` for each entry in `inputs.schema.outcomes[]` — never a single shared port.
|
|
12
|
+
|
|
13
|
+
### Quick reference
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"id": "hitlReview1",
|
|
18
|
+
"type": "uipath.human-in-the-loop.quick-form",
|
|
19
|
+
"typeVersion": "1.0",
|
|
20
|
+
"display": { "label": "Invoice Review" },
|
|
21
|
+
"inputs": {
|
|
22
|
+
"schema": {
|
|
23
|
+
"schemaId": "<uuid>",
|
|
24
|
+
"fields": [
|
|
25
|
+
{ "id": "invoiceid", "label": "Invoice ID", "type": "text", "direction": "input", "binding": "vars.fetchInvoice.output.invoiceId" },
|
|
26
|
+
{ "id": "amount", "label": "Amount", "type": "number", "direction": "input", "binding": "vars.fetchInvoice.output.amount" },
|
|
27
|
+
{ "id": "decision", "label": "Decision", "type": "text", "direction": "output", "variable": "vars.decision" }
|
|
28
|
+
],
|
|
29
|
+
"outcomes": [
|
|
30
|
+
{ "id": "approve", "name": "Approve", "type": "string", "isPrimary": true, "action": "Continue" },
|
|
31
|
+
{ "id": "reject", "name": "Reject", "type": "string", "isPrimary": false, "action": "End" }
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"recipient": { "channels": ["Email", "ActionCenter"], "connections": {}, "assignee": { "type": "group" } },
|
|
35
|
+
"priority": "Low"
|
|
36
|
+
},
|
|
37
|
+
"outputs": {
|
|
38
|
+
"output": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"description": "Task result data",
|
|
41
|
+
"source": "=result",
|
|
42
|
+
"var": "output",
|
|
43
|
+
"properties": {
|
|
44
|
+
"decision": { "type": "string" },
|
|
45
|
+
"Action": { "type": "string", "enum": ["Approve", "Reject"], "default": "Approve" }
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"status": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"description": "Task completion status",
|
|
51
|
+
"source": "=result.Action",
|
|
52
|
+
"var": "status",
|
|
53
|
+
"enum": ["Approve", "Reject"],
|
|
54
|
+
"default": "Approve"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Rules:
|
|
61
|
+
- Input fields use `binding: "vars.<nodeId>.output.<field>"` (raw path; no `=js:$` prefix) and no `variable`.
|
|
62
|
+
- Output fields use `variable: "vars.<globalName>"` (`vars.` required) and no `binding`.
|
|
63
|
+
- InOut fields use both properties in those formats.
|
|
64
|
+
- Use `schemaId` (not `id`) at schema level and generate a fresh UUID.
|
|
65
|
+
- `priority` is `"Low"` | `"Medium"` | `"High"`, default `Low`. No `Critical` on this node, unlike an Action Center case task. Take the value from the request, not from the literal in either option's example: explicit high-urgency language — "urgent", "high priority", "critical", "ASAP", a named or breached SLA — selects `High`; reserve `Medium` for mild or unquantified urgency, `Low` when none is expressed. The value must land in the node; acknowledging the urgency in conversation is not enough.
|
|
66
|
+
- `typeVersion` — always `"1.0"` for this node. **Do not run `registry get` to derive this value; do not use `"1.1"` or any other version.** The OOTB HITL node version is stable at `1.0`.
|
|
67
|
+
- Do not include a `model` block on node instances; only the definition carries it.
|
|
68
|
+
- `outputs` contains only `output` (with `properties` for output/inOut fields plus `Action`) and `status` (with outcome `enum`/`default`). Do not add per-field `custom: true` entries.
|
|
69
|
+
- Ports: `input` (target) → one `outcome-<outcome.id>` port per outcome (source), derived from `inputs.schema.outcomes[].id` verbatim — never lowercase it, never hardcode a port name. Every outcome needs a non-empty string `id`; one without gets no handle at all and any edge drawn to it is a no-op. `outcome-completed` is the port for a zero-outcome node, or for a real outcome whose `id` is literally `completed` — it is not a reserved string, so it is never a shared exit standing in for several outcomes. Wire every outcome port — an unwired one blocks that branch indefinitely.
|
|
70
|
+
- Outputs are `$vars.{nodeId}.output` (object keyed by field `id`), `$vars.{nodeId}.output.{fieldId}`, `$vars.{nodeId}.status` (selected outcome name), and `$vars.{globalId}` (workflow-global alias from `field.variable` with `vars.` stripped). **Do not use the alias in scripts; use `$vars.{nodeId}.output.{fieldId}`.**
|
|
71
|
+
|
|
72
|
+
## Option 2 — App-Based HITL (`uipath.human-in-the-loop.coded-action-app`)
|
|
73
|
+
|
|
74
|
+
Use an existing deployed Action Center app as the task form.
|
|
75
|
+
|
|
76
|
+
### Discovery
|
|
77
|
+
|
|
78
|
+
**Run:**
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
uip solution resources list --kind App --output json
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Filter returned Action Center app types (`vB Action`, `workflow Action`, `Coded Action`, `JS Action`) by app name. **Run:**
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
uip solution resources get <key> --output json
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
If the CLI is unavailable, use:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
GET {BASE_URL}/{ORG}/studio_/backend/api/resourcebuilder/solutions/{SOLUTION_ID}/resources/search
|
|
94
|
+
?kind=app&pageSize=25&projectKey={PROJECT_KEY}&includeSolutionResources=true
|
|
95
|
+
&types=VB%20Action&types=Workflow%20Action&types=Coded%20Action&types=CodedAction&types=JS%20Action
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
For app search → retrieve-configuration → resource files → reference registration → debug overwrites, see **[hitl-node-apptask.md](../../../../../uipath-human-in-the-loop/references/hitl-node-apptask.md)**.
|
|
99
|
+
|
|
100
|
+
### Quick reference
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"id": "invoiceReview1",
|
|
105
|
+
"type": "uipath.human-in-the-loop.coded-action-app",
|
|
106
|
+
"typeVersion": "<DEFINITION_VERSION>",
|
|
107
|
+
"display": { "label": "Invoice Review" },
|
|
108
|
+
"inputs": {
|
|
109
|
+
"recipient": { "channels": ["ActionCenter"], "connections": {}, "assignee": { "type": "group" } },
|
|
110
|
+
"app": {
|
|
111
|
+
"displayName": "Invoice Approval",
|
|
112
|
+
"name": "Invoice Approval",
|
|
113
|
+
"key": "<app.key>",
|
|
114
|
+
"folderPath": "Shared",
|
|
115
|
+
"inputSchema": {
|
|
116
|
+
"type": "object",
|
|
117
|
+
"properties": { "<paramName>": { "type": "string" } }
|
|
118
|
+
},
|
|
119
|
+
"outputSchema": {
|
|
120
|
+
"type": "object",
|
|
121
|
+
"properties": { "<outputName>": { "type": "string" } }
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"appInputBindings": {
|
|
125
|
+
"<inputParamName>": "=vars.<nodeId>.output.<field>",
|
|
126
|
+
"<inputParamName2>": "=metadata.InstanceId"
|
|
127
|
+
},
|
|
128
|
+
"priority": "Medium"
|
|
129
|
+
},
|
|
130
|
+
"outputs": {
|
|
131
|
+
"output": {
|
|
132
|
+
"type": "object",
|
|
133
|
+
"description": "Task result data",
|
|
134
|
+
"source": "=result",
|
|
135
|
+
"var": "output",
|
|
136
|
+
"properties": { "Action": { "type": "string", "enum": ["Submit"], "default": "Submit" } }
|
|
137
|
+
},
|
|
138
|
+
"status": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"description": "Task completion status",
|
|
141
|
+
"source": "=result.Action",
|
|
142
|
+
"var": "status",
|
|
143
|
+
"enum": ["Submit"],
|
|
144
|
+
"default": "Submit"
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Rules:
|
|
151
|
+
- Fill `typeVersion` with the version returned by `uip maestro flow registry get <appKey>` for the specific deployed app. Unlike QuickForm, AppTask versions vary by app definition.
|
|
152
|
+
- `inputs.app.inputSchema` and `outputSchema` are JSON Schema objects (`{ "type": "object", "properties": { ... } }`), not arrays.
|
|
153
|
+
- `inputs.appInputBindings` maps names from `inputSchema.properties` to `"=vars.<path>"` expressions (with `=` and no `js:`). Without these bindings, input fields are blank.
|
|
154
|
+
- `priority` follows Option 1's rule above — derived from the request, not the `"Medium"` literal in the example.
|
|
155
|
+
- Do not add `inputs.schema` to this node — its outcomes come from the deployed app (`inputs.app`), not a schema block. Adding one flips the port from the static `completed` handle this node type actually uses to a schema-derived `outcome-<id>` handle, which does not match what the app produces.
|
|
156
|
+
- Ports: `input` (target) → `completed` (source). Unlike QuickForm, this port stays static regardless of the app's own outcomes.
|
|
157
|
+
|
|
158
|
+
### If the app does not exist
|
|
159
|
+
|
|
160
|
+
Record `[CREATE NEW] <description>` in the node table and use `core.logic.mock` as a placeholder. The app is out of scope; use the `uipath-coded-apps` skill to build it.
|
|
161
|
+
|
|
162
|
+
## Common pattern
|
|
163
|
+
|
|
164
|
+
```text
|
|
165
|
+
Manual Trigger -> RPA Process (extract) -> HITL (review, outcomes: Approve/Reject) ->
|
|
166
|
+
outcome-approve: Script (submit) -> End
|
|
167
|
+
outcome-reject: End
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Branch directly off each outcome's own handle. Do not insert a Decision node after a HITL node to re-derive the branch from `$vars.{nodeId}.status` — the outcome handles already are the branch points.
|
|
171
|
+
|
|
172
|
+
## Debug
|
|
173
|
+
|
|
174
|
+
| Error | Cause | Fix |
|
|
175
|
+
| --- | --- | --- |
|
|
176
|
+
| Node type not found in registry (Option 2) | App not published or registry stale | If in same solution: `uip maestro flow registry list --local`. Otherwise: `uip login` then `uip maestro flow registry pull --force` |
|
|
177
|
+
| Task never completes | Human has not submitted the form | Check task assignment in Orchestrator |
|
|
178
|
+
| Output missing expected fields | App form does not match expected schema | Verify app form fields match what the flow expects |
|
|
179
|
+
| An outcome port unwired (Option 1) | Missing edge on one of the `outcome-<outcome.id>` handles | Wire every outcome's own port; an unwired outcome port blocks the flow indefinitely on that branch |
|
|
180
|
+
| Wired `outcome-completed` as if it were a shared exit for several outcomes (Option 1) | Confused the zero-outcome placeholder for a real port | Check `inputs.schema.outcomes` — if any entry's `id` isn't literally `completed`, rewire to `outcome-<outcome.id>` per outcome instead |
|
|
181
|
+
| Run never finishes; instance stays `Running` until the timeout, ports all wired | A HITL node sits in a flow nothing will attend — no assignee, or an unattended run (schedule, `flow debug`, eval) | Confirm a human will open the task. If the run is unattended, use a mechanism that completes on its own — see [planning.md](planning.md#when-to-select) |
|