@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,168 +0,0 @@
1
- # Evaluate — evaluators, eval sets, simulations, runs
2
-
3
- Evaluators, eval sets, data points and simulations are project assets managed by
4
- `uip maestro flow eval`; defining an `inlineAgent(...)` node does not create
5
- them. Use this when the request asks for evaluation assets, or for a flow to be
6
- evaluated.
7
-
8
- Every `eval` command takes `--path <project-dir>` — the directory holding
9
- `project.uiproj`.
10
-
11
- **Local `add` / `list` / `remove` edit project files and need no login.**
12
- Starting a run does — `uip login` first, and it needs a matching solution in
13
- Studio Web.
14
-
15
- Probe the installed CLI once, then let it write the JSON formats and generated
16
- file references rather than hand-authoring them:
17
-
18
- ```bash
19
- uip maestro flow eval --help --output json
20
- ```
21
-
22
- ## Evaluators — how an output is scored
23
-
24
- ```bash
25
- uip maestro flow eval evaluator add response-quality \
26
- --type llm-judge-output \
27
- --model gpt-4.1-2025-04-14 \
28
- --description "Score the response against the expected result" \
29
- --target-key '*' \
30
- --path ./MySolution/MyFlow --output json
31
-
32
- uip maestro flow eval evaluator list --path ./MySolution/MyFlow --output json
33
- uip maestro flow eval evaluator remove <id> --path ./MySolution/MyFlow --output json
34
- ```
35
-
36
- `llm-judge-output` produces
37
- `evaluatorTypeId: "uipath-llm-judge-output-semantic-similarity"`. Always pin a
38
- model for an LLM judge. For deterministic values prefer `exact-match`,
39
- `json-similarity`, or `contains` — a judge on a value that can simply be
40
- compared is variance for nothing.
41
-
42
- ## Evals and eval sets
43
-
44
- ```bash
45
- uip maestro flow eval set add "Smoke Tests" \
46
- --entry-point start \
47
- --path ./MySolution/MyFlow --output json
48
-
49
- uip maestro flow eval add "basic case" \
50
- --set "Smoke Tests" \
51
- --inputs '{"request":"hello"}' \
52
- --expected '{"reply":"hello"}' \
53
- --path ./MySolution/MyFlow --output json
54
-
55
- uip maestro flow eval list --set "Smoke Tests" --path ./MySolution/MyFlow --output json
56
- uip maestro flow eval remove <id> --set "Smoke Tests" --path ./MySolution/MyFlow --output json
57
- uip maestro flow eval set list --path ./MySolution/MyFlow --output json
58
- uip maestro flow eval set remove <id> --path ./MySolution/MyFlow --output json
59
- ```
60
-
61
- Almost everything is addressed **through its set**. `--set` is required on
62
- `eval list` and `eval remove`, on all three `simulation` commands, and on every
63
- `run` verb including `status` and `results`; omitting it fails with
64
- `required option '--set <name>' not specified` before anything runs. Only the
65
- `set` commands themselves and the evaluator commands do without it.
66
-
67
- Use the generated evaluator id or filename when explicitly passing
68
- `--evaluators`; a display name alone is not a stable reference. Omitting the
69
- flag on `eval set add` links all evaluators that currently exist.
70
-
71
- A data point's input keys must match the flow's declared inputs. Declare them
72
- with `.input({ … })` in the source and compile before `eval add`: it reads them
73
- from the compiled `.flow`, so an input missing there fails with `Input "<name>"
74
- is not declared as an input variable in the flow`. Do not add inputs with
75
- `uip maestro flow variable add` — the next `compile -o` rewrites the `.flow`
76
- from the source, so the CLI edit either disappears or collides with the compiled
77
- input (`Variable '<name>' already exists`). To confirm what the compiled flow
78
- declares, pass the `.flow` file itself; `variable` takes no `--path`:
79
-
80
- ```bash
81
- uip maestro flow variable list ./MySolution/MyFlow/MyFlow.flow --output json
82
- ```
83
-
84
- Build expected outputs from real records rather than invented ones, for the same
85
- reason a debug run needs real inputs: an invented key matches no record, and the
86
- eval scores a fault instead of an answer.
87
-
88
- ## Simulations — stop an eval from really sending
89
-
90
- A simulation stands in for a component during a run, keyed by component id: the
91
- step id from the source, or the tool name for an inline agent's tool. A
92
- simulation is scoped to one **data point inside one set**, not to the project,
93
- so all three commands require `--set` and `--data-point`. `add` also requires
94
- `--strategy`: `Static` returns `--mock-value` verbatim, `Llm` generates a
95
- response from `--simulation-instructions`. And it requires `--component-type`
96
- naming what the component is — `connector`, `agent`, `subflow` — unless
97
- `--parent <agent-id>` adds a child tool simulation, which defaults it to `Node`.
98
-
99
- ```bash
100
- uip maestro flow eval simulation add <component-id> \
101
- --set "Smoke Tests" --data-point <id> \
102
- --strategy Static --component-type connector --mock-value '{"ok":true}' \
103
- --path ./MySolution/MyFlow --output json
104
-
105
- uip maestro flow eval simulation list \
106
- --set "Smoke Tests" --data-point <id> --path ./MySolution/MyFlow --output json
107
- uip maestro flow eval simulation remove <component-id> \
108
- --set "Smoke Tests" --data-point <id> --path ./MySolution/MyFlow --output json
109
- ```
110
-
111
- Simulate every side-effecting component before running a set more than once. An
112
- unsimulated connector step really sends — once per eval, every run.
113
-
114
- ## Running a set
115
-
116
- ```bash
117
- uip maestro flow eval run start --set "Smoke Tests" --path ./MySolution/MyFlow --output json
118
- uip maestro flow eval run status <evalSetRunId> --set "Smoke Tests" --path ./MySolution/MyFlow --output json
119
- uip maestro flow eval run results <evalSetRunId> --set "Smoke Tests" --path ./MySolution/MyFlow --output json
120
- uip maestro flow eval run list --set "Smoke Tests" --path ./MySolution/MyFlow --output json
121
- uip maestro flow eval run compare <evalSetRunId> --compare-to <evalSetRunId> \
122
- --set "Smoke Tests" --path ./MySolution/MyFlow --output json
123
- ```
124
-
125
- `run start` returns an `evalSetRunId` and does not block. Poll `run status`
126
- until it settles, then read `run results`. `run compare` puts a run against a
127
- previous one — it takes both ids, the subject and `--compare-to` — which is how
128
- a prompt or guidance change is shown to have helped rather than asserted to
129
- have.
130
-
131
- ## Never upload as part of an eval workflow
132
-
133
- **Never run `uip solution upload` automatically here. Always ask first.**
134
-
135
- `eval run start` needs the solution in Studio Web, and when it cannot resolve
136
- one it fails with `solution-id could not be resolved` or a variant. That error
137
- is not licence to upload.
138
-
139
- `uip solution upload` writes to Studio Web: it creates, or **overwrites**, the
140
- solution matching the local `.uipx` `SolutionId`. No flag is needed and no
141
- prompt is raised. Three ways that costs someone real work:
142
-
143
- 1. The user is iterating locally and meant to test *before* publishing. Upload
144
- pushes work in progress to where teammates and triggers pick it up.
145
- 2. The user pulled the solution with `uip solution download` to change one
146
- piece. Upload sends partial local state back over whatever else moved.
147
- 3. Local and Studio Web have diverged. Upload discards the remote side —
148
- nothing is merged.
149
-
150
- The overwrite is recorded as a restorable version unless `--no-snapshot` was
151
- passed, but recovery is browser-only, after the fact, by the user, and it does
152
- not undo case 1. Ask, and offer the two real options: upload now with the user's
153
- acknowledgement, or pass `--solution-id` and `--project-id` for an existing
154
- Studio Web solution and plumb them through to `eval run start`.
155
-
156
- ## Confirm what was written
157
-
158
- After authoring, list the evaluator and the eval set and read the generated
159
- JSON. Confirm the evaluator carries the requested `evaluatorTypeId`, the set
160
- contains its generated file reference, and the entry point matches the flow.
161
-
162
- ## Evidence boundary
163
-
164
- A score is evidence about this flow's output on these inputs under these
165
- evaluators. It is not evidence the flow is correct, and an `llm-judge-output`
166
- score carries a model's variance — one run moving a point or two is noise.
167
- Compare runs rather than reading one, and name the eval set and the evaluator
168
- behind any number reported.
@@ -1,155 +0,0 @@
1
- # Connector Events
2
-
3
- *Exact signatures, fields, and defaults: `onEvent()`, `waitForEvent()`.*
4
-
5
- The same subscription can start a Flow or pause an already-running path.
6
-
7
- Signatures:
8
-
9
- - `.trigger(onEvent({ connector, event, where?, filters?, connection, folder, version? }))`
10
- - `.step(name, waitForEvent({ connector, event, where?, filters?, connection, folder, version? }))`
11
- - both also accept a generated trigger descriptor plus options.
12
-
13
- ```ts
14
- .step('reply', waitForEvent({
15
- connector: 'uipath-microsoft-outlook365', event: 'email-received',
16
- where: { parentFolderId: inboxId },
17
- filters: [{ field: 'subject', contains: 'Approval' }],
18
- connection: 'outlook', folder: 'shared',
19
- }))
20
- ```
21
-
22
- `connection` and `folder` are bindings.json labels, and both are required: without
23
- them the node compiles to `connectionId: null`, which `uip maestro flow validate`
24
- refuses, so `check` reports `BINDING_MISSING` first.
25
-
26
- ## Tenant discovery — `check` names it, `prepare` does it
27
-
28
- Event parameters and their ids are connection-specific. Author the
29
- subscription first — an id-valued parameter as a `lookup()` token, never a
30
- pasted id — and one `prepare` discharges everything `check` names:
31
-
32
- ```ts
33
- .trigger(onEvent({
34
- connector: 'uipath-microsoft-outlook365', event: 'email-received',
35
- where: {
36
- parentFolderId: lookup({ connector: 'uipath-microsoft-outlook365', event: 'email-received' },
37
- 'parentFolderId').by('displayName', 'Inbox'),
38
- },
39
- filters: [{ field: 'subject', contains: 'Approval' }],
40
- connection: 'outlook', folder: 'shared',
41
- }))
42
- ```
43
-
44
- ```bash
45
- uip maestro registry prepare uipath-microsoft-outlook365 email-received \
46
- --resolve parentFolderId:displayName=Inbox
47
- ```
48
-
49
- That one command replaces the old manual sequence end to end: it discovers the
50
- connection and writes both `bindings.json` entries (connection id AND folder
51
- key — the same stage a connector-action prepare runs), fetches the event's
52
- connection-scoped definition, records the object decision for a generic event
53
- (`--object <name>`, the same matching ladder actions use), stores the
54
- where/filter vocabulary in `.flow-sdk/connectors-local/` so `check` works offline, and
55
- records each `--resolve` in `resolutions.json` for `compile` to substitute.
56
- `check` then validates every `where` key and every `filters[].field` against
57
- the prepared vocabulary — an unknown filter leaf is an ERROR
58
- (`EVENT_FILTER_UNKNOWN_FIELD`), because the platform silently drops it and the
59
- deployed trigger fires on events the filter should exclude.
60
-
61
- Two facts prepare surfaces before they can hurt: an event object that requires
62
- a BYOA (bring-your-own-app) connection is refused with the connections that
63
- would work, instead of faulting at runtime with an unrelated webhook error;
64
- and a `webhooks`-mode event prints the URL-registration step — it cannot be
65
- debugged locally, so deploy to test it.
66
-
67
- Do not run `uip is triggers objects` / `triggers describe` /
68
- `resources run list` by hand and paste ids into `where`: prepare runs the same
69
- calls deterministically, and a pasted id is meaningless in review and wrong
70
- after a connection move.
71
- Before finishing, inspect the emitted node's `inputs.detail.eventParameters`
72
- and confirm it contains the selected id and the connection/folder bindings refer
73
- to the same connection used for discovery.
74
-
75
- `contains` uses case-sensitive substring matching, so preserve scenario casing.
76
- If a known tenant event is absent after refreshing the registry/cache, report a
77
- cache-generation gap instead of inventing a node type, binding, or field. Do
78
- not patch a prebuilt sample/cache entry to make the missing event appear.
79
-
80
- ## Generic events: name the object
81
-
82
- Most connectors expose their record events generically — `record-created`,
83
- `record-updated` (Data Fabric, Salesforce, ServiceNow, Jira, Dynamics, …).
84
- One node type covers every object of the connection, so the subscription must
85
- say which one with `object`. It is not an event parameter: these operations
86
- take none, so `where` stays empty and `check` refuses a subscription that
87
- omits `object` (`EVENT_GENERIC_NO_OBJECT`) or puts the object in `where`.
88
-
89
- ```ts
90
- import { RecordCreated, RecordUpdated } from './connectors/uipath-uipath-dataservice.ts';
91
-
92
- // Start when a ContractRegistry record is created with dueDate before 2026-08-04.
93
- .trigger(onEvent(RecordCreated, {
94
- object: 'ContractRegistry',
95
- filters: [{ field: 'dueDate', lessThan: '2026-08-04' }],
96
- connection: 'dataFabric', folder: 'shared',
97
- }))
98
-
99
- // Pause until a FileUploadVerify_20260618 record is updated.
100
- .step('updated', waitForEvent(RecordUpdated, {
101
- object: 'FileUploadVerify_20260618', connection: 'dataFabric', folder: 'shared',
102
- }))
103
- ```
104
-
105
- The objects come from the bound connection, never from a guess:
106
-
107
- ```bash
108
- uip is triggers objects uipath-uipath-dataservice CREATED --connection-id <id> --output json
109
- ```
110
-
111
- The emitted node carries the object as `inputs.detail.objectName` (and inside
112
- `configuration`), its event as `eventType`, and the platform-declared
113
- `eventMode`. A curated event (Outlook `email-received`, OneDrive `file-created`)
114
- has its object built in — passing `object` there is an error.
115
-
116
- ## Filter operators
117
-
118
- A filter is `{ field, <operator>: value }` with exactly one operator. The
119
- vocabulary is the designer's, and each form compiles to the same
120
- `filterExpression` the canvas would write:
121
-
122
- | Operator | Value | Emitted expression |
123
- |---|---|---|
124
- | `contains`, `startsWith`, `endsWith` | text | `contains(subject,'Invoice')` |
125
- | `equals`, `notEquals` | text, number or boolean | `status=='open'`, ``priority==`3` `` |
126
- | `lessThan`, `lessThanOrEqual`, `greaterThan`, `greaterThanOrEqual` | number, or an ISO date string | ``priority>`3` ``, `to_number(dueDate)<to_number('2026-08-04')` |
127
-
128
- Ordering a plain string is refused (`EVENT_FILTER_BAD_VALUE`): JMESPath
129
- compares numbers only, so the subscription would match nothing. Write the
130
- value as a number or an ISO-8601 date, or use a text operator.
131
-
132
- ## Evidence boundary
133
-
134
- A local start-trigger run injects a payload; it does not fire a subscription.
135
- For a wait, seed both matching and nonmatching payloads to establish routing.
136
- Only a platform event occurrence proves the connection, scope, and subscription
137
- actually receive the intended event.
138
-
139
- ## Completion contract
140
-
141
- Unless the request explicitly requires a live subscription witness, a
142
- connector-event start is done after the last edit when both of these facts hold:
143
-
144
- - `uip maestro flow validate` returns `Valid` for the emitted Flow.
145
- - The emitted `.flow` carries the intended start-trigger type, scope/filter inputs,
146
- bindings, and downstream edges.
147
-
148
- At most one bounded direct-input debug may be used to answer a downstream
149
- behavior question; stop when it answers that question. It is not subscription
150
- proof. Do not poll or sleep on debug instances, create a scratch solution, or
151
- upload seed content solely to manufacture a trigger event.
152
-
153
- When the stated acceptance bar does require live delivery, cause one real
154
- platform event and record that witness once. If the environment cannot provide
155
- it, report that boundary instead of substituting repeated debug launches.
@@ -1,41 +0,0 @@
1
- # Form trigger
2
-
3
- *Exact signatures, fields, and defaults: `formTrigger()`.*
4
-
5
- A person starts the flow by submitting a form (`core.trigger.form`). The
6
- submitted values ARE the flow's inputs — read them exactly like any other
7
- input (`input('name')` / `$vars.start.output.name`).
8
-
9
- Signature: `.trigger(formTrigger())` — the factory takes no arguments.
10
-
11
- ```ts
12
- export default flow('expense-request')
13
- .input({
14
- invoiceAmount: types.number,
15
- reason: types.string,
16
- urgent: { type: types.boolean, default: false },
17
- })
18
- .trigger(formTrigger())
19
- .step('assess', script({ code: 'return $vars.start.output.invoiceAmount > 500;' }))
20
- .return({})
21
- .build();
22
- ```
23
-
24
- ## The derived schema
25
-
26
- The form's fields are derived from `.input()` at compile time, the same rule
27
- the designer applies to a flow's arguments: one field per input, the field id
28
- IS the input's name (so submitted values line up by name), the label is the
29
- name sentence-cased (`invoiceAmount` → "Invoice amount"), the field type
30
- follows the input's type, and a field is **required exactly when its input
31
- declares no default**. There is nothing to author on the trigger itself —
32
- shape the form by shaping the inputs.
33
-
34
- `check` warns (`FORM_TRIGGER_NO_INPUTS`) when the flow declares no inputs: the
35
- person would get an empty form with only a submit button.
36
-
37
- ## Evidence boundary
38
-
39
- No local rung renders a form — `--input` supplies the values locally, so a
40
- green ladder proves the trigger type, the derived schema, and that the graph
41
- runs. A person actually seeing and submitting the form is platform evidence.
@@ -1,169 +0,0 @@
1
- # Human-in-the-Loop
2
-
3
- *Exact signatures, fields, and defaults: `hitl()`.*
4
-
5
- Pause a Flow for a person using the default inline form, the quick-form node
6
- type, a deployed Action App, or a document-validation station.
7
-
8
- Signature:
9
- `hitl({ variant?: 'quick-form' | 'action-app' | 'document-validation', app?,
10
- document?, title?, priority?, labels?, recipient?, fields?, outcomes,
11
- outcomePorts?, exposeError? })`.
12
-
13
- ```ts
14
- .var('status', types.string)
15
- .stepSwitch('review', hitl({ title: 'Review invoice',
16
- fields: [{ id: 'comment', type: 'text', direction: 'output' }],
17
- outcomes: ['Approve', 'Reject'] }), [
18
- { value: 'Approve', body: (b) => b.step('pay', script({ … }), { updates: { status: lit('approved') } }) },
19
- { value: 'Reject', body: (b) => b.step('notify', script({ … }), { updates: { status: lit('rejected') } }) },
20
- ])
21
- .return({ status: v('status') })
22
- ```
23
-
24
- Every outcome is its own exit, `outcome-<slug>`. On the default node, more than
25
- one outcome routes per outcome by itself — there is no flag to remember and no
26
- decision node in the middle. On quick-form, with `outcomePorts: false`, or with a
27
- pinned `{ version }`, a plain `.step()` after the task continues EVERY outcome to
28
- the next step instead, each on its own edge.
29
-
30
- `.stepSwitch` is how you route them: one arm per outcome, none of them the tacit
31
- next step. It works on the default node, on quick-form and on a pinned task.
32
- Arms behave like `.switch()`'s — one that ends in `.return()` is terminal, and one
33
- that does not CONVERGES, so the step after the `.stepSwitch` fans in from every
34
- arm that reaches it.
35
- That is what makes the single `.return()` above correct, and what a flow VARIABLE
36
- is for: each arm assigns it with `{ updates }` and the one return reads it, instead
37
- of the return having to work out which arm ran.
38
-
39
- ## Delivery, fields, and routing
40
-
41
- - `recipient` is `{ channels?, assignee: { type, value? }, connections? }` —
42
- channels are `'Slack' | 'teams' | 'Email' | 'ActionCenter'` (Teams really is
43
- the lowercase `'teams'`); assignee types are `user`, `group`, `staticEmail`,
44
- `staticGroupName`, `workload`, `roundRobin`, `custom`. Omit the whole object
45
- for the platform default (Email + Action Center, assigned to a group).
46
- - `labels` is one comma-separated string, shown in Action Center.
47
- - A field's `direction` is `'input'` (shown), `'output'` (asked), or `'inOut'`
48
- (pre-filled AND editable — give it a `value`; the reviewed value comes back
49
- at the field's own id).
50
- - **Every outcome is its own exit — the SDK never emits `completed` on a task
51
- that has outcomes.** Each outcome gets `outcome-<slug>` (the name lowercased,
52
- non-alphanumerics to `-`). This holds on the default node and on quick-form,
53
- at every definition version, because it is what the designer draws: it derives
54
- one handle per entry in `inputs.schema.outcomes` and shows the manifest's
55
- `completed` placeholder only when there are none (flow-workbench,
56
- `getEffectiveHitlHandleCustomization`). A `completed` edge on a task with
57
- outcomes is stale: Studio Web and the converter remap it to the PRIMARY
58
- outcome, so every other outcome loses its path. `check` refuses it
59
- (HITL_COMPLETED_PORT_GONE). `exposeError: true` additionally exposes
60
- `out('<step>', 'error')` and selects the 1.2 definition (default node only).
61
-
62
- **Every outcome must be wired**, and there are three ways. Prefer the first:
63
-
64
- | | |
65
- | --- | --- |
66
- | `.stepSwitch(name, hitl({…}), arms)` | one arm per outcome, `value` naming the outcome. No tacit exit, arms converge, and a missing arm is a warning (STEP_SWITCH_EXIT_UNROUTED) rather than a port with no edge. |
67
- | `.step()` + `.stepToList('outcome-<slug>', …)`, on a task that routes per outcome | the FIRST outcome continues the main path and the rest are side arms. Those arms do NOT converge — each gets an End of its own. |
68
- | `.step()`, on a task that does not route per outcome | every outcome continues to the next step, each on its own edge. The decision reaches the flow as data: `out('<step>', 'Action')`. |
69
-
70
- Do not route the FIRST outcome with `.stepToList`: its port is already taken by
71
- the main path (flow-builder-sdk#741). After a task that does not route per
72
- outcome EVERY outcome port is taken, so `.stepToList('outcome-…')` there is
73
- refused (HITL_OUTCOME_PORTS_OFF) — use `.stepSwitch`, or `outcomePorts: true`.
74
-
75
- **So `.step()` means one of two things.** After a task that routes per outcome,
76
- the FIRST outcome continues and the others need routes. After any other task,
77
- every outcome continues. For example, `hitl({ variant: 'quick-form', outcomes:
78
- ['Approve', 'Reject'] })` followed by `.step('log', …)` emits
79
- `outcome-approve → log` and `outcome-reject → log`.
80
-
81
- A default-node task with more than one outcome routes per outcome, on its 1.1
82
- definition. Five things make `.step()` continue every outcome instead, and only
83
- these:
84
-
85
- | | `.step()` continues every outcome because |
86
- | --- | --- |
87
- | `outcomePorts: false` | you asked for it: the decision is wanted as data |
88
- | `variant: 'quick-form'` | that is quick-form's default. `outcomePorts: true` or `.stepSwitch` route it per outcome, and its version stays 1.0 |
89
- | `{ version: '1.0' }` | an explicit pin wins, which keeps `decompile` → `compile` exact on a deployed flow. `outcomePorts: true` with the pin routes per outcome on the 1.0 node |
90
- | one outcome | an acknowledgement, not a choice |
91
- | every outcome `action: 'End'` | each outcome gets its own End, so nothing may follow the task except a `.return()` (HITL_UNREACHABLE_AFTER) |
92
-
93
- An `action: 'End'` outcome in that fan-out goes to an End node of its own
94
- instead of into the next step, or joins the `.return()` when that is the next
95
- step. The flow runtime never reads `action`, so only the graph can end the run
96
- on that outcome.
97
-
98
- Inside a `.parallel()` arm, such a task must not be the arm's last step, and
99
- none of its outcomes may be `action: 'End'`. The join waits for a token on
100
- every incoming edge, and only one outcome fires, so the run would never get
101
- past it.
102
- `check` refuses both (HITL_FAN_OUT_INTO_JOIN, HITL_END_OUTCOME_IN_PARALLEL).
103
- Add a step after the task inside the arm, for example
104
- `a.step('review', hitl(…)).step('record', …)`: every outcome continues to
105
- `record`, and only `record` reaches the join. `.stepSwitch` does not help
106
- here, because its arms rejoin at the same join. A `.stepSwitch` on a task
107
- inside an arm needs the same step after it: with an empty `Approve` arm and a
108
- `Reject` arm that runs `rej`, the arm would end on two paths (the `Approve`
109
- outcome edge and `rej`), and `check` refuses that too
110
- (HITL_FAN_OUT_INTO_JOIN). Write `a.stepSwitch('review', …).step('record', …)`.
111
- That `.stepSwitch` also needs an arm for every outcome, and no arm may end in
112
- `.return()`: either one sends that outcome's path to an End inside the arm,
113
- so the join waits forever for the arm's other path, and `check` refuses it
114
- (HITL_END_OUTCOME_IN_PARALLEL). Put the `.return()` after the `.parallel()`.
115
-
116
- The action-app and document-validation variants are different: their outcomes
117
- live in the app, `completed` is the only handle the designer draws for them,
118
- and `.step()` leaves on it. Route on `out('<step>', 'Action')` downstream.
119
-
120
- **Why routing is the default.** An approve/reject task whose outcomes all lead
121
- to one place compiles and `flow validate` answers `Valid`, so the mistake
122
- surfaced at runtime or in a grader (flow-builder-sdk#735). A warning was not
123
- enough — #739 measured it firing three times while the unreachable artifact
124
- shipped anyway — so the shape changed instead of the advice. `check` still
125
- warns `HITL_OUTCOMES_UNREACHABLE` where every outcome continues to one step and
126
- nothing reads `out('<step>', 'Action')`.
127
-
128
- **Route EVERY outcome.** With `.stepToList`, an unrouted one deploys and then
129
- stalls the run when the reviewer picks it (`check` warns
130
- HITL_OUTCOME_UNROUTED). With `.stepSwitch` it compiles to an End instead, so
131
- the run finishes rather than hanging — but finishes without the flow's declared
132
- outputs, which STEP_SWITCH_EXIT_UNROUTED says out loud. Inside a `.parallel()`
133
- arm that End would hang the join instead, so there it is refused
134
- (HITL_END_OUTCOME_IN_PARALLEL). `action: 'End'` changes
135
- what happens on that outcome (the run ends instead of stalling), not whether
136
- its handle needs an edge.
137
-
138
- **What `flow validate` checks.** It holds an `outcome-<id>` edge to the node's
139
- declared outcomes: one naming a real outcome passes on every version (so
140
- per-outcome wiring passes on 1.0 and on quick-form), and one naming no outcome
141
- is refused — *Edge references undeclared source handle "outcome-nope"*. On a
142
- 1.1/1.2 node it also refuses `completed`. It does NOT refuse `completed` on a
143
- 1.0 or quick-form node that has outcomes, which is why `check` and the SDK do.
144
-
145
- **The decision as data** — `.step()` then `.switch()` on
146
- `out('<step>', 'Action')` — still works: every outcome reaches the switch on
147
- its own edge, and the switch routes. Ask for it deliberately (quick-form, or
148
- `outcomePorts: false` on the default node); the reason is that the decision is
149
- wanted as DATA — recorded in an output, compared in one place. Every outcome
150
- continuing to one step with nothing reading `Action` is the unreachable-outcomes
151
- case above, not a third shape.
152
- - `variant: 'document-validation'` takes `document: { extractionResult,
153
- storageBucket?, documentId?, render?, taxonomy? }` and no `fields`; bind
154
- `extractionResult` to the upstream extract step's `ExtractionResult`.
155
- `render: 'custom'` requires `taxonomy` (and takes `app`).
156
-
157
- ## Variant judgment
158
-
159
- Use the node variant explicitly named by the scenario. The default and
160
- quick-form variants own their fields in the Flow; action-app delegates the form
161
- to an already-deployed app. For an app task, resolve the app key, name, folder,
162
- and argument names from the same tenant resource.
163
-
164
- ## Evidence boundary
165
-
166
- Offline execution scripts the selected action and output fields. It proves
167
- wiring and downstream routing, not that a real task appeared or that a person
168
- participated. Live evidence should preserve the Action Center task identity,
169
- the human-selected outcome, supplied answers, and the path that resumed.
@@ -1,105 +0,0 @@
1
- # HTTP
2
-
3
- *Exact signatures, fields, and defaults: `http()`.*
4
-
5
- The one factory selects two distinct product nodes:
6
-
7
- - standalone: `http({ managed: false, ... })`, non-2xx responses stay on the
8
- success output with `statusCode`;
9
- - managed: `http({ managed: true, ... })`, non-2xx responses take the error
10
- path.
11
-
12
- Signature:
13
- `http({ method?, url, managed, connection?, folder?, targetConnector?, headers?, query?, body?, contentType?, timeout?, retryCount?, returns? })`.
14
-
15
- ```ts
16
- .step('policy', http({ method: 'GET', url: policyUrl,
17
- managed: true, returns: { limit: 'number' } }))
18
- .step('read', script({
19
- code: 'return $vars.policy.output.body.limit;' }))
20
- ```
21
-
22
- ## Choosing the node
23
-
24
- Match the product node named by the scenario. “Managed HTTP Request,” “HTTP
25
- Request node,” and `core.action.http.v2` select managed; “standalone” and
26
- `core.action.http` select standalone. Authentication needs or the desire for an
27
- error handler are not substitutes for that intent.
28
-
29
- Live product evidence shows that both nodes expose an `application/json` body as
30
- a parsed value. Declare its top-level fields with `returns` and read them
31
- directly; do not apply `JSON.parse` to a body declared by `returns`. A non-JSON
32
- body remains opaque unless its live media type establishes a scalar contract. An
33
- offline local run is not evidence for the product-CLI contract either way: follow
34
- the task's named evidence mode and use live debug for product response shape.
35
-
36
- The definitions default `timeout` to `PT15M` and `retryCount` to `0`. Override
37
- them only when the scenario calls for different operational behavior.
38
-
39
- ## Managed authentication
40
-
41
- Managed HTTP has two authentication modes. Omit `connection` and `folder` for
42
- manual/implicit mode. To reuse an Integration Service HTTP connection, provide
43
- both symbolic names from `bindings.json`; the compiler resolves them into the
44
- node detail and the emitted flow's resource bindings:
45
-
46
- ```ts
47
- .step('profile', http({
48
- managed: true,
49
- method: 'GET',
50
- url: '/me',
51
- connection: 'spotifyHttp',
52
- folder: 'shared',
53
- returns: { display_name: 'string' },
54
- }))
55
- ```
56
-
57
- ```json
58
- {
59
- "bindings": [
60
- { "name": "spotifyHttp", "resourceKey": "<uipath-uipath-http connection id>" },
61
- { "name": "shared", "resourceKey": "<folder key>" }
62
- ]
63
- }
64
- ```
65
-
66
- Connection mode emits `authentication: "connector"`, targets
67
- `uipath-uipath-http`, and treats `url` as a path relative to the connection's
68
- configured base URL. Supplying only one of `connection` or `folder` is an error.
69
-
70
- For an HTTP fallback authenticated by another connector, set its connector key
71
- as `targetConnector`. The node remains the managed HTTP wrapper, while the
72
- proxied request reuses that connector's authentication:
73
-
74
- ```ts
75
- .step('emoji', http({
76
- managed: true,
77
- method: 'GET',
78
- url: '/emoji.list',
79
- connection: 'slack',
80
- folder: 'shared',
81
- targetConnector: 'uipath-salesforce-slack',
82
- }))
83
- ```
84
-
85
- `targetConnector` requires both bindings and is not valid on standalone HTTP.
86
-
87
- ## Response branches
88
-
89
- `branches: [{ name, condition }]` declares extra exits evaluated against the
90
- response — each becomes a `branch-<name>` source port routed with
91
- `.stepToList('branch-<name>', …)`, while the main path continues from the
92
- default port. Conditions are expressions (e.g.
93
- ``js`$vars.fetch.output.statusCode === 429` ``), typically reading the step's
94
- own declared `returns`. Names must be unique and constant conditions are
95
- rejected by `check`.
96
-
97
- ## Evidence
98
-
99
- An offline replay proves the graph and chosen response shape. A live request is
100
- the evidence for endpoint reachability, response media type, authentication,
101
- and the service's actual status/body behavior.
102
-
103
- Both HTTP types default to `timeout: 'PT15M'` and `retryCount: 0` when omitted.
104
- The managed node deserializes the response body, so read `out('fetch', 'body.items')`
105
- and let `returns` declare the body's top-level fields.