@postman-cse/onboarding-repo-sync 2.4.1 → 2.5.0

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/cli.cjs CHANGED
@@ -42722,14 +42722,14 @@ var require_description = __commonJS({
42722
42722
  var z = __importStar(require_mini());
42723
42723
  var metadata_1 = require_metadata();
42724
42724
  var MAX_CONTENT_LENGTH = 1e6;
42725
- function truncate2(value) {
42725
+ function truncate3(value) {
42726
42726
  return value.length > MAX_CONTENT_LENGTH ? value.slice(0, MAX_CONTENT_LENGTH) : value;
42727
42727
  }
42728
42728
  exports2.Description = (0, schemas_1.model)(z.union([
42729
- z.pipe(z.string(), z.transform(truncate2)),
42729
+ z.pipe(z.string(), z.transform(truncate3)),
42730
42730
  z.null(),
42731
42731
  z.object({
42732
- content: z.pipe(z.optional(z.string()), z.transform((value) => truncate2(value ?? ""))),
42732
+ content: z.pipe(z.optional(z.string()), z.transform((value) => truncate3(value ?? ""))),
42733
42733
  type: z.optional(z.string()),
42734
42734
  version: z.optional(z.unknown())
42735
42735
  })
@@ -57955,7 +57955,7 @@ var require_lodash = __commonJS({
57955
57955
  var strSymbols = stringToArray(string), start = charsStartIndex(strSymbols, stringToArray(chars));
57956
57956
  return castSlice(strSymbols, start).join("");
57957
57957
  }
57958
- function truncate2(string, options) {
57958
+ function truncate3(string, options) {
57959
57959
  var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION;
57960
57960
  if (isObject(options)) {
57961
57961
  var separator = "separator" in options ? options.separator : separator;
@@ -58515,7 +58515,7 @@ var require_lodash = __commonJS({
58515
58515
  lodash.trim = trim;
58516
58516
  lodash.trimEnd = trimEnd;
58517
58517
  lodash.trimStart = trimStart;
58518
- lodash.truncate = truncate2;
58518
+ lodash.truncate = truncate3;
58519
58519
  lodash.unescape = unescape2;
58520
58520
  lodash.uniqueId = uniqueId;
58521
58521
  lodash.upperCase = upperCase;
@@ -95746,10 +95746,10 @@ var require_unicode = __commonJS({
95746
95746
  module2.exports.isLineTerminatorJSON = function isLineTerminatorJSON(x) {
95747
95747
  return x === "\n" || x === "\r";
95748
95748
  };
95749
- module2.exports.isIdentifierStart = function isIdentifierStart(x) {
95749
+ module2.exports.isIdentifierStart = function isIdentifierStart2(x) {
95750
95750
  return x === "$" || x === "_" || x >= "A" && x <= "Z" || x >= "a" && x <= "z" || x >= "\x80" && Uni.NonAsciiIdentifierStart.test(x);
95751
95751
  };
95752
- module2.exports.isIdentifierPart = function isIdentifierPart(x) {
95752
+ module2.exports.isIdentifierPart = function isIdentifierPart2(x) {
95753
95753
  return x === "$" || x === "_" || x >= "A" && x <= "Z" || x >= "a" && x <= "z" || x >= "0" && x <= "9" || x >= "\x80" && Uni.NonAsciiIdentifierPart.test(x);
95754
95754
  };
95755
95755
  module2.exports.NonAsciiIdentifierStart = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/;
@@ -118663,7 +118663,7 @@ var require_truncate = __commonJS({
118663
118663
  function isLowSurrogate(codePoint) {
118664
118664
  return codePoint >= 56320 && codePoint <= 57343;
118665
118665
  }
118666
- module2.exports = function truncate2(getLength, string, byteLength) {
118666
+ module2.exports = function truncate3(getLength, string, byteLength) {
118667
118667
  if (typeof string !== "string") {
118668
118668
  throw new Error("Input must be string");
118669
118669
  }
@@ -118694,9 +118694,9 @@ var require_truncate = __commonJS({
118694
118694
  var require_truncate_utf8_bytes = __commonJS({
118695
118695
  "node_modules/truncate-utf8-bytes/index.js"(exports2, module2) {
118696
118696
  "use strict";
118697
- var truncate2 = require_truncate();
118697
+ var truncate3 = require_truncate();
118698
118698
  var getLength = Buffer.byteLength.bind(Buffer);
118699
- module2.exports = truncate2.bind(null, getLength);
118699
+ module2.exports = truncate3.bind(null, getLength);
118700
118700
  }
118701
118701
  });
118702
118702
 
@@ -132414,7 +132414,9 @@ function buildCiWorkflowLines(installUrl, postmanRegion, privateMockAuth) {
132414
132414
  ` POSTMAN_CLI_INSTALL_URL: ${installUrl}`,
132415
132415
  ' run: curl -fsSL "$POSTMAN_CLI_INSTALL_URL" | sh',
132416
132416
  " - name: Login to Postman CLI",
132417
- " run: postman login --with-api-key ${{ secrets.POSTMAN_API_KEY }}" + (postmanRegion === "eu" ? " --region eu" : ""),
132417
+ " env:",
132418
+ " POSTMAN_API_KEY: ${{ secrets.POSTMAN_API_KEY }}",
132419
+ ' run: postman login --with-api-key "$POSTMAN_API_KEY"' + (postmanRegion === "eu" ? " --region eu" : ""),
132418
132420
  " - name: Resolve Postman Resource IDs",
132419
132421
  " run: |",
132420
132422
  " ruby <<'RUBY'",
@@ -132453,12 +132455,13 @@ function buildCiWorkflowLines(installUrl, postmanRegion, privateMockAuth) {
132453
132455
  " - name: Run Smoke Tests",
132454
132456
  " env:",
132455
132457
  " POSTMAN_SSL_CLIENT_PASSPHRASE: ${{ secrets.POSTMAN_SSL_CLIENT_PASSPHRASE }}",
132458
+ ...privateMockAuth ? [" POSTMAN_API_KEY: ${{ secrets.POSTMAN_API_KEY }}"] : [],
132456
132459
  " run: |",
132457
132460
  ' CMD=(postman collection run "$POSTMAN_SMOKE_COLLECTION_UID"',
132458
132461
  ' -e "$POSTMAN_ENVIRONMENT_UID"',
132459
132462
  " --report-events",
132460
132463
  ` --env-var "CI_ENVIRONMENT=\${{ vars.CI_ENVIRONMENT || 'Production' }}")`,
132461
- ...privateMockAuth ? [' CMD+=(--env-var "' + PRIVATE_MOCK_AUTH_VARIABLE + '=${{ secrets.POSTMAN_API_KEY }}")'] : [],
132464
+ ...privateMockAuth ? [' CMD+=(--env-var "' + PRIVATE_MOCK_AUTH_VARIABLE + '=$POSTMAN_API_KEY")'] : [],
132462
132465
  ' if [ -f "$RUNNER_TEMP/postman-ssl/client.crt" ]; then',
132463
132466
  ' CMD+=(--ssl-client-cert "$RUNNER_TEMP/postman-ssl/client.crt"',
132464
132467
  ' --ssl-client-key "$RUNNER_TEMP/postman-ssl/client.key")',
@@ -132473,12 +132476,13 @@ function buildCiWorkflowLines(installUrl, postmanRegion, privateMockAuth) {
132473
132476
  " - name: Run Contract Tests",
132474
132477
  " env:",
132475
132478
  " POSTMAN_SSL_CLIENT_PASSPHRASE: ${{ secrets.POSTMAN_SSL_CLIENT_PASSPHRASE }}",
132479
+ ...privateMockAuth ? [" POSTMAN_API_KEY: ${{ secrets.POSTMAN_API_KEY }}"] : [],
132476
132480
  " run: |",
132477
132481
  ' CMD=(postman collection run "$POSTMAN_CONTRACT_COLLECTION_UID"',
132478
132482
  ' -e "$POSTMAN_ENVIRONMENT_UID"',
132479
132483
  " --report-events",
132480
132484
  ` --env-var "CI_ENVIRONMENT=\${{ vars.CI_ENVIRONMENT || 'Production' }}")`,
132481
- ...privateMockAuth ? [' CMD+=(--env-var "' + PRIVATE_MOCK_AUTH_VARIABLE + '=${{ secrets.POSTMAN_API_KEY }}")'] : [],
132485
+ ...privateMockAuth ? [' CMD+=(--env-var "' + PRIVATE_MOCK_AUTH_VARIABLE + '=$POSTMAN_API_KEY")'] : [],
132482
132486
  ' if [ -f "$RUNNER_TEMP/postman-ssl/client.crt" ]; then',
132483
132487
  ' CMD+=(--ssl-client-cert "$RUNNER_TEMP/postman-ssl/client.crt"',
132484
132488
  ' --ssl-client-key "$RUNNER_TEMP/postman-ssl/client.key")',
@@ -132505,7 +132509,9 @@ function buildAdoWindowsCollectionRunLines(displayName, collectionEnvironmentNam
132505
132509
  ` $collectionUid = $env:${collectionEnvironmentName}`,
132506
132510
  " $ciEnvironment = Resolve-AdoOptional $env:CI_ENVIRONMENT",
132507
132511
  " if ([string]::IsNullOrWhiteSpace($ciEnvironment)) { $ciEnvironment = 'Production' }",
132508
- ` $arguments = @('collection', 'run', $collectionUid, '-e', $env:POSTMAN_ENVIRONMENT_UID, '--report-events', '--env-var', "CI_ENVIRONMENT=$ciEnvironment")`,
132512
+ " $responseTimeThreshold = Resolve-AdoOptional $env:RESPONSE_TIME_THRESHOLD",
132513
+ " if ([string]::IsNullOrWhiteSpace($responseTimeThreshold)) { $responseTimeThreshold = '10000' }",
132514
+ ` $arguments = @('collection', 'run', $collectionUid, '-e', $env:POSTMAN_ENVIRONMENT_UID, '--report-events', '--env-var', "CI_ENVIRONMENT=$ciEnvironment", '--env-var', "RESPONSE_TIME_THRESHOLD=$responseTimeThreshold")`,
132509
132515
  ...privateMockAuth ? [` $arguments += @('--env-var', "${PRIVATE_MOCK_AUTH_VARIABLE}=$env:POSTMAN_API_KEY")`] : [],
132510
132516
  " $sslRoot = Join-Path $env:AGENT_TEMPDIRECTORY 'postman-ssl'",
132511
132517
  " $clientCert = Join-Path $sslRoot 'client.crt'",
@@ -132528,6 +132534,7 @@ function buildAdoWindowsCollectionRunLines(displayName, collectionEnvironmentNam
132528
132534
  ` ${collectionEnvironmentName}: $(${collectionEnvironmentName})`,
132529
132535
  " POSTMAN_ENVIRONMENT_UID: $(POSTMAN_ENVIRONMENT_UID)",
132530
132536
  " CI_ENVIRONMENT: $(CI_ENVIRONMENT)",
132537
+ " RESPONSE_TIME_THRESHOLD: $(RESPONSE_TIME_THRESHOLD)",
132531
132538
  " POSTMAN_SSL_CLIENT_PASSPHRASE: $(POSTMAN_SSL_CLIENT_PASSPHRASE)",
132532
132539
  ...privateMockAuth ? [" POSTMAN_API_KEY: $(POSTMAN_API_KEY)"] : []
132533
132540
  ];
@@ -133297,7 +133304,7 @@ function detectRepoContext(input, env = process.env) {
133297
133304
  };
133298
133305
  }
133299
133306
 
133300
- // node_modules/@postman-cse/automation-telemetry-core/dist/ci-context.js
133307
+ // node_modules/@postman-cse/automation-core/dist/ci-context.js
133301
133308
  function norm(value) {
133302
133309
  const trimmed = (value ?? "").trim();
133303
133310
  return trimmed.length > 0 ? trimmed : void 0;
@@ -133448,7 +133455,7 @@ function detectCiProviderContext(env = process.env) {
133448
133455
  return { ciProvider: "unknown", runnerKind: "unknown" };
133449
133456
  }
133450
133457
 
133451
- // node_modules/@postman-cse/automation-telemetry-core/dist/repo-context.js
133458
+ // node_modules/@postman-cse/automation-core/dist/repo-context.js
133452
133459
  function normalize2(value) {
133453
133460
  const trimmed = (value ?? "").trim();
133454
133461
  return trimmed.length > 0 ? trimmed : void 0;
@@ -133537,7 +133544,7 @@ function detectRepoContext2(input, env = process.env) {
133537
133544
  };
133538
133545
  }
133539
133546
 
133540
- // node_modules/@postman-cse/automation-telemetry-core/dist/telemetry.js
133547
+ // node_modules/@postman-cse/automation-core/dist/telemetry.js
133541
133548
  var import_node_crypto = require("node:crypto");
133542
133549
  var import_undici2 = __toESM(require_undici(), 1);
133543
133550
  var SCHEMA_VERSION = 3;
@@ -133547,10 +133554,14 @@ var proxyDispatcher;
133547
133554
  function getProxyDispatcher() {
133548
133555
  return proxyDispatcher ??= new import_undici2.EnvHttpProxyAgent();
133549
133556
  }
133550
- function resolveActionVersion(explicit) {
133557
+ function resolveActionVersion(explicit, env = process.env) {
133551
133558
  if (explicit) {
133552
133559
  return explicit;
133553
133560
  }
133561
+ const ref = env.GITHUB_ACTION_REF?.trim();
133562
+ if (ref) {
133563
+ return ref;
133564
+ }
133554
133565
  return typeof __ACTION_VERSION__ !== "undefined" && __ACTION_VERSION__ ? __ACTION_VERSION__ : "unknown";
133555
133566
  }
133556
133567
  function telemetryDisabled(env) {
@@ -133633,7 +133644,7 @@ async function send(event, options) {
133633
133644
  function createTelemetryContext(options) {
133634
133645
  const env = options.env ?? process.env;
133635
133646
  const now = options.now ?? Date.now;
133636
- const actionVersion = resolveActionVersion(options.actionVersion);
133647
+ const actionVersion = resolveActionVersion(options.actionVersion, env);
133637
133648
  let teamId = "";
133638
133649
  let accountType = "unknown";
133639
133650
  let emitted = false;
@@ -133673,6 +133684,186 @@ function createTelemetryContext(options) {
133673
133684
  };
133674
133685
  }
133675
133686
 
133687
+ // node_modules/@postman-cse/automation-core/dist/logger.js
133688
+ var LEVEL_ORDER = {
133689
+ debug: 10,
133690
+ info: 20,
133691
+ warning: 30,
133692
+ error: 40
133693
+ };
133694
+ function defaultCorrelationId() {
133695
+ return Math.random().toString(36).slice(2, 10);
133696
+ }
133697
+ function resolveLogLevel(env = process.env) {
133698
+ const explicit = String(env.POSTMAN_ACTIONS_LOG_LEVEL ?? "").trim().toLowerCase();
133699
+ if (explicit === "debug" || explicit === "trace" || explicit === "verbose")
133700
+ return "debug";
133701
+ if (explicit === "info")
133702
+ return "info";
133703
+ if (explicit === "warn" || explicit === "warning")
133704
+ return "warning";
133705
+ if (explicit === "error" || explicit === "quiet")
133706
+ return "error";
133707
+ if (isTruthyFlag(env.RUNNER_DEBUG) || isTruthyFlag(env.ACTIONS_STEP_DEBUG))
133708
+ return "debug";
133709
+ if (isTruthyFlag(env.POSTMAN_ACTIONS_DEBUG))
133710
+ return "debug";
133711
+ return "info";
133712
+ }
133713
+ function isTruthyFlag(value) {
133714
+ if (!value)
133715
+ return false;
133716
+ const flag = value.trim().toLowerCase();
133717
+ return flag === "1" || flag === "true" || flag === "yes" || flag === "on";
133718
+ }
133719
+ function actionSink(core) {
133720
+ return {
133721
+ debug: (message) => core.debug?.(message),
133722
+ info: (message) => core.info(message),
133723
+ warning: (message) => (core.warning ?? core.info)(message),
133724
+ error: (message) => (core.error ?? core.warning ?? core.info)(message),
133725
+ startGroup: core.startGroup ? (name) => core.startGroup?.(name) : void 0,
133726
+ endGroup: core.endGroup ? () => core.endGroup?.() : void 0,
133727
+ isDebug: core.isDebug ? () => core.isDebug?.() ?? false : void 0
133728
+ };
133729
+ }
133730
+ var MIN_SECRET_LENGTH = 4;
133731
+ function renderValue(value, maxLength = 512) {
133732
+ if (value === void 0)
133733
+ return "undefined";
133734
+ if (value === null)
133735
+ return "null";
133736
+ if (typeof value === "string")
133737
+ return truncate(value, maxLength);
133738
+ if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") {
133739
+ return String(value);
133740
+ }
133741
+ if (value instanceof Error)
133742
+ return truncate(describeError(value), maxLength);
133743
+ if (Array.isArray(value)) {
133744
+ return truncate(`[${value.map((entry) => renderValue(entry, 120)).join(", ")}]`, maxLength);
133745
+ }
133746
+ try {
133747
+ return truncate(JSON.stringify(value) ?? String(value), maxLength);
133748
+ } catch {
133749
+ return "<unserializable>";
133750
+ }
133751
+ }
133752
+ function truncate(text, maxLength) {
133753
+ if (text.length <= maxLength)
133754
+ return text;
133755
+ return `${text.slice(0, maxLength)}\u2026 (+${text.length - maxLength} chars)`;
133756
+ }
133757
+ function describeError(error, maxDepth = 5) {
133758
+ const parts = [];
133759
+ let current = error;
133760
+ let depth = 0;
133761
+ while (current !== void 0 && current !== null && depth < maxDepth) {
133762
+ if (current instanceof Error) {
133763
+ const code = current.code;
133764
+ parts.push(code ? `${current.name}[${code}]: ${current.message}` : `${current.name}: ${current.message}`);
133765
+ current = current.cause;
133766
+ } else if (typeof current === "object") {
133767
+ try {
133768
+ parts.push(JSON.stringify(current) ?? String(current));
133769
+ } catch {
133770
+ parts.push(String(current));
133771
+ }
133772
+ current = void 0;
133773
+ } else {
133774
+ parts.push(String(current));
133775
+ current = void 0;
133776
+ }
133777
+ depth += 1;
133778
+ }
133779
+ if (parts.length === 0)
133780
+ return "unknown error";
133781
+ return parts.join(" <- caused by ");
133782
+ }
133783
+ function createLogger(options) {
133784
+ const env = options.env ?? process.env;
133785
+ const level = options.level ?? resolveLogLevel(env);
133786
+ const secrets = options.secrets ?? /* @__PURE__ */ new Set();
133787
+ const correlationId = options.correlationId ?? defaultCorrelationId();
133788
+ const now = options.now ?? (() => Date.now());
133789
+ const threshold = LEVEL_ORDER[level];
133790
+ function addSecret(value) {
133791
+ if (typeof value !== "string")
133792
+ return;
133793
+ const trimmed = value.trim();
133794
+ if (trimmed.length < MIN_SECRET_LENGTH)
133795
+ return;
133796
+ secrets.add(trimmed);
133797
+ }
133798
+ function redact(text) {
133799
+ let output = typeof text === "string" ? text : renderValue(text, 4096);
133800
+ for (const secret of secrets) {
133801
+ if (!secret)
133802
+ continue;
133803
+ output = output.split(secret).join("***");
133804
+ const encoded = encodeURIComponent(secret);
133805
+ if (encoded !== secret)
133806
+ output = output.split(encoded).join("***");
133807
+ }
133808
+ return output;
133809
+ }
133810
+ function build2(baseFields) {
133811
+ function emit(target, message, fields) {
133812
+ if (LEVEL_ORDER[target] < threshold)
133813
+ return;
133814
+ const merged = { ...baseFields, ...fields ?? {} };
133815
+ const rendered = Object.entries(merged).filter(([, value]) => value !== void 0).map(([key, value]) => `${key}=${redact(renderValue(value))}`).join(" ");
133816
+ const line = rendered ? `${redact(message)} | ${rendered}` : redact(message);
133817
+ switch (target) {
133818
+ case "debug":
133819
+ options.sink.debug(line);
133820
+ break;
133821
+ case "info":
133822
+ options.sink.info(line);
133823
+ break;
133824
+ case "warning":
133825
+ options.sink.warning(line);
133826
+ break;
133827
+ case "error":
133828
+ options.sink.error(line);
133829
+ break;
133830
+ }
133831
+ }
133832
+ const logger = {
133833
+ level,
133834
+ correlationId,
133835
+ addSecret,
133836
+ redact,
133837
+ isDebug: () => threshold <= LEVEL_ORDER.debug,
133838
+ debug: (message, fields) => emit("debug", message, fields),
133839
+ info: (message, fields) => emit("info", message, fields),
133840
+ warning: (message, fields) => emit("warning", message, fields),
133841
+ error: (message, fields) => emit("error", message, fields),
133842
+ failure: (message, error, fields) => emit("error", message, { ...fields ?? {}, error: describeError(error) }),
133843
+ child: (fields) => build2({ ...baseFields, ...fields }),
133844
+ async phase(name, fn, fields) {
133845
+ const scoped = build2({ ...baseFields, ...fields ?? {}, phase: name });
133846
+ const started = now();
133847
+ scoped.debug("phase start");
133848
+ options.sink.startGroup?.(name);
133849
+ try {
133850
+ const result = await fn();
133851
+ scoped.debug("phase ok", { duration_ms: Math.round(now() - started) });
133852
+ return result;
133853
+ } catch (error) {
133854
+ scoped.failure("phase failed", error, { duration_ms: Math.round(now() - started) });
133855
+ throw error;
133856
+ } finally {
133857
+ options.sink.endGroup?.();
133858
+ }
133859
+ }
133860
+ };
133861
+ return logger;
133862
+ }
133863
+ const root = build2({ run: correlationId, ...options.fields ?? {} });
133864
+ return root;
133865
+ }
133866
+
133676
133867
  // src/action-version.ts
133677
133868
  var import_node_fs3 = require("node:fs");
133678
133869
  var import_node_path2 = require("node:path");
@@ -133689,7 +133880,7 @@ function resolveActionVersion2() {
133689
133880
  }
133690
133881
 
133691
133882
  // src/lib/http-error.ts
133692
- function truncate(value, limit) {
133883
+ function truncate2(value, limit) {
133693
133884
  if (value.length <= limit) {
133694
133885
  return value;
133695
133886
  }
@@ -133699,7 +133890,7 @@ function buildMessage(init) {
133699
133890
  const method = String(init.method || "GET").toUpperCase();
133700
133891
  const status = `${init.status}${init.statusText ? ` ${init.statusText}` : ""}`;
133701
133892
  const url = redactSecrets(init.url, init.secretValues);
133702
- const body = truncate(
133893
+ const body = truncate2(
133703
133894
  redactSecrets(init.responseBody || "", init.secretValues),
133704
133895
  Math.max(0, init.bodyLimit ?? 800)
133705
133896
  );
@@ -135078,30 +135269,13 @@ var PostmanAssetsClient = class {
135078
135269
  }
135079
135270
  };
135080
135271
 
135081
- // src/lib/postman/postman-gateway-assets-client.ts
135082
- var MockContractError = class extends Error {
135083
- constructor(message) {
135084
- super(message);
135085
- this.name = "MockContractError";
135086
- }
135087
- };
135088
- function requireMockVisibility(mock, requested) {
135089
- if (mock.visibility === "unknown") {
135090
- throw new MockContractError(
135091
- `MOCK_VISIBILITY_UNKNOWN: Mock ${mock.uid} did not expose a supported visibility field. Refusing to assume it is callable.`
135092
- );
135093
- }
135094
- if (mock.visibility !== requested) {
135095
- const code = requested === "public" ? "MOCK_NOT_PUBLIC" : "MOCK_NOT_PRIVATE";
135096
- throw new MockContractError(
135097
- `${code}: Mock ${mock.uid} is ${mock.visibility}, but mock-visibility requires ${requested}. Change the mock visibility in Postman or set mock-visibility to ${mock.visibility}.`
135098
- );
135099
- }
135100
- return mock;
135101
- }
135272
+ // src/lib/postman/private-mock-auth-script.ts
135102
135273
  var LEGACY_PRIVATE_MOCK_AUTH_MARKER = "postman-enterprise-automation: private-mock-auth";
135103
- var PRIVATE_MOCK_AUTH_MARKER = `${LEGACY_PRIVATE_MOCK_AUTH_MARKER}-v2`;
135274
+ var PRIVATE_MOCK_AUTH_V2_MARKER = `${LEGACY_PRIVATE_MOCK_AUTH_MARKER}-v2`;
135275
+ var PRIVATE_MOCK_AUTH_V3_MARKER = `${LEGACY_PRIVATE_MOCK_AUTH_MARKER}-v3`;
135104
135276
  var PRIVATE_MOCK_AUTH_VARIABLE2 = "postmanPrivateMockApiKey";
135277
+ var PRIVATE_MOCK_AUTH_ROOT_TYPE = "http:beforeRequest";
135278
+ var PRIVATE_MOCK_AUTH_ROOT_MARKER = `${LEGACY_PRIVATE_MOCK_AUTH_MARKER}-root`;
135105
135279
  var LEGACY_PRIVATE_MOCK_AUTH_SCRIPT = [
135106
135280
  `// ${LEGACY_PRIVATE_MOCK_AUTH_MARKER}`,
135107
135281
  `var privateMockApiKey = pm.variables.get('${PRIVATE_MOCK_AUTH_VARIABLE2}');`,
@@ -135110,8 +135284,8 @@ var LEGACY_PRIVATE_MOCK_AUTH_SCRIPT = [
135110
135284
  " pm.request.headers.upsert({ key: 'x-api-key', value: privateMockApiKey });",
135111
135285
  "}"
135112
135286
  ].join("\n");
135113
- var PRIVATE_MOCK_AUTH_SCRIPT = [
135114
- `// ${PRIVATE_MOCK_AUTH_MARKER}`,
135287
+ var PRIVATE_MOCK_AUTH_V2_SCRIPT = [
135288
+ `// ${PRIVATE_MOCK_AUTH_V2_MARKER}`,
135115
135289
  `var privateMockApiKey = pm.variables.get('${PRIVATE_MOCK_AUTH_VARIABLE2}');`,
135116
135290
  "var privateMockHostValue = pm.request.url && pm.request.url.getHost ? pm.request.url.getHost() : '';",
135117
135291
  "var privateMockHost = Array.isArray(privateMockHostValue) ? privateMockHostValue.join('.') : String(privateMockHostValue);",
@@ -135122,8 +135296,347 @@ var PRIVATE_MOCK_AUTH_SCRIPT = [
135122
135296
  ` console.warn('This mock server is private. Set the ${PRIVATE_MOCK_AUTH_VARIABLE2} variable to a Postman API key with access to it, or the request returns 401.');`,
135123
135297
  "}"
135124
135298
  ].join("\n");
135125
- function removeLegacyPrivateMockAuth(code) {
135126
- return code.split(LEGACY_PRIVATE_MOCK_AUTH_SCRIPT).join("").trim();
135299
+ var PRIVATE_MOCK_AUTH_V3_SCRIPT = [
135300
+ `// ${PRIVATE_MOCK_AUTH_V3_MARKER}`,
135301
+ `var privateMockApiKey = pm.variables.get('${PRIVATE_MOCK_AUTH_VARIABLE2}');`,
135302
+ "var privateMockHost = '';",
135303
+ "try {",
135304
+ " var privateMockUrl = pm.variables.replaceIn(pm.request.url.toString());",
135305
+ " privateMockHost = new URL(privateMockUrl).hostname;",
135306
+ "} catch (error) {",
135307
+ " console.warn('Could not resolve the request URL for private mock authentication; x-api-key was not added.');",
135308
+ "}",
135309
+ "var isPrivateMockHost = /(^|\\.)mock\\.pstmn\\.io$/i.test(privateMockHost);",
135310
+ "if (isPrivateMockHost && privateMockApiKey) {",
135311
+ " pm.request.headers.upsert({ key: 'x-api-key', value: privateMockApiKey });",
135312
+ "} else if (isPrivateMockHost) {",
135313
+ ` console.warn('This mock server is private. Set the ${PRIVATE_MOCK_AUTH_VARIABLE2} variable to a Postman API key with access to it, or the request returns 401.');`,
135314
+ "}"
135315
+ ].join("\n");
135316
+ var PRIVATE_MOCK_AUTH_ROOT_SCRIPT = [
135317
+ `// ${PRIVATE_MOCK_AUTH_ROOT_MARKER}`,
135318
+ `var privateMockApiKey = pm.variables.get('${PRIVATE_MOCK_AUTH_VARIABLE2}');`,
135319
+ "var privateMockHost = '';",
135320
+ "try {",
135321
+ " var privateMockUrl = pm.variables.replaceIn(pm.request.url.toString());",
135322
+ " privateMockHost = new URL(privateMockUrl).hostname;",
135323
+ "} catch (error) {",
135324
+ " console.warn('Could not resolve the request URL for private mock authentication; x-api-key was not added.');",
135325
+ "}",
135326
+ "var isPrivateMockHost = /(^|\\.)mock\\.pstmn\\.io$/i.test(privateMockHost);",
135327
+ "if (isPrivateMockHost && privateMockApiKey) {",
135328
+ " pm.request.headers.upsert({ key: 'x-api-key', value: privateMockApiKey });",
135329
+ "} else if (isPrivateMockHost) {",
135330
+ ` console.warn('This mock server is private. Set the ${PRIVATE_MOCK_AUTH_VARIABLE2} variable to a Postman API key with access to it, or the request returns 401.');`,
135331
+ "}"
135332
+ ].join("\n");
135333
+ var MANAGED_ITEM_AUTH_BLOCKS = [
135334
+ LEGACY_PRIVATE_MOCK_AUTH_SCRIPT,
135335
+ PRIVATE_MOCK_AUTH_V2_SCRIPT,
135336
+ PRIVATE_MOCK_AUTH_V3_SCRIPT
135337
+ ];
135338
+ function isManagedPrivateMockAuthRootHook(script) {
135339
+ return String(script.type ?? "") === PRIVATE_MOCK_AUTH_ROOT_TYPE && String(script.code ?? "") === PRIVATE_MOCK_AUTH_ROOT_SCRIPT;
135340
+ }
135341
+ var REGEX_PREFIX_KEYWORDS = /* @__PURE__ */ new Set([
135342
+ "await",
135343
+ "case",
135344
+ "delete",
135345
+ "do",
135346
+ "else",
135347
+ "in",
135348
+ "instanceof",
135349
+ "of",
135350
+ "return",
135351
+ "throw",
135352
+ "typeof",
135353
+ "void",
135354
+ "yield"
135355
+ ]);
135356
+ function isIdentifierStart(ch) {
135357
+ return ch !== void 0 && /[A-Za-z_$]/.test(ch);
135358
+ }
135359
+ function isIdentifierPart(ch) {
135360
+ return ch !== void 0 && /[A-Za-z0-9_$]/.test(ch);
135361
+ }
135362
+ function markTopLevelScriptBytes(source) {
135363
+ const topLevel = new Uint8Array(source.length);
135364
+ let state = "script";
135365
+ let canStartRegex = true;
135366
+ let regexCharacterClass = false;
135367
+ for (let i = 0; i < source.length; i++) {
135368
+ const ch = source[i];
135369
+ const next = source[i + 1];
135370
+ if (state === "script") {
135371
+ topLevel[i] = 1;
135372
+ if (ch === "/" && next === "*") {
135373
+ topLevel[i] = 0;
135374
+ state = "block_comment";
135375
+ i++;
135376
+ topLevel[i] = 0;
135377
+ continue;
135378
+ }
135379
+ if (ch === "/" && next === "/") {
135380
+ topLevel[i + 1] = 1;
135381
+ i++;
135382
+ while (i + 1 < source.length && source[i + 1] !== "\n") {
135383
+ i++;
135384
+ topLevel[i] = 1;
135385
+ }
135386
+ continue;
135387
+ }
135388
+ if (ch === "/") {
135389
+ if (canStartRegex) {
135390
+ topLevel[i] = 0;
135391
+ state = "regex";
135392
+ regexCharacterClass = false;
135393
+ continue;
135394
+ }
135395
+ canStartRegex = true;
135396
+ if (next === "=") {
135397
+ i++;
135398
+ topLevel[i] = 1;
135399
+ }
135400
+ continue;
135401
+ }
135402
+ if (ch === "'") {
135403
+ state = "single";
135404
+ topLevel[i] = 0;
135405
+ continue;
135406
+ }
135407
+ if (ch === '"') {
135408
+ state = "double";
135409
+ topLevel[i] = 0;
135410
+ continue;
135411
+ }
135412
+ if (ch === "`") {
135413
+ state = "template";
135414
+ topLevel[i] = 0;
135415
+ continue;
135416
+ }
135417
+ if (/\s/.test(ch)) {
135418
+ continue;
135419
+ }
135420
+ if (isIdentifierStart(ch)) {
135421
+ let end = i + 1;
135422
+ while (isIdentifierPart(source[end])) {
135423
+ topLevel[end] = 1;
135424
+ end++;
135425
+ }
135426
+ canStartRegex = REGEX_PREFIX_KEYWORDS.has(source.slice(i, end));
135427
+ i = end - 1;
135428
+ continue;
135429
+ }
135430
+ if (/[0-9]/.test(ch)) {
135431
+ let end = i + 1;
135432
+ while (/[A-Za-z0-9_.]/.test(source[end] ?? "")) {
135433
+ topLevel[end] = 1;
135434
+ end++;
135435
+ }
135436
+ canStartRegex = false;
135437
+ i = end - 1;
135438
+ continue;
135439
+ }
135440
+ if ((ch === "+" || ch === "-") && next === ch) {
135441
+ const wasPrefix = canStartRegex;
135442
+ i++;
135443
+ topLevel[i] = 1;
135444
+ canStartRegex = wasPrefix;
135445
+ continue;
135446
+ }
135447
+ if (ch === "?" && next === ".") {
135448
+ i++;
135449
+ topLevel[i] = 1;
135450
+ canStartRegex = false;
135451
+ continue;
135452
+ }
135453
+ if (")]}".includes(ch) || ch === ".") {
135454
+ canStartRegex = false;
135455
+ continue;
135456
+ }
135457
+ if ("([{,;:=!~*%&|^<>+-?".includes(ch)) {
135458
+ canStartRegex = true;
135459
+ continue;
135460
+ }
135461
+ canStartRegex = false;
135462
+ continue;
135463
+ }
135464
+ if (state === "block_comment") {
135465
+ topLevel[i] = 0;
135466
+ if (ch === "*" && next === "/") {
135467
+ topLevel[i] = 0;
135468
+ i++;
135469
+ topLevel[i] = 0;
135470
+ state = "script";
135471
+ }
135472
+ continue;
135473
+ }
135474
+ if (state === "single") {
135475
+ topLevel[i] = 0;
135476
+ if (ch === "\\" && i + 1 < source.length) {
135477
+ i++;
135478
+ topLevel[i] = 0;
135479
+ continue;
135480
+ }
135481
+ if (ch === "'") {
135482
+ state = "script";
135483
+ canStartRegex = false;
135484
+ }
135485
+ continue;
135486
+ }
135487
+ if (state === "double") {
135488
+ topLevel[i] = 0;
135489
+ if (ch === "\\" && i + 1 < source.length) {
135490
+ i++;
135491
+ topLevel[i] = 0;
135492
+ continue;
135493
+ }
135494
+ if (ch === '"') {
135495
+ state = "script";
135496
+ canStartRegex = false;
135497
+ }
135498
+ continue;
135499
+ }
135500
+ if (state === "regex") {
135501
+ topLevel[i] = 0;
135502
+ if (ch === "\\" && i + 1 < source.length) {
135503
+ i++;
135504
+ topLevel[i] = 0;
135505
+ continue;
135506
+ }
135507
+ if (ch === "\n" || ch === "\r") {
135508
+ state = "script";
135509
+ canStartRegex = true;
135510
+ regexCharacterClass = false;
135511
+ continue;
135512
+ }
135513
+ if (ch === "[") {
135514
+ regexCharacterClass = true;
135515
+ continue;
135516
+ }
135517
+ if (ch === "]" && regexCharacterClass) {
135518
+ regexCharacterClass = false;
135519
+ continue;
135520
+ }
135521
+ if (ch === "/" && !regexCharacterClass) {
135522
+ while (isIdentifierPart(source[i + 1])) {
135523
+ i++;
135524
+ topLevel[i] = 0;
135525
+ }
135526
+ state = "script";
135527
+ canStartRegex = false;
135528
+ }
135529
+ continue;
135530
+ }
135531
+ topLevel[i] = 0;
135532
+ if (ch === "\\" && i + 1 < source.length) {
135533
+ i++;
135534
+ topLevel[i] = 0;
135535
+ continue;
135536
+ }
135537
+ if (ch === "`") {
135538
+ state = "script";
135539
+ canStartRegex = false;
135540
+ }
135541
+ }
135542
+ return topLevel;
135543
+ }
135544
+ function isWholeLineTopLevelMatch(source, startIndex, block, topLevel) {
135545
+ if (!source.startsWith(block, startIndex)) {
135546
+ return false;
135547
+ }
135548
+ if (startIndex > 0 && source[startIndex - 1] !== "\n") {
135549
+ return false;
135550
+ }
135551
+ const endIndex = startIndex + block.length;
135552
+ for (let lineStart = startIndex; lineStart < endIndex; ) {
135553
+ if (!topLevel[lineStart]) {
135554
+ return false;
135555
+ }
135556
+ const nextNewline = source.indexOf("\n", lineStart);
135557
+ if (nextNewline === -1 || nextNewline >= endIndex - 1) {
135558
+ break;
135559
+ }
135560
+ lineStart = nextNewline + 1;
135561
+ }
135562
+ return true;
135563
+ }
135564
+ function findManagedBlockRanges(source) {
135565
+ const topLevel = markTopLevelScriptBytes(source);
135566
+ const ranges = [];
135567
+ for (let i = 0; i < source.length; i++) {
135568
+ if (i > 0 && source[i - 1] !== "\n") {
135569
+ continue;
135570
+ }
135571
+ for (const block of MANAGED_ITEM_AUTH_BLOCKS) {
135572
+ if (!isWholeLineTopLevelMatch(source, i, block, topLevel)) {
135573
+ continue;
135574
+ }
135575
+ ranges.push({ start: i, end: i + block.length });
135576
+ break;
135577
+ }
135578
+ }
135579
+ return ranges;
135580
+ }
135581
+ function countManagedItemAuthBlocks(code) {
135582
+ if (typeof code !== "string" || !code) {
135583
+ return 0;
135584
+ }
135585
+ return findManagedBlockRanges(code).length;
135586
+ }
135587
+ function deleteRangeWithSeam(source, start, end) {
135588
+ let before = source.slice(0, start);
135589
+ let after = source.slice(end);
135590
+ const beforeHadNl = before.endsWith("\n");
135591
+ const afterHadNl = after.startsWith("\n");
135592
+ if (beforeHadNl) {
135593
+ before = before.slice(0, -1);
135594
+ }
135595
+ if (afterHadNl) {
135596
+ after = after.slice(1);
135597
+ }
135598
+ if (beforeHadNl && afterHadNl && before.length > 0 && after.length > 0) {
135599
+ return `${before}
135600
+ ${after}`;
135601
+ }
135602
+ return `${before}${after}`;
135603
+ }
135604
+ function stripManagedItemAuthBlocks(code) {
135605
+ if (typeof code !== "string" || !code) {
135606
+ return "";
135607
+ }
135608
+ const ranges = findManagedBlockRanges(code);
135609
+ if (ranges.length === 0) {
135610
+ return code;
135611
+ }
135612
+ ranges.sort((left, right) => right.start - left.start);
135613
+ let next = code;
135614
+ for (const range of ranges) {
135615
+ next = deleteRangeWithSeam(next, range.start, range.end);
135616
+ }
135617
+ return next;
135618
+ }
135619
+
135620
+ // src/lib/postman/postman-gateway-assets-client.ts
135621
+ var MockContractError = class extends Error {
135622
+ constructor(message) {
135623
+ super(message);
135624
+ this.name = "MockContractError";
135625
+ }
135626
+ };
135627
+ function requireMockVisibility(mock, requested) {
135628
+ if (mock.visibility === "unknown") {
135629
+ throw new MockContractError(
135630
+ `MOCK_VISIBILITY_UNKNOWN: Mock ${mock.uid} did not expose a supported visibility field. Refusing to assume it is callable.`
135631
+ );
135632
+ }
135633
+ if (mock.visibility !== requested) {
135634
+ const code = requested === "public" ? "MOCK_NOT_PUBLIC" : "MOCK_NOT_PRIVATE";
135635
+ throw new MockContractError(
135636
+ `${code}: Mock ${mock.uid} is ${mock.visibility}, but mock-visibility requires ${requested}. Change the mock visibility in Postman or set mock-visibility to ${mock.visibility}.`
135637
+ );
135638
+ }
135639
+ return mock;
135127
135640
  }
135128
135641
  var MAX_CREATE_FLIGHTS = 256;
135129
135642
  var createFlights = /* @__PURE__ */ new Map();
@@ -135694,51 +136207,83 @@ var PostmanGatewayAssetsClient = class {
135694
136207
  }
135695
136208
  });
135696
136209
  }
136210
+ isAmbiguousTransportError(error) {
136211
+ return this.isRetryableIdempotentWriteOutcome(error);
136212
+ }
136213
+ normalizeCollectionScripts(scripts) {
136214
+ if (!Array.isArray(scripts)) return [];
136215
+ return scripts.map((entry) => this.asRecord(entry)).filter((entry) => entry !== null);
136216
+ }
136217
+ rootScriptsIncludeManagedAuthHook(scripts) {
136218
+ return scripts.some((script) => isManagedPrivateMockAuthRootHook(script));
136219
+ }
136220
+ buildPrivateMockRootScripts(existingScripts) {
136221
+ const managedScript = {
136222
+ type: PRIVATE_MOCK_AUTH_ROOT_TYPE,
136223
+ code: PRIVATE_MOCK_AUTH_ROOT_SCRIPT,
136224
+ language: "text/javascript"
136225
+ };
136226
+ return [...existingScripts, managedScript];
136227
+ }
136228
+ async readCollectionRootScripts(collectionUid) {
136229
+ const id = this.toModelId(collectionUid);
136230
+ const response = await this.gateway.requestJson({
136231
+ service: "collection",
136232
+ method: "get",
136233
+ path: `/v3/collections/${id}/export`
136234
+ });
136235
+ const data = this.asRecord(response?.data);
136236
+ const collection = this.asRecord(data?.collection);
136237
+ if (!collection) {
136238
+ throw new Error(
136239
+ `PRIVATE_MOCK_AUTH_EXPORT_INVALID: Collection ${id} export did not return data.collection; refusing to configure private-mock root auth from an unexpected envelope.`
136240
+ );
136241
+ }
136242
+ return this.normalizeCollectionScripts(collection.scripts);
136243
+ }
136244
+ async patchCollectionRootScripts(collectionUid, scripts) {
136245
+ const id = this.toModelId(collectionUid);
136246
+ await this.gateway.requestJson(
136247
+ {
136248
+ service: "collection",
136249
+ method: "patch",
136250
+ path: `/v3/collections/${id}`,
136251
+ body: [{ op: "add", path: "/scripts", value: scripts }]
136252
+ },
136253
+ { retryTransient: false }
136254
+ );
136255
+ }
135697
136256
  /**
135698
- * Add a secret-free runtime hook to every HTTP request in a collection. The
135699
- * PMAK value is supplied only by the runner as a transient variable; this
135700
- * method persists the variable name and header wiring, never the credential.
136257
+ * Add a secret-free runtime hook at the collection root. The PMAK value is
136258
+ * supplied only by the runner as a transient variable; this method persists
136259
+ * the variable name and header wiring, never the credential.
135701
136260
  */
135702
136261
  async configurePrivateMockRuntimeAuth(collectionUid) {
135703
136262
  const cid = String(collectionUid ?? "").trim();
135704
136263
  if (!cid) return 0;
135705
- const listed = await this.gateway.requestJson({
135706
- service: "collection",
135707
- method: "get",
135708
- path: `/v3/collections/${cid}/items/`
135709
- });
135710
- const items = Array.isArray(listed?.data) ? listed.data : [];
135711
- let patched = 0;
135712
- for (const listedItem of items) {
135713
- if (String(listedItem.$kind ?? "") !== "http-request") continue;
135714
- const itemId = String(listedItem.id ?? "").trim();
135715
- if (!itemId) continue;
135716
- const response = await this.gateway.requestJson({
135717
- service: "collection",
135718
- method: "get",
135719
- path: `/v3/collections/${cid}/items/${itemId}`,
135720
- headers: { "X-Entity-Type": "http-request" }
135721
- });
135722
- const item = this.asRecord(response?.data) ?? listedItem;
135723
- const scripts = Array.isArray(item.scripts) ? item.scripts.filter((entry) => Boolean(this.asRecord(entry))) : [];
135724
- const before = scripts.find((script) => String(script.type ?? "") === "beforeRequest");
135725
- const existingCode = String(before?.code ?? "");
135726
- if (existingCode.includes(PRIVATE_MOCK_AUTH_MARKER)) continue;
135727
- const code = [removeLegacyPrivateMockAuth(existingCode), PRIVATE_MOCK_AUTH_SCRIPT].filter(Boolean).join("\n");
135728
- const nextScripts = [
135729
- ...scripts.filter((script) => String(script.type ?? "") !== "beforeRequest"),
135730
- { type: "beforeRequest", code, language: "text/javascript" }
135731
- ];
135732
- await this.gateway.requestJson({
135733
- service: "collection",
135734
- method: "patch",
135735
- path: `/v3/collections/${cid}/items/${itemId}`,
135736
- headers: { "X-Entity-Type": "http-request" },
135737
- body: [{ op: "add", path: "/scripts", value: nextScripts }]
135738
- });
135739
- patched += 1;
135740
- }
135741
- return patched;
136264
+ const installFromFreshRoot = async (existingScripts) => {
136265
+ if (this.rootScriptsIncludeManagedAuthHook(existingScripts)) {
136266
+ return 0;
136267
+ }
136268
+ const nextScripts = this.buildPrivateMockRootScripts(existingScripts);
136269
+ try {
136270
+ await this.patchCollectionRootScripts(cid, nextScripts);
136271
+ return 1;
136272
+ } catch (error) {
136273
+ if (!this.isAmbiguousTransportError(error)) {
136274
+ throw error;
136275
+ }
136276
+ const freshScripts = await this.readCollectionRootScripts(cid);
136277
+ if (this.rootScriptsIncludeManagedAuthHook(freshScripts)) {
136278
+ return 1;
136279
+ }
136280
+ const recomputed = this.buildPrivateMockRootScripts(freshScripts);
136281
+ await this.patchCollectionRootScripts(cid, recomputed);
136282
+ return 1;
136283
+ }
136284
+ };
136285
+ const scripts = await this.readCollectionRootScripts(cid);
136286
+ return installFromFreshRoot(scripts);
135742
136287
  }
135743
136288
  async listMocks() {
135744
136289
  const response = await this.gateway.requestJson({
@@ -135822,12 +136367,13 @@ var PostmanGatewayAssetsClient = class {
135822
136367
  }
135823
136368
  async createMonitor(workspaceId, name, collectionUid, environmentUid, cronSchedule) {
135824
136369
  const ws = workspaceId || this.workspaceId;
135825
- const effectiveCron = cronSchedule && cronSchedule.trim() ? cronSchedule.trim() : "0 0 * * 0";
136370
+ const cronTrimmed = String(cronSchedule ?? "").trim();
136371
+ const hasCron = cronTrimmed.length > 0;
135826
136372
  const monitorName = String(name ?? "").trim();
135827
136373
  const collection = String(collectionUid ?? "").trim();
135828
136374
  const environment = String(environmentUid ?? "").trim();
135829
136375
  const flightKey = `monitor:${ws}:${collection}:${environment}:${monitorName}`;
135830
- return this.singleFlight(flightKey, effectiveCron, "monitor", async () => {
136376
+ return this.singleFlight(flightKey, hasCron ? cronTrimmed : "inactive", "monitor", async () => {
135831
136377
  const existing = await this.findMonitorByCollection(collection, environment, monitorName);
135832
136378
  if (existing?.uid) {
135833
136379
  return existing.uid;
@@ -135835,11 +136381,12 @@ var PostmanGatewayAssetsClient = class {
135835
136381
  const body = {
135836
136382
  name: monitorName,
135837
136383
  collection,
136384
+ active: hasCron,
135838
136385
  options: { strictSSL: false, followRedirects: true, requestTimeout: null, requestDelay: 0 },
135839
136386
  notifications: { onFailure: [], onError: [] },
135840
136387
  retry: {},
135841
- schedule: { cronPattern: effectiveCron, timeZone: "UTC" },
135842
136388
  distribution: null,
136389
+ ...hasCron ? { schedule: { cronPattern: cronTrimmed, timeZone: "UTC" } } : {},
135843
136390
  ...environment ? { environment } : {}
135844
136391
  };
135845
136392
  const send2 = (fallback) => this.gateway.requestJson(
@@ -135925,6 +136472,128 @@ var PostmanGatewayAssetsClient = class {
135925
136472
  }
135926
136473
  };
135927
136474
 
136475
+ // src/lib/postman/private-mock-export-cleanup.ts
136476
+ function asArray2(value) {
136477
+ return Array.isArray(value) ? value : [];
136478
+ }
136479
+ function cloneScriptRecord(script) {
136480
+ if (!script || typeof script !== "object" || Array.isArray(script)) {
136481
+ return script;
136482
+ }
136483
+ return { ...script };
136484
+ }
136485
+ function cloneCollectionNodeIterative(collection) {
136486
+ const cloned = { ...collection };
136487
+ if (Array.isArray(collection.scripts)) {
136488
+ cloned.scripts = collection.scripts.map((script) => cloneScriptRecord(script));
136489
+ }
136490
+ const stack = [];
136491
+ const attachNested = (source, target) => {
136492
+ if (Array.isArray(source.scripts)) {
136493
+ target.scripts = source.scripts.map((script) => cloneScriptRecord(script));
136494
+ }
136495
+ for (const key of ["items", "children"]) {
136496
+ const nested = asArray2(source[key]);
136497
+ if (nested.length === 0) {
136498
+ continue;
136499
+ }
136500
+ const clonedNested = nested.map((item) => ({ ...item }));
136501
+ target[key] = clonedNested;
136502
+ for (let i = 0; i < nested.length; i += 1) {
136503
+ stack.push({ source: nested[i], target: clonedNested[i] });
136504
+ }
136505
+ }
136506
+ };
136507
+ attachNested(collection, cloned);
136508
+ while (stack.length > 0) {
136509
+ const frame = stack.pop();
136510
+ attachNested(frame.source, frame.target);
136511
+ }
136512
+ return cloned;
136513
+ }
136514
+ function cloneCollection(collection) {
136515
+ if (typeof globalThis.structuredClone === "function") {
136516
+ try {
136517
+ return globalThis.structuredClone(collection);
136518
+ } catch {
136519
+ }
136520
+ }
136521
+ try {
136522
+ return JSON.parse(JSON.stringify(collection));
136523
+ } catch {
136524
+ return cloneCollectionNodeIterative(collection);
136525
+ }
136526
+ }
136527
+ function isPrivateMockLegacyExportCleanupEnabled() {
136528
+ const value = String(process.env.POSTMAN_PRIVATE_MOCK_LEGACY_EXPORT_CLEANUP ?? "").trim().toLowerCase();
136529
+ return value !== "off";
136530
+ }
136531
+ function verifyPrivateMockRootHook(collection) {
136532
+ const scripts = asArray2(collection.scripts);
136533
+ return scripts.some((script) => isManagedPrivateMockAuthRootHook(script));
136534
+ }
136535
+ function applyPrivateMockExportCleanup(collection, options = {}) {
136536
+ const stripManagedBlocks = options.stripManagedBlocks ?? isPrivateMockLegacyExportCleanupEnabled();
136537
+ const cloned = cloneCollection(collection);
136538
+ let strippedBlocks = 0;
136539
+ const visitItem = (item) => {
136540
+ if (!stripManagedBlocks) {
136541
+ return;
136542
+ }
136543
+ const scripts = item.scripts;
136544
+ if (!Array.isArray(scripts)) {
136545
+ return;
136546
+ }
136547
+ const nextScripts = [];
136548
+ for (const script of scripts) {
136549
+ if (!script || typeof script !== "object" || Array.isArray(script)) {
136550
+ nextScripts.push(script);
136551
+ continue;
136552
+ }
136553
+ const record = script;
136554
+ if (String(record.type ?? "") !== "beforeRequest") {
136555
+ nextScripts.push(record);
136556
+ continue;
136557
+ }
136558
+ const originalCode = String(record.code ?? "");
136559
+ const cleaned = stripManagedItemAuthBlocks(originalCode);
136560
+ if (cleaned === originalCode) {
136561
+ nextScripts.push(record);
136562
+ continue;
136563
+ }
136564
+ strippedBlocks += countManagedItemAuthBlocks(originalCode);
136565
+ if (!cleaned) {
136566
+ continue;
136567
+ }
136568
+ nextScripts.push({ ...record, code: cleaned });
136569
+ }
136570
+ if (nextScripts.length === 0) {
136571
+ delete item.scripts;
136572
+ } else {
136573
+ item.scripts = nextScripts;
136574
+ }
136575
+ };
136576
+ const walkItemsIteratively = (rootItems) => {
136577
+ const stack = [...rootItems].reverse();
136578
+ while (stack.length > 0) {
136579
+ const item = stack.pop();
136580
+ visitItem(item);
136581
+ for (const key of ["items", "children"]) {
136582
+ const nested = asArray2(item[key]);
136583
+ for (let i = nested.length - 1; i >= 0; i -= 1) {
136584
+ stack.push(nested[i]);
136585
+ }
136586
+ }
136587
+ }
136588
+ };
136589
+ walkItemsIteratively(asArray2(cloned.items));
136590
+ return {
136591
+ collection: cloned,
136592
+ strippedBlocks,
136593
+ rootVerified: verifyPrivateMockRootHook(cloned)
136594
+ };
136595
+ }
136596
+
135928
136597
  // src/lib/postman/token-provider.ts
135929
136598
  var MintError = class extends Error {
135930
136599
  permanent;
@@ -136682,6 +137351,15 @@ var identitySecretMasker = (input) => input;
136682
137351
  function resolveRepoSyncMasker(dependencies) {
136683
137352
  return dependencies.secretMasker ?? identitySecretMasker;
136684
137353
  }
137354
+ function resolveRepoSyncLogger(dependencies) {
137355
+ return dependencies.logger ?? createLogger({
137356
+ sink: actionSink(dependencies.core),
137357
+ fields: {
137358
+ action: "postman-repo-sync-action",
137359
+ action_version: resolveActionVersion2()
137360
+ }
137361
+ });
137362
+ }
136685
137363
  function causeText(cause) {
136686
137364
  return cause instanceof Error ? cause.message : String(cause);
136687
137365
  }
@@ -137095,13 +137773,51 @@ function normalizeToPosix(filePath) {
137095
137773
  function canonicalizeRelativePath(value) {
137096
137774
  return normalizeToPosix(String(value ?? "").trim()).replace(/^\.\/+/, "").replace(/\/{2,}/g, "/").replace(/\/+$/g, "");
137097
137775
  }
137098
- function isOpenApiSpecFile(filePath) {
137099
- if (!(filePath.endsWith(".json") || filePath.endsWith(".yaml") || filePath.endsWith(".yml"))) {
137100
- return false;
137776
+ var LOCAL_SPEC_DISCOVERY_MAX_DEPTH = 6;
137777
+ var LOCAL_SPEC_DISCOVERY_MAX_TRAVERSAL_ENTRIES = 1e4;
137778
+ var LOCAL_SPEC_DISCOVERY_MAX_CANDIDATE_FILES = 200;
137779
+ var LOCAL_SPEC_DISCOVERY_MAX_CANDIDATE_FILE_BYTES = 512 * 1024;
137780
+ var LOCAL_SPEC_DISCOVERY_IGNORED_DIRS = /* @__PURE__ */ new Set([
137781
+ ".git",
137782
+ ".nyc_output",
137783
+ ".omc",
137784
+ ".omx",
137785
+ ".llm-plans",
137786
+ ".pulumi",
137787
+ ".terraform",
137788
+ ".venv",
137789
+ "__pycache__",
137790
+ "bin",
137791
+ "build",
137792
+ "coverage",
137793
+ "discovered-specs",
137794
+ "node_modules",
137795
+ "dist",
137796
+ "obj",
137797
+ "out",
137798
+ "target",
137799
+ "vendor",
137800
+ "venv"
137801
+ ]);
137802
+ var LocalSpecDiscoveryLimitError = class extends Error {
137803
+ code = "CONTRACT_LOCAL_SPEC_DISCOVERY_LIMIT";
137804
+ constructor(message) {
137805
+ super(`CONTRACT_LOCAL_SPEC_DISCOVERY_LIMIT: ${message}`);
137806
+ this.name = "LocalSpecDiscoveryLimitError";
137101
137807
  }
137808
+ };
137809
+ function failLocalSpecDiscoveryLimit(detail) {
137810
+ throw new LocalSpecDiscoveryLimitError(
137811
+ `${detail} Set spec-path to the OpenAPI file explicitly and keep generated trees (for example dist/, node_modules/) out of the repository layout.`
137812
+ );
137813
+ }
137814
+ function isSpecCandidateExtension(filePath) {
137815
+ return filePath.endsWith(".json") || filePath.endsWith(".yaml") || filePath.endsWith(".yml");
137816
+ }
137817
+ function readOpenApiSpecFile(fullPath) {
137102
137818
  try {
137103
- const raw = (0, import_node_fs5.readFileSync)(filePath, "utf8");
137104
- const parsed = filePath.endsWith(".json") ? JSON.parse(raw) : load(raw);
137819
+ const raw = (0, import_node_fs5.readFileSync)(fullPath, "utf8");
137820
+ const parsed = fullPath.endsWith(".json") ? JSON.parse(raw) : load(raw);
137105
137821
  if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
137106
137822
  return false;
137107
137823
  }
@@ -137117,28 +137833,75 @@ function isOpenApiSpecFile(filePath) {
137117
137833
  }
137118
137834
  return false;
137119
137835
  }
137120
- function scanLocalSpecReferences(baseDir = ".") {
137121
- const ignoredDirs = /* @__PURE__ */ new Set([
137122
- ".git",
137123
- ".omc",
137124
- ".omx",
137125
- ".llm-plans",
137126
- "node_modules",
137127
- "dist"
137128
- ]);
137836
+ function shouldIgnoreSpecDiscoveryEntry(entryName, currentDir, baseDir, ignoredPrefixes) {
137837
+ if (LOCAL_SPEC_DISCOVERY_IGNORED_DIRS.has(entryName)) {
137838
+ return true;
137839
+ }
137840
+ const relative3 = normalizeToPosix(path3.relative(baseDir, path3.join(currentDir, entryName)));
137841
+ return ignoredPrefixes.some(
137842
+ (prefix) => relative3 === prefix || relative3.startsWith(`${prefix}/`)
137843
+ );
137844
+ }
137845
+ function scanLocalSpecReferences(baseDir = ".", options = {}) {
137846
+ const ignoredPrefixes = (options.ignoredPrefixes ?? []).map((value) => canonicalizeRelativePath(value)).filter(Boolean);
137129
137847
  const found = /* @__PURE__ */ new Set();
137130
137848
  const refs = [];
137131
- const visit2 = (currentDir) => {
137132
- for (const entry of (0, import_node_fs5.readdirSync)(currentDir, { withFileTypes: true })) {
137133
- if (ignoredDirs.has(entry.name)) {
137849
+ let traversalEntries = 0;
137850
+ let candidateFiles = 0;
137851
+ const pendingDirs = [{ dir: baseDir, depth: 0 }];
137852
+ while (pendingDirs.length > 0) {
137853
+ const { dir: currentDir, depth: currentDepth } = pendingDirs.shift();
137854
+ let entries;
137855
+ try {
137856
+ entries = (0, import_node_fs5.readdirSync)(currentDir, { withFileTypes: true }).sort(
137857
+ (left, right) => left.name.localeCompare(right.name)
137858
+ );
137859
+ } catch {
137860
+ continue;
137861
+ }
137862
+ for (const entry of entries) {
137863
+ traversalEntries += 1;
137864
+ if (traversalEntries > LOCAL_SPEC_DISCOVERY_MAX_TRAVERSAL_ENTRIES) {
137865
+ failLocalSpecDiscoveryLimit(
137866
+ `local spec discovery exceeded the ${LOCAL_SPEC_DISCOVERY_MAX_TRAVERSAL_ENTRIES} traversal-entry liveness budget.`
137867
+ );
137868
+ }
137869
+ if (shouldIgnoreSpecDiscoveryEntry(entry.name, currentDir, baseDir, ignoredPrefixes)) {
137134
137870
  continue;
137135
137871
  }
137136
137872
  const fullPath = path3.join(currentDir, entry.name);
137137
137873
  if (entry.isDirectory()) {
137138
- visit2(fullPath);
137874
+ const nextDepth = currentDepth + 1;
137875
+ if (nextDepth > LOCAL_SPEC_DISCOVERY_MAX_DEPTH) {
137876
+ failLocalSpecDiscoveryLimit(
137877
+ `local spec discovery exceeded the ${LOCAL_SPEC_DISCOVERY_MAX_DEPTH} directory-depth budget.`
137878
+ );
137879
+ }
137880
+ pendingDirs.push({ dir: fullPath, depth: nextDepth });
137881
+ continue;
137882
+ }
137883
+ if (!entry.isFile() || !isSpecCandidateExtension(fullPath)) {
137884
+ continue;
137885
+ }
137886
+ candidateFiles += 1;
137887
+ if (candidateFiles > LOCAL_SPEC_DISCOVERY_MAX_CANDIDATE_FILES) {
137888
+ failLocalSpecDiscoveryLimit(
137889
+ `local spec discovery exceeded the ${LOCAL_SPEC_DISCOVERY_MAX_CANDIDATE_FILES} candidate-file budget.`
137890
+ );
137891
+ }
137892
+ let sizeBytes;
137893
+ try {
137894
+ sizeBytes = (0, import_node_fs5.statSync)(fullPath).size;
137895
+ } catch {
137139
137896
  continue;
137140
137897
  }
137141
- if (!entry.isFile() || !isOpenApiSpecFile(fullPath)) {
137898
+ if (sizeBytes > LOCAL_SPEC_DISCOVERY_MAX_CANDIDATE_FILE_BYTES) {
137899
+ const repoRelativePath2 = normalizeToPosix(path3.relative(baseDir, fullPath));
137900
+ failLocalSpecDiscoveryLimit(
137901
+ `local spec discovery candidate ${repoRelativePath2} exceeds ${LOCAL_SPEC_DISCOVERY_MAX_CANDIDATE_FILE_BYTES} bytes.`
137902
+ );
137903
+ }
137904
+ if (!readOpenApiSpecFile(fullPath)) {
137142
137905
  continue;
137143
137906
  }
137144
137907
  const repoRelativePath = normalizeToPosix(path3.relative(baseDir, fullPath));
@@ -137151,20 +137914,36 @@ function scanLocalSpecReferences(baseDir = ".") {
137151
137914
  configRelativePath: normalizeToPosix(path3.join("..", repoRelativePath))
137152
137915
  });
137153
137916
  }
137154
- };
137155
- visit2(baseDir);
137917
+ }
137156
137918
  return refs.sort((left, right) => left.repoRelativePath.localeCompare(right.repoRelativePath));
137157
137919
  }
137158
- function resolveMappedSpecReference(explicitSpecPath, discoveredSpecs) {
137920
+ function tryResolveExplicitSpecReference(explicitSpecPath) {
137159
137921
  const normalizedExplicitPath = normalizeToPosix(explicitSpecPath.trim());
137160
- if (normalizedExplicitPath) {
137161
- const explicitFullPath = path3.resolve(normalizedExplicitPath);
137162
- if ((0, import_node_fs5.existsSync)(explicitFullPath) && (0, import_node_fs5.statSync)(explicitFullPath).isFile()) {
137163
- return {
137164
- repoRelativePath: normalizedExplicitPath,
137165
- configRelativePath: normalizeToPosix(path3.join("..", normalizedExplicitPath))
137166
- };
137167
- }
137922
+ if (!normalizedExplicitPath) {
137923
+ return void 0;
137924
+ }
137925
+ const explicitFullPath = path3.resolve(normalizedExplicitPath);
137926
+ if ((0, import_node_fs5.existsSync)(explicitFullPath) && (0, import_node_fs5.statSync)(explicitFullPath).isFile()) {
137927
+ return {
137928
+ repoRelativePath: normalizedExplicitPath,
137929
+ configRelativePath: normalizeToPosix(path3.join("..", normalizedExplicitPath))
137930
+ };
137931
+ }
137932
+ return void 0;
137933
+ }
137934
+ function resolveLocalSpecReferences(explicitSpecPath, baseDir = ".", options = {}) {
137935
+ const explicit = tryResolveExplicitSpecReference(explicitSpecPath);
137936
+ if (explicit) {
137937
+ return { discoveredSpecs: [], mappedSpec: explicit };
137938
+ }
137939
+ const discoveredSpecs = scanLocalSpecReferences(baseDir, options);
137940
+ const mappedSpec = resolveMappedSpecReference(explicitSpecPath, discoveredSpecs);
137941
+ return { discoveredSpecs, mappedSpec };
137942
+ }
137943
+ function resolveMappedSpecReference(explicitSpecPath, discoveredSpecs) {
137944
+ const explicit = tryResolveExplicitSpecReference(explicitSpecPath);
137945
+ if (explicit) {
137946
+ return explicit;
137168
137947
  }
137169
137948
  if (discoveredSpecs.length === 1) {
137170
137949
  return discoveredSpecs[0];
@@ -137843,6 +138622,18 @@ function tryReusePrebuiltCollection(options) {
137843
138622
  }
137844
138623
  return prepared.artifactDigest === entry.artifactDigest;
137845
138624
  }
138625
+ async function preparePrivateMockCloudCollection(role, collectionId, postman) {
138626
+ const col = await postman.getCollection(collectionId);
138627
+ const { collection } = applyPrivateMockExportCleanup(col, {
138628
+ stripManagedBlocks: isPrivateMockLegacyExportCleanupEnabled()
138629
+ });
138630
+ if (!verifyPrivateMockRootHook(collection)) {
138631
+ throw new Error(
138632
+ `PRIVATE_MOCK_AUTH_ROOT_UNVERIFIED: Managed root hook missing from exported ${role} collection ${collectionId}`
138633
+ );
138634
+ }
138635
+ return collection;
138636
+ }
137846
138637
  async function exportCollectionArtifact(options) {
137847
138638
  const {
137848
138639
  role,
@@ -137851,14 +138642,17 @@ async function exportCollectionArtifact(options) {
137851
138642
  collectionsDir,
137852
138643
  prebuiltByRole,
137853
138644
  postman,
137854
- core
138645
+ core,
138646
+ privateMockAuth = false,
138647
+ preparedCloudCollection
137855
138648
  } = options;
137856
138649
  if (!collectionId) {
137857
138650
  return void 0;
137858
138651
  }
137859
138652
  const expectedPath = `${collectionsDir}/${dirName}`;
138653
+ const forceCloudExport = privateMockAuth && (role === "smoke" || role === "contract");
137860
138654
  const entry = prebuiltByRole.get(role);
137861
- if (entry) {
138655
+ if (entry && !forceCloudExport) {
137862
138656
  const reused = tryReusePrebuiltCollection({
137863
138657
  prepared: entry,
137864
138658
  expectedPath,
@@ -137873,12 +138667,30 @@ async function exportCollectionArtifact(options) {
137873
138667
  core.info(
137874
138668
  `Prebuilt ${role} collection entry present but did not exactly match; exporting from cloud`
137875
138669
  );
138670
+ } else if (entry && forceCloudExport) {
138671
+ core.info(
138672
+ `Private mock requires cloud export for ${role} collection to reconcile managed root hook; exporting from cloud`
138673
+ );
137876
138674
  }
137877
- const col = await postman.getCollection(collectionId);
137878
- await convertAndSplitAnyCollection(
137879
- col,
137880
- expectedPath
137881
- );
138675
+ let collectionForExport;
138676
+ if (forceCloudExport && preparedCloudCollection) {
138677
+ collectionForExport = preparedCloudCollection;
138678
+ } else if (forceCloudExport) {
138679
+ const col = await postman.getCollection(collectionId);
138680
+ const { collection } = applyPrivateMockExportCleanup(col, {
138681
+ stripManagedBlocks: isPrivateMockLegacyExportCleanupEnabled()
138682
+ });
138683
+ if (!verifyPrivateMockRootHook(collection)) {
138684
+ throw new Error(
138685
+ `PRIVATE_MOCK_AUTH_ROOT_UNVERIFIED: Managed root hook missing from exported ${role} collection ${collectionId}`
138686
+ );
138687
+ }
138688
+ collectionForExport = collection;
138689
+ } else {
138690
+ const col = await postman.getCollection(collectionId);
138691
+ collectionForExport = col;
138692
+ }
138693
+ await convertAndSplitAnyCollection(collectionForExport, expectedPath);
137882
138694
  return `../${expectedPath}`;
137883
138695
  }
137884
138696
  function hasControlCharacter2(value) {
@@ -137931,32 +138743,37 @@ async function exportArtifacts(inputs, dependencies, envUids, assetProjectName,
137931
138743
  const globalsDir = `${inputs.artifactDir}/globals`;
137932
138744
  const mocksDir = `${inputs.artifactDir}/mocks`;
137933
138745
  const specsDir = `${inputs.artifactDir}/specs`;
137934
- ensureDir(collectionsDir);
137935
- ensureDir(environmentsDir);
137936
- ensureDir(flowsDir);
137937
- ensureDir(globalsDir);
137938
- ensureDir(mocksDir);
137939
- ensureDir(specsDir);
137940
- ensureDir(".postman");
137941
- const globalsFilePath = `${globalsDir}/workspace.globals.yaml`;
137942
- if (!(0, import_node_fs5.existsSync)(globalsFilePath)) {
137943
- (0, import_node_fs5.writeFileSync)(globalsFilePath, "name: Globals\nvalues: []\n");
137944
- }
137945
- if (inputs.generateCiWorkflow) {
137946
- const ciDir = inputs.ciWorkflowPath.split("/").slice(0, -1).join("/");
137947
- if (ciDir) {
137948
- ensureDir(ciDir);
137949
- }
137950
- }
137951
138746
  const manifestCollections = {};
137952
- const discoveredSpecs = scanLocalSpecReferences();
137953
- const mappedSpec = resolveMappedSpecReference(inputs.specPath, discoveredSpecs);
138747
+ const artifactDirPrefix = canonicalizeRelativePath(inputs.artifactDir);
138748
+ const { discoveredSpecs, mappedSpec } = resolveLocalSpecReferences(inputs.specPath, ".", {
138749
+ ignoredPrefixes: artifactDirPrefix ? [artifactDirPrefix, ".postman"] : [".postman"]
138750
+ });
137954
138751
  const mappedSpecCloudKey = mappedSpec && inputs.specId ? buildMappedSpecCloudKey(
137955
138752
  mappedSpec.configRelativePath,
137956
138753
  inputs.specSyncMode,
137957
138754
  options.releaseLabel
137958
138755
  ) : void 0;
137959
138756
  const prebuiltByRole = options.preparedPrebuiltCollections;
138757
+ const privateMockAuth = options.privateMockAuth === true;
138758
+ const preparedPrivateMockCollections = /* @__PURE__ */ new Map();
138759
+ if (privateMockAuth) {
138760
+ for (const spec of [
138761
+ { role: "smoke", collectionId: inputs.smokeCollectionId },
138762
+ { role: "contract", collectionId: inputs.contractCollectionId }
138763
+ ]) {
138764
+ if (!spec.collectionId) {
138765
+ continue;
138766
+ }
138767
+ preparedPrivateMockCollections.set(
138768
+ spec.role,
138769
+ await preparePrivateMockCloudCollection(
138770
+ spec.role,
138771
+ spec.collectionId,
138772
+ dependencies.postman
138773
+ )
138774
+ );
138775
+ }
138776
+ }
137960
138777
  const baselineRef = await exportCollectionArtifact({
137961
138778
  role: "baseline",
137962
138779
  collectionId: inputs.baselineCollectionId,
@@ -137964,7 +138781,8 @@ async function exportArtifacts(inputs, dependencies, envUids, assetProjectName,
137964
138781
  collectionsDir,
137965
138782
  prebuiltByRole,
137966
138783
  postman: dependencies.postman,
137967
- core: dependencies.core
138784
+ core: dependencies.core,
138785
+ privateMockAuth
137968
138786
  });
137969
138787
  if (baselineRef) {
137970
138788
  manifestCollections[baselineRef] = inputs.baselineCollectionId;
@@ -137976,7 +138794,9 @@ async function exportArtifacts(inputs, dependencies, envUids, assetProjectName,
137976
138794
  collectionsDir,
137977
138795
  prebuiltByRole,
137978
138796
  postman: dependencies.postman,
137979
- core: dependencies.core
138797
+ core: dependencies.core,
138798
+ privateMockAuth,
138799
+ preparedCloudCollection: preparedPrivateMockCollections.get("smoke")
137980
138800
  });
137981
138801
  if (smokeRef) {
137982
138802
  manifestCollections[smokeRef] = inputs.smokeCollectionId;
@@ -137988,11 +138808,30 @@ async function exportArtifacts(inputs, dependencies, envUids, assetProjectName,
137988
138808
  collectionsDir,
137989
138809
  prebuiltByRole,
137990
138810
  postman: dependencies.postman,
137991
- core: dependencies.core
138811
+ core: dependencies.core,
138812
+ privateMockAuth,
138813
+ preparedCloudCollection: preparedPrivateMockCollections.get("contract")
137992
138814
  });
137993
138815
  if (contractRef) {
137994
138816
  manifestCollections[contractRef] = inputs.contractCollectionId;
137995
138817
  }
138818
+ ensureDir(collectionsDir);
138819
+ ensureDir(environmentsDir);
138820
+ ensureDir(flowsDir);
138821
+ ensureDir(globalsDir);
138822
+ ensureDir(mocksDir);
138823
+ ensureDir(specsDir);
138824
+ ensureDir(".postman");
138825
+ const globalsFilePath = `${globalsDir}/workspace.globals.yaml`;
138826
+ if (!(0, import_node_fs5.existsSync)(globalsFilePath)) {
138827
+ (0, import_node_fs5.writeFileSync)(globalsFilePath, "name: Globals\nvalues: []\n");
138828
+ }
138829
+ if (inputs.generateCiWorkflow) {
138830
+ const ciDir = inputs.ciWorkflowPath.split("/").slice(0, -1).join("/");
138831
+ if (ciDir) {
138832
+ ensureDir(ciDir);
138833
+ }
138834
+ }
137996
138835
  for (const [envName, envUid] of Object.entries(envUids)) {
137997
138836
  writeJsonFile(
137998
138837
  `${environmentsDir}/${envName}.postman_environment.json`,
@@ -138145,19 +138984,41 @@ async function commitAndPushGeneratedFiles(inputs, dependencies) {
138145
138984
  async function runRepoSync(inputs, dependencies) {
138146
138985
  const telemetry = createTelemetryContext({ action: "postman-repo-sync-action", actionVersion: resolveActionVersion2(), logger: dependencies.core });
138147
138986
  telemetry.setTeamId(dependencies.teamId);
138987
+ const logger = resolveRepoSyncLogger(dependencies);
138988
+ for (const secret of [
138989
+ inputs.postmanApiKey,
138990
+ inputs.postmanAccessToken,
138991
+ inputs.adoToken,
138992
+ inputs.githubToken,
138993
+ inputs.ghFallbackToken,
138994
+ inputs.sslClientCert,
138995
+ inputs.sslClientKey,
138996
+ inputs.sslClientPassphrase,
138997
+ inputs.sslExtraCaCerts
138998
+ ]) {
138999
+ logger.addSecret(secret);
139000
+ }
139001
+ logger.debug("resolved inputs", {
139002
+ project: inputs.projectName,
139003
+ collection_sync_mode: inputs.collectionSyncMode,
139004
+ spec_sync_mode: inputs.specSyncMode,
139005
+ team_id: dependencies.teamId || void 0
139006
+ });
138148
139007
  try {
138149
- const result = await runRepoSyncInner(inputs, dependencies);
139008
+ const result = await runRepoSyncInner(inputs, { ...dependencies, logger });
138150
139009
  telemetry.setAccountType(getMemoizedSessionIdentity()?.consumerType);
138151
139010
  telemetry.emitCompletion("success");
138152
139011
  return result;
138153
139012
  } catch (error) {
138154
139013
  telemetry.setAccountType(getMemoizedSessionIdentity()?.consumerType);
138155
139014
  telemetry.emitCompletion("failure");
139015
+ logger.failure("repo sync failed", error);
138156
139016
  throw error;
138157
139017
  }
138158
139018
  }
138159
139019
  async function runRepoSyncInner(inputs, dependencies) {
138160
139020
  const mask = resolveRepoSyncMasker(dependencies);
139021
+ const logger = resolveRepoSyncLogger(dependencies);
138161
139022
  const branchDecision = decideBranchTier(inputs);
138162
139023
  assertBranchAssetIds(inputs, branchDecision);
138163
139024
  const isCanonicalWriter = branchDecision.tier === "legacy" || branchDecision.tier === "canonical";
@@ -138217,7 +139078,10 @@ async function runRepoSyncInner(inputs, dependencies) {
138217
139078
  }
138218
139079
  }
138219
139080
  }
138220
- const preparedPrebuiltCollections = await preparePrebuiltCollections(inputs);
139081
+ const preparedPrebuiltCollections = await logger.phase(
139082
+ "prepare-collections",
139083
+ async () => preparePrebuiltCollections(inputs)
139084
+ );
138221
139085
  let skipRepositoryLinkPost = false;
138222
139086
  let repositoryLinkPreflightWasFree = false;
138223
139087
  if (inputs.workspaceLinkEnabled && inputs.workspaceId && inputs.repoUrl && dependencies.internalIntegration?.findWorkspaceForRepo) {
@@ -138252,7 +139116,10 @@ async function runRepoSyncInner(inputs, dependencies) {
138252
139116
  }
138253
139117
  }
138254
139118
  const branchAssetMarker = buildBranchAssetMarker(branchDecision, inputs);
138255
- const envUids = await upsertEnvironments(inputs, dependencies, resourcesState, branchAssetMarker);
139119
+ const envUids = await logger.phase(
139120
+ "sync-environments",
139121
+ async () => upsertEnvironments(inputs, dependencies, resourcesState, branchAssetMarker)
139122
+ );
138256
139123
  outputs["environment-uids-json"] = JSON.stringify(envUids);
138257
139124
  dependencies.core.setOutput("environment-uids-json", outputs["environment-uids-json"]);
138258
139125
  if (inputs.environmentSyncEnabled && inputs.workspaceId && dependencies.internalIntegration) {
@@ -138415,10 +139282,21 @@ async function runRepoSyncInner(inputs, dependencies) {
138415
139282
  );
138416
139283
  }
138417
139284
  const configured = [];
138418
- for (const collectionUid of [inputs.smokeCollectionId, inputs.contractCollectionId]) {
138419
- if (collectionUid) {
139285
+ for (const { role, collectionUid } of [
139286
+ { role: "smoke", collectionUid: inputs.smokeCollectionId },
139287
+ { role: "contract", collectionUid: inputs.contractCollectionId }
139288
+ ]) {
139289
+ if (!collectionUid) {
139290
+ continue;
139291
+ }
139292
+ try {
138420
139293
  await dependencies.postman.configurePrivateMockRuntimeAuth(collectionUid);
138421
139294
  configured.push(collectionUid);
139295
+ } catch (error) {
139296
+ throw new Error(
139297
+ `PRIVATE_MOCK_AUTH_ROOT_PATCH: Failed to install managed root hook on ${role} collection ${collectionUid}: ${mask(causeText(error))}`,
139298
+ { cause: error }
139299
+ );
138422
139300
  }
138423
139301
  }
138424
139302
  if (configured.length > 0) {
@@ -138570,16 +139448,23 @@ async function runRepoSyncInner(inputs, dependencies) {
138570
139448
  dependencies.core.warning(message);
138571
139449
  }
138572
139450
  }
138573
- await exportArtifacts(inputs, dependencies, envUids, assetProjectName, {
138574
- workspaceLinkStatus: outputs["workspace-link-status"],
138575
- priorWorkspaceId: resourcesState?.workspace?.id,
138576
- existingSpecs: resourcesState?.cloudResources?.specs,
138577
- mockEnvironmentUid: outputs["mock-environment-uid"] || void 0,
138578
- releaseLabel,
138579
- priorState: resourcesState,
138580
- preparedPrebuiltCollections
138581
- });
138582
- const commit = await commitAndPushGeneratedFiles(inputs, dependencies);
139451
+ await logger.phase(
139452
+ "export-artifacts",
139453
+ async () => exportArtifacts(inputs, dependencies, envUids, assetProjectName, {
139454
+ workspaceLinkStatus: outputs["workspace-link-status"],
139455
+ priorWorkspaceId: resourcesState?.workspace?.id,
139456
+ existingSpecs: resourcesState?.cloudResources?.specs,
139457
+ mockEnvironmentUid: outputs["mock-environment-uid"] || void 0,
139458
+ releaseLabel,
139459
+ priorState: resourcesState,
139460
+ preparedPrebuiltCollections,
139461
+ privateMockAuth: inputs.mockVisibility === "private"
139462
+ })
139463
+ );
139464
+ const commit = await logger.phase(
139465
+ "commit-and-push",
139466
+ async () => commitAndPushGeneratedFiles(inputs, dependencies)
139467
+ );
138583
139468
  outputs["commit-sha"] = commit.commitSha;
138584
139469
  if (commit.resolvedCurrentRef) {
138585
139470
  outputs["resolved-current-ref"] = commit.resolvedCurrentRef;