@uipath/gov-tool 1.204.0-preview.255 → 1.205.0-preview.256
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.
- package/dist/tool.js +165 -50
- package/package.json +2 -2
package/dist/tool.js
CHANGED
|
@@ -915,6 +915,16 @@ class NodeFileSystem {
|
|
|
915
915
|
async rename(oldPath, newPath) {
|
|
916
916
|
await fs6.rename(oldPath, newPath);
|
|
917
917
|
}
|
|
918
|
+
async isSymbolicLink(filePath) {
|
|
919
|
+
try {
|
|
920
|
+
return (await fs6.lstat(filePath)).isSymbolicLink();
|
|
921
|
+
} catch (error) {
|
|
922
|
+
if (this.isEnoent(error) || this.hasErrnoCode(error, "ENOTDIR")) {
|
|
923
|
+
return false;
|
|
924
|
+
}
|
|
925
|
+
throw error;
|
|
926
|
+
}
|
|
927
|
+
}
|
|
918
928
|
async realpath(filePath) {
|
|
919
929
|
try {
|
|
920
930
|
return await fs6.realpath(filePath);
|
|
@@ -7654,7 +7664,7 @@ var package_default = {
|
|
|
7654
7664
|
name: "@uipath/gov-tool",
|
|
7655
7665
|
author: "UiPath",
|
|
7656
7666
|
license: "SEE LICENSE IN LICENSE.txt",
|
|
7657
|
-
version: "1.
|
|
7667
|
+
version: "1.205.0-preview.256",
|
|
7658
7668
|
description: "Manage UiPath governance — AOps policies, Access policies, and compliance packs.",
|
|
7659
7669
|
private: false,
|
|
7660
7670
|
repository: {
|
|
@@ -7786,7 +7796,9 @@ var ErrorDimensions = {
|
|
|
7786
7796
|
Result: "Result",
|
|
7787
7797
|
ErrorCode: "ErrorCode",
|
|
7788
7798
|
Retry: "Retry",
|
|
7789
|
-
ErrorMessage: "ErrorMessage"
|
|
7799
|
+
ErrorMessage: "ErrorMessage",
|
|
7800
|
+
HttpStatus: "HttpStatus",
|
|
7801
|
+
UpstreamErrorCode: "UpstreamErrorCode"
|
|
7790
7802
|
};
|
|
7791
7803
|
var AuthDimensions = {
|
|
7792
7804
|
AuthenticationMethod: "AuthenticationMethod",
|
|
@@ -8210,7 +8222,7 @@ var package_default2 = {
|
|
|
8210
8222
|
name: "@uipath/authz-sdk",
|
|
8211
8223
|
author: "UiPath",
|
|
8212
8224
|
license: "SEE LICENSE IN LICENSE.txt",
|
|
8213
|
-
version: "1.
|
|
8225
|
+
version: "1.205.0",
|
|
8214
8226
|
description: "SDK for the UiPath Authorization Service API.",
|
|
8215
8227
|
repository: {
|
|
8216
8228
|
type: "git",
|
|
@@ -8921,22 +8933,12 @@ var resolveConfigAsync = async ({
|
|
|
8921
8933
|
baseUrl = DEFAULT_BASE_URL;
|
|
8922
8934
|
}
|
|
8923
8935
|
baseUrl = normalizeAndValidateBaseUrl(baseUrl);
|
|
8924
|
-
|
|
8925
|
-
|
|
8926
|
-
clientId = fileAuth.clientId;
|
|
8927
|
-
}
|
|
8928
|
-
if (!clientId) {
|
|
8929
|
-
clientId = DEFAULT_CLIENT_ID;
|
|
8930
|
-
}
|
|
8931
|
-
let clientSecret = customClientSecret;
|
|
8932
|
-
if (!clientSecret && fileAuth.clientSecret) {
|
|
8933
|
-
clientSecret = fileAuth.clientSecret;
|
|
8934
|
-
}
|
|
8935
|
-
const isExternalAppAuth = clientId !== DEFAULT_CLIENT_ID && (Boolean(clientSecret) || Boolean(customClientAssertion));
|
|
8936
|
+
const clientId = customClientId || DEFAULT_CLIENT_ID;
|
|
8937
|
+
const isExternalAppAuth = clientId !== DEFAULT_CLIENT_ID && (Boolean(customClientSecret) || Boolean(customClientAssertion));
|
|
8936
8938
|
const scopes = resolveScopes(isExternalAppAuth, customScopes, fileAuth.scopes);
|
|
8937
8939
|
return {
|
|
8938
8940
|
clientId,
|
|
8939
|
-
clientSecret,
|
|
8941
|
+
clientSecret: customClientSecret,
|
|
8940
8942
|
scopes,
|
|
8941
8943
|
baseUrl,
|
|
8942
8944
|
authorizationEndpoint: `${baseUrl}/identity_/connect/authorize`,
|
|
@@ -9111,6 +9113,16 @@ var resolveIdentityType = (claims, authFlow, email) => {
|
|
|
9111
9113
|
}
|
|
9112
9114
|
return;
|
|
9113
9115
|
};
|
|
9116
|
+
var resolveApplicationSubtype = (claims, authFlow) => {
|
|
9117
|
+
switch (asString(claims?.sub_type)) {
|
|
9118
|
+
case "service.external":
|
|
9119
|
+
return "External";
|
|
9120
|
+
case "service.internal":
|
|
9121
|
+
return "Internal";
|
|
9122
|
+
default:
|
|
9123
|
+
return authFlow === "client_credentials" || authFlow === "federated_credentials" ? "External" : undefined;
|
|
9124
|
+
}
|
|
9125
|
+
};
|
|
9114
9126
|
var looksLikeEmail = (value) => value?.includes("@") ?? false;
|
|
9115
9127
|
var pickEmail = (claims) => {
|
|
9116
9128
|
for (const candidate of [claims?.email, claims?.preferred_username]) {
|
|
@@ -9152,6 +9164,12 @@ var resolveSessionIdentity = (accessToken, authFlow) => {
|
|
|
9152
9164
|
const clientId = asString(claims?.client_id);
|
|
9153
9165
|
if (clientId)
|
|
9154
9166
|
identity.clientId = clientId;
|
|
9167
|
+
const subType = asString(claims?.sub_type);
|
|
9168
|
+
if (subType)
|
|
9169
|
+
identity.subType = subType;
|
|
9170
|
+
const applicationSubtype = resolveApplicationSubtype(claims, authFlow);
|
|
9171
|
+
if (applicationSubtype)
|
|
9172
|
+
identity.applicationSubtype = applicationSubtype;
|
|
9155
9173
|
return identity;
|
|
9156
9174
|
};
|
|
9157
9175
|
var readTokenScopes = (accessToken) => accessToken ? pickScopes(decodeClaims(accessToken)) : undefined;
|
|
@@ -9446,6 +9464,40 @@ var tryRobotClientFallback = async (options = {}) => {
|
|
|
9446
9464
|
}
|
|
9447
9465
|
};
|
|
9448
9466
|
|
|
9467
|
+
// ../../auth/src/tenantSelection.ts
|
|
9468
|
+
var LOGIN_STATUS_HINT = "Run 'uip login status' to see the organization the CLI is signed in to.";
|
|
9469
|
+
var organizationHint = (organizationId) => `The request used '${organizationId}' as the organization. ${LOGIN_STATUS_HINT}`;
|
|
9470
|
+
var IDENTIFIER_STATUSES = new Set([400, 403, 404]);
|
|
9471
|
+
var describeNonJsonResponse = (organizationId, response, parseError) => {
|
|
9472
|
+
if (response.redirected) {
|
|
9473
|
+
return `Could not find organization '${organizationId}': the request was ` + `redirected to a sign-in page instead of the organization's tenant ` + `list. ${LOGIN_STATUS_HINT}`;
|
|
9474
|
+
}
|
|
9475
|
+
const contentType = response.headers.get("content-type") ?? "unknown";
|
|
9476
|
+
return `The organization service returned a '${contentType}' response instead ` + `of JSON: ${parseError.message}. ${organizationHint(organizationId)}`;
|
|
9477
|
+
};
|
|
9478
|
+
var fetchTenantsAndOrganizations = async (baseUrl, accessToken, organizationId, signal) => {
|
|
9479
|
+
const url = `${baseUrl}/${organizationId}/portal_/api/filtering/leftnav/tenantsAndOrganizationInfo`;
|
|
9480
|
+
const response = await fetch(url, {
|
|
9481
|
+
headers: {
|
|
9482
|
+
Authorization: `Bearer ${accessToken}`
|
|
9483
|
+
},
|
|
9484
|
+
...signal ? { signal } : {}
|
|
9485
|
+
});
|
|
9486
|
+
if (!response.ok) {
|
|
9487
|
+
if (response.status === 401) {
|
|
9488
|
+
throw new Error(`Unauthorized: the access token was rejected, it was not ` + `issued for organization '${organizationId}', or ` + `'${organizationId}' was not accepted as an organization ` + `URL segment in this environment. ` + LOGIN_STATUS_HINT);
|
|
9489
|
+
}
|
|
9490
|
+
const errorText = await response.text();
|
|
9491
|
+
const message = `Failed to get tenants and organizations: ${response.status} ${errorText}`;
|
|
9492
|
+
throw new Error(IDENTIFIER_STATUSES.has(response.status) ? `${message}. ${organizationHint(organizationId)}` : message);
|
|
9493
|
+
}
|
|
9494
|
+
const [parseError, data] = await catchError(response.json());
|
|
9495
|
+
if (parseError) {
|
|
9496
|
+
throw new Error(describeNonJsonResponse(organizationId, response, parseError));
|
|
9497
|
+
}
|
|
9498
|
+
return data;
|
|
9499
|
+
};
|
|
9500
|
+
|
|
9449
9501
|
// ../../auth/src/tokenRefresh.ts
|
|
9450
9502
|
var TOKEN_REFRESH_REAUTHENTICATE_MESSAGE = "Token refresh failed. Run 'uip login' to re-authenticate.";
|
|
9451
9503
|
|
|
@@ -9660,6 +9712,8 @@ var saveEnvFileAsync = async ({
|
|
|
9660
9712
|
};
|
|
9661
9713
|
|
|
9662
9714
|
// ../../auth/src/loginStatus.ts
|
|
9715
|
+
var defaultRobotTenantIdCache = new Map;
|
|
9716
|
+
var ROBOT_TENANT_LOOKUP_TIMEOUT_MS = 5000;
|
|
9663
9717
|
var getLoginStatusAsync = async (options = {}) => {
|
|
9664
9718
|
return getLoginStatusWithDeps(options);
|
|
9665
9719
|
};
|
|
@@ -9672,12 +9726,20 @@ var getLoginStatusWithDeps = async (options = {}, deps = {}) => {
|
|
|
9672
9726
|
refreshToken: refreshTokenFn = refreshAccessToken,
|
|
9673
9727
|
resolveConfig = resolveConfigAsync,
|
|
9674
9728
|
robotFallback = tryRobotClientFallback,
|
|
9729
|
+
fetchTenantsAndOrgs = fetchTenantsAndOrganizations,
|
|
9730
|
+
robotTenantIdCache = defaultRobotTenantIdCache,
|
|
9731
|
+
robotTenantLookupTimeoutMs = ROBOT_TENANT_LOOKUP_TIMEOUT_MS,
|
|
9675
9732
|
loadBreaker = loadRefreshBreaker,
|
|
9676
9733
|
saveBreaker = saveRefreshBreaker,
|
|
9677
9734
|
clearBreaker = clearRefreshBreaker
|
|
9678
9735
|
} = deps;
|
|
9736
|
+
const robotDeps = {
|
|
9737
|
+
fetchTenantsAndOrgs,
|
|
9738
|
+
cache: robotTenantIdCache,
|
|
9739
|
+
lookupTimeoutMs: robotTenantLookupTimeoutMs
|
|
9740
|
+
};
|
|
9679
9741
|
if (isRobotAuthEnforced()) {
|
|
9680
|
-
return resolveRobotEnforcedStatus(robotFallback);
|
|
9742
|
+
return resolveRobotEnforcedStatus(robotFallback, robotDeps);
|
|
9681
9743
|
}
|
|
9682
9744
|
if (isEnvAuthEnabled()) {
|
|
9683
9745
|
return readAuthFromEnv();
|
|
@@ -9695,7 +9757,7 @@ var getLoginStatusWithDeps = async (options = {}, deps = {}) => {
|
|
|
9695
9757
|
hint: `No credentials found for profile "${activeProfile}". Run 'uip login --profile ${activeProfile}' to authenticate this profile.`
|
|
9696
9758
|
};
|
|
9697
9759
|
}
|
|
9698
|
-
return resolveBorrowedRobotStatus(robotFallback);
|
|
9760
|
+
return resolveBorrowedRobotStatus(robotFallback, robotDeps);
|
|
9699
9761
|
}
|
|
9700
9762
|
const loaded = await loadFileCredentials(loadEnvFile, absolutePath);
|
|
9701
9763
|
if ("status" in loaded) {
|
|
@@ -9737,7 +9799,7 @@ var getLoginStatusWithDeps = async (options = {}, deps = {}) => {
|
|
|
9737
9799
|
}
|
|
9738
9800
|
return buildFileStatus(tokens, credentials, globalHint);
|
|
9739
9801
|
};
|
|
9740
|
-
async function resolveRobotEnforcedStatus(robotFallback) {
|
|
9802
|
+
async function resolveRobotEnforcedStatus(robotFallback, deps) {
|
|
9741
9803
|
if (isEnvAuthEnabled()) {
|
|
9742
9804
|
throw new EnvAuthConfigError(`${ENV_AUTH_ENABLE_VAR}=true and ${ENFORCE_ROBOT_AUTH_VAR}=true ` + `are mutually exclusive. Unset one of them and re-run.`);
|
|
9743
9805
|
}
|
|
@@ -9748,11 +9810,11 @@ async function resolveRobotEnforcedStatus(robotFallback) {
|
|
|
9748
9810
|
hint: `${ENFORCE_ROBOT_AUTH_VAR}=true but the UiPath Robot ` + `session is unavailable. Start and sign in to the Assistant, ` + `or unset ${ENFORCE_ROBOT_AUTH_VAR} to fall back to file or ` + `env-var authentication.`
|
|
9749
9811
|
};
|
|
9750
9812
|
}
|
|
9751
|
-
return buildRobotStatus(robotCreds);
|
|
9813
|
+
return buildRobotStatus(robotCreds, deps);
|
|
9752
9814
|
}
|
|
9753
|
-
async function resolveBorrowedRobotStatus(robotFallback) {
|
|
9815
|
+
async function resolveBorrowedRobotStatus(robotFallback, deps) {
|
|
9754
9816
|
const robotCreds = await robotFallback();
|
|
9755
|
-
return robotCreds ? buildRobotStatus(robotCreds) : { loginStatus: "Not logged in" };
|
|
9817
|
+
return robotCreds ? buildRobotStatus(robotCreds, deps) : { loginStatus: "Not logged in" };
|
|
9756
9818
|
}
|
|
9757
9819
|
async function loadFileCredentials(loadEnvFile, absolutePath) {
|
|
9758
9820
|
let credentials;
|
|
@@ -9887,9 +9949,10 @@ function identityFields(accessToken, credentials) {
|
|
|
9887
9949
|
...scopes ? { scopes } : {}
|
|
9888
9950
|
};
|
|
9889
9951
|
}
|
|
9890
|
-
function buildRobotStatus(robotCreds) {
|
|
9952
|
+
async function buildRobotStatus(robotCreds, deps) {
|
|
9891
9953
|
const identity = resolveSessionIdentity(robotCreds.accessToken);
|
|
9892
9954
|
const scopes = readTokenScopes(robotCreds.accessToken);
|
|
9955
|
+
const tenant = robotCreds.tenantId ? { tenantId: robotCreds.tenantId } : await resolveRobotTenantId(robotCreds, deps);
|
|
9893
9956
|
return {
|
|
9894
9957
|
loginStatus: "Logged in",
|
|
9895
9958
|
accessToken: robotCreds.accessToken,
|
|
@@ -9897,14 +9960,62 @@ function buildRobotStatus(robotCreds) {
|
|
|
9897
9960
|
organizationName: robotCreds.organizationName,
|
|
9898
9961
|
organizationId: robotCreds.organizationId,
|
|
9899
9962
|
tenantName: robotCreds.tenantName,
|
|
9900
|
-
tenantId:
|
|
9963
|
+
tenantId: tenant.tenantId,
|
|
9901
9964
|
issuer: robotCreds.issuer,
|
|
9902
9965
|
expiration: getTokenExpiration(robotCreds.accessToken),
|
|
9903
9966
|
source: "robot" /* Robot */,
|
|
9967
|
+
...tenant.hint ? { hint: tenant.hint } : {},
|
|
9904
9968
|
...identity ? { identity } : {},
|
|
9905
9969
|
...scopes ? { scopes } : {}
|
|
9906
9970
|
};
|
|
9907
9971
|
}
|
|
9972
|
+
async function resolveRobotTenantId(robotCreds, deps) {
|
|
9973
|
+
const { baseUrl, accessToken, tenantName } = robotCreds;
|
|
9974
|
+
const organization = robotCreds.organizationName ?? robotCreds.organizationId;
|
|
9975
|
+
if (!tenantName || !organization) {
|
|
9976
|
+
return {};
|
|
9977
|
+
}
|
|
9978
|
+
const key = `${baseUrl}|${organization}|${tenantName}|${accessToken}`;
|
|
9979
|
+
let pending = deps.cache.get(key);
|
|
9980
|
+
if (!pending) {
|
|
9981
|
+
pending = catchError(lookupRobotTenantId({ baseUrl, accessToken, organization, tenantName }, deps)).then(([error, resolution]) => {
|
|
9982
|
+
const settled = error ? { hint: tenantLookupFailureHint(tenantName, error.message) } : resolution;
|
|
9983
|
+
if (!settled.tenantId) {
|
|
9984
|
+
deps.cache.delete(key);
|
|
9985
|
+
}
|
|
9986
|
+
return settled;
|
|
9987
|
+
});
|
|
9988
|
+
deps.cache.set(key, pending);
|
|
9989
|
+
}
|
|
9990
|
+
return pending;
|
|
9991
|
+
}
|
|
9992
|
+
async function lookupRobotTenantId(target, deps) {
|
|
9993
|
+
const { baseUrl, accessToken, organization, tenantName } = target;
|
|
9994
|
+
const [error, data] = await catchError(deps.fetchTenantsAndOrgs(baseUrl, accessToken, organization, AbortSignal.timeout(deps.lookupTimeoutMs)));
|
|
9995
|
+
if (error) {
|
|
9996
|
+
const reason = error.name === "TimeoutError" ? `the tenant list did not answer within ${deps.lookupTimeoutMs} ms.` : error.message;
|
|
9997
|
+
return { hint: tenantLookupFailureHint(tenantName, reason) };
|
|
9998
|
+
}
|
|
9999
|
+
const rows = data?.tenants;
|
|
10000
|
+
const tenants = Array.isArray(rows) ? rows.filter((tenant) => typeof tenant?.id === "string" && typeof tenant?.name === "string") : [];
|
|
10001
|
+
const wantedName = decodePathSegment(tenantName);
|
|
10002
|
+
const wanted = wantedName.toLowerCase();
|
|
10003
|
+
const match = tenants.find((tenant) => tenant.name === wantedName) ?? tenants.find((tenant) => tenant.name.toLowerCase() === wanted);
|
|
10004
|
+
if (!match) {
|
|
10005
|
+
const names = tenants.map((tenant) => tenant.name).join(", ");
|
|
10006
|
+
return {
|
|
10007
|
+
hint: `The Robot session targets tenant '${tenantName}', but ` + `organization '${organization}' lists no tenant of that name` + `${names ? ` (available: ${names})` : ""}. Commands that need ` + `the tenant id will fail until it can be resolved.`
|
|
10008
|
+
};
|
|
10009
|
+
}
|
|
10010
|
+
return { tenantId: match.id };
|
|
10011
|
+
}
|
|
10012
|
+
function tenantLookupFailureHint(tenantName, reason) {
|
|
10013
|
+
return `Could not resolve the id of tenant '${tenantName}' from the ` + `Robot session: ${reason} Commands that need the tenant id will ` + `fail until it can be resolved.`;
|
|
10014
|
+
}
|
|
10015
|
+
function decodePathSegment(segment) {
|
|
10016
|
+
const [error, decoded] = catchError(() => decodeURIComponent(segment));
|
|
10017
|
+
return error ? segment : decoded;
|
|
10018
|
+
}
|
|
9908
10019
|
var isFileNotFoundError = (error) => {
|
|
9909
10020
|
if (!(error instanceof Object))
|
|
9910
10021
|
return false;
|
|
@@ -10148,8 +10259,6 @@ init_constants();
|
|
|
10148
10259
|
// ../../auth/src/interactive.ts
|
|
10149
10260
|
init_src();
|
|
10150
10261
|
init_constants();
|
|
10151
|
-
// ../../auth/src/tenantSelection.ts
|
|
10152
|
-
var IDENTIFIER_STATUSES = new Set([400, 403, 404]);
|
|
10153
10262
|
|
|
10154
10263
|
// ../../auth/src/selectTenant.ts
|
|
10155
10264
|
var TENANT_SELECTION_REQUIRED_CODE = "TENANT_SELECTION_REQUIRED";
|
|
@@ -11160,7 +11269,7 @@ function setGlobalLogFilePath(path3) {
|
|
|
11160
11269
|
function getGlobalLogFilePath() {
|
|
11161
11270
|
return logFilePathSlot.get("");
|
|
11162
11271
|
}
|
|
11163
|
-
var DEFAULT_LOG_LEVEL =
|
|
11272
|
+
var DEFAULT_LOG_LEVEL = 2 /* WARN */;
|
|
11164
11273
|
|
|
11165
11274
|
class SimpleLogger {
|
|
11166
11275
|
__brand = "SimpleLogger";
|
|
@@ -12267,7 +12376,9 @@ var CLI_ERROR_CODES = [
|
|
|
12267
12376
|
"timeout",
|
|
12268
12377
|
"server_error",
|
|
12269
12378
|
"method_not_allowed",
|
|
12379
|
+
"not_supported",
|
|
12270
12380
|
"configuration_error",
|
|
12381
|
+
"execution_failed",
|
|
12271
12382
|
"unknown_error"
|
|
12272
12383
|
];
|
|
12273
12384
|
var RETRY_HINTS = [
|
|
@@ -13224,7 +13335,9 @@ var OutputFormatter;
|
|
|
13224
13335
|
[ErrorDimensions.Result]: data.Result,
|
|
13225
13336
|
[ErrorDimensions.ErrorCode]: data.ErrorCode,
|
|
13226
13337
|
[ErrorDimensions.Retry]: data.Retry,
|
|
13227
|
-
[ErrorDimensions.ErrorMessage]: data.Message
|
|
13338
|
+
[ErrorDimensions.ErrorMessage]: data.Message,
|
|
13339
|
+
[ErrorDimensions.HttpStatus]: data.Context?.httpStatus?.toString(),
|
|
13340
|
+
[ErrorDimensions.UpstreamErrorCode]: data.Context?.errorCode
|
|
13228
13341
|
});
|
|
13229
13342
|
}
|
|
13230
13343
|
logOutput(normalizeOutputKeys(envelope), getOutputFormat());
|
|
@@ -13984,6 +14097,8 @@ var BOOLEAN_FLAGS = new Set(HOST_GLOBAL_FLAGS);
|
|
|
13984
14097
|
// ../../common/src/interactivity-context.ts
|
|
13985
14098
|
var modeSlot = singleton("InteractivityMode");
|
|
13986
14099
|
var interactiveFlagSlot = singleton("InteractiveFlag");
|
|
14100
|
+
// ../../common/src/json-option.ts
|
|
14101
|
+
init_src();
|
|
13987
14102
|
// ../../common/src/mime-types.ts
|
|
13988
14103
|
var MIME_TYPES_BY_EXTENSION = Object.freeze({
|
|
13989
14104
|
pdf: "application/pdf",
|
|
@@ -14304,7 +14419,7 @@ var registerAccessPolicyCommand = (program2) => {
|
|
|
14304
14419
|
"Use this to inspect the policy's selectors, rules, and enforcement before editing,",
|
|
14305
14420
|
"or to seed a follow-up `access-policy update` (save the output, edit, then re-submit)."
|
|
14306
14421
|
].join(`
|
|
14307
|
-
`)).argument("<
|
|
14422
|
+
`)).argument("<policy-id>", "Policy UUID. Obtain from `access-policy list` (the `id` field of each result).").examples(GET_EXAMPLES)).trackedAction(processContext, async (policyId, options) => {
|
|
14308
14423
|
const api = await getPapApi(options);
|
|
14309
14424
|
if (!api)
|
|
14310
14425
|
return;
|
|
@@ -14394,7 +14509,7 @@ var registerAccessPolicyCommand = (program2) => {
|
|
|
14394
14509
|
"Pass multiple IDs space-separated to delete in a single request.",
|
|
14395
14510
|
"Deletion is permanent — use `access-policy get <id>` first if you need a backup of the definition."
|
|
14396
14511
|
].join(`
|
|
14397
|
-
`)).argument("<
|
|
14512
|
+
`)).argument("<policy-id...>", "One or more policy UUIDs. Obtain from `access-policy list`.").examples(DELETE_EXAMPLES)).trackedAction(processContext, async (policyIds, options) => {
|
|
14398
14513
|
const api = await getPapApi(options);
|
|
14399
14514
|
if (!api)
|
|
14400
14515
|
return;
|
|
@@ -14748,7 +14863,7 @@ var package_default3 = {
|
|
|
14748
14863
|
name: "@uipath/aops-policy-sdk",
|
|
14749
14864
|
author: "UiPath",
|
|
14750
14865
|
license: "SEE LICENSE IN LICENSE.txt",
|
|
14751
|
-
version: "1.
|
|
14866
|
+
version: "1.205.0-preview.256",
|
|
14752
14867
|
description: "SDK for the UiPath AOps Governance API — policy management and deployment.",
|
|
14753
14868
|
repository: {
|
|
14754
14869
|
type: "git",
|
|
@@ -18391,7 +18506,7 @@ var registerDeployedPolicyCommands = (aopsPolicy) => {
|
|
|
18391
18506
|
"Output: the resolved policy's data payload, or `{ Message: 'No policy applies.' }` when the service returns 204",
|
|
18392
18507
|
"(no rule matches and no default exists). Use `deployed-policy list` to see every rule, not just the effective one."
|
|
18393
18508
|
].join(`
|
|
18394
|
-
`)).argument("<license-type>", "License type (e.g. Attended, Unattended). Must match a name from `license-type list`.").argument("<product-name>", "Product name (e.g. StudioX). Must match a name from `product list`.").argument("<
|
|
18509
|
+
`)).argument("<license-type>", "License type (e.g. Attended, Unattended). Must match a name from `license-type list`.").argument("<product-name>", "Product name (e.g. StudioX). Must match a name from `product list`.").argument("<tenant-identifier>", "Tenant GUID. From `deployment tenant list`.").option("--s2s-token <token>", "Service-to-service bearer token. Overrides the user token from 'uip login' for this call only. Still requires `uip login` for base URL / org context. For security, prefer setting the UIP_S2S_TOKEN environment variable — tokens passed as CLI arguments are visible in process listings (ps aux, /proc/*/cmdline).").option("--user-id <userId>", "Resolve the effective policy for this specific user (runs the full user→group→tenant walk). Requires --s2s-token.").option("--tenant-only", "Resolve the tenant-level policy only, ignoring user/group overrides. Requires --s2s-token.").option("--download [path]", "Write the resolved policy to a JSON file instead of printing it, exactly as the service returned it. [path] is the JSON file to write; a directory saves '<product name>-<policy name>.json' inside it, and leaving it off saves that name in the current directory.").option("--login-validity <minutes>", "Override the interactive-login token lifetime. Ignored when --s2s-token is set (the S2S token lifetime is controlled by the caller).", (v) => Number.parseInt(v, 10)).examples(GET_EXAMPLES2).trackedAction(processContext, async (licenseType, productName, tenantIdentifier, options) => {
|
|
18395
18510
|
const s2sToken = resolveS2sToken(options);
|
|
18396
18511
|
const validationError = validateGetOptions(options, s2sToken);
|
|
18397
18512
|
if (validationError) {
|
|
@@ -18490,7 +18605,7 @@ var registerDeployedPolicyCommands = (aopsPolicy) => {
|
|
|
18490
18605
|
"user or use `deployed-policy get --s2s-token --user-id <id>` for the effective single policy.",
|
|
18491
18606
|
"Returns an empty array when no rules apply."
|
|
18492
18607
|
].join(`
|
|
18493
|
-
`)).argument("<license-type>", "License type (e.g. Attended, Unattended). Must match a name from `license-type list`.").argument("<product-name>", "Product name (e.g. StudioX). Must match a name from `product list`.").argument("<
|
|
18608
|
+
`)).argument("<license-type>", "License type (e.g. Attended, Unattended). Must match a name from `license-type list`.").argument("<product-name>", "Product name (e.g. StudioX). Must match a name from `product list`.").argument("<tenant-identifier>", "Tenant GUID. From `deployment tenant list`.").option("--download [path]", "Write each applicable rule to its own JSON file, exactly as the service returned it, and pack them into a zip instead of printing them. Each entry is named '<product name>-<policy name>.json'. [path] is the zip file to write; a directory saves '<product name>-deployed-policies.zip' inside it, and leaving it off saves that name in the current directory.").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(LIST_EXAMPLES2).trackedAction(processContext, async (licenseType, productName, tenantIdentifier, options) => {
|
|
18494
18609
|
const download = downloadTarget(options.download);
|
|
18495
18610
|
const [error, result] = await catchError2((async () => {
|
|
18496
18611
|
const api = await createApiClient2(PolicyApi, {
|
|
@@ -18681,7 +18796,7 @@ var registerDeploymentGroupCommands = (deployment) => {
|
|
|
18681
18796
|
"Returns only group-level overrides — tenant inheritance is NOT resolved here.",
|
|
18682
18797
|
"Returns an empty array when the group has no overrides."
|
|
18683
18798
|
].join(`
|
|
18684
|
-
`)).argument("<
|
|
18799
|
+
`)).argument("<group-identifier>", "Group GUID. From `deployment group list` (the `identifier` field).").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(GET_EXAMPLES3).trackedAction(processContext, async (groupIdentifier, options) => {
|
|
18685
18800
|
const [error, result] = await catchError2((async () => {
|
|
18686
18801
|
const api = await createApiClient2(PolicyApi, {
|
|
18687
18802
|
loginValidity: options.loginValidity
|
|
@@ -18731,7 +18846,7 @@ var registerDeploymentGroupCommands = (deployment) => {
|
|
|
18731
18846
|
" policyIdentifier = null — pins 'No Policy' at group level (blocks tenant inheritance for members).",
|
|
18732
18847
|
" policyIdentifier = GUID — pins that policy for this group + product."
|
|
18733
18848
|
].join(`
|
|
18734
|
-
`)).argument("<
|
|
18849
|
+
`)).argument("<group-identifier>", "Group GUID to configure. From `deployment group list`, or the upstream identity provider.").requiredOption("--group <group>", "Display name stored alongside the override (surfaced in audit logs / UI).").requiredOption("--input <path>", "Path to the JSON file holding the assignment array (see command description for the shape).").option("--source <source>", "Identity-provider source for the group (e.g. 'local', 'aad', 'cloud'). Defaults to 'local'. Used only on the upsert path (when the group already exists in governance); on first-time registration the server resolves source from CIS.", "local").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(CONFIGURE_EXAMPLES).trackedAction(processContext, async (groupIdentifier, options) => {
|
|
18735
18850
|
const [error, result] = await catchError2((async () => {
|
|
18736
18851
|
const raw = await readJsonFile(options.input);
|
|
18737
18852
|
const entries = parseGroupPolicyInput(raw);
|
|
@@ -18790,7 +18905,7 @@ var registerDeploymentGroupCommands = (deployment) => {
|
|
|
18790
18905
|
"After deletion, the group's members fall back to user-level or tenant-level assignments.",
|
|
18791
18906
|
"The group itself remains in the upstream identity provider — this only clears governance state."
|
|
18792
18907
|
].join(`
|
|
18793
|
-
`)).argument("<
|
|
18908
|
+
`)).argument("<group-identifier>", "Group GUID to delete. From `deployment group list`.").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(DELETE_EXAMPLES2).trackedAction(processContext, async (groupIdentifier, options) => {
|
|
18794
18909
|
const [error, result] = await catchError2((async () => {
|
|
18795
18910
|
const api = await createApiClient2(GroupApi, {
|
|
18796
18911
|
loginValidity: options.loginValidity
|
|
@@ -18979,7 +19094,7 @@ var registerDeploymentTenantCommands = (deployment) => {
|
|
|
18979
19094
|
"Fetch one tenant and the full list of its (productIdentifier, licenseTypeIdentifier, policyIdentifier)",
|
|
18980
19095
|
"assignments. Use this to inspect current state before editing and re-submitting via `tenant configure`."
|
|
18981
19096
|
].join(`
|
|
18982
|
-
`)).argument("<
|
|
19097
|
+
`)).argument("<tenant-identifier>", "Tenant GUID. Obtain from `deployment tenant list` (the `identifier` field).").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(GET_EXAMPLES4).trackedAction(processContext, async (tenantIdentifier, options) => {
|
|
18983
19098
|
const [error, result] = await catchError2((async () => {
|
|
18984
19099
|
const api = await createApiClient2(TenantApi, {
|
|
18985
19100
|
loginValidity: options.loginValidity
|
|
@@ -19028,7 +19143,7 @@ var registerDeploymentTenantCommands = (deployment) => {
|
|
|
19028
19143
|
" Set policyIdentifier to null — pins 'No Policy' at tenant level (blocks inheritance).",
|
|
19029
19144
|
" Set policyIdentifier to a GUID — pins that policy for this (product, license type)."
|
|
19030
19145
|
].join(`
|
|
19031
|
-
`)).argument("<
|
|
19146
|
+
`)).argument("<tenant-identifier>", "Tenant GUID to configure. From `deployment tenant list`.").requiredOption("--tenant-name <tenantName>", "Tenant display name. Must match the tenant's name in the governance service (from `tenant get`/`tenant list`).").requiredOption("--input <path>", "Path to the JSON file holding the assignment array (see command description for the shape).").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(CONFIGURE_EXAMPLES2).trackedAction(processContext, async (tenantIdentifier, options) => {
|
|
19032
19147
|
const [error, result] = await catchError2((async () => {
|
|
19033
19148
|
const raw = await readJsonFile(options.input);
|
|
19034
19149
|
const entries = parseTenantPolicyInput(raw);
|
|
@@ -19085,7 +19200,7 @@ var registerDeploymentTenantCommands = (deployment) => {
|
|
|
19085
19200
|
"",
|
|
19086
19201
|
"Output includes both the removed entries and the new tenantPolicies snapshot so you can audit the change."
|
|
19087
19202
|
].join(`
|
|
19088
|
-
`)).argument("<
|
|
19203
|
+
`)).argument("<tenant-identifier>", "Tenant GUID. From `deployment tenant list`.").requiredOption("--product-name <product-name>", "Product to unpin (e.g. StudioX). Matches the `productIdentifier` field on the tenant's saved entries.").option("--license-type <license-type>", "Narrow the removal to one license type. Omit to remove every license-type entry for the product.").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(REMOVE_EXAMPLES).trackedAction(processContext, async (tenantIdentifier, options) => {
|
|
19089
19204
|
const [error, result] = await catchError2((async () => {
|
|
19090
19205
|
const tenantApi = await createApiClient2(TenantApi, {
|
|
19091
19206
|
loginValidity: options.loginValidity
|
|
@@ -19271,7 +19386,7 @@ var registerDeploymentUserCommands = (deployment) => {
|
|
|
19271
19386
|
"For the effective policy that actually applies at runtime, use `deployed-policy get` with --user-id.",
|
|
19272
19387
|
"Returns an empty array when the user has no overrides."
|
|
19273
19388
|
].join(`
|
|
19274
|
-
`)).argument("<
|
|
19389
|
+
`)).argument("<user-identifier>", "User GUID. From `deployment user list` (the `identifier` field).").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(GET_EXAMPLES5).trackedAction(processContext, async (userIdentifier, options) => {
|
|
19275
19390
|
const [error, result] = await catchError2((async () => {
|
|
19276
19391
|
const api = await createApiClient2(PolicyApi, {
|
|
19277
19392
|
loginValidity: options.loginValidity
|
|
@@ -19321,7 +19436,7 @@ var registerDeploymentUserCommands = (deployment) => {
|
|
|
19321
19436
|
" policyIdentifier = null — pins 'No Policy' at user level (blocks group/tenant inheritance).",
|
|
19322
19437
|
" policyIdentifier = GUID — pins that policy for this user + product."
|
|
19323
19438
|
].join(`
|
|
19324
|
-
`)).argument("<
|
|
19439
|
+
`)).argument("<user-identifier>", "User GUID to configure. From `deployment user list`, or the upstream identity provider.").requiredOption("--user <user>", "Display name stored alongside the override (surfaced in audit logs / UI).").requiredOption("--input <path>", "Path to the JSON file holding the assignment array (see command description for the shape).").option("--source <source>", "Identity-provider source for the user (e.g. 'local', 'aad', 'cloud'). Defaults to 'local'. Used only on the upsert path (when the user already exists in governance); on first-time registration the server resolves source from CIS.", "local").option("--email <email>", "Email used only when registering a brand-new user with the governance service. Ignored once the user is already known to governance. Defaults to --user when omitted.").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(CONFIGURE_EXAMPLES3).trackedAction(processContext, async (userIdentifier, options) => {
|
|
19325
19440
|
const [error, result] = await catchError2((async () => {
|
|
19326
19441
|
const raw = await readJsonFile(options.input);
|
|
19327
19442
|
const entries = parseUserPolicyInput(raw);
|
|
@@ -19380,7 +19495,7 @@ var registerDeploymentUserCommands = (deployment) => {
|
|
|
19380
19495
|
"After deletion, the user falls back to group/tenant inheritance for all products.",
|
|
19381
19496
|
"Equivalent to `user configure` with an empty array but doesn't require a JSON file."
|
|
19382
19497
|
].join(`
|
|
19383
|
-
`)).argument("<
|
|
19498
|
+
`)).argument("<user-identifier>", "User GUID whose overrides should be cleared. From `deployment user list`.").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(DELETE_EXAMPLES3).trackedAction(processContext, async (userIdentifier, options) => {
|
|
19384
19499
|
const [error, result] = await catchError2((async () => {
|
|
19385
19500
|
const api = await createApiClient2(UserApi, {
|
|
19386
19501
|
loginValidity: options.loginValidity
|
|
@@ -19526,12 +19641,12 @@ var registerProductCommands = (aopsPolicy) => {
|
|
|
19526
19641
|
"Inspect the catalog of products that publish governance templates to this organization.",
|
|
19527
19642
|
"Products are read-only — they're registered by the governance service, not created via the CLI.",
|
|
19528
19643
|
"Use these commands to discover valid values for the --product-name option on `policy create/update`,",
|
|
19529
|
-
"the <
|
|
19644
|
+
"the <product-identifier> argument on `template get`, and `deployment tenant|user|group configure` entries."
|
|
19530
19645
|
].join(`
|
|
19531
19646
|
`));
|
|
19532
19647
|
product.command("list").description([
|
|
19533
19648
|
"List every product visible to the organization, with its name, label, and identifier.",
|
|
19534
|
-
"The `name` field is what `policy create --product-name`, `template get <
|
|
19649
|
+
"The `name` field is what `policy create --product-name`, `template get <product-identifier>`,",
|
|
19535
19650
|
"and `deployment … configure` entries expect. The `label` is the human-readable display name."
|
|
19536
19651
|
].join(`
|
|
19537
19652
|
`)).option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(LIST_EXAMPLES7).trackedAction(processContext, async (options) => {
|
|
@@ -19556,7 +19671,7 @@ var registerProductCommands = (aopsPolicy) => {
|
|
|
19556
19671
|
Data: result ?? []
|
|
19557
19672
|
});
|
|
19558
19673
|
});
|
|
19559
|
-
product.command("get").description("Fetch a single product record (name, label, identifier, flags). Use to verify a name is valid before calling `policy create` or `template get`.").argument("<
|
|
19674
|
+
product.command("get").description("Fetch a single product record (name, label, identifier, flags). Use to verify a name is valid before calling `policy create` or `template get`.").argument("<product-identifier>", "Product name (e.g. StudioX) or GUID. Either the `name` or the `identifier` from `product list` is accepted.").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(GET_EXAMPLES6).trackedAction(processContext, async (productIdentifier, options) => {
|
|
19560
19675
|
const [error, result] = await catchError2((async () => {
|
|
19561
19676
|
const api = await createApiClient2(ProductApi, {
|
|
19562
19677
|
loginValidity: options.loginValidity
|
|
@@ -21882,7 +21997,7 @@ var registerTemplateCommands = (aopsPolicy) => {
|
|
|
21882
21997
|
" when creating or updating a policy."
|
|
21883
21998
|
].join(`
|
|
21884
21999
|
`));
|
|
21885
|
-
template.command("get").description("Fetch the active Form.io policy template for one product and emit policy artifacts. " + "Pass --output-form-data to write the fillable blueprint (the object you fill in and submit back on create/update); display-only components (hidden, button, submit, HTML, content) are skipped and missing leaves get type-appropriate defaults (false for checkbox, [] for editgrid, {} for selectboxes, null for text/select). " + "Pass --output-template-locale-resource to write a human-readable reference derived from the DTO: every product-scoped locale key is replaced with its English string (with a sibling `<prop>-key` preserving the original for traceability) and `defaultData.data` is replaced with a flat annotated map ({ value, type, label, description?, tooltip? }); cross-product prefixes (e.g. `AutomationOps.submit`) are left unresolved. " + "If neither --output flag is passed, the template and form-data are returned in the stdout Success payload (`Data.template` and `Data.formData`) for piping/scripting.").argument("<
|
|
22000
|
+
template.command("get").description("Fetch the active Form.io policy template for one product and emit policy artifacts. " + "Pass --output-form-data to write the fillable blueprint (the object you fill in and submit back on create/update); display-only components (hidden, button, submit, HTML, content) are skipped and missing leaves get type-appropriate defaults (false for checkbox, [] for editgrid, {} for selectboxes, null for text/select). " + "Pass --output-template-locale-resource to write a human-readable reference derived from the DTO: every product-scoped locale key is replaced with its English string (with a sibling `<prop>-key` preserving the original for traceability) and `defaultData.data` is replaced with a flat annotated map ({ value, type, label, description?, tooltip? }); cross-product prefixes (e.g. `AutomationOps.submit`) are left unresolved. " + "If neither --output flag is passed, the template and form-data are returned in the stdout Success payload (`Data.template` and `Data.formData`) for piping/scripting.").argument("<product-identifier>", "Product name or identifier (e.g. StudioX, AITrustLayer). Use 'uip gov aops-policy product list' to list options.").option("--output-form-data <path>", "Write the fillable form-data blueprint JSON (the object you edit and submit back).").option("--output-template-locale-resource <path>", "Write the locale-resolved template reference JSON (open this to understand every field, option label, description, tooltip, and validation message).").option("--login-validity <minutes>", "Login token validity in minutes", (v) => Number.parseInt(v, 10)).examples(GET_EXAMPLES7).trackedAction(processContext, async (productIdentifier, options) => {
|
|
21886
22001
|
const [templateError, dto] = await catchError2((async () => {
|
|
21887
22002
|
const api = await createApiClient2(ContentApi, {
|
|
21888
22003
|
loginValidity: options.loginValidity
|
|
@@ -22280,7 +22395,7 @@ var registerAopsPolicyCommand = (program2) => {
|
|
|
22280
22395
|
"Use this to inspect what values were submitted, or to seed a follow-up `policy update`",
|
|
22281
22396
|
"(edit the returned data, save it to a JSON file, pass it back via --input)."
|
|
22282
22397
|
].join(`
|
|
22283
|
-
`)).argument("<
|
|
22398
|
+
`)).argument("<policy-identifier>", "Policy GUID. Obtain from `policy list` (the `identifier` field of each returned policy).").option("--download [path]", "Write the policy to a JSON file instead of printing it: the raw body of the service's download endpoint (GET /api/Policy/{id}/download) — { policy-name, description, availability, version, product-name, data }, form data included, keys exactly as the service sent them. [path] is the JSON file to write; a directory saves '<product name>-<policy name>.json' inside it, and leaving it off saves that name in the current directory.").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(GET_EXAMPLES8).trackedAction(processContext, async (policyIdentifier, options) => {
|
|
22284
22399
|
const download = downloadTarget(options.download);
|
|
22285
22400
|
if (download.requested) {
|
|
22286
22401
|
const [downloadError, written] = await catchError2((async () => {
|
|
@@ -22421,7 +22536,7 @@ var registerAopsPolicyCommand = (program2) => {
|
|
|
22421
22536
|
"`deployment tenant|user|group remove` (or `configure` with a filtered list) on every subject first,",
|
|
22422
22537
|
"then retry delete."
|
|
22423
22538
|
].join(`
|
|
22424
|
-
`)).argument("<
|
|
22539
|
+
`)).argument("<policy-identifier>", "Policy GUID to delete. From `policy list`.").option("--login-validity <minutes>", "Override the interactive-login token lifetime for this call. Rarely needed.", (v) => Number.parseInt(v, 10)).examples(DELETE_EXAMPLES4).trackedAction(processContext, async (policyIdentifier, options) => {
|
|
22425
22540
|
const [error, result] = await catchError2((async () => {
|
|
22426
22541
|
const api = await createApiClient2(PolicyApi, {
|
|
22427
22542
|
loginValidity: options.loginValidity
|
|
@@ -22699,7 +22814,7 @@ var package_default4 = {
|
|
|
22699
22814
|
name: "@uipath/compliance-packs-sdk",
|
|
22700
22815
|
author: "UiPath",
|
|
22701
22816
|
license: "SEE LICENSE IN LICENSE.txt",
|
|
22702
|
-
version: "1.
|
|
22817
|
+
version: "1.205.0",
|
|
22703
22818
|
description: "SDK for the UiPath Governance Server Compliance Packs API.",
|
|
22704
22819
|
repository: {
|
|
22705
22820
|
type: "git",
|
|
@@ -23913,4 +24028,4 @@ export {
|
|
|
23913
24028
|
registerCommands
|
|
23914
24029
|
};
|
|
23915
24030
|
|
|
23916
|
-
//# debugId=
|
|
24031
|
+
//# debugId=6E546F401684292F64756E2164756E21
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@uipath/gov-tool",
|
|
3
3
|
"author": "UiPath",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.205.0-preview.256",
|
|
6
6
|
"description": "Manage UiPath governance — AOps policies, Access policies, and compliance packs.",
|
|
7
7
|
"private": false,
|
|
8
8
|
"repository": {
|
|
@@ -24,5 +24,5 @@
|
|
|
24
24
|
"files": [
|
|
25
25
|
"dist"
|
|
26
26
|
],
|
|
27
|
-
"gitHead": "
|
|
27
|
+
"gitHead": "63740c6cbb7ff282fa9118cc16a148eb030b245f"
|
|
28
28
|
}
|