@uipath/test-manager-tool 1.203.0-preview.212 → 1.204.0-preview.211

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.
@@ -11180,7 +11180,7 @@ var package_default = {
11180
11180
  name: "@uipath/test-manager-tool",
11181
11181
  author: "UiPath",
11182
11182
  license: "SEE LICENSE IN LICENSE.txt",
11183
- version: "1.203.0-preview.212",
11183
+ version: "1.204.0-preview.211",
11184
11184
  description: "Manage test cases, test sets, executions, and results.",
11185
11185
  private: false,
11186
11186
  repository: {
@@ -11994,9 +11994,60 @@ function settlePromiseLike(thenable) {
11994
11994
  return Promise.resolve(thenable).then((data) => [undefined, data]).catch((error) => [toError(error), undefined]);
11995
11995
  }
11996
11996
 
11997
+ // ../common/src/error-graph.ts
11998
+ function* walkErrorGraph(error) {
11999
+ const queue = [error];
12000
+ const seen = new Set;
12001
+ for (let steps = 0;queue.length > 0 && steps < 32; steps++) {
12002
+ const current = queue.shift();
12003
+ if (current === null || typeof current !== "object")
12004
+ continue;
12005
+ if (seen.has(current))
12006
+ continue;
12007
+ seen.add(current);
12008
+ const cur = current;
12009
+ yield cur;
12010
+ if (cur.cause !== undefined)
12011
+ queue.push(cur.cause);
12012
+ if (Array.isArray(cur.errors))
12013
+ queue.push(...cur.errors);
12014
+ }
12015
+ return;
12016
+ }
12017
+ function parseHttpStatusFromMessage(message) {
12018
+ const match = /^HTTP\s+(\d{3})(?::|\s|-|$)/i.exec(message.trim());
12019
+ if (!match)
12020
+ return;
12021
+ const status = Number(match[1]);
12022
+ return Number.isInteger(status) && status >= 100 && status <= 599 ? status : undefined;
12023
+ }
12024
+ function findHttpStatusInGraph(error) {
12025
+ for (const node of walkErrorGraph(error)) {
12026
+ const response = node.response;
12027
+ const explicit = typeof node.status === "number" ? node.status : response?.status;
12028
+ if (typeof explicit === "number" && explicit >= 400 && explicit <= 599) {
12029
+ return explicit;
12030
+ }
12031
+ if (typeof node.message === "string") {
12032
+ const parsed = parseHttpStatusFromMessage(node.message);
12033
+ if (parsed !== undefined && parsed >= 400) {
12034
+ return parsed;
12035
+ }
12036
+ }
12037
+ }
12038
+ return;
12039
+ }
12040
+
12041
+ // ../common/src/local-permission-codes.ts
12042
+ var LOCAL_PERMISSION_ERROR_CODES = new Set([
12043
+ "EACCES",
12044
+ "EPERM",
12045
+ "EROFS"
12046
+ ]);
12047
+
11997
12048
  // ../common/src/error-handler.ts
11998
- var DEFAULT_401 = "Unauthorized (401). Run `uip login` to authenticate.";
11999
- var DEFAULT_403 = "Forbidden (403). Ensure the account has the required permissions.";
12049
+ var DEFAULT_401 = "Unauthorized (401). The session is missing or expired, or its token carries no scope for this API. Run `uip login status --detailed` to see the session and its scopes.";
12050
+ var DEFAULT_403 = "Forbidden (403). The account lacks permission for this operation, or the token carries no scope for this API. Run `uip login status --detailed` to see the token's scopes.";
12000
12051
  var DEFAULT_405 = "Method Not Allowed (405). The endpoint may not exist or the base URL may be incorrect.";
12001
12052
  var DEFAULT_413 = "Payload too large (413). The upload exceeded the server or CDN size limit. Reduce the package size — for example, exclude unused dependencies or remove large files from the project — and try again.";
12002
12053
  var HTML_RESPONSE_MESSAGE = "Received HTML instead of the expected JSON response.";
@@ -12023,14 +12074,14 @@ var TLS_ERROR_CODES = new Set([
12023
12074
  ]);
12024
12075
  var TLS_INSTRUCTIONS = "The server's TLS certificate could not be verified. Most often a " + "corporate proxy/firewall re-signs HTTPS with a root CA that Node does " + "not trust — set NODE_EXTRA_CA_CERTS to that CA's PEM file (and HTTPS_PROXY " + "if you connect through a proxy). If the certificate is instead expired or " + "its hostname does not match, fix the endpoint URL or the system clock. " + "Then retry.";
12025
12076
  var NETWORK_INSTRUCTIONS = "Could not reach the UiPath service. Check your network connection and " + "VPN, confirm any HTTP_PROXY/HTTPS_PROXY/NO_PROXY settings are correct, " + "then retry.";
12026
- var LOCAL_PERMISSION_ERROR_CODES = new Set(["EACCES", "EPERM", "EROFS"]);
12027
- var LOCAL_PERMISSION_MESSAGE_PATTERN = /\b(EACCES|EPERM|EROFS)\b/;
12077
+ var LOCAL_PERMISSION_MESSAGE_PATTERN = new RegExp(`\\b(${[...LOCAL_PERMISSION_ERROR_CODES].join("|")})\\b`);
12028
12078
  function localPermissionInstructions(code, path2) {
12029
12079
  const target = path2 !== undefined ? `'${path2}'` : "a local file or resource";
12030
12080
  if (code === "EROFS") {
12031
12081
  return `The filesystem containing ${target} is read-only (EROFS), so the ` + "CLI could not write to it. This is a local environment problem, " + "not a UiPath service error — retrying will not help. Use a " + "writable location, or give this environment write access to the " + "path.";
12032
12082
  }
12033
- const remedy = process.platform === "win32" ? "Re-run from an elevated terminal, close any program holding " + "the file open, or grant your user access to the path." : "Grant this user (or the sandbox the command runs in) access " + "to the path, or run the command outside the sandbox.";
12083
+ const onWindows = typeof process !== "undefined" && process.platform === "win32";
12084
+ const remedy = onWindows ? "Re-run from an elevated terminal, close any program holding " + "the file open, or grant your user access to the path." : "Grant this user (or the sandbox the command runs in) access " + "to the path, or run the command outside the sandbox.";
12034
12085
  return `The operating system denied access to ${target} (${code}). This is ` + "a local permission problem, not a UiPath service error — retrying " + `without a permission change will not help. ${remedy}`;
12035
12086
  }
12036
12087
  function describeConnectivityError(error) {
@@ -12084,48 +12135,6 @@ function localPermissionPath(path2, message) {
12084
12135
  return path2;
12085
12136
  return message ? /'([^']+)'/.exec(message)?.[1] : undefined;
12086
12137
  }
12087
- function* walkErrorGraph(error) {
12088
- const queue = [error];
12089
- const seen = new Set;
12090
- for (let steps = 0;queue.length > 0 && steps < 32; steps++) {
12091
- const current = queue.shift();
12092
- if (current === null || typeof current !== "object")
12093
- continue;
12094
- if (seen.has(current))
12095
- continue;
12096
- seen.add(current);
12097
- const cur = current;
12098
- yield cur;
12099
- if (cur.cause !== undefined)
12100
- queue.push(cur.cause);
12101
- if (Array.isArray(cur.errors))
12102
- queue.push(...cur.errors);
12103
- }
12104
- return;
12105
- }
12106
- function parseHttpStatusFromMessage(message) {
12107
- const match = /^HTTP\s+(\d{3})(?::|\s|-|$)/i.exec(message.trim());
12108
- if (!match)
12109
- return;
12110
- const status = Number(match[1]);
12111
- return Number.isInteger(status) && status >= 100 && status <= 599 ? status : undefined;
12112
- }
12113
- function findHttpStatusInGraph(error) {
12114
- for (const node of walkErrorGraph(error)) {
12115
- const response = node.response;
12116
- const explicit = typeof node.status === "number" ? node.status : response?.status;
12117
- if (typeof explicit === "number" && explicit >= 400 && explicit <= 599) {
12118
- return explicit;
12119
- }
12120
- if (typeof node.message === "string") {
12121
- const parsed = parseHttpStatusFromMessage(node.message);
12122
- if (parsed !== undefined && parsed >= 400) {
12123
- return parsed;
12124
- }
12125
- }
12126
- }
12127
- return;
12128
- }
12129
12138
  function isHtmlDocument(body) {
12130
12139
  return /^\s*(<!doctype html|<html\b)/i.test(body);
12131
12140
  }
@@ -12667,12 +12676,162 @@ function getOutputFilter() {
12667
12676
  return filterSlot.get();
12668
12677
  }
12669
12678
 
12679
+ // ../common/src/telemetry/telemetry-dimensions.ts
12680
+ var BaseDimensions = {
12681
+ ApplicationName: "ApplicationName",
12682
+ ProductVersion: "ProductVersion",
12683
+ InstallationId: "InstallationId",
12684
+ CloudUserId: "CloudUserId",
12685
+ CloudTenantId: "CloudTenantId",
12686
+ CloudOrganizationId: "CloudOrganizationId",
12687
+ IsInternalUser: "IsInternalUser",
12688
+ Environment: "Environment",
12689
+ BaseUrl: "BaseUrl",
12690
+ Region: "Region",
12691
+ Agent: "Agent",
12692
+ AgentVersion: "AgentVersion",
12693
+ AgentModel: "AgentModel",
12694
+ ToolName: "ToolName",
12695
+ ToolVersion: "ToolVersion",
12696
+ ExecutionContext: "ExecutionContext",
12697
+ CiProvider: "CiProvider",
12698
+ SessionIdSource: "SessionIdSource",
12699
+ SessionId: "SessionId"
12700
+ };
12701
+ var CommandDimensions = {
12702
+ IsCommand: "IsCommand",
12703
+ IsReexec: "IsReexec",
12704
+ CommandName: "CommandName",
12705
+ ExitCode: "ExitCode",
12706
+ TerminalOutcome: "TerminalOutcome",
12707
+ ErrorClass: "ErrorClass",
12708
+ TerminalSignal: "TerminalSignal",
12709
+ ErrorMessage: "ErrorMessage",
12710
+ SkillName: "SkillName",
12711
+ ProductArea: "ProductArea",
12712
+ Mode: "Mode"
12713
+ };
12714
+ var ShipDimensions = {
12715
+ ShipKind: "ShipKind",
12716
+ Target: "Target",
12717
+ ProjectType: "ProjectType",
12718
+ ProjectTypes: "ProjectTypes",
12719
+ ArtifactCorrelationKey: "ArtifactCorrelationKey",
12720
+ PackageName: "PackageName",
12721
+ PackageVersion: "PackageVersion",
12722
+ PackageVersionKey: "PackageVersionKey",
12723
+ DeploymentKey: "DeploymentKey",
12724
+ SolutionId: "SolutionId",
12725
+ FolderKey: "FolderKey",
12726
+ FeedId: "FeedId"
12727
+ };
12728
+ var ErrorDimensions = {
12729
+ Result: "Result",
12730
+ ErrorCode: "ErrorCode",
12731
+ Retry: "Retry",
12732
+ ErrorMessage: "ErrorMessage"
12733
+ };
12734
+ var AuthDimensions = {
12735
+ AuthenticationMethod: "AuthenticationMethod",
12736
+ Success: "Success",
12737
+ Reason: "Reason"
12738
+ };
12739
+ var SkillsDimensions = {
12740
+ SchemaVersion: "SchemaVersion",
12741
+ AgentType: "AgentType",
12742
+ SkillsVersion: "SkillsVersion",
12743
+ UipSubcommand: "UipSubcommand",
12744
+ FileExtension: "FileExtension",
12745
+ SubagentModel: "SubagentModel",
12746
+ SubagentType: "SubagentType",
12747
+ PermissionMode: "PermissionMode",
12748
+ EffortLevel: "EffortLevel",
12749
+ SessionSource: "SessionSource",
12750
+ Outcome: "Outcome",
12751
+ DurationMs: "DurationMs",
12752
+ Source: "Source"
12753
+ };
12754
+ var PackagerDimensions = {
12755
+ ProjectId: "ProjectId",
12756
+ ProjectType: "ProjectType",
12757
+ SolutionId: "SolutionId"
12758
+ };
12759
+ var ScopeDimensions = {
12760
+ FolderId: "FolderId"
12761
+ };
12762
+ var ID_DIMENSIONS = new Set([
12763
+ BaseDimensions.CloudUserId,
12764
+ BaseDimensions.CloudTenantId,
12765
+ BaseDimensions.CloudOrganizationId,
12766
+ BaseDimensions.InstallationId,
12767
+ ShipDimensions.ArtifactCorrelationKey,
12768
+ ShipDimensions.PackageVersionKey,
12769
+ ShipDimensions.DeploymentKey,
12770
+ ShipDimensions.SolutionId,
12771
+ ShipDimensions.FolderKey,
12772
+ ShipDimensions.FeedId,
12773
+ PackagerDimensions.ProjectId
12774
+ ]);
12775
+ var NON_IDENTIFIER_PLACEHOLDER_PATTERN = /^(?:\[[A-Z_]+\]|<[^>]+>)$/;
12776
+ var RESERVED_DIMENSION_NAMES = new Set([
12777
+ ...Object.values(BaseDimensions),
12778
+ ...Object.values(CommandDimensions),
12779
+ ...Object.values(ShipDimensions),
12780
+ ...Object.values(ErrorDimensions),
12781
+ ...Object.values(AuthDimensions),
12782
+ ...Object.values(SkillsDimensions),
12783
+ ...Object.values(PackagerDimensions),
12784
+ ...Object.values(ScopeDimensions)
12785
+ ]);
12786
+ var CURATED_DIMENSIONS = new Set([
12787
+ BaseDimensions.ApplicationName,
12788
+ BaseDimensions.ProductVersion,
12789
+ BaseDimensions.InstallationId,
12790
+ BaseDimensions.CloudUserId,
12791
+ BaseDimensions.CloudTenantId,
12792
+ BaseDimensions.CloudOrganizationId,
12793
+ BaseDimensions.IsInternalUser,
12794
+ BaseDimensions.Environment,
12795
+ BaseDimensions.BaseUrl,
12796
+ BaseDimensions.Region,
12797
+ BaseDimensions.Agent,
12798
+ BaseDimensions.AgentVersion,
12799
+ BaseDimensions.ToolVersion,
12800
+ BaseDimensions.ExecutionContext,
12801
+ BaseDimensions.CiProvider,
12802
+ BaseDimensions.SessionIdSource,
12803
+ BaseDimensions.SessionId,
12804
+ ...Object.values(CommandDimensions),
12805
+ ...Object.values(ShipDimensions)
12806
+ ]);
12807
+ function lowercaseIdDimensionValues(properties) {
12808
+ let changed = false;
12809
+ const result = {
12810
+ ...properties
12811
+ };
12812
+ for (const key of Object.keys(result)) {
12813
+ const value = result[key];
12814
+ if (!ID_DIMENSIONS.has(key) || typeof value !== "string" || NON_IDENTIFIER_PLACEHOLDER_PATTERN.test(value)) {
12815
+ continue;
12816
+ }
12817
+ const lowered = value.toLowerCase();
12818
+ if (lowered !== value) {
12819
+ result[key] = lowered;
12820
+ changed = true;
12821
+ }
12822
+ }
12823
+ return changed ? result : properties;
12824
+ }
12825
+
12670
12826
  // ../common/src/telemetry/command-terminal.ts
12671
12827
  var recordedFailureSlot = singleton("CommandTelemetryFailure");
12672
12828
  var AUTH_ERROR_CODES = new Set([
12673
12829
  "authentication_required",
12674
12830
  "permission_denied"
12675
12831
  ]);
12832
+ var LOCAL_PERMISSION_CLI_ERROR_CODES = new Set([
12833
+ "local_permission_denied"
12834
+ ]);
12676
12835
  var VALIDATION_ERROR_CODES = new Set(["invalid_argument"]);
12677
12836
  var NETWORK_HTTP_ERROR_CODES = new Set([
12678
12837
  "network_error",
@@ -12813,6 +12972,9 @@ function classifyFromErrorCode(errorCode) {
12813
12972
  if (AUTH_ERROR_CODES.has(errorCode)) {
12814
12973
  return "auth";
12815
12974
  }
12975
+ if (LOCAL_PERMISSION_CLI_ERROR_CODES.has(errorCode)) {
12976
+ return "local_permission";
12977
+ }
12816
12978
  if (VALIDATION_ERROR_CODES.has(errorCode)) {
12817
12979
  return "validation";
12818
12980
  }
@@ -12824,6 +12986,15 @@ function classifyFromErrorCode(errorCode) {
12824
12986
  }
12825
12987
  return;
12826
12988
  }
12989
+ function hasLocalPermissionCode(error) {
12990
+ for (const node of walkErrorGraph(error)) {
12991
+ const code = node.code;
12992
+ if (typeof code === "string" && LOCAL_PERMISSION_ERROR_CODES.has(code)) {
12993
+ return true;
12994
+ }
12995
+ }
12996
+ return false;
12997
+ }
12827
12998
  function classifyFromError(error) {
12828
12999
  const code = findCodeInCauseChain(error);
12829
13000
  if (code) {
@@ -12840,6 +13011,9 @@ function classifyFromError(error) {
12840
13011
  return "missing_dependency";
12841
13012
  }
12842
13013
  }
13014
+ if (hasLocalPermissionCode(error)) {
13015
+ return "local_permission";
13016
+ }
12843
13017
  const message = stringField(error, "message");
12844
13018
  if (message?.includes("fetch failed") === true) {
12845
13019
  return "network_http";
@@ -12855,7 +13029,7 @@ function classifyError2(input) {
12855
13029
  if (recorded?.errorClass) {
12856
13030
  return recorded.errorClass;
12857
13031
  }
12858
- const status = recorded?.context?.httpStatus;
13032
+ const status = recorded?.context?.httpStatus ?? findHttpStatusInGraph(input.error);
12859
13033
  if (status !== undefined) {
12860
13034
  return classifyHttpStatus(status);
12861
13035
  }
@@ -12878,17 +13052,18 @@ function buildCommandTerminalTelemetryProperties(input) {
12878
13052
  const errorClass = outcome === "success" || outcome === "no_op" ? undefined : outcome === "cancelled" ? "user_cancelled" : classifyError2(input);
12879
13053
  const terminalSignal = terminalSignalFor(input, outcome);
12880
13054
  return {
12881
- exit_code: input.exitCode,
12882
- terminal_outcome: outcome,
12883
- ...errorClass ? { error_class: errorClass } : {},
12884
- ...terminalSignal ? { terminal_signal: terminalSignal } : {}
13055
+ [CommandDimensions.ExitCode]: input.exitCode,
13056
+ [CommandDimensions.TerminalOutcome]: outcome,
13057
+ ...errorClass ? { [CommandDimensions.ErrorClass]: errorClass } : {},
13058
+ ...terminalSignal ? { [CommandDimensions.TerminalSignal]: terminalSignal } : {}
12885
13059
  };
12886
13060
  }
12887
13061
 
12888
13062
  // ../common/src/telemetry/telemetry-events.ts
12889
13063
  var CommonTelemetryEvents = {
12890
- Error: "uip.error",
12891
- ShipSucceeded: "uip.ship.succeeded"
13064
+ Start: "Application.Start",
13065
+ Error: "Application.Error",
13066
+ ShipSucceeded: "Cli.ShipSucceeded"
12892
13067
  };
12893
13068
 
12894
13069
  // ../common/src/registry.ts
@@ -13096,8 +13271,8 @@ function detectExecutionContext(options = {}) {
13096
13271
  function getExecutionContextTelemetryProperties() {
13097
13272
  const detected = detectExecutionContext();
13098
13273
  return {
13099
- execution_context: detected.executionContext,
13100
- ...detected.ciProvider ? { ci_provider: detected.ciProvider } : {}
13274
+ [BaseDimensions.ExecutionContext]: detected.executionContext,
13275
+ ...detected.ciProvider ? { [BaseDimensions.CiProvider]: detected.ciProvider } : {}
13101
13276
  };
13102
13277
  }
13103
13278
  // ../common/src/telemetry/node-context-storage.ts
@@ -13140,7 +13315,7 @@ function getInboundTraceContext() {
13140
13315
  var TELEMETRY_SESSION_ID_ENV = "UIPATH_SESSION_ID";
13141
13316
  var SESSION_ID_MAX_LENGTH = 64;
13142
13317
  var RANDOM_SESSION_ID_LENGTH = 32;
13143
- var TELEMETRY_SESSION_SOURCE_PROPERTY = "session_id_source";
13318
+ var TELEMETRY_SESSION_SOURCE_PROPERTY = "SessionIdSource";
13144
13319
  var CONTROL_CHARACTERS = /\p{Cc}/gu;
13145
13320
  var INHERITED_SESSION_SOURCES = [
13146
13321
  { envVar: "CLAUDE_CODE_SESSION_ID", source: "claude-code" },
@@ -13192,6 +13367,9 @@ function resolveTelemetrySession() {
13192
13367
  telemetrySessionSlot.set(resolved);
13193
13368
  return resolved;
13194
13369
  }
13370
+ function getTelemetrySessionId() {
13371
+ return resolveTelemetrySession().id;
13372
+ }
13195
13373
  function getTelemetrySessionSource() {
13196
13374
  return resolveTelemetrySession().source;
13197
13375
  }
@@ -13272,7 +13450,10 @@ class TelemetryService {
13272
13450
  } catch (error) {
13273
13451
  const durationMs = clock.elapsedMs();
13274
13452
  const err = error instanceof Error ? error : new Error(String(error));
13275
- await this.telemetryProvider.trackRequest(this.spanFor(name, durationMs, false, { ...properties, errorMessage: err.message }, context));
13453
+ await this.telemetryProvider.trackRequest(this.spanFor(name, durationMs, false, {
13454
+ ...properties,
13455
+ [CommandDimensions.ErrorMessage]: err.message
13456
+ }, context));
13276
13457
  throw error;
13277
13458
  }
13278
13459
  }
@@ -13343,7 +13524,10 @@ class TelemetryService {
13343
13524
  const durationMs = clock.elapsedMs();
13344
13525
  const err = error instanceof Error ? error : new Error(String(error));
13345
13526
  await this.telemetryProvider.trackDependency({
13346
- ...this.spanFor(name, durationMs, false, { ...properties, errorMessage: err.message }, childContext),
13527
+ ...this.spanFor(name, durationMs, false, {
13528
+ ...properties,
13529
+ [CommandDimensions.ErrorMessage]: err.message
13530
+ }, childContext),
13347
13531
  type
13348
13532
  });
13349
13533
  throw error;
@@ -13378,9 +13562,10 @@ class TelemetryService {
13378
13562
  ...globalProperties,
13379
13563
  ...this.defaultProperties,
13380
13564
  ...redactProperties(properties ?? {}),
13381
- [TELEMETRY_SESSION_SOURCE_PROPERTY]: getTelemetrySessionSource()
13565
+ [TELEMETRY_SESSION_SOURCE_PROPERTY]: getTelemetrySessionSource(),
13566
+ [BaseDimensions.SessionId]: this.telemetryProvider.getSessionId?.() ?? getTelemetrySessionId()
13382
13567
  };
13383
- return enriched;
13568
+ return lowercaseIdDimensionValues(enriched);
13384
13569
  }
13385
13570
  generateId() {
13386
13571
  const bytes = new Uint8Array(8);
@@ -13579,6 +13764,7 @@ class SuccessOutput {
13579
13764
  Data;
13580
13765
  Pagination;
13581
13766
  Instructions;
13767
+ Warning;
13582
13768
  Log;
13583
13769
  constructor(code, data) {
13584
13770
  this.Code = code;
@@ -14163,7 +14349,165 @@ class FilterImplicitLimitError extends Error {
14163
14349
  this.instructions = "Pass --limit <n> to choose how many records the filter applies to. " + "To filter over all records, pass the command's maximum accepted --limit (see the option's description in --help).";
14164
14350
  }
14165
14351
  }
14166
- function applyFilter(data, filter) {
14352
+ function countRecords(data) {
14353
+ if (Array.isArray(data))
14354
+ return data.length;
14355
+ return data == null ? 0 : 1;
14356
+ }
14357
+ function availableFields(data) {
14358
+ const records = Array.isArray(data) ? data : [data];
14359
+ const keys = new Set;
14360
+ for (const record of records) {
14361
+ if (record && typeof record === "object" && !Array.isArray(record)) {
14362
+ for (const key of Object.keys(record))
14363
+ keys.add(key);
14364
+ }
14365
+ }
14366
+ return [...keys];
14367
+ }
14368
+ function decodeQuotedIdentifier(whole, inner) {
14369
+ const [error, decoded] = catchError(() => JSON.parse(whole));
14370
+ if (!error && typeof decoded === "string")
14371
+ return decoded;
14372
+ return inner.replace(/\\(.)/g, "$1");
14373
+ }
14374
+ function referencedFields(filter) {
14375
+ const top = new Set;
14376
+ const nested = new Set;
14377
+ const withoutValueLiterals = filter.replace(/'(?:\\.|[^'\\])*'/g, " ").replace(/`(?:\\.|[^`\\])*`/g, " ");
14378
+ const isPathTail = (text, index) => text[index - 1] === "." && /[A-Za-z0-9_"]/.test(text[index - 2] ?? "");
14379
+ const quoted = [];
14380
+ const withoutLiterals = withoutValueLiterals.replace(/"((?:\\.|[^"\\])*)"/g, (whole, name, index) => {
14381
+ const isAlias = /^\s*:/.test(withoutValueLiterals.slice(index + whole.length));
14382
+ if (!isAlias) {
14383
+ quoted.push({
14384
+ name: decodeQuotedIdentifier(whole, name),
14385
+ index,
14386
+ tail: isPathTail(withoutValueLiterals, index)
14387
+ });
14388
+ }
14389
+ return `"${" ".repeat(whole.length - 2)}"`;
14390
+ });
14391
+ const descent = /[A-Za-z0-9_"]\s*[.[]/.exec(withoutLiterals);
14392
+ const rootEnd = descent ? descent.index + 1 : Number.POSITIVE_INFINITY;
14393
+ const place = (name, index, tail) => {
14394
+ if (tail || index >= rootEnd)
14395
+ nested.add(name);
14396
+ else
14397
+ top.add(name);
14398
+ };
14399
+ for (const entry of quoted)
14400
+ place(entry.name, entry.index, entry.tail);
14401
+ const identifiers = withoutLiterals.matchAll(/([A-Za-z_][A-Za-z0-9_]*)(\s*[:(])?/g);
14402
+ const reserved = new Set(["true", "false", "null", "and", "or", "not"]);
14403
+ for (const match of identifiers) {
14404
+ const [, name, trailing] = match;
14405
+ if (trailing || reserved.has(name))
14406
+ continue;
14407
+ place(name, match.index, isPathTail(withoutLiterals, match.index));
14408
+ }
14409
+ return {
14410
+ top: [...top],
14411
+ nested: [...nested].filter((name) => !top.has(name)),
14412
+ hasPredicate: /\[\s*\?/.test(withoutValueLiterals)
14413
+ };
14414
+ }
14415
+ function appearsBelowTopLevel(data, name) {
14416
+ let budget = 2000;
14417
+ const visit = (value, depth) => {
14418
+ if (budget-- <= 0 || depth > 4)
14419
+ return false;
14420
+ if (value === null || typeof value !== "object")
14421
+ return false;
14422
+ if (Array.isArray(value))
14423
+ return value.some((entry) => visit(entry, depth));
14424
+ const record = value;
14425
+ if (depth > 0 && Object.hasOwn(record, name))
14426
+ return true;
14427
+ return Object.values(record).some((entry) => visit(entry, depth + 1));
14428
+ };
14429
+ return visit(data, 0);
14430
+ }
14431
+ function alwaysNullKeys(records) {
14432
+ const objects = records.filter((r) => r != null && typeof r === "object" && !Array.isArray(r));
14433
+ if (objects.length === 0 || objects.length !== records.length)
14434
+ return [];
14435
+ const keys = [...new Set(objects.flatMap((o) => Object.keys(o)))];
14436
+ if (keys.length === 0)
14437
+ return [];
14438
+ const nullKeys = keys.filter((key) => objects.every((record) => record[key] === null));
14439
+ return nullKeys.length === keys.length ? nullKeys : [];
14440
+ }
14441
+ function carriesOnlyNulls(value) {
14442
+ if (value === null)
14443
+ return true;
14444
+ if (Array.isArray(value)) {
14445
+ return value.length > 0 && value.every(carriesOnlyNulls);
14446
+ }
14447
+ if (typeof value === "object" && value !== undefined) {
14448
+ const values = Object.values(value);
14449
+ return values.length > 0 && values.every(carriesOnlyNulls);
14450
+ }
14451
+ return false;
14452
+ }
14453
+ function nameList(names, cap2 = 12) {
14454
+ const shown = names.slice(0, cap2).map((n) => `\`${n}\``);
14455
+ const rest = names.length - shown.length;
14456
+ return shown.join(", ") + (rest > 0 ? `, and ${rest} more` : "");
14457
+ }
14458
+ function buildFilterWarning(filter, data, outcome) {
14459
+ const present = availableFields(data);
14460
+ const refs = referencedFields(filter);
14461
+ const unknown = refs.top.filter((name) => !present.includes(name) && !appearsBelowTopLevel(data, name));
14462
+ const unchecked = refs.nested.filter((name) => !present.includes(name));
14463
+ const count = countRecords(data);
14464
+ const scope = `${count} record(s)`;
14465
+ const isNotAField = (names) => `${nameList(names)} ${names.length === 1 ? "is not a field" : "are not fields"} on the ${scope} it read`;
14466
+ const soundness = unchecked.length > 0 ? `${nameList(unchecked)} ${unchecked.length === 1 ? "reads" : "read"} below the top level, so ${unchecked.length === 1 ? "it was" : "they were"} not checked against the record keys` : refs.top.length > 0 ? "every field it names exists" : "";
14467
+ const withSoundness = (base) => soundness ? `${base}, and ${soundness}` : base;
14468
+ let detail;
14469
+ let lede;
14470
+ if (outcome.kind === "null-elements") {
14471
+ lede = "returned only null values";
14472
+ const projected = `all ${outcome.count} of the elements it projected are null`;
14473
+ if (unknown.length > 0) {
14474
+ detail = `${projected}, because ${isNotAField(unknown)}`;
14475
+ } else if (unchecked.length > 0) {
14476
+ detail = withSoundness(projected);
14477
+ } else {
14478
+ detail = `${projected}, and every field it names exists — a multi-select list ` + `(\`[A, B]\`) reads each entry against \`Data\` itself, so on a list ` + `result use \`[].[A, B]\` or \`[].{a: A, b: B}\` to read the records`;
14479
+ }
14480
+ } else if (outcome.kind === "null-rows") {
14481
+ lede = "returned only null values";
14482
+ const projected = `every value it projected is null on all ${outcome.count} row(s)`;
14483
+ detail = unknown.length > 0 ? `${projected}, because ${isNotAField(unknown)}` : withSoundness(projected);
14484
+ } else if (outcome.kind === "null-values") {
14485
+ lede = "returned only null values";
14486
+ const projected = `every key it projected (${nameList(outcome.keys)}) is null`;
14487
+ const sameSet = unknown.length === outcome.keys.length && outcome.keys.every((k) => unknown.includes(k));
14488
+ if (sameSet) {
14489
+ detail = `${isNotAField(outcome.keys)}, so every key it projected is null`;
14490
+ } else if (unknown.length > 0) {
14491
+ detail = `${projected}, because ${isNotAField(unknown)}`;
14492
+ } else {
14493
+ detail = withSoundness(`${projected} on all ${scope}`);
14494
+ }
14495
+ } else {
14496
+ lede = "returned nothing";
14497
+ if (unknown.length > 0) {
14498
+ detail = isNotAField(unknown);
14499
+ } else {
14500
+ const selection = refs.hasPredicate ? "no record matched" : "the expression resolved to no value";
14501
+ detail = withSoundness(`${selection} — it read ${scope}`);
14502
+ }
14503
+ }
14504
+ const fields = present.length > 0 ? ` Available fields: ${nameList(present)}.` : "";
14505
+ return `--output-filter ${JSON.stringify(filter)} ${lede}: ${detail}.${fields}`;
14506
+ }
14507
+ function appendWarning(existing, note) {
14508
+ return existing ? `${existing} ${note}` : note;
14509
+ }
14510
+ function applyFilter(data, filter, onWarning) {
14167
14511
  const codec = requireJmespath();
14168
14512
  let result;
14169
14513
  try {
@@ -14171,9 +14515,34 @@ function applyFilter(data, filter) {
14171
14515
  } catch (err) {
14172
14516
  throw new FilterEvaluationError(filter, err);
14173
14517
  }
14174
- if (result == null)
14518
+ const inputCount = countRecords(data);
14519
+ const warn = (outcome) => {
14520
+ if (inputCount === 0)
14521
+ return;
14522
+ const note = buildFilterWarning(filter, data, outcome);
14523
+ getOutputSink().writeErr(`[WARN] ${note}
14524
+ `);
14525
+ onWarning?.(note);
14526
+ };
14527
+ const warnIfAllNull = (records) => {
14528
+ const keys = alwaysNullKeys(records);
14529
+ if (keys.length > 0)
14530
+ warn({ kind: "null-values", keys });
14531
+ };
14532
+ if (result == null) {
14533
+ warn({ kind: "empty" });
14175
14534
  return [];
14535
+ }
14176
14536
  if (Array.isArray(result)) {
14537
+ if (result.length === 0) {
14538
+ warn({ kind: "empty" });
14539
+ } else if (result.every((entry) => entry === null)) {
14540
+ warn({ kind: "null-elements", count: result.length });
14541
+ } else if (result.every((entry) => Array.isArray(entry)) && carriesOnlyNulls(result)) {
14542
+ warn({ kind: "null-rows", count: result.length });
14543
+ } else {
14544
+ warnIfAllNull(result);
14545
+ }
14177
14546
  if (result.length > 0 && typeof result[0] !== "object") {
14178
14547
  const fieldMatch = filter.match(/\.(\w+)$/);
14179
14548
  const key = fieldMatch ? fieldMatch[1] : "Value";
@@ -14181,10 +14550,30 @@ function applyFilter(data, filter) {
14181
14550
  }
14182
14551
  return result;
14183
14552
  }
14184
- if (typeof result === "object")
14553
+ if (typeof result === "object") {
14554
+ warnIfAllNull([result]);
14185
14555
  return result;
14556
+ }
14186
14557
  return { Value: result };
14187
14558
  }
14559
+ function filterFailureData(envelope) {
14560
+ const filter = getOutputFilter();
14561
+ const data = envelope.Data;
14562
+ if (!filter || data == null)
14563
+ return;
14564
+ let note;
14565
+ const [filterError, filtered] = catchError(() => applyFilter(data, filter, (n) => {
14566
+ note = n;
14567
+ }));
14568
+ if (filterError) {
14569
+ envelope.Warning = appendWarning(envelope.Warning, `--output-filter was not applied, so Data is shown in full: ${filterError.message}`);
14570
+ return;
14571
+ }
14572
+ envelope.Data = filtered;
14573
+ if (note) {
14574
+ envelope.Warning = appendWarning(envelope.Warning, note);
14575
+ }
14576
+ }
14188
14577
  function defaultErrorCodeForResult(result) {
14189
14578
  switch (result) {
14190
14579
  case RESULTS.AuthenticationError:
@@ -14228,7 +14617,7 @@ function defaultErrorCodeForHttpStatus(status) {
14228
14617
  return "server_error";
14229
14618
  return;
14230
14619
  }
14231
- var LOCAL_PERMISSION_TEXT_PATTERN = /(?:\b|\()(?:EACCES|EPERM|EROFS)(?::\s|\))/;
14620
+ var LOCAL_PERMISSION_TEXT_PATTERN = new RegExp(`(?:\\b|\\()(?:${[...LOCAL_PERMISSION_ERROR_CODES].join("|")})(?::\\s|\\))`);
14232
14621
  function defaultErrorCodeForFailure(data) {
14233
14622
  if (data.Result === RESULTS.Failure) {
14234
14623
  const status = data.Context?.httpStatus ?? parseHttpStatusFromMessage2(data.Message);
@@ -14267,8 +14656,14 @@ var OutputFormatter;
14267
14656
  }
14268
14657
  const filter = getOutputFilter();
14269
14658
  if (filter) {
14270
- const filtered = applyFilter(data.Data, filter);
14659
+ let note;
14660
+ const filtered = applyFilter(data.Data, filter, (n) => {
14661
+ note = n;
14662
+ });
14271
14663
  data.Data = normalize ? normalizeDataKeys(filtered, verbatim, subtrees && { refs: subtrees.refs, mode: "skip" }) : filtered;
14664
+ if (note) {
14665
+ data.Warning = appendWarning(data.Warning, note);
14666
+ }
14272
14667
  }
14273
14668
  logOutput(normalizeOutputKeys(data), getOutputFormat(), options?.tableRowStyle);
14274
14669
  }
@@ -14296,12 +14691,13 @@ var OutputFormatter;
14296
14691
  delete envelope.TelemetryErrorClass;
14297
14692
  delete envelope.TelemetryTerminalOutcome;
14298
14693
  delete envelope.TelemetryTerminalSignal;
14694
+ filterFailureData(envelope);
14299
14695
  if (!suppressTelemetry) {
14300
14696
  telemetry.trackEvent(CommonTelemetryEvents.Error, {
14301
- result: data.Result,
14302
- errorCode: data.ErrorCode,
14303
- retry: data.Retry,
14304
- message: data.Message
14697
+ [ErrorDimensions.Result]: data.Result,
14698
+ [ErrorDimensions.ErrorCode]: data.ErrorCode,
14699
+ [ErrorDimensions.Retry]: data.Retry,
14700
+ [ErrorDimensions.ErrorMessage]: data.Message
14305
14701
  });
14306
14702
  }
14307
14703
  logOutput(normalizeOutputKeys(envelope), getOutputFormat());
@@ -14344,13 +14740,20 @@ var OutputFormatter;
14344
14740
  OutputFormatter.log = log;
14345
14741
  function formatToString(data) {
14346
14742
  const filter = getOutputFilter();
14743
+ const envelope = data;
14347
14744
  if ("Data" in data && data.Data != null) {
14348
14745
  data.Data = normalizeDataKeys(data.Data);
14349
14746
  if (filter) {
14350
- data.Data = normalizeDataKeys(applyFilter(data.Data, filter));
14747
+ let note;
14748
+ data.Data = normalizeDataKeys(applyFilter(data.Data, filter, (n) => {
14749
+ note = n;
14750
+ }));
14751
+ if (note) {
14752
+ envelope.Warning = appendWarning(envelope.Warning, note);
14753
+ }
14351
14754
  }
14352
14755
  }
14353
- const output = normalizeOutputKeys(data);
14756
+ const output = normalizeOutputKeys(envelope);
14354
14757
  const lines = [];
14355
14758
  const sink = getOutputSink();
14356
14759
  printOutput(output, getOutputFormat(), (msg) => {
@@ -14400,7 +14803,7 @@ var LEGACY_SKILL_NAMESPACE = "uipath:";
14400
14803
  var MAX_SKILL_NAME_LENGTH = 80;
14401
14804
  var SKILL_NAME_PATTERN = /^[a-z0-9][a-z0-9-]*[a-z0-9]$/;
14402
14805
  function productMode(productArea, mode) {
14403
- return { product_area: productArea, mode };
14806
+ return { ProductArea: productArea, Mode: mode };
14404
14807
  }
14405
14808
  function attributionRecord(groups) {
14406
14809
  const record = {};
@@ -14458,6 +14861,7 @@ var COMMAND_ATTRIBUTION = commandAttribution([
14458
14861
  ["rpa", "build", ["uip.rpa-legacy"]],
14459
14862
  ["conversational", "operate", ["uip.conversational"]],
14460
14863
  ["agents", "build", ["uip.codedagent", "uip.agent"]],
14864
+ ["coding-agents", "build", ["uip.coder"]],
14461
14865
  ["agenthub", "build", ["uip.agenthub"]],
14462
14866
  ["coded-apps", "build", ["uip.codedapp"]],
14463
14867
  ["functions", "build", ["uip.function", "uip.functions"]],
@@ -14543,32 +14947,64 @@ function normalizeSkillName(value) {
14543
14947
  function buildCommandTelemetryAttribution(commandPath, skillSource) {
14544
14948
  const skillName = normalizeSkillName(skillSource);
14545
14949
  return {
14546
- ...skillName ? { skill_name: skillName } : {},
14950
+ ...skillName ? { SkillName: skillName } : {},
14547
14951
  ...getCommandProductModeAttribution(commandPath)
14548
14952
  };
14549
14953
  }
14954
+ var AGENT_SESSION_ENV = {
14955
+ [BaseDimensions.AgentModel]: "UIPATH_AGENT_MODEL",
14956
+ [SkillsDimensions.PermissionMode]: "UIPATH_PERMISSION_MODE",
14957
+ [SkillsDimensions.EffortLevel]: "UIPATH_EFFORT_LEVEL",
14958
+ [SkillsDimensions.SkillsVersion]: "UIPATH_SKILLS_VERSION"
14959
+ };
14960
+ var MAX_TELEMETRY_TOKEN_LENGTH = 120;
14961
+ function sanitizeTelemetryToken(value) {
14962
+ return value.replace(/[^A-Za-z0-9:._/ -]/g, "_").slice(0, MAX_TELEMETRY_TOKEN_LENGTH);
14963
+ }
14964
+ function buildAgentSessionTelemetry(env) {
14965
+ const dimensions = {};
14966
+ for (const [key, variable] of Object.entries(AGENT_SESSION_ENV)) {
14967
+ const value = env[variable]?.trim();
14968
+ if (value) {
14969
+ dimensions[key] = sanitizeTelemetryToken(value);
14970
+ }
14971
+ }
14972
+ return dimensions;
14973
+ }
14550
14974
 
14551
14975
  // ../common/src/telemetry/command-name.ts
14552
- var TELEMETRY_COMMAND_ROOT = "uip";
14976
+ var TELEMETRY_NAME_ROOT = "Cli";
14977
+ var CLI_COMMAND_ROOT = "uip";
14978
+ var TELEMETRY_NAME_BARE_ACTION = "Invoke";
14553
14979
  function commandTelemetryName(parts) {
14980
+ const action = vetCommandTokens(parts).map(pascalizeToken).join("");
14981
+ return `${TELEMETRY_NAME_ROOT}.${action || TELEMETRY_NAME_BARE_ACTION}`;
14982
+ }
14983
+ function commandInvocationPath(parts) {
14984
+ return [CLI_COMMAND_ROOT, ...vetCommandTokens(parts)].join(" ");
14985
+ }
14986
+ function vetCommandTokens(parts) {
14554
14987
  const tokens = [];
14555
14988
  for (const part of parts) {
14556
- const pieces = String(part ?? "").split(/\s+/).filter((token) => token && !token.startsWith("-") && token !== TELEMETRY_COMMAND_ROOT);
14989
+ const pieces = String(part ?? "").split(/\s+/).filter((token) => token && !token.startsWith("-") && token !== CLI_COMMAND_ROOT);
14557
14990
  if (pieces.every(isCommandToken)) {
14558
14991
  tokens.push(...pieces);
14559
14992
  continue;
14560
14993
  }
14561
14994
  tokens.push(UNKNOWN_TOKEN);
14562
14995
  }
14563
- return [TELEMETRY_COMMAND_ROOT, ...tokens].join(".");
14996
+ return tokens;
14997
+ }
14998
+ function pascalizeToken(token) {
14999
+ return token.split("-").filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join("");
14564
15000
  }
14565
- var COMMAND_TOKEN_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
15001
+ var COMMAND_TOKEN_PATTERN = /^[a-z][a-z0-9-]*$/;
14566
15002
  var MAX_COMMAND_TOKEN_LENGTH = 32;
14567
15003
  var GUID_TOKEN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
14568
15004
  function isCommandToken(token) {
14569
- return token.length <= MAX_COMMAND_TOKEN_LENGTH && COMMAND_TOKEN_PATTERN.test(token) && !GUID_TOKEN.test(token) && !/^\d+$/.test(token);
15005
+ return token.length <= MAX_COMMAND_TOKEN_LENGTH && COMMAND_TOKEN_PATTERN.test(token) && !GUID_TOKEN.test(token);
14570
15006
  }
14571
- var UNKNOWN_TOKEN = "<unknown>";
15007
+ var UNKNOWN_TOKEN = "unknown";
14572
15008
 
14573
15009
  // ../common/src/telemetry/invocation-request.ts
14574
15010
  var requestContextSlot = singleton("TelemetryInvocationRequestContext");
@@ -14673,7 +15109,7 @@ function withheldArgumentValues(cmd) {
14673
15109
  });
14674
15110
  return values;
14675
15111
  }
14676
- function deriveCommandPath(cmd) {
15112
+ function deriveCommandParts(cmd) {
14677
15113
  const parts = [];
14678
15114
  let current = cmd;
14679
15115
  while (current) {
@@ -14686,14 +15122,13 @@ function deriveCommandPath(cmd) {
14686
15122
  if (parts.length > 1) {
14687
15123
  parts.shift();
14688
15124
  }
14689
- return commandTelemetryName(parts);
15125
+ return parts;
14690
15126
  }
14691
15127
  function isErrorContext(value) {
14692
15128
  return value !== null && typeof value === "object";
14693
15129
  }
14694
15130
  function commandHelpHint(commandPath) {
14695
- const command = commandPath.replace(/\./g, " ");
14696
- return `An unexpected error occurred. Run '${command} --help' to verify command syntax, or run with --log-level debug for details.`;
15131
+ return `An unexpected error occurred. Run '${commandPath} --help' to verify command syntax, or run with --log-level debug for details.`;
14697
15132
  }
14698
15133
  function isPromptCancellation(error) {
14699
15134
  return error instanceof Error && error.name === "ExitPromptError";
@@ -14718,7 +15153,9 @@ Command.prototype.trackedAction = function(context, fn, properties) {
14718
15153
  yaml: getOutputFormat() === "yaml",
14719
15154
  filter: getOutputFilter() !== undefined
14720
15155
  });
14721
- const telemetryName = deriveCommandPath(command);
15156
+ const commandParts = deriveCommandParts(command);
15157
+ const telemetryName = commandTelemetryName(commandParts);
15158
+ const commandPath = commandInvocationPath(commandParts);
14722
15159
  const props = typeof properties === "function" ? properties(...args) : properties;
14723
15160
  markCommandStart();
14724
15161
  const supplied = recordSuppliedArgumentValues(withheldArgumentValues(command));
@@ -14753,7 +15190,7 @@ Command.prototype.trackedAction = function(context, fn, properties) {
14753
15190
  Result: finalResult,
14754
15191
  ...customErrorCode ? { ErrorCode: customErrorCode } : {},
14755
15192
  Message: errorMessage,
14756
- Instructions: customInstructions ?? commandHelpHint(telemetryName),
15193
+ Instructions: customInstructions ?? commandHelpHint(commandPath),
14757
15194
  ...customRetry ? { Retry: customRetry } : {},
14758
15195
  ...customContext ? { Context: customContext } : {}
14759
15196
  });
@@ -14770,8 +15207,8 @@ Command.prototype.trackedAction = function(context, fn, properties) {
14770
15207
  recordedFailure,
14771
15208
  pollSignal: context.pollSignal
14772
15209
  });
14773
- if (terminalTelemetry.error_class === "internal" && error) {
14774
- telemetry.trackException(error instanceof Error ? error : new Error(String(error)), { command_name: telemetryName }, getInvocationRequestContext());
15210
+ if (terminalTelemetry[CommandDimensions.ErrorClass] === "internal" && error) {
15211
+ telemetry.trackException(error instanceof Error ? error : new Error(String(error)), { [CommandDimensions.CommandName]: commandPath }, getInvocationRequestContext());
14775
15212
  }
14776
15213
  const commandParams = extractCommandParams(command);
14777
15214
  if (props) {
@@ -14782,10 +15219,12 @@ Command.prototype.trackedAction = function(context, fn, properties) {
14782
15219
  const baseProperties = redactProperties({
14783
15220
  ...commandParams,
14784
15221
  ...props,
14785
- ...buildCommandTelemetryAttribution(telemetryName, process.env.UIPATH_SKILL),
14786
- command: "true",
15222
+ ...buildCommandTelemetryAttribution(commandPath, process.env.UIPATH_SKILL),
15223
+ ...buildAgentSessionTelemetry(process.env),
15224
+ [CommandDimensions.CommandName]: commandPath,
15225
+ [CommandDimensions.IsCommand]: "true",
14787
15226
  ...terminalTelemetry,
14788
- ...errorMessage ? { errorMessage } : {}
15227
+ ...errorMessage ? { [CommandDimensions.ErrorMessage]: errorMessage } : {}
14789
15228
  });
14790
15229
  emitInvocationRequest(telemetryName, success, baseProperties);
14791
15230
  } finally {
@@ -15103,6 +15542,40 @@ var BOOLEAN_FLAGS = new Set(HOST_GLOBAL_FLAGS);
15103
15542
  // ../common/src/interactivity-context.ts
15104
15543
  var modeSlot = singleton("InteractivityMode");
15105
15544
  var interactiveFlagSlot = singleton("InteractiveFlag");
15545
+ // ../common/src/mime-types.ts
15546
+ var MIME_TYPES_BY_EXTENSION = Object.freeze({
15547
+ pdf: "application/pdf",
15548
+ png: "image/png",
15549
+ jpg: "image/jpeg",
15550
+ jpeg: "image/jpeg",
15551
+ gif: "image/gif",
15552
+ webp: "image/webp",
15553
+ bmp: "image/bmp",
15554
+ tif: "image/tiff",
15555
+ tiff: "image/tiff",
15556
+ svg: "image/svg+xml",
15557
+ txt: "text/plain",
15558
+ log: "text/plain",
15559
+ md: "text/markdown",
15560
+ csv: "text/csv",
15561
+ tsv: "text/tab-separated-values",
15562
+ json: "application/json",
15563
+ xml: "application/xml",
15564
+ html: "text/html",
15565
+ htm: "text/html",
15566
+ yaml: "application/yaml",
15567
+ yml: "application/yaml",
15568
+ doc: "application/msword",
15569
+ docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
15570
+ xls: "application/vnd.ms-excel",
15571
+ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
15572
+ ppt: "application/vnd.ms-powerpoint",
15573
+ pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
15574
+ zip: "application/zip",
15575
+ mp3: "audio/mpeg",
15576
+ wav: "audio/wav",
15577
+ mp4: "video/mp4"
15578
+ });
15106
15579
  // ../common/src/option-aliases.ts
15107
15580
  function resolveDeprecatedOptionAlias({
15108
15581
  preferredValue,
@@ -15618,7 +16091,7 @@ var ScreenLogger;
15618
16091
  // ../common/src/sdk-user-agent.ts
15619
16092
  var USER_AGENT_HEADER = "User-Agent";
15620
16093
  var CODING_AGENT_HEADER = "x-coding-agent-info";
15621
- var AGENT_PROPERTY = "agent";
16094
+ var AGENT_PROPERTY = BaseDimensions.Agent;
15622
16095
  var CODING_AGENT_PROPERTY = "CodingAgent";
15623
16096
  var sdkUserAgentHostToken = singleton("SdkUserAgentHostToken");
15624
16097
  function userAgentPatchKey(userAgent) {
@@ -16012,7 +16485,7 @@ var package_default2 = {
16012
16485
  name: "@uipath/test-manager-sdk",
16013
16486
  author: "UiPath",
16014
16487
  license: "SEE LICENSE IN LICENSE.txt",
16015
- version: "1.203.0",
16488
+ version: "1.204.0",
16016
16489
  repository: {
16017
16490
  type: "git",
16018
16491
  url: "https://github.com/UiPath/cli.git",
@@ -16045,6 +16518,7 @@ var package_default2 = {
16045
16518
  private: true,
16046
16519
  scripts: {
16047
16520
  build: "bun build ./src/index.ts --outdir dist --format esm --target node --sourcemap=linked && bun build ./perf-service-sdk/src/index.ts --outdir dist/perf-service-sdk --format esm --target node --sourcemap=linked && tsc -p tsconfig.build.json --noCheck",
16521
+ typecheck: "tsc --noEmit",
16048
16522
  generate: "bun run src/scripts/generate-sdk.ts",
16049
16523
  lint: "biome check .",
16050
16524
  test: "vitest run",
@@ -18345,6 +18819,26 @@ function UiPathTestManagementHubTestManagementAbstractionsDTOsOverrideParameters
18345
18819
  parameters: value["parameters"].map(UiPathTestManagementHubTestManagementAbstractionsDTOsOverrideParameterWithValueDtoToJSON)
18346
18820
  };
18347
18821
  }
18822
+ // ../test-manager-sdk/generated/src/models/UiPathTestManagementHubTestManagementAbstractionsDTOsProjectSettingsDto.ts
18823
+ function UiPathTestManagementHubTestManagementAbstractionsDTOsProjectSettingsDtoFromJSON(json) {
18824
+ return UiPathTestManagementHubTestManagementAbstractionsDTOsProjectSettingsDtoFromJSONTyped(json, false);
18825
+ }
18826
+ function UiPathTestManagementHubTestManagementAbstractionsDTOsProjectSettingsDtoFromJSONTyped(json, ignoreDiscriminator) {
18827
+ if (json == null) {
18828
+ return json;
18829
+ }
18830
+ return {
18831
+ id: json["id"] == null ? undefined : json["id"],
18832
+ projectId: json["projectId"] == null ? undefined : json["projectId"],
18833
+ projectPrefix: json["projectPrefix"] == null ? undefined : json["projectPrefix"],
18834
+ maxNumberOfTestSteps: json["maxNumberOfTestSteps"] == null ? undefined : json["maxNumberOfTestSteps"],
18835
+ projectTimeZone: json["projectTimeZone"] == null ? undefined : json["projectTimeZone"],
18836
+ executionNameFormat: json["executionNameFormat"] == null ? undefined : json["executionNameFormat"],
18837
+ folderKey: json["folderKey"] == null ? undefined : json["folderKey"],
18838
+ governanceEnabled: json["GovernanceEnabled"] == null ? undefined : json["GovernanceEnabled"],
18839
+ governanceSettings: json["GovernanceSettings"] == null ? undefined : json["GovernanceSettings"]
18840
+ };
18841
+ }
18348
18842
  // ../test-manager-sdk/generated/src/models/UiPathTestManagementHubTestManagementAbstractionsDTOsStartExecutionRequest.ts
18349
18843
  function UiPathTestManagementHubTestManagementAbstractionsDTOsStartExecutionRequestToJSON(json) {
18350
18844
  return UiPathTestManagementHubTestManagementAbstractionsDTOsStartExecutionRequestToJSONTyped(json, false);
@@ -18572,6 +19066,18 @@ function UiPathTestManagementHubTestManagementAbstractionsDTOsUpdateProjectReque
18572
19066
  isAuthorizationEnabled: value["isAuthorizationEnabled"]
18573
19067
  };
18574
19068
  }
19069
+ // ../test-manager-sdk/generated/src/models/UiPathTestManagementHubTestManagementAbstractionsDTOsUpdateProjectSettingsRequest.ts
19070
+ function UiPathTestManagementHubTestManagementAbstractionsDTOsUpdateProjectSettingsRequestToJSON(json) {
19071
+ return UiPathTestManagementHubTestManagementAbstractionsDTOsUpdateProjectSettingsRequestToJSONTyped(json, false);
19072
+ }
19073
+ function UiPathTestManagementHubTestManagementAbstractionsDTOsUpdateProjectSettingsRequestToJSONTyped(value, ignoreDiscriminator = false) {
19074
+ if (value == null) {
19075
+ return value;
19076
+ }
19077
+ return {
19078
+ projectTimeZone: value["projectTimeZone"]
19079
+ };
19080
+ }
18575
19081
  // ../test-manager-sdk/generated/src/models/UiPathTestManagementHubTestManagementAbstractionsDTOsUpdateRequirementRequest.ts
18576
19082
  function UiPathTestManagementHubTestManagementAbstractionsDTOsUpdateRequirementRequestToJSON(json) {
18577
19083
  return UiPathTestManagementHubTestManagementAbstractionsDTOsUpdateRequirementRequestToJSONTyped(json, false);
@@ -20408,13 +20914,12 @@ class ProjectSettingsApi extends BaseAPI {
20408
20914
  const response = await this.projectSettingsGetProjectFolderRaw(requestParameters, initOverrides);
20409
20915
  return await response.value();
20410
20916
  }
20411
- async projectSettingsUpdateProjectFolderRequestOpts(requestParameters) {
20917
+ async projectSettingsGetProjectSettingsRequestOpts(requestParameters) {
20412
20918
  if (requestParameters["projectId"] == null) {
20413
- throw new RequiredError("projectId", 'Required parameter "projectId" was null or undefined when calling projectSettingsUpdateProjectFolder().');
20919
+ throw new RequiredError("projectId", 'Required parameter "projectId" was null or undefined when calling projectSettingsGetProjectSettings().');
20414
20920
  }
20415
20921
  const queryParameters = {};
20416
20922
  const headerParameters = {};
20417
- headerParameters["Content-Type"] = "application/json";
20418
20923
  if (this.configuration && this.configuration.accessToken) {
20419
20924
  const token = this.configuration.accessToken;
20420
20925
  const tokenString = await token("Bearer", []);
@@ -20422,28 +20927,28 @@ class ProjectSettingsApi extends BaseAPI {
20422
20927
  headerParameters["Authorization"] = `Bearer ${tokenString}`;
20423
20928
  }
20424
20929
  }
20425
- let urlPath = `/api/v2/{projectId}/projectsettings/folder`;
20930
+ let urlPath = `/api/v2/{projectId}/projectsettings`;
20426
20931
  urlPath = urlPath.replace(`{${"projectId"}}`, encodeURIComponent(String(requestParameters["projectId"])));
20427
20932
  return {
20428
20933
  path: urlPath,
20429
- method: "PUT",
20934
+ method: "GET",
20430
20935
  headers: headerParameters,
20431
- query: queryParameters,
20432
- body: UiPathTestManagementHubTestManagementAbstractionsDTOsFolderKeyRequestModelToJSON(requestParameters["uiPathTestManagementHubTestManagementAbstractionsDTOsFolderKeyRequestModel"])
20936
+ query: queryParameters
20433
20937
  };
20434
20938
  }
20435
- async projectSettingsUpdateProjectFolderRaw(requestParameters, initOverrides) {
20436
- const requestOptions = await this.projectSettingsUpdateProjectFolderRequestOpts(requestParameters);
20939
+ async projectSettingsGetProjectSettingsRaw(requestParameters, initOverrides) {
20940
+ const requestOptions = await this.projectSettingsGetProjectSettingsRequestOpts(requestParameters);
20437
20941
  const response = await this.request(requestOptions, initOverrides);
20438
- return new VoidApiResponse(response);
20942
+ return new JSONApiResponse(response, (jsonValue) => UiPathTestManagementHubTestManagementAbstractionsDTOsProjectSettingsDtoFromJSON(jsonValue));
20439
20943
  }
20440
- async projectSettingsUpdateProjectFolder(requestParameters, initOverrides) {
20441
- await this.projectSettingsUpdateProjectFolderRaw(requestParameters, initOverrides);
20944
+ async projectSettingsGetProjectSettings(requestParameters, initOverrides) {
20945
+ const response = await this.projectSettingsGetProjectSettingsRaw(requestParameters, initOverrides);
20946
+ return await response.value();
20442
20947
  }
20443
- }
20444
- // ../test-manager-sdk/generated/src/apis/ProjectsApi.ts
20445
- class ProjectsApi extends BaseAPI {
20446
- async projectsCreateRequestOpts(requestParameters) {
20948
+ async projectSettingsPatchProjectSettingsRequestOpts(requestParameters) {
20949
+ if (requestParameters["projectId"] == null) {
20950
+ throw new RequiredError("projectId", 'Required parameter "projectId" was null or undefined when calling projectSettingsPatchProjectSettings().');
20951
+ }
20447
20952
  const queryParameters = {};
20448
20953
  const headerParameters = {};
20449
20954
  headerParameters["Content-Type"] = "application/json";
@@ -20454,30 +20959,31 @@ class ProjectsApi extends BaseAPI {
20454
20959
  headerParameters["Authorization"] = `Bearer ${tokenString}`;
20455
20960
  }
20456
20961
  }
20457
- let urlPath = `/api/v2/projects`;
20962
+ let urlPath = `/api/v2/{projectId}/projectsettings`;
20963
+ urlPath = urlPath.replace(`{${"projectId"}}`, encodeURIComponent(String(requestParameters["projectId"])));
20458
20964
  return {
20459
20965
  path: urlPath,
20460
- method: "POST",
20966
+ method: "PATCH",
20461
20967
  headers: headerParameters,
20462
20968
  query: queryParameters,
20463
- body: UiPathTestManagementHubTestManagementAbstractionsDTOsCreateProjectRequestToJSON(requestParameters["uiPathTestManagementHubTestManagementAbstractionsDTOsCreateProjectRequest"])
20969
+ body: requestParameters["microsoftAspNetCoreJsonPatchOperationsOperation"].map(MicrosoftAspNetCoreJsonPatchOperationsOperationToJSON)
20464
20970
  };
20465
20971
  }
20466
- async projectsCreateRaw(requestParameters, initOverrides) {
20467
- const requestOptions = await this.projectsCreateRequestOpts(requestParameters);
20972
+ async projectSettingsPatchProjectSettingsRaw(requestParameters, initOverrides) {
20973
+ const requestOptions = await this.projectSettingsPatchProjectSettingsRequestOpts(requestParameters);
20468
20974
  const response = await this.request(requestOptions, initOverrides);
20469
- return new JSONApiResponse(response, (jsonValue) => UiPathTestManagementHubTestManagementAbstractionsDTOsProjectDtoFromJSON(jsonValue));
20975
+ return new VoidApiResponse(response);
20470
20976
  }
20471
- async projectsCreate(requestParameters = {}, initOverrides) {
20472
- const response = await this.projectsCreateRaw(requestParameters, initOverrides);
20473
- return await response.value();
20977
+ async projectSettingsPatchProjectSettings(requestParameters, initOverrides) {
20978
+ await this.projectSettingsPatchProjectSettingsRaw(requestParameters, initOverrides);
20474
20979
  }
20475
- async projectsDeleteRequestOpts(requestParameters) {
20476
- if (requestParameters["id"] == null) {
20477
- throw new RequiredError("id", 'Required parameter "id" was null or undefined when calling projectsDelete().');
20980
+ async projectSettingsUpdateProjectFolderRequestOpts(requestParameters) {
20981
+ if (requestParameters["projectId"] == null) {
20982
+ throw new RequiredError("projectId", 'Required parameter "projectId" was null or undefined when calling projectSettingsUpdateProjectFolder().');
20478
20983
  }
20479
20984
  const queryParameters = {};
20480
20985
  const headerParameters = {};
20986
+ headerParameters["Content-Type"] = "application/json";
20481
20987
  if (this.configuration && this.configuration.accessToken) {
20482
20988
  const token = this.configuration.accessToken;
20483
20989
  const tokenString = await token("Bearer", []);
@@ -20485,26 +20991,121 @@ class ProjectsApi extends BaseAPI {
20485
20991
  headerParameters["Authorization"] = `Bearer ${tokenString}`;
20486
20992
  }
20487
20993
  }
20488
- let urlPath = `/api/v2/projects/{id}`;
20489
- urlPath = urlPath.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters["id"])));
20994
+ let urlPath = `/api/v2/{projectId}/projectsettings/folder`;
20995
+ urlPath = urlPath.replace(`{${"projectId"}}`, encodeURIComponent(String(requestParameters["projectId"])));
20490
20996
  return {
20491
20997
  path: urlPath,
20492
- method: "DELETE",
20998
+ method: "PUT",
20493
20999
  headers: headerParameters,
20494
- query: queryParameters
21000
+ query: queryParameters,
21001
+ body: UiPathTestManagementHubTestManagementAbstractionsDTOsFolderKeyRequestModelToJSON(requestParameters["uiPathTestManagementHubTestManagementAbstractionsDTOsFolderKeyRequestModel"])
20495
21002
  };
20496
21003
  }
20497
- async projectsDeleteRaw(requestParameters, initOverrides) {
20498
- const requestOptions = await this.projectsDeleteRequestOpts(requestParameters);
21004
+ async projectSettingsUpdateProjectFolderRaw(requestParameters, initOverrides) {
21005
+ const requestOptions = await this.projectSettingsUpdateProjectFolderRequestOpts(requestParameters);
20499
21006
  const response = await this.request(requestOptions, initOverrides);
20500
21007
  return new VoidApiResponse(response);
20501
21008
  }
20502
- async projectsDelete(requestParameters, initOverrides) {
20503
- await this.projectsDeleteRaw(requestParameters, initOverrides);
21009
+ async projectSettingsUpdateProjectFolder(requestParameters, initOverrides) {
21010
+ await this.projectSettingsUpdateProjectFolderRaw(requestParameters, initOverrides);
20504
21011
  }
20505
- async projectsGetByIdRequestOpts(requestParameters) {
20506
- if (requestParameters["id"] == null) {
20507
- throw new RequiredError("id", 'Required parameter "id" was null or undefined when calling projectsGetById().');
21012
+ async projectSettingsUpdateProjectSettingsRequestOpts(requestParameters) {
21013
+ if (requestParameters["projectId"] == null) {
21014
+ throw new RequiredError("projectId", 'Required parameter "projectId" was null or undefined when calling projectSettingsUpdateProjectSettings().');
21015
+ }
21016
+ const queryParameters = {};
21017
+ const headerParameters = {};
21018
+ headerParameters["Content-Type"] = "application/json";
21019
+ if (this.configuration && this.configuration.accessToken) {
21020
+ const token = this.configuration.accessToken;
21021
+ const tokenString = await token("Bearer", []);
21022
+ if (tokenString) {
21023
+ headerParameters["Authorization"] = `Bearer ${tokenString}`;
21024
+ }
21025
+ }
21026
+ let urlPath = `/api/v2/{projectId}/projectsettings`;
21027
+ urlPath = urlPath.replace(`{${"projectId"}}`, encodeURIComponent(String(requestParameters["projectId"])));
21028
+ return {
21029
+ path: urlPath,
21030
+ method: "PUT",
21031
+ headers: headerParameters,
21032
+ query: queryParameters,
21033
+ body: UiPathTestManagementHubTestManagementAbstractionsDTOsUpdateProjectSettingsRequestToJSON(requestParameters["uiPathTestManagementHubTestManagementAbstractionsDTOsUpdateProjectSettingsRequest"])
21034
+ };
21035
+ }
21036
+ async projectSettingsUpdateProjectSettingsRaw(requestParameters, initOverrides) {
21037
+ const requestOptions = await this.projectSettingsUpdateProjectSettingsRequestOpts(requestParameters);
21038
+ const response = await this.request(requestOptions, initOverrides);
21039
+ return new VoidApiResponse(response);
21040
+ }
21041
+ async projectSettingsUpdateProjectSettings(requestParameters, initOverrides) {
21042
+ await this.projectSettingsUpdateProjectSettingsRaw(requestParameters, initOverrides);
21043
+ }
21044
+ }
21045
+ // ../test-manager-sdk/generated/src/apis/ProjectsApi.ts
21046
+ class ProjectsApi extends BaseAPI {
21047
+ async projectsCreateRequestOpts(requestParameters) {
21048
+ const queryParameters = {};
21049
+ const headerParameters = {};
21050
+ headerParameters["Content-Type"] = "application/json";
21051
+ if (this.configuration && this.configuration.accessToken) {
21052
+ const token = this.configuration.accessToken;
21053
+ const tokenString = await token("Bearer", []);
21054
+ if (tokenString) {
21055
+ headerParameters["Authorization"] = `Bearer ${tokenString}`;
21056
+ }
21057
+ }
21058
+ let urlPath = `/api/v2/projects`;
21059
+ return {
21060
+ path: urlPath,
21061
+ method: "POST",
21062
+ headers: headerParameters,
21063
+ query: queryParameters,
21064
+ body: UiPathTestManagementHubTestManagementAbstractionsDTOsCreateProjectRequestToJSON(requestParameters["uiPathTestManagementHubTestManagementAbstractionsDTOsCreateProjectRequest"])
21065
+ };
21066
+ }
21067
+ async projectsCreateRaw(requestParameters, initOverrides) {
21068
+ const requestOptions = await this.projectsCreateRequestOpts(requestParameters);
21069
+ const response = await this.request(requestOptions, initOverrides);
21070
+ return new JSONApiResponse(response, (jsonValue) => UiPathTestManagementHubTestManagementAbstractionsDTOsProjectDtoFromJSON(jsonValue));
21071
+ }
21072
+ async projectsCreate(requestParameters = {}, initOverrides) {
21073
+ const response = await this.projectsCreateRaw(requestParameters, initOverrides);
21074
+ return await response.value();
21075
+ }
21076
+ async projectsDeleteRequestOpts(requestParameters) {
21077
+ if (requestParameters["id"] == null) {
21078
+ throw new RequiredError("id", 'Required parameter "id" was null or undefined when calling projectsDelete().');
21079
+ }
21080
+ const queryParameters = {};
21081
+ const headerParameters = {};
21082
+ if (this.configuration && this.configuration.accessToken) {
21083
+ const token = this.configuration.accessToken;
21084
+ const tokenString = await token("Bearer", []);
21085
+ if (tokenString) {
21086
+ headerParameters["Authorization"] = `Bearer ${tokenString}`;
21087
+ }
21088
+ }
21089
+ let urlPath = `/api/v2/projects/{id}`;
21090
+ urlPath = urlPath.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters["id"])));
21091
+ return {
21092
+ path: urlPath,
21093
+ method: "DELETE",
21094
+ headers: headerParameters,
21095
+ query: queryParameters
21096
+ };
21097
+ }
21098
+ async projectsDeleteRaw(requestParameters, initOverrides) {
21099
+ const requestOptions = await this.projectsDeleteRequestOpts(requestParameters);
21100
+ const response = await this.request(requestOptions, initOverrides);
21101
+ return new VoidApiResponse(response);
21102
+ }
21103
+ async projectsDelete(requestParameters, initOverrides) {
21104
+ await this.projectsDeleteRaw(requestParameters, initOverrides);
21105
+ }
21106
+ async projectsGetByIdRequestOpts(requestParameters) {
21107
+ if (requestParameters["id"] == null) {
21108
+ throw new RequiredError("id", 'Required parameter "id" was null or undefined when calling projectsGetById().');
20508
21109
  }
20509
21110
  const queryParameters = {};
20510
21111
  const headerParameters = {};
@@ -23715,7 +24316,7 @@ function calcPassRate(passed, total) {
23715
24316
  return total > 0 ? Math.round(passed / total * 1000) / 10 : 0;
23716
24317
  }
23717
24318
  var DEFAULT_TEST_CASE_VERSION = "1.0.0";
23718
- var TM_FORBIDDEN_MESSAGE = "Forbidden (403). Ensure the account has the required Test Manager permissions (TestExecution.Read, TestSet.Read, etc.).";
24319
+ var TM_FORBIDDEN_MESSAGE = "Forbidden (403). The account lacks the Test Manager permission for this operation, or the token carries no Test Manager (TM.*) scope. Run `uip login status --detailed` to see the token's scopes; an external application needs the TM scopes granted on the app itself.";
23719
24320
  var TM_LICENSED_USER_FORBIDDEN_MESSAGE = "Forbidden (403). This operation requires a Test Manager license. Contact your tenant admin to assign a license, or use a read-only command.";
23720
24321
  var TM_NOT_AVAILABLE_MESSAGE = "Test Manager is not enabled for this tenant.";
23721
24322
  var TM_NOT_AVAILABLE_INSTRUCTIONS = "Enable Test Manager for this tenant, or rerun the command against a tenant where Test Manager is already provisioned.";
@@ -24193,6 +24794,11 @@ var pickName = (claims) => {
24193
24794
  const username = asString(claims?.preferred_username);
24194
24795
  return asString(claims?.name) ?? (looksLikeEmail(username) ? undefined : username);
24195
24796
  };
24797
+ var pickScopes = (claims) => {
24798
+ const raw = claims?.scope;
24799
+ const scopes = Array.isArray(raw) ? raw.filter((entry) => asString(entry) !== undefined) : typeof raw === "string" ? raw.split(/\s+/).filter(Boolean) : [];
24800
+ return scopes.length > 0 ? scopes : undefined;
24801
+ };
24196
24802
  var resolveSessionIdentity = (accessToken, authFlow) => {
24197
24803
  const claims = accessToken ? decodeClaims(accessToken) : undefined;
24198
24804
  const email = pickEmail(claims);
@@ -24218,6 +24824,7 @@ var resolveSessionIdentity = (accessToken, authFlow) => {
24218
24824
  identity.clientId = clientId;
24219
24825
  return identity;
24220
24826
  };
24827
+ var readTokenScopes = (accessToken) => accessToken ? pickScopes(decodeClaims(accessToken)) : undefined;
24221
24828
 
24222
24829
  // ../auth/src/envAuth.ts
24223
24830
  var ENV_AUTH_ENABLE_VAR = "UIPATH_CLI_ENABLE_ENV_AUTH";
@@ -24290,6 +24897,7 @@ var readAuthFromEnv = () => {
24290
24897
  const expiration = getTokenExpiration(accessToken);
24291
24898
  const loginStatus = expiration && expiration <= new Date ? "Expired" : "Logged in";
24292
24899
  const identity = resolveSessionIdentity(accessToken);
24900
+ const scopes = readTokenScopes(accessToken);
24293
24901
  return {
24294
24902
  loginStatus,
24295
24903
  accessToken,
@@ -24300,7 +24908,8 @@ var readAuthFromEnv = () => {
24300
24908
  tenantId,
24301
24909
  expiration,
24302
24910
  source: "env-vars" /* EnvironmentVariables */,
24303
- ...identity ? { identity } : {}
24911
+ ...identity ? { identity } : {},
24912
+ ...scopes ? { scopes } : {}
24304
24913
  };
24305
24914
  };
24306
24915
 
@@ -24938,10 +25547,15 @@ async function buildFileStatus(tokens, credentials, globalHint) {
24938
25547
  }
24939
25548
  function identityFields(accessToken, credentials) {
24940
25549
  const identity = resolveSessionIdentity(accessToken, parseAuthFlow(credentials[AUTH_FLOW_ENV_VAR]));
24941
- return identity ? { identity } : {};
25550
+ const scopes = readTokenScopes(accessToken);
25551
+ return {
25552
+ ...identity ? { identity } : {},
25553
+ ...scopes ? { scopes } : {}
25554
+ };
24942
25555
  }
24943
25556
  function buildRobotStatus(robotCreds) {
24944
25557
  const identity = resolveSessionIdentity(robotCreds.accessToken);
25558
+ const scopes = readTokenScopes(robotCreds.accessToken);
24945
25559
  return {
24946
25560
  loginStatus: "Logged in",
24947
25561
  accessToken: robotCreds.accessToken,
@@ -24953,7 +25567,8 @@ function buildRobotStatus(robotCreds) {
24953
25567
  issuer: robotCreds.issuer,
24954
25568
  expiration: getTokenExpiration(robotCreds.accessToken),
24955
25569
  source: "robot" /* Robot */,
24956
- ...identity ? { identity } : {}
25570
+ ...identity ? { identity } : {},
25571
+ ...scopes ? { scopes } : {}
24957
25572
  };
24958
25573
  }
24959
25574
  var isFileNotFoundError = (error) => {
@@ -25220,7 +25835,8 @@ var getAuthContext = async (options = {}) => {
25220
25835
  organizationId: status.organizationId,
25221
25836
  organizationName: status.organizationName,
25222
25837
  tenantId: status.tenantId,
25223
- tenantName
25838
+ tenantName,
25839
+ identity: status.identity
25224
25840
  };
25225
25841
  };
25226
25842
  // ../auth/src/tenantSelection.ts
@@ -25274,13 +25890,15 @@ async function extractErrorDetails2(error, options) {
25274
25890
  return result;
25275
25891
  }
25276
25892
  async function emitTmFailure(error, exitCode = 1) {
25277
- const { message, details } = await extractErrorDetails2(error, {
25893
+ const { result, message, details, errorCode: errorCode2, retry } = await extractErrorDetails2(error, {
25278
25894
  forbiddenMessage: TM_FORBIDDEN_MESSAGE
25279
25895
  });
25280
25896
  OutputFormatter.error({
25281
- Result: RESULTS.Failure,
25897
+ Result: result,
25898
+ ErrorCode: errorCode2,
25282
25899
  Message: message,
25283
- Instructions: details
25900
+ Instructions: details,
25901
+ Retry: retry
25284
25902
  });
25285
25903
  processContext.exit(exitCode);
25286
25904
  }
@@ -29680,7 +30298,7 @@ var registerPackCommand = (program2) => {
29680
30298
  });
29681
30299
  };
29682
30300
 
29683
- // ../test-manager-sdk/dist/perf-service-sdk/index.js
30301
+ // ../test-manager-sdk/perf-service-sdk/generated/src/runtime.ts
29684
30302
  var BASE_PATH2 = "/{organizationId}/{tenantName}/testmanager_/performancetest".replace(/\/+$/, "");
29685
30303
 
29686
30304
  class Configuration2 {
@@ -29945,6 +30563,7 @@ class VoidApiResponse2 {
29945
30563
  return;
29946
30564
  }
29947
30565
  }
30566
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/AggregatedMetricData.ts
29948
30567
  function AggregatedMetricDataFromJSON(json) {
29949
30568
  return AggregatedMetricDataFromJSONTyped(json, false);
29950
30569
  }
@@ -29994,6 +30613,7 @@ function AggregatedMetricDataFromJSONTyped(json, ignoreDiscriminator) {
29994
30613
  failedWorkflowCount: json["failedWorkflowCount"] == null ? undefined : json["failedWorkflowCount"]
29995
30614
  };
29996
30615
  }
30616
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/AggregatedTransactionMetricData.ts
29997
30617
  function AggregatedTransactionMetricDataFromJSON(json) {
29998
30618
  return AggregatedTransactionMetricDataFromJSONTyped(json, false);
29999
30619
  }
@@ -30015,12 +30635,15 @@ function AggregatedTransactionMetricDataFromJSONTyped(json, ignoreDiscriminator)
30015
30635
  requestCount: json["requestCount"] == null ? undefined : json["requestCount"]
30016
30636
  };
30017
30637
  }
30638
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/LogSeverity.ts
30018
30639
  function LogSeverityFromJSON(json) {
30019
30640
  return LogSeverityFromJSONTyped(json, false);
30020
30641
  }
30021
30642
  function LogSeverityFromJSONTyped(json, ignoreDiscriminator) {
30022
30643
  return json;
30023
30644
  }
30645
+
30646
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/ApplicationLogDto.ts
30024
30647
  function ApplicationLogDtoFromJSON(json) {
30025
30648
  return ApplicationLogDtoFromJSONTyped(json, false);
30026
30649
  }
@@ -30039,12 +30662,14 @@ function ApplicationLogDtoFromJSONTyped(json, ignoreDiscriminator) {
30039
30662
  tenantId: json["tenantId"] == null ? undefined : json["tenantId"]
30040
30663
  };
30041
30664
  }
30665
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/ApplicationType.ts
30042
30666
  function ApplicationTypeFromJSON(json) {
30043
30667
  return ApplicationTypeFromJSONTyped(json, false);
30044
30668
  }
30045
30669
  function ApplicationTypeFromJSONTyped(json, ignoreDiscriminator) {
30046
30670
  return json;
30047
30671
  }
30672
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/RuntimeType.ts
30048
30673
  var RuntimeType = {
30049
30674
  NUMBER_0: 0,
30050
30675
  NUMBER_1: 1,
@@ -30061,6 +30686,8 @@ function RuntimeTypeFromJSONTyped(json, ignoreDiscriminator) {
30061
30686
  function RuntimeTypeToJSON(value) {
30062
30687
  return value;
30063
30688
  }
30689
+
30690
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/AutomationRuntimePairDto.ts
30064
30691
  function AutomationRuntimePairDtoToJSON(json) {
30065
30692
  return AutomationRuntimePairDtoToJSONTyped(json, false);
30066
30693
  }
@@ -30073,6 +30700,7 @@ function AutomationRuntimePairDtoToJSONTyped(value, ignoreDiscriminator = false)
30073
30700
  runtimeType: RuntimeTypeToJSON(value["runtimeType"])
30074
30701
  };
30075
30702
  }
30703
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/CumulatedValues.ts
30076
30704
  function CumulatedValuesFromJSON(json) {
30077
30705
  return CumulatedValuesFromJSONTyped(json, false);
30078
30706
  }
@@ -30092,6 +30720,7 @@ function CumulatedValuesFromJSONTyped(json, ignoreDiscriminator) {
30092
30720
  cumulativeFailedWorkflowCount: json["cumulativeFailedWorkflowCount"] == null ? undefined : json["cumulativeFailedWorkflowCount"]
30093
30721
  };
30094
30722
  }
30723
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/DryRunReportDto.ts
30095
30724
  function DryRunReportDtoFromJSON(json) {
30096
30725
  return DryRunReportDtoFromJSONTyped(json, false);
30097
30726
  }
@@ -30104,6 +30733,7 @@ function DryRunReportDtoFromJSONTyped(json, ignoreDiscriminator) {
30104
30733
  applicationType: json["applicationType"] == null ? undefined : ApplicationTypeFromJSON(json["applicationType"])
30105
30734
  };
30106
30735
  }
30736
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/DryRunReportEntryDto.ts
30107
30737
  function DryRunReportEntryDtoFromJSON(json) {
30108
30738
  return DryRunReportEntryDtoFromJSONTyped(json, false);
30109
30739
  }
@@ -30117,6 +30747,7 @@ function DryRunReportEntryDtoFromJSONTyped(json, ignoreDiscriminator) {
30117
30747
  report: json["report"] == null ? undefined : DryRunReportDtoFromJSON(json["report"])
30118
30748
  };
30119
30749
  }
30750
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/DryRunReportsDto.ts
30120
30751
  function DryRunReportsDtoFromJSON(json) {
30121
30752
  return DryRunReportsDtoFromJSONTyped(json, false);
30122
30753
  }
@@ -30129,6 +30760,7 @@ function DryRunReportsDtoFromJSONTyped(json, ignoreDiscriminator) {
30129
30760
  allReportsFound: json["allReportsFound"] == null ? undefined : json["allReportsFound"]
30130
30761
  };
30131
30762
  }
30763
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/DryRunReportsRequestDto.ts
30132
30764
  function DryRunReportsRequestDtoToJSON(json) {
30133
30765
  return DryRunReportsRequestDtoToJSONTyped(json, false);
30134
30766
  }
@@ -30141,6 +30773,7 @@ function DryRunReportsRequestDtoToJSONTyped(value, ignoreDiscriminator = false)
30141
30773
  automationRuntimePairs: value["automationRuntimePairs"] == null ? undefined : value["automationRuntimePairs"].map(AutomationRuntimePairDtoToJSON)
30142
30774
  };
30143
30775
  }
30776
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/ExecutionDataDto.ts
30144
30777
  function ExecutionDataDtoFromJSON(json) {
30145
30778
  return ExecutionDataDtoFromJSONTyped(json, false);
30146
30779
  }
@@ -30156,6 +30789,7 @@ function ExecutionDataDtoFromJSONTyped(json, ignoreDiscriminator) {
30156
30789
  aggregatedDataWithTransaction: json["aggregatedDataWithTransaction"] == null ? undefined : json["aggregatedDataWithTransaction"].map(AggregatedTransactionMetricDataFromJSON)
30157
30790
  };
30158
30791
  }
30792
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/GenerateComparisonReportRequest.ts
30159
30793
  function GenerateComparisonReportRequestToJSON(json) {
30160
30794
  return GenerateComparisonReportRequestToJSONTyped(json, false);
30161
30795
  }
@@ -30170,6 +30804,7 @@ function GenerateComparisonReportRequestToJSONTyped(value, ignoreDiscriminator =
30170
30804
  projectPrefix: value["projectPrefix"]
30171
30805
  };
30172
30806
  }
30807
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/GenerateReportRequest.ts
30173
30808
  function GenerateReportRequestToJSON(json) {
30174
30809
  return GenerateReportRequestToJSONTyped(json, false);
30175
30810
  }
@@ -30184,6 +30819,7 @@ function GenerateReportRequestToJSONTyped(value, ignoreDiscriminator = false) {
30184
30819
  projectPrefix: value["projectPrefix"]
30185
30820
  };
30186
30821
  }
30822
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/HarHeader.ts
30187
30823
  function HarHeaderFromJSON(json) {
30188
30824
  return HarHeaderFromJSONTyped(json, false);
30189
30825
  }
@@ -30196,6 +30832,7 @@ function HarHeaderFromJSONTyped(json, ignoreDiscriminator) {
30196
30832
  value: json["value"] == null ? undefined : json["value"]
30197
30833
  };
30198
30834
  }
30835
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/HttpErrorsGroup.ts
30199
30836
  function HttpErrorsGroupFromJSON(json) {
30200
30837
  return HttpErrorsGroupFromJSONTyped(json, false);
30201
30838
  }
@@ -30220,6 +30857,7 @@ function HttpErrorsGroupFromJSONTyped(json, ignoreDiscriminator) {
30220
30857
  remoteIpAddress: json["remoteIpAddress"] == null ? undefined : json["remoteIpAddress"]
30221
30858
  };
30222
30859
  }
30860
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/ScenarioDataDto.ts
30223
30861
  function ScenarioDataDtoFromJSON(json) {
30224
30862
  return ScenarioDataDtoFromJSONTyped(json, false);
30225
30863
  }
@@ -30232,6 +30870,7 @@ function ScenarioDataDtoFromJSONTyped(json, ignoreDiscriminator) {
30232
30870
  applicationLogs: json["applicationLogs"] == null ? undefined : json["applicationLogs"].map(ApplicationLogDtoFromJSON)
30233
30871
  };
30234
30872
  }
30873
+ // ../test-manager-sdk/perf-service-sdk/generated/src/models/StopPayload.ts
30235
30874
  function StopPayloadToJSON(json) {
30236
30875
  return StopPayloadToJSONTyped(json, false);
30237
30876
  }
@@ -30243,7 +30882,7 @@ function StopPayloadToJSONTyped(value, ignoreDiscriminator = false) {
30243
30882
  scenarioExecutionId: value["scenarioExecutionId"]
30244
30883
  };
30245
30884
  }
30246
-
30885
+ // ../test-manager-sdk/perf-service-sdk/generated/src/apis/ExecutionApi.ts
30247
30886
  class ExecutionApi extends BaseAPI2 {
30248
30887
  async executionGetAutomationErrorsGetRequestOpts(requestParameters) {
30249
30888
  const queryParameters = {};
@@ -30409,7 +31048,7 @@ class ExecutionApi extends BaseAPI2 {
30409
31048
  await this.executionStopExecutionPostRaw(requestParameters, initOverrides);
30410
31049
  }
30411
31050
  }
30412
-
31051
+ // ../test-manager-sdk/perf-service-sdk/generated/src/apis/PerformanceReportApi.ts
30413
31052
  class PerformanceReportApi extends BaseAPI2 {
30414
31053
  async performanceReportGenerateComparisonHtmlPostRequestOpts(requestParameters) {
30415
31054
  const queryParameters = {};
@@ -30454,7 +31093,6 @@ class PerformanceReportApi extends BaseAPI2 {
30454
31093
  await this.performanceReportGeneratePostRaw(requestParameters, initOverrides);
30455
31094
  }
30456
31095
  }
30457
-
30458
31096
  // src/mappers/input/perfscenario.input.ts
30459
31097
  function toCreateScenarioRequest(input) {
30460
31098
  return {
@@ -30725,7 +31363,7 @@ function applyQuery(data, query) {
30725
31363
  }
30726
31364
 
30727
31365
  // ../orchestrator-sdk/generated/src/runtime.ts
30728
- var BASE_PATH3 = "https://alpha.uipath.com/uipattycyrhx/abizon_1/orchestrator_".replace(/\/+$/, "");
31366
+ var BASE_PATH3 = "https://alpha.uipath.com/Ada/byoa/orchestrator_".replace(/\/+$/, "");
30729
31367
 
30730
31368
  class Configuration3 {
30731
31369
  configuration;
@@ -30987,7 +31625,7 @@ var package_default3 = {
30987
31625
  name: "@uipath/orchestrator-sdk",
30988
31626
  author: "UiPath",
30989
31627
  license: "SEE LICENSE IN LICENSE.txt",
30990
- version: "1.203.0",
31628
+ version: "1.204.0",
30991
31629
  repository: {
30992
31630
  type: "git",
30993
31631
  url: "https://github.com/UiPath/cli.git",
@@ -31081,6 +31719,97 @@ function BaseRoleDtoFromJSONTyped(json, ignoreDiscriminator) {
31081
31719
  id: json["Id"] == null ? undefined : json["Id"]
31082
31720
  };
31083
31721
  }
31722
+ // ../orchestrator-sdk/generated/src/models/CredentialStoreAssignmentsDto.ts
31723
+ function CredentialStoreAssignmentsDtoToJSON(json) {
31724
+ return CredentialStoreAssignmentsDtoToJSONTyped(json, false);
31725
+ }
31726
+ function CredentialStoreAssignmentsDtoToJSONTyped(value, ignoreDiscriminator = false) {
31727
+ if (value == null) {
31728
+ return value;
31729
+ }
31730
+ return {
31731
+ CredentialStoreIds: value["credentialStoreIds"],
31732
+ FolderIds: value["folderIds"]
31733
+ };
31734
+ }
31735
+ // ../orchestrator-sdk/generated/src/models/CredentialStoreDetailsDto.ts
31736
+ function CredentialStoreDetailsDtoFromJSON(json) {
31737
+ return CredentialStoreDetailsDtoFromJSONTyped(json, false);
31738
+ }
31739
+ function CredentialStoreDetailsDtoFromJSONTyped(json, ignoreDiscriminator) {
31740
+ if (json == null) {
31741
+ return json;
31742
+ }
31743
+ return {
31744
+ isReadOnly: json["IsReadOnly"] == null ? undefined : json["IsReadOnly"]
31745
+ };
31746
+ }
31747
+ // ../orchestrator-sdk/generated/src/models/DefaultCredentialStoreDto.ts
31748
+ function DefaultCredentialStoreDtoFromJSON(json) {
31749
+ return DefaultCredentialStoreDtoFromJSONTyped(json, false);
31750
+ }
31751
+ function DefaultCredentialStoreDtoFromJSONTyped(json, ignoreDiscriminator) {
31752
+ if (json == null) {
31753
+ return json;
31754
+ }
31755
+ return {
31756
+ resourceType: json["ResourceType"],
31757
+ id: json["Id"] == null ? undefined : json["Id"]
31758
+ };
31759
+ }
31760
+ // ../orchestrator-sdk/generated/src/models/CredentialStoreFolderAccessDto.ts
31761
+ function CredentialStoreFolderAccessDtoFromJSON(json) {
31762
+ return CredentialStoreFolderAccessDtoFromJSONTyped(json, false);
31763
+ }
31764
+ function CredentialStoreFolderAccessDtoFromJSONTyped(json, ignoreDiscriminator) {
31765
+ if (json == null) {
31766
+ return json;
31767
+ }
31768
+ return {
31769
+ isAssignedToFolder: json["isAssignedToFolder"] == null ? undefined : json["isAssignedToFolder"],
31770
+ isInherited: json["isInherited"] == null ? undefined : json["isInherited"],
31771
+ isAccessibleFromTenant: json["isAccessibleFromTenant"] == null ? undefined : json["isAccessibleFromTenant"],
31772
+ inheritedFromFolderName: json["inheritedFromFolderName"] == null ? undefined : json["inheritedFromFolderName"]
31773
+ };
31774
+ }
31775
+ // ../orchestrator-sdk/generated/src/models/CredentialStoreFolderDto.ts
31776
+ function CredentialStoreFolderDtoFromJSON(json) {
31777
+ return CredentialStoreFolderDtoFromJSONTyped(json, false);
31778
+ }
31779
+ function CredentialStoreFolderDtoFromJSONTyped(json, ignoreDiscriminator) {
31780
+ if (json == null) {
31781
+ return json;
31782
+ }
31783
+ return {
31784
+ folderId: json["FolderId"] == null ? undefined : json["FolderId"],
31785
+ accessSources: json["AccessSources"] == null ? undefined : json["AccessSources"].map(CredentialStoreFolderAccessDtoFromJSON),
31786
+ key: json["Key"] == null ? undefined : json["Key"],
31787
+ proxyId: json["ProxyId"] == null ? undefined : json["ProxyId"],
31788
+ proxyType: json["ProxyType"] == null ? undefined : json["ProxyType"],
31789
+ hostName: json["HostName"] == null ? undefined : json["HostName"],
31790
+ name: json["Name"],
31791
+ type: json["Type"],
31792
+ additionalConfiguration: json["AdditionalConfiguration"] == null ? undefined : json["AdditionalConfiguration"],
31793
+ details: json["Details"] == null ? undefined : CredentialStoreDetailsDtoFromJSON(json["Details"]),
31794
+ defaultCredentialStores: json["DefaultCredentialStores"] == null ? undefined : json["DefaultCredentialStores"].map(DefaultCredentialStoreDtoFromJSON),
31795
+ restrictToFolders: json["RestrictToFolders"] == null ? undefined : json["RestrictToFolders"],
31796
+ id: json["Id"] == null ? undefined : json["Id"]
31797
+ };
31798
+ }
31799
+ // ../orchestrator-sdk/generated/src/models/CredentialStoresFolderAssociationsDto.ts
31800
+ function CredentialStoresFolderAssociationsDtoToJSON(json) {
31801
+ return CredentialStoresFolderAssociationsDtoToJSONTyped(json, false);
31802
+ }
31803
+ function CredentialStoresFolderAssociationsDtoToJSONTyped(value, ignoreDiscriminator = false) {
31804
+ if (value == null) {
31805
+ return value;
31806
+ }
31807
+ return {
31808
+ FolderId: value["folderId"],
31809
+ AddedCredentialStoreIds: value["addedCredentialStoreIds"],
31810
+ RemovedCredentialStoreIds: value["removedCredentialStoreIds"]
31811
+ };
31812
+ }
31084
31813
  // ../orchestrator-sdk/generated/src/models/CurrentUserFolderDto.ts
31085
31814
  function CurrentUserFolderDtoFromJSON(json) {
31086
31815
  return CurrentUserFolderDtoFromJSONTyped(json, false);
@@ -31364,6 +32093,18 @@ function FolderFromJSONTyped(json, ignoreDiscriminator) {
31364
32093
  isDeleted: json["isDeleted"] == null ? undefined : json["isDeleted"]
31365
32094
  };
31366
32095
  }
32096
+ // ../orchestrator-sdk/generated/src/models/FolderAssignCredentialStoresRequest.ts
32097
+ function FolderAssignCredentialStoresRequestToJSON(json) {
32098
+ return FolderAssignCredentialStoresRequestToJSONTyped(json, false);
32099
+ }
32100
+ function FolderAssignCredentialStoresRequestToJSONTyped(value, ignoreDiscriminator = false) {
32101
+ if (value == null) {
32102
+ return value;
32103
+ }
32104
+ return {
32105
+ assignments: CredentialStoreAssignmentsDtoToJSON(value["assignments"])
32106
+ };
32107
+ }
31367
32108
  // ../orchestrator-sdk/generated/src/models/FolderAssignDomainUserRequest.ts
31368
32109
  function FolderAssignDomainUserRequestToJSON(json) {
31369
32110
  return FolderAssignDomainUserRequestToJSONTyped(json, false);
@@ -31556,6 +32297,8 @@ function MachineFolderDtoFromJSONTyped(json, ignoreDiscriminator) {
31556
32297
  appTestSlots: json["AppTestSlots"] == null ? undefined : json["AppTestSlots"],
31557
32298
  performanceTestSlots: json["PerformanceTestSlots"] == null ? undefined : json["PerformanceTestSlots"],
31558
32299
  agentSlots: json["AgentSlots"] == null ? undefined : json["AgentSlots"],
32300
+ functionSlots: json["FunctionSlots"] == null ? undefined : json["FunctionSlots"],
32301
+ executionOptions: json["ExecutionOptions"] == null ? undefined : json["ExecutionOptions"],
31559
32302
  automationCloudSlots: json["AutomationCloudSlots"] == null ? undefined : json["AutomationCloudSlots"],
31560
32303
  automationCloudTestAutomationSlots: json["AutomationCloudTestAutomationSlots"] == null ? undefined : json["AutomationCloudTestAutomationSlots"],
31561
32304
  key: json["Key"] == null ? undefined : json["Key"],
@@ -31609,6 +32352,18 @@ function MoveFolderMachineChangeFromJSONTyped(json, ignoreDiscriminator) {
31609
32352
  newMachineFolderState: json["NewMachineFolderState"] == null ? undefined : json["NewMachineFolderState"]
31610
32353
  };
31611
32354
  }
32355
+ // ../orchestrator-sdk/generated/src/models/ODataValueOfIEnumerableOfCredentialStoreFolderDto.ts
32356
+ function ODataValueOfIEnumerableOfCredentialStoreFolderDtoFromJSON(json) {
32357
+ return ODataValueOfIEnumerableOfCredentialStoreFolderDtoFromJSONTyped(json, false);
32358
+ }
32359
+ function ODataValueOfIEnumerableOfCredentialStoreFolderDtoFromJSONTyped(json, ignoreDiscriminator) {
32360
+ if (json == null) {
32361
+ return json;
32362
+ }
32363
+ return {
32364
+ value: json["value"] == null ? undefined : json["value"].map(CredentialStoreFolderDtoFromJSON)
32365
+ };
32366
+ }
31612
32367
  // ../orchestrator-sdk/generated/src/models/ODataValueOfIEnumerableOfExtendedFolderDto.ts
31613
32368
  function ODataValueOfIEnumerableOfExtendedFolderDtoFromJSON(json) {
31614
32369
  return ODataValueOfIEnumerableOfExtendedFolderDtoFromJSONTyped(json, false);
@@ -31817,9 +32572,22 @@ function PersonalWorkspaceFolderFromJSONTyped(json, ignoreDiscriminator) {
31817
32572
  return {
31818
32573
  id: json["id"] == null ? undefined : json["id"],
31819
32574
  key: json["key"] == null ? undefined : json["key"],
32575
+ parentKey: json["parentKey"] == null ? undefined : json["parentKey"],
31820
32576
  fullyQualifiedName: json["fullyQualifiedName"] == null ? undefined : json["fullyQualifiedName"]
31821
32577
  };
31822
32578
  }
32579
+ // ../orchestrator-sdk/generated/src/models/RemoveCredentialStoresFromFolderRequest.ts
32580
+ function RemoveCredentialStoresFromFolderRequestToJSON(json) {
32581
+ return RemoveCredentialStoresFromFolderRequestToJSONTyped(json, false);
32582
+ }
32583
+ function RemoveCredentialStoresFromFolderRequestToJSONTyped(value, ignoreDiscriminator = false) {
32584
+ if (value == null) {
32585
+ return value;
32586
+ }
32587
+ return {
32588
+ credentialStoreIds: value["credentialStoreIds"]
32589
+ };
32590
+ }
31823
32591
  // ../orchestrator-sdk/generated/src/models/RemoveMachinesFromFolderRequest.ts
31824
32592
  function RemoveMachinesFromFolderRequestToJSON(json) {
31825
32593
  return RemoveMachinesFromFolderRequestToJSONTyped(json, false);
@@ -31896,6 +32664,18 @@ function RootFolderDtoFromJSONTyped(json, ignoreDiscriminator) {
31896
32664
  key: json["key"] == null ? undefined : json["key"]
31897
32665
  };
31898
32666
  }
32667
+ // ../orchestrator-sdk/generated/src/models/UpdateCredentialStoresToFolderAssociationsRequest.ts
32668
+ function UpdateCredentialStoresToFolderAssociationsRequestToJSON(json) {
32669
+ return UpdateCredentialStoresToFolderAssociationsRequestToJSONTyped(json, false);
32670
+ }
32671
+ function UpdateCredentialStoresToFolderAssociationsRequestToJSONTyped(value, ignoreDiscriminator = false) {
32672
+ if (value == null) {
32673
+ return value;
32674
+ }
32675
+ return {
32676
+ associations: CredentialStoresFolderAssociationsDtoToJSON(value["associations"])
32677
+ };
32678
+ }
31899
32679
  // ../orchestrator-sdk/generated/src/models/UpdateMachinesToFolderAssociationsRequest.ts
31900
32680
  function UpdateMachinesToFolderAssociationsRequestToJSON(json) {
31901
32681
  return UpdateMachinesToFolderAssociationsRequestToJSONTyped(json, false);
@@ -31925,6 +32705,26 @@ function UserRoleAssignmentsDtoFromJSONTyped(json, ignoreDiscriminator) {
31925
32705
  }
31926
32706
  // ../orchestrator-sdk/generated/src/apis/FoldersApi.ts
31927
32707
  class FoldersApi extends BaseAPI3 {
32708
+ async foldersAssignCredentialStoresRaw(requestParameters, initOverrides) {
32709
+ const queryParameters = {};
32710
+ const headerParameters = {};
32711
+ headerParameters["Content-Type"] = "application/json;odata.metadata=minimal;odata.streaming=true";
32712
+ if (this.configuration && this.configuration.accessToken) {
32713
+ headerParameters["Authorization"] = await this.configuration.accessToken("OAuth2", []);
32714
+ }
32715
+ let urlPath = `/odata/Folders/UiPath.Server.Configuration.OData.AssignCredentialStores`;
32716
+ const response = await this.request({
32717
+ path: urlPath,
32718
+ method: "POST",
32719
+ headers: headerParameters,
32720
+ query: queryParameters,
32721
+ body: FolderAssignCredentialStoresRequestToJSON(requestParameters["body"])
32722
+ }, initOverrides);
32723
+ return new VoidApiResponse3(response);
32724
+ }
32725
+ async foldersAssignCredentialStores(requestParameters = {}, initOverrides) {
32726
+ await this.foldersAssignCredentialStoresRaw(requestParameters, initOverrides);
32727
+ }
31928
32728
  async foldersAssignDirectoryUserRaw(requestParameters, initOverrides) {
31929
32729
  const queryParameters = {};
31930
32730
  const headerParameters = {};
@@ -32314,6 +33114,50 @@ class FoldersApi extends BaseAPI3 {
32314
33114
  const response = await this.foldersGetByKeyByIdentifierRaw(requestParameters, initOverrides);
32315
33115
  return await response.value();
32316
33116
  }
33117
+ async foldersGetCredentialStoresForFolderByKeyRaw(requestParameters, initOverrides) {
33118
+ if (requestParameters["key"] == null) {
33119
+ throw new RequiredError3("key", 'Required parameter "key" was null or undefined when calling foldersGetCredentialStoresForFolderByKey().');
33120
+ }
33121
+ const queryParameters = {};
33122
+ if (requestParameters["$select"] != null) {
33123
+ queryParameters["$select"] = requestParameters["$select"];
33124
+ }
33125
+ if (requestParameters["$expand"] != null) {
33126
+ queryParameters["$expand"] = requestParameters["$expand"];
33127
+ }
33128
+ if (requestParameters["$filter"] != null) {
33129
+ queryParameters["$filter"] = requestParameters["$filter"];
33130
+ }
33131
+ if (requestParameters["$orderby"] != null) {
33132
+ queryParameters["$orderby"] = requestParameters["$orderby"];
33133
+ }
33134
+ if (requestParameters["$top"] != null) {
33135
+ queryParameters["$top"] = requestParameters["$top"];
33136
+ }
33137
+ if (requestParameters["$skip"] != null) {
33138
+ queryParameters["$skip"] = requestParameters["$skip"];
33139
+ }
33140
+ if (requestParameters["$count"] != null) {
33141
+ queryParameters["$count"] = requestParameters["$count"];
33142
+ }
33143
+ const headerParameters = {};
33144
+ if (this.configuration && this.configuration.accessToken) {
33145
+ headerParameters["Authorization"] = await this.configuration.accessToken("OAuth2", []);
33146
+ }
33147
+ let urlPath = `/odata/Folders/UiPath.Server.Configuration.OData.GetCredentialStoresForFolder(key={key})`;
33148
+ urlPath = urlPath.replace(`{${"key"}}`, encodeURIComponent(String(requestParameters["key"])));
33149
+ const response = await this.request({
33150
+ path: urlPath,
33151
+ method: "GET",
33152
+ headers: headerParameters,
33153
+ query: queryParameters
33154
+ }, initOverrides);
33155
+ return new JSONApiResponse3(response, (jsonValue) => ODataValueOfIEnumerableOfCredentialStoreFolderDtoFromJSON(jsonValue));
33156
+ }
33157
+ async foldersGetCredentialStoresForFolderByKey(requestParameters, initOverrides) {
33158
+ const response = await this.foldersGetCredentialStoresForFolderByKeyRaw(requestParameters, initOverrides);
33159
+ return await response.value();
33160
+ }
32317
33161
  async foldersGetEntitiesSummaryByFolderidRaw(requestParameters, initOverrides) {
32318
33162
  if (requestParameters["folderId"] == null) {
32319
33163
  throw new RequiredError3("folderId", 'Required parameter "folderId" was null or undefined when calling foldersGetEntitiesSummaryByFolderid().');
@@ -32960,6 +33804,30 @@ class FoldersApi extends BaseAPI3 {
32960
33804
  const response = await this.foldersPutByIdRaw(requestParameters, initOverrides);
32961
33805
  return await response.value();
32962
33806
  }
33807
+ async foldersRemoveCredentialStoresFromFolderByIdRaw(requestParameters, initOverrides) {
33808
+ if (requestParameters["key"] == null) {
33809
+ throw new RequiredError3("key", 'Required parameter "key" was null or undefined when calling foldersRemoveCredentialStoresFromFolderById().');
33810
+ }
33811
+ const queryParameters = {};
33812
+ const headerParameters = {};
33813
+ headerParameters["Content-Type"] = "application/json;odata.metadata=minimal;odata.streaming=true";
33814
+ if (this.configuration && this.configuration.accessToken) {
33815
+ headerParameters["Authorization"] = await this.configuration.accessToken("OAuth2", []);
33816
+ }
33817
+ let urlPath = `/odata/Folders({key})/UiPath.Server.Configuration.OData.RemoveCredentialStoresFromFolder`;
33818
+ urlPath = urlPath.replace(`{${"key"}}`, encodeURIComponent(String(requestParameters["key"])));
33819
+ const response = await this.request({
33820
+ path: urlPath,
33821
+ method: "POST",
33822
+ headers: headerParameters,
33823
+ query: queryParameters,
33824
+ body: RemoveCredentialStoresFromFolderRequestToJSON(requestParameters["body"])
33825
+ }, initOverrides);
33826
+ return new VoidApiResponse3(response);
33827
+ }
33828
+ async foldersRemoveCredentialStoresFromFolderById(requestParameters, initOverrides) {
33829
+ await this.foldersRemoveCredentialStoresFromFolderByIdRaw(requestParameters, initOverrides);
33830
+ }
32963
33831
  async foldersRemoveMachinesFromFolderByIdRaw(requestParameters, initOverrides) {
32964
33832
  if (requestParameters["key"] == null) {
32965
33833
  throw new RequiredError3("key", 'Required parameter "key" was null or undefined when calling foldersRemoveMachinesFromFolderById().');
@@ -33072,6 +33940,26 @@ class FoldersApi extends BaseAPI3 {
33072
33940
  async foldersToggleFolderMachineInherit(requestParameters = {}, initOverrides) {
33073
33941
  await this.foldersToggleFolderMachineInheritRaw(requestParameters, initOverrides);
33074
33942
  }
33943
+ async foldersUpdateCredentialStoresToFolderAssociationsRaw(requestParameters, initOverrides) {
33944
+ const queryParameters = {};
33945
+ const headerParameters = {};
33946
+ headerParameters["Content-Type"] = "application/json;odata.metadata=minimal;odata.streaming=true";
33947
+ if (this.configuration && this.configuration.accessToken) {
33948
+ headerParameters["Authorization"] = await this.configuration.accessToken("OAuth2", []);
33949
+ }
33950
+ let urlPath = `/odata/Folders/UiPath.Server.Configuration.OData.UpdateCredentialStoresToFolderAssociations`;
33951
+ const response = await this.request({
33952
+ path: urlPath,
33953
+ method: "POST",
33954
+ headers: headerParameters,
33955
+ query: queryParameters,
33956
+ body: UpdateCredentialStoresToFolderAssociationsRequestToJSON(requestParameters["body"])
33957
+ }, initOverrides);
33958
+ return new VoidApiResponse3(response);
33959
+ }
33960
+ async foldersUpdateCredentialStoresToFolderAssociations(requestParameters = {}, initOverrides) {
33961
+ await this.foldersUpdateCredentialStoresToFolderAssociationsRaw(requestParameters, initOverrides);
33962
+ }
33075
33963
  async foldersUpdateMachinesToFolderAssociationsRaw(requestParameters, initOverrides) {
33076
33964
  const queryParameters = {};
33077
33965
  const headerParameters = {};
@@ -33122,6 +34010,12 @@ async function createApiClient(ApiClass, options) {
33122
34010
  const config = await createOrchestratorConfig(options);
33123
34011
  return new ApiClass(config);
33124
34012
  }
34013
+ // ../orchestrator-sdk/src/knowledge-bundles.ts
34014
+ var KB_INLINE_LIMITS = {
34015
+ maxObjectBytes: 16 * 1024 * 1024,
34016
+ maxBodyBytes: 100 * 1024 * 1024,
34017
+ maxParts: 1e4
34018
+ };
33125
34019
  // src/commands/perf-scenario-manage.ts
33126
34020
  var ROBOT_TYPE_TO_RUNTIME_TYPE = {
33127
34021
  standard: RuntimeType.NUMBER_0,
@@ -34230,6 +35124,24 @@ function toClearProjectFolderRequest(projectId) {
34230
35124
  uiPathTestManagementHubTestManagementAbstractionsDTOsFolderKeyRequestModel: { folderKey: null }
34231
35125
  };
34232
35126
  }
35127
+ function toUpdateProjectSettingsRequest(projectId, projectTimeZone) {
35128
+ return {
35129
+ projectId,
35130
+ uiPathTestManagementHubTestManagementAbstractionsDTOsUpdateProjectSettingsRequest: { projectTimeZone }
35131
+ };
35132
+ }
35133
+ function toPatchExecutionNameFormatRequest(projectId, executionNameFormat) {
35134
+ return {
35135
+ projectId,
35136
+ microsoftAspNetCoreJsonPatchOperationsOperation: [
35137
+ {
35138
+ op: "replace",
35139
+ path: "/executionNameFormat",
35140
+ value: executionNameFormat
35141
+ }
35142
+ ]
35143
+ };
35144
+ }
34233
35145
 
34234
35146
  // src/mappers/output/user.output.ts
34235
35147
  function toOutput4(user) {
@@ -34280,6 +35192,19 @@ function toOwnersRow(projectKey, projectId, owners) {
34280
35192
  Owners: (owners ?? []).map(toDirectoryUserOutput)
34281
35193
  };
34282
35194
  }
35195
+ function toSettingsRow(s) {
35196
+ return {
35197
+ Id: s.id ?? "",
35198
+ ProjectId: s.projectId ?? "",
35199
+ ProjectKey: s.projectPrefix ?? "",
35200
+ TimeZone: s.projectTimeZone ?? null,
35201
+ ExecutionNameFormat: s.executionNameFormat ?? null,
35202
+ MaxNumberOfTestSteps: s.maxNumberOfTestSteps ?? null,
35203
+ FolderKey: s.folderKey ?? null,
35204
+ GovernanceEnabled: s.governanceEnabled ?? false,
35205
+ GovernanceSettings: s.governanceSettings ?? null
35206
+ };
35207
+ }
34283
35208
 
34284
35209
  // src/commands/project.ts
34285
35210
  var PROJECT_LIST_EXAMPLES = [
@@ -34459,6 +35384,86 @@ var PROJECT_LIST_OWNERS_EXAMPLES = [
34459
35384
  }
34460
35385
  }
34461
35386
  ];
35387
+ var PROJECT_SETTINGS_GET_EXAMPLES = [
35388
+ {
35389
+ Description: "Read a project's settings",
35390
+ Command: "uip tm project settings get --project-key DEMO",
35391
+ Output: {
35392
+ Code: "ProjectSettingsGet",
35393
+ Data: {
35394
+ Id: "d1e2f3a4-0000-0000-0000-000000000001",
35395
+ ProjectId: "a1b2c3d4-0000-0000-0000-000000000001",
35396
+ ProjectKey: "DEMO",
35397
+ TimeZone: "Europe/Bucharest",
35398
+ ExecutionNameFormat: "{Execution.Type} - {TestSet.Name} - {Execution.StartTime|yyyyMMdd.HHmmss}",
35399
+ MaxNumberOfTestSteps: 250,
35400
+ FolderKey: null,
35401
+ GovernanceEnabled: false,
35402
+ GovernanceSettings: null
35403
+ }
35404
+ }
35405
+ }
35406
+ ];
35407
+ var PROJECT_SETTINGS_UPDATE_EXAMPLES = [
35408
+ {
35409
+ Description: "Set the project time zone (IANA name)",
35410
+ Command: "uip tm project settings update --project-id a1b2c3d4-0000-0000-0000-000000000001 --time-zone Europe/Bucharest",
35411
+ Output: {
35412
+ Code: "ProjectSettingsUpdate",
35413
+ Data: {
35414
+ ProjectId: "a1b2c3d4-0000-0000-0000-000000000001",
35415
+ TimeZone: "Europe/Bucharest",
35416
+ Result: "Updated"
35417
+ }
35418
+ }
35419
+ },
35420
+ {
35421
+ Description: "Change how test execution names are built, and the time zone, in one call",
35422
+ Command: 'uip tm project settings update --project-key DEMO --time-zone UTC --execution-name-format "{TestSet.Name} - {Execution.StartTime|yyyyMMdd}"',
35423
+ Output: {
35424
+ Code: "ProjectSettingsUpdate",
35425
+ Data: {
35426
+ ProjectId: "a1b2c3d4-0000-0000-0000-000000000001",
35427
+ ProjectKey: "DEMO",
35428
+ TimeZone: "UTC",
35429
+ ExecutionNameFormat: "{TestSet.Name} - {Execution.StartTime|yyyyMMdd}",
35430
+ Result: "Updated"
35431
+ }
35432
+ }
35433
+ }
35434
+ ];
35435
+ async function applyProjectTimeZoneAsync(settingsApi, projectId, timeZone) {
35436
+ const [error] = await catchError(settingsApi.projectSettingsUpdateProjectSettings(toUpdateProjectSettingsRequest(projectId, timeZone)));
35437
+ if (!error)
35438
+ return true;
35439
+ const { message, details, errorCode: errorCode2 } = await extractErrorDetails2(error, {
35440
+ forbiddenMessage: TM_FORBIDDEN_MESSAGE
35441
+ });
35442
+ const hint = errorCode2 === "invalid_argument" ? " Time zones are IANA names, not Windows ones — 'Europe/Bucharest', not 'Romance Standard Time'." : "";
35443
+ OutputFormatter.error({
35444
+ Result: RESULTS.Failure,
35445
+ Message: message,
35446
+ Instructions: `${details}${hint}`
35447
+ });
35448
+ processContext.exit(1);
35449
+ return false;
35450
+ }
35451
+ async function applyExecutionNameFormatAsync(settingsApi, projectId, executionNameFormat, timeZoneApplied) {
35452
+ const [error] = await catchError(settingsApi.projectSettingsPatchProjectSettings(toPatchExecutionNameFormatRequest(projectId, executionNameFormat)));
35453
+ if (!error)
35454
+ return true;
35455
+ const { message, details } = await extractErrorDetails2(error, {
35456
+ forbiddenMessage: TM_FORBIDDEN_MESSAGE
35457
+ });
35458
+ const applied = timeZoneApplied !== undefined ? ` The time zone was already updated to '${timeZoneApplied}'; only the execution name format failed.` : "";
35459
+ OutputFormatter.error({
35460
+ Result: RESULTS.Failure,
35461
+ Message: `${message}${applied}`,
35462
+ Instructions: details
35463
+ });
35464
+ processContext.exit(1);
35465
+ return false;
35466
+ }
34462
35467
  var registerProjectCommand = (program2) => {
34463
35468
  const projectCmd = program2.command("project").description("Manage Test Manager projects");
34464
35469
  projectCmd.command("list").description("List Test Manager projects.").option("--filter <text>", "Filter projects by name").option("--limit <number>", "Number of results per page (default: 50)").option("--offset <number>", "Number of results to skip (default: 0)").addOption(createHiddenDeprecatedTenantOption("-t, --tenant <tenant-name>")).option("--log-level <level>", "Log verbosity: debug, info, warn, error", "Information").examples(PROJECT_LIST_EXAMPLES).trackedAction(processContext, async (options) => {
@@ -34727,6 +35732,62 @@ var registerProjectCommand = (program2) => {
34727
35732
  }
34728
35733
  OutputFormatter.success(new SuccessOutput("ProjectOwnersList", rows));
34729
35734
  });
35735
+ const projectSettingsCmd = projectCmd.command("settings").description("Read and update Test Manager project settings");
35736
+ projectSettingsCmd.command("get").description("Show the settings of a Test Manager project.").addOption(projectKeyOption()).addOption(projectIdOption()).addOption(createHiddenDeprecatedTenantOption("-t, --tenant <tenant-name>")).option("--log-level <level>", "Log verbosity: debug, info, warn, error", "Information").examples(PROJECT_SETTINGS_GET_EXAMPLES).trackedAction(processContext, async (options) => {
35737
+ const ctx = await resolveContextWithProject(options);
35738
+ if (!ctx)
35739
+ return;
35740
+ const { tmConfig, projectId } = ctx;
35741
+ const [error, settings] = await catchError(new ProjectSettingsApi(tmConfig).projectSettingsGetProjectSettings({ projectId }));
35742
+ if (error) {
35743
+ const { message, details } = await extractErrorDetails2(error, {
35744
+ forbiddenMessage: TM_FORBIDDEN_MESSAGE
35745
+ });
35746
+ OutputFormatter.error({
35747
+ Result: RESULTS.Failure,
35748
+ Message: message,
35749
+ Instructions: details
35750
+ });
35751
+ processContext.exit(1);
35752
+ return;
35753
+ }
35754
+ OutputFormatter.success(new SuccessOutput("ProjectSettingsGet", toSettingsRow(settings)));
35755
+ });
35756
+ projectSettingsCmd.command("update").description("Update a Test Manager project's time zone or execution name format.").addOption(projectKeyOption()).addOption(projectIdOption()).option("--time-zone <iana-name>", "Project time zone as an IANA name (e.g. Europe/Bucharest, UTC)").option("--execution-name-format <template>", "Template for generated test execution names. Placeholders: {TestSet.Name}, " + "{Execution.Type} (manual|automated|autonomous|exploratory|unspecified), " + "{Execution.StartTime} (add a .NET date format after a pipe, e.g. " + "{Execution.StartTime|yyyyMMdd.HHmmss}), and {TestSet.<custom field name>} for a " + "Test Set custom field. Anything outside braces is literal. The template itself is " + "rejected over 1024 characters, and a shorter one that renders longer than 1024 is " + "truncated with '...'. Default: " + "'{Execution.Type} - {TestSet.Name} - {Execution.StartTime|yyyyMMdd.HHmmss}'").addOption(createHiddenDeprecatedTenantOption("-t, --tenant <tenant-name>")).option("--log-level <level>", "Log verbosity: debug, info, warn, error", "Information").examples(PROJECT_SETTINGS_UPDATE_EXAMPLES).trackedAction(processContext, async (options) => {
35757
+ const timeZone = options.timeZone;
35758
+ const executionNameFormat = options.executionNameFormat;
35759
+ if (timeZone === undefined && executionNameFormat === undefined) {
35760
+ OutputFormatter.error({
35761
+ Result: RESULTS.ValidationError,
35762
+ ErrorCode: "invalid_argument",
35763
+ Message: "Nothing to update: pass --time-zone, --execution-name-format, or both.",
35764
+ Instructions: "Read the current values with: uip tm project settings get",
35765
+ Retry: "RetryWillNotFix"
35766
+ });
35767
+ processContext.exit(1);
35768
+ return;
35769
+ }
35770
+ const ctx = await resolveContextWithProject(options);
35771
+ if (!ctx)
35772
+ return;
35773
+ const { tmConfig, projectId, projectKey } = ctx;
35774
+ const settingsApi = new ProjectSettingsApi(tmConfig);
35775
+ if (timeZone !== undefined && !await applyProjectTimeZoneAsync(settingsApi, projectId, timeZone)) {
35776
+ return;
35777
+ }
35778
+ if (executionNameFormat !== undefined && !await applyExecutionNameFormatAsync(settingsApi, projectId, executionNameFormat, timeZone)) {
35779
+ return;
35780
+ }
35781
+ OutputFormatter.success(new SuccessOutput("ProjectSettingsUpdate", {
35782
+ ProjectId: projectId,
35783
+ ...projectKey !== undefined && { ProjectKey: projectKey },
35784
+ ...timeZone !== undefined && { TimeZone: timeZone },
35785
+ ...executionNameFormat !== undefined && {
35786
+ ExecutionNameFormat: executionNameFormat
35787
+ },
35788
+ Result: "Updated"
35789
+ }));
35790
+ });
34730
35791
  };
34731
35792
 
34732
35793
  // src/commands/report.ts
@@ -36008,14 +37069,15 @@ async function fetchTestSetPackages(api, projectId, testSetId) {
36008
37069
  }
36009
37070
 
36010
37071
  // src/mappers/input/testcase.input.ts
36011
- function toGetPackageEntryPointsRequest(projectId, folderKey, distinctByPackageEntryPointIdAndPackageName, search, top, skip) {
37072
+ function toGetPackageEntryPointsRequest(projectId, folderKey, distinctByPackageEntryPointIdAndPackageName, search, top, skip, packageNames) {
36012
37073
  return {
36013
37074
  projectId,
36014
37075
  folderKey,
36015
37076
  search,
36016
37077
  top,
36017
37078
  skip,
36018
- distinctByPackageEntryPointIdAndPackageName
37079
+ distinctByPackageEntryPointIdAndPackageName,
37080
+ packageNames
36019
37081
  };
36020
37082
  }
36021
37083
  function toUpdatePackageAutomationRequest(testCaseId, projectId, options) {
@@ -36583,6 +37645,34 @@ var TESTCASE_LINK_AUTOMATION_EXAMPLES = [
36583
37645
  Result: "Linked"
36584
37646
  }
36585
37647
  }
37648
+ },
37649
+ {
37650
+ Description: "Link a Playwright test by its displayed 'specPath > testTitle' name",
37651
+ Command: 'uip tm testcases link-automation --project-key DEMO --test-case-key DEMO:2 --folder-key f0f0f0f0-0000-0000-0000-000000000001 --package-name PwTests --test-name "tests/login.spec.ts > Signs in"',
37652
+ Output: {
37653
+ Code: "TestCaseLinkAutomation",
37654
+ Data: {
37655
+ TestCaseKey: "DEMO:2",
37656
+ PackageName: "PwTests",
37657
+ PackageSource: "Shared",
37658
+ TestName: "tests/login.spec.ts > Signs in",
37659
+ Result: "Linked"
37660
+ }
37661
+ }
37662
+ },
37663
+ {
37664
+ Description: "Link by entry-point id when the name is too long to match: take the PackageEntryPointId from 'list-automations'. --test-name is required but ignored (pass the truncated name shown there); the real name is resolved from the id",
37665
+ Command: 'uip tm testcases link-automation --project-key DEMO --test-case-key DEMO:3 --folder-key f0f0f0f0-0000-0000-0000-000000000001 --package-name PwTests --test-name "tests/checkout.spec.ts > …" --entry-point-id 7a1b2c3d-0000-0000-0000-000000000abc',
37666
+ Output: {
37667
+ Code: "TestCaseLinkAutomation",
37668
+ Data: {
37669
+ TestCaseKey: "DEMO:3",
37670
+ PackageName: "PwTests",
37671
+ PackageSource: "Shared",
37672
+ TestName: "tests/checkout.spec.ts > Completes checkout end to end",
37673
+ Result: "Linked"
37674
+ }
37675
+ }
36586
37676
  }
36587
37677
  ];
36588
37678
  var TESTCASE_LINK_PACKAGE_EXAMPLES = [
@@ -36943,7 +38033,8 @@ var TESTCASE_LIST_AUTOMATIONS_EXAMPLES = [
36943
38033
  {
36944
38034
  PackageName: "InvoiceTests",
36945
38035
  TestName: "SmokeTest",
36946
- PackageVersion: "1.0.2"
38036
+ PackageVersion: "1.0.2",
38037
+ PackageEntryPointId: "7a1b2c3d-0000-0000-0000-000000000abc"
36947
38038
  }
36948
38039
  ]
36949
38040
  }
@@ -36957,7 +38048,8 @@ var TESTCASE_LIST_AUTOMATIONS_EXAMPLES = [
36957
38048
  {
36958
38049
  PackageName: "InvoiceTests",
36959
38050
  TestName: "SmokeTest",
36960
- PackageVersion: "1.0.2"
38051
+ PackageVersion: "1.0.2",
38052
+ PackageEntryPointId: "7a1b2c3d-0000-0000-0000-000000000abc"
36961
38053
  }
36962
38054
  ]
36963
38055
  }
@@ -36976,14 +38068,13 @@ async function resolveContextOrExit(options) {
36976
38068
  }
36977
38069
  return ctx;
36978
38070
  }
36979
- async function emitTmFailure2(error) {
36980
- const { message, details } = await extractErrorDetails2(error, {
36981
- forbiddenMessage: TM_FORBIDDEN_MESSAGE
36982
- });
38071
+ function emitFailure(message, instructions, errorCode2, retry) {
36983
38072
  OutputFormatter.error({
36984
38073
  Result: RESULTS.Failure,
38074
+ ...errorCode2 ? { ErrorCode: errorCode2 } : {},
36985
38075
  Message: message,
36986
- Instructions: details
38076
+ ...instructions ? { Instructions: instructions } : {},
38077
+ ...retry ? { Retry: retry } : {}
36987
38078
  });
36988
38079
  processContext.exit(1);
36989
38080
  }
@@ -37242,17 +38333,8 @@ var registerTestcaseCommand = (program2) => {
37242
38333
  Result: "Deleted"
37243
38334
  }));
37244
38335
  });
37245
- testcaseCmd.command("link-automation").description("Link an Orchestrator package automation to a test case.").addOption(projectKeyOption()).addOption(projectIdOption()).requiredOption("--test-case-key <key>", "Test case object key (e.g. DEMO:2)").requiredOption("--folder-key <uuid>", "Orchestrator folder key UUID (from 'uip or folders list')").requiredOption("--package-name <name>", "Orchestrator package identifier (e.g. ProjCSCrossTestCases)").requiredOption("--test-name <name>", "Test case name inside the package (e.g. MyDemoTest2)").addOption(createHiddenDeprecatedTenantOption("-t, --tenant <tenant-name>")).option("--log-level <level>", "Log verbosity: debug, info, warn, error", "Information").examples(TESTCASE_LINK_AUTOMATION_EXAMPLES).trackedAction(processContext, async (options) => {
37246
- const [authError, ctx] = await catchError(initializeContextWithProject(options));
37247
- if (authError) {
37248
- OutputFormatter.error({
37249
- Result: RESULTS.Failure,
37250
- Message: authError.message,
37251
- Instructions: instructionsFor("auth")
37252
- });
37253
- processContext.exit(1);
37254
- return;
37255
- }
38336
+ testcaseCmd.command("link-automation").description("Link an Orchestrator package automation to a test case.").addOption(projectKeyOption()).addOption(projectIdOption()).requiredOption("--test-case-key <key>", "Test case object key (e.g. DEMO:2)").requiredOption("--folder-key <uuid>", "Orchestrator folder key UUID (from 'uip or folders list')").requiredOption("--package-name <name>", "Orchestrator package identifier (e.g. ProjCSCrossTestCases)").requiredOption("--test-name <name>", `Test case name inside the package: the test name for UiPath packages (e.g. MyDemoTest2), or the displayed 'specPath > testTitle' name for Playwright packages (e.g. "tests/login.spec.ts > Signs in"). Ignored when --entry-point-id is given.`).option("--entry-point-id <uuid>", "Package entry-point id (the PackageEntryPointId from 'list-automations'). Binds directly by id and ignores --test-name; use it when the name is too long to type and shows truncated (with '…') in the listing.").addOption(createHiddenDeprecatedTenantOption("-t, --tenant <tenant-name>")).option("--log-level <level>", "Log verbosity: debug, info, warn, error", "Information").examples(TESTCASE_LINK_AUTOMATION_EXAMPLES).trackedAction(processContext, async (options) => {
38337
+ const ctx = await resolveContextOrExit(options);
37256
38338
  if (!ctx)
37257
38339
  return;
37258
38340
  const { tmConfig, projectId } = ctx;
@@ -37265,29 +38347,13 @@ var registerTestcaseCommand = (program2) => {
37265
38347
  top: 50
37266
38348
  }));
37267
38349
  if (resolveError) {
37268
- const { result, errorCode: errorCode2, message, retry, details } = await extractErrorDetails2(resolveError, {
37269
- forbiddenMessage: TM_FORBIDDEN_MESSAGE
37270
- });
37271
- OutputFormatter.error({
37272
- Result: result,
37273
- ErrorCode: errorCode2,
37274
- Message: message,
37275
- Instructions: details,
37276
- Retry: retry
37277
- });
37278
- processContext.exit(1);
38350
+ await emitTmFailure(resolveError);
37279
38351
  return;
37280
38352
  }
37281
- const pageRecord = page;
37282
- const items = pageRecord.data ?? [];
38353
+ const items = page.data ?? [];
37283
38354
  const testCase = items.find((tc) => tc.objKey?.toLowerCase() === testCaseKey.toLowerCase());
37284
38355
  if (!testCase?.id) {
37285
- OutputFormatter.error({
37286
- Result: RESULTS.Failure,
37287
- Message: `Test case '${testCaseKey}' not found.`
37288
- });
37289
- processContext.exit(1);
37290
- return;
38356
+ return emitFailure(`Test case '${testCaseKey}' not found.`);
37291
38357
  }
37292
38358
  if (!isGuid(options.folderKey)) {
37293
38359
  OutputFormatter.error({
@@ -37300,21 +38366,9 @@ var registerTestcaseCommand = (program2) => {
37300
38366
  processContext.exit(1);
37301
38367
  return;
37302
38368
  }
37303
- const [folderApiError, foldersApi] = await catchError(createApiClient(FoldersApi, {
37304
- tenant: options.tenant
37305
- }));
38369
+ const [folderApiError, foldersApi] = await catchError(createApiClient(FoldersApi, { tenant: options.tenant }));
37306
38370
  if (folderApiError) {
37307
- const { result, errorCode: errorCode2, message, retry, details } = await extractErrorDetails2(folderApiError, {
37308
- forbiddenMessage: TM_FORBIDDEN_MESSAGE
37309
- });
37310
- OutputFormatter.error({
37311
- Result: result,
37312
- ErrorCode: errorCode2,
37313
- Message: message,
37314
- Instructions: details,
37315
- Retry: retry
37316
- });
37317
- processContext.exit(1);
38371
+ await emitTmFailure(folderApiError);
37318
38372
  return;
37319
38373
  }
37320
38374
  const [foldersError, foldersResult] = await catchError(foldersApi.foldersGet({
@@ -37322,82 +38376,70 @@ var registerTestcaseCommand = (program2) => {
37322
38376
  $top: 1
37323
38377
  }));
37324
38378
  if (foldersError) {
37325
- const { result, errorCode: errorCode2, message, retry, details } = await extractErrorDetails2(foldersError, {
37326
- forbiddenMessage: TM_FORBIDDEN_MESSAGE
37327
- });
37328
- OutputFormatter.error({
37329
- Result: result,
37330
- ErrorCode: errorCode2,
37331
- Message: message,
37332
- Instructions: details,
37333
- Retry: retry
37334
- });
37335
- processContext.exit(1);
38379
+ await emitTmFailure(foldersError);
37336
38380
  return;
37337
38381
  }
37338
38382
  const folderMatch = foldersResult.value?.[0];
37339
38383
  if (!folderMatch?.displayName) {
37340
- OutputFormatter.error({
37341
- Result: RESULTS.Failure,
37342
- ErrorCode: "not_found",
37343
- Message: `Folder with key '${options.folderKey}' not found.`,
37344
- Instructions: "List the folders you can see with 'uip or folders list' and pass one of their Key values.",
37345
- Retry: "RetryWillNotFix"
37346
- });
37347
- processContext.exit(1);
37348
- return;
38384
+ return emitFailure(`Folder with key '${options.folderKey}' not found.`, "List the folders you can see with 'uip or folders list' and pass one of their Key values.", "not_found", "RetryWillNotFix");
37349
38385
  }
37350
38386
  const folderDisplayName = folderMatch.displayName;
37351
- const [epError, entryPointsPage] = await catchError(orchestratorApi.orchestratorGetUniquePackageEntryPoints(toGetPackageEntryPointsRequest(projectId, options.folderKey, true, options.testName, 100, 0)));
37352
- if (epError) {
37353
- const { result, errorCode: errorCode2, message, retry, details } = await extractErrorDetails2(epError, {
37354
- forbiddenMessage: TM_FORBIDDEN_MESSAGE
37355
- });
37356
- OutputFormatter.error({
37357
- Result: result,
37358
- ErrorCode: errorCode2,
37359
- Message: message,
37360
- Instructions: details,
37361
- Retry: retry
37362
- });
37363
- processContext.exit(1);
38387
+ let nameSearchTerm = options.testName ?? "";
38388
+ if (nameSearchTerm.includes(" > ")) {
38389
+ nameSearchTerm = nameSearchTerm.split(" > ").pop();
38390
+ }
38391
+ if (!options.entryPointId && nameSearchTerm.includes("…")) {
38392
+ return emitFailure(`Test name '${options.testName}' is truncated (contains '…'), so it cannot be matched. Re-run with --entry-point-id (the PackageEntryPointId from 'list-automations').`);
38393
+ }
38394
+ const wantedName = (options.testName ?? "").toLowerCase();
38395
+ const pageSize = 100;
38396
+ const maxPages = 50;
38397
+ const findEntryPoint = async (filterByPackage, searchTerm, matches2) => {
38398
+ for (let skip = 0;skip < pageSize * maxPages; skip += pageSize) {
38399
+ const [epError, page2] = await catchError(orchestratorApi.orchestratorGetUniquePackageEntryPoints(toGetPackageEntryPointsRequest(projectId, options.folderKey, true, searchTerm, pageSize, skip, filterByPackage ? [options.packageName] : undefined)));
38400
+ if (epError) {
38401
+ await emitTmFailure(epError);
38402
+ return "error";
38403
+ }
38404
+ const rows = page2.data ?? [];
38405
+ const hit = rows.find((ep) => ep.packageName?.toLowerCase() === options.packageName.toLowerCase() && matches2(ep));
38406
+ if (hit)
38407
+ return hit;
38408
+ if (rows.length < pageSize)
38409
+ break;
38410
+ }
37364
38411
  return;
38412
+ };
38413
+ const matches = options.entryPointId ? (ep) => ep.packageEntryPointId === options.entryPointId : (ep) => ep.name?.toLowerCase() === wantedName;
38414
+ const terms = options.entryPointId ? [""] : nameSearchTerm !== options.testName ? [nameSearchTerm, options.testName] : [options.testName];
38415
+ let entryPoint;
38416
+ for (const term of terms) {
38417
+ entryPoint = await findEntryPoint(true, term, matches) ?? await findEntryPoint(false, term, matches);
38418
+ if (entryPoint !== undefined)
38419
+ break;
37365
38420
  }
37366
- const entryPoint = (entryPointsPage.data ?? []).find((ep) => ep.packageName?.toLowerCase() === options.packageName.toLowerCase() && ep.name?.toLowerCase() === options.testName.toLowerCase());
37367
- if (!entryPoint) {
37368
- OutputFormatter.error({
37369
- Result: RESULTS.Failure,
37370
- Message: `Test '${options.testName}' not found in package '${options.packageName}' for folder '${options.folderKey}'.`
37371
- });
37372
- processContext.exit(1);
38421
+ if (entryPoint === "error")
37373
38422
  return;
38423
+ if (!entryPoint) {
38424
+ const missing = options.entryPointId ? `Entry point id '${options.entryPointId}'` : `Test '${options.testName}'`;
38425
+ return emitFailure(`${missing} not found in package '${options.packageName}' for folder '${options.folderKey}'.`);
37374
38426
  }
37375
38427
  const [updateError] = await catchError(testCasesApi.testCasesUpdateTestCasePackageAutomation(toUpdatePackageAutomationRequest(testCase.id, projectId, {
37376
38428
  packageEntryPointUniqueId: entryPoint.packageEntryPointId ?? null,
37377
38429
  packageIdentifier: options.packageName,
37378
- packageEntryPointName: options.testName,
38430
+ packageEntryPointName: entryPoint.name ?? "",
37379
38431
  folderKey: folderMatch.feedType === FolderDtoFeedTypeEnum.Processes ? null : options.folderKey,
37380
38432
  packageSourceName: folderDisplayName
37381
38433
  })));
37382
38434
  if (updateError) {
37383
- const { result, errorCode: errorCode2, message, retry, details } = await extractErrorDetails2(updateError, {
37384
- forbiddenMessage: TM_FORBIDDEN_MESSAGE
37385
- });
37386
- OutputFormatter.error({
37387
- Result: result,
37388
- ErrorCode: errorCode2,
37389
- Message: message,
37390
- Instructions: details,
37391
- Retry: retry
37392
- });
37393
- processContext.exit(1);
38435
+ await emitTmFailure(updateError);
37394
38436
  return;
37395
38437
  }
37396
38438
  OutputFormatter.success(new SuccessOutput("TestCaseLinkAutomation", {
37397
38439
  TestCaseKey: testCaseKey,
37398
38440
  PackageName: options.packageName,
37399
38441
  PackageSource: folderDisplayName,
37400
- TestName: options.testName,
38442
+ TestName: entryPoint.name ?? "",
37401
38443
  Result: "Linked"
37402
38444
  }));
37403
38445
  });
@@ -37507,7 +38549,7 @@ var registerTestcaseCommand = (program2) => {
37507
38549
  microsoftAspNetCoreJsonPatchOperationsOperation: operations
37508
38550
  }));
37509
38551
  if (patchError) {
37510
- await emitTmFailure2(patchError);
38552
+ await emitTmFailure(patchError);
37511
38553
  return;
37512
38554
  }
37513
38555
  OutputFormatter.success(new SuccessOutput("TestCaseUpdate", {
@@ -37679,7 +38721,8 @@ var registerTestcaseCommand = (program2) => {
37679
38721
  const rows = filtered.map((ep) => ({
37680
38722
  PackageName: ep.packageName ?? "",
37681
38723
  TestName: ep.name ?? "",
37682
- PackageVersion: ep.packageAppVersion ?? ""
38724
+ PackageVersion: ep.packageAppVersion ?? "",
38725
+ PackageEntryPointId: ep.packageEntryPointId ?? ""
37683
38726
  }));
37684
38727
  OutputFormatter.success(new SuccessOutput("TestAutomationsList", rows));
37685
38728
  });
@@ -37743,7 +38786,7 @@ var registerTestcaseCommand = (program2) => {
37743
38786
  const testStepsApi = new TestStepsApi(tmConfig);
37744
38787
  const [error, steps] = await catchError(testStepsApi.testStepsGetTestStepsByTestCase(toGetTestStepsByTestCaseRequest(options.testCaseId, projectId)));
37745
38788
  if (error) {
37746
- await emitTmFailure2(error);
38789
+ await emitTmFailure(error);
37747
38790
  return;
37748
38791
  }
37749
38792
  OutputFormatter.success(new SuccessOutput("TestCaseStepsList", toOutput6(steps ?? [])));
@@ -37758,7 +38801,7 @@ var registerTestcaseCommand = (program2) => {
37758
38801
  const testStepsApi = new TestStepsApi(tmConfig);
37759
38802
  const [error, step] = await catchError(testStepsApi.testStepsGetById(toGetByIdRequest6(options.stepId, projectId)));
37760
38803
  if (error) {
37761
- await emitTmFailure2(error);
38804
+ await emitTmFailure(error);
37762
38805
  return;
37763
38806
  }
37764
38807
  OutputFormatter.success(new SuccessOutput("TestStepGet", toStepOutput(step)));
@@ -37821,7 +38864,7 @@ var registerTestcaseCommand = (program2) => {
37821
38864
  const testStepsApi = new TestStepsApi(tmConfig);
37822
38865
  const [getError, current] = await catchError(testStepsApi.testStepsGetById(toGetByIdRequest6(options.stepId, projectId)));
37823
38866
  if (getError) {
37824
- await emitTmFailure2(getError);
38867
+ await emitTmFailure(getError);
37825
38868
  return;
37826
38869
  }
37827
38870
  const merged = { ...current };
@@ -37835,7 +38878,7 @@ var registerTestcaseCommand = (program2) => {
37835
38878
  merged.clipboardData = options.clipboardData;
37836
38879
  const [updateError] = await catchError(testStepsApi.testStepsUpdate(toUpdateRequest4(options.stepId, projectId, merged)));
37837
38880
  if (updateError) {
37838
- await emitTmFailure2(updateError);
38881
+ await emitTmFailure(updateError);
37839
38882
  return;
37840
38883
  }
37841
38884
  OutputFormatter.success(new SuccessOutput("TestStepUpdate", {
@@ -37862,7 +38905,7 @@ var registerTestcaseCommand = (program2) => {
37862
38905
  const testStepsApi = new TestStepsApi(tmConfig);
37863
38906
  const [error] = await catchError(testStepsApi.testStepsMoveToPosition(toMoveRequest(options.stepId, projectId, targetPosition)));
37864
38907
  if (error) {
37865
- await emitTmFailure2(error);
38908
+ await emitTmFailure(error);
37866
38909
  return;
37867
38910
  }
37868
38911
  OutputFormatter.success(new SuccessOutput("TestStepMove", {
@@ -37881,7 +38924,7 @@ var registerTestcaseCommand = (program2) => {
37881
38924
  const testStepsApi = new TestStepsApi(tmConfig);
37882
38925
  const [error] = await catchError(testStepsApi.testStepsDelete(toDeleteRequest2(options.stepId, projectId)));
37883
38926
  if (error) {
37884
- await emitTmFailure2(error);
38927
+ await emitTmFailure(error);
37885
38928
  return;
37886
38929
  }
37887
38930
  OutputFormatter.success(new SuccessOutput("TestStepDelete", {
@@ -39650,4 +40693,4 @@ var registerCommands = async (program2) => {
39650
40693
 
39651
40694
  export { Command, metadata, registerCommands };
39652
40695
 
39653
- //# debugId=0B8081D6FB47984D64756E2164756E21
40696
+ //# debugId=A6E7682C537E6E0D64756E2164756E21