@uipath/flow-tool 1.201.0-preview.115 → 1.201.0-preview.121

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 (119) hide show
  1. package/dist/{authoring-vbbqwp0v.js → authoring-rezk32bm.js} +64 -20
  2. package/dist/{conversion-MQ7TJMHW-5zbdb6y2.js → conversion-W6HMHBWW-jnk9z7rw.js} +42 -34
  3. package/dist/{de-JT3SUGT4-msgpbdge.js → de-B2KIY5TC-81f703v3.js} +14 -5
  4. package/dist/{de-3RMZHIP6-1na18a74.js → de-K6MLR24N-00fjz82b.js} +474 -51
  5. package/dist/{de-3RMZHIP6-QW5DEMLQ-fw64syvn.js → de-K6MLR24N-5N5XGLH6-gbwpvdz4.js} +476 -53
  6. package/dist/{de-LVBY3VVG-tc58p3x6.js → de-WMKOGI7B-r1821wpe.js} +16 -7
  7. package/dist/de-XLT4QPIP-0rtw349w.js +32 -0
  8. package/dist/{en-JGJNQYMG-BSN3EE6C-mhg57v8h.js → en-ILA4HPE5-ALHGESZE-zrv4qss8.js} +267 -7
  9. package/dist/{en-JGJNQYMG-xq29xvhk.js → en-ILA4HPE5-fhwvq92r.js} +264 -4
  10. package/dist/{en-H54NJOH6-30ht8n64.js → en-P6PNWNTO-g1f6cjh5.js} +10 -4
  11. package/dist/{en-4UFXRW7N-mqabr9tf.js → en-X4DLPKLJ-dt1wtdm7.js} +17 -5
  12. package/dist/{es-GJOELELT-w1d3agm2.js → es-BBX4AUJX-h99fcr53.js} +14 -5
  13. package/dist/{es-CI4AE5B5-55sgqk64.js → es-BVPGJUWA-9gk2g9yb.js} +16 -7
  14. package/dist/{es-EYHYM5C4-RMLHZ2LF-s0fc3pd6.js → es-HTQSD352-YTAEDCE5-nhsbg581.js} +470 -47
  15. package/dist/{es-EYHYM5C4-3bajghda.js → es-HTQSD352-m9rr3f0g.js} +468 -45
  16. package/dist/{es-MX-AMZIGU27-5pembt6k.js → es-MX-3SP2SSV6-f20qspbr.js} +14 -5
  17. package/dist/{es-MX-QSQP2KWV-qvgkwvz2.js → es-MX-FOX525CG-87g500gr.js} +474 -51
  18. package/dist/{es-MX-QSQP2KWV-XR5DWKNF-kp7pk2s4.js → es-MX-FOX525CG-HLM27OEL-whr0t9v3.js} +476 -53
  19. package/dist/es-MX-OKNDG2NH-c1k1s1tg.js +32 -0
  20. package/dist/{es-MX-OLZNAYY5-30cmv1dx.js → es-MX-U6YL5KQX-ynwxdjr8.js} +16 -7
  21. package/dist/es-NQICVYSQ-aa9z3nhs.js +32 -0
  22. package/dist/{fr-FXFJQRD3-F5HV2VS7-pwdze89j.js → fr-54THJ4QH-IGABNGU6-fpzw2mba.js} +475 -52
  23. package/dist/{fr-FXFJQRD3-rfztd3e5.js → fr-54THJ4QH-d6ezjbhw.js} +473 -50
  24. package/dist/{fr-CCN6ZO5E-x2akzsjt.js → fr-EKTTDR7Z-bmpwp31r.js} +16 -7
  25. package/dist/{fr-LYFYWWCC-nn4reak0.js → fr-FSTBVVGK-t3y57xrb.js} +14 -5
  26. package/dist/fr-PFHIL7YZ-cxnshwa8.js +32 -0
  27. package/dist/index-6hp3p3eq.js +16489 -0
  28. package/dist/{index-w23k88b5.js → index-p50kx6jv.js} +202 -64
  29. package/dist/{index-hzp6y5m7.js → index-q59ephfh.js} +57 -3
  30. package/dist/index.js +19 -16
  31. package/dist/init.js +14 -11
  32. package/dist/{ja-IRXXIG6Q-b3att2bw.js → ja-FW33BJBW-htfk4d8t.js} +14 -5
  33. package/dist/{ja-G7NJYQ42-ve4gadd7.js → ja-MHUPLSWO-3qwy4jc0.js} +470 -47
  34. package/dist/{ja-G7NJYQ42-X76DVL7A-9p8b5115.js → ja-MHUPLSWO-CS3KE4Y3-mbtkzwd7.js} +472 -49
  35. package/dist/ja-P4OSE367-8ywxep9a.js +32 -0
  36. package/dist/{ja-O2NEV5D6-nt9rhd8c.js → ja-Y2YBTXNN-96cvy5av.js} +16 -7
  37. package/dist/{ko-M32WKZ3I-5td5jsw7.js → ko-PDO5AXNW-d653t4pc.js} +14 -5
  38. package/dist/ko-PYOS2KJP-5sbj5bp8.js +32 -0
  39. package/dist/{ko-7XWV2SEQ-chk3y7aj.js → ko-S33XAV26-cxf4dn2t.js} +16 -7
  40. package/dist/{ko-QDHECDTM-6WJAKMQI-0fpd4dqj.js → ko-XPJTXIKK-DNSW4KYQ-956vp61f.js} +469 -46
  41. package/dist/{ko-QDHECDTM-zmbqs9pr.js → ko-XPJTXIKK-w1hs4px7.js} +467 -44
  42. package/dist/{node-6xp9wf15.js → node-f062h75p.js} +11 -5
  43. package/dist/{node-strategy-fwj45942.js → node-strategy-8gzp67xs.js} +4 -4
  44. package/dist/{packager-tool-kvgt1s4z.js → packager-tool-03knb0er.js} +287 -22
  45. package/dist/{packager-tool-9ae2gt84.js → packager-tool-1g6958de.js} +19 -8
  46. package/dist/{packager-tool-vz3b1ea9.js → packager-tool-1gt6js73.js} +7 -914
  47. package/dist/{packager-tool-973f0r2g.js → packager-tool-1yy9x4vk.js} +17 -5
  48. package/dist/{packager-tool-jqtspg41.js → packager-tool-3wf3tkrc.js} +11 -5
  49. package/dist/packager-tool-6a7wdv5z.js +36187 -0
  50. package/dist/{packager-tool-mtrz8981.js → packager-tool-9x76z587.js} +140 -239
  51. package/dist/packager-tool-b0s5d4ek.js +10671 -0
  52. package/dist/{packager-tool-htc0z863.js → packager-tool-cqrsre00.js} +282 -27
  53. package/dist/{packager-tool-q9zrqwxw.js → packager-tool-ef2aypt3.js} +3257 -2669
  54. package/dist/{packager-tool-h3gpqv5a.js → packager-tool-jeh5j2xy.js} +6939 -3736
  55. package/dist/packager-tool-jpcm3xas.js +12 -0
  56. package/dist/{packager-tool-3gmj73c5.js → packager-tool-neavt1k3.js} +1 -1
  57. package/dist/packager-tool-nkrmjr3a.js +915 -0
  58. package/dist/{packager-tool-p1ts5b0h.js → packager-tool-ny53xmsd.js} +129 -49
  59. package/dist/{packager-tool-fr5b9qs6.js → packager-tool-pvgqbm48.js} +3 -3
  60. package/dist/{packager-tool-9qhez6bh.js → packager-tool-qfp49pq4.js} +964 -526
  61. package/dist/packager-tool-v2p6g3fd.js +41 -0
  62. package/dist/{packager-tool-2vme4a8e.js → packager-tool-xa2xwzrq.js} +9864 -16886
  63. package/dist/packager-tool.js +9 -8
  64. package/dist/{pt-VXJT4WUJ-nwkc9k2p.js → pt-4JEPEAST-40npwxyw.js} +471 -48
  65. package/dist/{pt-VXJT4WUJ-M3IR7CL5-1f2ph8gm.js → pt-4JEPEAST-JO5WN33S-ccdbdab2.js} +473 -50
  66. package/dist/{pt-BR-Z4J3LEEO-cf33d2zv.js → pt-BR-JO45SCNI-4kbfnzc4.js} +16 -7
  67. package/dist/{pt-BR-57EHXZKB-8g83gr5g.js → pt-BR-LQH3RSBB-kyb4jmcw.js} +14 -5
  68. package/dist/{pt-BR-SADBLGXA-WG4Q265J-w9tshygt.js → pt-BR-TV7NR3ID-PDSSHRHU-nddwzj29.js} +472 -49
  69. package/dist/{pt-BR-SADBLGXA-yd89fdy2.js → pt-BR-TV7NR3ID-vgd26pj1.js} +470 -47
  70. package/dist/pt-BR-Z3TUDJHM-n7ngej6s.js +32 -0
  71. package/dist/{pt-VNM2XWHA-62z625rh.js → pt-JLZYSSXX-7jth254x.js} +14 -5
  72. package/dist/pt-KSBWHAVQ-hd52bpsz.js +32 -0
  73. package/dist/{pt-CRSN3TCU-txxbbcxm.js → pt-W3NA4LIZ-f02gapvs.js} +16 -7
  74. package/dist/{ro-RISZ75LL-zwztp9j5.js → ro-E2EBPQGT-vn573vcr.js} +14 -5
  75. package/dist/{ro-7JHKFGCH-H3RYKSCL-4w49rx4m.js → ro-RKJ74FV3-QS3I6XKJ-kb31d85k.js} +475 -52
  76. package/dist/{ro-7JHKFGCH-hbtkeqdr.js → ro-RKJ74FV3-qn0ey39v.js} +473 -50
  77. package/dist/ro-VZUZTAMR-tccygznf.js +32 -0
  78. package/dist/{ro-WMQEVD7D-6mtq0e6b.js → ro-WLKX6HF5-fcbe2zz8.js} +16 -7
  79. package/dist/ru-GSCT4ARZ-3TVTUGWP-bbg6360z.js +15 -0
  80. package/dist/{serialization-JNQMGOXW-mj06e5pv.js → serialization-GTFWODSH-ajd6b7n2.js} +10 -8
  81. package/dist/services/flow-validate-service.d.ts +108 -0
  82. package/dist/services/node-service.d.ts +46 -0
  83. package/dist/services/node-validators/ceql-query-validator.d.ts +36 -10
  84. package/dist/services/node-validators/expression-prefix-validator.d.ts +3 -2
  85. package/dist/services/node-validators/index.d.ts +2 -1
  86. package/dist/services/project-artifacts.d.ts +14 -1
  87. package/dist/tool.js +17 -14
  88. package/dist/{tr-UCMB7W3T-xmxp2naq.js → tr-3U2W2XCA-zg3zcmq3.js} +15 -6
  89. package/dist/tr-W4AVRSQ4-bt3qqqdy.js +32 -0
  90. package/dist/{tr-Q6IHBFK7-BEUWO5CI-29rgfwjy.js → tr-X7R6GQNB-VMEZAWRJ-vdbjqw23.js} +484 -61
  91. package/dist/{tr-Q6IHBFK7-zs9rsm1b.js → tr-X7R6GQNB-shwv16dz.js} +482 -59
  92. package/dist/{tr-AUPQF34V-y3dhtj0w.js → tr-ZUUSMHER-pfn5dq1r.js} +14 -5
  93. package/dist/validation.js +14 -11
  94. package/dist/zh-CN-6YRAN57T-j7jp34ws.js +32 -0
  95. package/dist/{zh-CN-3BPA3WIX-JDICNKGH-m87940q5.js → zh-CN-FEZ24J4A-LSEMG63K-db8kf6rm.js} +472 -49
  96. package/dist/{zh-CN-3BPA3WIX-c5ts2m5v.js → zh-CN-FEZ24J4A-q5b5x20w.js} +470 -47
  97. package/dist/{zh-CN-2QOHEFC5-ryjb2byk.js → zh-CN-IPZYQR3P-1h76csc4.js} +16 -7
  98. package/dist/{zh-CN-3INOX2E5-txhr8e18.js → zh-CN-YFKQ7HBX-w98q5zqf.js} +14 -5
  99. package/dist/{zh-TW-UI34YLZQ-j79rg6b7.js → zh-TW-CP5PCVEJ-wvbxf7c7.js} +14 -5
  100. package/dist/{zh-TW-QCJEQC5S-b1v637hd.js → zh-TW-GKSCT6NW-4n1yfre0.js} +464 -41
  101. package/dist/{zh-TW-QCJEQC5S-DQ3454QP-y8vvrebz.js → zh-TW-GKSCT6NW-JLMWTDAF-g2smq1gm.js} +466 -43
  102. package/dist/zh-TW-SO2245GN-m5kh88bg.js +32 -0
  103. package/dist/{zh-TW-Q5QSSTS6-6y7yjbbn.js → zh-TW-YPVSQVGT-wbybwpwt.js} +16 -7
  104. package/package.json +2 -2
  105. package/dist/de-CS2KUCZ6-j5a38g9p.js +0 -20
  106. package/dist/es-MX-3MRZG6V4-9z56akxp.js +0 -20
  107. package/dist/es-QBAGOKHO-b2azze22.js +0 -20
  108. package/dist/fr-HVOCQCNI-1zn75qzy.js +0 -20
  109. package/dist/ja-VYAZOLWC-nbagzgre.js +0 -20
  110. package/dist/ko-EZTVBPMZ-9qq2mrrz.js +0 -20
  111. package/dist/packager-tool-ahm4ymrp.js +0 -12
  112. package/dist/packager-tool-hcdc89cf.js +0 -14010
  113. package/dist/pt-3TKAWGMJ-58y42w7x.js +0 -20
  114. package/dist/pt-BR-ASMQE3WA-9wb74cqx.js +0 -20
  115. package/dist/ro-A65KBZGL-qnwqqezz.js +0 -20
  116. package/dist/ru-GSCT4ARZ-YSDBAAM2-ha88ztsj.js +0 -15
  117. package/dist/tr-Z7YHMEX6-daq3vjbh.js +0 -20
  118. package/dist/zh-CN-W7FK4GLU-vn3n8fcq.js +0 -20
  119. package/dist/zh-TW-PHOEUN3F-t56cjsgw.js +0 -20
@@ -1,24 +1,26 @@
1
1
  import {
2
2
  ManifestClient,
3
3
  buildErrorHandle,
4
- findNearestParentUipxFile,
5
4
  getConnectorInfo,
6
- getLoginStatusAsync,
7
5
  getNode,
8
6
  isConnectorNode,
9
7
  isKnownSdkNodeType,
10
8
  loadRegistry,
11
9
  readFlowWorkflow,
12
- readSolutionManifest,
13
10
  validateIntSvcNode,
14
11
  writeFlowWorkflow
15
- } from "./packager-tool-2vme4a8e.js";
12
+ } from "./packager-tool-xa2xwzrq.js";
13
+ import {
14
+ findNearestParentUipxFile,
15
+ getLoginStatusAsync,
16
+ readSolutionManifest
17
+ } from "./packager-tool-b0s5d4ek.js";
16
18
  import {
17
19
  OutputFormatter,
18
20
  RESULTS,
19
21
  catchError,
20
22
  logger
21
- } from "./packager-tool-p1ts5b0h.js";
23
+ } from "./packager-tool-ny53xmsd.js";
22
24
  import {
23
25
  getFileSystem
24
26
  } from "./packager-tool-1cb0d5e0.js";
@@ -36,7 +38,7 @@ import {
36
38
  resolveWorkflowRefs,
37
39
  runtimeMigrations,
38
40
  runtimeVersion
39
- } from "./packager-tool-hcdc89cf.js";
41
+ } from "./packager-tool-6a7wdv5z.js";
40
42
  import {
41
43
  EntryPointType,
42
44
  ProjectType,
@@ -52,11 +54,12 @@ import {
52
54
  instance,
53
55
  isBlockingSeverity,
54
56
  isExpressionValue,
57
+ isStartEventNode,
55
58
  mergeBindingResources,
56
59
  parseWorkflowJson,
57
60
  registerFlowSchemaI18n,
58
61
  runRules
59
- } from "./packager-tool-q9zrqwxw.js";
62
+ } from "./packager-tool-ef2aypt3.js";
60
63
 
61
64
  // src/services/connector-node-types.ts
62
65
  function isConnectorTriggerType(nodeType) {
@@ -114,7 +117,7 @@ function validateCeqlFilterShape(nodeId, detail) {
114
117
  issues.push({
115
118
  path: `nodes[${nodeId}].inputs.detail.queryParameters["$where"]`,
116
119
  severity: "error",
117
- message: 'Connector node uses OData-style `"$where"` (with leading `$`) ' + "in queryParameters. CEQL uses bare `where` — rename the key " + 'from `"$where"` to `"where"`. The leading `$` is the OData ' + "system-query-option prefix and is not recognized by " + "uipath.connector.* nodes. See uipath-maestro-flow skill — " + "ceql-filters reference (MST-9265)."
120
+ message: 'Connector node uses OData-style `"$where"` (with leading `$`) ' + "in queryParameters. CEQL uses bare `where` — rename the key " + 'from `"$where"` to `"where"`. The leading `$` is the OData ' + "system-query-option prefix and is not recognized by " + "uipath.connector.* nodes. See uipath-maestro-flow skill — " + 'plugins/connector/impl.md, "Hand-authored CEQL strings" ' + "(MST-9265)."
118
121
  });
119
122
  }
120
123
  const queryWhere = queryParameters?.where;
@@ -126,14 +129,14 @@ function validateCeqlFilterShape(nodeId, detail) {
126
129
  issues.push({
127
130
  path: `nodes[${nodeId}].inputs.detail.savedFilterTrees.where`,
128
131
  severity: "error",
129
- message: "Connector node has `queryParameters.where` set but no " + "matching `savedFilterTrees.where` AST — neither at " + "`inputs.detail.savedFilterTrees.where` nor as " + "`essentialConfiguration.savedFilterTrees.where` inside " + "`inputs.detail.configuration`. CEQL filters must be authored " + "as both the raw filter expression (`queryParameters.where`) " + "AND a parallel canonical AST (`filters[].id` / `.operator` / " + "`.value.value`). The Studio Web canvas needs the AST to " + "render the filter UI; the runtime needs the expression. " + "Re-run `uip maestro flow node configure --detail.filter` to " + "author both. See uipath-maestro-flow skill — ceql-filters " + "reference (MST-9265)."
132
+ message: "Connector node has `queryParameters.where` set but no " + "matching `savedFilterTrees.where` AST — neither at " + "`inputs.detail.savedFilterTrees.where` nor as " + "`essentialConfiguration.savedFilterTrees.where` inside " + "`inputs.detail.configuration`. CEQL filters must be authored " + "as both the raw filter expression (`queryParameters.where`) " + "AND a parallel canonical AST (`filters[].id` / `.operator` / " + "`.value.value`). The Studio Web canvas needs the AST to " + "render the filter UI; the runtime needs the expression. " + "Re-run `uip maestro flow node configure --detail.filter` to " + "author both. See uipath-maestro-flow skill — " + 'plugins/connector/impl.md, "Hand-authored CEQL strings" ' + "(MST-9265)."
130
133
  });
131
134
  }
132
135
  if (savedWhereAuthored && !queryWhereAuthored) {
133
136
  issues.push({
134
137
  path: `nodes[${nodeId}].inputs.detail.queryParameters.where`,
135
138
  severity: "error",
136
- message: "Connector node has `savedFilterTrees.where` AST but no " + "matching `queryParameters.where` expression. CEQL filters " + "must be authored on both keys in parallel — the runtime " + "evaluates `queryParameters.where`, not the AST. See " + "uipath-maestro-flow skill — ceql-filters reference (MST-9265)."
139
+ message: "Connector node has `savedFilterTrees.where` AST but no " + "matching `queryParameters.where` expression. CEQL filters " + "must be authored on both keys in parallel — the runtime " + "evaluates `queryParameters.where`, not the AST. See " + 'uipath-maestro-flow skill — plugins/connector/impl.md, "Hand-authored ' + 'CEQL strings" (MST-9265).'
137
140
  });
138
141
  }
139
142
  return issues;
@@ -201,438 +204,80 @@ function shellSingleQuote(value) {
201
204
  return `'${value.replace(/'/g, "'\\''")}'`;
202
205
  }
203
206
 
204
- // src/services/node-validators/ceql-query-validator.ts
205
- var CEQL_SYMBOL_OPERATORS = ["=", "!=", "<", "<=", ">", ">="];
206
- var CEQL_WORD_OPERATORS = [
207
- "In",
208
- "Not In",
209
- "Like",
210
- "Not Like",
211
- "Contains",
212
- "Not Contains",
213
- "Starts With",
214
- "Not Starts With",
215
- "Ends With",
216
- "Not Ends With",
217
- "Is Null",
218
- "Is Not Null"
219
- ];
220
- var byLengthDescending = (a, b) => b.length - a.length;
221
- var escapeRegexToken = (token) => token.replace(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
222
- var toWordOperatorPattern = (token) => token.split(/\s+/).map(escapeRegexToken).join(String.raw`\s+`);
223
- var CEQL_SYMBOL_OPERATOR_ALTERNATION = [...CEQL_SYMBOL_OPERATORS].sort(byLengthDescending).map(escapeRegexToken).join("|");
224
- var CEQL_WORD_OPERATOR_ALTERNATION = [...CEQL_WORD_OPERATORS].sort(byLengthDescending).map(toWordOperatorPattern).join("|");
225
- var CEQL_OPERATOR = String.raw`(?:${CEQL_SYMBOL_OPERATOR_ALTERNATION}|(?:${CEQL_WORD_OPERATOR_ALTERNATION})\b)`;
226
- var CEQL_QUOTED_FIELD_RE = new RegExp(String.raw`(?:^|\bAND\b|\bOR\b|\()\s*'([^']*)'\s*(?=${CEQL_OPERATOR})`, "gi");
227
- var CEQL_FILTER_PARAMETERS = new Set(["where", "queryExpression"]);
228
- var JS_TEMPLATE_RE = /^=js:\s*`([\s\S]*)`$/;
229
- function readCeqlBody(value) {
230
- const trimmed = value.trim();
231
- if (!trimmed.startsWith("=js:")) {
232
- if (trimmed.startsWith("="))
233
- return;
234
- return { body: value, wrap: (body) => body };
207
+ // ../../node_modules/acorn/dist/acorn.mjs
208
+ var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 78, 5, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 199, 7, 137, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 55, 9, 266, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 233, 0, 3, 0, 8, 1, 6, 0, 475, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
209
+ var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 7, 25, 39, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 5, 57, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 24, 43, 261, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 33, 24, 3, 24, 45, 74, 6, 0, 67, 12, 65, 1, 2, 0, 15, 4, 10, 7381, 42, 31, 98, 114, 8702, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 208, 30, 2, 2, 2, 1, 2, 6, 3, 4, 10, 1, 225, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4381, 3, 5773, 3, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 8489];
210
+ var nonASCIIidentifierChars = "‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࢗ-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ-᫝᫠-᫫ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‌‍‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯・꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_・";
211
+ var nonASCIIidentifierStartChars = "ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-࢏ࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚ౜ౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽ೜-ೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲊᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-Ƛ꟱-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ";
212
+ var reservedWords = {
213
+ 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",
214
+ 5: "class enum extends super const export import",
215
+ 6: "enum",
216
+ strict: "implements interface let package private protected public static yield",
217
+ strictBind: "eval arguments"
218
+ };
219
+ var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this";
220
+ var keywords$1 = {
221
+ 5: ecma5AndLessKeywords,
222
+ "5module": ecma5AndLessKeywords + " export import",
223
+ 6: ecma5AndLessKeywords + " const class extends export import super"
224
+ };
225
+ var keywordRelationalOperator = /^in(stanceof)?$/;
226
+ var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
227
+ var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
228
+ function isInAstralSet(code, set) {
229
+ var pos = 65536;
230
+ for (var i = 0;i < set.length; i += 2) {
231
+ pos += set[i];
232
+ if (pos > code) {
233
+ return false;
234
+ }
235
+ pos += set[i + 1];
236
+ if (pos >= code) {
237
+ return true;
238
+ }
235
239
  }
236
- const template = JS_TEMPLATE_RE.exec(trimmed);
237
- if (!template)
238
- return;
239
- return {
240
- body: template[1],
241
- wrap: (body) => `=js:\`${body}\``
242
- };
240
+ return false;
243
241
  }
244
- function findCeqlQuotedFieldNames(value) {
245
- const ceql = readCeqlBody(value);
246
- if (!ceql)
247
- return [];
248
- const fieldNames = [];
249
- const fixedBody = ceql.body.replace(CEQL_QUOTED_FIELD_RE, (match, fieldName) => {
250
- fieldNames.push(fieldName);
251
- return match.replace(`'${fieldName}'`, () => fieldName);
252
- });
253
- if (fieldNames.length === 0)
254
- return [];
255
- let fixedValue = ceql.wrap(fixedBody);
256
- if (!fixedValue.trim().startsWith("=js:") && fixedValue.includes("${")) {
257
- fixedValue = `=js:\`${fixedValue}\``;
242
+ function isIdentifierStart(code, astral) {
243
+ if (code < 65) {
244
+ return code === 36;
258
245
  }
259
- return fieldNames.map((fieldName) => ({ fieldName, fixedValue }));
260
- }
261
- function ceqlQuotedFieldMessage(issue) {
262
- return `Quoted token '${issue.fieldName}' where CEQL expects a bare field name — ` + "Integration Service rejects this with [102003]. " + `Write "${issue.fixedValue}" instead. ` + "See uipath-maestro-flow skill — ceql-filters reference.";
263
- }
264
- function scanContainerForCeqlQuotedFields(obj, path, severity, issues) {
265
- if (typeof obj === "string") {
266
- for (const issue of findCeqlQuotedFieldNames(obj)) {
267
- issues.push({
268
- path,
269
- severity,
270
- message: ceqlQuotedFieldMessage(issue)
271
- });
272
- }
273
- return;
246
+ if (code < 91) {
247
+ return true;
274
248
  }
275
- if (Array.isArray(obj)) {
276
- for (let i = 0;i < obj.length; i++) {
277
- scanContainerForCeqlQuotedFields(obj[i], `${path}[${i}]`, severity, issues);
278
- }
279
- return;
249
+ if (code < 97) {
250
+ return code === 95;
280
251
  }
281
- if (obj && typeof obj === "object") {
282
- for (const [key, value] of Object.entries(obj)) {
283
- scanContainerForCeqlQuotedFields(value, `${path}.${key}`, severity, issues);
284
- }
252
+ if (code < 123) {
253
+ return true;
285
254
  }
286
- }
287
- var ceqlQueryValidator = {
288
- id: "ceql-query",
289
- appliesTo: (node) => {
290
- const t = node.type;
291
- if (!t)
292
- return false;
293
- if (isEventDrivenConnectorType(t))
294
- return false;
295
- return t.startsWith("uipath.connector.");
296
- },
297
- validate: (node, context) => {
298
- const rawDetail = node.inputs?.detail;
299
- if (!rawDetail || typeof rawDetail !== "object" || Array.isArray(rawDetail)) {
300
- return [];
301
- }
302
- const queryParameters = rawDetail.queryParameters;
303
- if (!queryParameters || typeof queryParameters !== "object" || Array.isArray(queryParameters)) {
304
- return [];
305
- }
306
- const severity = context.strictBindings ? "error" : "warning";
307
- const issues = [];
308
- for (const [key, value] of Object.entries(queryParameters)) {
309
- if (!CEQL_FILTER_PARAMETERS.has(key))
310
- continue;
311
- scanContainerForCeqlQuotedFields(value, `nodes[${node.id}].inputs.detail.queryParameters.${key}`, severity, issues);
312
- }
313
- return issues;
255
+ if (code <= 65535) {
256
+ return code >= 170 && nonASCIIidentifierStart.test(String.fromCharCode(code));
314
257
  }
315
- };
316
-
317
- // src/services/node-validators/cross-node-binding-validator.ts
318
- var IDENTIFIER_ROOT_RE = /(?<![.\w$])([A-Za-z_$][\w$]*)\.(?!\.)/g;
319
- function findCrossNodeBindingReferences(value, nodeIds) {
320
- if (nodeIds.size === 0)
321
- return [];
322
- const trimmed = value.trimStart();
323
- if (!trimmed.startsWith("=js:"))
324
- return [];
325
- const body = trimmed.slice(4);
326
- const referenced = new Set;
327
- const fixedBody = body.replace(IDENTIFIER_ROOT_RE, (match, identifier) => {
328
- if (!nodeIds.has(identifier))
329
- return match;
330
- referenced.add(identifier);
331
- return `$vars.${match}`;
332
- });
333
- if (referenced.size === 0)
334
- return [];
335
- const fixedValue = `=js:${fixedBody}`;
336
- return [...referenced].map((nodeId) => ({ nodeId, fixedValue }));
337
- }
338
- function crossNodeBindingMessage(originalValue, ref) {
339
- return `Expression "${originalValue}" references node "${ref.nodeId}" without the "$vars." prefix — ` + `cross-node outputs resolve to undefined at runtime (the bare identifier reads as an ` + `undeclared local, not the runtime variable). Use "${ref.fixedValue}" instead. ` + "See uipath-maestro-flow skill — node-output-wiring.md (FPD-538).";
258
+ if (astral === false) {
259
+ return false;
260
+ }
261
+ return isInAstralSet(code, astralIdentifierStartCodes);
340
262
  }
341
- function scanContainerForCrossNodeBindings(obj, path, nodeIds, severity, issues) {
342
- if (typeof obj === "string") {
343
- for (const ref of findCrossNodeBindingReferences(obj, nodeIds)) {
344
- issues.push({
345
- path,
346
- severity,
347
- message: crossNodeBindingMessage(obj, ref)
348
- });
349
- }
350
- return;
263
+ function isIdentifierChar(code, astral) {
264
+ if (code < 48) {
265
+ return code === 36;
351
266
  }
352
- if (Array.isArray(obj)) {
353
- for (let i = 0;i < obj.length; i++) {
354
- scanContainerForCrossNodeBindings(obj[i], `${path}[${i}]`, nodeIds, severity, issues);
355
- }
356
- return;
267
+ if (code < 58) {
268
+ return true;
357
269
  }
358
- if (obj && typeof obj === "object") {
359
- for (const [key, value] of Object.entries(obj)) {
360
- scanContainerForCrossNodeBindings(value, `${path}.${key}`, nodeIds, severity, issues);
361
- }
270
+ if (code < 65) {
271
+ return false;
362
272
  }
363
- }
364
- var PARAMETER_CONTAINER_KEYS = [
365
- "bodyParameters",
366
- "queryParameters",
367
- "pathParameters"
368
- ];
369
- function scanDetailForCrossNodeBindings(detail, nodeIds, severity = "warning") {
370
- if (!detail || nodeIds.size === 0)
371
- return [];
372
- const issues = [];
373
- for (const containerKey of PARAMETER_CONTAINER_KEYS) {
374
- const container = detail[containerKey];
375
- if (!container || typeof container !== "object" || Array.isArray(container)) {
376
- continue;
377
- }
378
- scanContainerForCrossNodeBindings(container, `detail.${containerKey}`, nodeIds, severity, issues);
273
+ if (code < 91) {
274
+ return true;
379
275
  }
380
- return issues;
381
- }
382
- var crossNodeBindingValidator = {
383
- id: "cross-node-binding",
384
- appliesTo: (node) => {
385
- const t = node.type;
386
- if (!t)
387
- return false;
388
- if (isEventDrivenConnectorType(t))
389
- return false;
390
- return t.startsWith("uipath.connector.") || t === "core.action.http" || t === "core.action.http.v2";
391
- },
392
- validate: (node, context) => {
393
- const nodeIds = context.nodeIds ?? new Set;
394
- if (nodeIds.size === 0)
395
- return [];
396
- const rawDetail = node.inputs?.detail;
397
- if (!rawDetail || typeof rawDetail !== "object" || Array.isArray(rawDetail)) {
398
- return [];
399
- }
400
- const severity = context.strictBindings ? "error" : "warning";
401
- const issues = scanDetailForCrossNodeBindings(rawDetail, nodeIds, severity);
402
- return issues.map((issue) => ({
403
- ...issue,
404
- path: `nodes[${node.id}].inputs.${issue.path}`
405
- }));
276
+ if (code < 97) {
277
+ return code === 95;
406
278
  }
407
- };
408
-
409
- // src/services/node-validators/expression-prefix-validator.ts
410
- var expressionPrefixValidator = {
411
- id: "expression-prefix",
412
- appliesTo: (node) => {
413
- const t = node.type;
414
- if (!t)
415
- return false;
416
- if (isEventDrivenConnectorType(t))
417
- return false;
418
- return t.startsWith("uipath.connector.") || t === "core.action.http" || t === "core.action.http.v2" || t === "core.action.script";
419
- },
420
- validate: (node) => {
421
- const issues = [];
422
- if (node.type === "core.action.script") {
423
- scanScriptSource(node.id, node.inputs, issues);
424
- return issues;
425
- }
426
- const rawDetail = node.inputs?.detail;
427
- if (!rawDetail || typeof rawDetail !== "object" || Array.isArray(rawDetail)) {
428
- return [];
429
- }
430
- const detail = rawDetail;
431
- for (const containerKey of [
432
- "bodyParameters",
433
- "queryParameters",
434
- "pathParameters"
435
- ]) {
436
- const container = detail[containerKey];
437
- if (!container || typeof container !== "object" || Array.isArray(container)) {
438
- continue;
439
- }
440
- scanForUnprefixedExpressions(container, `nodes[${node.id}].inputs.detail.${containerKey}`, issues);
441
- }
442
- return issues;
443
- }
444
- };
445
- function scanScriptSource(nodeId, inputs, issues) {
446
- if (!inputs)
447
- return;
448
- const source = inputs.source;
449
- if (typeof source !== "string")
450
- return;
451
- const trimmed = source.trimStart();
452
- if (!trimmed.startsWith("=js:"))
453
- return;
454
- issues.push({
455
- path: `nodes[${nodeId}].inputs.source`,
456
- severity: "error",
457
- message: 'Script node `inputs.source` begins with `"=js:"` — that is the ' + "property-level expression-mode marker for connector / HTTP / " + "End-output / subflow-input fields, not JavaScript syntax. The " + "Script node's `source` field is the function body; runtime treats " + 'this value as literal source code, so e.g. `"=js:vars.X.Y"` ' + "compiles into a string-reversed gibberish output. Replace with a " + 'JavaScript expression that returns the value, e.g. `"return ' + '$vars.X.Y"` or a multi-statement function body. See ' + "uipath-maestro-flow skill — script-node reference (MST-9265)."
458
- });
459
- }
460
- var BARE_DOLLAR_REF_RE = /^\$(vars|metadata|self)\b/;
461
- var INVENTED_NODES_REF_RE = /^nodes\.[A-Za-z_$][\w$]*\.output\b/;
462
- function scanForUnprefixedExpressions(obj, path, issues) {
463
- if (typeof obj === "string") {
464
- const trimmed = obj.trimStart();
465
- if (trimmed.startsWith("="))
466
- return;
467
- if (BARE_DOLLAR_REF_RE.test(trimmed)) {
468
- issues.push({
469
- path,
470
- severity: "error",
471
- message: `Value "${obj}" references a runtime variable but is missing the "=js:" prefix. Use "=js:${obj}" so the runtime evaluates it; without the prefix, the value ships as a literal string and the activity input is bound to "${obj.replace(/^\$vars\b/, "vars").replace(/^\$metadata\b/, "metadata").replace(/^\$self\b/, "self")}". See uipath-maestro-flow skill — node-output-wiring.md (MST-9107).`
472
- });
473
- return;
474
- }
475
- if (INVENTED_NODES_REF_RE.test(trimmed)) {
476
- const fixed = trimmed.replace(/^nodes\./, "=js:$vars.");
477
- issues.push({
478
- path,
479
- severity: "error",
480
- message: `Value "${obj}" looks like an invented "nodes.<id>.output" reference. There is no such syntax — variable references use "$vars". Write "${fixed}" instead. See uipath-maestro-flow skill — node-output-wiring.md (MST-9107).`
481
- });
482
- return;
483
- }
484
- return;
485
- }
486
- if (Array.isArray(obj)) {
487
- for (let i = 0;i < obj.length; i++) {
488
- scanForUnprefixedExpressions(obj[i], `${path}[${i}]`, issues);
489
- }
490
- return;
491
- }
492
- if (obj && typeof obj === "object") {
493
- for (const [key, value] of Object.entries(obj)) {
494
- scanForUnprefixedExpressions(value, `${path}.${key}`, issues);
495
- }
496
- }
497
- }
498
-
499
- // src/services/node-validators/ixp-node-validator.ts
500
- var FORBIDDEN_INPUT_FIELDS = [
501
- "digitizationMode",
502
- "documentTaxonomy",
503
- "attachmentId",
504
- "fileName",
505
- "mimeType"
506
- ];
507
- var FILE_REF_PATTERN = /^=js:\$vars\.[A-Za-z_$]/;
508
- var ixpNodeValidator = {
509
- id: "ixp-node",
510
- appliesTo: (node) => typeof node.type === "string" && node.type.startsWith("uipath.ixp."),
511
- validate: (node, _context) => {
512
- const issues = [];
513
- const inputs = node.inputs ?? {};
514
- const outputs = node.outputs ?? {};
515
- const base = `nodes[${node.id}]`;
516
- const model = inputs.model;
517
- const isNonEmptyString2 = (v) => typeof v === "string" && v.length > 0;
518
- if (typeof model !== "object" || model === null || Array.isArray(model) || !isNonEmptyString2(model.modelName) || !isNonEmptyString2(model.folderKey)) {
519
- issues.push({
520
- path: `${base}.inputs.model`,
521
- severity: "error",
522
- message: "inputs.model must be an object with non-empty string " + "`modelName` and `folderKey`. Studio Web's property " + "panel destructures these and crashes when either is " + "missing or not a string."
523
- });
524
- }
525
- const fileRef = inputs.fileRef;
526
- if (typeof fileRef !== "string" || !FILE_REF_PATTERN.test(fileRef)) {
527
- issues.push({
528
- path: `${base}.inputs.fileRef`,
529
- severity: "error",
530
- message: "inputs.fileRef must be a `=js:$vars.…` expression. " + "The canonical form for an upstream node output is " + "`=js:$vars.<upstream>.output.<field>`. Without the " + "`=js:` prefix the BPMN serializer treats the value " + "as a literal string at runtime."
531
- });
532
- }
533
- for (const port of ["output", "error"]) {
534
- if (!(port in outputs)) {
535
- issues.push({
536
- path: `${base}.outputs.${port}`,
537
- severity: "error",
538
- message: `outputs.${port} must be present on the instance. ` + `Without it, downstream $vars.${node.id}.${port} ` + "references will not resolve at runtime."
539
- });
540
- }
541
- }
542
- const topLevelModel = node.model;
543
- if (topLevelModel != null) {
544
- issues.push({
545
- path: `${base}.model`,
546
- severity: "error",
547
- message: "Top-level `model` block is forbidden on IxP node " + "instances. The manifest's slim model " + "({ type, serviceType }) lives only in `definitions[]`."
548
- });
549
- }
550
- const legacy = FORBIDDEN_INPUT_FIELDS.filter((k) => (k in inputs));
551
- if (legacy.length > 0) {
552
- issues.push({
553
- path: `${base}.inputs`,
554
- severity: "error",
555
- message: "Forbidden legacy fields in inputs: " + `${legacy.join(", ")}. These keys were removed from ` + "the current standalone IxP schema and are not " + "returned by `registry get`."
556
- });
557
- }
558
- return issues;
559
- }
560
- };
561
-
562
- // ../../node_modules/acorn/dist/acorn.mjs
563
- var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 78, 5, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 199, 7, 137, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 55, 9, 266, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 233, 0, 3, 0, 8, 1, 6, 0, 475, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
564
- var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 7, 25, 39, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 5, 57, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 24, 43, 261, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 33, 24, 3, 24, 45, 74, 6, 0, 67, 12, 65, 1, 2, 0, 15, 4, 10, 7381, 42, 31, 98, 114, 8702, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 208, 30, 2, 2, 2, 1, 2, 6, 3, 4, 10, 1, 225, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4381, 3, 5773, 3, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 8489];
565
- var nonASCIIidentifierChars = "‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࢗ-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ-᫝᫠-᫫ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‌‍‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯・꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_・";
566
- var nonASCIIidentifierStartChars = "ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-࢏ࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚ౜ౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽ೜-ೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲊᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-Ƛ꟱-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ";
567
- var reservedWords = {
568
- 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",
569
- 5: "class enum extends super const export import",
570
- 6: "enum",
571
- strict: "implements interface let package private protected public static yield",
572
- strictBind: "eval arguments"
573
- };
574
- var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this";
575
- var keywords$1 = {
576
- 5: ecma5AndLessKeywords,
577
- "5module": ecma5AndLessKeywords + " export import",
578
- 6: ecma5AndLessKeywords + " const class extends export import super"
579
- };
580
- var keywordRelationalOperator = /^in(stanceof)?$/;
581
- var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
582
- var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
583
- function isInAstralSet(code, set) {
584
- var pos = 65536;
585
- for (var i = 0;i < set.length; i += 2) {
586
- pos += set[i];
587
- if (pos > code) {
588
- return false;
589
- }
590
- pos += set[i + 1];
591
- if (pos >= code) {
592
- return true;
593
- }
594
- }
595
- return false;
596
- }
597
- function isIdentifierStart(code, astral) {
598
- if (code < 65) {
599
- return code === 36;
600
- }
601
- if (code < 91) {
602
- return true;
603
- }
604
- if (code < 97) {
605
- return code === 95;
606
- }
607
- if (code < 123) {
608
- return true;
609
- }
610
- if (code <= 65535) {
611
- return code >= 170 && nonASCIIidentifierStart.test(String.fromCharCode(code));
612
- }
613
- if (astral === false) {
614
- return false;
615
- }
616
- return isInAstralSet(code, astralIdentifierStartCodes);
617
- }
618
- function isIdentifierChar(code, astral) {
619
- if (code < 48) {
620
- return code === 36;
621
- }
622
- if (code < 58) {
623
- return true;
624
- }
625
- if (code < 65) {
626
- return false;
627
- }
628
- if (code < 91) {
629
- return true;
630
- }
631
- if (code < 97) {
632
- return code === 95;
633
- }
634
- if (code < 123) {
635
- return true;
279
+ if (code < 123) {
280
+ return true;
636
281
  }
637
282
  if (code <= 65535) {
638
283
  return code >= 170 && nonASCIIidentifier.test(String.fromCharCode(code));
@@ -5838,77 +5483,588 @@ pp.readEscapedChar = function(inTemplate) {
5838
5483
  }
5839
5484
  return String.fromCharCode(ch);
5840
5485
  }
5841
- };
5842
- pp.readHexChar = function(len) {
5843
- var codePos = this.pos;
5844
- var n = this.readInt(16, len);
5845
- if (n === null) {
5846
- this.invalidStringToken(codePos, "Bad character escape sequence");
5486
+ };
5487
+ pp.readHexChar = function(len) {
5488
+ var codePos = this.pos;
5489
+ var n = this.readInt(16, len);
5490
+ if (n === null) {
5491
+ this.invalidStringToken(codePos, "Bad character escape sequence");
5492
+ }
5493
+ return n;
5494
+ };
5495
+ pp.readWord1 = function() {
5496
+ this.containsEsc = false;
5497
+ var word = "", first = true, chunkStart = this.pos;
5498
+ var astral = this.options.ecmaVersion >= 6;
5499
+ while (this.pos < this.input.length) {
5500
+ var ch = this.fullCharCodeAtPos();
5501
+ if (isIdentifierChar(ch, astral)) {
5502
+ this.pos += ch <= 65535 ? 1 : 2;
5503
+ } else if (ch === 92) {
5504
+ this.containsEsc = true;
5505
+ word += this.input.slice(chunkStart, this.pos);
5506
+ var escStart = this.pos;
5507
+ if (this.input.charCodeAt(++this.pos) !== 117) {
5508
+ this.invalidStringToken(this.pos, "Expecting Unicode escape sequence \\uXXXX");
5509
+ }
5510
+ ++this.pos;
5511
+ var esc = this.readCodePoint();
5512
+ if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral)) {
5513
+ this.invalidStringToken(escStart, "Invalid Unicode escape");
5514
+ }
5515
+ word += codePointToString(esc);
5516
+ chunkStart = this.pos;
5517
+ } else {
5518
+ break;
5519
+ }
5520
+ first = false;
5521
+ }
5522
+ return word + this.input.slice(chunkStart, this.pos);
5523
+ };
5524
+ pp.readWord = function() {
5525
+ var word = this.readWord1();
5526
+ var type = types$1.name;
5527
+ if (this.keywords.test(word)) {
5528
+ type = keywords[word];
5529
+ }
5530
+ return this.finishToken(type, word);
5531
+ };
5532
+ var version = "8.17.0";
5533
+ Parser.acorn = {
5534
+ Parser,
5535
+ version,
5536
+ defaultOptions,
5537
+ Position,
5538
+ SourceLocation,
5539
+ getLineInfo,
5540
+ Node,
5541
+ TokenType,
5542
+ tokTypes: types$1,
5543
+ keywordTypes: keywords,
5544
+ TokContext,
5545
+ tokContexts: types,
5546
+ isIdentifierChar,
5547
+ isIdentifierStart,
5548
+ Token,
5549
+ isNewLine,
5550
+ lineBreak,
5551
+ lineBreakG,
5552
+ nonASCIIwhitespace
5553
+ };
5554
+ function parse3(input, options) {
5555
+ return Parser.parse(input, options);
5556
+ }
5557
+
5558
+ // src/services/node-validators/ceql-query-validator.ts
5559
+ var CEQL_SYMBOL_OPERATORS = ["=", "!=", "<", "<=", ">", ">="];
5560
+ var CEQL_WORD_OPERATORS = [
5561
+ "In",
5562
+ "Not In",
5563
+ "Like",
5564
+ "Not Like",
5565
+ "Contains",
5566
+ "Not Contains",
5567
+ "Starts With",
5568
+ "Not Starts With",
5569
+ "Ends With",
5570
+ "Not Ends With",
5571
+ "Is Null",
5572
+ "Is Not Null"
5573
+ ];
5574
+ var CEQL_OPERATOR_ALIASES = {
5575
+ eq: "=",
5576
+ ne: "!=",
5577
+ gt: ">",
5578
+ ge: ">=",
5579
+ lt: "<",
5580
+ le: "<="
5581
+ };
5582
+ var byLengthDescending = (a, b) => b.length - a.length;
5583
+ var escapeRegexToken = (token) => token.replace(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
5584
+ var toWordOperatorPattern = (token) => token.split(/\s+/).map(escapeRegexToken).join(String.raw`\s+`);
5585
+ var CEQL_SYMBOL_OPERATOR_ALTERNATION = [...CEQL_SYMBOL_OPERATORS].sort(byLengthDescending).map(escapeRegexToken).join("|");
5586
+ var CEQL_WORD_OPERATOR_ALTERNATION = [...CEQL_WORD_OPERATORS].sort(byLengthDescending).map(toWordOperatorPattern).join("|");
5587
+ var CEQL_OPERATOR = String.raw`(?:${CEQL_SYMBOL_OPERATOR_ALTERNATION}|(?:${CEQL_WORD_OPERATOR_ALTERNATION})\b)`;
5588
+ var CEQL_OPERATOR_ALIAS_ALTERNATION = Object.keys(CEQL_OPERATOR_ALIASES).map(escapeRegexToken).join("|");
5589
+ var CEQL_FIELD_OPERATOR = String.raw`(?:${CEQL_OPERATOR}|(?:${CEQL_OPERATOR_ALIAS_ALTERNATION})\b)`;
5590
+ var CEQL_FILTER_PARAMETERS = new Set(["where", "queryExpression"]);
5591
+ var CEQL_REFERENCE = 'See uipath-maestro-flow skill — plugins/connector/impl.md, "Hand-authored CEQL strings".';
5592
+ var HOLE = "\x00";
5593
+ var JS_PREFIX = "=js:";
5594
+ function collectFragments(root, fragments) {
5595
+ const pending = [root];
5596
+ while (pending.length > 0) {
5597
+ const item = pending.pop();
5598
+ if (!("type" in item)) {
5599
+ fragments.push(item);
5600
+ continue;
5601
+ }
5602
+ switch (item.type) {
5603
+ case "Literal":
5604
+ fragments.push(typeof item.value === "string" ? { kind: "text", text: item.value } : { kind: "hole" });
5605
+ continue;
5606
+ case "BinaryExpression":
5607
+ if (item.operator !== "+") {
5608
+ fragments.push({ kind: "hole" });
5609
+ continue;
5610
+ }
5611
+ pending.push(item.right, item.left);
5612
+ continue;
5613
+ case "TemplateLiteral":
5614
+ for (let i2 = item.quasis.length - 1;i2 >= 0; i2--) {
5615
+ if (i2 < item.expressions.length)
5616
+ pending.push({ kind: "hole" });
5617
+ pending.push({
5618
+ kind: "text",
5619
+ text: item.quasis[i2].value.cooked ?? ""
5620
+ });
5621
+ }
5622
+ continue;
5623
+ default:
5624
+ fragments.push({ kind: "hole" });
5625
+ }
5626
+ }
5627
+ }
5628
+ function isStringConcatShape(node) {
5629
+ if (node.type === "TemplateLiteral")
5630
+ return true;
5631
+ if (node.type === "Literal")
5632
+ return typeof node.value === "string";
5633
+ return node.type === "BinaryExpression" && node.operator === "+";
5634
+ }
5635
+ function lexCeqlFilterValue(value) {
5636
+ const trimmed = value.trim();
5637
+ if (!trimmed.startsWith(JS_PREFIX)) {
5638
+ if (trimmed.startsWith("="))
5639
+ return;
5640
+ return [{ kind: "text", text: value }];
5641
+ }
5642
+ let program;
5643
+ try {
5644
+ program = parse3(`(${trimmed.slice(JS_PREFIX.length)}
5645
+ )`, {
5646
+ ecmaVersion: 2020,
5647
+ sourceType: "script"
5648
+ });
5649
+ } catch {
5650
+ return;
5651
+ }
5652
+ const statement = program.body[0];
5653
+ if (statement?.type !== "ExpressionStatement")
5654
+ return;
5655
+ if (!isStringConcatShape(statement.expression))
5656
+ return;
5657
+ const fragments = [];
5658
+ collectFragments(statement.expression, fragments);
5659
+ return fragments;
5660
+ }
5661
+ function buildSkeleton(fragments) {
5662
+ let text = "";
5663
+ const holeAt = [];
5664
+ for (const fragment of fragments) {
5665
+ if (fragment.kind === "hole") {
5666
+ text += HOLE;
5667
+ holeAt.push(true);
5668
+ continue;
5669
+ }
5670
+ text += fragment.text;
5671
+ for (let i2 = 0;i2 < fragment.text.length; i2++)
5672
+ holeAt.push(false);
5673
+ }
5674
+ return { text, holeAt };
5675
+ }
5676
+ function singleQuoteOpenBefore(skeleton) {
5677
+ const openBefore = new Array(skeleton.length);
5678
+ let open = false;
5679
+ for (let i2 = 0;i2 < skeleton.length; i2++) {
5680
+ openBefore[i2] = open;
5681
+ if (skeleton[i2] === "'")
5682
+ open = !open;
5683
+ }
5684
+ return openBefore;
5685
+ }
5686
+ function renderSkeletonSlice(skeleton, start, length) {
5687
+ let rendered = "";
5688
+ for (let i2 = start;i2 < start + length; i2++) {
5689
+ rendered += skeleton.holeAt[i2] ? "<expression>" : skeleton.text[i2];
5690
+ }
5691
+ return rendered;
5692
+ }
5693
+ var CEQL_QUOTED_FIELD_RE = new RegExp(String.raw`(?:^|\bAND\b|\bOR\b|\()\s*'([^']*)'\s*(?=${CEQL_FIELD_OPERATOR})`, "gi");
5694
+ var CEQL_DOUBLE_QUOTED_VALUE_RE = new RegExp(String.raw`(${CEQL_OPERATOR})\s*"`, "gi");
5695
+ var CEQL_OPERATOR_ALIAS_RE = new RegExp(String.raw`[A-Za-z0-9_.)\]']\s+(${CEQL_OPERATOR_ALIAS_ALTERNATION})(?!\s*(?:${CEQL_OPERATOR}))(?=\s)`, "gi");
5696
+ function findQuotedFields(skeleton, openBefore) {
5697
+ const matches = [];
5698
+ for (const match of skeleton.matchAll(CEQL_QUOTED_FIELD_RE)) {
5699
+ const openIndex = match.index + match[0].indexOf("'");
5700
+ if (openBefore[openIndex])
5701
+ continue;
5702
+ matches.push({ name: match[1], openIndex });
5703
+ }
5704
+ return matches;
5705
+ }
5706
+ function unquoteFields(value, fields) {
5707
+ const quoteIndexes = fields.flatMap((field) => [
5708
+ field.openIndex,
5709
+ field.openIndex + field.name.length + 1
5710
+ ]).sort((a, b) => b - a);
5711
+ let fixed = value;
5712
+ for (const index of quoteIndexes) {
5713
+ fixed = fixed.slice(0, index) + fixed.slice(index + 1);
5714
+ }
5715
+ if (!fixed.trim().startsWith(JS_PREFIX) && fixed.includes("${")) {
5716
+ const escaped = fixed.replace(/\\/g, "\\\\").replace(/`/g, "\\`");
5717
+ return `=js:\`${escaped}\``;
5718
+ }
5719
+ return fixed;
5720
+ }
5721
+ function quotedFieldMessage(token, fixedValue) {
5722
+ const fix = fixedValue ? `Write "${fixedValue}" instead.` : "Remove the quotes around the field name.";
5723
+ return `Quoted token '${token}' where CEQL expects a bare field name — ` + "Integration Service rejects this with [102003] Expected a field name " + `expression but got 'StringValue'. ${fix} ${CEQL_REFERENCE}`;
5724
+ }
5725
+ function doubleQuotedValueMessage(operator) {
5726
+ return `Double-quoted value after '${operator}' — CEQL quotes a value with ` + "single quotes. Integration Service rejects this with [102003] " + `"Unsupported value expression 'Column' on field ...". Write the ` + `value in single quotes. ${CEQL_REFERENCE}`;
5727
+ }
5728
+ function operatorAliasMessage(alias) {
5729
+ const symbol = CEQL_OPERATOR_ALIASES[alias.toLowerCase()];
5730
+ return `Operator '${alias}' is not CEQL — write '${symbol}'. Integration ` + "Service rejects this with [102003] Integration Services bad request. " + CEQL_REFERENCE;
5731
+ }
5732
+ function findCeqlFilterIssues(value) {
5733
+ const fragments = lexCeqlFilterValue(value);
5734
+ if (!fragments)
5735
+ return [];
5736
+ const skeleton = buildSkeleton(fragments);
5737
+ const openBefore = singleQuoteOpenBefore(skeleton.text);
5738
+ const issues = [];
5739
+ const quotedFields = findQuotedFields(skeleton.text, openBefore);
5740
+ if (quotedFields.length > 0) {
5741
+ const fixedValue = value.trim().startsWith(JS_PREFIX) ? undefined : unquoteFields(value, quotedFields);
5742
+ for (const field of quotedFields) {
5743
+ const token = renderSkeletonSlice(skeleton, field.openIndex + 1, field.name.length);
5744
+ issues.push({
5745
+ rule: "quoted-field",
5746
+ token,
5747
+ fixedValue,
5748
+ message: quotedFieldMessage(token, fixedValue)
5749
+ });
5750
+ }
5751
+ }
5752
+ for (const match of skeleton.text.matchAll(CEQL_DOUBLE_QUOTED_VALUE_RE)) {
5753
+ const quoteIndex = match.index + match[0].length - 1;
5754
+ if (openBefore[quoteIndex])
5755
+ continue;
5756
+ const operator = match[1].replace(/\s+/g, " ");
5757
+ issues.push({
5758
+ rule: "double-quoted-value",
5759
+ token: operator,
5760
+ message: doubleQuotedValueMessage(operator)
5761
+ });
5762
+ }
5763
+ for (const match of skeleton.text.matchAll(CEQL_OPERATOR_ALIAS_RE)) {
5764
+ const aliasIndex = match.index + match[0].length - match[1].length;
5765
+ if (openBefore[aliasIndex])
5766
+ continue;
5767
+ issues.push({
5768
+ rule: "operator-alias",
5769
+ token: match[1],
5770
+ message: operatorAliasMessage(match[1])
5771
+ });
5772
+ }
5773
+ return issues;
5774
+ }
5775
+ function scanContainerForCeqlFilterIssues(obj, path, severity, issues) {
5776
+ if (typeof obj === "string") {
5777
+ for (const issue of findCeqlFilterIssues(obj)) {
5778
+ issues.push({ path, severity, message: issue.message });
5779
+ }
5780
+ return;
5781
+ }
5782
+ if (Array.isArray(obj)) {
5783
+ for (let i2 = 0;i2 < obj.length; i2++) {
5784
+ scanContainerForCeqlFilterIssues(obj[i2], `${path}[${i2}]`, severity, issues);
5785
+ }
5786
+ return;
5787
+ }
5788
+ if (obj && typeof obj === "object") {
5789
+ for (const [key, value] of Object.entries(obj)) {
5790
+ scanContainerForCeqlFilterIssues(value, `${path}.${key}`, severity, issues);
5791
+ }
5792
+ }
5793
+ }
5794
+ var ceqlQueryValidator = {
5795
+ id: "ceql-query",
5796
+ appliesTo: (node) => {
5797
+ const t = node.type;
5798
+ if (!t)
5799
+ return false;
5800
+ if (isEventDrivenConnectorType(t))
5801
+ return false;
5802
+ return t.startsWith("uipath.connector.");
5803
+ },
5804
+ validate: (node, context) => {
5805
+ const rawDetail = node.inputs?.detail;
5806
+ if (!rawDetail || typeof rawDetail !== "object" || Array.isArray(rawDetail)) {
5807
+ return [];
5808
+ }
5809
+ const queryParameters = rawDetail.queryParameters;
5810
+ if (!queryParameters || typeof queryParameters !== "object" || Array.isArray(queryParameters)) {
5811
+ return [];
5812
+ }
5813
+ const severity = context.strictBindings ? "error" : "warning";
5814
+ const issues = [];
5815
+ for (const [key, value] of Object.entries(queryParameters)) {
5816
+ if (!CEQL_FILTER_PARAMETERS.has(key))
5817
+ continue;
5818
+ scanContainerForCeqlFilterIssues(value, `nodes[${node.id}].inputs.detail.queryParameters.${key}`, severity, issues);
5819
+ }
5820
+ return issues;
5821
+ }
5822
+ };
5823
+
5824
+ // src/services/node-validators/cross-node-binding-validator.ts
5825
+ var IDENTIFIER_ROOT_RE = /(?<![.\w$])([A-Za-z_$][\w$]*)\.(?!\.)/g;
5826
+ function findCrossNodeBindingReferences(value, nodeIds) {
5827
+ if (nodeIds.size === 0)
5828
+ return [];
5829
+ const trimmed = value.trimStart();
5830
+ if (!trimmed.startsWith("=js:"))
5831
+ return [];
5832
+ const body = trimmed.slice(4);
5833
+ const referenced = new Set;
5834
+ const fixedBody = body.replace(IDENTIFIER_ROOT_RE, (match, identifier) => {
5835
+ if (!nodeIds.has(identifier))
5836
+ return match;
5837
+ referenced.add(identifier);
5838
+ return `$vars.${match}`;
5839
+ });
5840
+ if (referenced.size === 0)
5841
+ return [];
5842
+ const fixedValue = `=js:${fixedBody}`;
5843
+ return [...referenced].map((nodeId) => ({ nodeId, fixedValue }));
5844
+ }
5845
+ function crossNodeBindingMessage(originalValue, ref2) {
5846
+ return `Expression "${originalValue}" references node "${ref2.nodeId}" without the "$vars." prefix — ` + `cross-node outputs resolve to undefined at runtime (the bare identifier reads as an ` + `undeclared local, not the runtime variable). Use "${ref2.fixedValue}" instead. ` + "See uipath-maestro-flow skill — node-output-wiring.md (FPD-538).";
5847
+ }
5848
+ function scanContainerForCrossNodeBindings(obj, path, nodeIds, severity, issues) {
5849
+ if (typeof obj === "string") {
5850
+ for (const ref2 of findCrossNodeBindingReferences(obj, nodeIds)) {
5851
+ issues.push({
5852
+ path,
5853
+ severity,
5854
+ message: crossNodeBindingMessage(obj, ref2)
5855
+ });
5856
+ }
5857
+ return;
5858
+ }
5859
+ if (Array.isArray(obj)) {
5860
+ for (let i2 = 0;i2 < obj.length; i2++) {
5861
+ scanContainerForCrossNodeBindings(obj[i2], `${path}[${i2}]`, nodeIds, severity, issues);
5862
+ }
5863
+ return;
5864
+ }
5865
+ if (obj && typeof obj === "object") {
5866
+ for (const [key, value] of Object.entries(obj)) {
5867
+ scanContainerForCrossNodeBindings(value, `${path}.${key}`, nodeIds, severity, issues);
5868
+ }
5869
+ }
5870
+ }
5871
+ var PARAMETER_CONTAINER_KEYS = [
5872
+ "bodyParameters",
5873
+ "queryParameters",
5874
+ "pathParameters"
5875
+ ];
5876
+ function scanDetailForCrossNodeBindings(detail, nodeIds, severity = "warning") {
5877
+ if (!detail || nodeIds.size === 0)
5878
+ return [];
5879
+ const issues = [];
5880
+ for (const containerKey of PARAMETER_CONTAINER_KEYS) {
5881
+ const container = detail[containerKey];
5882
+ if (!container || typeof container !== "object" || Array.isArray(container)) {
5883
+ continue;
5884
+ }
5885
+ scanContainerForCrossNodeBindings(container, `detail.${containerKey}`, nodeIds, severity, issues);
5886
+ }
5887
+ return issues;
5888
+ }
5889
+ var crossNodeBindingValidator = {
5890
+ id: "cross-node-binding",
5891
+ appliesTo: (node) => {
5892
+ const t = node.type;
5893
+ if (!t)
5894
+ return false;
5895
+ if (isEventDrivenConnectorType(t))
5896
+ return false;
5897
+ return t.startsWith("uipath.connector.") || t === "core.action.http" || t === "core.action.http.v2";
5898
+ },
5899
+ validate: (node, context) => {
5900
+ const nodeIds = context.nodeIds ?? new Set;
5901
+ if (nodeIds.size === 0)
5902
+ return [];
5903
+ const rawDetail = node.inputs?.detail;
5904
+ if (!rawDetail || typeof rawDetail !== "object" || Array.isArray(rawDetail)) {
5905
+ return [];
5906
+ }
5907
+ const severity = context.strictBindings ? "error" : "warning";
5908
+ const issues = scanDetailForCrossNodeBindings(rawDetail, nodeIds, severity);
5909
+ return issues.map((issue) => ({
5910
+ ...issue,
5911
+ path: `nodes[${node.id}].inputs.${issue.path}`
5912
+ }));
5913
+ }
5914
+ };
5915
+
5916
+ // src/services/node-validators/expression-prefix-validator.ts
5917
+ var expressionPrefixValidator = {
5918
+ id: "expression-prefix",
5919
+ appliesTo: (node) => {
5920
+ const t = node.type;
5921
+ if (!t)
5922
+ return false;
5923
+ if (isEventDrivenConnectorType(t))
5924
+ return false;
5925
+ return t.startsWith("uipath.connector.") || t === "core.action.http" || t === "core.action.http.v2" || t === "core.action.script";
5926
+ },
5927
+ validate: (node) => {
5928
+ const issues = [];
5929
+ if (node.type === "core.action.script") {
5930
+ scanScriptSource(node.id, node.inputs, issues);
5931
+ return issues;
5932
+ }
5933
+ const rawDetail = node.inputs?.detail;
5934
+ if (!rawDetail || typeof rawDetail !== "object" || Array.isArray(rawDetail)) {
5935
+ return [];
5936
+ }
5937
+ const detail = rawDetail;
5938
+ for (const containerKey of [
5939
+ "bodyParameters",
5940
+ "queryParameters",
5941
+ "pathParameters"
5942
+ ]) {
5943
+ const container = detail[containerKey];
5944
+ if (!container || typeof container !== "object" || Array.isArray(container)) {
5945
+ continue;
5946
+ }
5947
+ scanForUnprefixedExpressions(container, `nodes[${node.id}].inputs.detail.${containerKey}`, issues);
5948
+ }
5949
+ return issues;
5950
+ }
5951
+ };
5952
+ function scanScriptSource(nodeId, inputs, issues) {
5953
+ if (!inputs)
5954
+ return;
5955
+ const source = inputs.source;
5956
+ if (typeof source !== "string")
5957
+ return;
5958
+ const trimmed = source.trimStart();
5959
+ if (!trimmed.startsWith("=js:"))
5960
+ return;
5961
+ issues.push({
5962
+ path: `nodes[${nodeId}].inputs.source`,
5963
+ severity: "error",
5964
+ message: 'Script node `inputs.source` begins with `"=js:"` — that is the ' + "property-level expression-mode marker for connector / HTTP / " + "End-output / subflow-input fields, not JavaScript syntax. The " + "Script node's `source` field is the function body; runtime treats " + 'this value as literal source code, so e.g. `"=js:vars.X.Y"` ' + "compiles into a string-reversed gibberish output. Replace with a " + 'JavaScript expression that returns the value, e.g. `"return ' + '$vars.X.Y"` or a multi-statement function body. See ' + "uipath-maestro-flow skill — script-node reference (MST-9265)."
5965
+ });
5966
+ }
5967
+ var BARE_DOLLAR_REF_RE = /^\$(vars|metadata|self)\b/;
5968
+ var INVENTED_NODES_REF_RE = /^nodes\.[A-Za-z_$][\w$]*\.output\b/;
5969
+ function scanForUnprefixedExpressions(obj, path, issues) {
5970
+ if (typeof obj === "string") {
5971
+ const trimmed = obj.trimStart();
5972
+ if (trimmed.startsWith("="))
5973
+ return;
5974
+ if (BARE_DOLLAR_REF_RE.test(trimmed)) {
5975
+ issues.push({
5976
+ path,
5977
+ severity: "error",
5978
+ message: `Value "${obj}" references a runtime variable but is missing the "=js:" prefix. Use "=js:${obj}" so the runtime evaluates it; without the prefix, the value ships as a literal string and the activity input is bound to "${obj.replace(/^\$vars\b/, "vars").replace(/^\$metadata\b/, "metadata").replace(/^\$self\b/, "self")}". See uipath-maestro-flow skill — node-output-wiring.md (MST-9107).`
5979
+ });
5980
+ return;
5981
+ }
5982
+ if (INVENTED_NODES_REF_RE.test(trimmed)) {
5983
+ const fixed = trimmed.replace(/^nodes\./, "=js:$vars.");
5984
+ issues.push({
5985
+ path,
5986
+ severity: "error",
5987
+ message: `Value "${obj}" looks like an invented "nodes.<id>.output" reference. There is no such syntax — variable references use "$vars". Write "${fixed}" instead. See uipath-maestro-flow skill — node-output-wiring.md (MST-9107).`
5988
+ });
5989
+ return;
5990
+ }
5991
+ return;
5992
+ }
5993
+ if (Array.isArray(obj)) {
5994
+ for (let i2 = 0;i2 < obj.length; i2++) {
5995
+ scanForUnprefixedExpressions(obj[i2], `${path}[${i2}]`, issues);
5996
+ }
5997
+ return;
5847
5998
  }
5848
- return n;
5849
- };
5850
- pp.readWord1 = function() {
5851
- this.containsEsc = false;
5852
- var word = "", first = true, chunkStart = this.pos;
5853
- var astral = this.options.ecmaVersion >= 6;
5854
- while (this.pos < this.input.length) {
5855
- var ch = this.fullCharCodeAtPos();
5856
- if (isIdentifierChar(ch, astral)) {
5857
- this.pos += ch <= 65535 ? 1 : 2;
5858
- } else if (ch === 92) {
5859
- this.containsEsc = true;
5860
- word += this.input.slice(chunkStart, this.pos);
5861
- var escStart = this.pos;
5862
- if (this.input.charCodeAt(++this.pos) !== 117) {
5863
- this.invalidStringToken(this.pos, "Expecting Unicode escape sequence \\uXXXX");
5864
- }
5865
- ++this.pos;
5866
- var esc = this.readCodePoint();
5867
- if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral)) {
5868
- this.invalidStringToken(escStart, "Invalid Unicode escape");
5869
- }
5870
- word += codePointToString(esc);
5871
- chunkStart = this.pos;
5872
- } else {
5873
- break;
5999
+ if (obj && typeof obj === "object") {
6000
+ for (const [key, value] of Object.entries(obj)) {
6001
+ scanForUnprefixedExpressions(value, `${path}.${key}`, issues);
5874
6002
  }
5875
- first = false;
5876
6003
  }
5877
- return word + this.input.slice(chunkStart, this.pos);
5878
- };
5879
- pp.readWord = function() {
5880
- var word = this.readWord1();
5881
- var type = types$1.name;
5882
- if (this.keywords.test(word)) {
5883
- type = keywords[word];
6004
+ }
6005
+
6006
+ // src/services/node-validators/ixp-node-validator.ts
6007
+ var FORBIDDEN_INPUT_FIELDS = [
6008
+ "digitizationMode",
6009
+ "documentTaxonomy",
6010
+ "attachmentId",
6011
+ "fileName",
6012
+ "mimeType"
6013
+ ];
6014
+ var FILE_REF_PATTERN = /^=js:\$vars\.[A-Za-z_$]/;
6015
+ var ixpNodeValidator = {
6016
+ id: "ixp-node",
6017
+ appliesTo: (node) => typeof node.type === "string" && node.type.startsWith("uipath.ixp."),
6018
+ validate: (node, _context) => {
6019
+ const issues = [];
6020
+ const inputs = node.inputs ?? {};
6021
+ const outputs = node.outputs ?? {};
6022
+ const base = `nodes[${node.id}]`;
6023
+ const model = inputs.model;
6024
+ const isNonEmptyString2 = (v) => typeof v === "string" && v.length > 0;
6025
+ if (typeof model !== "object" || model === null || Array.isArray(model) || !isNonEmptyString2(model.modelName) || !isNonEmptyString2(model.folderKey)) {
6026
+ issues.push({
6027
+ path: `${base}.inputs.model`,
6028
+ severity: "error",
6029
+ message: "inputs.model must be an object with non-empty string " + "`modelName` and `folderKey`. Studio Web's property " + "panel destructures these and crashes when either is " + "missing or not a string."
6030
+ });
6031
+ }
6032
+ const fileRef = inputs.fileRef;
6033
+ if (typeof fileRef !== "string" || !FILE_REF_PATTERN.test(fileRef)) {
6034
+ issues.push({
6035
+ path: `${base}.inputs.fileRef`,
6036
+ severity: "error",
6037
+ message: "inputs.fileRef must be a `=js:$vars.…` expression. " + "The canonical form for an upstream node output is " + "`=js:$vars.<upstream>.output.<field>`. Without the " + "`=js:` prefix the BPMN serializer treats the value " + "as a literal string at runtime."
6038
+ });
6039
+ }
6040
+ for (const port of ["output", "error"]) {
6041
+ if (!(port in outputs)) {
6042
+ issues.push({
6043
+ path: `${base}.outputs.${port}`,
6044
+ severity: "error",
6045
+ message: `outputs.${port} must be present on the instance. ` + `Without it, downstream $vars.${node.id}.${port} ` + "references will not resolve at runtime."
6046
+ });
6047
+ }
6048
+ }
6049
+ const topLevelModel = node.model;
6050
+ if (topLevelModel != null) {
6051
+ issues.push({
6052
+ path: `${base}.model`,
6053
+ severity: "error",
6054
+ message: "Top-level `model` block is forbidden on IxP node " + "instances. The manifest's slim model " + "({ type, serviceType }) lives only in `definitions[]`."
6055
+ });
6056
+ }
6057
+ const legacy = FORBIDDEN_INPUT_FIELDS.filter((k) => (k in inputs));
6058
+ if (legacy.length > 0) {
6059
+ issues.push({
6060
+ path: `${base}.inputs`,
6061
+ severity: "error",
6062
+ message: "Forbidden legacy fields in inputs: " + `${legacy.join(", ")}. These keys were removed from ` + "the current standalone IxP schema and are not " + "returned by `registry get`."
6063
+ });
6064
+ }
6065
+ return issues;
5884
6066
  }
5885
- return this.finishToken(type, word);
5886
- };
5887
- var version = "8.17.0";
5888
- Parser.acorn = {
5889
- Parser,
5890
- version,
5891
- defaultOptions,
5892
- Position,
5893
- SourceLocation,
5894
- getLineInfo,
5895
- Node,
5896
- TokenType,
5897
- tokTypes: types$1,
5898
- keywordTypes: keywords,
5899
- TokContext,
5900
- tokContexts: types,
5901
- isIdentifierChar,
5902
- isIdentifierStart,
5903
- Token,
5904
- isNewLine,
5905
- lineBreak,
5906
- lineBreakG,
5907
- nonASCIIwhitespace
5908
6067
  };
5909
- function parse3(input, options) {
5910
- return Parser.parse(input, options);
5911
- }
5912
6068
 
5913
6069
  // src/services/node-validators/js-expression-syntax-validator.ts
5914
6070
  var jsExpressionSyntaxValidator = {
@@ -6823,6 +6979,26 @@ function extractProcessGuid(nodeType) {
6823
6979
  }
6824
6980
  return match[1];
6825
6981
  }
6982
+ function resolveProcessTarget(node, definitions) {
6983
+ if (!isProcessNode({ nodeType: node.type }))
6984
+ return;
6985
+ let subType = "Process";
6986
+ if (definitions) {
6987
+ const sameType = definitions.filter((d) => d.nodeType === node.type);
6988
+ const def = sameType.find((d) => node.typeVersion !== undefined && d.version === node.typeVersion) ?? sameType[0];
6989
+ const model = def?.model;
6990
+ const defBindings = model?.bindings;
6991
+ if (defBindings?.resourceSubType)
6992
+ subType = defBindings.resourceSubType;
6993
+ if (defBindings?.resourceKey) {
6994
+ return { key: defBindings.resourceKey, subType };
6995
+ }
6996
+ }
6997
+ return { key: extractProcessGuid(node.type), subType };
6998
+ }
6999
+ function resolveProcessTargetKey(node, definitions) {
7000
+ return resolveProcessTarget(node, definitions)?.key;
7001
+ }
6826
7002
  function createProcessBindings(manifest) {
6827
7003
  const processGuid = extractProcessGuid(manifest.nodeType);
6828
7004
  const model = manifest.model;
@@ -6941,20 +7117,9 @@ function collectNodeBindingRefs(node) {
6941
7117
  }
6942
7118
  function collectNodeBindingResourceKeys(node, bindings, definitions) {
6943
7119
  const keys = new Set;
6944
- if (isProcessNode({ nodeType: node.type })) {
6945
- let foundFromDef = false;
6946
- if (definitions) {
6947
- const def = definitions.find((d) => d.nodeType === node.type);
6948
- const model = def?.model;
6949
- const defBindings = model?.bindings;
6950
- if (defBindings?.resourceKey) {
6951
- keys.add(defBindings.resourceKey);
6952
- foundFromDef = true;
6953
- }
6954
- }
6955
- if (!foundFromDef) {
6956
- keys.add(extractProcessGuid(node.type));
6957
- }
7120
+ const processKey = resolveProcessTargetKey(node, definitions);
7121
+ if (processKey) {
7122
+ keys.add(processKey);
6958
7123
  }
6959
7124
  const inputs = node.inputs;
6960
7125
  if (typeof inputs?.detail?.connectionResourceId === "string") {
@@ -7202,6 +7367,37 @@ function extractPromptVariables(content) {
7202
7367
  }
7203
7368
  return [...vars];
7204
7369
  }
7370
+ var VARS_NODE_OUTPUT_RE = /^=?\$vars\.([A-Za-z0-9_$]+)\.output\.([A-Za-z0-9_$]+)/;
7371
+ function getProducerOutputFields(node) {
7372
+ if (AGENT_NODE_TYPES.includes(node.type)) {
7373
+ const vars = node.inputs?.agentOutputVariables;
7374
+ if (!Array.isArray(vars) || vars.length === 0)
7375
+ return;
7376
+ const fields = new Set;
7377
+ for (const v of vars) {
7378
+ const id = v?.id;
7379
+ if (typeof id === "string")
7380
+ fields.add(id);
7381
+ }
7382
+ return fields.size > 0 ? fields : undefined;
7383
+ }
7384
+ const output = node.outputs?.output;
7385
+ const props = output?.properties;
7386
+ if (props && typeof props === "object") {
7387
+ return new Set(Object.keys(props));
7388
+ }
7389
+ return;
7390
+ }
7391
+ function decodeSchemaKeyNodeRef(key) {
7392
+ const segments = key.split("__");
7393
+ if (segments.length < 3)
7394
+ return;
7395
+ if (segments[0] === "metadata" || segments[1] !== "output")
7396
+ return;
7397
+ if (segments[0].length === 0)
7398
+ return;
7399
+ return { nodeId: segments[0], field: segments[2] || undefined };
7400
+ }
7205
7401
  function collectAgentInputVarIds(raw) {
7206
7402
  const ids = new Set;
7207
7403
  if (!Array.isArray(raw))
@@ -7246,6 +7442,25 @@ function formatHydrationHint(diag, flowDir) {
7246
7442
  }
7247
7443
  return `inline-agent hydration ran but the validator still flagged \`${diag.sourceLocation}\`-resolved prompts as empty. This is unexpected — file an issue with the .flow and agent.json contents.`;
7248
7444
  }
7445
+ function collectNodeExpressionStrings(nodes) {
7446
+ const expressions = [];
7447
+ const collect = (val) => {
7448
+ if (typeof val === "string") {
7449
+ expressions.push(val);
7450
+ } else if (Array.isArray(val)) {
7451
+ for (const v of val)
7452
+ collect(v);
7453
+ } else if (val && typeof val === "object") {
7454
+ for (const v of Object.values(val))
7455
+ collect(v);
7456
+ }
7457
+ };
7458
+ for (const n of nodes) {
7459
+ collect(n.inputs);
7460
+ collect(n.outputs);
7461
+ }
7462
+ return expressions;
7463
+ }
7249
7464
  function extractSupportsErrorHandling(content) {
7250
7465
  const map = new Map;
7251
7466
  let raw;
@@ -7333,6 +7548,7 @@ function buildValidationContext(flow) {
7333
7548
  display: def.display,
7334
7549
  handleConfiguration: def.handleConfiguration,
7335
7550
  inputDefinition: def.inputDefinition,
7551
+ outputDefinition: def.outputDefinition,
7336
7552
  tags: def.tags
7337
7553
  });
7338
7554
  }
@@ -7522,11 +7738,14 @@ Validating: ${absolutePath}
7522
7738
  issues.push(...this.validateGraph(workflow, "", rawDefErrorHandling, currentManifests));
7523
7739
  issues.push(...this.validateGlobalVariableUniqueness(workflow, ""));
7524
7740
  issues.push(...this.validateGlobalTriggerBindings(workflow, ""));
7741
+ issues.push(...this.validateUnboundInputGlobals(workflow, ""));
7525
7742
  issues.push(...this.validateResourceBindings(workflow));
7526
7743
  issues.push(...this.validateConnectionIdReuse(workflow));
7744
+ issues.push(...this.validateDuplicateProcessTargets(workflow));
7527
7745
  issues.push(...await this.validateConnectorBindingShapes(workflow));
7528
7746
  issues.push(...this.validateAgentInputBindings(workflow, hydrationDiagnoses, ""));
7529
7747
  issues.push(...this.validateAgentPromptInputRefs(workflow, hydrationDiagnoses, ""));
7748
+ issues.push(...this.validateAgentInputScopeRefs(workflow, hydrationDiagnoses, ""));
7530
7749
  issues.push(...await this.validateSolutionRegistrationAndLayout(absolutePath));
7531
7750
  const subflows = workflow.subflows ?? {};
7532
7751
  for (const [subflowId, entry] of Object.entries(subflows)) {
@@ -7544,8 +7763,10 @@ Validating: ${absolutePath}
7544
7763
  issues.push(...this.validateGraph(subGraph, prefix, rawDefErrorHandling, currentManifests));
7545
7764
  issues.push(...this.validateGlobalVariableUniqueness(subGraph, prefix));
7546
7765
  issues.push(...this.validateGlobalTriggerBindings(subGraph, prefix));
7766
+ issues.push(...this.validateUnboundInputGlobals(subGraph, prefix));
7547
7767
  issues.push(...this.validateAgentInputBindings(subGraph, hydrationDiagnoses, prefix));
7548
7768
  issues.push(...this.validateAgentPromptInputRefs(subGraph, hydrationDiagnoses, prefix));
7769
+ issues.push(...this.validateAgentInputScopeRefs(subGraph, hydrationDiagnoses, prefix));
7549
7770
  }
7550
7771
  this.enrichInlineAgentPromptIssues(issues, hydrationDiagnoses, flowDir);
7551
7772
  return {
@@ -7776,6 +7997,131 @@ Validating: ${absolutePath}
7776
7997
  }
7777
7998
  return issues;
7778
7999
  }
8000
+ validateAgentInputScopeRefs(graph, diagnoses, pathPrefix) {
8001
+ const agentNodes = graph.nodes.filter((n) => AGENT_NODE_TYPES.includes(n.type));
8002
+ if (agentNodes.length === 0)
8003
+ return [];
8004
+ const nodesById = new Map(graph.nodes.map((n) => [n.id, n]));
8005
+ const nodeIds = new Set(nodesById.keys());
8006
+ const globalIds = new Set((graph.variables?.globals ?? []).map((g) => g.id));
8007
+ const incoming = new Map;
8008
+ for (const edge of graph.edges) {
8009
+ const sources = incoming.get(edge.targetNodeId);
8010
+ if (sources)
8011
+ sources.push(edge.sourceNodeId);
8012
+ else
8013
+ incoming.set(edge.targetNodeId, [edge.sourceNodeId]);
8014
+ }
8015
+ const issues = [];
8016
+ for (const node of agentNodes) {
8017
+ const { byNode: refs, byField } = this.collectAgentVarRefs(node, diagnoses.get(node.id), globalIds);
8018
+ if (refs.size === 0)
8019
+ continue;
8020
+ const wired = incoming.has(node.id);
8021
+ const upstream = wired ? this.collectUpstreamNodeIds(incoming, node.id) : new Set;
8022
+ const missing = [];
8023
+ const notUpstream = [];
8024
+ for (const [refId, origin] of refs) {
8025
+ if (!nodeIds.has(refId))
8026
+ missing.push(origin);
8027
+ else if (wired && !upstream.has(refId))
8028
+ notUpstream.push(origin);
8029
+ }
8030
+ const label = node.display?.label ?? node.id;
8031
+ const path = `${pathPrefix}nodes[${node.id}].inputs.agentInputVariables`;
8032
+ const scope = pathPrefix ? "subflow" : "flow";
8033
+ if (missing.length > 0) {
8034
+ issues.push({
8035
+ path,
8036
+ message: `Agent "${label}" reads ${missing.join(", ")}, but no such node exists in this ${scope}. Studio Web rejects the flow on open with "that variable is not available in this scope", and at runtime the input resolves to nothing. Point the reference at an existing node id (then re-run \`uip agent refresh --inline-in-flow\` so agent.json and the node agree), or drop the input.`,
8037
+ severity: "error"
8038
+ });
8039
+ }
8040
+ if (notUpstream.length > 0) {
8041
+ issues.push({
8042
+ path,
8043
+ message: `Agent "${label}" reads ${notUpstream.join(", ")}, but no edge path leads from that node to "${node.id}", so it has not run when the agent does and its output is not written yet. Studio Web reports the same variable as not available in this scope. Wire the node upstream of the agent, or bind an input the agent can see.`,
8044
+ severity: "warning"
8045
+ });
8046
+ }
8047
+ const invalidFields = [];
8048
+ for (const ref2 of byField) {
8049
+ if (!nodeIds.has(ref2.nodeId))
8050
+ continue;
8051
+ const producer = nodesById.get(ref2.nodeId);
8052
+ if (!producer)
8053
+ continue;
8054
+ const outputFields = getProducerOutputFields(producer);
8055
+ if (!outputFields)
8056
+ continue;
8057
+ if (outputFields.has(ref2.field))
8058
+ continue;
8059
+ const available = [...outputFields].join(", ");
8060
+ invalidFields.push(`${ref2.origin} — node "${ref2.nodeId}" has no output named "${ref2.field}"` + (available ? ` (available: ${available})` : ""));
8061
+ }
8062
+ if (invalidFields.length > 0) {
8063
+ issues.push({
8064
+ path,
8065
+ message: `Agent "${label}" reads ${invalidFields.join("; ")}. Fix the binding to use an output the producer node declares, or add the missing output to the producer.`,
8066
+ severity: "error"
8067
+ });
8068
+ }
8069
+ }
8070
+ return issues;
8071
+ }
8072
+ collectAgentVarRefs(node, diag, globalIds) {
8073
+ const byNode = new Map;
8074
+ const fieldSeen = new Set;
8075
+ const byField = [];
8076
+ const add = (nodeId, field, origin) => {
8077
+ if (globalIds.has(nodeId))
8078
+ return;
8079
+ if (!byNode.has(nodeId))
8080
+ byNode.set(nodeId, origin);
8081
+ if (field) {
8082
+ const fk = `${nodeId}\x00${field}`;
8083
+ if (!fieldSeen.has(fk)) {
8084
+ fieldSeen.add(fk);
8085
+ byField.push({ nodeId, field, origin });
8086
+ }
8087
+ }
8088
+ };
8089
+ for (const key of diag?.declaredInputKeys ?? []) {
8090
+ const ref2 = decodeSchemaKeyNodeRef(key);
8091
+ if (ref2) {
8092
+ add(ref2.nodeId, ref2.field, `\`$vars.${key.split("__").join(".")}\` (agent.json input "${key}")`);
8093
+ }
8094
+ }
8095
+ const bound = node.inputs?.agentInputVariables;
8096
+ if (Array.isArray(bound)) {
8097
+ for (const entry of bound) {
8098
+ if (!entry || typeof entry !== "object")
8099
+ continue;
8100
+ const binding = entry.binding;
8101
+ if (typeof binding !== "string")
8102
+ continue;
8103
+ const match = VARS_NODE_OUTPUT_RE.exec(binding);
8104
+ if (!match)
8105
+ continue;
8106
+ add(match[1], match[2], `\`${binding.replace(/^=/, "")}\` (agentInputVariables binding)`);
8107
+ }
8108
+ }
8109
+ return { byNode, byField };
8110
+ }
8111
+ collectUpstreamNodeIds(incoming, targetId) {
8112
+ const upstream = new Set;
8113
+ const queue = [targetId];
8114
+ while (queue.length > 0) {
8115
+ const current2 = queue.pop();
8116
+ for (const source of incoming.get(current2) ?? []) {
8117
+ if (upstream.has(source))
8118
+ continue;
8119
+ upstream.add(source);
8120
+ queue.push(source);
8121
+ }
8122
+ }
8123
+ return upstream;
8124
+ }
7779
8125
  canonicalInputKey(rawVar) {
7780
8126
  if (!rawVar.startsWith("input."))
7781
8127
  return;
@@ -7938,22 +8284,7 @@ Validating: ${absolutePath}
7938
8284
  const triggerNodeIds = new Set(nodes.filter((n) => typeof n.type === "string" && n.type.startsWith("core.trigger.")).map((n) => n.id));
7939
8285
  if (triggerNodeIds.size === 0)
7940
8286
  return issues;
7941
- const expressions = [];
7942
- const collect = (val) => {
7943
- if (typeof val === "string") {
7944
- expressions.push(val);
7945
- } else if (Array.isArray(val)) {
7946
- for (const v of val)
7947
- collect(v);
7948
- } else if (val && typeof val === "object") {
7949
- for (const v of Object.values(val))
7950
- collect(v);
7951
- }
7952
- };
7953
- for (const n of nodes) {
7954
- collect(n.inputs);
7955
- collect(n.outputs);
7956
- }
8287
+ const expressions = collectNodeExpressionStrings(nodes);
7957
8288
  const refRe = /\$vars\.([A-Za-z0-9_$]+)\.output\.([A-Za-z0-9_$]+)/g;
7958
8289
  const reported = new Set;
7959
8290
  for (const expr of expressions) {
@@ -7981,6 +8312,65 @@ Validating: ${absolutePath}
7981
8312
  }
7982
8313
  return issues;
7983
8314
  }
8315
+ validateUnboundInputGlobals(flow, pathPrefix) {
8316
+ const issues = [];
8317
+ const nodes = flow.nodes ?? [];
8318
+ const inGlobals = (flow.variables?.globals ?? []).filter((g) => g.id && g.direction === "in");
8319
+ if (inGlobals.length === 0)
8320
+ return issues;
8321
+ const triggerNodes = nodes.filter((n) => isStartEventNode({
8322
+ id: n.id,
8323
+ type: n.type,
8324
+ typeVersion: n.typeVersion ?? "1.0"
8325
+ }));
8326
+ if (triggerNodes.length === 0)
8327
+ return issues;
8328
+ const definitions = flow.definitions ?? [];
8329
+ const manifestInputIds = (node) => {
8330
+ const def = definitions.find((d) => d.nodeType === node.type && d.version === node.typeVersion) ?? definitions.find((d) => d.nodeType === node.type);
8331
+ const props = def?.outputDefinition?.output?.schema?.properties;
8332
+ return props && typeof props === "object" ? Object.keys(props) : [];
8333
+ };
8334
+ const manifestInputs = new Set;
8335
+ const globalsDrivenTriggers = [];
8336
+ for (const t of triggerNodes) {
8337
+ const ids = manifestInputIds(t);
8338
+ if (ids.length > 0) {
8339
+ for (const id of ids)
8340
+ manifestInputs.add(id);
8341
+ } else {
8342
+ globalsDrivenTriggers.push(t.id);
8343
+ }
8344
+ }
8345
+ if (globalsDrivenTriggers.length === 0)
8346
+ return issues;
8347
+ const triggerIds = new Set(triggerNodes.map((n) => n.id));
8348
+ const readViaTrigger = new Set;
8349
+ const refRe = /\$vars\.([A-Za-z0-9_$]+)\.output\.([A-Za-z0-9_$]+)/g;
8350
+ for (const expr of collectNodeExpressionStrings(nodes)) {
8351
+ for (const match of expr.matchAll(refRe)) {
8352
+ if (triggerIds.has(match[1]))
8353
+ readViaTrigger.add(match[2]);
8354
+ }
8355
+ }
8356
+ const soleTrigger = globalsDrivenTriggers.length === 1 ? globalsDrivenTriggers[0] : undefined;
8357
+ for (const g of inGlobals) {
8358
+ if (g.triggerNodeId && triggerIds.has(g.triggerNodeId))
8359
+ continue;
8360
+ if (readViaTrigger.has(g.id))
8361
+ continue;
8362
+ if (manifestInputs.has(g.id))
8363
+ continue;
8364
+ const detail = g.triggerNodeId ? `its "triggerNodeId" is "${g.triggerNodeId}", which is not a trigger node in this flow` : `it has no "triggerNodeId"`;
8365
+ const fix = soleTrigger ? `Set "triggerNodeId": "${soleTrigger}" on the "${g.id}" global.` : `Set "triggerNodeId" on the "${g.id}" global to the trigger that supplies it (${globalsDrivenTriggers.join(", ")}).`;
8366
+ issues.push({
8367
+ path: `${pathPrefix}variables.globals[${g.id}].triggerNodeId`,
8368
+ message: `Input variable "${g.id}" is omitted from the packed entry point's \`input.properties\` because ${detail}. A deployed process or trigger then has no way to pass "${g.id}" — while \`flow validate\`, \`flow format\`, and \`flow debug --inputs\` all stay green. ${fix}`,
8369
+ severity: "warning"
8370
+ });
8371
+ }
8372
+ return issues;
8373
+ }
7984
8374
  validateResourceBindings(workflow) {
7985
8375
  const issues = [];
7986
8376
  const bindings = workflow.bindings ?? [];
@@ -7991,12 +8381,14 @@ Validating: ${absolutePath}
7991
8381
  ...workflow.nodes.map((n) => ({
7992
8382
  id: n.id,
7993
8383
  type: n.type,
8384
+ typeVersion: n.typeVersion,
7994
8385
  inputs: n.inputs,
7995
8386
  scope: ""
7996
8387
  })),
7997
8388
  ...Object.entries(subflows).flatMap(([subflowId, sub]) => (sub.nodes ?? []).map((n) => ({
7998
8389
  id: n.id,
7999
8390
  type: n.type,
8391
+ typeVersion: n.typeVersion,
8000
8392
  inputs: n.inputs,
8001
8393
  scope: `subflows[${subflowId}].`
8002
8394
  })))
@@ -8054,6 +8446,52 @@ Validating: ${absolutePath}
8054
8446
  }
8055
8447
  return issues;
8056
8448
  }
8449
+ validateDuplicateProcessTargets(workflow) {
8450
+ const issues = [];
8451
+ const subflows = workflow.subflows ?? {};
8452
+ const definitions = workflow.definitions;
8453
+ const buckets = new Map;
8454
+ const recordNode = (node, scope) => {
8455
+ const target = resolveProcessTarget(node, definitions);
8456
+ if (!target)
8457
+ return;
8458
+ const bucketKey = `${target.subType}\x00${target.key}`;
8459
+ let list2 = buckets.get(bucketKey);
8460
+ if (!list2) {
8461
+ list2 = [];
8462
+ buckets.set(bucketKey, list2);
8463
+ }
8464
+ list2.push({
8465
+ nodeId: node.id,
8466
+ label: node.display?.label ?? "",
8467
+ scope,
8468
+ targetKey: target.key
8469
+ });
8470
+ };
8471
+ for (const node of workflow.nodes) {
8472
+ recordNode(node, "");
8473
+ }
8474
+ for (const [subflowId, sub] of Object.entries(subflows)) {
8475
+ for (const node of sub.nodes ?? []) {
8476
+ recordNode(node, `subflows[${subflowId}].`);
8477
+ }
8478
+ }
8479
+ for (const occurrences of buckets.values()) {
8480
+ if (occurrences.length < 2)
8481
+ continue;
8482
+ const distinctLabels = new Set(occurrences.map((o) => o.label));
8483
+ if (distinctLabels.size < 2)
8484
+ continue;
8485
+ const nodeList = occurrences.map((o) => `${o.scope}nodes[${o.nodeId}] ("${o.label}")`).join(", ");
8486
+ const first = occurrences[0];
8487
+ issues.push({
8488
+ path: `${first.scope}nodes[${first.nodeId}]`,
8489
+ severity: "warning",
8490
+ message: `Process target "${first.targetKey}" is invoked by ${occurrences.length} differently-named nodes (${nodeList}). Two differently-named nodes resolving to the same process/function usually means a node was duplicated without re-pointing its target — verify each node calls the intended process. If this reuse is intentional, ignore this warning.`
8491
+ });
8492
+ }
8493
+ return issues;
8494
+ }
8057
8495
  async validateConnectorBindingShapes(workflow) {
8058
8496
  const catalog = await this.loadConnectorCatalogCached();
8059
8497
  return validateConnectorBindings(workflow, catalog, {
@@ -8362,4 +8800,4 @@ Validating: ${absolutePath}
8362
8800
 
8363
8801
  export { ensureDirectory, FlowEvalFileStore, readInlineAgentSource, isInlineAgentNodeType, fileNodesToPackagingNodes, packageInlineAgents, stageInlineAgentPackageFiles, buildInlineAgentDescriptors, writePackagingArtifacts, writePackagingArtifactsDetailed, regenerateBindingsFile, NodeTypeNotFoundError, NodeTypeNotEnabledError, SourceRequiredError, listNodesInFlow, ensureProcessBindings, collectNodeBindingResourceKeys, addNodeToFlow, deleteNodeFromFlow, ERROR_SOURCE_PORT, enableErrorHandlingForErrorEdges, expandHandleIds, portMatchesTemplate, captureMigrationIssues, formatMigrationFailureMessage, isConnectorTriggerType, isConnectorWaitForEventType, isEventDrivenConnectorType, scanDetailForCrossNodeBindings, connectorNodeValidator, FlowValidateService };
8364
8802
 
8365
- //# debugId=3895B4CB3D61615C64756E2164756E21
8803
+ //# debugId=4018E76FF70902A364756E2164756E21