@uipath/case-tool 1.201.0 → 1.202.0-preview.136

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 (96) hide show
  1. package/dist/{authoring-aaaqwck3.js → authoring-cvjhkfxp.js} +74 -48
  2. package/dist/{browser-strategy-rkcvc6tn.js → browser-strategy-6atc7v8s.js} +3 -3
  3. package/dist/case-api-bwcxsbxe.js +381 -0
  4. package/dist/case-debug-studio-web-service-qcb328bt.js +335 -0
  5. package/dist/{case-pack-service-bxas5bxz.js → case-pack-service-txby2znw.js} +11 -18
  6. package/dist/case-validate-service-0q8krj2a.js +2114 -0
  7. package/dist/connector-enrichment-service-agqxam5y.js +60 -0
  8. package/dist/connector-lookup-service-ycgk77n0.js +22 -0
  9. package/dist/connector-task-spec-kdx5bv87.js +1250 -0
  10. package/dist/{de-5KVP66U6-t37qr521.js → de-5KVP66U6-1bnf4zt5.js} +54 -54
  11. package/dist/{de-5HU6GFWV-zheyw6d2.js → de-7XQXX2DK-tqdy5n2b.js} +857 -845
  12. package/dist/debug-service-dxx5pfev.js +57 -0
  13. package/dist/{en-MABQK6C4-nkzq2j8t.js → en-5ZGC5VQ3-h581y30k.js} +897 -897
  14. package/dist/{en-4KXU7N7B-24v330b5.js → en-X3S6IZ5J-nhkg6pwn.js} +55 -61
  15. package/dist/enrichment-service-ebz1f4ds.js +421 -0
  16. package/dist/{es-MX-POESXYP2-9538722k.js → es-MX-U2VN3SZW-anynsmd8.js} +857 -845
  17. package/dist/{es-MX-XAVLOQW3-47a405kf.js → es-MX-XAVLOQW3-q00km2y7.js} +54 -54
  18. package/dist/{es-VFPNVMP5-6sftsdxe.js → es-VFPNVMP5-bx2c337j.js} +54 -54
  19. package/dist/{es-LUTYN7U7-ye5zn4sn.js → es-ZGCPPOME-8gazspjj.js} +857 -845
  20. package/dist/{fr-E5MDO4EG-f3x1jeqw.js → fr-E5MDO4EG-c3mkty2t.js} +54 -54
  21. package/dist/{fr-LJIK56LW-xf3xf2kh.js → fr-T3G5GZCT-y3f7xb1q.js} +857 -845
  22. package/dist/{index-cncq089f.js → index-7s201ka0.js} +163 -80
  23. package/dist/{index-hsadteg4.js → index-h8cph72k.js} +4 -4
  24. package/dist/index-k4xz16db.js +63712 -0
  25. package/dist/{index-p50kx6jv.js → index-k5tbd184.js} +276 -276
  26. package/dist/index-kwxe1vep.js +143 -0
  27. package/dist/{index-9f8q2ege.js → index-p3vk57z7.js} +27 -27
  28. package/dist/index-qyf1dee9.js +630 -0
  29. package/dist/index.js +16 -17
  30. package/dist/{index.umd.min-drpc57vn.js → index.umd.min-fqefd9kn.js} +3 -3
  31. package/dist/input-reader-xb9vecxv.js +11 -0
  32. package/dist/{ja-FGEGLBJ3-w9byjhze.js → ja-BI5K3JDZ-77zat4z2.js} +857 -845
  33. package/dist/{ja-DPO5PPLO-fmbg7zt2.js → ja-DPO5PPLO-mysfmznx.js} +54 -54
  34. package/dist/{js-yaml-cggj6w7q.js → js-yaml-87cdx6bm.js} +27 -19
  35. package/dist/known-types-qryebm95.js +15 -0
  36. package/dist/{ko-ITOPNIYI-aqy82jk8.js → ko-ITOPNIYI-hmxd2asd.js} +54 -54
  37. package/dist/{ko-TUAK3G3A-s25w0ckg.js → ko-JOBF5V7N-4bv0mjje.js} +857 -845
  38. package/dist/{node-strategy-8gzp67xs.js → node-strategy-0267x5e5.js} +130 -14
  39. package/dist/node-sync-service-9a9ksj9s.js +38 -0
  40. package/dist/{packager-tool-9qecd4wb.js → packager-tool-0gctz400.js} +5 -2
  41. package/dist/packager-tool-0mj06yen.js +65 -0
  42. package/dist/{packager-tool-1cb0d5e0.js → packager-tool-0v3s8r01.js} +2 -2
  43. package/dist/packager-tool-134mvmcm.js +3040 -0
  44. package/dist/{packager-tool-wckvcay0.js → packager-tool-1yh8g550.js} +9 -7
  45. package/dist/{packager-tool-zqa5k9f7.js → packager-tool-37zvccmt.js} +990 -2287
  46. package/dist/packager-tool-3ze5vt52.js +54 -0
  47. package/dist/{packager-tool-w3h8xrnv.js → packager-tool-56j6keqr.js} +71 -3
  48. package/dist/{packager-tool-3wygxefb.js → packager-tool-58q3tvh7.js} +10 -10
  49. package/dist/{packager-tool-zx48pq4v.js → packager-tool-5ax2ywcg.js} +1997 -1174
  50. package/dist/{packager-tool-we1phz71.js → packager-tool-885mmrvr.js} +31 -3
  51. package/dist/packager-tool-9scn4b15.js +852 -0
  52. package/dist/{packager-tool-p9j43p8h.js → packager-tool-a42jnpy5.js} +3 -9
  53. package/dist/packager-tool-ajvse9r3.js +356 -0
  54. package/dist/{packager-tool-jysvpt8p.js → packager-tool-c23zrhj8.js} +2 -2
  55. package/dist/packager-tool-dqs5qy9s.js +2327 -0
  56. package/dist/packager-tool-ee5dhff3.js +6717 -0
  57. package/dist/{packager-tool-wvqz81mx.js → packager-tool-gtzs471w.js} +3 -2
  58. package/dist/packager-tool-hrr0efqc.js +546 -0
  59. package/dist/packager-tool-j9rfdrdm.js +1125 -0
  60. package/dist/{packager-tool-gq6952nc.js → packager-tool-jhdf8gt1.js} +5054 -17851
  61. package/dist/packager-tool-mp59jtpm.js +6865 -0
  62. package/dist/packager-tool-njzcfve1.js +77 -0
  63. package/dist/packager-tool-p7jgrm5r.js +15 -0
  64. package/dist/packager-tool-r84ng21s.js +57 -0
  65. package/dist/packager-tool-rqvr63x5.js +1217 -0
  66. package/dist/packager-tool-s12392rd.js +80 -0
  67. package/dist/packager-tool-sv0d6wb6.js +173 -0
  68. package/dist/packager-tool-ty1t2byf.js +27 -0
  69. package/dist/packager-tool-vepqrsse.js +23 -0
  70. package/dist/packager-tool-w5ek334f.js +4892 -0
  71. package/dist/{packager-tool-5arsyj36.js → packager-tool-yc4kw997.js} +4 -2
  72. package/dist/packager-tool.js +91 -5
  73. package/dist/project-artifacts-vhanbtw5.js +14 -0
  74. package/dist/{pt-BR-7XGDXRDJ-espnkgrj.js → pt-BR-7DYX2YPT-fqxqzqtf.js} +857 -845
  75. package/dist/{pt-BR-BXURWX4W-xzyndmrx.js → pt-BR-BXURWX4W-bwfcwhk1.js} +54 -54
  76. package/dist/{pt-TMVOOITK-myha14p9.js → pt-HTXGGX6Y-97t21dty.js} +857 -845
  77. package/dist/{pt-YI4VE4YQ-521681zf.js → pt-YI4VE4YQ-wdkn2dcf.js} +54 -54
  78. package/dist/resourcesSyncService-mrmmwaqr.js +683 -0
  79. package/dist/{ro-2VALF3S5-cdz5afkr.js → ro-KTNQ3MNU-y08n1x5g.js} +857 -845
  80. package/dist/{ro-RKXZUG7Z-pdztdafr.js → ro-RKXZUG7Z-nndrrsq7.js} +54 -54
  81. package/dist/{ru-GSCT4ARZ-qj8dm4dp.js → ru-GSCT4ARZ-1sa9wbr8.js} +1 -1
  82. package/dist/ru-WBLQ5B2U-8r3c7v6d.js +10 -0
  83. package/dist/strict-case-rules-303vjvas.js +377 -0
  84. package/dist/strict-sdd-audit-qdmc9e1y.js +1024 -0
  85. package/dist/tool.js +17 -18
  86. package/dist/{tr-AA6O2WSR-bj9n80k8.js → tr-AA6O2WSR-86ba4bdf.js} +54 -54
  87. package/dist/{tr-RIFCEXFH-hgkb4g8y.js → tr-XHSSPNK7-cmqyc4wd.js} +857 -845
  88. package/dist/trigger-enrichment-service-zdx4x92j.js +340 -0
  89. package/dist/{zh-CN-IP3FMXWM-1cfarhcp.js → zh-CN-2EHQT23P-mr63c4xz.js} +857 -845
  90. package/dist/{zh-CN-R2KLHXQV-x6gnk2n0.js → zh-CN-R2KLHXQV-agqr45ds.js} +54 -54
  91. package/dist/{zh-TW-AGIDXIPF-n6r6w7vy.js → zh-TW-MGZCE5BT-c4ekmrz9.js} +857 -845
  92. package/dist/{zh-TW-RJGCQANM-tt8j5wv2.js → zh-TW-RJGCQANM-w0x3qc1p.js} +54 -54
  93. package/package.json +2 -2
  94. package/dist/index-8bsngk9y.js +0 -247140
  95. package/dist/packager-tool-axcdppp9.js +0 -13607
  96. package/dist/ru-WBLQ5B2U-8xd4gpv2.js +0 -10
@@ -0,0 +1,1217 @@
1
+ import {
2
+ resolveMaestroRegistry
3
+ } from "./packager-tool-885mmrvr.js";
4
+ import {
5
+ ConnectionsApi,
6
+ ElementsApi,
7
+ createApiClient,
8
+ getConnectorActivityMetadataV4,
9
+ isV4ActivityConfiguration
10
+ } from "./packager-tool-mp59jtpm.js";
11
+ import {
12
+ MANIFEST_FEATURE_FLAGS,
13
+ ManifestClient,
14
+ extractIOFromEntryPoints,
15
+ getServiceType,
16
+ listKnownSdkNodes,
17
+ taskDefinitionsToNodeManifests
18
+ } from "./packager-tool-jhdf8gt1.js";
19
+ import {
20
+ getLoginStatusAsync
21
+ } from "./packager-tool-dqs5qy9s.js";
22
+ import {
23
+ UIPATH_HOME_DIR,
24
+ catchError,
25
+ hashContent,
26
+ logger
27
+ } from "./packager-tool-5ax2ywcg.js";
28
+ import {
29
+ getFileSystem
30
+ } from "./packager-tool-0v3s8r01.js";
31
+
32
+ // ../maestro-sdk/src/registry/filter-engine.ts
33
+ function filterNodes(nodes, parsedFilters) {
34
+ if (!parsedFilters.filters || parsedFilters.filters.length === 0) {
35
+ return nodes;
36
+ }
37
+ return nodes.filter((node) => {
38
+ if (parsedFilters.logic === "AND") {
39
+ return parsedFilters.filters.every((condition) => matchesCondition(node, condition));
40
+ } else {
41
+ return parsedFilters.filters.some((condition) => matchesCondition(node, condition));
42
+ }
43
+ });
44
+ }
45
+ function matchesCondition(node, condition) {
46
+ const fieldValue = getFieldValue(node, condition.field);
47
+ if (fieldValue === null || fieldValue === undefined) {
48
+ return false;
49
+ }
50
+ const searchValue = condition.value.toString().toLowerCase();
51
+ if (Array.isArray(fieldValue)) {
52
+ return matchesArrayField(fieldValue, condition.operator, searchValue);
53
+ }
54
+ const fieldString = fieldValue.toString().toLowerCase();
55
+ switch (condition.operator) {
56
+ case "equals":
57
+ return fieldString === searchValue;
58
+ case "contains":
59
+ return fieldString.includes(searchValue);
60
+ case "startsWith":
61
+ return fieldString.startsWith(searchValue);
62
+ case "endsWith":
63
+ return fieldString.endsWith(searchValue);
64
+ case "in": {
65
+ const values = searchValue.split(",").map((v) => v.trim());
66
+ return values.includes(fieldString);
67
+ }
68
+ default:
69
+ return fieldString === searchValue;
70
+ }
71
+ }
72
+ function matchesArrayField(arrayValue, operator, searchValue) {
73
+ const lowerArray = arrayValue.map((v) => v.toLowerCase());
74
+ switch (operator) {
75
+ case "equals":
76
+ return lowerArray.includes(searchValue);
77
+ case "contains":
78
+ return lowerArray.some((tag) => tag.includes(searchValue));
79
+ case "in": {
80
+ const values = searchValue.split(",").map((v) => v.trim());
81
+ return lowerArray.some((tag) => values.includes(tag));
82
+ }
83
+ default:
84
+ return lowerArray.includes(searchValue);
85
+ }
86
+ }
87
+ function getFieldValue(node, field) {
88
+ switch (field) {
89
+ case "category":
90
+ return node.category;
91
+ case "type":
92
+ case "nodetype":
93
+ return node.nodeType;
94
+ case "tags":
95
+ return node.tags;
96
+ case "displayname":
97
+ return node.display?.label;
98
+ case "description":
99
+ return node.description ?? node.display?.description;
100
+ default:
101
+ return node[field];
102
+ }
103
+ }
104
+ function searchWithFilters(nodes, keyword, filters) {
105
+ let results = nodes;
106
+ if (filters && filters.filters.length > 0) {
107
+ results = filterNodes(results, filters);
108
+ }
109
+ if (keyword && keyword.trim() !== "") {
110
+ const lowerKeyword = keyword.toLowerCase();
111
+ results = results.filter((node) => {
112
+ if (node.nodeType?.toLowerCase().includes(lowerKeyword)) {
113
+ return true;
114
+ }
115
+ if (node.category?.toLowerCase().includes(lowerKeyword)) {
116
+ return true;
117
+ }
118
+ if (node.tags?.some((tag) => tag.toLowerCase().includes(lowerKeyword))) {
119
+ return true;
120
+ }
121
+ if (node.display?.label?.toLowerCase().includes(lowerKeyword)) {
122
+ return true;
123
+ }
124
+ if (node.description?.toString().toLowerCase().includes(lowerKeyword)) {
125
+ return true;
126
+ }
127
+ if (node.display?.description?.toLowerCase().includes(lowerKeyword)) {
128
+ return true;
129
+ }
130
+ return false;
131
+ });
132
+ }
133
+ return results;
134
+ }
135
+
136
+ // ../maestro-sdk/src/registry/integration-service-fetcher.ts
137
+ function parseContext(node) {
138
+ const context = node.model?.context;
139
+ if (!Array.isArray(context))
140
+ return null;
141
+ const connectorKey = context.find((c) => c.name === "connectorKey")?.value;
142
+ const objectName = context.find((c) => c.name === "objectName")?.value;
143
+ const method = context.find((c) => c.name === "method")?.value ?? "POST";
144
+ const operation = context.find((c) => c.name === "operation")?.value;
145
+ if (!connectorKey || !objectName)
146
+ return null;
147
+ return { connectorKey, objectName, method, operation };
148
+ }
149
+ function applyOptionalFieldProps(compact, field) {
150
+ if (field.enum?.length)
151
+ compact.enum = field.enum;
152
+ if (field.reference) {
153
+ compact.reference = {
154
+ objectName: field.reference.objectName,
155
+ lookupValue: field.reference.lookupValue,
156
+ lookupNames: field.reference.lookupNames,
157
+ path: field.reference.path,
158
+ childPath: field.reference.childPath
159
+ };
160
+ }
161
+ }
162
+ function extractFields(metadata, method, requestOnly) {
163
+ const fieldsObj = metadata?.fields ?? {};
164
+ const fields = Array.isArray(fieldsObj) ? fieldsObj : Object.values(fieldsObj);
165
+ return fields.filter((field) => {
166
+ const methodInfo = field.method?.[method];
167
+ if (!methodInfo)
168
+ return false;
169
+ return requestOnly ? methodInfo.request === true || methodInfo.requestCurated === true : methodInfo.response === true || methodInfo.responseCurated === true;
170
+ }).map((field) => {
171
+ const compact = {
172
+ name: field.name,
173
+ displayName: field.displayName,
174
+ type: field.type,
175
+ dataType: field.type,
176
+ required: requestOnly ? field.method?.[method]?.required === true : false,
177
+ description: field.description
178
+ };
179
+ if (!requestOnly)
180
+ compact.responseOnly = true;
181
+ applyOptionalFieldProps(compact, field);
182
+ return compact;
183
+ });
184
+ }
185
+ function isConnectorNode(node) {
186
+ const nodeType = node.nodeType;
187
+ return nodeType?.startsWith("uipath.connector") || false;
188
+ }
189
+ function isConnectorTriggerNode(node) {
190
+ const nodeType = node.nodeType;
191
+ return nodeType?.startsWith("uipath.connector.trigger") || false;
192
+ }
193
+ function toCompactField(field, required) {
194
+ const compact = {
195
+ name: field.name,
196
+ displayName: field.displayName,
197
+ type: field.type,
198
+ dataType: field.type,
199
+ required,
200
+ description: field.description
201
+ };
202
+ applyOptionalFieldProps(compact, field);
203
+ return compact;
204
+ }
205
+ function extractTriggerEventParameters(metadata, operationName) {
206
+ const fields = Object.values(metadata?.fields ?? {});
207
+ return fields.filter((field) => !!field.events?.[operationName]).map((field) => toCompactField(field, field.events?.[operationName]?.required === true));
208
+ }
209
+ function extractTriggerFilterFields(metadata) {
210
+ const fields = Object.values(metadata?.fields ?? {});
211
+ return fields.filter((field) => field.order === 1).map((field) => toCompactField(field, false));
212
+ }
213
+ function extractActivityFilterFields(metadata, _method) {
214
+ const fieldsObj = metadata?.fields ?? {};
215
+ const fields = Array.isArray(fieldsObj) ? fieldsObj : Object.values(fieldsObj);
216
+ return fields.filter((field) => field.searchable === true).map((field) => {
217
+ const compact = {
218
+ name: field.name,
219
+ displayName: field.displayName,
220
+ type: field.type,
221
+ dataType: field.type,
222
+ required: false,
223
+ description: field.description
224
+ };
225
+ if (field.searchableOperators?.length) {
226
+ compact.searchableOperators = [...field.searchableOperators];
227
+ }
228
+ if (field.searchableNames?.length) {
229
+ compact.searchableNames = [...field.searchableNames];
230
+ }
231
+ applyOptionalFieldProps(compact, field);
232
+ return compact;
233
+ });
234
+ }
235
+ function extractTriggerOutputFields(metadata) {
236
+ const fields = Object.values(metadata?.fields ?? {});
237
+ return fields.map((field) => {
238
+ const compact = toCompactField(field, false);
239
+ compact.responseOnly = true;
240
+ return compact;
241
+ });
242
+ }
243
+ async function fetchConnectorTriggerMetadata(connectorKey, operationName, objectName, connectionId) {
244
+ const api = await createApiClient(ElementsApi);
245
+ const triggerMetadata = await api.getInstanceEventObjectMetadata({
246
+ connectionOrInstanceId: connectionId,
247
+ elementKey: connectorKey,
248
+ operationName,
249
+ objectName,
250
+ allFields: true
251
+ });
252
+ return triggerMetadata;
253
+ }
254
+ function getConfigurationString(node) {
255
+ const modelConfig = node.model?.configuration;
256
+ if (modelConfig)
257
+ return modelConfig;
258
+ const form = node.form;
259
+ for (const section of form?.sections ?? []) {
260
+ for (const field of section.fields ?? []) {
261
+ const config = field.componentProps?.connectorDetail?.configuration;
262
+ if (config)
263
+ return config;
264
+ }
265
+ }
266
+ return;
267
+ }
268
+ function getConnectorConfiguration(node) {
269
+ const configStr = getConfigurationString(node);
270
+ if (!configStr)
271
+ return null;
272
+ const [err, parsed] = catchError(() => JSON.parse(configStr));
273
+ return err ? null : parsed;
274
+ }
275
+ async function fetchConnectionInfo(connectionId) {
276
+ const api = await createApiClient(ConnectionsApi);
277
+ const response = await api.apiV1ConnectionsConnectionIdGet({
278
+ connectionId
279
+ });
280
+ const connector = response.connector;
281
+ return {
282
+ id: response.id ?? connectionId,
283
+ name: response.name ?? connectionId,
284
+ connectorKey: connector?.key ?? "",
285
+ connectorName: connector?.name ?? "",
286
+ connectorVersion: response.elementVersion ?? null,
287
+ pollingInterval: response.pollingIntervalInMinutes ?? null,
288
+ byoaConnection: response.byoaConnection === true,
289
+ elementInstanceId: response.elementInstanceId ?? null,
290
+ folderKey: response.folder?.key ?? null
291
+ };
292
+ }
293
+ async function fetchConnectorMetadata(connectorKey, objectName, connectionId) {
294
+ const api = await createApiClient(ElementsApi);
295
+ if (connectionId) {
296
+ const response2 = await api.getInstanceObjectMetadataRaw({
297
+ connectionOrInstanceId: connectionId,
298
+ elementKey: connectorKey,
299
+ objectName,
300
+ includeParentArray: true
301
+ });
302
+ return await response2.raw.json();
303
+ }
304
+ const response = await api.getObjectMetadataRaw({
305
+ elementKey: connectorKey,
306
+ objectName,
307
+ includeParentArray: true
308
+ });
309
+ return await response.raw.json();
310
+ }
311
+ async function fetchConnectorActivityMetadataV4(connectorKey, activityName) {
312
+ return await getConnectorActivityMetadataV4(undefined, connectorKey, activityName);
313
+ }
314
+ function buildEnrichedActivityNode(node, metadata, method) {
315
+ const connectorMethodInfo = metadata?.metadata?.method?.[method];
316
+ const inputFields = extractFields(metadata, method, true);
317
+ const outputFields = extractFields(metadata, method, false);
318
+ const filterFields = extractActivityFilterFields(metadata, method);
319
+ return {
320
+ ...node,
321
+ ...connectorMethodInfo && { connectorMethodInfo },
322
+ inputDefinition: node.inputDefinition && Object.keys(node.inputDefinition).length > 0 ? node.inputDefinition : { fields: inputFields },
323
+ outputResponseDefinition: { fields: outputFields },
324
+ ...filterFields.length > 0 && {
325
+ filterFields: { fields: filterFields }
326
+ }
327
+ };
328
+ }
329
+ async function enrichConnectorActivityNode(node, connectionId) {
330
+ const parsed = parseContext(node);
331
+ const config = getConnectorConfiguration(node);
332
+ if (isV4ActivityConfiguration(config)) {
333
+ return enrichV4ConnectorActivityNode(node, connectionId, config);
334
+ }
335
+ if (!parsed)
336
+ return node;
337
+ const { connectorKey, objectName, method } = parsed;
338
+ const [error, metadata] = await catchError(fetchConnectorMetadata(connectorKey, objectName, connectionId));
339
+ if (error) {
340
+ return node;
341
+ }
342
+ return buildEnrichedActivityNode(node, metadata, method);
343
+ }
344
+ async function enrichV4ConnectorActivityNode(node, connectionId, config) {
345
+ const connectorKey = config?.connectorKey;
346
+ const activityName = config?.activityName;
347
+ const method = config?.httpMethod;
348
+ if (!connectorKey || !activityName || !method) {
349
+ logger.warn("v4 IS enrichment skipped: node configuration carries no connectorKey/activityName/httpMethod.");
350
+ return node;
351
+ }
352
+ if (connectionId) {
353
+ logger.warn("v4 metadata endpoints are not connection-scoped — --connection-id is ignored for 4.0.0 enrichment.");
354
+ }
355
+ const [error, metadata] = await catchError(fetchConnectorActivityMetadataV4(connectorKey, activityName));
356
+ if (error) {
357
+ logger.warn(`IS v4 enrichment failed: ${error.message}`);
358
+ return node;
359
+ }
360
+ return buildEnrichedActivityNode(node, metadata, method);
361
+ }
362
+ async function enrichConnectorNode(node, connectionId) {
363
+ if (!isConnectorNode(node))
364
+ return node;
365
+ return isConnectorTriggerNode(node) ? enrichConnectorTriggerNode(node, connectionId) : enrichConnectorActivityNode(node, connectionId);
366
+ }
367
+ async function enrichConnectorTriggerNode(node, connectionId) {
368
+ if (!connectionId) {
369
+ throw new Error("Trigger nodes require --connection-id for IS enrichment. Provide it with --connection-id <id>.");
370
+ }
371
+ const parsed = parseContext(node);
372
+ if (!parsed?.operation)
373
+ return node;
374
+ const { connectorKey, objectName, operation } = parsed;
375
+ const metadata = await fetchConnectorTriggerMetadata(connectorKey, operation, objectName, connectionId);
376
+ const eventParameters = extractTriggerEventParameters(metadata, operation);
377
+ const filterFields = extractTriggerFilterFields(metadata);
378
+ const outputFields = extractTriggerOutputFields(metadata);
379
+ let byoaConnection = false;
380
+ let elementInstanceId = null;
381
+ if (connectionId) {
382
+ const [connErr, connInfo] = await catchError(fetchConnectionInfo(connectionId));
383
+ if (!connErr) {
384
+ byoaConnection = connInfo.byoaConnection;
385
+ elementInstanceId = connInfo.elementInstanceId;
386
+ } else {
387
+ logger.warn(`Failed to fetch connection info for ${connectionId}: ${connErr.message}`);
388
+ }
389
+ }
390
+ return {
391
+ ...node,
392
+ eventMode: metadata.eventMode,
393
+ byoaConnection,
394
+ elementInstanceId,
395
+ eventParameters: { fields: eventParameters },
396
+ filterFields: { fields: filterFields },
397
+ outputResponseDefinition: { fields: outputFields }
398
+ };
399
+ }
400
+
401
+ // ../maestro-sdk/src/registry/is-precache.ts
402
+ async function resolveLibraryJsonDir() {
403
+ const snapshot = await resolveMaestroRegistry();
404
+ return snapshot?.libraryJson ?? null;
405
+ }
406
+ async function readIndex() {
407
+ const fs = getFileSystem();
408
+ const dir = await resolveLibraryJsonDir();
409
+ if (!dir)
410
+ return null;
411
+ const indexPath = fs.path.join(dir, "index.json");
412
+ const [readError, content] = await catchError(fs.readFile(indexPath, "utf-8"));
413
+ if (readError || content === null)
414
+ return null;
415
+ const [parseError, parsed] = catchError(() => JSON.parse(content));
416
+ if (parseError || !parsed || !Array.isArray(parsed.entries))
417
+ return null;
418
+ return parsed.entries;
419
+ }
420
+ async function listPrecacheEntries() {
421
+ const entries = await readIndex();
422
+ return entries ?? [];
423
+ }
424
+ async function getPrecacheNode(nodeType, options) {
425
+ const fs = getFileSystem();
426
+ const dir = await resolveLibraryJsonDir();
427
+ if (!dir)
428
+ return null;
429
+ const indexPath = fs.path.join(dir, "index.json");
430
+ const [indexReadError, indexContent] = await catchError(fs.readFile(indexPath, "utf-8"));
431
+ if (indexReadError || indexContent === null)
432
+ return null;
433
+ const [indexParseError, parsed] = catchError(() => JSON.parse(indexContent));
434
+ if (indexParseError || !parsed || !Array.isArray(parsed.entries))
435
+ return null;
436
+ const lowerNodeType = nodeType.toLowerCase();
437
+ let matches = parsed.entries.filter((e) => e.nodeType.toLowerCase() === lowerNodeType);
438
+ if (options?.objectName) {
439
+ const lowerObject = options.objectName.toLowerCase();
440
+ matches = matches.filter((e) => e.objectName.toLowerCase() === lowerObject);
441
+ }
442
+ if (matches.length !== 1)
443
+ return null;
444
+ const entry = matches[0];
445
+ const v1defPath = fs.path.join(dir, entry.path.replace(/\.json$/, ".v1def.json"));
446
+ const [readError, content] = await catchError(fs.readFile(v1defPath, "utf-8"));
447
+ if (readError || content === null)
448
+ return null;
449
+ const [parseError, manifest] = catchError(() => JSON.parse(content));
450
+ if (parseError || !manifest)
451
+ return null;
452
+ return manifest;
453
+ }
454
+
455
+ // ../maestro-sdk/src/registry/node-storage.ts
456
+ var CACHE_FORMAT_VERSION = 3;
457
+ var INDEX_FILE = "index.json";
458
+ var METADATA_FILE = "index.meta.json";
459
+ var SEARCH_INDEX_FILE = "search-index.json";
460
+ var ESSENTIALS_INDEX_FILE = "get-essentials.json";
461
+ var WRITE_LOCK_FILE = ".index-write.lock";
462
+ async function resolveNodeStorageDir() {
463
+ const fs = getFileSystem();
464
+ return fs.path.join(fs.env.homedir(), UIPATH_HOME_DIR, "nodes");
465
+ }
466
+ function buildSearchIndex(nodes) {
467
+ return nodes.map((node) => ({
468
+ nodeType: node.nodeType,
469
+ category: node.category,
470
+ tags: node.tags,
471
+ version: node.version,
472
+ description: node.description,
473
+ display: node.display === undefined ? undefined : {
474
+ label: node.display.label,
475
+ description: node.display.description
476
+ }
477
+ }));
478
+ }
479
+ function isEssentialNodeType(nodeType) {
480
+ if (typeof nodeType !== "string" || nodeType.length === 0)
481
+ return false;
482
+ const lowerNodeType = nodeType.toLowerCase();
483
+ return lowerNodeType.startsWith("core.") || lowerNodeType.startsWith("uipath.core.") || lowerNodeType === "uipath.human-in-the-loop";
484
+ }
485
+ function buildEssentialsIndex(nodes) {
486
+ return nodes.filter((node) => isEssentialNodeType(node.nodeType));
487
+ }
488
+ function createDerivedArtifact(nodes, sourceHash) {
489
+ return {
490
+ cacheVersion: CACHE_FORMAT_VERSION,
491
+ sourceHash,
492
+ generatedAt: Date.now(),
493
+ nodes
494
+ };
495
+ }
496
+ function normalizeMetadata(metadata) {
497
+ return {
498
+ ...metadata,
499
+ cacheVersion: metadata.cacheVersion ?? 0
500
+ };
501
+ }
502
+ async function writeTempAndRename(fs, targetPath, content) {
503
+ const tempPath = `${targetPath}.tmp-${Date.now()}-${Math.random().toString(36).slice(2)}`;
504
+ await fs.writeFile(tempPath, content);
505
+ await fs.rename(tempPath, targetPath);
506
+ }
507
+ async function writeNodeArtifacts(fs, dir, nodes) {
508
+ const indexPath = fs.path.join(dir, INDEX_FILE);
509
+ const searchIndexPath = fs.path.join(dir, SEARCH_INDEX_FILE);
510
+ const essentialsIndexPath = fs.path.join(dir, ESSENTIALS_INDEX_FILE);
511
+ const metaPath = fs.path.join(dir, METADATA_FILE);
512
+ const indexContent = JSON.stringify(nodes);
513
+ const hash = await hashContent(indexContent);
514
+ const searchContent = JSON.stringify(createDerivedArtifact(buildSearchIndex(nodes), hash));
515
+ const essentialsContent = JSON.stringify(createDerivedArtifact(buildEssentialsIndex(nodes), hash));
516
+ const metadataContent = JSON.stringify({
517
+ lastSync: Date.now(),
518
+ nodeCount: nodes.length,
519
+ hash,
520
+ cacheVersion: CACHE_FORMAT_VERSION
521
+ });
522
+ await writeTempAndRename(fs, searchIndexPath, searchContent);
523
+ await writeTempAndRename(fs, essentialsIndexPath, essentialsContent);
524
+ await writeTempAndRename(fs, indexPath, indexContent);
525
+ await writeTempAndRename(fs, metaPath, metadataContent);
526
+ return nodes.length;
527
+ }
528
+ async function saveNodeIndex(nodes) {
529
+ const fs = getFileSystem();
530
+ const dir = await resolveNodeStorageDir();
531
+ await fs.mkdir(dir);
532
+ const lockPath = fs.path.join(dir, WRITE_LOCK_FILE);
533
+ const releaseLock = await fs.acquireLock(lockPath);
534
+ let result;
535
+ let writeError;
536
+ try {
537
+ result = await writeNodeArtifacts(fs, dir, nodes);
538
+ } catch (error) {
539
+ writeError = error;
540
+ }
541
+ const [releaseError] = await catchError(releaseLock());
542
+ if (writeError)
543
+ throw writeError;
544
+ if (releaseError)
545
+ throw releaseError;
546
+ if (result === undefined) {
547
+ throw new Error("Node index write did not complete.");
548
+ }
549
+ return result;
550
+ }
551
+ async function loadNodeIndex() {
552
+ const fs = getFileSystem();
553
+ const dir = await resolveNodeStorageDir();
554
+ const indexPath = fs.path.join(dir, INDEX_FILE);
555
+ if (!await fs.exists(indexPath)) {
556
+ throw new Error("No node index found. Please run 'uip [flow|maestro] registry pull' to sync nodes first.");
557
+ }
558
+ const metadata = await loadIndexMetadata();
559
+ if (!metadata || metadata.cacheVersion !== CACHE_FORMAT_VERSION) {
560
+ throw new Error("Node index is outdated. Please run 'uip [flow|maestro] registry pull' to sync nodes first.");
561
+ }
562
+ const [error, content] = await catchError(fs.readFile(indexPath, "utf-8"));
563
+ if (error) {
564
+ throw new Error(`Failed to load node index: ${error.message}`);
565
+ }
566
+ if (content === null) {
567
+ throw new Error("No node index found. Please run 'uip [flow|maestro] registry pull' to sync nodes first.");
568
+ }
569
+ const [parseError, parsed] = catchError(() => JSON.parse(content));
570
+ if (parseError) {
571
+ throw new Error(`Failed to load node index: ${parseError.message}`);
572
+ }
573
+ return parsed;
574
+ }
575
+ async function saveIndexMetadata(metadata) {
576
+ const fs = getFileSystem();
577
+ const dir = await resolveNodeStorageDir();
578
+ await fs.mkdir(dir);
579
+ const metaPath = fs.path.join(dir, METADATA_FILE);
580
+ await fs.writeFile(metaPath, JSON.stringify({
581
+ ...metadata,
582
+ cacheVersion: metadata.cacheVersion ?? CACHE_FORMAT_VERSION
583
+ }));
584
+ }
585
+ async function loadIndexMetadata() {
586
+ const fs = getFileSystem();
587
+ const dir = await resolveNodeStorageDir();
588
+ const metaPath = fs.path.join(dir, METADATA_FILE);
589
+ if (!await fs.exists(metaPath)) {
590
+ return null;
591
+ }
592
+ const [error, content] = await catchError(fs.readFile(metaPath, "utf-8"));
593
+ if (error || content === null) {
594
+ return null;
595
+ }
596
+ const [parseError, parsed] = catchError(() => JSON.parse(content));
597
+ if (parseError || parsed === null) {
598
+ return null;
599
+ }
600
+ return normalizeMetadata(parsed);
601
+ }
602
+ function isDerivedArtifact(value) {
603
+ if (typeof value !== "object" || value === null)
604
+ return false;
605
+ const artifact = value;
606
+ return typeof artifact.cacheVersion === "number" && typeof artifact.sourceHash === "string" && typeof artifact.generatedAt === "number" && Array.isArray(artifact.nodes);
607
+ }
608
+ async function loadValidDerivedArtifact(fileName) {
609
+ const fs = getFileSystem();
610
+ const dir = await resolveNodeStorageDir();
611
+ const indexPath = fs.path.join(dir, INDEX_FILE);
612
+ if (!await fs.exists(indexPath)) {
613
+ return null;
614
+ }
615
+ const metadata = await loadIndexMetadata();
616
+ if (!metadata || metadata.cacheVersion !== CACHE_FORMAT_VERSION || typeof metadata.hash !== "string") {
617
+ return null;
618
+ }
619
+ const artifactPath = fs.path.join(dir, fileName);
620
+ const [readError, content] = await catchError(fs.readFile(artifactPath, "utf-8"));
621
+ if (readError || content === null) {
622
+ return null;
623
+ }
624
+ const [parseError, parsed] = catchError(() => JSON.parse(content));
625
+ if (parseError || !isDerivedArtifact(parsed)) {
626
+ return null;
627
+ }
628
+ if (parsed.cacheVersion !== CACHE_FORMAT_VERSION || parsed.sourceHash !== metadata.hash) {
629
+ return null;
630
+ }
631
+ return parsed.nodes;
632
+ }
633
+ async function loadValidSearchIndex() {
634
+ return loadValidDerivedArtifact(SEARCH_INDEX_FILE);
635
+ }
636
+ async function loadValidEssentialsIndex() {
637
+ return loadValidDerivedArtifact(ESSENTIALS_INDEX_FILE);
638
+ }
639
+ async function areDerivedArtifactsCurrent() {
640
+ const searchIndex = await loadValidSearchIndex();
641
+ if (searchIndex === null)
642
+ return false;
643
+ const essentialsIndex = await loadValidEssentialsIndex();
644
+ return essentialsIndex !== null;
645
+ }
646
+ async function rederiveNodeIndexArtifacts() {
647
+ const nodes = await loadNodeIndex();
648
+ return saveNodeIndex(nodes);
649
+ }
650
+
651
+ // ../maestro-sdk/src/registry/solution-discovery.ts
652
+ var EMPTY_IO = {
653
+ inputs: {},
654
+ outputs: {}
655
+ };
656
+ var agentProjectMetadataReader;
657
+ function findEnclosingProjectId(solutionDir, projects, cwd) {
658
+ const fs = getFileSystem();
659
+ for (const p of projects) {
660
+ const projDir = fs.path.resolve(solutionDir, fs.path.dirname(p.ProjectRelativePath));
661
+ if (cwd === projDir)
662
+ return p.Id;
663
+ const rel = fs.path.relative(projDir, cwd);
664
+ if (rel !== "" && !rel.startsWith("..") && !fs.path.isAbsolute(rel)) {
665
+ return p.Id;
666
+ }
667
+ }
668
+ return;
669
+ }
670
+ async function findSolutionFromCwd() {
671
+ const fs = getFileSystem();
672
+ const cwd = fs.env.cwd();
673
+ const dirsToCheck = [
674
+ cwd,
675
+ fs.path.resolve(cwd, ".."),
676
+ fs.path.resolve(cwd, "../..")
677
+ ];
678
+ for (const dir of dirsToCheck) {
679
+ const [readErr, entries] = await catchError(fs.readdir(dir));
680
+ if (readErr)
681
+ continue;
682
+ const uipxName = entries.find((e) => e.endsWith(".uipx"));
683
+ if (!uipxName)
684
+ continue;
685
+ const uipxPath = fs.path.join(dir, uipxName);
686
+ const [fileErr, content] = await catchError(fs.readFile(uipxPath, "utf-8"));
687
+ if (fileErr || !content)
688
+ continue;
689
+ const [parseErr, parsed] = catchError(() => JSON.parse(content));
690
+ if (parseErr || !parsed.SolutionId)
691
+ continue;
692
+ const projects = parsed.Projects ?? [];
693
+ return {
694
+ solutionId: parsed.SolutionId,
695
+ solutionDir: dir,
696
+ projects,
697
+ currentProjectId: findEnclosingProjectId(dir, projects, cwd)
698
+ };
699
+ }
700
+ return null;
701
+ }
702
+ async function readProjectEntryPointIO(projectDir) {
703
+ const fs = getFileSystem();
704
+ const candidates = [
705
+ fs.path.join(projectDir, "entry-points.json"),
706
+ fs.path.join(projectDir, "content", "entry-points.json")
707
+ ];
708
+ for (const filePath of candidates) {
709
+ const [err, content] = await catchError(fs.readFile(filePath, "utf-8"));
710
+ if (err || !content)
711
+ continue;
712
+ const [parseErr, parsed] = catchError(() => JSON.parse(content));
713
+ if (parseErr || !parsed.entryPoints?.length)
714
+ continue;
715
+ return extractIOFromEntryPoints(parsed);
716
+ }
717
+ const fromFlow = await readProjectIOFromFlowVariables(projectDir);
718
+ if (fromFlow)
719
+ return fromFlow;
720
+ return EMPTY_IO;
721
+ }
722
+ async function readProjectIOFromFlowVariables(projectDir) {
723
+ const fs = getFileSystem();
724
+ const [readErr, entries] = await catchError(fs.readdir(projectDir));
725
+ if (readErr || !Array.isArray(entries))
726
+ return;
727
+ const flowFileName = entries.find((entry) => entry.endsWith(".flow"));
728
+ if (!flowFileName)
729
+ return;
730
+ const flowPath = fs.path.join(projectDir, flowFileName);
731
+ const [readFileErr, content] = await catchError(fs.readFile(flowPath, "utf-8"));
732
+ if (readFileErr || !content)
733
+ return;
734
+ const [parseErr, parsed] = catchError(() => JSON.parse(content));
735
+ if (parseErr)
736
+ return;
737
+ const globals = parsed.variables?.globals;
738
+ if (!Array.isArray(globals) || globals.length === 0)
739
+ return;
740
+ const inputProps = {};
741
+ const outputProps = {};
742
+ for (const variable of globals) {
743
+ if (!variable?.id || !variable.direction)
744
+ continue;
745
+ const schema = {
746
+ type: variable.type ?? "string"
747
+ };
748
+ if (variable.description) {
749
+ schema.description = variable.description;
750
+ }
751
+ if (variable.direction === "in" || variable.direction === "inout") {
752
+ inputProps[variable.id] = schema;
753
+ }
754
+ if (variable.direction === "out" || variable.direction === "inout") {
755
+ outputProps[variable.id] = schema;
756
+ }
757
+ }
758
+ const hasInputs = Object.keys(inputProps).length > 0;
759
+ const hasOutputs = Object.keys(outputProps).length > 0;
760
+ if (!hasInputs && !hasOutputs)
761
+ return;
762
+ const synthetic = {
763
+ entryPoints: [
764
+ {
765
+ filePath: flowFileName,
766
+ input: hasInputs ? { type: "object", properties: inputProps } : undefined,
767
+ output: hasOutputs ? { type: "object", properties: outputProps } : undefined
768
+ }
769
+ ]
770
+ };
771
+ return extractIOFromEntryPoints(synthetic);
772
+ }
773
+ async function readProjectName(projectDir) {
774
+ const fs = getFileSystem();
775
+ const uiprojPath = fs.path.join(projectDir, "project.uiproj");
776
+ const [err, content] = await catchError(fs.readFile(uiprojPath, "utf-8"));
777
+ if (!err && content) {
778
+ const [parseErr, parsed] = catchError(() => JSON.parse(content));
779
+ if (!parseErr && parsed.Name)
780
+ return parsed.Name;
781
+ }
782
+ return fs.path.basename(projectDir);
783
+ }
784
+ async function loadResourceKeyMap(solutionDir) {
785
+ const fs = getFileSystem();
786
+ const map = new Map;
787
+ const processDir = fs.path.join(solutionDir, "resources", "solution_folder", "process");
788
+ const [dirErr, typeDirs] = await catchError(fs.readdir(processDir));
789
+ if (dirErr)
790
+ return map;
791
+ for (const typeDir of typeDirs) {
792
+ const typePath = fs.path.join(processDir, typeDir);
793
+ const [filesErr, files] = await catchError(fs.readdir(typePath));
794
+ if (filesErr)
795
+ continue;
796
+ for (const file of files) {
797
+ if (!file.endsWith(".json"))
798
+ continue;
799
+ const filePath = fs.path.join(typePath, file);
800
+ const [readErr, content] = await catchError(fs.readFile(filePath, "utf-8"));
801
+ if (readErr || !content)
802
+ continue;
803
+ const [parseErr, parsed] = catchError(() => JSON.parse(content));
804
+ if (parseErr)
805
+ continue;
806
+ const projectKey = parsed.resource?.projectKey;
807
+ const resourceKey = parsed.resource?.key;
808
+ if (projectKey && resourceKey) {
809
+ map.set(projectKey, resourceKey);
810
+ }
811
+ }
812
+ }
813
+ return map;
814
+ }
815
+ async function buildInSolutionNodeManifests(ctx) {
816
+ const fs = getFileSystem();
817
+ const manifests = [];
818
+ const resourceKeyMap = await loadResourceKeyMap(ctx.solutionDir);
819
+ for (const project of ctx.projects) {
820
+ if (ctx.currentProjectId && project.Id === ctx.currentProjectId)
821
+ continue;
822
+ const serviceType = getServiceType(project.Type);
823
+ if (!serviceType)
824
+ continue;
825
+ const projectDir = fs.path.resolve(ctx.solutionDir, fs.path.dirname(project.ProjectRelativePath));
826
+ const reader = agentProjectMetadataReader;
827
+ const [name, io, projectMetadata] = await Promise.all([
828
+ readProjectName(projectDir),
829
+ readProjectEntryPointIO(projectDir),
830
+ reader ? reader(projectDir, project.Type).catch((err) => {
831
+ logger.debug(`Agent metadata reader failed for ${projectDir}: ${String(err)}`);
832
+ return {};
833
+ }) : Promise.resolve({})
834
+ ]);
835
+ const resourceKey = resourceKeyMap.get(project.Id) ?? project.Id;
836
+ const task = {
837
+ name,
838
+ type: serviceType,
839
+ resourceKey,
840
+ inputs: io.inputs,
841
+ outputs: io.outputs,
842
+ metadata: {
843
+ ...projectMetadata,
844
+ description: `(In-solution) ${name}`,
845
+ key: resourceKey,
846
+ name,
847
+ tags: ["in-solution", "local"],
848
+ projectId: project.Id,
849
+ entryPointUniqueId: io.entryPointUniqueId,
850
+ inputProperties: io.inputProperties
851
+ }
852
+ };
853
+ const nodes = taskDefinitionsToNodeManifests({ [resourceKey]: task }, project.Type);
854
+ manifests.push(...nodes);
855
+ }
856
+ return manifests;
857
+ }
858
+
859
+ // ../maestro-sdk/src/registry/node-sync-service.ts
860
+ var CACHE_EXPIRATION = 30 * 60 * 1000;
861
+ var NODE_EXCLUSIONS = [
862
+ (t) => t.includes("uipath-uipath-dataservice") && /-v3-?$/i.test(t)
863
+ ];
864
+ function isExcludedNodeType(nodeType) {
865
+ return typeof nodeType === "string" && NODE_EXCLUSIONS.some((match) => match(nodeType));
866
+ }
867
+ function isMissingIndexError(error) {
868
+ return error.message.includes("No node index found") || error.message.includes("Node index is outdated");
869
+ }
870
+ async function pullNodes(options = {}) {
871
+ const { force = false } = options;
872
+ if (force) {
873
+ const refreshResult2 = await refreshNodes();
874
+ const meta2 = await loadIndexMetadata();
875
+ return {
876
+ syncedCount: refreshResult2.nodeCount || meta2?.nodeCount || 0,
877
+ fromCache: false,
878
+ source: refreshResult2.source,
879
+ cacheWritten: refreshResult2.cacheWritten,
880
+ info: refreshResult2.info
881
+ };
882
+ }
883
+ const meta = await loadIndexMetadata();
884
+ if (meta) {
885
+ const ageMs = Date.now() - meta.lastSync;
886
+ let needsRefresh = false;
887
+ if (ageMs < CACHE_EXPIRATION) {
888
+ if (!await areDerivedArtifactsCurrent()) {
889
+ const [rederiveError, nodeCount] = await catchError(rederiveNodeIndexArtifacts());
890
+ if (rederiveError) {
891
+ if (!isMissingIndexError(rederiveError)) {
892
+ throw rederiveError;
893
+ }
894
+ needsRefresh = true;
895
+ } else {
896
+ return {
897
+ syncedCount: nodeCount,
898
+ fromCache: true,
899
+ ageMinutes: Math.round(ageMs / 60000)
900
+ };
901
+ }
902
+ }
903
+ if (!needsRefresh) {
904
+ return {
905
+ syncedCount: meta.nodeCount,
906
+ fromCache: true,
907
+ ageMinutes: Math.round(ageMs / 60000)
908
+ };
909
+ }
910
+ }
911
+ }
912
+ const refreshResult = await refreshNodes();
913
+ const refreshedMeta = await loadIndexMetadata();
914
+ return {
915
+ syncedCount: refreshResult.nodeCount || refreshedMeta?.nodeCount || 0,
916
+ fromCache: false,
917
+ source: refreshResult.source,
918
+ cacheWritten: refreshResult.cacheWritten,
919
+ info: refreshResult.info
920
+ };
921
+ }
922
+ async function refreshNodes() {
923
+ const oldMeta = await loadIndexMetadata();
924
+ const pullResult = await pullRemoteNodes();
925
+ const allNodes = pullResult.nodes;
926
+ if (!pullResult.cacheable) {
927
+ return {
928
+ cacheWritten: false,
929
+ nodeCount: allNodes.length,
930
+ source: pullResult.source,
931
+ info: pullResult.info
932
+ };
933
+ }
934
+ const content = JSON.stringify(allNodes);
935
+ const newHash = await hashContent(content);
936
+ if (oldMeta && oldMeta.hash === newHash) {
937
+ if (!await areDerivedArtifactsCurrent()) {
938
+ await saveNodeIndex(allNodes);
939
+ return {
940
+ cacheWritten: true,
941
+ nodeCount: allNodes.length,
942
+ source: pullResult.source
943
+ };
944
+ }
945
+ await saveIndexMetadata({
946
+ lastSync: Date.now(),
947
+ nodeCount: oldMeta.nodeCount,
948
+ hash: oldMeta.hash
949
+ });
950
+ return {
951
+ cacheWritten: true,
952
+ nodeCount: oldMeta.nodeCount,
953
+ source: pullResult.source
954
+ };
955
+ }
956
+ await saveNodeIndex(allNodes);
957
+ return {
958
+ cacheWritten: true,
959
+ nodeCount: allNodes.length,
960
+ source: pullResult.source
961
+ };
962
+ }
963
+ var ENABLED_MANIFEST_FLAGS = new Set([
964
+ MANIFEST_FEATURE_FLAGS.CONNECTOR_NODES,
965
+ MANIFEST_FEATURE_FLAGS.EXTRACT_DOCUMENT,
966
+ MANIFEST_FEATURE_FLAGS.HITL,
967
+ MANIFEST_FEATURE_FLAGS.LOOP_CONTAINER,
968
+ MANIFEST_FEATURE_FLAGS.BATCH_TRANSFORM,
969
+ MANIFEST_FEATURE_FLAGS.SUMMARIZE,
970
+ MANIFEST_FEATURE_FLAGS.CONVERSATION_TRIGGER,
971
+ MANIFEST_FEATURE_FLAGS.CONVERSATIONAL_WAIT_FOR_MESSAGE,
972
+ MANIFEST_FEATURE_FLAGS.CONVERSATIONAL_SEND_MESSAGE,
973
+ MANIFEST_FEATURE_FLAGS.CONVERSATIONAL_GET_CONVERSATION_CONTEXT,
974
+ MANIFEST_FEATURE_FLAGS.CONVERSATIONAL_VOICE_INCOMING_CALL_TRIGGER,
975
+ MANIFEST_FEATURE_FLAGS.CONVERSATIONAL_VOICE_CREATE_OUTGOING_CALL,
976
+ MANIFEST_FEATURE_FLAGS.CONVERSATIONAL_VOICE_END_CALL
977
+ ]);
978
+ async function pullRemoteNodes() {
979
+ const loginStatus = await getLoginStatusAsync();
980
+ const client = new ManifestClient({
981
+ baseUrl: loginStatus.baseUrl || "localhost",
982
+ getFeatureFlag: (flag) => ENABLED_MANIFEST_FLAGS.has(flag)
983
+ });
984
+ if (loginStatus.loginStatus !== "Logged in" || !loginStatus.baseUrl || !loginStatus.accessToken || !loginStatus.tenantId || !loginStatus.organizationId) {
985
+ const manifest2 = await client.getManifest({
986
+ inlineAgentNodes: true
987
+ });
988
+ return {
989
+ nodes: applyExclusions(manifest2.nodes || []),
990
+ source: "ootb",
991
+ cacheable: false,
992
+ info: "Using OOTB nodes because you are not logged in. Cache was not updated."
993
+ };
994
+ }
995
+ const authContext = {
996
+ accessToken: loginStatus.accessToken,
997
+ tenantId: loginStatus.tenantId,
998
+ organizationId: loginStatus.organizationId
999
+ };
1000
+ const [manifestError, manifest] = await catchError(client.getManifest({
1001
+ auth: authContext,
1002
+ includeIntegrationTriggers: true,
1003
+ inlineAgentNodes: true,
1004
+ conversationalAgentNodes: true,
1005
+ excludeIntsvcConnectorHttpRequest: true
1006
+ }));
1007
+ if (!manifestError) {
1008
+ return {
1009
+ nodes: applyExclusions(manifest.nodes || []),
1010
+ source: "authenticated",
1011
+ cacheable: true
1012
+ };
1013
+ }
1014
+ const fallbackManifest = await client.getManifest({
1015
+ inlineAgentNodes: true
1016
+ });
1017
+ return {
1018
+ nodes: applyExclusions(fallbackManifest.nodes || []),
1019
+ source: "ootb",
1020
+ cacheable: false,
1021
+ info: `Failed to refresh authenticated nodes with error: ${manifestError}. Using OOTB nodes without updating cache.`
1022
+ };
1023
+ }
1024
+ function applyExclusions(nodes) {
1025
+ return nodes.filter((n) => !isExcludedNodeType(n.nodeType));
1026
+ }
1027
+ async function getNodesWithCacheFallback() {
1028
+ const [error, nodes] = await catchError(loadNodeIndex());
1029
+ if (error) {
1030
+ if (!isMissingIndexError(error)) {
1031
+ throw error;
1032
+ }
1033
+ const pullResult = await pullRemoteNodes();
1034
+ if (pullResult.cacheable) {
1035
+ await saveNodeIndex(pullResult.nodes);
1036
+ }
1037
+ return pullResult.nodes;
1038
+ }
1039
+ return nodes;
1040
+ }
1041
+ async function getLocalSolutionNodes() {
1042
+ const ctx = await findSolutionFromCwd();
1043
+ if (!ctx) {
1044
+ throw new Error("No .uipx solution file found in current directory, its parent, or its grandparent. " + "Run this command from inside a solution project directory.");
1045
+ }
1046
+ return buildInSolutionNodeManifests(ctx);
1047
+ }
1048
+ async function listNodes(options) {
1049
+ if (options?.local)
1050
+ return getLocalSolutionNodes();
1051
+ const precacheEntries = await listPrecacheEntries();
1052
+ const registryCacheNodes = await getNodesWithCacheFallback();
1053
+ if (precacheEntries.length === 0)
1054
+ return registryCacheNodes;
1055
+ const byType = new Map;
1056
+ for (const entry of precacheEntries) {
1057
+ const key = entry.nodeType.toLowerCase();
1058
+ const bucket = byType.get(key) ?? [];
1059
+ bucket.push(entry);
1060
+ byType.set(key, bucket);
1061
+ }
1062
+ const uniquePrecache = [];
1063
+ for (const [, entries] of byType) {
1064
+ if (entries.length !== 1)
1065
+ continue;
1066
+ uniquePrecache.push(entries[0]);
1067
+ }
1068
+ const precacheTypes = new Set(uniquePrecache.map((e) => e.nodeType.toLowerCase()));
1069
+ const merged = registryCacheNodes.filter((n) => typeof n.nodeType !== "string" || !precacheTypes.has(n.nodeType.toLowerCase()));
1070
+ for (const entry of uniquePrecache) {
1071
+ merged.push({
1072
+ nodeType: entry.nodeType,
1073
+ version: entry.version,
1074
+ category: "connector",
1075
+ tags: ["connector"],
1076
+ display: { label: entry.label }
1077
+ });
1078
+ }
1079
+ return merged;
1080
+ }
1081
+ function unionWithKnownSdkNodes(tenantNodes) {
1082
+ const seen = new Set;
1083
+ const result = [];
1084
+ for (const node of tenantNodes) {
1085
+ const type = typeof node.nodeType === "string" ? node.nodeType.toLowerCase() : null;
1086
+ if (type !== null) {
1087
+ if (seen.has(type))
1088
+ continue;
1089
+ seen.add(type);
1090
+ }
1091
+ result.push(node);
1092
+ }
1093
+ for (const known of listKnownSdkNodes()) {
1094
+ const type = typeof known.nodeType === "string" ? known.nodeType.toLowerCase() : null;
1095
+ if (type === null || seen.has(type))
1096
+ continue;
1097
+ seen.add(type);
1098
+ result.push(known);
1099
+ }
1100
+ return result;
1101
+ }
1102
+ async function loadSearchSummariesWithCacheFallback() {
1103
+ const validSearchIndex = await loadValidSearchIndex();
1104
+ if (validSearchIndex)
1105
+ return validSearchIndex;
1106
+ const [repairError] = await catchError(rederiveNodeIndexArtifacts());
1107
+ if (!repairError) {
1108
+ const repairedSearchIndex = await loadValidSearchIndex();
1109
+ if (repairedSearchIndex)
1110
+ return repairedSearchIndex;
1111
+ }
1112
+ return buildSearchIndex(await getNodesWithCacheFallback());
1113
+ }
1114
+ async function loadEssentialsIndexWithRepair() {
1115
+ const validEssentialsIndex = await loadValidEssentialsIndex();
1116
+ if (validEssentialsIndex)
1117
+ return validEssentialsIndex;
1118
+ const [repairError] = await catchError(rederiveNodeIndexArtifacts());
1119
+ if (repairError)
1120
+ return null;
1121
+ return loadValidEssentialsIndex();
1122
+ }
1123
+ async function searchNodeSummariesWithAvailability(keyword, filters) {
1124
+ const tenantNodes = await loadSearchSummariesWithCacheFallback();
1125
+ const tenantTypes = new Set(tenantNodes.map((node) => node.nodeType?.toLowerCase()).filter((type) => typeof type === "string"));
1126
+ const merged = tenantNodes.map((node) => ({
1127
+ node,
1128
+ availableOnTenant: true
1129
+ }));
1130
+ for (const knownNode of listKnownSdkNodes()) {
1131
+ const type = knownNode.nodeType?.toLowerCase();
1132
+ if (typeof type !== "string" || tenantTypes.has(type))
1133
+ continue;
1134
+ tenantTypes.add(type);
1135
+ merged.push({
1136
+ node: buildSearchIndex([knownNode])[0],
1137
+ availableOnTenant: false
1138
+ });
1139
+ }
1140
+ const availabilityByType = new Map(merged.map((entry) => typeof entry.node.nodeType === "string" ? [
1141
+ entry.node.nodeType.toLowerCase(),
1142
+ entry.availableOnTenant
1143
+ ] : null).filter((entry) => entry !== null));
1144
+ return searchWithFilters(merged.map((entry) => entry.node), keyword, filters).map((node) => ({
1145
+ node,
1146
+ availableOnTenant: typeof node.nodeType === "string" ? availabilityByType.get(node.nodeType.toLowerCase()) ?? true : true
1147
+ }));
1148
+ }
1149
+ async function searchNodes(keyword, options) {
1150
+ let nodes;
1151
+ if (options?.local) {
1152
+ nodes = await getLocalSolutionNodes();
1153
+ } else {
1154
+ const tenantNodes = await getNodesWithCacheFallback();
1155
+ nodes = unionWithKnownSdkNodes(tenantNodes);
1156
+ }
1157
+ const lowerKeyword = keyword.toLowerCase();
1158
+ return nodes.filter((node) => {
1159
+ if (node.nodeType?.toLowerCase().includes(lowerKeyword)) {
1160
+ return true;
1161
+ }
1162
+ if (node.category?.toLowerCase().includes(lowerKeyword)) {
1163
+ return true;
1164
+ }
1165
+ if (node.tags?.some((tag) => tag.toLowerCase().includes(lowerKeyword))) {
1166
+ return true;
1167
+ }
1168
+ if (node.display?.label?.toLowerCase().includes(lowerKeyword)) {
1169
+ return true;
1170
+ }
1171
+ if (node.description?.toLowerCase().includes(lowerKeyword)) {
1172
+ return true;
1173
+ }
1174
+ if (node.display?.description?.toLowerCase().includes(lowerKeyword)) {
1175
+ return true;
1176
+ }
1177
+ return false;
1178
+ });
1179
+ }
1180
+ async function getNode(nodeType, options) {
1181
+ const lowerNodeType = nodeType.toLowerCase();
1182
+ if (!options?.local && lowerNodeType.startsWith("uipath.connector.")) {
1183
+ const precached = await getPrecacheNode(nodeType);
1184
+ if (precached)
1185
+ return precached;
1186
+ }
1187
+ if (!options?.local && isEssentialNodeType(nodeType)) {
1188
+ const essentials = await loadEssentialsIndexWithRepair();
1189
+ const node2 = essentials?.find((node3) => node3.nodeType?.toLowerCase() === lowerNodeType) ?? null;
1190
+ if (node2)
1191
+ return node2;
1192
+ }
1193
+ const nodes = options?.local ? await getLocalSolutionNodes() : await getNodesWithCacheFallback();
1194
+ const node = nodes.find((node2) => node2.nodeType?.toLowerCase() === lowerNodeType) ?? null;
1195
+ return node;
1196
+ }
1197
+ async function getNodeEnriched(nodeType, connectionId, options) {
1198
+ const node = await getNode(nodeType, options);
1199
+ if (!node) {
1200
+ return null;
1201
+ }
1202
+ return await enrichConnectorNode(node, connectionId);
1203
+ }
1204
+ async function searchNodesWithFilters(keyword, filters, options) {
1205
+ let nodes;
1206
+ if (options?.local) {
1207
+ nodes = await getLocalSolutionNodes();
1208
+ } else {
1209
+ const tenantNodes = await getNodesWithCacheFallback();
1210
+ nodes = unionWithKnownSdkNodes(tenantNodes);
1211
+ }
1212
+ return searchWithFilters(nodes, keyword, filters);
1213
+ }
1214
+
1215
+ export { extractTriggerEventParameters, extractTriggerFilterFields, extractActivityFilterFields, fetchConnectorTriggerMetadata, fetchConnectionInfo, fetchConnectorMetadata, findSolutionFromCwd, isExcludedNodeType, pullNodes, pullRemoteNodes, listNodes, searchNodeSummariesWithAvailability, searchNodes, getNode, getNodeEnriched, searchNodesWithFilters };
1216
+
1217
+ //# debugId=1F22B346AB51E6F164756E2164756E21