@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
|
@@ -1,913 +1,96 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: uipath-maestro-flow
|
|
3
|
-
description: "TRIGGER for `.flow`
|
|
3
|
+
description: "TRIGGER for `.flow` files, UiPath Flow / Maestro Flow / Maestro Automate build/edit requests, and adding or listing IXP model/document-extraction nodes for a Flow. Build, edit, run, debug, fix, evaluate a Maestro Flow (.flow): create/connect nodes (connector, approval, script, subflow, ixp, data fabric entity), triggers, schedules, validate; build conversational flows (chat, chatbot, voice, phone calls); upload, publish, manage runs/instances; diagnose errors, incidents, traces; design eval sets, evaluators, run Studio Web evals. `uip maestro flow` CLI. DO NOT TRIGGER for raw IXP project labelling/prediction review/prompt tuning outside Flow→uipath-ixp; C#/XAML→uipath-rpa; standalone agents→uipath-agents."
|
|
4
4
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion
|
|
5
5
|
---
|
|
6
|
-
<!-- CANONICAL — edit here, not in UiPath/flow-builder-sdk. Why: docs/SKILLS_PROMOTION_PLAN.md in that repo. -->
|
|
7
6
|
|
|
8
|
-
#
|
|
7
|
+
# Reasoning budget
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
The graph is "compiled" down to a Flow JSON, which is the artifact used for executing the Flow on the UiPath platform.
|
|
13
|
-
An existing Flow JSON can also be decompiled back into TypeScript for editing.
|
|
9
|
+
- Match reasoning to step difficulty; bias toward acting. For mechanical / IO / format steps, if a `uip` verb covers the task, run it — never hand-derive what the CLI emits (`node configure` detail and `bindings[]`, `format` layout, `registry get` node shapes).
|
|
10
|
+
- Save deep reasoning for the judgments no verb can make for you: node-type selection (the external-service ladder), topology, and how data moves from one node's output into the next node's input.
|
|
14
11
|
|
|
15
|
-
|
|
12
|
+
# Working style
|
|
16
13
|
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
- **Understand first, then decide.** Read this file and the capability index for the work at hand, then plan against what the CLI verbs do — not a guess. `uip maestro flow <verb> --help` and `uip maestro flow registry get <node-type>` are ground truth for flags and node shapes.
|
|
15
|
+
- **Plan the whole path up front, then chain.** Outline the sequence before running anything, batch independent steps into one turn, pipeline the rest (rule #10). Do not run turn-by-turn what could have been chained.
|
|
16
|
+
- **Inspect an input ONCE.** To learn a shape — a node type's schema, a connector's fields, an existing `.flow`'s nodes — dump it once and search that output. Never re-read a file field-by-field or re-query the registry once per field.
|
|
17
|
+
- **Don't repeat work.** Never rerun a command whose inputs and relevant state are unchanged, or re-read an unchanged file already in context. After a command may have rewritten a file (`node configure`, `format`), re-read it before relying on its contents.
|
|
18
|
+
- **Prefer the CLI to ad-hoc code.** Scripting languages are a last resort for `.flow` edits and need user approval first (rule #9). When code is warranted, write it once with paths as arguments; no near-duplicate inline snippets across turns.
|
|
19
|
+
- **Keep outputs small.** Extract with `--output json --output-filter` when you know the fields (rule #1). When the payload is large or the command is slow or side-effecting — `flow debug`, `job traces`, `registry get` — redirect the whole envelope to a file outside the solution tree (`uip maestro flow debug <project-dir> --output json > /tmp/flow-debug.json`) and search the file, so re-reading it never means re-running the command.
|
|
20
|
+
- **Don't do anything unnecessary.** No tool call, file read, or result pulled into context before it is needed.
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
`.flow-sdk/` is the SDK's own work directory: the source, `bindings.json`, `connectors/` and `connectors-local/` all go there by default, relative to the directory you run `uip` from. Each Flow project keeps its own, so a solution can hold several flows; Studio Web never reads it, and `uip solution pack`/`upload` and `flow debug` leave it out.
|
|
22
|
-
**Run the SDK verbs (`flow check`, `compile`, `decompile`, `merge`, `registry pull`/`prepare`, `node .flow-sdk/*.pipeline.mjs`) from the project folder `<Solution>/<Name>/`**, as `( cd <Solution>/<Name> && … )` when your shell does not keep its directory between commands; every `.flow-sdk/` path in this guide and its references is relative to that folder. Everything else runs from the workspace root.
|
|
23
|
-
Scaffold the project first, seed the source from it, then emit back into it — `compile -o` is the authority over where the emitted file is written.
|
|
24
|
-
`<Solution>` and `<Name>` are the request's own names, used verbatim: a request that gives one name for both ("inside a solution of the same name") uses it for both, and a request that names only the Flow uses `<Name>` for both.
|
|
25
|
-
**Look for an existing solution before `uip solution init`:** run `find . -maxdepth 2 -name '*.uipx'`. If one exists and a user can answer, ask which to use (one option per solution, then "Create a new solution", then "Something else") and scaffold nothing until they do; never create a second solution silently. Headless, use the solution the request names, else the only one present, else a new one named as above, and record the choice in the final response.
|
|
22
|
+
# UiPath Flow Skill
|
|
26
23
|
|
|
27
|
-
|
|
28
|
-
uip solution init <Solution>
|
|
29
|
-
( cd <Solution> && uip maestro flow init <Name> --sdk-source )
|
|
30
|
-
# edit <Solution>/<Name>/.flow-sdk/<Name>.flow.ts
|
|
31
|
-
( cd <Solution>/<Name> && uip maestro flow compile .flow-sdk/<Name>.flow.ts -o <Name>.flow )
|
|
32
|
-
```
|
|
24
|
+
Guide for creating, editing, validating, debugging, publishing, diagnosing, and evaluating UiPath Flow projects with the `uip` CLI and `.flow` format.
|
|
33
25
|
|
|
34
|
-
|
|
35
|
-
`--sdk-source` decompiles the trigger-only artifact `flow init` writes into the project's `.flow-sdk/<Name>.flow.ts`, creating the folder; the source carries the flow id and name the product already assigned — a hand-written `flow('<name>')` invents an id instead.
|
|
36
|
-
So the stub is the seed rather than litter: the first `compile -o` overwrites it in place.
|
|
37
|
-
`init` refuses an existing source file unless `--force`; when the source is already there, drop `--sdk-source`.
|
|
38
|
-
**Maestro Automate is `--automate` on the same `flow init`:** when the request names **Maestro Automate** as the product, run `( cd <Solution> && uip maestro flow init <Name> --automate --sdk-source )`; the bare verb ("automate invoice intake") asks for a plain Flow.
|
|
39
|
-
Nothing after `init` changes; the flag writes `runtimeOptions.profile` into `operate.json` plus a `.maestro_automate` marker (how Orchestrator and Studio Web tell the two apart), and `compile -o` rewrites only the `.flow`, so both survive.
|
|
26
|
+
## Capabilities
|
|
40
27
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
28
|
+
- **Author** — Build and edit `.flow` files; add nodes, edges, variables, subflows, transforms, and triggers; explore the registry; validate and format locally; apply node ownership; configure connectors, triggers, managed HTTP, inline-agent scaffolding, IxP/document-extraction nodes, IxP models, and Data Fabric entity nodes; build conversational flows for text chat or voice; plan complex flows first. Read [references/author/CAPABILITY.md](references/author/CAPABILITY.md).
|
|
29
|
+
- Create projects with `uip maestro flow init`.
|
|
30
|
+
- **Operate** — Publish, run, and manage deployed flows; debug real systems, trigger processes, inspect jobs/traces, and pause, resume, cancel, or retry instances. Read [references/operate/CAPABILITY.md](references/operate/CAPABILITY.md).
|
|
31
|
+
- Push to Studio Web with `uip solution upload`.
|
|
32
|
+
- Deploy to Orchestrator with `uip maestro flow pack` plus `uip solution publish`.
|
|
33
|
+
- **Diagnose** — Investigate failed or misbehaving runs; triage `flow debug` or deployed runs; inspect incidents, runtime variables, and deployed BPMN; recognize missing `=js:`, misshapen nodes, HITL-stuck, reused-reference-ID, and single-nested-layout failures. Read [references/diagnose/CAPABILITY.md](references/diagnose/CAPABILITY.md).
|
|
34
|
+
- **Evaluate** — Design and run evaluations; create evaluators and eval sets, add data points, pin entry points, run Studio Web evaluations, poll status, fetch results, and compare runs. Read [references/evaluate/CAPABILITY.md](references/evaluate/CAPABILITY.md).
|
|
35
|
+
- Decide whether to call `uip solution upload` (almost always do not auto-run; ask first).
|
|
44
36
|
|
|
45
|
-
|
|
37
|
+
## Capability router
|
|
46
38
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
39
|
+
| Goal | Reference |
|
|
40
|
+
|---|---|
|
|
41
|
+
| Create or edit a flow | [references/author/CAPABILITY.md](references/author/CAPABILITY.md) |
|
|
42
|
+
| Publish, deploy, debug, or manage lifecycle | [references/operate/CAPABILITY.md](references/operate/CAPABILITY.md) |
|
|
43
|
+
| Diagnose a failed or misbehaving run | [references/diagnose/CAPABILITY.md](references/diagnose/CAPABILITY.md) |
|
|
44
|
+
| Design/run evaluations | [references/evaluate/CAPABILITY.md](references/evaluate/CAPABILITY.md) |
|
|
45
|
+
| CLI syntax | [references/shared/cli-commands.md](references/shared/cli-commands.md) |
|
|
46
|
+
| CLI conventions, `--output json`, `--output-filter`, login, and `FOLDER_KEY` | [references/shared/cli-conventions.md](references/shared/cli-conventions.md) |
|
|
47
|
+
| `.flow` JSON format | [references/shared/file-format.md](references/shared/file-format.md) |
|
|
48
|
+
| Variables and `=js:` expressions | [references/shared/variables-and-expressions.md](references/shared/variables-and-expressions.md) |
|
|
49
|
+
| Wire node outputs to inputs | [references/shared/node-output-wiring.md](references/shared/node-output-wiring.md) |
|
|
50
|
+
| Shared action-node boilerplate | [references/shared/action-nodes.md](references/shared/action-nodes.md) |
|
|
51
|
+
| Optional progress narration and todos | [references/shared/ux-narration-and-todos.md](references/shared/ux-narration-and-todos.md) |
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
## Critical rules (universal)
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
Write the connector step from the task's own words — the fields you intend, `lookup()` tokens for ids, `{ object: '<name-as-the-task-said-it>' }` for a generic operation — then run `uip maestro flow check .flow-sdk/<Name>.flow.ts --source`.
|
|
57
|
-
Check names every prepare you owe, with the exact command:
|
|
58
|
-
`OBJECT_UNPREPARED` for an unmaterialized object, `CUSTOM_FIELDS_UNPREPARED` for an input outside the tenant-agnostic snapshot, `LOOKUP_UNRESOLVED` for a lookup token with no recorded value, `CONNECTOR_INPUT` for a field the operation does not declare. Run that one `uip maestro registry prepare <connector-key> <action>` — `--object`, `--resolve` and `-f` compose in a single invocation, it finds the connection itself, writes `.flow-sdk/bindings.json`, and repoints your import at the generated `./connectors-local/<key>.ts` descriptor — then re-run `check` and compile.
|
|
59
|
-
Where two flows import the same connector it names them instead of guessing, and asks for `--source`.
|
|
55
|
+
> **Tool vocabulary.** `Edit` means in-place replacement, `Write` a full-file write, `Read`/`Glob`/`Grep` file access, `Bash` shell, and a progress list the harness task list. Map them to equivalent tools elsewhere; preserve reviewable diffs and use shell file edits only as a last resort.
|
|
60
56
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
`flow validate` can accept a missing cache, so completion requires non-null `customFieldsRequestDetails` whose parent values match the runtime inputs.
|
|
57
|
+
1. **Use `--output json`; prefer `--output-filter` for extraction.** Filters are global and run against the `Data` envelope, so expressions start at `Data` without a `Data.` prefix. Registry search returns a flat PascalCase array (`NodeType`, `DisplayName`, `Description`, `AvailableOnTenant`), not `Data.Nodes` or lowercase fields. Example: `uip maestro flow registry search <keyword> --output json --output-filter "[*].{NodeType:NodeType,DisplayName:DisplayName,Description:Description,AvailableOnTenant:AvailableOnTenant}"`. With `--local`, omit `AvailableOnTenant`. Use `python3 -c` or `jq` only after verifying shape and when JMESPath cannot express the transform. See [cli-conventions.md §3](references/shared/cli-conventions.md#3-prefer---output-filter-for-extraction).
|
|
58
|
+
2. **`flow debug` consent comes from the mandate.** It executes the flow for real (sends emails, posts messages, calls APIs), so run it only when the request is for a flow that *works* — asked to build something that does X, or to make it work. Building and validating does not discharge that; `flow validate` checks JSON schema and graph structure, not runtime behavior, so a validated-but-never-debugged flow is unverified rather than finished. Ask when the request stops at review, one node, or validate; with nobody to ask, report the flow as unverified instead of letting a passing validate stand as the result. Debug also overwrites the Studio Web solution matching the local `.uipx` `SolutionId`, so never debug a solution this run did not scaffold.
|
|
59
|
+
3. **Search before creating or declaring resources absent.** For named agents, API workflows, RPA processes, and similar resources: (a) pull and search the tenant registry with `uip maestro flow registry pull --force && uip maestro flow registry search "<name>" --output json`; pull first because the cache expires after 30 minutes, login is required, and only published resources are returned; (b) search locally with `uip maestro flow registry list --local --output json` or `search "<name>" --local` (no login; returns sibling projects in the same `.uipx` solution); an empty keyword search does not prove absence, so confirm with `list --local`; (c) scaffold, mock, or create only when both searches find no match and the user explicitly requests embedding/creation or no published resource satisfies the need.
|
|
65
60
|
|
|
66
|
-
|
|
61
|
+
"Coded" and "low-code" describe implementation style, not inline status. Use `uipath.agent.autonomous` only when explicitly asked to embed/inline/create an agent. Use `core.logic.mock` only when the resource is neither in the solution nor published. See [rpa](references/author/plugins/rpa/impl.md) and [agent](references/author/plugins/agent/impl.md).
|
|
67
62
|
|
|
68
|
-
|
|
69
|
-
import { flow, script, input, out, types } from '@uipath/maestro-builder-sdk';
|
|
70
|
-
export default flow('hello').name('Hello')
|
|
71
|
-
.input({ name: types.string }).output({ greeting: types.string })
|
|
72
|
-
.step('greet', script({ code: 'return `Hello ${$vars.start.output.name}`;' }))
|
|
73
|
-
.return({ greeting: out('greet') }).build();
|
|
74
|
-
```
|
|
63
|
+
Apply the same discipline to connectors: derive the connector key from a `registry search` node type (`uipath.connector.<connector-key>.<activity>`), never the brand name — the registry key is often prefixed or qualified differently, so a guessed key silently misses the real connector; discover connections with `uip is connections list "<connector-key>" --all-folders`. An unverified key or missing `--all-folders` makes an empty result a false negative.
|
|
75
64
|
|
|
76
|
-
|
|
77
|
-
The `start` step is the default name for a "manual trigger", which carries the flow's inputs.
|
|
78
|
-
A Flow can have outputs, which are returned to the caller when the flow completes successfully.
|
|
65
|
+
**It also applies to ANY external service named in the prompt — not just in-tenant resources.** Before picking a node type for a named service (Slack, open-meteo, Stripe, any REST API), run `uip maestro flow registry search "<service>" --output json` and follow the [Selecting External Service Nodes](references/author/planning-arch.md#selecting-external-service-nodes) ladder (connector → managed HTTP → RPA). Manual `core.action.http.v2` is the bottom of that ladder, chosen only after a search finds no connector — never a first guess from the brand name. This holds even when full planning is skipped (see [greenfield.md — Select the node type for each external service](references/author/greenfield.md#select-the-node-type-for-each-external-service-runs-even-when-full-planning-is-skipped)).
|
|
79
66
|
|
|
80
|
-
|
|
67
|
+
**Two tells that you skipped the search and took the brand-name shortcut — both are build defects, not valid manual-mode HTTP:** (a) you authored a manual-mode `core.action.http.v2` node whose `url` targets a well-known SaaS API domain that has a connector (`slack.com/api/*`, `api.github.com`, `*.salesforce.com`, `graph.microsoft.com`, …); (b) you declared an `in` variable to hold that service's API token or secret (e.g. a `slackToken` holding an `xoxb-…` bot token, an `apiKey`, a bearer token). A connector-backed flow never carries the raw credential — the IS connection does. If you find yourself writing either, **stop**: run `uip maestro flow registry search "<service>"` and `uip is connections list "<connector-key>" --all-folders`, then use the connector activity (or connector-mode HTTP: `authentication:"connector"` + `targetConnector` + a bound `connectionId`/`folderKey`). Manual mode is legitimate only for a service the search proves has no connector.
|
|
81
68
|
|
|
82
|
-
|
|
69
|
+
4. **Never invoke other skills automatically** — when a flow needs an RPA process, agent, or app, identify the gap and provide handoff instructions. Let the user decide when to switch skills. **One exception — IXP extraction with documents in hand:** when the flow needs document extraction, the user supplied sample documents, and `registry search "uipath.ixp"` shows no extractor covering them, invoke the `uipath-ixp` skill to build and deploy the model, then resume the flow ([plugins/ixp/impl.md — If the Model Does Not Exist Yet](references/author/plugins/ixp/impl.md#if-the-model-does-not-exist-yet)). Resolve the target Orchestrator folder for the deployment before invoking — from the user's request when it names one, otherwise per rule #5 (its non-interactive fallback applies) — and pass it in the handoff; the sibling stops rather than guess a folder. There is deliberately no separate consent gate on the tenant writes this creates: the project and folder deployment fulfil the extraction request itself, and the one consequential choice — where the deployment lands (deployments have no delete API) — is exactly the folder decision rule #5 just routed. Do NOT drive `uip ixp` project or deployment commands from this skill instead of invoking it — the sibling's guides carry guardrails this skill does not. If `uipath-ixp` is unavailable in the session, fall back to `core.logic.mock` plus an Open Questions entry, exactly as when no documents were supplied. **Second exception — non-catalog connector activity (Tier 2):** when `registry search` (after a `registry pull --force` re-check) confirms the connector exists but carries no curated activity for the operation, and `uip is connectors metadata <connector-key>` reports `Flags.V4Compatible: true`, invoke the `uipath-platform` skill's activity generation ([activity-generation.md](../uipath-platform/references/integration-service/activity-generation.md)) to produce the activity metadata JSON and scripts, then resume the flow and author the node per [connector/impl-inline.md](references/author/plugins/connector/impl-inline.md). Do NOT fall through to Managed HTTP (`core.action.http.v2`) on a V4-compatible connector just to avoid the handoff — the ladder in [connector/planning.md — Decision Order](references/author/plugins/connector/planning.md#decision-order) ranks the generated activity above it, and Managed HTTP connector mode is correct only when the connector is not V4-compatible. Do NOT drive `uip is activities metadata generate` / `script update` from this skill's own instructions instead of invoking the sibling — its guide carries the vendor-docs grounding and script-validation guardrails this skill does not. If `uipath-platform` is unavailable in the session, fall back to Managed HTTP connector mode ([http/impl-connector.md](references/author/plugins/http/impl-connector.md)) and record in the final report that the preferred Tier 2 activity was not generated.
|
|
70
|
+
5. **Always present finite decisions as a dropdown with a final "Something else" escape hatch.** Whenever the skill needs a decision (which solution, publish vs debug vs deploy, which connector, trigger type, or resource to bind, etc.), ask with the enumerated choices plus **"Something else"** last for free-form input; never ask open-ended in chat when a finite set of sensible defaults exists. If the user picks "Something else", parse their answer and continue. No structured-question facility on the harness → ask in chat as a numbered list with "Something else" last. Non-interactively (CI/headless, no user available) → take the marked recommended option, proceed, and record the decision prominently in the final report; if none is recommended, stop and report the open decision instead of guessing. Consent gates (destructive operations, tenant writes) are never auto-answered — in non-interactive mode, stop and report the blocked step; `flow debug` is not one of them, and is governed by the mandate rule above. These fallbacks define "ask the user" / "confirm with the user" wherever this skill's references require it.
|
|
71
|
+
6. **Discover the target solution before scaffolding.** A Flow project must use double nesting: `<Solution>/<Project>/<Project>.flow`. Before any new `uip solution init` or `uip maestro flow init`, run `find . -maxdepth 2 -type f -name '*.uipx' -print`. If a solution exists, stop and ask which to use: one option per solution, "Create a new solution", then "Something else". Do not silently adopt, initialize, delete, or repair an existing solution, even if a new one was requested. If creating one, ask for its name rather than defaulting to the Flow name.
|
|
83
72
|
|
|
84
|
-
|
|
73
|
+
If none exists, create one automatically, defaulting its name to the Flow name unless specified. Prefer solution-first: `uip solution init "<SolutionName>" --output json && cd "<SolutionName>" && uip maestro flow init "<FlowName>" --output json`, producing `<SolutionName>/<FlowName>/<FlowName>.flow` and registering it in the parent `.uipx` (`Data.SolutionRegistration.Status: "Registered"`). Names are independent. A current CLI may auto-scaffold outside a solution as `<FlowName>Solution/<FlowName>Solution.uipx` with `Data.AutoCreatedSolution`; use that only when the solution name does not matter. `--skip-solution-registration` creates a bare single-nested project that fails Studio Web upload and packaging. If the target directory is non-empty, init leaves it untouched. Never omit `cd`, or it auto-scaffolds a duplicate solution. Finish with one `project.uiproj`; remove strays. See [author/greenfield.md](references/author/greenfield.md) Step 2.
|
|
85
74
|
|
|
86
|
-
|
|
75
|
+
**Maestro Automate is `--automate` on the same command.** When the request names **Maestro Automate** as the product, pass `uip maestro flow init "<Name>" --automate --output json`; otherwise omit the flag. The bare verb is not the signal — "automate invoice intake" asks for a Flow. `--output json` stays either way — Step 2c reads `Data.SolutionRegistration` from it. Do not ask which — the words decide. Everything downstream is identical: same `.flow`, same authoring, same `pack` / `publish` / `debug` / `eval`. The flag only writes `runtimeOptions.profile` into the packaged `operate.json` and drops a `.maestro_automate` marker in the project root, which is how Orchestrator and Studio Web tell the two apart.
|
|
76
|
+
7. **Narrate progress only when requested or clearly opted into.** Otherwise work silently and surface decisions, failures, consent gates, and the final result. When engaged, use one short plain-English line per logical step across CLI calls, shell builtins, edits, and searches; do not narrate flags or JSON structure. See [shared/ux-narration-and-todos.md](references/shared/ux-narration-and-todos.md) §When to engage.
|
|
77
|
+
8. **Maintain a user-facing progress list only when tracking or verbosity is requested.** In silent mode there is no user-facing todo list (the agent MAY track privately). When engaged, journeys above trivial complexity get granular step-level todos; counts follow actual work, not a target. Hide registry lookups, parsing, and file reads inside their logical step. See [shared/ux-narration-and-todos.md](references/shared/ux-narration-and-todos.md) for triggers, granularity, thresholds, and pivots.
|
|
78
|
+
9. **Each node has exactly one author: Edit/Write or CLI, never both.** CLI-owned nodes are connector activities (`uipath.connector.<key>.<op>`), connector triggers (`uipath.connector.trigger.<key>.<trigger>`), wait-for-events (`uipath.connector.event.<key>.<event>`, configured like triggers), and managed HTTP (`core.action.http.v2`); add/configure them with `uip maestro flow node add` and `node configure`. All others—triggers, control flow, logic, HITL, patterns, agents, resource nodes, and queues—are user-owned and should be authored directly with `Edit` or `Write`. A full-file `Write` is safe before `node configure` and unsafe after: carry forward verbatim every key `node add` touched for each CLI-owned node — the node object, its `definitions[]` entry, its `bindings[]` rows, its `layout.nodes` entry, and its `variables.nodes` bindings — and make `node configure` the last write to touch `inputs.detail` / `bindings[]`, run after authoring rather than between discovery and authoring. `flow format` after it is still required and safe: it does not touch `inputs.detail` / `bindings[]`, it owns `layout`, and it regenerates `variables.nodes[]` (rule 14 in [author/CAPABILITY.md](references/author/CAPABILITY.md#critical-rules)). So a dropped `variables.nodes` self-heals at T3's trailing `format` — carry it forward anyway to keep the file valid before then, because `node configure` does not regenerate it. A `Write` after `configure` clobbers `inputs.detail` and the resolved `bindings[]` — `Edit` in place there, or re-run `configure`. Their `inputs.detail` is a `=jsonString:essentialConfiguration` envelope rejected when hand-authored. Inline-agent CLI is limited to `uip agent init / refresh / validate --inline-in-flow`; the `uipath.agent.autonomous` node is user-owned. Scripting (`python`, `node`, `jq`, `sed`, `awk`, or shell heredocs) is a last resort for user-owned edits and requires explicit approval after explaining state bypass, opaque diffs, and lack of interruption points. See [author/CAPABILITY.md — Node ownership](references/author/CAPABILITY.md#node-ownership--who-authors-the-node) and [author/editing-operations.md — Tool Selection Ladder](references/author/editing-operations.md#tool-selection-ladder).
|
|
79
|
+
10. **Batch independent tool calls and chain dependent CLI calls.** A typical greenfield build is three turns: T1 scaffold, pull the registry, and add CLI-owned nodes in one chained `Bash`, alongside independent registry/file reads; T2 read the scaffold while editing/adding the End node and edges; T3 chain configure, validate, and format. Split only when later work depends on stdout or a mutation. A user-requested snapshot or checkpoint is exactly such a boundary: capture it immediately after the named mutation and before optional `validate`, `format`, or later mutations, even when the commands share one Bash call, and never let a later command failure skip writing it. See [author/greenfield.md — Three-turn execution map](references/author/greenfield.md#three-turn-execution-map).
|
|
80
|
+
11. **Cross-node bindings in `=js:` require `$vars.`** Use `=js:$vars.<nodeId>.output...`; bare `=js:<nodeId>.output...` resolves to `undefined`. See [variables-and-expressions.md — IS Activity Inputs Require `=js:`](references/shared/variables-and-expressions.md#is-activity-inputs-require-js-critical).
|
|
81
|
+
12. **Node and edge IDs must begin with a letter.** Use descriptive camelCase node IDs and `edge_<sourceNodeId>_<sourcePort>_<targetNodeId>_<targetPort>` edge IDs. Reserve UUIDs for the top-level flow `id` and `entryPointId`.
|
|
87
82
|
|
|
88
|
-
|
|
89
|
-
These are before/after judgments; no final-artifact checker can prove them.
|
|
83
|
+
## Anti-patterns (universal)
|
|
90
84
|
|
|
91
|
-
|
|
85
|
+
- Never use `--format json`; use `--output json`.
|
|
86
|
+
- Do not pipe JSON to `python3 -c` or `jq` for simple extraction; use `--output-filter`, verify shape first, and use external parsers only for unsupported transforms. A valid but wrong filter can return `Data: []`; `keys(@)` fails on arrays, so probe with `type(@)` first. See [cli-conventions.md §3](references/shared/cli-conventions.md#3-prefer---output-filter-for-extraction).
|
|
87
|
+
- Never substitute `flow debug` for `flow validate` as the structural check, and never re-run a completed debug to reshape its output, because debug has real side effects and re-uploads the solution on every run. This does not excuse skipping the one mandated run in rule #2. Extract report fields from the payload the completed run already returned; when that run faulted, read the cause from `Data.incidents[].dependentFaultCode` and `Data.variables.elements[].outputs.Error.detail` — see [diagnose/troubleshooting-guide.md — Step 0](references/diagnose/troubleshooting-guide.md#step-0--read-the-cause-in-the-debug-output-you-already-have).
|
|
88
|
+
- Never run `flow debug` in the background or under a short tool timeout. It takes 1 to 5 minutes and prints only at exit, so a backgrounded run reads as "no result". Run it in the foreground with a tool timeout of at least 10 minutes and wait — see [operate/run.md — Debug](references/operate/run.md#debug--controlled-end-to-end-run).
|
|
89
|
+
- Never silently choose the first registry match. Use the Connector Disambiguation ladder in [connector/planning.md — Disambiguation](references/author/plugins/connector/planning.md#disambiguation--when-search-returns-multiple-connectors-for-the-same-intent), deferring to Integration Service rules.
|
|
90
|
+
- Never conclude that no connection exists from bare `uip is connections list`; use a registry-derived connector key and `--all-folders`.
|
|
91
|
+
- Never represent `customFieldsRequestDetails.parameterValues` as an object map. Studio Web emits `Map<string,string|null>` as `[[key, value], ...]`; inner keys are camelCase (`objectActionName`, `parameterValues`). See [connector/impl.md Step 6c](references/author/plugins/connector/impl.md).
|
|
92
|
+
- Never treat validation exit code 0 as completion when warnings remain. Resolve every warning. A connector-keyword warning about generic `core.action.http.v2` without a connection binding means a brand-name shortcut was used; bind the connector before shipping or debugging.
|
|
93
|
+
- Never issue setup or finalization CLI calls one per turn; chain them per rule 10 and the [Three-turn execution map](references/author/greenfield.md#three-turn-execution-map).
|
|
94
|
+
- Never write a reference field you could not resolve. If `uip is resources run list` fails (403/401 on an expired grant, 5xx), you have no ID: do not substitute the display name, a well-known alias, or a remembered ID — stop and report the failed resolve. See [reference-resolution.md — When the Lookup Call Fails](../uipath-platform/references/integration-service/reference-resolution.md#when-the-lookup-call-fails-critical).
|
|
92
95
|
|
|
93
|
-
|
|
94
|
-
uip maestro flow decompile <Name>.flow -o .flow-sdk/<Name>.flow.ts
|
|
95
|
-
node .flow-sdk/<Name>.pipeline.mjs # captures the pristine baseline
|
|
96
|
-
# edit .flow-sdk/<Name>.flow.ts narrowly
|
|
97
|
-
node .flow-sdk/<Name>.pipeline.mjs # compiles the edit and merges it back
|
|
98
|
-
uip maestro flow validate .flow-sdk/<Name>.merged.flow --output json
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Validate the merged artifact, never the intermediate edited compile.
|
|
102
|
-
If the source must stay inside the Flow project (for example, to preserve relative sidecars), keep baseline, edited, and candidate `.flow` files in an external `.flow-work/` directory. Validate the candidate, replace the canonical artifact, and leave exactly one `.flow` under the project. The reference below contains the copyable safe-project sequence.
|
|
103
|
-
|
|
104
|
-
**True-brownfield procedure:**
|
|
105
|
-
**[`references/brownfield.md`](references/brownfield.md)**.
|
|
106
|
-
|
|
107
|
-
## Builder frame
|
|
108
|
-
|
|
109
|
-
The quick start above shows the shape — `flow(id)`, declarations, nodes, `.return(...)`, `.build()`. Three things it does not show:
|
|
110
|
-
|
|
111
|
-
- **`.var(name, types.*, default?)`** declares a flow VARIABLE: a value more than one step writes or reads. `.input` and `.output` are the flow's contract with its caller; a var is the state in between. A step writes one with `{ updates: { name: <expr> } }`. Inputs, outputs and vars use one of the six types the Flow CLI and Workbench offer: `types.string`, `types.number`, `types.boolean`, `types.object`, `types.array`, `types.file`. The other `types` members (`integer`, `float`, `double`, `date`, `datetime`, `jsonSchema`) come from the Case and BPMN builders; the Flow builder and `validate` accept them without an error, but Workbench does not offer them, so write a date as `types.string` and an integer as `types.number`.
|
|
112
|
-
- **`.return(...)` ends a PATH. `.terminate(...)` ends the RUN.** They look interchangeable on a straight chain and are not: inside a `.parallel` arm a terminate aborts the sibling arms mid-flight, where a return leaves them going.
|
|
113
|
-
- **Expressions are how a step names something that is not a literal.** There is one per kind of thing you can refer to:
|
|
114
|
-
|
|
115
|
-
| | refers to |
|
|
116
|
-
| --- | --- |
|
|
117
|
-
| `input(name)` | a flow input |
|
|
118
|
-
| `v(name)` | a flow variable |
|
|
119
|
-
| `out(step, path?)` | a step's result, whole or one field |
|
|
120
|
-
| `err(step, field?)` | a FAILED step's error envelope — only inside its handler |
|
|
121
|
-
| `ran(step)` | whether a step ran at all, as a boolean |
|
|
122
|
-
| `lit(value)` | a constant, where a raw value would be ambiguous |
|
|
123
|
-
| ``js`…` `` / ``tmpl`…` `` | an expression, or a string, you write yourself |
|
|
124
|
-
|
|
125
|
-
`ran(step)` earns an early mention: when arms converge, one shared continuation usually reads better than the same work duplicated per arm, and `ran` is how that continuation asks whether the value it wants was produced.
|
|
126
|
-
|
|
127
|
-
## API index
|
|
128
|
-
|
|
129
|
-
**Every signature, option shape and field is indexed in the installed package**, not in this guide. Two files, keyed by the kind of name you have:
|
|
130
|
-
|
|
131
|
-
| you have | look in | a row gives you |
|
|
132
|
-
| --- | --- | --- |
|
|
133
|
-
| a field or method — `outcomePorts`, `stepToList` | `dist/api-members.md` | the shape that declares it, and the lines that do |
|
|
134
|
-
| an exported symbol — `HitlInputs`, `hitl`, `FlowBuilder` | `dist/api-index.md` | its kind, area, and the lines that declare it |
|
|
135
|
-
|
|
136
|
-
Both ship in the installed `@uipath/maestro-builder-sdk` package, and a row's path is relative to that package's root:
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
| `outcomePorts` | property | `HitlInputs` | `dist/core/actions.d.ts:583-597` |
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Each file's own header names the repo and generator it came from, and says not to edit it there — the rows are regenerated from the declarations on every build.
|
|
143
|
-
|
|
144
|
-
**Match one name; do not read either file end to end.** Then read the span — it is the whole declaration including its doc comment, so one read answers the question, with the types and the `@remarks` and `@example` bodies in full. No searching and no shell, so it works the same on Windows.
|
|
145
|
-
|
|
146
|
-
A field or method name is the usual case, because these references are one line per field — so `api-members.md` is usually the one you want. Both cover all three entry points, `/case` and `/bpmn` included.
|
|
147
|
-
|
|
148
|
-
They live in the package rather than here **because the spans are only true of one build**: a line moves whenever a declaration above it changes, and this guide ships on its own cadence. An index beside the `.d.ts` files it points into cannot disagree with them.
|
|
149
|
-
|
|
150
|
-
Read the `.d.ts`, never `dist/*.js`: the compiled JavaScript carries no types and no comments, so searching it is how a lookup turns into twenty tool calls. A name in neither index is probably a RUNTIME output key — a human task's `Action`, an error envelope's fields — which no declaration carries; those are in the node references. The sibling surfaces' runtime-only decisions live in their own skills: `uipath-maestro-case` and `uipath-maestro-bpmn`; neither is needed to build a Flow.
|
|
151
|
-
|
|
152
|
-
## Supported node types
|
|
153
|
-
|
|
154
|
-
The table is the authoritative router. `Section` identifies the governed H2; `Reference` carries the details; `Example` names the one file to read. Paths under `examples/` resolve inside this skill folder.
|
|
155
|
-
|
|
156
|
-
| Node or surface | Emitted node type | Builder | Section | Reference | Example |
|
|
157
|
-
|---|---|---|---|---|---|
|
|
158
|
-
| Manual trigger | `core.trigger.manual` | omit `.trigger(...)` | [Manual trigger](#manual-trigger) | [manual-trigger.md](references/manual-trigger.md) | `examples/GreenhouseWatering.flow.ts` |
|
|
159
|
-
| Scheduled trigger | `core.trigger.scheduled` | `scheduled(...)` | [Scheduled trigger](#scheduled-trigger) | [scheduled-trigger.md](references/scheduled-trigger.md) | `examples/HerbariumDispatch.flow.ts` |
|
|
160
|
-
| Connector event trigger | `uipath.connector.trigger.<key>.<event>` | `onEvent(...)` | [Connector events](#connector-events) | [event-trigger.md](references/event-trigger.md) | `examples/DoorbellLog.flow.ts` |
|
|
161
|
-
| Connector event wait | `uipath.connector.event.<key>.<event>` | `waitForEvent(...)` | [Connector events](#connector-events) | [event-trigger.md](references/event-trigger.md) | `examples/PlanetariumConfirmation.flow.ts` |
|
|
162
|
-
| Form trigger | `core.trigger.form` | `formTrigger(...)` | [Form trigger](#form-trigger) | [form-trigger.md](references/form-trigger.md) | `examples/BakeOffEntryForm.flow.ts` |
|
|
163
|
-
| Conversation trigger | `core.trigger.conversation` | `conversationTrigger(...)` | [Conversational](#conversational) | [conversational.md](references/conversational.md) | `examples/LibraryDeskChat.flow.ts` |
|
|
164
|
-
| Voice trigger | `core.trigger.voice` | `voiceTrigger(...)` | [Voice](#voice) | [voice.md](references/voice.md) | `examples/HarbourRadioLine.flow.ts` |
|
|
165
|
-
| Standalone HTTP | `core.action.http` | `http({ managed: false, ... })` | [HTTP](#http) | [http.md](references/http.md) | `examples/LighthouseSignal.flow.ts` |
|
|
166
|
-
| Managed HTTP | `core.action.http.v2` | `http({ managed: true, ... })` | [HTTP](#http) | [http.md](references/http.md) | `examples/ObservatorySeeing.flow.ts` |
|
|
167
|
-
| Script | `core.action.script` | `script(...)` | [Script](#script) | [script.md](references/script.md) | `examples/GreenhouseWatering.flow.ts` |
|
|
168
|
-
| Transform | `core.action.transform` | `transform(...)` | [Transform](#transform) | [transform.md](references/transform.md) | `examples/TrailLogSummary.flow.ts` |
|
|
169
|
-
| Filter | `core.action.transform.filter` | `transform({ variant: 'filter', ... })` | [Transform](#transform) | [transform.md](references/transform.md) | `examples/TrailLogSummary.flow.ts` |
|
|
170
|
-
| Map | `core.action.transform.map` | `transform({ variant: 'map', ... })` | [Transform](#transform) | [transform.md](references/transform.md) | `examples/TrailLogSummary.flow.ts` |
|
|
171
|
-
| Group by | `core.action.transform.group-by` | `transform({ variant: 'group-by', ... })` | [Transform](#transform) | [transform.md](references/transform.md) | `examples/TrailLogSummary.flow.ts` |
|
|
172
|
-
| Integration Service action | `uipath.connector.<key>.<action>` (Data Fabric / Data Service — the ops the native family lacks: file record fields, events: `uipath.connector.uipath-uipath-dataservice.*`) | `connector(...)` | [Integration Service connectors](#integration-service-connectors) | [connector-params.md](references/connector-params.md) | `examples/ClubDirectory.flow.ts` |
|
|
173
|
-
| Data Fabric read | `core.datafabric.read` (`resultMode: 'multiple'` selects its 1.4 definition; `limit` caps at 1000) | `dataFabricRead(...)` | [Data Fabric](#data-fabric) | [data-fabric.md](references/data-fabric.md) | `examples/BeeHiveLedger.flow.ts` |
|
|
174
|
-
| Data Fabric create | `core.datafabric.create` | `dataFabricCreate(...)` | [Data Fabric](#data-fabric) | [data-fabric.md](references/data-fabric.md) | `examples/BeeHiveLedger.flow.ts` |
|
|
175
|
-
| Data Fabric update | `core.datafabric.update` | `dataFabricUpdate(...)` | [Data Fabric](#data-fabric) | [data-fabric.md](references/data-fabric.md) | `examples/BeeHiveLedger.flow.ts` |
|
|
176
|
-
| Data Fabric delete | `core.datafabric.delete` (declares NO outputs) | `dataFabricDelete(...)` | [Data Fabric](#data-fabric) | [data-fabric.md](references/data-fabric.md) | `examples/BeeHiveLedger.flow.ts` |
|
|
177
|
-
| Subflow | `core.subflow` | `subflow(...)` | [Subflow](#subflow) | [subflow.md](references/subflow.md) | `examples/RecipeScaler.flow.ts` |
|
|
178
|
-
| Human task | `uipath.human-in-the-loop` | `hitl(...)` | [Human task](#human-task) | [hitl.md](references/hitl.md) | `examples/GallerySubmission.flow.ts` |
|
|
179
|
-
| Human quick form | `uipath.human-in-the-loop.quick-form` (one exit per outcome: `.stepSwitch` routes them, a plain `.step()` continues every outcome) | `hitl({ variant: 'quick-form', ... })` | [Human task](#human-task) | [hitl.md](references/hitl.md) | `examples/FieldTripQuickForm.flow.ts` |
|
|
180
|
-
| Human action app | `uipath.human-in-the-loop.coded-action-app` | `hitl({ variant: 'action-app', ... })` | [Human task](#human-task) | [hitl.md](references/hitl.md) | `examples/KilnReview.flow.ts` |
|
|
181
|
-
| RPA workflow | `uipath.core.rpa-workflow.<key>` | `rpaWorkflow(...)` | [RPA workflow](#rpa-workflow) | [rpa-workflow.md](references/rpa-workflow.md) | `examples/WorkshopInventory.flow.ts` |
|
|
182
|
-
| Queue item | `core.action.queue.create*` | `queueItem(...)` | [Queue item](#queue-item) | [queue.md](references/queue.md) | `examples/HerbariumDispatch.flow.ts` |
|
|
183
|
-
| Summarize | `uipath.pattern.deep-rag` | `summarize(...)` | [AI patterns](#ai-patterns) | [summarize.md](references/summarize.md) | `examples/OralHistoryDigest.flow.ts` |
|
|
184
|
-
| Batch transform | `uipath.pattern.batch-transform` | `batchTransform(...)` | [AI patterns](#ai-patterns) | [batch-transform.md](references/batch-transform.md) | `examples/FossilCatalogEnrich.flow.ts` |
|
|
185
|
-
| Branch | `core.logic.decision` | `.branch(...)` | [Branch](#branch) | [branch.md](references/branch.md) | `examples/GreenhouseWatering.flow.ts` |
|
|
186
|
-
| Switch | `core.logic.switch` | `.switch(...)` | [Switch](#switch) | [switch.md](references/switch.md) | `examples/BeltProgression.flow.ts` |
|
|
187
|
-
| Parallel / Merge | `core.logic.merge` | `.parallel(...)` | [Parallel branches](#parallel-branches) | [parallel-merge.md](references/parallel-merge.md) | `examples/ConcertSoundcheck.flow.ts` |
|
|
188
|
-
| Loop | `core.logic.loop` | `.loop(...)` | [Loops](#loops) | [loops.md](references/loops.md) | `examples/ClubDirectory.flow.ts` |
|
|
189
|
-
| Do while | `core.logic.dowhile` | `.doWhile(...)` | [Do while](#do-while) | [loops.md](references/loops.md) | `examples/MeteorShowerPages.flow.ts` |
|
|
190
|
-
| Return / End | `core.control.end` | `.return(...)` | [Return and end](#return-and-end) | [return.md](references/return.md) | `examples/GreenhouseWatering.flow.ts` |
|
|
191
|
-
| Terminate | `core.logic.terminate` | `.terminate(...)` | [Terminate](#terminate) | [terminate.md](references/terminate.md) | `examples/AquariumSafetyStop.flow.ts` |
|
|
192
|
-
| Placeholder | `core.logic.mock` | `mock()` | [Placeholder](#placeholder) | [placeholder.md](references/placeholder.md) | `examples/FestivalMapScaffold.flow.ts` |
|
|
193
|
-
| Error handler | `error` handle on an action node | `.onError(...)` | [Error handling](#error-handling) | [error-handling.md](references/error-handling.md) | `examples/ObservatorySeeing.flow.ts` |
|
|
194
|
-
| Delay | `core.logic.delay` | `delay(...)` | [Delay](#delay) | [delay.md](references/delay.md) | `examples/LighthouseSignal.flow.ts` |
|
|
195
|
-
| API workflow | `uipath.core.api-workflow.<key>` | `apiWorkflow(...)` | [API workflow](#api-workflow) | [api-workflow.md](references/api-workflow.md) | `examples/BirdCountLookup.flow.ts` |
|
|
196
|
-
| Agentic process | `uipath.core.agentic-process.<key>` | `agenticProcess(...)` | [Agentic process](#agentic-process) | [agentic-process.md](references/agentic-process.md) | `examples/NeighborhoodWalkPlanner.flow.ts` |
|
|
197
|
-
| Agent resource | `uipath.core.agent.<key>` | `agent(...)` | [Agent resource](#agent-resource) | [agent.md](references/agent.md) | `examples/PlantNameAdvisor.flow.ts` |
|
|
198
|
-
| Inline agent | `uipath.agent.autonomous` | `inlineAgent(...)` | [Inline agent](#inline-agent) | [inline-agent.md](references/inline-agent.md) | `examples/PostcardCaption.flow.ts` |
|
|
199
|
-
| IxP extraction | `uipath.ixp.<project>.<version>-<folder>` | `ixpExtract(...)` | [Document extraction](#document-extraction) | [ixp.md](references/ixp.md) | `examples/ArchiveCardExtract.flow.ts` |
|
|
200
|
-
| Document classify | `uipath.document.classify` | `documentClassify(...)` | [Document classify and Dynamic Extract](#document-classify-and-dynamic-extract) | [document-pipeline.md](references/document-pipeline.md) | `examples/SeedPacketReader.flow.ts` |
|
|
201
|
-
| Dynamic extract | `uipath.ixp.extract-document-builder` | `dynamicExtract(...)` | [Document classify and Dynamic Extract](#document-classify-and-dynamic-extract) | [document-pipeline.md](references/document-pipeline.md) | `examples/SeedPacketReader.flow.ts` |
|
|
202
|
-
| Published function | `uipath.core.function.<key>` | `publishedFunction(...)` | [Published function](#published-function) | [published-function.md](references/published-function.md) | `examples/TideTableConverter.flow.ts` |
|
|
203
|
-
| Conversation message wait | `uipath.conversational.wait-for-message` | `waitForMessage(...)` | [Conversational](#conversational) | [conversational.md](references/conversational.md) | `examples/LibraryDeskChat.flow.ts` |
|
|
204
|
-
| Conversational agent | `uipath.agent.conversational` | `conversationalAgent(...)` | [Conversational](#conversational) | [conversational.md](references/conversational.md) | `examples/LibraryDeskChat.flow.ts` |
|
|
205
|
-
| Conversation send message | `uipath.conversational.send-message` | `sendMessage(...)` | [Conversational](#conversational) | [conversational.md](references/conversational.md) | `examples/LibraryDeskChat.flow.ts` |
|
|
206
|
-
| Voice outgoing call | `uipath.conversational.voice.create-outgoing-call` | `createOutgoingCall(...)` | [Voice](#voice) | [voice.md](references/voice.md) | `examples/PotteryStudioCallback.flow.ts` |
|
|
207
|
-
| Voice agent | `uipath.agent.voice` | `voiceAgent(...)` | [Voice](#voice) | [voice.md](references/voice.md) | `examples/PotteryStudioCallback.flow.ts` |
|
|
208
|
-
| Voice end call | `uipath.conversational.voice.end-call` | `endCall(...)` | [Voice](#voice) | [voice.md](references/voice.md) | `examples/PotteryStudioCallback.flow.ts` |
|
|
209
|
-
|
|
210
|
-
## Manual trigger
|
|
211
|
-
|
|
212
|
-
The default start node accepts on-demand caller input; omit `.trigger(...)`.
|
|
213
|
-
|
|
214
|
-
Signature: `flow(id).input({...}).step(...).build()`.
|
|
215
|
-
|
|
216
|
-
```ts
|
|
217
|
-
export default flow('lookup').input({ id: types.string }).output({ value: types.string })
|
|
218
|
-
.step('read', script({ code: 'return $vars.start.output.id;' }))
|
|
219
|
-
.return({ value: out('read') }).build();
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
Choose it when a caller, test, or another process should start each run.
|
|
223
|
-
|
|
224
|
-
**Reference: [`references/manual-trigger.md`](references/manual-trigger.md)**
|
|
225
|
-
|
|
226
|
-
## Scheduled trigger
|
|
227
|
-
|
|
228
|
-
A platform timer starts the flow on a recurring interval.
|
|
229
|
-
|
|
230
|
-
Signature: `.trigger(scheduled({ every: string }))`. `every` takes an ISO-8601
|
|
231
|
-
repeating interval, or a Quartz cron expression (e.g. `'0 0 2 * * ?'`), which
|
|
232
|
-
selects the trigger's 1.2 definition automatically.
|
|
233
|
-
|
|
234
|
-
```ts
|
|
235
|
-
export default flow('nightly')
|
|
236
|
-
.trigger(scheduled({ every: 'R/P1D' }))
|
|
237
|
-
.step('rollup', script({ code: 'return { ok: true };' }))
|
|
238
|
-
.build();
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
Prefer self-contained variables because there may be no caller supplying inputs.
|
|
242
|
-
|
|
243
|
-
**Reference: [`references/scheduled-trigger.md`](references/scheduled-trigger.md)**
|
|
244
|
-
|
|
245
|
-
## Form trigger
|
|
246
|
-
|
|
247
|
-
A person starts the flow by submitting a form (`core.trigger.form`); the
|
|
248
|
-
submitted values ARE the flow's inputs.
|
|
249
|
-
|
|
250
|
-
Signature: `.trigger(formTrigger())` — no arguments; the form's fields are
|
|
251
|
-
derived from `.input()` (one per input, required unless it has a default).
|
|
252
|
-
|
|
253
|
-
```ts
|
|
254
|
-
export default flow('expense')
|
|
255
|
-
.input({ amount: types.number, reason: types.string })
|
|
256
|
-
.trigger(formTrigger())
|
|
257
|
-
.step('log', script({ code: 'return $vars.start.output.amount;' }))
|
|
258
|
-
.build();
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
Locally `--input` supplies the values; no rung renders a form.
|
|
262
|
-
|
|
263
|
-
**Reference: [`references/form-trigger.md`](references/form-trigger.md)**
|
|
264
|
-
|
|
265
|
-
## Entry points (multiple triggers)
|
|
266
|
-
|
|
267
|
-
A flow may have more than one root. `.trigger()` / `.input()` stay the DEFAULT
|
|
268
|
-
root; `.entryPoint(id, trigger, { inputs?, version? }, prefixFn?)` adds another
|
|
269
|
-
— its own trigger node, its own scoped inputs (read them with
|
|
270
|
-
`entryInput('<id>', '<name>')`), and an optional prefix that runs before the
|
|
271
|
-
root joins the first shared step. A prefix that ends terminally (or hands off
|
|
272
|
-
with `.stepToRef(...)`) joins nothing.
|
|
273
|
-
|
|
274
|
-
```ts
|
|
275
|
-
flow('order-intake')
|
|
276
|
-
.input({ order: types.object }) // default (manual) root
|
|
277
|
-
.entryPoint('nightly', scheduled({ every: 'R/P1D' }), {
|
|
278
|
-
inputs: { batchDate: types.string },
|
|
279
|
-
}, (b) => b.step('loadBatch', script({
|
|
280
|
-
code: 'return { note: $vars.nightly.output.batchDate };', returns: 'object' })))
|
|
281
|
-
.step('normalize', script({ code: 'return 1;' })) // shared body
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
## Connector events
|
|
285
|
-
|
|
286
|
-
Start on, or pause for, an Integration Service event subscription.
|
|
287
|
-
|
|
288
|
-
Signatures: `.trigger(onEvent(subscription))`; `.step(name, waitForEvent(subscription))`.
|
|
289
|
-
|
|
290
|
-
```ts
|
|
291
|
-
const mail = { connector: 'uipath-microsoft-outlook365',
|
|
292
|
-
event: 'email-received', where: { parentFolderId: inboxId },
|
|
293
|
-
connection: 'outlook', folder: 'shared' }; // bindings.json labels, both required
|
|
294
|
-
export default flow('mail').trigger(onEvent(mail))
|
|
295
|
-
.step('reply', script({ code: 'return $vars.start.output.subject;' })).build();
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
An id-valued `where` parameter is a `lookup()` token: `registry prepare <key> <event>` resolves it, writes bindings, and stores the vocabulary `check` validates `where`/`filters` against (a wrong-case filter field is an error — the platform drops it silently).
|
|
299
|
-
A generic event (`record-created`/`record-updated`) needs `object: '<Entity>'` — never put it in `where`.
|
|
300
|
-
Use the reference's completion contract before debugging: an injected start payload exercises downstream wiring but is not a subscription witness.
|
|
301
|
-
|
|
302
|
-
**Reference: [`references/event-trigger.md`](references/event-trigger.md)**
|
|
303
|
-
|
|
304
|
-
## HTTP
|
|
305
|
-
|
|
306
|
-
Standalone HTTP keeps non-2xx responses on its success output. Managed HTTP routes
|
|
307
|
-
them through its error port. Both expose JSON response bodies as parsed values.
|
|
308
|
-
|
|
309
|
-
Signature: `http({ method?, url, managed, connection?, folder?, targetConnector?, headers?, query?, body?, contentType?, timeout?, retryCount?, returns?, branches? })`.
|
|
310
|
-
|
|
311
|
-
```ts
|
|
312
|
-
.step('getPolicy', http({ method: 'GET', url: policyUrl,
|
|
313
|
-
managed: true, returns: { limit: 'number' },
|
|
314
|
-
branches: [{ name: 'throttled', condition: js`$vars.getPolicy.output.statusCode === 429` }] }))
|
|
315
|
-
.stepToList('branch-throttled', (b) => b.return({}))
|
|
316
|
-
.step('limit', script({ code: 'return $vars.getPolicy.output.body.limit;' }))
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
Match `managed` to the scenario's node; connector auth needs both `connection` and `folder` from `.flow-sdk/bindings.json`.
|
|
320
|
-
A `branch-<name>` side exit uses `.stepToList`; omit both bindings for manual/implicit mode.
|
|
321
|
-
|
|
322
|
-
**Reference: [`references/http.md`](references/http.md)**
|
|
323
|
-
|
|
324
|
-
## Script
|
|
325
|
-
|
|
326
|
-
Run inline JavaScript for computation that is not a first-class Flow node.
|
|
327
|
-
|
|
328
|
-
Signature: `script({ code: string })`; read the result with `out(step, path?)`.
|
|
329
|
-
|
|
330
|
-
```ts
|
|
331
|
-
.step('normalize', script({ code: `
|
|
332
|
-
const amount = Number($vars.amount);
|
|
333
|
-
return { amount, valid: Number.isFinite(amount) };
|
|
334
|
-
` }))
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
Use a first-class action when the scenario names one; use script for computation.
|
|
338
|
-
|
|
339
|
-
**Reference: [`references/script.md`](references/script.md)**
|
|
340
|
-
|
|
341
|
-
## AI patterns
|
|
342
|
-
|
|
343
|
-
Summarize reads a document; Batch transform enriches a CSV into a new file.
|
|
344
|
-
|
|
345
|
-
Signatures: `summarize({ attachment, prompt, returnCitations? })`;
|
|
346
|
-
`batchTransform({ attachment, prompt, outputColumns, enableWebSearchGrounding? })`.
|
|
347
|
-
|
|
348
|
-
```ts
|
|
349
|
-
.step('digest', summarize({ attachment: out('start', 'document'),
|
|
350
|
-
prompt: 'Summarize the decisions and owners.',
|
|
351
|
-
returnCitations: true }))
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
Request citations or web grounding only when the scenario needs them.
|
|
355
|
-
|
|
356
|
-
**Summarize: [`references/summarize.md`](references/summarize.md)**
|
|
357
|
-
|
|
358
|
-
**Batch transform: [`references/batch-transform.md`](references/batch-transform.md)**
|
|
359
|
-
|
|
360
|
-
## Document extraction
|
|
361
|
-
|
|
362
|
-
Run a published Intelligent eXtraction Platform project on an attachment.
|
|
363
|
-
|
|
364
|
-
Signature: `ixpExtract({ project, modelName, name, folderName, fileRef, pageRange?, versionTag?, folderPath? })`.
|
|
365
|
-
|
|
366
|
-
```ts
|
|
367
|
-
.step('extract', ixpExtract({ project: ixpNodeType,
|
|
368
|
-
modelName: 'invoice-model', name: 'Invoice Extractor',
|
|
369
|
-
folderName: 'Shared', fileRef: out('start', 'invoiceFile') }))
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
Copy identity fields from a freshly pulled tenant registry; never construct them.
|
|
373
|
-
|
|
374
|
-
Asking WHICH models exist ("what document extractors can I add?") is read-only Q&A, not a build: one `registry search 'uipath.ixp'` is the whole answer, and `registry get` is never fanned out across its hits.
|
|
375
|
-
|
|
376
|
-
**Reference: [`references/ixp.md`](references/ixp.md)**
|
|
377
|
-
|
|
378
|
-
## Document classify and Dynamic Extract
|
|
379
|
-
|
|
380
|
-
Classify a document (`uipath.document.classify`), or extract fields against an
|
|
381
|
-
INLINE schema (`uipath.ixp.extract-document-builder`) instead of a published
|
|
382
|
-
IxP project's trained fields.
|
|
383
|
-
Signatures: `documentClassify({ fileRef, pageRange?, splitPages?, modelConfig? })`;
|
|
384
|
-
`dynamicExtract({ fileRef, schema, model: { modelName, folderKey, ... }, pageRange? })`.
|
|
385
|
-
|
|
386
|
-
```ts
|
|
387
|
-
.step('classify', documentClassify({ fileRef: input('file'), splitPages: true }))
|
|
388
|
-
.step('extract', dynamicExtract({ fileRef: input('file'),
|
|
389
|
-
schema: { type: 'object', properties: { total: { type: 'string' } } },
|
|
390
|
-
model: { modelName: 'invoiceixp-cef0d447-ixp', folderKey: '<folder-guid>' } }))
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
Dynamic Extract still needs a model deployment identity — copy `modelName` and
|
|
394
|
-
`folderKey` from the tenant; never construct them.
|
|
395
|
-
|
|
396
|
-
**Reference: [`references/document-pipeline.md`](references/document-pipeline.md)**
|
|
397
|
-
|
|
398
|
-
## Delay
|
|
399
|
-
|
|
400
|
-
Pause this path for a duration — or until an absolute date-time — then continue.
|
|
401
|
-
|
|
402
|
-
Signature: `delay({ duration: string })` or `delay({ until: string })`
|
|
403
|
-
(exactly one; `until` is an ISO-8601 date-time, e.g. `'2026-09-01T09:00:00Z'`).
|
|
404
|
-
|
|
405
|
-
```ts
|
|
406
|
-
.step('cooldown', delay({ duration: 'PT30S' }))
|
|
407
|
-
.step('embargo', delay({ until: '2026-09-01T09:00:00Z' }))
|
|
408
|
-
.step('resumedAt', script({ code: 'return new Date().toISOString();' }))
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
Use a real-time rung when elapsed time itself is the requirement.
|
|
412
|
-
|
|
413
|
-
**Reference: [`references/delay.md`](references/delay.md)**
|
|
414
|
-
|
|
415
|
-
## RPA workflow
|
|
416
|
-
|
|
417
|
-
Run a deployed robotic process and wait for its job result.
|
|
418
|
-
|
|
419
|
-
Signature: `rpaWorkflow({ key, name, folderPath, inputs?, returns? })`.
|
|
420
|
-
|
|
421
|
-
```ts
|
|
422
|
-
.step('title', rpaWorkflow({ key: releaseKey,
|
|
423
|
-
name: 'RPA Workflow', folderPath: 'Shared',
|
|
424
|
-
inputs: { problemId: 123 }, returns: { title: 'string' } }))
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
Confirm identity and argument names against the same deployed tenant resource.
|
|
428
|
-
|
|
429
|
-
**Reference: [`references/rpa-workflow.md`](references/rpa-workflow.md)**
|
|
430
|
-
|
|
431
|
-
**Finding the key: [`references/or-processes.md`](references/or-processes.md)**
|
|
432
|
-
|
|
433
|
-
## API workflow
|
|
434
|
-
|
|
435
|
-
Run a deployed coded API workflow and wait for its job result.
|
|
436
|
-
|
|
437
|
-
Signature: `apiWorkflow({ key, name, folderPath, inputs?, returns? })`.
|
|
438
|
-
|
|
439
|
-
```ts
|
|
440
|
-
.step('age', apiWorkflow({ key: workflowKey,
|
|
441
|
-
name: 'NameToAge', folderPath: 'Shared',
|
|
442
|
-
inputs: { name: input('name') }, returns: { age: 'integer' } }))
|
|
443
|
-
```
|
|
444
|
-
|
|
445
|
-
Confirm identity and exact argument casing on the tenant; `.onError(...)` is supported.
|
|
446
|
-
|
|
447
|
-
**Reference: [`references/api-workflow.md`](references/api-workflow.md)**
|
|
448
|
-
|
|
449
|
-
**Finding the key: [`references/or-processes.md`](references/or-processes.md)**
|
|
450
|
-
|
|
451
|
-
## Published function
|
|
452
|
-
|
|
453
|
-
Run a deployed Orchestrator **Function** — a small unit of code published as its
|
|
454
|
-
own resource — as one step.
|
|
455
|
-
|
|
456
|
-
Signature: `publishedFunction({ key, name, folderPath, inputs?, returns? })`.
|
|
457
|
-
|
|
458
|
-
```ts
|
|
459
|
-
.step('echo', publishedFunction({ key: functionKey,
|
|
460
|
-
name: 'acme-echo', folderPath: 'Shared/acme-echo',
|
|
461
|
-
inputs: { message: input('message') }, returns: { echoed: 'string' } }))
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
A function is usually deployed into a folder of its OWN name — read `folderPath`
|
|
465
|
-
from the tenant rather than assuming `'Shared'`, since the binding's resourceKey
|
|
466
|
-
is `<folderPath>.<name>`.
|
|
467
|
-
|
|
468
|
-
**Reference: [`references/published-function.md`](references/published-function.md)**
|
|
469
|
-
|
|
470
|
-
## Agentic process
|
|
471
|
-
|
|
472
|
-
Run a deployed Maestro agentic process synchronously.
|
|
473
|
-
|
|
474
|
-
Signature: `agenticProcess({ key, name, folderPath, inputs?, returns?, form?, completion? })`.
|
|
475
|
-
|
|
476
|
-
```ts
|
|
477
|
-
.step('intake', agenticProcess({ key: processKey,
|
|
478
|
-
name: 'ProcurementProcess', folderPath: 'Shared',
|
|
479
|
-
inputs: { productId: 1 }, returns: { status: 'boolean' } }))
|
|
480
|
-
```
|
|
481
|
-
|
|
482
|
-
Confirm identity and argument names live; declared outputs may still be null;
|
|
483
|
-
`.onError(...)` is supported. `form: 'bpmn' | 'flow' | 'case'` picks the published
|
|
484
|
-
form; `completion: 'fire-and-forget'` waits for nothing — see the reference.
|
|
485
|
-
|
|
486
|
-
**Reference: [`references/agentic-process.md`](references/agentic-process.md)**
|
|
487
|
-
|
|
488
|
-
**Finding the key: [`references/or-processes.md`](references/or-processes.md)**
|
|
489
|
-
|
|
490
|
-
## Agent resource
|
|
491
|
-
|
|
492
|
-
Start a published coded/low-code agent, or a sibling agent registered in this
|
|
493
|
-
solution, and wait for its answer.
|
|
494
|
-
|
|
495
|
-
Signature: `agent({ key, name, folderPath?, location?, projectId?, inputs, returns?, flavour? })`.
|
|
496
|
-
|
|
497
|
-
```ts
|
|
498
|
-
.step('count', agent({ key: releaseKey, name: 'CountLetters',
|
|
499
|
-
folderPath: 'Shared', inputs: { word: input('word') },
|
|
500
|
-
returns: { count: 'integer' }, flavour: 'coded' }))
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
This references rather than creates an agent; scaffold and register a task-created
|
|
504
|
-
sibling before calling it. Verify resource identity and answer quality live.
|
|
505
|
-
`.onError(...)` is supported.
|
|
506
|
-
|
|
507
|
-
**Reference: [`references/agent.md`](references/agent.md)**
|
|
508
|
-
|
|
509
|
-
## Inline agent
|
|
510
|
-
|
|
511
|
-
Define an autonomous agent inside this Flow project, with optional resources.
|
|
512
|
-
|
|
513
|
-
Signature: `inlineAgent({ model, systemPrompt, userPrompt, inputs?, returns?, source?, context?, tools?, escalation?, guardrails?, mode?, ... })`.
|
|
514
|
-
|
|
515
|
-
```ts
|
|
516
|
-
.step('triage', inlineAgent({ model: 'gpt-5.4', systemPrompt: 'Return a result conforming to the output schema. category: billing | technical | account.',
|
|
517
|
-
userPrompt: 'Classify {{input.body}}', inputs: { body: input('body') },
|
|
518
|
-
returns: { category: 'string' },
|
|
519
|
-
guardrails: [{ id: 'no-pii', $guardrailType: 'custom', name: 'Block PII', selector: { scopes: ['Agent'] },
|
|
520
|
-
enabledForEvals: true, action: { $actionType: 'block', reason: 'PII detected' },
|
|
521
|
-
rules: [{ $ruleType: 'always', applyTo: 'inputAndOutput' }] }] }))
|
|
522
|
-
```
|
|
523
|
-
|
|
524
|
-
`tools` also takes `mcp`, `a2a`, `clientside`, `httpRequest` and `function` kinds; `memory: { name, id }` attaches an episodic memory; `escalation` takes `variant: 'quick-form'` for an inline form. `mode: 'advanced'` selects the Advanced harness.
|
|
525
|
-
|
|
526
|
-
**Reference: [`references/inline-agent.md`](references/inline-agent.md)** — resource families: [`references/agent-resources.md`](references/agent-resources.md)
|
|
527
|
-
|
|
528
|
-
## Authoring a flow
|
|
529
|
-
|
|
530
|
-
Choose each node from a registry search, never a brand name; ask when the
|
|
531
|
-
request leaves a finite decision open; bind every declared output on every
|
|
532
|
-
path (`check` misses a missing one, and the run returns `undefined`); handle an
|
|
533
|
-
error only when the request says what should happen. The journeys, the
|
|
534
|
-
scope gate for a request that names no steps, when to plan first, and the
|
|
535
|
-
completion report are in
|
|
536
|
-
**[`references/author.md`](references/author.md)**.
|
|
537
|
-
|
|
538
|
-
## Operating a deployed flow
|
|
539
|
-
|
|
540
|
-
Upload, deploy, debug, trigger, inspect a job, and drive an instance's
|
|
541
|
-
lifecycle. All of it needs `uip login`, and `uip solution resources refresh`
|
|
542
|
-
comes before every upload, publish or debug. `flow debug` is a REAL run, not a
|
|
543
|
-
validation step. Read
|
|
544
|
-
**[`references/operate.md`](references/operate.md)**.
|
|
545
|
-
|
|
546
|
-
## Diagnosing a failed run
|
|
547
|
-
|
|
548
|
-
Triage in order — the debug response you already have, then incidents, runtime
|
|
549
|
-
variables, the deployed artifact, and traces last. Never re-run `flow debug` to
|
|
550
|
-
look again. The builder removes several classic `.flow` defects and leaves
|
|
551
|
-
others, including an expression that is really a literal. Read
|
|
552
|
-
**[`references/diagnose.md`](references/diagnose.md)**.
|
|
553
|
-
|
|
554
|
-
## Evaluating a flow
|
|
555
|
-
|
|
556
|
-
An inline agent does not create evaluators, eval sets, data points or
|
|
557
|
-
simulations — the Flow eval CLI manages them as project files. Simulate every
|
|
558
|
-
side-effecting component before running a set, and never `solution upload` as
|
|
559
|
-
part of an eval workflow without asking. Read
|
|
560
|
-
**[`references/evaluate.md`](references/evaluate.md)**.
|
|
561
|
-
|
|
562
|
-
## Queue item
|
|
563
|
-
|
|
564
|
-
Create an Orchestrator queue item, optionally waiting for its consumer.
|
|
565
|
-
|
|
566
|
-
Signature: `queueItem({ queue, folderPath, key, item, priority?, reference?, deferDate?, dueDate?, wait?, returns? })`.
|
|
567
|
-
|
|
568
|
-
```ts
|
|
569
|
-
.step('enqueue', queueItem({ queue: 'Invoices', folderPath: 'Shared',
|
|
570
|
-
key: queueKey, item: { InvoiceId: input('invoiceId') },
|
|
571
|
-
reference: input('invoiceId'), wait: false }))
|
|
572
|
-
```
|
|
573
|
-
|
|
574
|
-
Check tenant uniqueness/schema settings; wait only when a consumer exists and its result is needed.
|
|
575
|
-
|
|
576
|
-
**Reference: [`references/queue.md`](references/queue.md)**
|
|
577
|
-
|
|
578
|
-
## Data Fabric
|
|
579
|
-
|
|
580
|
-
**One product, two surfaces.** "Data Fabric" and "Data Service" are one product (key `uipath-uipath-dataservice` shows as *UiPath Data Fabric*).
|
|
581
|
-
**CRUD is NATIVE** — `dataFabricRead` / `dataFabricCreate` / `dataFabricUpdate` / `dataFabricDelete`, no connection binding, no `registry prepare`.
|
|
582
|
-
|
|
583
|
-
```ts
|
|
584
|
-
.step('open', dataFabricRead({ entity: 'Invoices', resultMode: 'multiple',
|
|
585
|
-
filters: [{ field: 'Status', value: 'Open' }], limit: 200, sort: { field: 'CreateTime' } }))
|
|
586
|
-
```
|
|
587
|
-
|
|
588
|
-
`resultMode: 'multiple'` publishes matches under `output.results` and selects the read node's 1.4 definition; plain `dataFabricRead()` stays on 1.0 and reads one record.
|
|
589
|
-
**Wrong here fails SILENTLY** — a bad column is dropped, not rejected, so `validate` passing is not evidence. Resolve columns with `uip df entities get` first.
|
|
590
|
-
Delete publishes nothing; system columns (`Id`, `CreateTime`, `CreatedBy`, `UpdateTime`, `UpdatedBy`) are never writable; `fromRead` needs a single-record read; a folder-scoped entity needs `folderKey` AND `resourceKey`.
|
|
591
|
-
|
|
592
|
-
**Still connector-only**: file record fields and Record Created/Updated events — `connector('uipath-uipath-dataservice', …)` + `registry prepare -f entityName=<Entity>`.
|
|
593
|
-
**Reference: [`references/data-fabric.md`](references/data-fabric.md)**
|
|
594
|
-
|
|
595
|
-
## Error handling
|
|
596
|
-
|
|
597
|
-
Route the immediately preceding action's failure through a handler path.
|
|
598
|
-
|
|
599
|
-
Signature: `.step(name, action).onError(handler => ... )`; the handler reads the failure with `h.err(field)` (or `err(step, field)`) and may `stepToRef(target)`. `.stepToList(port, fn)` runs a path from any port; `.stepToRef(port, target)` is a side exit that leaves the success path running. Never read the failed step's `out(...)` inside its own handler — that output was never written.
|
|
600
|
-
|
|
601
|
-
```ts
|
|
602
|
-
.step('fetch', http({ url, managed: true }))
|
|
603
|
-
.onError((h) => h.step('recover', script({ code: 'return "cached";' }))
|
|
604
|
-
.stepToRef('useValue'))
|
|
605
|
-
.step('useValue', script({ code: 'return "done";' }))
|
|
606
|
-
```
|
|
607
|
-
|
|
608
|
-
Choose deliberately between handling, rejoining, returning, terminating, and failing loud; test success and failure.
|
|
609
|
-
|
|
610
|
-
**Reference: [`references/error-handling.md`](references/error-handling.md)**
|
|
611
|
-
|
|
612
|
-
## Terminate
|
|
613
|
-
|
|
614
|
-
Stop the entire Flow run, including sibling parallel arms.
|
|
615
|
-
|
|
616
|
-
Signature: `.terminate(name, label?)`.
|
|
617
|
-
|
|
618
|
-
```ts
|
|
619
|
-
.branch('fatal', input('fatal'),
|
|
620
|
-
(yes) => yes.terminate('abort', 'Abort run'),
|
|
621
|
-
(no) => no.step('continue', script({ code: 'return "ok";' })))
|
|
622
|
-
```
|
|
623
|
-
|
|
624
|
-
Use it only for stop-all intent; prove cancellation with an abort-specific witness.
|
|
625
|
-
|
|
626
|
-
**Reference: [`references/terminate.md`](references/terminate.md)**
|
|
627
|
-
|
|
628
|
-
## Placeholder
|
|
629
|
-
|
|
630
|
-
Mark where a real capability will be inserted later.
|
|
631
|
-
|
|
632
|
-
Signature: `mock()`.
|
|
633
|
-
|
|
634
|
-
```ts
|
|
635
|
-
.step('extractInvoice', mock())
|
|
636
|
-
.step('continueWithInput', script({
|
|
637
|
-
code: 'return $vars.assumedInvoiceId;' }))
|
|
638
|
-
```
|
|
639
|
-
|
|
640
|
-
Use a script for local fixed data, never in place of a capability the request needs; use a placeholder only to expose a capability gap the search proved.
|
|
641
|
-
|
|
642
|
-
**Reference: [`references/placeholder.md`](references/placeholder.md)**
|
|
643
|
-
|
|
644
|
-
## Unknown node type
|
|
645
|
-
|
|
646
|
-
Place a node this SDK has no factory for, carrying its definition verbatim.
|
|
647
|
-
|
|
648
|
-
Signature: `rawNode({ nodeType, version, manifest, inputs?, outputs? })`.
|
|
649
|
-
|
|
650
|
-
```ts
|
|
651
|
-
.step('exotic', rawNode({ nodeType: 'uipath.exotic.thing', version: '2.1',
|
|
652
|
-
manifest: exoticManifest, // exactly what `registry get` returned
|
|
653
|
-
inputs: { where: input('scope') } }))
|
|
654
|
-
```
|
|
655
|
-
|
|
656
|
-
`manifest` must be a real definition, copied from the registry — not one you
|
|
657
|
-
wrote. Prefer a typed factory when one exists: it carries the family's checks,
|
|
658
|
-
defaults and output contract. `decompile` emits this for a node type it cannot
|
|
659
|
-
name, so an unknown node keeps its type and version through a round trip.
|
|
660
|
-
|
|
661
|
-
**Never for a connector.** `check` and `compile` refuse a `uipath.connector.*`
|
|
662
|
-
node type here: a raw node keeps its inputs verbatim, so the emitted node has no
|
|
663
|
-
`inputs.detail` and no connection binding — `validate` only warns and the run
|
|
664
|
-
never reaches Integration Service. When `compile` refuses a connector input as
|
|
665
|
-
unknown, the answer is `uip maestro registry prepare <key> <action>` (see
|
|
666
|
-
[connector-params.md](references/connector-params.md#schema-dynamic-operations-the-parent-field-loop)),
|
|
667
|
-
not `rawNode`.
|
|
668
|
-
|
|
669
|
-
**Reference: [`references/placeholder.md`](references/placeholder.md#unknown-node-types)**
|
|
670
|
-
|
|
671
|
-
## Branch
|
|
672
|
-
|
|
673
|
-
Split runtime control into true and false paths.
|
|
674
|
-
|
|
675
|
-
Signature: `.branch(name, condition, thenFn, elseFn?)`.
|
|
676
|
-
|
|
677
|
-
```ts
|
|
678
|
-
.branch('large', js`${input('amount')} > 1000`,
|
|
679
|
-
(yes) => yes.step('review', script({ code: 'return "review";' })),
|
|
680
|
-
(no) => no.step('approve', script({ code: 'return "approved";' })))
|
|
681
|
-
```
|
|
682
|
-
|
|
683
|
-
Use branch for a two-way decision; decide whether arms return or ref back into shared work.
|
|
684
|
-
|
|
685
|
-
**Reference: [`references/branch.md`](references/branch.md)**
|
|
686
|
-
|
|
687
|
-
## Switch
|
|
688
|
-
|
|
689
|
-
Split runtime control among cases of one discriminant.
|
|
690
|
-
|
|
691
|
-
Signature: `.switch(name, on, [{ value, label?, body }], defaultFn?)`.
|
|
692
|
-
|
|
693
|
-
```ts
|
|
694
|
-
.switch('priority', input('priority'), [
|
|
695
|
-
{ value: 'high', body: (b) => b.step('page', script({ code: 'return 1;' })) },
|
|
696
|
-
{ value: 'low', body: (b) => b.step('queue', script({ code: 'return 2;' })) },
|
|
697
|
-
])
|
|
698
|
-
```
|
|
699
|
-
|
|
700
|
-
Prefer switch when one value selects three or more paths; use branch for two.
|
|
701
|
-
|
|
702
|
-
**Reference: [`references/switch.md`](references/switch.md)**
|
|
703
|
-
|
|
704
|
-
## Parallel branches
|
|
705
|
-
|
|
706
|
-
Fan out independent arms and join them at a Merge.
|
|
707
|
-
|
|
708
|
-
Signature: `.parallel(name, [armFn, armFn, ...])`.
|
|
709
|
-
|
|
710
|
-
```ts
|
|
711
|
-
.parallel('ready', [
|
|
712
|
-
(a) => a.step('weather', http({ url: weatherUrl, managed: false })),
|
|
713
|
-
(b) => b.step('news', http({ url: newsUrl, managed: false })),
|
|
714
|
-
])
|
|
715
|
-
```
|
|
716
|
-
|
|
717
|
-
Use it only for independent arms; do not assume the local executor runs them concurrently.
|
|
718
|
-
|
|
719
|
-
**Reference: [`references/parallel-merge.md`](references/parallel-merge.md)**
|
|
720
|
-
|
|
721
|
-
## Subflow
|
|
722
|
-
|
|
723
|
-
Run a child Flow authored in the same file as one parent step.
|
|
724
|
-
|
|
725
|
-
Signature: `subflow(childFlow, { childInput: expression, ... })`.
|
|
726
|
-
|
|
727
|
-
```ts
|
|
728
|
-
const child = flow('normalize').input({ raw: types.string })
|
|
729
|
-
.output({ clean: types.string })
|
|
730
|
-
.step('trim', script({ code: js`return ${input('raw')}.trim();`.js, returns: { clean: 'string' } }))
|
|
731
|
-
.return({ clean: out('trim', 'clean') }).build();
|
|
732
|
-
export default flow('parent').input({ text: types.string }).output({ clean: types.string })
|
|
733
|
-
.step('normalized', subflow(child, { raw: input('text') })).return({ clean: out('normalized', 'clean') }).build();
|
|
734
|
-
```
|
|
735
|
-
|
|
736
|
-
Use a child for a meaningful contract or reuse boundary, not arbitrary splitting or speed; children can be reused at any nesting depth.
|
|
737
|
-
Read a child's inputs with `input(...)`: its start node is named `<callerStepId>Start`, so a bare `$vars.raw` is wrong.
|
|
738
|
-
|
|
739
|
-
**Reference: [`references/subflow.md`](references/subflow.md)**
|
|
740
|
-
|
|
741
|
-
## Human task
|
|
742
|
-
|
|
743
|
-
Pause for a person: an inline form, quick form, deployed Action App, or a
|
|
744
|
-
document-validation station.
|
|
745
|
-
|
|
746
|
-
Signature: `hitl({ variant?, app?, document?, title?, priority?, labels?, recipient?, fields?, outcomes, outcomePorts?, exposeError? })`.
|
|
747
|
-
|
|
748
|
-
```ts
|
|
749
|
-
.var('status', types.string)
|
|
750
|
-
.stepSwitch('review', hitl({ title: 'Review invoice',
|
|
751
|
-
recipient: { assignee: { type: 'user', value: 'reviewer@acme.test' } },
|
|
752
|
-
fields: [{ id: 'amount', type: 'number', direction: 'inOut', value: input('amount') }],
|
|
753
|
-
outcomes: ['Approve', 'Reject'] }), [
|
|
754
|
-
{ value: 'Approve', body: (b) => b.step('proceed', script({ code: 'return "approved";' }),
|
|
755
|
-
{ updates: { status: lit('approved') } }) },
|
|
756
|
-
{ value: 'Reject', body: (b) => b.step('notify', script({ code: 'return "rejected";' }),
|
|
757
|
-
{ updates: { status: lit('rejected') } }) }])
|
|
758
|
-
.return({ status: v('status') })
|
|
759
|
-
```
|
|
760
|
-
|
|
761
|
-
Every outcome is its own exit (`outcome-<slug>`); the SDK never emits `completed` on a task that has outcomes, and every outcome must be wired. `.stepSwitch` gives each one an arm — no tacit exit, arms converge like `.switch`'s, a missing arm warns — on the default node, on quick-form, or on a pinned task. After a default-node task with more than one outcome, `.step` + `.stepToList` is the older shape where the FIRST outcome continues the main path. After quick-form, `outcomePorts: false` or `{ version: '1.0' }`, a plain `.step()` continues EVERY outcome to the next step, each on its own edge, where you route on `out('review', 'Action')`.
|
|
762
|
-
|
|
763
|
-
**Reference: [`references/hitl.md`](references/hitl.md)**
|
|
764
|
-
|
|
765
|
-
## Conversational
|
|
766
|
-
|
|
767
|
-
Work a live CHAT: wait for the person's message, answer it, post a reply. Every
|
|
768
|
-
step is keyed by a `conversationId` — the conversation trigger publishes it.
|
|
769
|
-
|
|
770
|
-
Signatures: `.trigger(conversationTrigger())`; `waitForMessage({ conversationId, numExchanges? })`; `conversationalAgent({ model, systemPrompt, settings })`; `sendMessage({ conversationId, exchangeId, content, endExchange? })`; `conversationContext({ conversationId, exchangeLimit? })`.
|
|
771
|
-
|
|
772
|
-
```ts
|
|
773
|
-
.trigger(conversationTrigger())
|
|
774
|
-
.step('listen', waitForMessage({ conversationId: out('start', 'conversationId') }))
|
|
775
|
-
.step('reply', conversationalAgent({ model: 'gpt-5.4', systemPrompt: 'Answer briefly.',
|
|
776
|
-
settings: { context: out('listen', 'conversationContext') } }))
|
|
777
|
-
```
|
|
778
|
-
|
|
779
|
-
`waitForMessage` SUSPENDS the flow (a catch event), it does not poll. Use `sendMessage` when the flow decides what to say, an agent when the model does.
|
|
780
|
-
|
|
781
|
-
**Reference: [`references/conversational.md`](references/conversational.md)**
|
|
782
|
-
|
|
783
|
-
## Voice
|
|
784
|
-
|
|
785
|
-
Talk to someone on a phone call. The call is identified by a `callContext`
|
|
786
|
-
OBJECT — pass the whole thing, never a field inside it.
|
|
787
|
-
|
|
788
|
-
Signatures: `.trigger(voiceTrigger())`; `createOutgoingCall({ from, to })`; `endCall({ callContext })`; `voiceAgent({ systemPrompt, inputs?, callContext, voice?, maxIterations? })`.
|
|
789
|
-
|
|
790
|
-
```ts
|
|
791
|
-
.step('dial', createOutgoingCall({ from: '+15550001111', to: input('phone') }))
|
|
792
|
-
.step('talk', voiceAgent({ systemPrompt: 'Confirm {{input.customerName}}\'s delivery window.',
|
|
793
|
-
inputs: { customerName: input('customerName') },
|
|
794
|
-
callContext: out('dial', 'callContext'),
|
|
795
|
-
voice: { model: 'gemini-3.1-flash-live-preview', persona: 'Kore' } }))
|
|
796
|
-
.step('bye', endCall({ callContext: out('dial', 'callContext') }))
|
|
797
|
-
```
|
|
798
|
-
|
|
799
|
-
The incoming-call trigger publishes `out('start', 'callContext')`. A persona belongs to its voice model; `maxIterations` is capped at 8.
|
|
800
|
-
|
|
801
|
-
**Reference: [`references/voice.md`](references/voice.md)**
|
|
802
|
-
|
|
803
|
-
## Transform
|
|
804
|
-
|
|
805
|
-
Filter, map, group, or chain operations over an array without custom JavaScript.
|
|
806
|
-
|
|
807
|
-
Signature: `transform({ collection, operations, variant?: 'filter' | 'map' | 'group-by' })`.
|
|
808
|
-
|
|
809
|
-
```ts
|
|
810
|
-
.step('active', transform({ variant: 'filter', collection: input('rows'),
|
|
811
|
-
operations: [{ type: 'filter', filters: [
|
|
812
|
-
{ field: 'status', condition: 'equals', value: 'active' },
|
|
813
|
-
] }] }))
|
|
814
|
-
```
|
|
815
|
-
|
|
816
|
-
Prefer a named variant for one operation and generic Transform for a chain; verify chain order against real fields.
|
|
817
|
-
|
|
818
|
-
**Reference: [`references/transform.md`](references/transform.md)**
|
|
819
|
-
|
|
820
|
-
## Integration Service connectors
|
|
821
|
-
|
|
822
|
-
Call a curated or generic connector operation using a generated descriptor or key/action pair.
|
|
823
|
-
|
|
824
|
-
Signatures: `connector(descriptor, inputs, opts?)`;
|
|
825
|
-
`connector(key, action, inputs?, { connection, folder, object?, version? })` (`connection` and `folder` are required: `BINDING_MISSING`).
|
|
826
|
-
|
|
827
|
-
```ts
|
|
828
|
-
.step('issue', connector('uipath-atlassian-jira', 'get-issue',
|
|
829
|
-
{ issueId: input('issueId'), project: 'IN', issuetype: 'Task' },
|
|
830
|
-
{ connection: 'jira', folder: 'shared' }))
|
|
831
|
-
```
|
|
832
|
-
|
|
833
|
-
Data Fabric is also connector key `uipath-uipath-dataservice`: use it for file
|
|
834
|
-
record fields, Record Created/Updated events, or a scenario that names the
|
|
835
|
-
connector. Record CRUD is native ([Data Fabric](#data-fabric)). Discover tenant-specific fields and ids; preserve every scenario-named input.
|
|
836
|
-
|
|
837
|
-
**Reference: [`references/connector-params.md`](references/connector-params.md)**
|
|
838
|
-
|
|
839
|
-
**Bindings: [`references/bindings.md`](references/bindings.md)**
|
|
840
|
-
|
|
841
|
-
## Loops
|
|
842
|
-
|
|
843
|
-
Run a body once for each value in a collection.
|
|
844
|
-
|
|
845
|
-
Signature: `.loop(name, collection, bodyFn, options?)`.
|
|
846
|
-
|
|
847
|
-
```ts
|
|
848
|
-
.loop('eachOrder', input('orders'), (body) => body
|
|
849
|
-
.step('handle', script({ code:
|
|
850
|
-
'return { id: $vars.eachOrder.currentItem.id };' })))
|
|
851
|
-
```
|
|
852
|
-
|
|
853
|
-
Per-iteration flow-variable writes go through `{ updates }` on a body step.
|
|
854
|
-
Every `.loop()` emits `core.logic.loop` 2.4: the body reads
|
|
855
|
-
`$vars.<loop>.currentItem` and `$vars.<loop>.currentIteration` (not the legacy
|
|
856
|
-
1.0.0 `currentIndex`, which `check` refuses). Options: `parallel: true`,
|
|
857
|
-
`completionCondition` (checked after each iteration, stops early), and
|
|
858
|
-
`body.break()` exits the whole loop from inside an arm. See the reference for
|
|
859
|
-
the option details and examples.
|
|
860
|
-
|
|
861
|
-
**Reference: [`references/loops.md`](references/loops.md)**
|
|
862
|
-
|
|
863
|
-
## Do while
|
|
864
|
-
|
|
865
|
-
Run a body, then repeat **while a condition is true** — checked AFTER each
|
|
866
|
-
pass, so the body always runs at least once (`core.logic.dowhile`). The
|
|
867
|
-
container publishes no data output: write results to a `.var()` from inside
|
|
868
|
-
the body with `{ updates }`. `limit` caps iterations (1–10,000; blank means
|
|
869
|
-
the platform default of 10,000), and `body.break()` works exactly as in
|
|
870
|
-
`.loop()`.
|
|
871
|
-
|
|
872
|
-
Signature: `.doWhile(name, condition, bodyFn, { limit?, breakEnabled? })`.
|
|
873
|
-
|
|
874
|
-
```ts
|
|
875
|
-
.var('page', types.number, 1)
|
|
876
|
-
.doWhile('paginate', js`$vars.fetch.output.body.hasNextPage === true`, (body) => body
|
|
877
|
-
.step('fetch', http({ url: tmpl`https://api.example.test/items?page=${v('page')}`,
|
|
878
|
-
method: 'GET', managed: false, returns: { hasNextPage: 'boolean' } }),
|
|
879
|
-
{ updates: { page: js`$vars.page + 1` } }),
|
|
880
|
-
{ limit: 50 })
|
|
881
|
-
```
|
|
882
|
-
|
|
883
|
-
## Return and end
|
|
884
|
-
|
|
885
|
-
End the current path and bind declared Flow outputs.
|
|
886
|
-
|
|
887
|
-
Signature: `.return({ outputName: expression, ... })`.
|
|
888
|
-
|
|
889
|
-
```ts
|
|
890
|
-
.branch('valid', out('check'),
|
|
891
|
-
(yes) => yes.return({ status: 'accepted' }),
|
|
892
|
-
(no) => no.return({ status: 'rejected' }))
|
|
893
|
-
```
|
|
894
|
-
|
|
895
|
-
Choose between arm-local returns and a shared continuation based on the graph the scenario needs.
|
|
896
|
-
|
|
897
|
-
**Reference: [`references/return.md`](references/return.md)**
|
|
898
|
-
|
|
899
|
-
## Final evidence
|
|
900
|
-
|
|
901
|
-
The final pass must use the loop appropriate to the packaging mode and run after
|
|
902
|
-
the last edit. Product-resource truth is live evidence: confirm plausible ids,
|
|
903
|
-
argument names, scenario-named optional inputs, and warnings against the tenant.
|
|
904
|
-
Static diagnostics own all mechanically checkable structure; fix their cause
|
|
905
|
-
rather than copying rules back into this router.
|
|
906
|
-
|
|
907
|
-
Match proof to the request's acceptance bar. If one wiring question remains,
|
|
908
|
-
a validate-only bar is complete when product validation is green and its
|
|
909
|
-
required structural self-check passes; do not add debug only for confidence.
|
|
910
|
-
For each behavior claim the bar names, plan at most one bounded product debug
|
|
911
|
-
that answers it. If one wiring question remains, run one bounded experiment
|
|
912
|
-
that distinguishes it, apply the answer, and stop; do not grow a family of
|
|
913
|
-
scratch solutions or repeat equivalent variants.
|
|
96
|
+
> **Trouble?** Use `/uipath-feedback` to report unexpected behavior.
|