@uipath/skills 1.204.0 → 1.204.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.cursor-plugin/plugin.json +1 -1
  4. package/CODEOWNERS +12 -14
  5. package/package.json +1 -1
  6. package/skills/uipath-agents/references/coded/embedding-in-flows.md +1 -3
  7. package/skills/uipath-agents/references/coded/quickstart.md +0 -2
  8. package/skills/uipath-agents/references/lowcode/capabilities/inline-in-flow/inline-in-flow.md +10 -8
  9. package/skills/uipath-agents/references/lowcode/prompting/autonomous-agent-prompting-guide.md +1 -1
  10. package/skills/uipath-human-in-the-loop/SKILL.md +1 -3
  11. package/skills/uipath-human-in-the-loop/references/hitl-node-apptask.md +0 -2
  12. package/skills/uipath-human-in-the-loop/references/hitl-node-coded-action-app.md +0 -2
  13. package/skills/uipath-human-in-the-loop/references/hitl-node-quickform.md +2 -2
  14. package/skills/uipath-maestro-flow/.maintenance/README.md +265 -0
  15. package/skills/uipath-maestro-flow/.maintenance/check-all.sh +40 -0
  16. package/skills/uipath-maestro-flow/.maintenance/check-anchors.sh +101 -0
  17. package/skills/uipath-maestro-flow/.maintenance/check-depth.sh +132 -0
  18. package/skills/uipath-maestro-flow/.maintenance/check-link-text.sh +123 -0
  19. package/skills/uipath-maestro-flow/.maintenance/check-links.sh +73 -0
  20. package/skills/uipath-maestro-flow/.maintenance/check-orphans.sh +93 -0
  21. package/skills/uipath-maestro-flow/.maintenance/check-plugin-pairs.sh +39 -0
  22. package/skills/uipath-maestro-flow/.maintenance/check-template.sh +42 -0
  23. package/skills/uipath-maestro-flow/.maintenance/check-uip-commands.sh +270 -0
  24. package/skills/uipath-maestro-flow/.maintenance/check-versions.sh +160 -0
  25. package/skills/uipath-maestro-flow/SKILL.md +69 -886
  26. package/skills/uipath-maestro-flow/references/author/CAPABILITY.md +207 -0
  27. package/skills/uipath-maestro-flow/references/author/brownfield.md +91 -0
  28. package/skills/uipath-maestro-flow/references/author/editing-operations-cli.md +190 -0
  29. package/skills/uipath-maestro-flow/references/author/editing-operations-json.md +374 -0
  30. package/skills/uipath-maestro-flow/references/author/editing-operations.md +104 -0
  31. package/skills/uipath-maestro-flow/references/author/greenfield.md +420 -0
  32. package/skills/uipath-maestro-flow/references/author/planning-arch.md +364 -0
  33. package/skills/uipath-maestro-flow/references/author/planning-impl.md +291 -0
  34. package/skills/uipath-maestro-flow/references/author/plugins/agent/impl.md +237 -0
  35. package/skills/uipath-maestro-flow/references/author/plugins/agent/planning.md +97 -0
  36. package/skills/uipath-maestro-flow/references/author/plugins/agentic-process/impl.md +107 -0
  37. package/skills/uipath-maestro-flow/references/author/plugins/agentic-process/planning.md +61 -0
  38. package/skills/uipath-maestro-flow/references/author/plugins/api-workflow/impl.md +108 -0
  39. package/skills/uipath-maestro-flow/references/author/plugins/api-workflow/planning.md +60 -0
  40. package/skills/uipath-maestro-flow/references/author/plugins/batch-transform/impl.md +171 -0
  41. package/skills/uipath-maestro-flow/references/author/plugins/batch-transform/planning.md +72 -0
  42. package/skills/uipath-maestro-flow/references/author/plugins/connector/impl-inline.md +120 -0
  43. package/skills/uipath-maestro-flow/references/author/plugins/connector/impl.md +463 -0
  44. package/skills/uipath-maestro-flow/references/author/plugins/connector/planning.md +186 -0
  45. package/skills/uipath-maestro-flow/references/author/plugins/connector-trigger/impl.md +517 -0
  46. package/skills/uipath-maestro-flow/references/author/plugins/connector-trigger/planning.md +115 -0
  47. package/skills/uipath-maestro-flow/references/author/plugins/conversational-agent/impl.md +309 -0
  48. package/skills/uipath-maestro-flow/references/author/plugins/conversational-agent/planning.md +133 -0
  49. package/skills/uipath-maestro-flow/references/author/plugins/data-fabric/impl.md +428 -0
  50. package/skills/uipath-maestro-flow/references/author/plugins/data-fabric/planning.md +188 -0
  51. package/skills/uipath-maestro-flow/references/author/plugins/decision/impl.md +83 -0
  52. package/skills/uipath-maestro-flow/references/author/plugins/decision/planning.md +38 -0
  53. package/skills/uipath-maestro-flow/references/author/plugins/delay/impl.md +38 -0
  54. package/skills/uipath-maestro-flow/references/author/plugins/delay/planning.md +53 -0
  55. package/skills/uipath-maestro-flow/references/author/plugins/end/impl.md +56 -0
  56. package/skills/uipath-maestro-flow/references/author/plugins/end/planning.md +28 -0
  57. package/skills/uipath-maestro-flow/references/author/plugins/flow/impl.md +107 -0
  58. package/skills/uipath-maestro-flow/references/author/plugins/flow/planning.md +58 -0
  59. package/skills/uipath-maestro-flow/references/author/plugins/hitl/impl.md +181 -0
  60. package/skills/uipath-maestro-flow/references/author/plugins/hitl/planning.md +166 -0
  61. package/skills/uipath-maestro-flow/references/author/plugins/http/impl-connector.md +86 -0
  62. package/skills/uipath-maestro-flow/references/author/plugins/http/impl-manual.md +68 -0
  63. package/skills/uipath-maestro-flow/references/author/plugins/http/impl.md +173 -0
  64. package/skills/uipath-maestro-flow/references/author/plugins/http/planning.md +107 -0
  65. package/skills/uipath-maestro-flow/references/author/plugins/inline-agent/impl.md +540 -0
  66. package/skills/uipath-maestro-flow/references/author/plugins/inline-agent/planning.md +115 -0
  67. package/skills/uipath-maestro-flow/references/author/plugins/inline-voice-agent/impl.md +269 -0
  68. package/skills/uipath-maestro-flow/references/author/plugins/inline-voice-agent/planning.md +128 -0
  69. package/skills/uipath-maestro-flow/references/author/plugins/ixp/impl.md +424 -0
  70. package/skills/uipath-maestro-flow/references/author/plugins/ixp/planning.md +95 -0
  71. package/skills/uipath-maestro-flow/references/author/plugins/loop/impl.md +403 -0
  72. package/skills/uipath-maestro-flow/references/author/plugins/loop/planning.md +60 -0
  73. package/skills/uipath-maestro-flow/references/author/plugins/merge/impl.md +43 -0
  74. package/skills/uipath-maestro-flow/references/author/plugins/merge/planning.md +24 -0
  75. package/skills/uipath-maestro-flow/references/author/plugins/queue/impl.md +82 -0
  76. package/skills/uipath-maestro-flow/references/author/plugins/queue/planning.md +44 -0
  77. package/skills/uipath-maestro-flow/references/author/plugins/rpa/impl.md +117 -0
  78. package/skills/uipath-maestro-flow/references/author/plugins/rpa/planning.md +61 -0
  79. package/skills/uipath-maestro-flow/references/author/plugins/scheduled-trigger/impl.md +56 -0
  80. package/skills/uipath-maestro-flow/references/author/plugins/scheduled-trigger/planning.md +93 -0
  81. package/skills/uipath-maestro-flow/references/author/plugins/script/impl.md +98 -0
  82. package/skills/uipath-maestro-flow/references/author/plugins/script/planning.md +42 -0
  83. package/skills/uipath-maestro-flow/references/author/plugins/subflow/impl.md +164 -0
  84. package/skills/uipath-maestro-flow/references/author/plugins/subflow/planning.md +35 -0
  85. package/skills/uipath-maestro-flow/references/author/plugins/summarize/impl.md +189 -0
  86. package/skills/uipath-maestro-flow/references/author/plugins/summarize/planning.md +66 -0
  87. package/skills/uipath-maestro-flow/references/author/plugins/switch/impl.md +72 -0
  88. package/skills/uipath-maestro-flow/references/author/plugins/switch/planning.md +34 -0
  89. package/skills/uipath-maestro-flow/references/author/plugins/terminate/impl.md +48 -0
  90. package/skills/uipath-maestro-flow/references/author/plugins/terminate/planning.md +29 -0
  91. package/skills/uipath-maestro-flow/references/author/plugins/transform/impl.md +252 -0
  92. package/skills/uipath-maestro-flow/references/author/plugins/transform/planning.md +47 -0
  93. package/skills/uipath-maestro-flow/references/diagnose/CAPABILITY.md +73 -0
  94. package/skills/uipath-maestro-flow/references/diagnose/failure-modes.md +353 -0
  95. package/skills/uipath-maestro-flow/references/diagnose/troubleshooting-guide.md +174 -0
  96. package/skills/uipath-maestro-flow/references/evaluate/CAPABILITY.md +134 -0
  97. package/skills/uipath-maestro-flow/references/evaluate/commands-reference.md +376 -0
  98. package/skills/uipath-maestro-flow/references/evaluate/eval-sets-guide.md +227 -0
  99. package/skills/uipath-maestro-flow/references/evaluate/evaluators-guide.md +143 -0
  100. package/skills/uipath-maestro-flow/references/evaluate/running-guide.md +215 -0
  101. package/skills/uipath-maestro-flow/references/evaluate/upload-safety.md +94 -0
  102. package/skills/uipath-maestro-flow/references/operate/CAPABILITY.md +77 -0
  103. package/skills/uipath-maestro-flow/references/operate/manage.md +39 -0
  104. package/skills/uipath-maestro-flow/references/operate/run.md +121 -0
  105. package/skills/uipath-maestro-flow/references/operate/ship.md +57 -0
  106. package/skills/uipath-maestro-flow/references/shared/action-nodes.md +100 -0
  107. package/skills/uipath-maestro-flow/references/shared/cli-commands.md +269 -0
  108. package/skills/uipath-maestro-flow/references/shared/cli-conventions.md +178 -0
  109. package/skills/uipath-maestro-flow/references/shared/file-format.md +582 -0
  110. package/skills/uipath-maestro-flow/references/shared/node-output-wiring.md +86 -0
  111. package/skills/uipath-maestro-flow/references/shared/ux-narration-and-todos.md +113 -0
  112. package/skills/uipath-maestro-flow/references/shared/variables-and-expressions.md +787 -0
  113. package/skills/uipath-platform/references/integration-service/activities.md +2 -2
  114. package/skills/uipath-platform/references/integration-service/activity-generation.md +8 -1
  115. package/skills/uipath-platform/references/integration-service/triggers.md +1 -3
  116. package/version-manifest.json +1 -1
  117. package/skills/uipath-maestro-flow/examples/AquariumSafetyStop.flow.ts +0 -26
  118. package/skills/uipath-maestro-flow/examples/ArchiveCardExtract.flow.ts +0 -38
  119. package/skills/uipath-maestro-flow/examples/BakeOffEntryForm.flow.ts +0 -27
  120. package/skills/uipath-maestro-flow/examples/BeeHiveLedger.flow.ts +0 -61
  121. package/skills/uipath-maestro-flow/examples/BeltProgression.flow.ts +0 -53
  122. package/skills/uipath-maestro-flow/examples/BirdCountLookup.flow.ts +0 -24
  123. package/skills/uipath-maestro-flow/examples/ClubDirectory.flow.ts +0 -56
  124. package/skills/uipath-maestro-flow/examples/ConcertSoundcheck.flow.ts +0 -59
  125. package/skills/uipath-maestro-flow/examples/DoorbellLog.flow.ts +0 -45
  126. package/skills/uipath-maestro-flow/examples/FestivalMapScaffold.flow.ts +0 -22
  127. package/skills/uipath-maestro-flow/examples/FieldTripQuickForm.flow.ts +0 -45
  128. package/skills/uipath-maestro-flow/examples/FossilCatalogEnrich.flow.ts +0 -26
  129. package/skills/uipath-maestro-flow/examples/GallerySubmission.flow.ts +0 -67
  130. package/skills/uipath-maestro-flow/examples/GreenhouseWatering.flow.ts +0 -39
  131. package/skills/uipath-maestro-flow/examples/HarbourRadioLine.flow.ts +0 -31
  132. package/skills/uipath-maestro-flow/examples/HerbariumDispatch.flow.ts +0 -34
  133. package/skills/uipath-maestro-flow/examples/KilnReview.flow.ts +0 -38
  134. package/skills/uipath-maestro-flow/examples/LibraryDeskChat.flow.ts +0 -39
  135. package/skills/uipath-maestro-flow/examples/LighthouseSignal.flow.ts +0 -30
  136. package/skills/uipath-maestro-flow/examples/MeteorShowerPages.flow.ts +0 -39
  137. package/skills/uipath-maestro-flow/examples/NeighborhoodWalkPlanner.flow.ts +0 -27
  138. package/skills/uipath-maestro-flow/examples/ObservatorySeeing.flow.ts +0 -51
  139. package/skills/uipath-maestro-flow/examples/OralHistoryDigest.flow.ts +0 -31
  140. package/skills/uipath-maestro-flow/examples/PlanetariumConfirmation.flow.ts +0 -34
  141. package/skills/uipath-maestro-flow/examples/PlantNameAdvisor.flow.ts +0 -28
  142. package/skills/uipath-maestro-flow/examples/PostcardCaption.flow.ts +0 -44
  143. package/skills/uipath-maestro-flow/examples/PotteryStudioCallback.flow.ts +0 -41
  144. package/skills/uipath-maestro-flow/examples/RecipeScaler.flow.ts +0 -62
  145. package/skills/uipath-maestro-flow/examples/SeedPacketReader.flow.ts +0 -49
  146. package/skills/uipath-maestro-flow/examples/TideTableConverter.flow.ts +0 -35
  147. package/skills/uipath-maestro-flow/examples/TrailLogSummary.flow.ts +0 -75
  148. package/skills/uipath-maestro-flow/examples/WorkshopInventory.flow.ts +0 -27
  149. package/skills/uipath-maestro-flow/examples/bindings.json +0 -85
  150. package/skills/uipath-maestro-flow/references/CLI-LOOP.md +0 -309
  151. package/skills/uipath-maestro-flow/references/agent-resources.md +0 -74
  152. package/skills/uipath-maestro-flow/references/agent.md +0 -175
  153. package/skills/uipath-maestro-flow/references/agentic-process.md +0 -41
  154. package/skills/uipath-maestro-flow/references/api-workflow.md +0 -29
  155. package/skills/uipath-maestro-flow/references/author.md +0 -178
  156. package/skills/uipath-maestro-flow/references/batch-transform.md +0 -23
  157. package/skills/uipath-maestro-flow/references/bindings.md +0 -178
  158. package/skills/uipath-maestro-flow/references/branch.md +0 -18
  159. package/skills/uipath-maestro-flow/references/brownfield.md +0 -152
  160. package/skills/uipath-maestro-flow/references/connector-params.md +0 -624
  161. package/skills/uipath-maestro-flow/references/conversational.md +0 -77
  162. package/skills/uipath-maestro-flow/references/data-fabric.md +0 -268
  163. package/skills/uipath-maestro-flow/references/delay.md +0 -26
  164. package/skills/uipath-maestro-flow/references/diagnose.md +0 -141
  165. package/skills/uipath-maestro-flow/references/document-pipeline.md +0 -47
  166. package/skills/uipath-maestro-flow/references/error-handling.md +0 -75
  167. package/skills/uipath-maestro-flow/references/evaluate.md +0 -168
  168. package/skills/uipath-maestro-flow/references/event-trigger.md +0 -155
  169. package/skills/uipath-maestro-flow/references/form-trigger.md +0 -41
  170. package/skills/uipath-maestro-flow/references/hitl.md +0 -169
  171. package/skills/uipath-maestro-flow/references/http.md +0 -105
  172. package/skills/uipath-maestro-flow/references/inline-agent.md +0 -132
  173. package/skills/uipath-maestro-flow/references/ixp.md +0 -167
  174. package/skills/uipath-maestro-flow/references/loops.md +0 -77
  175. package/skills/uipath-maestro-flow/references/manual-trigger.md +0 -39
  176. package/skills/uipath-maestro-flow/references/operate.md +0 -204
  177. package/skills/uipath-maestro-flow/references/or-processes.md +0 -91
  178. package/skills/uipath-maestro-flow/references/parallel-merge.md +0 -21
  179. package/skills/uipath-maestro-flow/references/placeholder.md +0 -70
  180. package/skills/uipath-maestro-flow/references/published-function.md +0 -66
  181. package/skills/uipath-maestro-flow/references/queue.md +0 -53
  182. package/skills/uipath-maestro-flow/references/return.md +0 -20
  183. package/skills/uipath-maestro-flow/references/rpa-workflow.md +0 -27
  184. package/skills/uipath-maestro-flow/references/scheduled-trigger.md +0 -34
  185. package/skills/uipath-maestro-flow/references/script.md +0 -52
  186. package/skills/uipath-maestro-flow/references/subflow.md +0 -33
  187. package/skills/uipath-maestro-flow/references/summarize.md +0 -20
  188. package/skills/uipath-maestro-flow/references/switch.md +0 -20
  189. package/skills/uipath-maestro-flow/references/terminate.md +0 -22
  190. package/skills/uipath-maestro-flow/references/transform.md +0 -32
  191. package/skills/uipath-maestro-flow/references/voice.md +0 -70
@@ -1,913 +1,96 @@
1
1
  ---
2
2
  name: uipath-maestro-flow
3
- description: "TRIGGER for `.flow` / `.flow.ts` files and UiPath Flow / Maestro Flow / Maestro Automate requests: build, edit, run, debug, fix, or evaluate a flow. Author with the TypeScript builder SDK (`@uipath/maestro-builder-sdk`): nodes, triggers, schedules, connectors, IXP document extraction (add or list IXP models), inline agents, HITL, chat/voice flows, bindings, brownfield edits, and the check/compile/validate loop. Operate: upload, publish, deploy, debug a real run, trigger a process, job status/traces, pause/resume/cancel/retry an instance. Diagnose: faulted runs, incidents, runtime variables, why validate passed but the run failed. Evaluate: eval sets, evaluators, simulations, eval runs. Case plans (`caseplan.json`) → uipath-maestro-case; BPMN (`.bpmn`, `.bpmn.ts`) → uipath-maestro-bpmn. DO NOT TRIGGER for raw IXP labelling or prompt tuning outside a Flow → uipath-ixp; standalone agents → uipath-agents; C#/XAML → uipath-rpa."
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
- # UiPath Flow — TypeScript Builder SDK
7
+ # Reasoning budget
9
8
 
10
- UiPath Flow orchestrations can be authored in TypeScript using the `@uipath/maestro-builder-sdk` package.
11
- The SDK provides a builder API to construct a Flow graph, allowing developers to define inputs, outputs, steps, and control flow in a type-safe manner.
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
- ## Project layout
12
+ # Working style
16
13
 
17
- `@uipath/maestro-builder-sdk` is installed globally (`npm install -g`); `examples/` contains authored examples, and `references/` contains the details routed from this guide.
18
- A Flow is authored as `.flow-sdk/<Name>.flow.ts` inside its project folder `<Solution>/<Name>/`, and it imports the package directly.
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
- **Authoring files live in `.flow-sdk/`; the compiled artifact does not.**
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
- ```bash
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
- Do not hand-write the skeleton.
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
- An existing project needs no `init`: skip the first two commands and seed from the `.flow` that is already there with `( cd <Solution>/<Name> && uip maestro flow decompile <Name>.flow -o .flow-sdk/<Name>.flow.ts --no-pipeline )` (`--no-pipeline` skips the brownfield helper, [`references/brownfield.md`](references/brownfield.md)).
42
- Exactly one emitted `<Name>.flow` may exist, at `<Solution>/<Name>/<Name>.flow`, and never a second copy at the workspace root — validators and evidence collectors cannot choose safely between duplicates.
43
- Emitting to the root is correct only for the packaged-SDK local gates, which never scaffold a project; pick the loop first ([`references/CLI-LOOP.md`](references/CLI-LOOP.md)) and do not mix the two.
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
- **Install the SDK first, once per machine:** `npm install -g @uipath/maestro-builder-sdk`; skip it when already installed, and see [`references/CLI-LOOP.md`](references/CLI-LOOP.md#installing-the-package) for the checks and failure handling.
37
+ ## Capability router
46
38
 
47
- Integrations with non-UiPath systems are handled through connectors. **Choose the node before writing it.** For an external service or data (weather, Slack, a REST API), run `uip maestro registry search '<brand or service name>'` over the local connector library, unless the request names the transport itself ("over HTTP, not a connector" means `http()`): a hit is a connector, `"total": 0` is a miss and means `http()`, and a usage error means the library is not cached, so run `uip maestro registry pull` first. For document extraction or another tenant capability (agent, process), which that library does not hold, run the family's `uip maestro flow registry search` ([`references/ixp.md`](references/ixp.md), [`references/agent.md`](references/agent.md)). A `script()` returning fixed values is never a stand-in for that step, and `mock()` only marks a capability the search proved absent.
48
- Connectors require [`.flow-sdk/bindings.json`](references/bindings.md).
49
- `uip maestro registry pull` writes a descriptor per referenced connector to `.flow-sdk/connectors/<key>.ts`, and caches the library itself outside the project.
50
- Prepared connector modules live at `.flow-sdk/connectors-local/<key>.ts`; their descriptor data is kept separately below `.flow-sdk/connectors-local/descriptors/<key>/`.
51
- Because the source sits in `.flow-sdk/` too, it imports them as `./connectors/<key>.ts` and `./connectors-local/<key>.ts`.
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
- ### The connector loop: author → check → prepare → check → compile
53
+ ## Critical rules (universal)
54
54
 
55
- Authoring never waits on `prepare`: once the search above has chosen the node, no further discovery command precedes the source.
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
- The gate this replaces still holds for schema-dynamic operations (`loadByDefault`, dependent dropdowns, `customFieldsRequestDetails`): the static library descriptor is not sufficient there, and the prepare that check names — with every required `-f NAME=VALUE` — is what creates the design-time schema-replay cache.
62
- Do not substitute manual `resources run list` lookups plus a static `./connectors/<key>.ts` import: the lookups choose values but do not create that cache.
63
- After compiling, inspect the emitted connector configuration.
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
- ### Hello world Flow
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
- ```ts
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
- A script is a first-class Flow node; it runs inline JavaScript and returns a value.
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
- ## Lifecycle
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
- The `uip maestro flow` commands keep source checks, emission, and compiled-artifact checks explicit while the installed `@uipath/maestro-builder-sdk` owns their semantics. A workspace with `{ "flowSdk": { "emitOnly": true } }` in a `package.json`, or `FLOW_SDK_EMIT_ONLY=1`, makes `uip maestro flow compile` emit-only and makes both `flow check` modes refuse. Product validate owns final structural verification in that mode; use product debug only when the node family and the requested evidence support it.
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
- **Run the correct loop for your packaging mode: [`references/CLI-LOOP.md`](references/CLI-LOOP.md)**.
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
- ## Editing an existing flow
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
- In brownfield work, preserve the supplied source, step names, and unaffected wiring. Insert a step by moving the old edge through it, not by creating a second path. If only emitted `.flow` JSON exists, decompile it, compile the pristine baseline, edit narrowly, and merge the delta back into the original.
89
- These are before/after judgments; no final-artifact checker can prove them.
83
+ ## Anti-patterns (universal)
90
84
 
91
- For a narrow edit, `decompile` writes `.flow-sdk/<Name>.pipeline.mjs`, which runs the loop in two invocations and gets the baseline ordering right. It keeps its baseline, edited and merged `.flow` files in `.flow-sdk/` too:
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
- ```bash
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.