@uipath/flow-tool 1.201.0-preview.131 → 1.201.0-preview.133

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 (140) hide show
  1. package/dist/{authoring-rezk32bm.js → authoring-7r6g06c7.js} +2 -2
  2. package/dist/{conversion-W6HMHBWW-6qbqgqks.js → conversion-H2VEEYLB-ng48mbf7.js} +536 -161
  3. package/dist/{de-K6MLR24N-5N5XGLH6-gbwpvdz4.js → de-5HU6GFWV-4EZK6G7N-yrh21f52.js} +273 -13
  4. package/dist/{de-K6MLR24N-00fjz82b.js → de-5HU6GFWV-zheyw6d2.js} +271 -10
  5. package/dist/de-5KVP66U6-f7knj511.js +161 -0
  6. package/dist/de-5KVP66U6-t37qr521.js +161 -0
  7. package/dist/{de-B2KIY5TC-81f703v3.js → de-HKTOVV4H-d5yw5j21.js} +3 -3
  8. package/dist/{de-WMKOGI7B-r1821wpe.js → de-WMKOGI7B-6dc1zdnp.js} +3 -3
  9. package/dist/en-4KXU7N7B-24v330b5.js +118 -0
  10. package/dist/en-4KXU7N7B-66fntxa2.js +118 -0
  11. package/dist/{en-ILA4HPE5-ALHGESZE-zrv4qss8.js → en-MABQK6C4-REWE2WG2-8dp4cqdg.js} +109 -6
  12. package/dist/{en-ILA4HPE5-fhwvq92r.js → en-MABQK6C4-nkzq2j8t.js} +106 -2
  13. package/dist/{en-P6PNWNTO-g1f6cjh5.js → en-P4AS26D7-szrzfxz1.js} +3 -5
  14. package/dist/{en-X4DLPKLJ-dt1wtdm7.js → en-X4DLPKLJ-1h9gj5c1.js} +3 -3
  15. package/dist/{es-BVPGJUWA-9gk2g9yb.js → es-BVPGJUWA-0k59eqfv.js} +3 -3
  16. package/dist/{es-HTQSD352-YTAEDCE5-nhsbg581.js → es-LUTYN7U7-IY5QWOUF-k2aefzc0.js} +273 -13
  17. package/dist/{es-HTQSD352-m9rr3f0g.js → es-LUTYN7U7-ye5zn4sn.js} +271 -10
  18. package/dist/{es-MX-3SP2SSV6-f20qspbr.js → es-MX-H2EAXLYI-qwnqt48x.js} +3 -3
  19. package/dist/{es-MX-FOX525CG-87g500gr.js → es-MX-POESXYP2-9538722k.js} +272 -11
  20. package/dist/{es-MX-FOX525CG-HLM27OEL-whr0t9v3.js → es-MX-POESXYP2-UW6VP5QI-cd3a79g9.js} +274 -14
  21. package/dist/{es-MX-U6YL5KQX-ynwxdjr8.js → es-MX-U6YL5KQX-k4qvpgd4.js} +3 -3
  22. package/dist/es-MX-XAVLOQW3-47a405kf.js +161 -0
  23. package/dist/es-MX-XAVLOQW3-9b3cp9n8.js +161 -0
  24. package/dist/{es-BBX4AUJX-h99fcr53.js → es-O4PAV2CR-jwfaawwk.js} +3 -3
  25. package/dist/es-VFPNVMP5-6sftsdxe.js +161 -0
  26. package/dist/es-VFPNVMP5-thm0z9sr.js +161 -0
  27. package/dist/{fr-FSTBVVGK-t3y57xrb.js → fr-5YRGHXF5-q6b63yg0.js} +3 -3
  28. package/dist/fr-E5MDO4EG-exvrs7ge.js +161 -0
  29. package/dist/fr-E5MDO4EG-f3x1jeqw.js +161 -0
  30. package/dist/{fr-EKTTDR7Z-bmpwp31r.js → fr-EKTTDR7Z-m2t68j0m.js} +3 -3
  31. package/dist/{fr-54THJ4QH-IGABNGU6-fpzw2mba.js → fr-LJIK56LW-STG6QR3T-cextvv8q.js} +274 -14
  32. package/dist/{fr-54THJ4QH-d6ezjbhw.js → fr-LJIK56LW-xf3xf2kh.js} +272 -11
  33. package/dist/{index-6hp3p3eq.js → index-dhcd9b82.js} +2 -2
  34. package/dist/{index-zvxfkpkr.js → index-er6vy3jk.js} +71 -5
  35. package/dist/index.js +22 -16
  36. package/dist/init.js +19 -13
  37. package/dist/ja-DPO5PPLO-fmbg7zt2.js +161 -0
  38. package/dist/ja-DPO5PPLO-s2a7j3nj.js +161 -0
  39. package/dist/{ja-MHUPLSWO-CS3KE4Y3-mbtkzwd7.js → ja-FGEGLBJ3-MG3BSWXD-vq19zt2p.js} +273 -13
  40. package/dist/{ja-MHUPLSWO-3qwy4jc0.js → ja-FGEGLBJ3-w9byjhze.js} +271 -10
  41. package/dist/{ja-FW33BJBW-htfk4d8t.js → ja-SDAPAVCR-943p5gx7.js} +3 -3
  42. package/dist/{ja-Y2YBTXNN-96cvy5av.js → ja-Y2YBTXNN-5sszk2zv.js} +3 -3
  43. package/dist/ko-ITOPNIYI-aqy82jk8.js +161 -0
  44. package/dist/ko-ITOPNIYI-qz39kamf.js +161 -0
  45. package/dist/{ko-PDO5AXNW-d653t4pc.js → ko-NAGOZLC3-wb3y9yhh.js} +3 -3
  46. package/dist/{ko-S33XAV26-cxf4dn2t.js → ko-S33XAV26-rfsv9myd.js} +3 -3
  47. package/dist/{ko-XPJTXIKK-DNSW4KYQ-956vp61f.js → ko-TUAK3G3A-TBEBKOTM-ns78t2rv.js} +277 -17
  48. package/dist/{ko-XPJTXIKK-w1hs4px7.js → ko-TUAK3G3A-s25w0ckg.js} +275 -14
  49. package/dist/{node-rnmmv28d.js → node-qyxvhbw6.js} +2 -2
  50. package/dist/{packager-tool-cqrsre00.js → packager-tool-0567pxpm.js} +121 -12
  51. package/dist/{packager-tool-3wf3tkrc.js → packager-tool-09xysehb.js} +3 -5
  52. package/dist/{packager-tool-b0s5d4ek.js → packager-tool-0sz8se22.js} +1 -1
  53. package/dist/{packager-tool-s5y06ny4.js → packager-tool-2xgc101h.js} +544 -45
  54. package/dist/{packager-tool-03knb0er.js → packager-tool-3wygxefb.js} +116 -17
  55. package/dist/packager-tool-6ejqwbw9.js +26 -0
  56. package/dist/{packager-tool-952kqpax.js → packager-tool-78a3szsp.js} +890 -339
  57. package/dist/{packager-tool-xzcywm2b.js → packager-tool-c42dp002.js} +1 -1
  58. package/dist/{packager-tool-v61wap3v.js → packager-tool-djagtpkt.js} +12111 -6271
  59. package/dist/{packager-tool-1gjx8w7m.js → packager-tool-fgdsmd8k.js} +258 -486
  60. package/dist/packager-tool-gasyxww9.js +23964 -0
  61. package/dist/packager-tool-gmrwvnyh.js +1171 -0
  62. package/dist/packager-tool-jysvpt8p.js +11 -0
  63. package/dist/packager-tool-m6x5sczh.js +899 -0
  64. package/dist/packager-tool-mcaf4ewf.js +46 -0
  65. package/dist/packager-tool-p9j43p8h.js +115 -0
  66. package/dist/{packager-tool-v2p6g3fd.js → packager-tool-pkq70dec.js} +1 -1
  67. package/dist/{packager-tool-zh6g3h65.js → packager-tool-sf18719z.js} +5 -5
  68. package/dist/packager-tool-tq9q9m77.js +115 -0
  69. package/dist/{packager-tool-1yy9x4vk.js → packager-tool-v74yk918.js} +2 -2
  70. package/dist/packager-tool-vdd02vns.js +55924 -0
  71. package/dist/packager-tool-xj0agqpk.js +11 -0
  72. package/dist/packager-tool.js +15 -9
  73. package/dist/{pt-JLZYSSXX-7jth254x.js → pt-7TR74ZMB-1g8my56g.js} +3 -3
  74. package/dist/{pt-BR-TV7NR3ID-PDSSHRHU-nddwzj29.js → pt-BR-7XGDXRDJ-TR5D7JYL-533wvy7p.js} +274 -14
  75. package/dist/{pt-BR-TV7NR3ID-vgd26pj1.js → pt-BR-7XGDXRDJ-espnkgrj.js} +272 -11
  76. package/dist/pt-BR-BXURWX4W-dqr4dnf9.js +161 -0
  77. package/dist/pt-BR-BXURWX4W-xzyndmrx.js +161 -0
  78. package/dist/{pt-BR-LQH3RSBB-kyb4jmcw.js → pt-BR-DXXSYJDO-bn84ewp7.js} +3 -3
  79. package/dist/{pt-BR-JO45SCNI-4kbfnzc4.js → pt-BR-JO45SCNI-mt93s33c.js} +3 -3
  80. package/dist/{pt-4JEPEAST-JO5WN33S-ccdbdab2.js → pt-TMVOOITK-H2ADYHSD-ezpggv33.js} +273 -13
  81. package/dist/{pt-4JEPEAST-40npwxyw.js → pt-TMVOOITK-myha14p9.js} +271 -10
  82. package/dist/{pt-W3NA4LIZ-f02gapvs.js → pt-W3NA4LIZ-fwd1q4j0.js} +3 -3
  83. package/dist/pt-YI4VE4YQ-521681zf.js +161 -0
  84. package/dist/pt-YI4VE4YQ-v7gjeg82.js +161 -0
  85. package/dist/{ro-RKJ74FV3-QS3I6XKJ-kb31d85k.js → ro-2VALF3S5-NXBJUEZN-nqw1zs33.js} +277 -17
  86. package/dist/{ro-RKJ74FV3-qn0ey39v.js → ro-2VALF3S5-cdz5afkr.js} +275 -14
  87. package/dist/{ro-E2EBPQGT-vn573vcr.js → ro-BJFER5OI-334n28rj.js} +3 -3
  88. package/dist/ro-RKXZUG7Z-cm3xn3fj.js +161 -0
  89. package/dist/ro-RKXZUG7Z-pdztdafr.js +161 -0
  90. package/dist/{ro-WLKX6HF5-fcbe2zz8.js → ro-WLKX6HF5-b9tj8q67.js} +3 -3
  91. package/dist/ru-GSCT4ARZ-FTVCGQTL-5nh4jf2e.js +14 -0
  92. package/dist/ru-T73OPRTC-mp5gn7gs.js +10 -0
  93. package/dist/ru-WBLQ5B2U-8xd4gpv2.js +10 -0
  94. package/dist/ru-WBLQ5B2U-mswqs9wc.js +10 -0
  95. package/dist/serialization-GAW7UFOK-9hkdmmd2.js +36541 -0
  96. package/dist/services/flow-eval-schema/deterministic-evaluators.d.ts +110 -0
  97. package/dist/services/flow-eval-schema/evaluator-fields.d.ts +66 -0
  98. package/dist/services/flow-eval-schema/helpers.d.ts +9 -0
  99. package/dist/services/flow-eval-schema/index.d.ts +4 -0
  100. package/dist/services/flow-eval-schema/llm-judge-evaluators.d.ts +174 -0
  101. package/dist/services/flow-eval-schema/prompts.d.ts +2 -0
  102. package/dist/services/flow-eval-schema/registry.d.ts +375 -0
  103. package/dist/services/flow-eval-schema/tool-call-evaluators.d.ts +93 -0
  104. package/dist/services/flow-eval-schema/types.d.ts +78 -0
  105. package/dist/services/flow-eval-types.d.ts +6 -0
  106. package/dist/services/flow-eval-utils.d.ts +14 -0
  107. package/dist/services/flow-validate-service.d.ts +11 -0
  108. package/dist/services/packaging-utils.d.ts +3 -29
  109. package/dist/tool.js +22 -16
  110. package/dist/{tr-3U2W2XCA-zg3zcmq3.js → tr-3U2W2XCA-43ptfc0m.js} +3 -3
  111. package/dist/tr-AA6O2WSR-bj9n80k8.js +161 -0
  112. package/dist/tr-AA6O2WSR-ga1xnymp.js +161 -0
  113. package/dist/{tr-X7R6GQNB-VMEZAWRJ-vdbjqw23.js → tr-RIFCEXFH-BZS7S7QK-q465b62g.js} +279 -19
  114. package/dist/{tr-X7R6GQNB-shwv16dz.js → tr-RIFCEXFH-hgkb4g8y.js} +277 -16
  115. package/dist/{tr-ZUUSMHER-pfn5dq1r.js → tr-RQTZ2DMS-bpgd4kma.js} +3 -3
  116. package/dist/utils/flow-io.d.ts +8 -0
  117. package/dist/validation.js +19 -13
  118. package/dist/{zh-CN-FEZ24J4A-q5b5x20w.js → zh-CN-IP3FMXWM-1cfarhcp.js} +271 -10
  119. package/dist/{zh-CN-FEZ24J4A-LSEMG63K-db8kf6rm.js → zh-CN-IP3FMXWM-H3JI2XUM-ta4yac7h.js} +273 -13
  120. package/dist/{zh-CN-IPZYQR3P-1h76csc4.js → zh-CN-IPZYQR3P-egjmvyjf.js} +3 -3
  121. package/dist/zh-CN-R2KLHXQV-wttmznep.js +161 -0
  122. package/dist/zh-CN-R2KLHXQV-x6gnk2n0.js +161 -0
  123. package/dist/{zh-CN-YFKQ7HBX-w98q5zqf.js → zh-CN-ZC6LT4IN-vty9mvv8.js} +3 -3
  124. package/dist/{zh-TW-GKSCT6NW-JLMWTDAF-g2smq1gm.js → zh-TW-AGIDXIPF-R4XZRDJZ-cgxxz5k4.js} +274 -14
  125. package/dist/{zh-TW-GKSCT6NW-4n1yfre0.js → zh-TW-AGIDXIPF-n6r6w7vy.js} +272 -11
  126. package/dist/{zh-TW-CP5PCVEJ-wvbxf7c7.js → zh-TW-R7Y5KVMU-q81f4z2p.js} +3 -3
  127. package/dist/zh-TW-RJGCQANM-gqn0aca0.js +161 -0
  128. package/dist/zh-TW-RJGCQANM-tt8j5wv2.js +161 -0
  129. package/dist/{zh-TW-YPVSQVGT-wbybwpwt.js → zh-TW-YPVSQVGT-b378ztph.js} +3 -3
  130. package/package.json +2 -2
  131. package/dist/packager-tool-1169tjst.js +0 -87554
  132. package/dist/packager-tool-c19w8vg9.js +0 -26
  133. package/dist/packager-tool-gbgfwx8f.js +0 -2
  134. package/dist/packager-tool-jpcm3xas.js +0 -12
  135. package/dist/packager-tool-mt2g0zjx.js +0 -36187
  136. package/dist/packager-tool-pvgqbm48.js +0 -21
  137. package/dist/ru-D6DDND7Z-e4en56d2.js +0 -10
  138. package/dist/ru-GSCT4ARZ-3TVTUGWP-bbg6360z.js +0 -15
  139. package/dist/serialization-GTFWODSH-p7wmsmj7.js +0 -148
  140. /package/dist/{packager-tool-ny53xmsd.js → packager-tool-cvwr40ax.js} +0 -0
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  registerPackagerFactories
3
- } from "./packager-tool-xzcywm2b.js";
3
+ } from "./packager-tool-c42dp002.js";
4
4
  import {
5
5
  flowInitAsync
6
- } from "./packager-tool-zh6g3h65.js";
6
+ } from "./packager-tool-sf18719z.js";
7
7
  import {
8
8
  ERROR_SOURCE_PORT,
9
9
  FlowEvalFileStore,
@@ -12,6 +12,8 @@ import {
12
12
  NodeTypeNotFoundError,
13
13
  SourceRequiredError,
14
14
  addNodeToFlow,
15
+ buildDefaultCriteria,
16
+ buildEvaluatorConfig,
15
17
  buildInlineAgentDescriptors,
16
18
  captureMigrationIssues,
17
19
  collectNodeBindingResourceKeys,
@@ -19,23 +21,28 @@ import {
19
21
  enableErrorHandlingForErrorEdges,
20
22
  ensureDirectory,
21
23
  ensureProcessBindings,
24
+ evaluatorTypeAliases,
22
25
  expandHandleIds,
23
26
  fileNodesToPackagingNodes,
24
27
  formatMigrationFailureMessage,
28
+ getEvaluatorRef,
25
29
  isConnectorTriggerType,
26
30
  isConnectorWaitForEventType,
27
31
  isEventDrivenConnectorType,
28
- isInlineAgentNodeType,
32
+ isRecord,
33
+ isUUID,
29
34
  listNodesInFlow,
30
35
  packageInlineAgents,
31
36
  portMatchesTemplate,
32
- readInlineAgentSource,
33
37
  regenerateBindingsFile,
38
+ resolveEvaluatorType,
34
39
  scanDetailForCrossNodeBindings,
40
+ slugify,
35
41
  stageInlineAgentPackageFiles,
42
+ stripJsonExt,
36
43
  writePackagingArtifacts,
37
44
  writePackagingArtifactsDetailed
38
- } from "./packager-tool-s5y06ny4.js";
45
+ } from "./packager-tool-2xgc101h.js";
39
46
  import {
40
47
  ensureProjectId
41
48
  } from "./packager-tool-7yjpwj92.js";
@@ -50,6 +57,7 @@ import {
50
57
  buildInputMetadata,
51
58
  buildManagedHttpEssentialConfiguration,
52
59
  buildSolutionPackageFromDir,
60
+ buildStudioWebDesignerUrl,
53
61
  createConfiguredActivityClient,
54
62
  createZipFromDir,
55
63
  debugPimsGet,
@@ -77,11 +85,13 @@ import {
77
85
  registerSharedInstanceCommands,
78
86
  registerSharedProcessCommands,
79
87
  registerSharedProcessesCommands,
88
+ resolveProjectFlowFile,
89
+ setAgentProjectMetadataReader,
80
90
  substituteFilterVariables,
81
91
  uploadAndDebugSolution,
82
92
  uploadOrOverwriteSolution,
83
93
  writeFlowWorkflow
84
- } from "./packager-tool-v61wap3v.js";
94
+ } from "./packager-tool-djagtpkt.js";
85
95
  import {
86
96
  JobsApi,
87
97
  PackageFeedsApi,
@@ -98,7 +108,7 @@ import {
98
108
  resolveFolder,
99
109
  updateSolutionFile,
100
110
  uploadJobAttachment
101
- } from "./packager-tool-b0s5d4ek.js";
111
+ } from "./packager-tool-0sz8se22.js";
102
112
  import {
103
113
  ATTACHMENT_INSTRUCTIONS,
104
114
  ATTACHMENT_UPLOAD_INSTRUCTIONS,
@@ -129,17 +139,19 @@ import {
129
139
  readStdin,
130
140
  registerPackageMetadataOptions,
131
141
  resolveAttachmentInputs
132
- } from "./packager-tool-ny53xmsd.js";
142
+ } from "./packager-tool-cvwr40ax.js";
133
143
  import {
134
144
  getFileSystem
135
145
  } from "./packager-tool-1cb0d5e0.js";
136
146
  import {
137
147
  DEFAULT_LAYOUT_OPTIONS,
148
+ GRID_SPACING,
138
149
  addBinding,
139
150
  addEdge,
140
151
  addNode,
141
152
  addVariable,
142
153
  applyNodeMigrations,
154
+ assertVoiceAgentDefinitionsEmbedded,
143
155
  checkNodeMigrations,
144
156
  convertFlowToBpmn,
145
157
  createBinding,
@@ -147,8 +159,11 @@ import {
147
159
  createWorkflowVariable,
148
160
  generateNodeIdAndName,
149
161
  generateNodeVariables,
162
+ generateRandomId,
163
+ isInlineAgentNodeType,
150
164
  migrateWorkflowToFloor,
151
165
  minimumSupportedVersion,
166
+ readInlineAgentSource,
152
167
  replaceExporterVersion,
153
168
  resolveHeight,
154
169
  resolveWidth,
@@ -157,18 +172,20 @@ import {
157
172
  runtimeVersion,
158
173
  setPublishIntentOnInlineAgents,
159
174
  snapToGrid,
160
- validateIdentifier
161
- } from "./packager-tool-mt2g0zjx.js";
175
+ validateIdentifier,
176
+ voiceConvertOptions
177
+ } from "./packager-tool-gasyxww9.js";
162
178
  import {
163
179
  compareVersions,
164
180
  executeWritePlan,
165
181
  generatePackageDescriptor,
166
- generateRandomId,
182
+ getStartEventNodes,
167
183
  inMemoryWorkflowToFileFormat,
168
184
  isExpressionValue,
169
185
  isStartEventNode,
186
+ isVoiceAgentNodeType,
170
187
  planWriteThrough
171
- } from "./packager-tool-952kqpax.js";
188
+ } from "./packager-tool-78a3szsp.js";
172
189
  import {
173
190
  __require,
174
191
  __toESM
@@ -177,7 +194,7 @@ import {
177
194
  var package_default = {
178
195
  name: "@uipath/flow-tool",
179
196
  license: "MIT",
180
- version: "1.201.0-preview.131",
197
+ version: "1.201.0-preview.133",
181
198
  description: "Create, debug, and run UiPath Flow projects and jobs.",
182
199
  private: false,
183
200
  repository: {
@@ -226,11 +243,11 @@ var package_default = {
226
243
  "@uipath/builder-sdk": "workspace:*",
227
244
  "@uipath/common": "workspace:*",
228
245
  "@uipath/filesystem": "workspace:*",
229
- "@uipath/flow-core": "^0.68.0",
246
+ "@uipath/flow-core": "^0.92.5",
230
247
  elkjs: "^0.11.1",
231
- "@uipath/flow-converter": "^0.42.1",
248
+ "@uipath/flow-converter": "^0.53.6",
232
249
  "@uipath/flow-migrations": "^0.33.0",
233
- "@uipath/flow-schema": "^0.42.0",
250
+ "@uipath/flow-schema": "^0.57.6",
234
251
  "@uipath/integrationservice-sdk": "workspace:*",
235
252
  i18next: "^23.16.8",
236
253
  "@uipath/maestro-sdk": "workspace:*",
@@ -920,6 +937,30 @@ class UnregisteredProjectError extends Error {
920
937
  this.instructions = buildFlowDebugUnregisteredProjectInstructions(projectDir, solutionFile);
921
938
  }
922
939
  }
940
+ var VOICE_TRIGGER_TYPE = "core.trigger.voice";
941
+ var FLOW_DEBUG_INBOUND_VOICE_MESSAGE = "Inbound voice flows cannot be debugged from the CLI.";
942
+ var buildFlowDebugInboundVoiceInstructions = (triggerLabel) => [
943
+ `This flow starts from an incoming-call trigger ("${triggerLabel}"), which only a real call can raise.`,
944
+ "Publish the flow, bind a phone number to it ('uip conversational trunks assign'), then call that number to run it.",
945
+ "Outbound voice flows (manual trigger + Create outgoing call) do run under 'uip maestro flow debug'."
946
+ ].join(`
947
+ `);
948
+
949
+ class InboundVoiceDebugError extends Error {
950
+ instructions;
951
+ constructor(triggerLabel) {
952
+ super(FLOW_DEBUG_INBOUND_VOICE_MESSAGE);
953
+ this.name = "InboundVoiceDebugError";
954
+ this.instructions = buildFlowDebugInboundVoiceInstructions(triggerLabel);
955
+ }
956
+ }
957
+ function assertNotInboundVoiceFlow(workflow) {
958
+ const trigger = (workflow.nodes ?? []).find((node) => node.type === VOICE_TRIGGER_TYPE);
959
+ if (!trigger) {
960
+ return;
961
+ }
962
+ throw new InboundVoiceDebugError(trigger.display?.label ?? trigger.id ?? "Incoming call");
963
+ }
923
964
 
924
965
  class FlowDebugService {
925
966
  fs;
@@ -967,10 +1008,26 @@ class FlowDebugService {
967
1008
  if (projectDir) {
968
1009
  await this.hydrateInlineAgentInputs(workflow, projectDir);
969
1010
  }
1011
+ const flowNodes = workflow.nodes ?? [];
1012
+ const voiceNodes = flowNodes.filter((node) => isVoiceAgentNodeType(node.type));
1013
+ if (voiceNodes.length > 0 && !projectDir) {
1014
+ throw new Error("This flow contains voice agent nodes; the flow project directory is required to resolve their agent definitions.");
1015
+ }
1016
+ const voiceAgentPackages = projectDir ? await packageInlineAgents(this.fs, projectDir, voiceNodes) : [];
970
1017
  const fileFormat = inMemoryWorkflowToFileFormat(workflow);
971
- const convertOptions = { detached: true };
972
- const { bpmn } = await convertFlowToBpmn(JSON.stringify(fileFormat, null, 2), convertOptions);
973
- return replaceExporterVersion(bpmn, package_default.version);
1018
+ const flowJson = JSON.stringify(fileFormat, null, 2);
1019
+ const { bpmn: rawBpmn } = await convertFlowToBpmn(flowJson, voiceConvertOptions({
1020
+ flowJson,
1021
+ nodes: flowNodes,
1022
+ builtAgents: new Map(voiceAgentPackages.map((agent) => [
1023
+ agent.source,
1024
+ agent.agentJson
1025
+ ])),
1026
+ convertOptions: { detached: true }
1027
+ }));
1028
+ const bpmn = replaceExporterVersion(rawBpmn, package_default.version);
1029
+ assertVoiceAgentDefinitionsEmbedded(bpmn, flowNodes);
1030
+ return bpmn;
974
1031
  }
975
1032
  async hydrateInlineAgentInputs(workflow, projectDir) {
976
1033
  const nodes = workflow.nodes ?? [];
@@ -1234,8 +1291,9 @@ class FlowDebugService {
1234
1291
  const projectUiproj = JSON.parse(projectUiprojContent);
1235
1292
  const projectName = projectUiproj.Name;
1236
1293
  const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
1237
- const flowFilePath = await findProjectFlowFile(absoluteProjectPath, projectUiproj.MainFile, safeName);
1294
+ const flowFilePath = await resolveProjectFlowFile(absoluteProjectPath);
1238
1295
  const { workflow: flowData } = await readFlowWorkflow(flowFilePath);
1296
+ assertNotInboundVoiceFlow(flowData);
1239
1297
  if (options?.inputs && flowData.variables?.globals) {
1240
1298
  for (const variable of flowData.variables.globals) {
1241
1299
  if (Object.hasOwn(options.inputs, variable.id)) {
@@ -1309,7 +1367,7 @@ class FlowDebugService {
1309
1367
  ];
1310
1368
  const startNodeId = entryPoints[0]?.filePath.split("#")[1] ?? startEventId;
1311
1369
  entryPoint = `/${bpmnFileName}#${startNodeId}`;
1312
- const [refreshError, refreshResult] = await catchError(import("./index-6hp3p3eq.js").then((mod) => mod.resourceRefreshAsync(stagingDir)));
1370
+ const [refreshError, refreshResult] = await catchError(import("./index-dhcd9b82.js").then((mod) => mod.resourceRefreshAsync(stagingDir)));
1313
1371
  if (refreshError) {
1314
1372
  logger.warn(`Resource refresh threw before debug: ${refreshError.message}. Continuing without generated overwrites.`);
1315
1373
  } else if (refreshResult.ok) {
@@ -1342,6 +1400,24 @@ class FlowDebugService {
1342
1400
  }
1343
1401
  return importResult;
1344
1402
  };
1403
+ if (options?.uploadOnly) {
1404
+ const importResult = await uploadAndPatch();
1405
+ await updateSolutionFile(this.fs, absoluteProjectPath, importResult.id);
1406
+ const project = importResult.projects.find((candidate) => candidate.name === projectName) ?? importResult.projects[0];
1407
+ const studioWebUrl = buildStudioWebDesignerUrl({
1408
+ baseUrl: apiConfig.baseUrl,
1409
+ organizationName: config.organizationName,
1410
+ projectId: project.id,
1411
+ solutionId: importResult.id
1412
+ });
1413
+ logger.info("Uploaded without starting a debug session — only a chat UI can drive this flow.");
1414
+ callbacks?.onStudioWebUrl?.(studioWebUrl);
1415
+ return {
1416
+ uploadedOnly: true,
1417
+ solutionId: importResult.id,
1418
+ studioWebUrl
1419
+ };
1420
+ }
1345
1421
  const result = await uploadAndDebugSolution({
1346
1422
  upload: uploadAndPatch,
1347
1423
  onSolutionId: (id) => updateSolutionFile(this.fs, absoluteProjectPath, id),
@@ -1554,6 +1630,26 @@ function buildIncidentInstructions(incidents, instanceId) {
1554
1630
  - `)}
1555
1631
  ${detailHint}${traceHint}`;
1556
1632
  }
1633
+ var CONVERSATION_TRIGGER_NODE_TYPE = "core.trigger.conversation";
1634
+ function startsOnConversationTrigger(workflow) {
1635
+ const startNodes = getStartEventNodes(fileNodesToPackagingNodes([...workflow.nodes ?? []]));
1636
+ return startNodes[0]?.type === CONVERSATION_TRIGGER_NODE_TYPE;
1637
+ }
1638
+ var CONVERSATIONAL_DEBUG_WARNING = "This flow, which starts on a conversation trigger, can only be debugged from a chat UI. " + `Debug it using the chat panel from either:
1639
+ ` + " 1. Studio Web — open the debug URL printed once the solution uploads " + `(also 'Data.studioWebUrl' in the result).
1640
+ ` + " 2. UiPath Maestro VS Code extension — open the flow and hit Debug.";
1641
+ async function projectStartsOnConversationTrigger(projectPath) {
1642
+ const [error, found] = await catchError((async () => {
1643
+ const flowFilePath = await resolveProjectFlowFile(projectPath);
1644
+ const { workflow } = await readFlowWorkflow(flowFilePath);
1645
+ return startsOnConversationTrigger(workflow);
1646
+ })());
1647
+ if (error) {
1648
+ logger.info(`Skipped the conversational pre-flight scan: ${error.message}`);
1649
+ return false;
1650
+ }
1651
+ return found === true;
1652
+ }
1557
1653
  var FLOW_DEBUG_EXAMPLES = [
1558
1654
  {
1559
1655
  Description: "Debug a local flow project via Studio Web",
@@ -1573,6 +1669,18 @@ var FLOW_DEBUG_EXAMPLES = [
1573
1669
  }
1574
1670
  }
1575
1671
  },
1672
+ {
1673
+ Description: "Conversational flow (core.trigger.conversation) — uploaded to Studio Web and handed off, since only a chat UI can drive it. No debug session is started",
1674
+ Command: "uip maestro flow debug ./my-chat-flow --open-in-browser",
1675
+ Output: {
1676
+ Code: "FlowDebugStudioWebHandoff",
1677
+ Data: {
1678
+ solutionId: "e5f6a7b8-0000-0000-0000-000000000001",
1679
+ studioWebUrl: "https://cloud.uipath.com/org/studio_/designer/a1b2c3d4?solutionId=e5f6a7b8",
1680
+ handedOff: true
1681
+ }
1682
+ }
1683
+ },
1576
1684
  {
1577
1685
  Description: 'Faulted debug — emitted as a Result: "Failure" envelope (exit 1) with incident details (errorCode, errorMessage, elementId) inline on Data.incidents, so no follow-up command is needed',
1578
1686
  Command: "uip maestro flow debug ./my-flow-project",
@@ -1603,6 +1711,21 @@ var FOLDER_TARGETING_INSTRUCTIONS = "Pass at most one of --folder-id, --folder-k
1603
1711
  var FOLDER_RESOLUTION_INSTRUCTIONS = "Provide a valid --folder-key (UUID) or --folder-path. Use 'uip or folders list' to confirm the key or path.";
1604
1712
  var FOLDER_RESOLUTION_NETWORK_INSTRUCTIONS = "The folder lookup itself failed (network / Orchestrator API). Re-authenticate with 'uip login', verify connectivity, and retry.";
1605
1713
  var DEBUG_FAILURE_INSTRUCTIONS = "Check that the flow project is valid, the selected folder is accessible, and Studio Web debug is available, then retry.";
1714
+ async function openInBrowserOrWarn(url) {
1715
+ const [openError] = await catchError(async () => {
1716
+ await getFileSystem().utils.open(url);
1717
+ });
1718
+ if (openError) {
1719
+ OutputFormatter.log({
1720
+ Warning: `Could not open the browser automatically: ${openError.message}`
1721
+ });
1722
+ }
1723
+ }
1724
+ function buildHandoffInstructions(studioWebUrl) {
1725
+ return "This flow can only be driven from a chat UI, so no debug session was started. " + `Debug it using the chat panel from either:
1726
+ ` + ` 1. Studio Web — open ${studioWebUrl}.
1727
+ ` + " 2. UiPath Maestro VS Code extension — open the flow and hit Debug.";
1728
+ }
1606
1729
  function isFolderInputError(err) {
1607
1730
  if ("response" in err)
1608
1731
  return false;
@@ -1631,7 +1754,19 @@ function parsePositiveIntegerOption(value, optionName) {
1631
1754
  return { ok: true, value: parsed };
1632
1755
  }
1633
1756
  function registerDebugCommand(program) {
1634
- program.command("debug").description("Debug a flow project by uploading to Studio Web and running a debug session").argument("<project-path>", "Path to the flow project directory (must contain project.uiproj)").option("--folder-id <id>", "Orchestrator folder ID (OrganizationUnitId) as a positive integer. Mutually exclusive with --folder-key/--folder-path. Auto-detected if none are provided.").option("--folder-key <key>", "Orchestrator folder key (UUID). The CLI resolves it to the folder ID. Mutually exclusive with --folder-id/--folder-path.").option("--folder-path <path>", "Orchestrator folder path (e.g. 'Shared/Sub'). The CLI resolves it to the folder ID. Mutually exclusive with --folder-id/--folder-key.").option("--poll-interval <ms>", "Polling interval in milliseconds", "2000").option("--timeout <seconds>", "Maximum seconds to wait for debug completion").option("-i, --inputs <json>", "Input parameters as JSON string or @file.json").option("--attachment <name=path>", "Upload a file as a file-typed workflow input variable (repeatable). " + "Example: --attachment file1=./resume.pdf", appendOption, []).option("--login-validity <minutes>", "Minimum minutes before token expiration to trigger a refresh (default: 10)", parseInt, 10).examples(FLOW_DEBUG_EXAMPLES).trackedAction(processContext, async (projectPath, options) => {
1757
+ program.command("debug").description("Debug a flow project by uploading to Studio Web and running a debug session").argument("<project-path>", "Path to the flow project directory (must contain project.uiproj)").option("--folder-id <id>", "Orchestrator folder ID (OrganizationUnitId) as a positive integer. Mutually exclusive with --folder-key/--folder-path. Auto-detected if none are provided.").option("--folder-key <key>", "Orchestrator folder key (UUID). The CLI resolves it to the folder ID. Mutually exclusive with --folder-id/--folder-path.").option("--folder-path <path>", "Orchestrator folder path (e.g. 'Shared/Sub'). The CLI resolves it to the folder ID. Mutually exclusive with --folder-id/--folder-key.").option("--poll-interval <ms>", "Polling interval in milliseconds", "2000").option("--timeout <seconds>", "Maximum seconds to wait for debug completion").option("-i, --inputs <json>", "Input parameters as JSON string or @file.json").option("--attachment <name=path>", "Upload a file as a file-typed workflow input variable (repeatable). " + "Example: --attachment file1=./resume.pdf", appendOption, []).option("--open-in-browser", "Open the Studio Web URL in the browser once it is known.").option("--login-validity <minutes>", "Minimum minutes before token expiration to trigger a refresh (default: 10)", parseInt, 10).examples(FLOW_DEBUG_EXAMPLES).trackedAction(processContext, async (projectPath, options) => {
1758
+ const isConversational = await projectStartsOnConversationTrigger(projectPath);
1759
+ if (isConversational) {
1760
+ OutputFormatter.log({
1761
+ Warning: CONVERSATIONAL_DEBUG_WARNING
1762
+ });
1763
+ if (options.timeout !== undefined) {
1764
+ OutputFormatter.log({
1765
+ Warning: "--timeout has no effect here: the CLI uploads and hands off without polling a run."
1766
+ });
1767
+ }
1768
+ }
1769
+ let urlReported = false;
1635
1770
  const [loginError, login] = await catchError(getLoginStatusAsync({
1636
1771
  ensureTokenValidityMinutes: options.loginValidity
1637
1772
  }));
@@ -1846,7 +1981,8 @@ function registerDebugCommand(program) {
1846
1981
  }
1847
1982
  const debugOptions = {
1848
1983
  inputs,
1849
- ...maxPolls === undefined ? {} : { maxPolls }
1984
+ ...maxPolls === undefined ? {} : { maxPolls },
1985
+ ...isConversational ? { uploadOnly: true } : {}
1850
1986
  };
1851
1987
  logger.info(`Starting Studio Web debug session for: ${projectPath}`);
1852
1988
  const [executeError, result] = await catchError(service.executeProjectViaStudioWeb(projectPath, studioWebConfig, {
@@ -1861,6 +1997,17 @@ function registerDebugCommand(program) {
1861
1997
  },
1862
1998
  onIncident: (incidents2) => {
1863
1999
  logger.warn(`Incidents: ${JSON.stringify(incidents2)}`);
2000
+ },
2001
+ onStudioWebUrl: (url) => {
2002
+ if (options.openInBrowser !== true)
2003
+ return;
2004
+ if (urlReported)
2005
+ return;
2006
+ urlReported = true;
2007
+ OutputFormatter.log({
2008
+ Message: `Studio Web debug URL: ${url}`
2009
+ });
2010
+ openInBrowserOrWarn(url);
1864
2011
  }
1865
2012
  }, pollInterval, debugOptions));
1866
2013
  if (executeError) {
@@ -1873,6 +2020,15 @@ function registerDebugCommand(program) {
1873
2020
  processContext.exit(3);
1874
2021
  return;
1875
2022
  }
2023
+ if (executeError instanceof InboundVoiceDebugError) {
2024
+ OutputFormatter.error({
2025
+ Result: RESULTS.ValidationError,
2026
+ Message: executeError.message,
2027
+ Instructions: executeError.instructions
2028
+ });
2029
+ processContext.exit(3);
2030
+ return;
2031
+ }
1876
2032
  if (executeError instanceof UnregisteredProjectError) {
1877
2033
  OutputFormatter.error({
1878
2034
  Result: RESULTS.ValidationError,
@@ -1894,6 +2050,20 @@ function registerDebugCommand(program) {
1894
2050
  processContext.exit(1);
1895
2051
  return;
1896
2052
  }
2053
+ if ("uploadedOnly" in result) {
2054
+ OutputFormatter.success({
2055
+ Result: RESULTS.Success,
2056
+ Code: "FlowDebugStudioWebHandoff",
2057
+ Data: {
2058
+ solutionId: result.solutionId,
2059
+ studioWebUrl: result.studioWebUrl,
2060
+ handedOff: true
2061
+ },
2062
+ Instructions: buildHandoffInstructions(result.studioWebUrl)
2063
+ }, { preserveDataKeys: true });
2064
+ processContext.exit(0);
2065
+ return;
2066
+ }
1897
2067
  const success = isSuccessfulDebugStatus(result.finalStatus);
1898
2068
  const data = {
1899
2069
  jobKey: result.jobKey,
@@ -2320,451 +2490,6 @@ function mimeFromExt(ext) {
2320
2490
  return MIME_BY_EXT[ext.toLowerCase()] ?? "application/octet-stream";
2321
2491
  }
2322
2492
 
2323
- // src/services/flow-eval-schema/prompts.ts
2324
- var DEFAULT_EVALUATOR_PROMPT = `As an expert evaluator, analyze the semantic similarity of these JSON contents to determine a score from 0-100. Focus on comparing the meaning and contextual equivalence of corresponding fields, accounting for alternative valid expressions, synonyms, and reasonable variations in language while maintaining high standards for accuracy and completeness. Provide your score with a justification, explaining briefly and concisely why you gave that score.
2325
- ----
2326
- ExpectedOutput:
2327
- {{ExpectedOutput}}
2328
- ----
2329
- ActualOutput:
2330
- {{ActualOutput}}
2331
- `;
2332
- var DEFAULT_TRAJECTORY_EVALUATOR_PROMPT = `As an expert evaluator, determine how well the agent did on a scale of 0-100. Focus on if the simulation was successful and if the agent behaved according to the expected output accounting for alternative valid expressions, and reasonable variations in language while maintaining high standards for accuracy and completeness. Provide your score with a justification, explaining briefly and concisely why you gave that score.
2333
- ----
2334
- UserOrSyntheticInputGivenToAgent:
2335
- {{UserOrSyntheticInput}}
2336
- ----
2337
- SimulationInstructions:
2338
- {{SimulationInstructions}}
2339
- ----
2340
- ExpectedAgentBehavior:
2341
- {{ExpectedAgentBehavior}}
2342
- ----
2343
- AgentRunHistory:
2344
- {{AgentRunHistory}}
2345
- `;
2346
-
2347
- // src/services/flow-eval-schema/evaluator-fields.ts
2348
- var targetOutputKeyConfigField = {
2349
- key: "targetOutputKey",
2350
- label: "Target Output Key",
2351
- type: "targetOutputKey",
2352
- required: false,
2353
- description: "The key in the output to evaluate"
2354
- };
2355
- var caseSensitiveConfigField = {
2356
- key: "caseSensitive",
2357
- label: "Case Sensitive",
2358
- type: "boolean",
2359
- required: false,
2360
- default: false,
2361
- description: "If true, the comparison is case-sensitive"
2362
- };
2363
- var negatedConfigField = {
2364
- key: "negated",
2365
- label: "Negated",
2366
- type: "boolean",
2367
- required: false,
2368
- default: false,
2369
- description: "If true, the evaluation passes when the match is not found"
2370
- };
2371
- var expectedOutputCriteriaField = {
2372
- key: "expectedOutput",
2373
- label: "Expected Output",
2374
- type: "object",
2375
- required: false,
2376
- description: "The expected output value for this evaluator"
2377
- };
2378
- var llmBaseConfigFields = [
2379
- {
2380
- key: "model",
2381
- label: "Model",
2382
- type: "llmModel",
2383
- required: true,
2384
- description: "The LLM model to use for judging"
2385
- },
2386
- {
2387
- key: "prompt",
2388
- label: "Evaluation Prompt",
2389
- type: "string",
2390
- required: true,
2391
- default: DEFAULT_EVALUATOR_PROMPT,
2392
- description: "Custom prompt template for the LLM judge"
2393
- },
2394
- {
2395
- key: "temperature",
2396
- label: "Temperature",
2397
- type: "number",
2398
- required: true,
2399
- default: 0,
2400
- min: 0,
2401
- max: 2,
2402
- step: 0.1,
2403
- description: "Temperature for LLM generation"
2404
- },
2405
- {
2406
- key: "maxTokens",
2407
- label: "Max Tokens",
2408
- type: "number",
2409
- required: true,
2410
- default: 8192,
2411
- min: 0,
2412
- max: 16384,
2413
- step: 256,
2414
- description: "Maximum tokens for LLM response"
2415
- }
2416
- ];
2417
- var llmTrajectoryBaseConfigFields = llmBaseConfigFields.map((field) => field.key === "prompt" ? { ...field, default: DEFAULT_TRAJECTORY_EVALUATOR_PROMPT } : field);
2418
-
2419
- // src/services/flow-eval-schema/deterministic-evaluators.ts
2420
- var DETERMINISTIC_EVALUATOR_TYPES = {
2421
- "uipath-contains": {
2422
- name: "Contains Text",
2423
- description: "Check if output contains specific text",
2424
- category: "deterministic",
2425
- shortDescription: "Passes when output contains given text",
2426
- configFields: [
2427
- targetOutputKeyConfigField,
2428
- caseSensitiveConfigField,
2429
- {
2430
- ...negatedConfigField,
2431
- label: "Negated (should NOT contain)"
2432
- }
2433
- ],
2434
- criteriaFields: [
2435
- {
2436
- key: "searchText",
2437
- label: "Search Text",
2438
- type: "string",
2439
- required: false,
2440
- minLength: 1,
2441
- description: "The text to search for in the output"
2442
- }
2443
- ],
2444
- examples: {
2445
- criteria: { searchText: "loan approved" }
2446
- }
2447
- },
2448
- "uipath-exact-match": {
2449
- name: "Exact Match",
2450
- description: "Check if output exactly matches expected value",
2451
- category: "deterministic",
2452
- shortDescription: "Passes when output is an exact match",
2453
- configFields: [
2454
- targetOutputKeyConfigField,
2455
- caseSensitiveConfigField,
2456
- negatedConfigField
2457
- ],
2458
- criteriaFields: [expectedOutputCriteriaField],
2459
- examples: {
2460
- criteria: { expectedOutput: { value: "Application approved" } }
2461
- }
2462
- },
2463
- "uipath-json-similarity": {
2464
- name: "JSON Similarity",
2465
- description: "Compare JSON output similarity",
2466
- category: "deterministic",
2467
- shortDescription: "Passes when JSON structures are similar",
2468
- configFields: [targetOutputKeyConfigField],
2469
- criteriaFields: [expectedOutputCriteriaField],
2470
- examples: {
2471
- criteria: { expectedOutput: { status: "ok" } }
2472
- }
2473
- }
2474
- };
2475
-
2476
- // src/services/flow-eval-schema/llm-judge-evaluators.ts
2477
- var LLM_JUDGE_EVALUATOR_TYPES = {
2478
- "uipath-llm-judge-output-semantic-similarity": {
2479
- name: "LLM Judge Output",
2480
- description: "Use LLM to judge semantic similarity of outputs",
2481
- category: "llm-judge",
2482
- shortDescription: "AI judges if output semantically matches expected",
2483
- configFields: [...llmBaseConfigFields, targetOutputKeyConfigField],
2484
- criteriaFields: [expectedOutputCriteriaField],
2485
- examples: {
2486
- config: { model: "gpt-4o", temperature: 0 },
2487
- criteria: {
2488
- expectedOutput: {
2489
- text: "The loan has been approved for the requested amount."
2490
- }
2491
- }
2492
- }
2493
- },
2494
- "uipath-llm-judge-output-strict-json-similarity": {
2495
- name: "LLM Judge Strict JSON",
2496
- description: "Use LLM to judge strict JSON similarity",
2497
- category: "llm-judge",
2498
- shortDescription: "AI judges strict JSON structural match",
2499
- configFields: [...llmBaseConfigFields, targetOutputKeyConfigField],
2500
- criteriaFields: [expectedOutputCriteriaField],
2501
- examples: {
2502
- config: { model: "gpt-4o", temperature: 0 },
2503
- criteria: { expectedOutput: { result: "success" } }
2504
- }
2505
- },
2506
- "uipath-llm-judge-trajectory-similarity": {
2507
- name: "LLM Judge Trajectory",
2508
- description: "Use LLM to judge agent trajectory and behavior",
2509
- category: "llm-judge",
2510
- shortDescription: "AI judges if agent followed expected behavior",
2511
- configFields: llmTrajectoryBaseConfigFields,
2512
- criteriaFields: [
2513
- {
2514
- key: "expectedAgentBehavior",
2515
- label: "Expected Agent Behavior",
2516
- type: "string",
2517
- required: false,
2518
- description: "Description of expected agent behavior and actions"
2519
- }
2520
- ],
2521
- examples: {
2522
- config: { model: "gpt-4o" },
2523
- criteria: {
2524
- expectedAgentBehavior: "Agent checks eligibility, then calls approval API"
2525
- }
2526
- }
2527
- },
2528
- "uipath-llm-judge-trajectory-simulation": {
2529
- name: "LLM Judge Simulation",
2530
- description: "Use LLM to judge simulation trajectory",
2531
- category: "llm-judge",
2532
- shortDescription: "AI judges simulated agent execution path",
2533
- configFields: llmTrajectoryBaseConfigFields,
2534
- criteriaFields: [
2535
- {
2536
- key: "expectedAgentBehavior",
2537
- label: "Expected Agent Behavior",
2538
- type: "string",
2539
- required: false,
2540
- description: "Description of expected agent behavior during simulation"
2541
- }
2542
- ],
2543
- examples: {
2544
- config: { model: "gpt-4o" },
2545
- criteria: {
2546
- expectedAgentBehavior: "Agent simulates the user journey through checkout flow"
2547
- }
2548
- }
2549
- }
2550
- };
2551
-
2552
- // src/services/flow-eval-schema/tool-call-evaluators.ts
2553
- var TOOL_CALL_EVALUATOR_TYPES = {
2554
- "uipath-tool-call-args": {
2555
- name: "Tool Call Arguments",
2556
- description: "Verify tool call arguments match expected values",
2557
- category: "tool-call",
2558
- shortDescription: "Checks that tools were called with correct arguments",
2559
- configFields: [
2560
- {
2561
- key: "strict",
2562
- label: "Strict Mode",
2563
- type: "boolean",
2564
- required: false,
2565
- default: false,
2566
- description: "If true, requires exact match of all tool call arguments"
2567
- },
2568
- {
2569
- key: "subset",
2570
- label: "Subset Mode",
2571
- type: "boolean",
2572
- required: false,
2573
- default: false,
2574
- description: "If true, allows actual tool calls to be a subset of expected"
2575
- }
2576
- ],
2577
- criteriaFields: [
2578
- {
2579
- key: "toolCalls",
2580
- label: "Tool Calls",
2581
- type: "toolCallArgs",
2582
- required: false,
2583
- description: "Expected tool calls with names and arguments"
2584
- }
2585
- ]
2586
- },
2587
- "uipath-tool-call-count": {
2588
- name: "Tool Call Count",
2589
- description: "Verify tool call counts match expected values",
2590
- category: "tool-call",
2591
- shortDescription: "Checks number of times each tool was called",
2592
- configFields: [
2593
- {
2594
- key: "strict",
2595
- label: "Strict Mode",
2596
- type: "boolean",
2597
- required: false,
2598
- default: false,
2599
- description: "If true, requires exact count match"
2600
- }
2601
- ],
2602
- criteriaFields: [
2603
- {
2604
- key: "toolCallsCount",
2605
- label: "Tool Calls Count",
2606
- type: "toolCallCount",
2607
- required: false,
2608
- description: "Expected tool call counts with comparison operators"
2609
- }
2610
- ]
2611
- },
2612
- "uipath-tool-call-order": {
2613
- name: "Tool Call Order",
2614
- description: "Verify tool calls occur in expected order",
2615
- category: "tool-call",
2616
- shortDescription: "Checks that tools were called in the right sequence",
2617
- configFields: [
2618
- {
2619
- key: "strict",
2620
- label: "Strict Mode",
2621
- type: "boolean",
2622
- required: false,
2623
- default: false,
2624
- description: "If true, requires exact order match"
2625
- }
2626
- ],
2627
- criteriaFields: [
2628
- {
2629
- key: "toolCallsOrder",
2630
- label: "Tool Calls Order",
2631
- type: "toolCallOrder",
2632
- required: false,
2633
- description: "Tool names in expected execution order"
2634
- }
2635
- ]
2636
- },
2637
- "uipath-tool-call-output": {
2638
- name: "Tool Call Output",
2639
- description: "Verify tool call outputs match expected values",
2640
- category: "tool-call",
2641
- shortDescription: "Checks that tool outputs match expected values",
2642
- configFields: [
2643
- {
2644
- key: "strict",
2645
- label: "Strict Mode",
2646
- type: "boolean",
2647
- required: false,
2648
- default: false,
2649
- description: "If true, requires exact output match"
2650
- }
2651
- ],
2652
- criteriaFields: [
2653
- {
2654
- key: "toolOutputs",
2655
- label: "Tool Outputs",
2656
- type: "toolCallOutput",
2657
- required: false,
2658
- description: "Expected tool outputs with names and output values"
2659
- }
2660
- ]
2661
- }
2662
- };
2663
-
2664
- // src/services/flow-eval-schema/registry.ts
2665
- var EVALUATOR_TYPE_REGISTRY = {
2666
- ...DETERMINISTIC_EVALUATOR_TYPES,
2667
- ...LLM_JUDGE_EVALUATOR_TYPES,
2668
- ...TOOL_CALL_EVALUATOR_TYPES
2669
- };
2670
- var EVALUATOR_TYPE_ALIASES = {
2671
- "exact-match": "uipath-exact-match",
2672
- "json-similarity": "uipath-json-similarity",
2673
- contains: "uipath-contains",
2674
- "llm-judge-output": "uipath-llm-judge-output-semantic-similarity",
2675
- "llm-judge-strict-json": "uipath-llm-judge-output-strict-json-similarity",
2676
- "llm-judge-trajectory": "uipath-llm-judge-trajectory-similarity",
2677
- "llm-judge-trajectory-simulation": "uipath-llm-judge-trajectory-simulation"
2678
- };
2679
-
2680
- // src/services/flow-eval-schema/helpers.ts
2681
- function evaluatorTypeAliases() {
2682
- return Object.keys(EVALUATOR_TYPE_ALIASES);
2683
- }
2684
- function isEvaluatorTypeId(value) {
2685
- return value in EVALUATOR_TYPE_REGISTRY;
2686
- }
2687
- function getEvaluatorTypeDefinition(typeId) {
2688
- if (!isEvaluatorTypeId(typeId)) {
2689
- return null;
2690
- }
2691
- return EVALUATOR_TYPE_REGISTRY[typeId];
2692
- }
2693
- function resolveEvaluatorType(type) {
2694
- const resolved = EVALUATOR_TYPE_ALIASES[type] ?? type;
2695
- if (!isEvaluatorTypeId(resolved)) {
2696
- throw new Error(`Unknown evaluator type "${type}". Valid types: ${evaluatorTypeAliases().join(", ")}`);
2697
- }
2698
- return resolved;
2699
- }
2700
- function getDefaultConfigForEvaluatorType(typeId) {
2701
- return collectFieldDefaults(EVALUATOR_TYPE_REGISTRY[typeId].configFields);
2702
- }
2703
- function collectFieldDefaults(fields) {
2704
- const defaults = {};
2705
- for (const field of fields) {
2706
- if (field.default !== undefined) {
2707
- defaults[field.key] = field.default;
2708
- }
2709
- }
2710
- return defaults;
2711
- }
2712
- function evaluatorTypeHasConfigField(typeId, fieldKey) {
2713
- return getEvaluatorTypeDefinition(typeId)?.configFields.some((field) => field.key === fieldKey) ?? false;
2714
- }
2715
- function evaluatorCanUseSharedExpectedOutput(typeId) {
2716
- return getEvaluatorTypeDefinition(typeId)?.criteriaFields.some((field) => field.key === "expectedOutput" && field.type === "object") ?? false;
2717
- }
2718
- // src/services/flow-eval-utils.ts
2719
- function isRecord(value) {
2720
- return typeof value === "object" && value !== null && !Array.isArray(value);
2721
- }
2722
- var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
2723
- function isUUID(value) {
2724
- return UUID_RE.test(value);
2725
- }
2726
- function stripJsonExt(name) {
2727
- return name.endsWith(".json") ? name.slice(0, -".json".length) : name;
2728
- }
2729
- function slugify(text) {
2730
- const slug = text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
2731
- return slug || "untitled";
2732
- }
2733
- function getEvaluatorRef(evaluator) {
2734
- return stripJsonExt(evaluator.fileName ?? `${evaluator.id}.json`);
2735
- }
2736
- function buildEvaluatorConfig(typeId, options) {
2737
- const evaluatorConfig = {
2738
- name: options.name,
2739
- ...getDefaultConfigForEvaluatorType(typeId)
2740
- };
2741
- if (evaluatorTypeHasConfigField(typeId, "targetOutputKey")) {
2742
- evaluatorConfig.targetOutputKey = options.targetOutputKey ?? "*";
2743
- }
2744
- if (options.model !== undefined) {
2745
- evaluatorConfig.model = options.model;
2746
- }
2747
- if (options.prompt !== undefined) {
2748
- evaluatorConfig.prompt = options.prompt;
2749
- }
2750
- return evaluatorConfig;
2751
- }
2752
- function buildDefaultCriteria(evaluators, expectedOutput, searchText) {
2753
- const criterias = {};
2754
- for (const evaluator of evaluators) {
2755
- const key = evaluator.id;
2756
- if (expectedOutput !== undefined && evaluatorCanUseSharedExpectedOutput(evaluator.evaluatorTypeId)) {
2757
- criterias[key] = { expectedOutput };
2758
- } else if (searchText !== undefined && evaluator.evaluatorTypeId === "uipath-contains") {
2759
- criterias[key] = { searchText };
2760
- } else {
2761
- const defaultCriteria = evaluator.evaluatorConfig.defaultEvaluationCriteria;
2762
- criterias[key] = isRecord(defaultCriteria) ? defaultCriteria : null;
2763
- }
2764
- }
2765
- return criterias;
2766
- }
2767
-
2768
2493
  // src/services/flow-eval-input-schema.ts
2769
2494
  class FlowEvalInputSchema {
2770
2495
  fs;
@@ -3868,7 +3593,7 @@ class FlowLocalWorkspaceEvalPreparer {
3868
3593
  }
3869
3594
  const projectName = projectFile.Name;
3870
3595
  const safeProjectName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
3871
- const flowFilePath = await findProjectFlowFile(absoluteProjectPath, projectFile.MainFile, safeProjectName);
3596
+ const flowFilePath = await resolveProjectFlowFile(absoluteProjectPath);
3872
3597
  const flowFileName = this.fs.path.basename(flowFilePath);
3873
3598
  const flowBaseName = flowFileName.replace(/\.flow$/i, "");
3874
3599
  const bpmnFileName = `${flowBaseName}.bpmn`;
@@ -3930,6 +3655,10 @@ class FlowLocalWorkspaceEvalPreparer {
3930
3655
  }
3931
3656
  }
3932
3657
  async convertToBpmn(workflow) {
3658
+ const hasVoiceAgent = (workflow.nodes ?? []).some((node) => isVoiceAgentNodeType(node.type));
3659
+ if (hasVoiceAgent) {
3660
+ throw new Error("Evaluation runs are not supported for flows with voice agent nodes.");
3661
+ }
3933
3662
  const fileFormat = inMemoryWorkflowToFileFormat(workflow);
3934
3663
  setPublishIntentOnInlineAgents(fileFormat);
3935
3664
  const { bpmn } = await convertFlowToBpmn(JSON.stringify(fileFormat, null, 2));
@@ -6097,13 +5826,13 @@ function registerJobCommand(program) {
6097
5826
 
6098
5827
  // src/services/flow-migrate-service.ts
6099
5828
  var buildNodeMigrationRegistry = () => {
6100
- const registry2 = {};
5829
+ const registry = {};
6101
5830
  for (const [nodeType, mod] of Object.entries(nodeModuleRegistry)) {
6102
5831
  if (mod.migrations?.length) {
6103
- registry2[nodeType] = mod.migrations;
5832
+ registry[nodeType] = mod.migrations;
6104
5833
  }
6105
5834
  }
6106
- return registry2;
5835
+ return registry;
6107
5836
  };
6108
5837
  var netWorkflowSteps = (fromVersion, steps) => {
6109
5838
  const cmp = compareVersions(fromVersion, minimumSupportedVersion);
@@ -6124,12 +5853,12 @@ var migrateFlow = async (filePath, options = {}) => {
6124
5853
  }
6125
5854
  const migrated = wfResult.migrated ? wfResult.workflow : workflow;
6126
5855
  const workflowSteps = wfResult.migrated ? netWorkflowSteps(fromVersion, wfResult.steps) : [];
6127
- const registry2 = buildNodeMigrationRegistry();
5856
+ const registry = buildNodeMigrationRegistry();
6128
5857
  const allNodes = [
6129
5858
  ...migrated.nodes ?? [],
6130
5859
  ...Object.values(migrated.subflows ?? {}).flatMap((sf) => sf?.nodes ?? [])
6131
5860
  ];
6132
- const check = checkNodeMigrations(allNodes, allDefinitions, registry2);
5861
+ const check = checkNodeMigrations(allNodes, allDefinitions, registry);
6133
5862
  const includeOptional = options.includeOptional ?? true;
6134
5863
  const toApply = includeOptional ? [...check.forced, ...check.optional] : check.forced;
6135
5864
  const nodeResult = applyNodeMigrations(migrated, toApply);
@@ -7507,7 +7236,7 @@ Packing flow project...
7507
7236
  const packageId = `${packageName}.flow.Flow`;
7508
7237
  const version = options.version || "1.0.0";
7509
7238
  registerPackagerFactories();
7510
- const { createNodeProjectPackager, ProjectPackOptions } = await import("./node-rnmmv28d.js");
7239
+ const { createNodeProjectPackager, ProjectPackOptions } = await import("./node-qyxvhbw6.js");
7511
7240
  const packager = await createNodeProjectPackager({
7512
7241
  logHandler: logger.handleLog
7513
7242
  });
@@ -7553,21 +7282,31 @@ Packing flow project...
7553
7282
  if (await this.fs.exists(uiprojPath)) {
7554
7283
  await this.fs.writeFile(this.fs.path.join(stagingDir, "project.uiproj"), await this.fs.readFile(uiprojPath, "utf-8"));
7555
7284
  }
7285
+ const flowNodes = flowContent.nodes;
7286
+ const inlineAgents = await packageInlineAgents(this.fs, projectPath, flowNodes);
7287
+ if (inlineAgents.length > 0) {
7288
+ logger.info(`Found ${inlineAgents.length} inline agent(s) to package`);
7289
+ }
7556
7290
  logger.info("Converting .flow to BPMN...");
7557
7291
  const fileFormat = inMemoryWorkflowToFileFormat(flowContent);
7558
7292
  setPublishIntentOnInlineAgents(fileFormat);
7559
- const { bpmn: rawBpmn } = await convertFlowToBpmn(JSON.stringify(fileFormat, null, 2));
7293
+ const flowJson = JSON.stringify(fileFormat, null, 2);
7294
+ const { bpmn: rawBpmn } = await convertFlowToBpmn(flowJson, voiceConvertOptions({
7295
+ flowJson,
7296
+ nodes: flowNodes,
7297
+ builtAgents: new Map(inlineAgents.map((agent) => [
7298
+ agent.source,
7299
+ agent.agentJson
7300
+ ]))
7301
+ }));
7560
7302
  const bpmn = replaceExporterVersion(rawBpmn, package_default.version);
7303
+ assertVoiceAgentDefinitionsEmbedded(bpmn, flowNodes);
7561
7304
  const bpmnFileName = `${safeName}.bpmn`;
7562
7305
  await this.fs.writeFile(this.fs.path.join(stagingDir, bpmnFileName), bpmn);
7563
7306
  logger.info("Generating packaging artifacts...");
7564
7307
  const packagingNodes = fileNodesToPackagingNodes(flowContent.nodes);
7565
7308
  const startEventId = extractStartEventId(bpmn);
7566
7309
  const projectId = flowContent.id || await ensureProjectId(projectPath, this.fs);
7567
- const inlineAgents = await packageInlineAgents(this.fs, projectPath, flowContent.nodes);
7568
- if (inlineAgents.length > 0) {
7569
- logger.info(`Found ${inlineAgents.length} inline agent(s) to package`);
7570
- }
7571
7310
  const packageDescriptorJson = inlineAgents.length > 0 ? generatePackageDescriptor([{ name: bpmnFileName }], [{ name: `${safeName}.flow` }], inlineAgents.map((agent) => ({
7572
7311
  name: `${agent.source}/agent.json`
7573
7312
  }))) : undefined;
@@ -8538,6 +8277,9 @@ function buildArtifactParentWrappers(artifactGroups) {
8538
8277
  }
8539
8278
  var ARTIFACT_GROUP_SPACING = 96;
8540
8279
  var ARTIFACT_HORIZONTAL_SPACING = ARTIFACT_GROUP_SPACING / 2;
8280
+ var edgeNodeClearance = (options) => snapToGrid(options.layerSpacing / 2);
8281
+ var EDGE_EDGE_CLEARANCE_PX = GRID_SPACING;
8282
+ var GRID_PADDING = `[top=${GRID_SPACING},left=${GRID_SPACING},bottom=${GRID_SPACING},right=${GRID_SPACING}]`;
8541
8283
  function makeGroupId(group) {
8542
8284
  return `${group.parentId}__${group.sourceHandle}_group`;
8543
8285
  }
@@ -8826,7 +8568,7 @@ var ElkLayoutEngine = class {
8826
8568
  for (const edge of root.edges ?? []) {
8827
8569
  if (!realEdgeIds.has(edge.id))
8828
8570
  continue;
8829
- const points = (edge.sections ?? []).flatMap((s) => s.bendPoints ?? []).map((p) => ({ x: p.x, y: p.y }));
8571
+ const points = (edge.sections ?? []).flatMap((s) => s.bendPoints ?? []).map((p) => ({ x: snapToGrid(p.x), y: snapToGrid(p.y) }));
8830
8572
  if (points.length > 0)
8831
8573
  result.set(edge.id, points);
8832
8574
  }
@@ -8837,7 +8579,8 @@ var ElkLayoutEngine = class {
8837
8579
  "elk.algorithm": options.algorithm,
8838
8580
  "elk.direction": options.direction,
8839
8581
  "elk.spacing.nodeNode": options.nodeSpacing.toString(),
8840
- "elk.layered.considerModelOrder.strategy": "NODES_AND_EDGES"
8582
+ "elk.layered.considerModelOrder.strategy": "NODES_AND_EDGES",
8583
+ "elk.padding": GRID_PADDING
8841
8584
  };
8842
8585
  switch (options.algorithm) {
8843
8586
  case "layered":
@@ -8847,8 +8590,10 @@ var ElkLayoutEngine = class {
8847
8590
  if (options.minimizeCrossings) {
8848
8591
  opts["elk.layered.crossingMinimization.strategy"] = "LAYER_SWEEP";
8849
8592
  }
8593
+ opts["elk.layered.cycleBreaking.strategy"] = "GREEDY_MODEL_ORDER";
8850
8594
  opts["elk.spacing.edgeNode"] = options.nodeSpacing.toString();
8851
- opts["elk.spacing.edgeEdge"] = "16";
8595
+ opts["elk.spacing.edgeEdge"] = EDGE_EDGE_CLEARANCE_PX.toString();
8596
+ opts["elk.layered.spacing.edgeNodeBetweenLayers"] = edgeNodeClearance(options).toString();
8852
8597
  opts["elk.edgeRouting"] = "ORTHOGONAL";
8853
8598
  break;
8854
8599
  case "mrtree":
@@ -9462,7 +9207,7 @@ function querystringSingleKey(key, value, keyPrefix = "") {
9462
9207
  var package_default2 = {
9463
9208
  name: "@uipath/agent-sdk",
9464
9209
  license: "MIT",
9465
- version: "1.201.0-preview.131",
9210
+ version: "1.201.0-preview.133",
9466
9211
  description: "SDK for the UiPath Agent Runtime API — evaluation execution and debug sessions.",
9467
9212
  repository: {
9468
9213
  type: "git",
@@ -10039,6 +9784,32 @@ var registerVariableCommand = (program) => {
10039
9784
  });
10040
9785
  };
10041
9786
 
9787
+ // src/services/project-metadata-reader.ts
9788
+ async function readAgentProjectMetadata(projectDir) {
9789
+ const fs = getFileSystem();
9790
+ const [readError, content] = await catchError(fs.readFile(fs.path.join(projectDir, "agent.json"), "utf-8"));
9791
+ if (readError || typeof content !== "string") {
9792
+ logger.debug(`No readable agent.json in ${projectDir}; the node will describe an autonomous agent.`);
9793
+ return {};
9794
+ }
9795
+ const [parseError, parsed] = catchError(() => JSON.parse(content));
9796
+ if (parseError) {
9797
+ logger.debug(`Unparseable agent.json in ${projectDir}: ${parseError.message}. The node will describe an autonomous agent.`);
9798
+ return {};
9799
+ }
9800
+ const metadata = {};
9801
+ const isConversational = parsed.metadata?.isConversational;
9802
+ if (typeof isConversational === "boolean") {
9803
+ metadata.isConversational = isConversational;
9804
+ }
9805
+ const targetRuntime = parsed.metadata?.targetRuntime;
9806
+ if (typeof targetRuntime === "string") {
9807
+ metadata.targetRuntime = targetRuntime;
9808
+ }
9809
+ return metadata;
9810
+ }
9811
+ var agentProjectMetadataReader = (projectDir, projectType) => projectType === "Agent" ? readAgentProjectMetadata(projectDir) : Promise.resolve({});
9812
+
10042
9813
  // src/tool.ts
10043
9814
  var metadata = {
10044
9815
  name: "flow-tool",
@@ -10047,8 +9818,9 @@ var metadata = {
10047
9818
  commandPrefix: "flow"
10048
9819
  };
10049
9820
  var registerCommands = async (program) => {
9821
+ setAgentProjectMetadataReader(agentProjectMetadataReader);
10050
9822
  if (isPreviewBuild()) {
10051
- const { registerFlowAuthoringCommands } = await import("./authoring-rezk32bm.js");
9823
+ const { registerFlowAuthoringCommands } = await import("./authoring-7r6g06c7.js");
10052
9824
  registerFlowAuthoringCommands(program);
10053
9825
  }
10054
9826
  registerInitCommand(program);
@@ -10075,4 +9847,4 @@ var registerCommands = async (program) => {
10075
9847
 
10076
9848
  export { metadata, registerCommands };
10077
9849
 
10078
- //# debugId=B3E3EAE6A8F11D5564756E2164756E21
9850
+ //# debugId=F3EA07DA9BDB131D64756E2164756E21