@uipath/tasks-tool 1.202.0-preview.141 → 1.202.0-preview.142

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 (41) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/{tool-23m8gpxb.js → tool-315h4wtj.js} +5 -2
  3. package/dist/tool.js +1 -1
  4. package/package.json +5 -2
  5. package/browser.json +0 -4
  6. package/src/commands/_shared/catalog-options.spec.ts +0 -114
  7. package/src/commands/_shared/catalog-options.ts +0 -122
  8. package/src/commands/_shared/connect.spec.ts +0 -52
  9. package/src/commands/_shared/connect.ts +0 -31
  10. package/src/commands/_shared/constants.ts +0 -1
  11. package/src/commands/_shared/folder-picker-interactive.spec.ts +0 -92
  12. package/src/commands/_shared/folder-picker-interactive.ts +0 -76
  13. package/src/commands/_shared/folder-picker.spec.ts +0 -159
  14. package/src/commands/_shared/folder-picker.ts +0 -113
  15. package/src/commands/_shared/folder-resolver.spec.ts +0 -152
  16. package/src/commands/_shared/folder-resolver.ts +0 -113
  17. package/src/commands/_shared/parse.spec.ts +0 -69
  18. package/src/commands/_shared/parse.ts +0 -43
  19. package/src/commands/catalogs.ts +0 -281
  20. package/src/commands/comments.ts +0 -160
  21. package/src/commands/data.ts +0 -137
  22. package/src/commands/labels.ts +0 -93
  23. package/src/commands/metadata.ts +0 -139
  24. package/src/commands/tasks.spec.ts +0 -2449
  25. package/src/commands/tasks.ts +0 -631
  26. package/src/index.ts +0 -12
  27. package/src/tool.ts +0 -24
  28. package/src/utils/sdk-client.ts +0 -30
  29. package/tests/assign.e2e.test.ts +0 -166
  30. package/tests/assignable-users.e2e.test.ts +0 -167
  31. package/tests/catalogs.e2e.test.ts +0 -418
  32. package/tests/comments.e2e.test.ts +0 -223
  33. package/tests/complete.e2e.test.ts +0 -207
  34. package/tests/data.e2e.test.ts +0 -187
  35. package/tests/get.e2e.test.ts +0 -103
  36. package/tests/labels.e2e.test.ts +0 -184
  37. package/tests/list.e2e.test.ts +0 -234
  38. package/tests/metadata.e2e.test.ts +0 -186
  39. package/tests/performance.e2e.test.ts +0 -32
  40. package/tsconfig.json +0 -9
  41. package/vitest.config.ts +0 -1
@@ -1,631 +0,0 @@
1
- import {
2
- type CommandExample,
3
- catchError,
4
- createHiddenDeprecatedTenantOption,
5
- extractErrorMessage,
6
- extractErrorMessageSync,
7
- OutputFormatter,
8
- processContext,
9
- RESULTS,
10
- } from "@uipath/common";
11
- import type { TaskCompletionOptions } from "@uipath/uipath-typescript";
12
- import { type Command, Option } from "commander";
13
-
14
- import { connectTasksClient } from "./_shared/connect";
15
- import { DEFAULT_PAGE_SIZE } from "./_shared/constants";
16
- import {
17
- addFolderScopeOptions,
18
- type FolderScopeOptions,
19
- resolveFolderId,
20
- resolveFolderScope,
21
- } from "./_shared/folder-picker";
22
- import { parseIntArg } from "./_shared/parse";
23
-
24
- const VALID_TASK_TYPES = [
25
- "FormTask",
26
- "ExternalTask",
27
- "AppTask",
28
- "DocumentValidationTask",
29
- "DocumentClassificationTask",
30
- "DataLabelingTask",
31
- "QuickFormTask",
32
- ] as const;
33
- type ValidTaskType = (typeof VALID_TASK_TYPES)[number];
34
-
35
- interface ListOptions extends FolderScopeOptions {
36
- asAdmin?: boolean;
37
- limit?: string;
38
- }
39
-
40
- interface GetOptions extends FolderScopeOptions {
41
- taskType?: string;
42
- }
43
-
44
- interface AssignOptions {
45
- tenant?: string;
46
- userId?: string;
47
- user?: string;
48
- }
49
-
50
- interface CompleteOptions extends FolderScopeOptions {
51
- type: string;
52
- data?: string;
53
- action?: string;
54
- }
55
-
56
- interface UsersOptions extends FolderScopeOptions {
57
- limit?: string;
58
- }
59
-
60
- const TASKS_USERS_EXAMPLES: CommandExample[] = [
61
- {
62
- Description: "List users with task permissions in a folder",
63
- Command: "uip tasks users 42",
64
- Output: {
65
- Code: "TaskUserList",
66
- Data: [
67
- {
68
- id: 1,
69
- name: "Alice",
70
- surname: "Smith",
71
- userName: "alice",
72
- emailAddress: "alice@company.com",
73
- displayName: "Alice Smith",
74
- },
75
- {
76
- id: 2,
77
- name: "Bob",
78
- surname: "Jones",
79
- userName: "bob",
80
- emailAddress: "bob@company.com",
81
- displayName: "Bob Jones",
82
- },
83
- ],
84
- },
85
- },
86
- {
87
- Description: "Limit the number of users returned",
88
- Command: "uip tasks users 42 --limit 10",
89
- Output: {
90
- Code: "TaskUserList",
91
- Data: [
92
- {
93
- id: 1,
94
- name: "Alice",
95
- surname: "Smith",
96
- userName: "alice",
97
- emailAddress: "alice@company.com",
98
- displayName: "Alice Smith",
99
- },
100
- ],
101
- },
102
- },
103
- {
104
- Description:
105
- "List users by folder path instead of the numeric folder ID",
106
- Command: 'uip tasks users --folder-path "Shared/Finance"',
107
- Output: {
108
- Code: "TaskUserList",
109
- Data: [
110
- {
111
- id: 1,
112
- name: "Alice",
113
- surname: "Smith",
114
- userName: "alice",
115
- emailAddress: "alice@company.com",
116
- displayName: "Alice Smith",
117
- },
118
- ],
119
- },
120
- },
121
- ];
122
-
123
- export const registerTasksCommand = (program: Command) => {
124
- addFolderScopeOptions(
125
- program
126
- .command("list")
127
- .description("List tasks across folders")
128
- .addOption(
129
- createHiddenDeprecatedTenantOption(
130
- "-t, --tenant <tenant-name>",
131
- ),
132
- ),
133
- "Filter by folder ID",
134
- )
135
- .option("--as-admin", "List tasks as admin")
136
- .option(
137
- "-l, --limit <number>",
138
- "Maximum number of items to return (fetches all if omitted)",
139
- )
140
- .trackedAction(processContext, async (options: ListOptions) => {
141
- const sdk = await connectTasksClient(options.tenant);
142
- if (!sdk) return;
143
-
144
- let limit: number | undefined;
145
- if (options.limit) {
146
- const parsed = parseIntArg(options.limit, "--limit");
147
- if (parsed === null) return;
148
- limit = parsed;
149
- }
150
-
151
- const folderId = await resolveFolderScope(options);
152
- if (folderId === null) return;
153
-
154
- const allItems: unknown[] = [];
155
- let cursor: { value: string } | undefined;
156
-
157
- do {
158
- const getOptions: Record<string, unknown> = {
159
- pageSize: DEFAULT_PAGE_SIZE,
160
- };
161
- if (folderId !== undefined) {
162
- getOptions.folderId = folderId;
163
- }
164
- if (options.asAdmin) {
165
- getOptions.asTaskAdmin = true;
166
- }
167
- if (cursor) {
168
- getOptions.cursor = cursor;
169
- }
170
-
171
- const [listError, result] = await catchError(
172
- sdk.tasks.getAll(getOptions),
173
- );
174
-
175
- if (listError) {
176
- OutputFormatter.error({
177
- Result: RESULTS.Failure,
178
- Message: "Error listing tasks",
179
- Instructions: await extractErrorMessage(listError),
180
- });
181
- processContext.exit(1);
182
- return;
183
- }
184
-
185
- if (Array.isArray(result)) {
186
- allItems.push(...result);
187
- break;
188
- }
189
-
190
- const page = result as unknown as Record<string, unknown>;
191
- const items = (page.items ?? []) as unknown[];
192
- allItems.push(...items);
193
-
194
- cursor = page.hasNextPage
195
- ? (page.nextCursor as { value: string })
196
- : undefined;
197
-
198
- if (limit && allItems.length >= limit) {
199
- break;
200
- }
201
- } while (cursor);
202
-
203
- const data = limit ? allItems.slice(0, limit) : allItems;
204
-
205
- OutputFormatter.success({
206
- Result: RESULTS.Success,
207
- Code: "TaskList",
208
- Data: data,
209
- });
210
- });
211
-
212
- addFolderScopeOptions(
213
- program
214
- .command("get")
215
- .description(
216
- "Get details of a task by ID. Use 'tasks list' to find task IDs.",
217
- )
218
- .argument("<id>", "Task ID")
219
- .addOption(
220
- createHiddenDeprecatedTenantOption(
221
- "-t, --tenant <tenant-name>",
222
- ),
223
- )
224
- .option(
225
- "--task-type <type>",
226
- "Task type (FormTask, ExternalTask, AppTask, DocumentValidationTask, DocumentClassificationTask, DataLabelingTask, QuickFormTask)",
227
- ),
228
- "Folder ID (a folder is required when task-type is specified)",
229
- ).trackedAction(processContext, async (id: string, options: GetOptions) => {
230
- const sdk = await connectTasksClient(options.tenant);
231
- if (!sdk) return;
232
-
233
- const parsedId = parseIntArg(id, "<id>");
234
- if (parsedId === null) return;
235
-
236
- const hasFolderScope =
237
- options.folderId !== undefined ||
238
- options.folderPath !== undefined ||
239
- options.folderKey !== undefined;
240
- if (options.taskType && !hasFolderScope) {
241
- OutputFormatter.error({
242
- Result: RESULTS.Failure,
243
- Message: "A folder is required when --task-type is specified",
244
- Instructions:
245
- "Pass --folder-id <id>, --folder-path <path>, or --folder-key <key>.",
246
- });
247
- processContext.exit(1);
248
- return;
249
- }
250
-
251
- const getOptions: Record<string, unknown> = {};
252
- if (options.taskType) {
253
- getOptions.taskType = options.taskType;
254
- }
255
- const folderId = await resolveFolderScope(options);
256
- if (folderId === null) return;
257
-
258
- const [getError, task] = await catchError(
259
- sdk.tasks.getById(parsedId, getOptions, folderId),
260
- );
261
-
262
- if (getError) {
263
- OutputFormatter.error({
264
- Result: RESULTS.Failure,
265
- Message: `Error getting task '${id}'`,
266
- Instructions: await extractErrorMessage(getError),
267
- });
268
- processContext.exit(1);
269
- return;
270
- }
271
-
272
- OutputFormatter.success({
273
- Result: RESULTS.Success,
274
- Code: "TaskDetails",
275
- Data: task,
276
- });
277
- });
278
-
279
- program
280
- .command("assign")
281
- .description("Assign a task to a user")
282
- .argument("<task-id>", "Task ID")
283
- .addOption(
284
- createHiddenDeprecatedTenantOption("-t, --tenant <tenant-name>"),
285
- )
286
- .option("--user-id <id>", "User ID")
287
- .option(
288
- "--user <email>",
289
- "User name or email (alternative to --user-id)",
290
- )
291
- .trackedAction(
292
- processContext,
293
- async (taskId: string, options: AssignOptions) => {
294
- await assignOrReassign(taskId, options, "assign");
295
- },
296
- );
297
-
298
- program
299
- .command("reassign")
300
- .description("Reassign a task to a different user")
301
- .argument("<task-id>", "Task ID")
302
- .addOption(
303
- createHiddenDeprecatedTenantOption("-t, --tenant <tenant-name>"),
304
- )
305
- .option("--user-id <id>", "User ID")
306
- .option(
307
- "--user <email>",
308
- "User name or email (alternative to --user-id)",
309
- )
310
- .trackedAction(
311
- processContext,
312
- async (taskId: string, options: AssignOptions) => {
313
- await assignOrReassign(taskId, options, "reassign");
314
- },
315
- );
316
-
317
- program
318
- .command("unassign")
319
- .description("Remove the assignee from a task")
320
- .argument("<task-id>", "Task ID")
321
- .addOption(
322
- createHiddenDeprecatedTenantOption("-t, --tenant <tenant-name>"),
323
- )
324
- .trackedAction(
325
- processContext,
326
- async (taskId: string, options: { tenant?: string }) => {
327
- const sdk = await connectTasksClient(options.tenant);
328
- if (!sdk) return;
329
-
330
- const parsedId = parseIntArg(taskId, "<task-id>");
331
- if (parsedId === null) return;
332
-
333
- const [unassignError, result] = await catchError(
334
- sdk.tasks.unassign(parsedId),
335
- );
336
-
337
- if (unassignError) {
338
- OutputFormatter.error({
339
- Result: RESULTS.Failure,
340
- Message: `Error unassigning task '${taskId}'`,
341
- Instructions: await extractErrorMessage(unassignError),
342
- });
343
- processContext.exit(1);
344
- return;
345
- }
346
-
347
- OutputFormatter.success({
348
- Result: RESULTS.Success,
349
- Code: "TaskUnassigned",
350
- Data: result,
351
- });
352
- },
353
- );
354
-
355
- addFolderScopeOptions(
356
- program
357
- .command("complete")
358
- .description("Complete a task with an action and optional data")
359
- .argument("<task-id>", "Task ID")
360
- .requiredOption(
361
- "--type <type>",
362
- "Task type (FormTask, ExternalTask, AppTask, DocumentValidationTask, DocumentClassificationTask, DataLabelingTask, QuickFormTask)",
363
- )
364
- .addOption(
365
- createHiddenDeprecatedTenantOption(
366
- "-t, --tenant <tenant-name>",
367
- ),
368
- ),
369
- )
370
- .option("--data <json>", "Task data as JSON string")
371
- .option(
372
- "--action <action>",
373
- "Action name (required for FormTask and AppTask)",
374
- )
375
- .trackedAction(
376
- processContext,
377
- async (taskId: string, options: CompleteOptions) => {
378
- const sdk = await connectTasksClient(options.tenant);
379
- if (!sdk) return;
380
-
381
- const parsedTaskId = parseIntArg(taskId, "<task-id>");
382
- if (parsedTaskId === null) return;
383
-
384
- if (!VALID_TASK_TYPES.includes(options.type as ValidTaskType)) {
385
- OutputFormatter.error({
386
- Result: RESULTS.Failure,
387
- Message: `Invalid task type '${options.type}'`,
388
- Instructions: `Valid types: ${VALID_TASK_TYPES.join(", ")}`,
389
- });
390
- processContext.exit(1);
391
- return;
392
- }
393
-
394
- const folderId = await resolveFolderId(options);
395
- if (folderId === null) return;
396
-
397
- const completionOptions: Record<string, unknown> = {
398
- taskId: parsedTaskId,
399
- type: options.type,
400
- };
401
-
402
- if (options.action) {
403
- completionOptions.action = options.action;
404
- }
405
-
406
- if (options.data) {
407
- const [parseError, parsed] = await catchError(
408
- Promise.resolve().then(
409
- () => JSON.parse(options.data as string) as unknown,
410
- ),
411
- );
412
- if (parseError) {
413
- OutputFormatter.error({
414
- Result: RESULTS.Failure,
415
- Message: "Invalid JSON in --data",
416
- Instructions: extractErrorMessageSync(parseError),
417
- });
418
- processContext.exit(1);
419
- return;
420
- }
421
- completionOptions.data = parsed;
422
- }
423
-
424
- // CLI receives type as a raw string; SDK expects a TaskType enum discriminated union.
425
- const [completeError, result] = await catchError(
426
- sdk.tasks.complete(
427
- completionOptions as unknown as TaskCompletionOptions,
428
- folderId,
429
- ),
430
- );
431
-
432
- if (completeError) {
433
- OutputFormatter.error({
434
- Result: RESULTS.Failure,
435
- Message: `Error completing task '${taskId}'`,
436
- Instructions: await extractErrorMessage(completeError),
437
- });
438
- processContext.exit(1);
439
- return;
440
- }
441
-
442
- OutputFormatter.success({
443
- Result: RESULTS.Success,
444
- Code: "TaskCompleted",
445
- Data: result,
446
- });
447
- },
448
- );
449
-
450
- program
451
- .command("users")
452
- .description(
453
- "List users with task permissions in a folder. Use the user ID with 'tasks assign'.",
454
- )
455
- .argument(
456
- "[folder-id]",
457
- "Folder ID (alternatively pass --folder-path or --folder-key)",
458
- )
459
- .addOption(
460
- createHiddenDeprecatedTenantOption("-t, --tenant <tenant-name>"),
461
- )
462
- .addOption(
463
- new Option(
464
- "--folder-path <path>",
465
- "Folder path (alternative to the folder-id argument)",
466
- ).conflicts("folderKey"),
467
- )
468
- .addOption(
469
- new Option(
470
- "--folder-key <key>",
471
- "Folder key (alternative to the folder-id argument)",
472
- ),
473
- )
474
- .option(
475
- "-l, --limit <number>",
476
- "Maximum number of items to return (fetches all if omitted)",
477
- )
478
- .examples(TASKS_USERS_EXAMPLES)
479
- .trackedAction(
480
- processContext,
481
- async (folderId: string | undefined, options: UsersOptions) => {
482
- const sdk = await connectTasksClient(options.tenant);
483
- if (!sdk) return;
484
-
485
- if (
486
- folderId !== undefined &&
487
- (options.folderPath !== undefined ||
488
- options.folderKey !== undefined)
489
- ) {
490
- OutputFormatter.error({
491
- Result: RESULTS.Failure,
492
- Message:
493
- "The folder-id argument cannot be used with --folder-path or --folder-key",
494
- Instructions:
495
- "Pass the folder as a numeric argument, or as --folder-path/--folder-key, not both.",
496
- });
497
- processContext.exit(1);
498
- return;
499
- }
500
-
501
- const parsedFolderId =
502
- folderId !== undefined
503
- ? parseIntArg(folderId, "<folder-id>")
504
- : await resolveFolderId(
505
- options,
506
- "Pass the folder-id argument, --folder-path <path>, or --folder-key <key> (run 'uip or folders list' to find one).",
507
- );
508
- if (parsedFolderId === null) return;
509
-
510
- let limit: number | undefined;
511
- if (options.limit) {
512
- const parsed = parseIntArg(options.limit, "--limit");
513
- if (parsed === null) return;
514
- limit = parsed;
515
- }
516
-
517
- const allItems: unknown[] = [];
518
- let cursor: { value: string } | undefined;
519
-
520
- do {
521
- const getOptions: Record<string, unknown> = {
522
- pageSize: DEFAULT_PAGE_SIZE,
523
- };
524
- if (cursor) {
525
- getOptions.cursor = cursor;
526
- }
527
-
528
- const [usersError, result] = await catchError(
529
- sdk.tasks.getUsers(parsedFolderId, getOptions),
530
- );
531
-
532
- if (usersError) {
533
- OutputFormatter.error({
534
- Result: RESULTS.Failure,
535
- Message: "Error listing task users",
536
- Instructions: await extractErrorMessage(usersError),
537
- });
538
- processContext.exit(1);
539
- return;
540
- }
541
-
542
- if (Array.isArray(result)) {
543
- allItems.push(...result);
544
- break;
545
- }
546
-
547
- const page = result as unknown as Record<string, unknown>;
548
- const items = (page.items ?? []) as unknown[];
549
- allItems.push(...items);
550
-
551
- cursor = page.hasNextPage
552
- ? (page.nextCursor as { value: string })
553
- : undefined;
554
-
555
- if (limit && allItems.length >= limit) {
556
- break;
557
- }
558
- } while (cursor);
559
-
560
- const data = limit ? allItems.slice(0, limit) : allItems;
561
-
562
- OutputFormatter.success({
563
- Result: RESULTS.Success,
564
- Code: "TaskUserList",
565
- Data: data,
566
- });
567
- },
568
- );
569
- };
570
-
571
- async function assignOrReassign(
572
- taskId: string,
573
- options: AssignOptions,
574
- action: "assign" | "reassign",
575
- ): Promise<void> {
576
- if (!options.userId && !options.user) {
577
- OutputFormatter.error({
578
- Result: RESULTS.Failure,
579
- Message: "Missing assignee",
580
- Instructions:
581
- action === "assign"
582
- ? "Provide either --user-id or --user to specify the assignee."
583
- : "Provide either --user-id or --user to specify the new assignee.",
584
- });
585
- processContext.exit(1);
586
- return;
587
- }
588
-
589
- const sdk = await connectTasksClient(options.tenant);
590
- if (!sdk) return;
591
-
592
- const parsedTaskId = parseIntArg(taskId, "<task-id>");
593
- if (parsedTaskId === null) return;
594
-
595
- const assignment: Record<string, unknown> = {
596
- taskId: parsedTaskId,
597
- };
598
- if (options.userId) {
599
- const parsedUserId = parseIntArg(options.userId, "--user-id");
600
- if (parsedUserId === null) return;
601
- assignment.userId = parsedUserId;
602
- } else {
603
- assignment.userNameOrEmail = options.user;
604
- }
605
-
606
- type TaskAssignment =
607
- | { taskId: number; userId: number }
608
- | { taskId: number; userNameOrEmail: string };
609
-
610
- const [error, result] = await catchError(
611
- action === "assign"
612
- ? sdk.tasks.assign(assignment as TaskAssignment)
613
- : sdk.tasks.reassign(assignment as TaskAssignment),
614
- );
615
-
616
- if (error) {
617
- OutputFormatter.error({
618
- Result: RESULTS.Failure,
619
- Message: `Error ${action === "assign" ? "assigning" : "reassigning"} task '${taskId}'`,
620
- Instructions: await extractErrorMessage(error),
621
- });
622
- processContext.exit(1);
623
- return;
624
- }
625
-
626
- OutputFormatter.success({
627
- Result: RESULTS.Success,
628
- Code: action === "assign" ? "TaskAssigned" : "TaskReassigned",
629
- Data: result,
630
- });
631
- }
package/src/index.ts DELETED
@@ -1,12 +0,0 @@
1
- #!/usr/bin/env bun
2
- import { Command } from "commander";
3
- import { metadata, registerCommands } from "./tool.js";
4
-
5
- const program = new Command();
6
- program
7
- .name(metadata.name)
8
- .description(metadata.description)
9
- .version(metadata.version);
10
-
11
- await registerCommands(program);
12
- await program.parseAsync(process.argv);
package/src/tool.ts DELETED
@@ -1,24 +0,0 @@
1
- import type { Command } from "commander";
2
- import pkg from "../package.json" with { type: "json" };
3
- import { registerCatalogsCommand } from "./commands/catalogs";
4
- import { registerCommentsCommand } from "./commands/comments";
5
- import { registerDataCommand } from "./commands/data";
6
- import { registerLabelsCommand } from "./commands/labels";
7
- import { registerMetadataCommand } from "./commands/metadata";
8
- import { registerTasksCommand } from "./commands/tasks";
9
-
10
- export const metadata = {
11
- name: "tasks-tool",
12
- version: pkg.version,
13
- description: "Manage Action Center tasks.",
14
- commandPrefix: "tasks",
15
- };
16
-
17
- export const registerCommands = async (program: Command): Promise<void> => {
18
- registerTasksCommand(program);
19
- registerCatalogsCommand(program);
20
- registerCommentsCommand(program);
21
- registerLabelsCommand(program);
22
- registerMetadataCommand(program);
23
- registerDataCommand(program);
24
- };
@@ -1,30 +0,0 @@
1
- import { getLoginStatusAsync } from "@uipath/auth";
2
- import { UiPath } from "@uipath/uipath-typescript";
3
- import { TaskCatalogs } from "@uipath/uipath-typescript/tasks";
4
-
5
- export const createTasksClient = async (
6
- tenantOverride?: string,
7
- ): Promise<UiPath> => {
8
- const status = await getLoginStatusAsync({
9
- ensureTokenValidityMinutes: 10,
10
- });
11
-
12
- if (
13
- status.loginStatus !== "Logged in" ||
14
- !status.accessToken ||
15
- !status.baseUrl
16
- ) {
17
- throw new Error(status.hint ?? "Not logged in. Run 'uip login' first.");
18
- }
19
-
20
- return new UiPath({
21
- secret: status.accessToken,
22
- baseUrl: status.baseUrl,
23
- orgName: status.organizationName,
24
- tenantName: tenantOverride ?? status.tenantName,
25
- });
26
- };
27
-
28
- // Task catalogs live on their own service in the SDK, not on `sdk.tasks`.
29
- export const createTaskCatalogsClient = (sdk: UiPath): TaskCatalogs =>
30
- new TaskCatalogs(sdk);