@pipeline-builder/pipeline-manager 3.4.125 → 3.4.127

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/agent/health.js +5 -4
  2. package/dist/agent/post-steps.d.ts.map +1 -1
  3. package/dist/agent/post-steps.js +7 -2
  4. package/dist/agent/targets.d.ts.map +1 -1
  5. package/dist/agent/targets.js +17 -2
  6. package/dist/boilerplate.js +3 -2
  7. package/dist/cli.js +3 -3
  8. package/dist/commands/create-pipeline.d.ts.map +1 -1
  9. package/dist/commands/create-pipeline.js +2 -1
  10. package/dist/commands/deploy.d.ts.map +1 -1
  11. package/dist/commands/deploy.js +11 -49
  12. package/dist/commands/get-plugin.d.ts.map +1 -1
  13. package/dist/commands/get-plugin.js +3 -2
  14. package/dist/commands/login.d.ts.map +1 -1
  15. package/dist/commands/login.js +18 -11
  16. package/dist/commands/status.d.ts.map +1 -1
  17. package/dist/commands/status.js +4 -4
  18. package/dist/commands/store-token.d.ts.map +1 -1
  19. package/dist/commands/store-token.js +103 -4
  20. package/dist/commands/synth.d.ts.map +1 -1
  21. package/dist/commands/synth.js +9 -53
  22. package/dist/commands/upload-plugin.d.ts.map +1 -1
  23. package/dist/commands/upload-plugin.js +2 -1
  24. package/dist/config/cli.constants.d.ts +0 -4
  25. package/dist/config/cli.constants.d.ts.map +1 -1
  26. package/dist/config/cli.constants.js +9 -4
  27. package/dist/lambda/token-renew-handler.d.ts +2 -0
  28. package/dist/lambda/token-renew-handler.d.ts.map +1 -0
  29. package/dist/lambda/token-renew-handler.js +75 -0
  30. package/dist/templates/token-renew-stack.json +116 -0
  31. package/dist/utils/api-client.d.ts.map +1 -1
  32. package/dist/utils/api-client.js +8 -15
  33. package/dist/utils/audit-log.d.ts.map +1 -1
  34. package/dist/utils/audit-log.js +22 -12
  35. package/dist/utils/aws-secrets.d.ts.map +1 -1
  36. package/dist/utils/aws-secrets.js +8 -2
  37. package/dist/utils/config-loader.d.ts +0 -4
  38. package/dist/utils/config-loader.d.ts.map +1 -1
  39. package/dist/utils/config-loader.js +4 -3
  40. package/dist/utils/cron.d.ts +28 -0
  41. package/dist/utils/cron.d.ts.map +1 -0
  42. package/dist/utils/cron.js +115 -0
  43. package/dist/utils/pipeline-config.d.ts +33 -0
  44. package/dist/utils/pipeline-config.d.ts.map +1 -0
  45. package/dist/utils/pipeline-config.js +54 -0
  46. package/dist/utils/platform-secret.d.ts.map +1 -1
  47. package/dist/utils/platform-secret.js +5 -2
  48. package/dist/utils/rate-limiter.d.ts +7 -6
  49. package/dist/utils/rate-limiter.d.ts.map +1 -1
  50. package/dist/utils/rate-limiter.js +49 -19
  51. package/dist/utils/tls.d.ts +16 -0
  52. package/dist/utils/tls.d.ts.map +1 -0
  53. package/dist/utils/tls.js +35 -0
  54. package/package.json +3 -3
@@ -0,0 +1,115 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Convert a standard 5-field cron expression into an AWS EventBridge cron
5
+ * expression, and guard against schedules that fire more often than every
6
+ * 15 minutes.
7
+ *
8
+ * Standard cron: `minute hour day-of-month month day-of-week`
9
+ * EventBridge cron: `cron(minute hour day-of-month month day-of-week year)`
10
+ *
11
+ * The non-obvious differences EventBridge imposes:
12
+ * - a 6th field (year), which we always set to `*`;
13
+ * - day-of-month and day-of-week may NOT both be `*` — exactly one must be `?`;
14
+ * - day-of-week is 1–7 with 1 = Sunday, whereas standard cron is 0–6 (or 7)
15
+ * with 0/7 = Sunday — so numeric day-of-week values must be remapped.
16
+ */
17
+ /** Minimum allowed spacing between fires, in minutes. */
18
+ export const MIN_SCHEDULE_INTERVAL_MIN = 15;
19
+ /** Expand a cron minute field (wildcard, step "/n", ranges "a-b", lists "a,b") to the sorted set of minutes it fires on. */
20
+ function expandMinuteField(field) {
21
+ const out = new Set();
22
+ for (const part of field.split(',')) {
23
+ const slash = part.split('/');
24
+ const rangePart = slash[0] ?? '';
25
+ const stepPart = slash[1];
26
+ const step = stepPart !== undefined ? parseInt(stepPart, 10) : 1;
27
+ if (stepPart !== undefined && (!Number.isInteger(step) || step < 1)) {
28
+ throw new Error(`Invalid step in minute field: "${part}"`);
29
+ }
30
+ let lo;
31
+ let hi;
32
+ if (rangePart === '*') {
33
+ lo = 0;
34
+ hi = 59;
35
+ }
36
+ else if (rangePart.includes('-')) {
37
+ const ends = rangePart.split('-');
38
+ lo = parseInt(ends[0] ?? '', 10);
39
+ hi = parseInt(ends[1] ?? '', 10);
40
+ }
41
+ else {
42
+ lo = hi = parseInt(rangePart, 10);
43
+ }
44
+ if (!Number.isInteger(lo) || !Number.isInteger(hi) || lo < 0 || hi > 59 || lo > hi) {
45
+ throw new Error(`Invalid minute field: "${part}"`);
46
+ }
47
+ for (let m = lo; m <= hi; m += step)
48
+ out.add(m);
49
+ }
50
+ return [...out].sort((a, b) => a - b);
51
+ }
52
+ /**
53
+ * Throw if `fiveField` would fire more often than every {@link MIN_SCHEDULE_INTERVAL_MIN}
54
+ * minutes. Conservative: the smallest cyclic gap in the minute field is the worst-case
55
+ * spacing (it's only ever larger once the hour/day fields restrict things further).
56
+ */
57
+ export function assertScheduleInterval(fiveField) {
58
+ const parts = fiveField.trim().split(/\s+/);
59
+ if (parts.length !== 5) {
60
+ throw new Error(`Schedule must be a 5-field cron ("minute hour day-of-month month day-of-week"), got: "${fiveField}"`);
61
+ }
62
+ const minutes = expandMinuteField(parts[0]);
63
+ if (minutes.length === 0)
64
+ throw new Error(`Minute field matches nothing: "${parts[0]}"`);
65
+ // Smallest cyclic gap across the hour boundary (e.g. {0,50} → gaps 50 and 10).
66
+ let minGap = 60;
67
+ if (minutes.length > 1) {
68
+ for (let i = 0; i < minutes.length; i++) {
69
+ const cur = minutes[i];
70
+ const next = minutes[(i + 1) % minutes.length];
71
+ const gap = (next - cur + 60) % 60 || 60;
72
+ minGap = Math.min(minGap, gap);
73
+ }
74
+ }
75
+ if (minGap < MIN_SCHEDULE_INTERVAL_MIN) {
76
+ throw new Error(`Schedule "${fiveField}" fires every ${minGap} minute(s); the minimum is ${MIN_SCHEDULE_INTERVAL_MIN}. ` +
77
+ `Use a sparser schedule (e.g. "0 0 * * *" for daily, "*/15 * * * *" for the densest allowed).`);
78
+ }
79
+ }
80
+ /** Remap a standard cron day-of-week token (0–7, 0/7=Sun) to EventBridge (1–7, 1=Sun). Passes through names and `*`/`?`. */
81
+ function remapDayOfWeek(field) {
82
+ if (field === '*' || field === '?')
83
+ return field;
84
+ // Token may contain lists/ranges/steps of numbers and/or 3-letter names.
85
+ return field.replace(/\d+/g, (n) => {
86
+ const v = parseInt(n, 10);
87
+ if (v < 0 || v > 7)
88
+ throw new Error(`Invalid day-of-week value: "${n}"`);
89
+ return String((v % 7) + 1); // 0→1 (Sun), 6→7 (Sat), 7→1 (Sun)
90
+ });
91
+ }
92
+ /**
93
+ * Convert a validated 5-field cron expression to an AWS EventBridge `cron(...)`
94
+ * expression. Also enforces the 15-minute guard.
95
+ */
96
+ export function toEventBridgeCron(fiveField) {
97
+ assertScheduleInterval(fiveField); // also validates the 5-field shape
98
+ const f = fiveField.trim().split(/\s+/);
99
+ const [minute, hour, domRaw, month, dowRaw] = [f[0], f[1], f[2], f[3], f[4]];
100
+ let dom = domRaw;
101
+ let dow = remapDayOfWeek(dowRaw);
102
+ // EventBridge: exactly one of day-of-month / day-of-week must be `?`.
103
+ if (dom === '*' && dow === '*') {
104
+ dow = '?'; // unrestricted both → pin day-of-week to ?
105
+ }
106
+ else if (dom !== '*' && dow === '*') {
107
+ dow = '?'; // specific day-of-month → day-of-week must be ?
108
+ }
109
+ else if (dom === '*' && dow !== '*') {
110
+ dom = '?'; // specific day-of-week → day-of-month must be ?
111
+ }
112
+ // (both specific is left as-is; EventBridge rejects it, surfacing a clear error)
113
+ return `cron(${minute} ${hour} ${dom} ${month} ${dow} *)`;
114
+ }
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9jcm9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVILHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUM7QUFFNUMsNEhBQTRIO0FBQzVILFNBQVMsaUJBQWlCLENBQUMsS0FBYTtJQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzlCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdBQUcsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLEVBQVUsQ0FBQztRQUNmLElBQUksRUFBVSxDQUFDO1FBQ2YsSUFBSSxTQUFTLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUFDLEVB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LEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWpDLHNFQUFzRTtJQUN0RSxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQy9CLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQywyQ0FBMkM7SUFDeEQsQ0FBQztTQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDdEMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLGdEQUFnRDtJQUM3RCxDQUFDO1NBQU0sSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsZ0RBQWdEO0lBQzdELENBQUM7SUFDRCxpRkFBaUY7SUFFakYsT0FBTyxRQUFRLE1BQU0sSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxHQUFHLEtBQUssQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogQ29udmVydCBhIHN0YW5kYXJkIDUtZmllbGQgY3JvbiBleHByZXNzaW9uIGludG8gYW4gQVdTIEV2ZW50QnJpZGdlIGNyb25cbiAqIGV4cHJlc3Npb24sIGFuZCBndWFyZCBhZ2FpbnN0IHNjaGVkdWxlcyB0aGF0IGZpcmUgbW9yZSBvZnRlbiB0aGFuIGV2ZXJ5XG4gKiAxNSBtaW51dGVzLlxuICpcbiAqIFN0YW5kYXJkIGNyb246ICAgIGBtaW51dGUgaG91ciBkYXktb2YtbW9udGggbW9udGggZGF5LW9mLXdlZWtgXG4gKiBFdmVudEJyaWRnZSBjcm9uOiBgY3JvbihtaW51dGUgaG91ciBkYXktb2YtbW9udGggbW9udGggZGF5LW9mLXdlZWsgeWVhcilgXG4gKlxuICogVGhlIG5vbi1vYnZpb3VzIGRpZmZlcmVuY2VzIEV2ZW50QnJpZGdlIGltcG9zZXM6XG4gKiAgLSBhIDZ0aCBmaWVsZCAoeWVhciksIHdoaWNoIHdlIGFsd2F5cyBzZXQgdG8gYCpgO1xuICogIC0gZGF5LW9mLW1vbnRoIGFuZCBkYXktb2Ytd2VlayBtYXkgTk9UIGJvdGggYmUgYCpgIOKAlCBleGFjdGx5IG9uZSBtdXN0IGJlIGA/YDtcbiAqICAtIGRheS1vZi13ZWVrIGlzIDHigJM3IHdpdGggMSA9IFN1bmRheSwgd2hlcmVhcyBzdGFuZGFyZCBjcm9uIGlzIDDigJM2IChvciA3KVxuICogICAgd2l0aCAwLzcgPSBTdW5kYXkg4oCUIHNvIG51bWVyaWMgZGF5LW9mLXdlZWsgdmFsdWVzIG11c3QgYmUgcmVtYXBwZWQuXG4gKi9cblxuLyoqIE1pbmltdW0gYWxsb3dlZCBzcGFjaW5nIGJldHdlZW4gZmlyZXMsIGluIG1pbnV0ZXMuICovXG5leHBvcnQgY29uc3QgTUlOX1NDSEVEVUxFX0lOVEVSVkFMX01JTiA9IDE1O1xuXG4vKiogRXhwYW5kIGEgY3JvbiBtaW51dGUgZmllbGQgKHdpbGRjYXJkLCBzdGVwIFwiL25cIiwgcmFuZ2VzIFwiYS1iXCIsIGxpc3RzIFwiYSxiXCIpIHRvIHRoZSBzb3J0ZWQgc2V0IG9mIG1pbnV0ZXMgaXQgZmlyZXMgb24uICovXG5mdW5jdGlvbiBleHBhbmRNaW51dGVGaWVsZChmaWVsZDogc3RyaW5nKTogbnVtYmVyW10ge1xuICBjb25zdCBvdXQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIGZpZWxkLnNwbGl0KCcsJykpIHtcbiAgICBjb25zdCBzbGFzaCA9IHBhcnQuc3BsaXQoJy8nKTtcbiAgICBjb25zdCByYW5nZVBhcnQgPSBzbGFzaFswXSA/PyAnJztcbiAgICBjb25zdCBzdGVwUGFydCA9IHNsYXNoWzFdO1xuICAgIGNvbnN0IHN0ZXAgPSBzdGVwUGFydCAhPT0gdW5kZWZpbmVkID8gcGFyc2VJbnQoc3RlcFBhcnQsIDEwKSA6IDE7XG4gICAgaWYgKHN0ZXBQYXJ0ICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKHN0ZXApIHx8IHN0ZXAgPCAxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN0ZXAgaW4gbWludXRlIGZpZWxkOiBcIiR7cGFydH1cImApO1xuICAgIH1cbiAgICBsZXQgbG86IG51bWJlcjtcbiAgICBsZXQgaGk6IG51bWJlcjtcbiAgICBpZiAocmFuZ2VQYXJ0ID09PSAnKicpIHtcbiAgICAgIGxvID0gMDsgaGkgPSA1OTtcbiAgICB9IGVsc2UgaWYgKHJhbmdlUGFydC5pbmNsdWRlcygnLScpKSB7XG4gICAgICBjb25zdCBlbmRzID0gcmFuZ2VQYXJ0LnNwbGl0KCctJyk7XG4gICAgICBsbyA9IHBhcnNlSW50KGVuZHNbMF0gPz8gJycsIDEwKTtcbiAgICAgIGhpID0gcGFyc2VJbnQoZW5kc1sxXSA/PyAnJywgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsbyA9IGhpID0gcGFyc2VJbnQocmFuZ2VQYXJ0LCAxMCk7XG4gICAgfVxuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihsbykgfHwgIU51bWJlci5pc0ludGVnZXIoaGkpIHx8IGxvIDwgMCB8fCBoaSA+IDU5IHx8IGxvID4gaGkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtaW51dGUgZmllbGQ6IFwiJHtwYXJ0fVwiYCk7XG4gICAgfVxuICAgIGZvciAobGV0IG0gPSBsbzsgbSA8PSBoaTsgbSArPSBzdGVwKSBvdXQuYWRkKG0pO1xuICB9XG4gIHJldHVybiBbLi4ub3V0XS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG59XG5cbi8qKlxuICogVGhyb3cgaWYgYGZpdmVGaWVsZGAgd291bGQgZmlyZSBtb3JlIG9mdGVuIHRoYW4gZXZlcnkge0BsaW5rIE1JTl9TQ0hFRFVMRV9JTlRFUlZBTF9NSU59XG4gKiBtaW51dGVzLiBDb25zZXJ2YXRpdmU6IHRoZSBzbWFsbGVzdCBjeWNsaWMgZ2FwIGluIHRoZSBtaW51dGUgZmllbGQgaXMgdGhlIHdvcnN0LWNhc2VcbiAqIHNwYWNpbmcgKGl0J3Mgb25seSBldmVyIGxhcmdlciBvbmNlIHRoZSBob3VyL2RheSBmaWVsZHMgcmVzdHJpY3QgdGhpbmdzIGZ1cnRoZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2NoZWR1bGVJbnRlcnZhbChmaXZlRmllbGQ6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBwYXJ0cyA9IGZpdmVGaWVsZC50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gNSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2NoZWR1bGUgbXVzdCBiZSBhIDUtZmllbGQgY3JvbiAoXCJtaW51dGUgaG91ciBkYXktb2YtbW9udGggbW9udGggZGF5LW9mLXdlZWtcIiksIGdvdDogXCIke2ZpdmVGaWVsZH1cImApO1xuICB9XG4gIGNvbnN0IG1pbnV0ZXMgPSBleHBhbmRNaW51dGVGaWVsZChwYXJ0c1swXSEpO1xuICBpZiAobWludXRlcy5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihgTWludXRlIGZpZWxkIG1hdGNoZXMgbm90aGluZzogXCIke3BhcnRzWzBdfVwiYCk7XG4gIC8vIFNtYWxsZXN0IGN5Y2xpYyBnYXAgYWNyb3NzIHRoZSBob3VyIGJvdW5kYXJ5IChlLmcuIHswLDUwfSDihpIgZ2FwcyA1MCBhbmQgMTApLlxuICBsZXQgbWluR2FwID0gNjA7XG4gIGlmIChtaW51dGVzLmxlbmd0aCA+IDEpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pbnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1ciA9IG1pbnV0ZXNbaV0hO1xuICAgICAgY29uc3QgbmV4dCA9IG1pbnV0ZXNbKGkgKyAxKSAlIG1pbnV0ZXMubGVuZ3RoXSE7XG4gICAgICBjb25zdCBnYXAgPSAobmV4dCAtIGN1ciArIDYwKSAlIDYwIHx8IDYwO1xuICAgICAgbWluR2FwID0gTWF0aC5taW4obWluR2FwLCBnYXApO1xuICAgIH1cbiAgfVxuICBpZiAobWluR2FwIDwgTUlOX1NDSEVEVUxFX0lOVEVSVkFMX01JTikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBTY2hlZHVsZSBcIiR7Zml2ZUZpZWxkfVwiIGZpcmVzIGV2ZXJ5ICR7bWluR2FwfSBtaW51dGUocyk7IHRoZSBtaW5pbXVtIGlzICR7TUlOX1NDSEVEVUxFX0lOVEVSVkFMX01JTn0uIGAgK1xuICAgICAgYFVzZSBhIHNwYXJzZXIgc2NoZWR1bGUgKGUuZy4gXCIwIDAgKiAqICpcIiBmb3IgZGFpbHksIFwiKi8xNSAqICogKiAqXCIgZm9yIHRoZSBkZW5zZXN0IGFsbG93ZWQpLmAsXG4gICAgKTtcbiAgfVxufVxuXG4vKiogUmVtYXAgYSBzdGFuZGFyZCBjcm9uIGRheS1vZi13ZWVrIHRva2VuICgw4oCTNywgMC83PVN1bikgdG8gRXZlbnRCcmlkZ2UgKDHigJM3LCAxPVN1bikuIFBhc3NlcyB0aHJvdWdoIG5hbWVzIGFuZCBgKmAvYD9gLiAqL1xuZnVuY3Rpb24gcmVtYXBEYXlPZldlZWsoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChmaWVsZCA9PT0gJyonIHx8IGZpZWxkID09PSAnPycpIHJldHVybiBmaWVsZDtcbiAgLy8gVG9rZW4gbWF5IGNvbnRhaW4gbGlzdHMvcmFuZ2VzL3N0ZXBzIG9mIG51bWJlcnMgYW5kL29yIDMtbGV0dGVyIG5hbWVzLlxuICByZXR1cm4gZmllbGQucmVwbGFjZSgvXFxkKy9nLCAobikgPT4ge1xuICAgIGNvbnN0IHYgPSBwYXJzZUludChuLCAxMCk7XG4gICAgaWYgKHYgPCAwIHx8IHYgPiA3KSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF5LW9mLXdlZWsgdmFsdWU6IFwiJHtufVwiYCk7XG4gICAgcmV0dXJuIFN0cmluZygodiAlIDcpICsgMSk7IC8vIDDihpIxIChTdW4pLCA24oaSNyAoU2F0KSwgN+KGkjEgKFN1bilcbiAgfSk7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHZhbGlkYXRlZCA1LWZpZWxkIGNyb24gZXhwcmVzc2lvbiB0byBhbiBBV1MgRXZlbnRCcmlkZ2UgYGNyb24oLi4uKWBcbiAqIGV4cHJlc3Npb24uIEFsc28gZW5mb3JjZXMgdGhlIDE1LW1pbnV0ZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRXZlbnRCcmlkZ2VDcm9uKGZpdmVGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgYXNzZXJ0U2NoZWR1bGVJbnRlcnZhbChmaXZlRmllbGQpOyAvLyBhbHNvIHZhbGlkYXRlcyB0aGUgNS1maWVsZCBzaGFwZVxuICBjb25zdCBmID0gZml2ZUZpZWxkLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBbbWludXRlLCBob3VyLCBkb21SYXcsIG1vbnRoLCBkb3dSYXddID0gW2ZbMF0hLCBmWzFdISwgZlsyXSEsIGZbM10hLCBmWzRdIV07XG5cbiAgbGV0IGRvbSA9IGRvbVJhdztcbiAgbGV0IGRvdyA9IHJlbWFwRGF5T2ZXZWVrKGRvd1Jhdyk7XG5cbiAgLy8gRXZlbnRCcmlkZ2U6IGV4YWN0bHkgb25lIG9mIGRheS1vZi1tb250aCAvIGRheS1vZi13ZWVrIG11c3QgYmUgYD9gLlxuICBpZiAoZG9tID09PSAnKicgJiYgZG93ID09PSAnKicpIHtcbiAgICBkb3cgPSAnPyc7IC8vIHVucmVzdHJpY3RlZCBib3RoIOKGkiBwaW4gZGF5LW9mLXdlZWsgdG8gP1xuICB9IGVsc2UgaWYgKGRvbSAhPT0gJyonICYmIGRvdyA9PT0gJyonKSB7XG4gICAgZG93ID0gJz8nOyAvLyBzcGVjaWZpYyBkYXktb2YtbW9udGgg4oaSIGRheS1vZi13ZWVrIG11c3QgYmUgP1xuICB9IGVsc2UgaWYgKGRvbSA9PT0gJyonICYmIGRvdyAhPT0gJyonKSB7XG4gICAgZG9tID0gJz8nOyAvLyBzcGVjaWZpYyBkYXktb2Ytd2VlayDihpIgZGF5LW9mLW1vbnRoIG11c3QgYmUgP1xuICB9XG4gIC8vIChib3RoIHNwZWNpZmljIGlzIGxlZnQgYXMtaXM7IEV2ZW50QnJpZGdlIHJlamVjdHMgaXQsIHN1cmZhY2luZyBhIGNsZWFyIGVycm9yKVxuXG4gIHJldHVybiBgY3Jvbigke21pbnV0ZX0gJHtob3VyfSAke2RvbX0gJHttb250aH0gJHtkb3d9ICopYDtcbn1cbiJdfQ==
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Shared pipeline-config resolution used by both `synth` and `deploy` so the two
3
+ * commands fetch, plugin-resolve, registry-bake, and template-preview identically
4
+ * (they previously kept near-duplicate copies that could drift).
5
+ */
6
+ import type { Pipeline } from '../types/pipeline.js';
7
+ import type { ApiClient } from './api-client.js';
8
+ export interface FetchedPipeline {
9
+ /** The raw pipeline record (id/org/project/flags) as returned by the platform. */
10
+ readonly pipeline: Pipeline;
11
+ /** props + pipelineId (+ orgId) + resolvedPlugins, with the registry pull-host baked in. */
12
+ readonly propsWithIds: Record<string, unknown>;
13
+ /** The resolved platform base URL the config was fetched against. */
14
+ readonly baseUrl: string;
15
+ }
16
+ /**
17
+ * Fetch a pipeline by id and build the synth/deploy props:
18
+ * - GET the pipeline and validate it has `props`,
19
+ * - assemble `propsWithIds` (props + pipelineId + orgId),
20
+ * - pre-resolve plugins so the template ships real CodeBuild image URIs
21
+ * (otherwise CDK falls back to standard:7.0 at deploy time),
22
+ * - bake the registry pull-host from the platform URL (no-op when
23
+ * IMAGE_REGISTRY_PULL_HOST is set).
24
+ */
25
+ export declare function fetchPipelineProps(client: ApiClient, pipelineId: string): Promise<FetchedPipeline>;
26
+ /**
27
+ * Apply pass-1 self-referencing template resolution to `propsWithIds` and print it
28
+ * to stdout (used by `synth --show-resolved` / `deploy --show-resolved`). Exits with
29
+ * code 1 if resolution reports errors. `resolveSelfReferencing` mutates the object
30
+ * in place, so the printed JSON reflects the expanded templates.
31
+ */
32
+ export declare function printResolvedOrExit(propsWithIds: Record<string, unknown>): Promise<void>;
33
+ //# sourceMappingURL=pipeline-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-config.d.ts","sourceRoot":"","sources":["../../src/utils/pipeline-config.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAKjD,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,4FAA4F;IAC5F,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAsBxG;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAW9F"}
@@ -0,0 +1,54 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { extractSingleResponse, printInfo } from './output-utils.js';
4
+ import { resolvePluginsForProps } from './plugin-resolver.js';
5
+ import { bakePlatformRegistry } from './registry.js';
6
+ /**
7
+ * Fetch a pipeline by id and build the synth/deploy props:
8
+ * - GET the pipeline and validate it has `props`,
9
+ * - assemble `propsWithIds` (props + pipelineId + orgId),
10
+ * - pre-resolve plugins so the template ships real CodeBuild image URIs
11
+ * (otherwise CDK falls back to standard:7.0 at deploy time),
12
+ * - bake the registry pull-host from the platform URL (no-op when
13
+ * IMAGE_REGISTRY_PULL_HOST is set).
14
+ */
15
+ export async function fetchPipelineProps(client, pipelineId) {
16
+ const config = client.getConfig();
17
+ const response = await client.get(`${config.api.pipelineUrl}/${pipelineId}`);
18
+ const pipeline = extractSingleResponse(response, 'pipeline', 'props');
19
+ if (!pipeline?.props) {
20
+ throw new Error(`Failed to retrieve pipeline props for ID: ${pipelineId}`);
21
+ }
22
+ const propsWithIds = {
23
+ ...pipeline.props,
24
+ ...(pipeline.orgId ? { orgId: pipeline.orgId } : {}),
25
+ pipelineId: pipeline.id || pipelineId,
26
+ };
27
+ const resolvedPlugins = await resolvePluginsForProps(client, propsWithIds);
28
+ if (Object.keys(resolvedPlugins).length > 0) {
29
+ propsWithIds.resolvedPlugins = resolvedPlugins;
30
+ printInfo('Pre-resolved plugins', { count: Object.keys(resolvedPlugins).length });
31
+ }
32
+ bakePlatformRegistry(propsWithIds, config.api.baseUrl);
33
+ return { pipeline, propsWithIds, baseUrl: config.api.baseUrl };
34
+ }
35
+ /**
36
+ * Apply pass-1 self-referencing template resolution to `propsWithIds` and print it
37
+ * to stdout (used by `synth --show-resolved` / `deploy --show-resolved`). Exits with
38
+ * code 1 if resolution reports errors. `resolveSelfReferencing` mutates the object
39
+ * in place, so the printed JSON reflects the expanded templates.
40
+ */
41
+ export async function printResolvedOrExit(propsWithIds) {
42
+ const { resolveSelfReferencing } = await import('@pipeline-builder/pipeline-core');
43
+ const scope = { metadata: propsWithIds.metadata ?? {}, vars: propsWithIds.vars ?? {} };
44
+ const isTpl = (f) => f === 'projectName' || f.startsWith('metadata.') || f.startsWith('vars.');
45
+ const result = resolveSelfReferencing(propsWithIds, scope, isTpl, (f) => (isTpl(f) ? f : null), 'pipeline');
46
+ if (result.errors.length) {
47
+ console.error('Resolution errors:');
48
+ for (const e of result.errors)
49
+ console.error(` [${e.field ?? '?'}] ${e.message}`);
50
+ process.exit(1);
51
+ }
52
+ console.log(JSON.stringify(propsWithIds, null, 2));
53
+ }
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BpcGVsaW5lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBVXRDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFXckQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BQWlCLEVBQUUsVUFBa0I7SUFDNUUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBMEIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFXLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEYsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBNEI7UUFDNUMsR0FBSSxRQUFRLENBQUMsS0FBaUM7UUFDOUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BELFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxJQUFJLFVBQVU7S0FDdEMsQ0FBQztJQUVGLE1BQU0sZUFBZSxHQUFHLE1BQU0sc0JBQXNCLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzNFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUMsWUFBWSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7UUFDL0MsU0FBUyxDQUFDLHNCQUFzQixFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsb0JBQW9CLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDakUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxZQUFxQztJQUM3RSxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ25GLE1BQU0sS0FBSyxHQUFHLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxRQUFRLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQ3ZGLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssYUFBYSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RyxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDcEgsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNwQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNoYXJlZCBwaXBlbGluZS1jb25maWcgcmVzb2x1dGlvbiB1c2VkIGJ5IGJvdGggYHN5bnRoYCBhbmQgYGRlcGxveWAgc28gdGhlIHR3b1xuICogY29tbWFuZHMgZmV0Y2gsIHBsdWdpbi1yZXNvbHZlLCByZWdpc3RyeS1iYWtlLCBhbmQgdGVtcGxhdGUtcHJldmlldyBpZGVudGljYWxseVxuICogKHRoZXkgcHJldmlvdXNseSBrZXB0IG5lYXItZHVwbGljYXRlIGNvcGllcyB0aGF0IGNvdWxkIGRyaWZ0KS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBpcGVsaW5lIH0gZnJvbSAnLi4vdHlwZXMvcGlwZWxpbmUuanMnO1xuaW1wb3J0IHR5cGUgeyBBcGlDbGllbnQgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgZXh0cmFjdFNpbmdsZVJlc3BvbnNlLCBwcmludEluZm8gfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUGx1Z2luc0ZvclByb3BzIH0gZnJvbSAnLi9wbHVnaW4tcmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgYmFrZVBsYXRmb3JtUmVnaXN0cnkgfSBmcm9tICcuL3JlZ2lzdHJ5LmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBGZXRjaGVkUGlwZWxpbmUge1xuICAvKiogVGhlIHJhdyBwaXBlbGluZSByZWNvcmQgKGlkL29yZy9wcm9qZWN0L2ZsYWdzKSBhcyByZXR1cm5lZCBieSB0aGUgcGxhdGZvcm0uICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lOiBQaXBlbGluZTtcbiAgLyoqIHByb3BzICsgcGlwZWxpbmVJZCAoKyBvcmdJZCkgKyByZXNvbHZlZFBsdWdpbnMsIHdpdGggdGhlIHJlZ2lzdHJ5IHB1bGwtaG9zdCBiYWtlZCBpbi4gKi9cbiAgcmVhZG9ubHkgcHJvcHNXaXRoSWRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFRoZSByZXNvbHZlZCBwbGF0Zm9ybSBiYXNlIFVSTCB0aGUgY29uZmlnIHdhcyBmZXRjaGVkIGFnYWluc3QuICovXG4gIHJlYWRvbmx5IGJhc2VVcmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBGZXRjaCBhIHBpcGVsaW5lIGJ5IGlkIGFuZCBidWlsZCB0aGUgc3ludGgvZGVwbG95IHByb3BzOlxuICogIC0gR0VUIHRoZSBwaXBlbGluZSBhbmQgdmFsaWRhdGUgaXQgaGFzIGBwcm9wc2AsXG4gKiAgLSBhc3NlbWJsZSBgcHJvcHNXaXRoSWRzYCAocHJvcHMgKyBwaXBlbGluZUlkICsgb3JnSWQpLFxuICogIC0gcHJlLXJlc29sdmUgcGx1Z2lucyBzbyB0aGUgdGVtcGxhdGUgc2hpcHMgcmVhbCBDb2RlQnVpbGQgaW1hZ2UgVVJJc1xuICogICAgKG90aGVyd2lzZSBDREsgZmFsbHMgYmFjayB0byBzdGFuZGFyZDo3LjAgYXQgZGVwbG95IHRpbWUpLFxuICogIC0gYmFrZSB0aGUgcmVnaXN0cnkgcHVsbC1ob3N0IGZyb20gdGhlIHBsYXRmb3JtIFVSTCAobm8tb3Agd2hlblxuICogICAgSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUIGlzIHNldCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFBpcGVsaW5lUHJvcHMoY2xpZW50OiBBcGlDbGllbnQsIHBpcGVsaW5lSWQ6IHN0cmluZyk6IFByb21pc2U8RmV0Y2hlZFBpcGVsaW5lPiB7XG4gIGNvbnN0IGNvbmZpZyA9IGNsaWVudC5nZXRDb25maWcoKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PFJlY29yZDxzdHJpbmcsIHVua25vd24+PihgJHtjb25maWcuYXBpLnBpcGVsaW5lVXJsfS8ke3BpcGVsaW5lSWR9YCk7XG4gIGNvbnN0IHBpcGVsaW5lID0gZXh0cmFjdFNpbmdsZVJlc3BvbnNlPFBpcGVsaW5lPihyZXNwb25zZSwgJ3BpcGVsaW5lJywgJ3Byb3BzJyk7XG4gIGlmICghcGlwZWxpbmU/LnByb3BzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV0cmlldmUgcGlwZWxpbmUgcHJvcHMgZm9yIElEOiAke3BpcGVsaW5lSWR9YCk7XG4gIH1cblxuICBjb25zdCBwcm9wc1dpdGhJZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIC4uLihwaXBlbGluZS5wcm9wcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksXG4gICAgLi4uKHBpcGVsaW5lLm9yZ0lkID8geyBvcmdJZDogcGlwZWxpbmUub3JnSWQgfSA6IHt9KSxcbiAgICBwaXBlbGluZUlkOiBwaXBlbGluZS5pZCB8fCBwaXBlbGluZUlkLFxuICB9O1xuXG4gIGNvbnN0IHJlc29sdmVkUGx1Z2lucyA9IGF3YWl0IHJlc29sdmVQbHVnaW5zRm9yUHJvcHMoY2xpZW50LCBwcm9wc1dpdGhJZHMpO1xuICBpZiAoT2JqZWN0LmtleXMocmVzb2x2ZWRQbHVnaW5zKS5sZW5ndGggPiAwKSB7XG4gICAgcHJvcHNXaXRoSWRzLnJlc29sdmVkUGx1Z2lucyA9IHJlc29sdmVkUGx1Z2lucztcbiAgICBwcmludEluZm8oJ1ByZS1yZXNvbHZlZCBwbHVnaW5zJywgeyBjb3VudDogT2JqZWN0LmtleXMocmVzb2x2ZWRQbHVnaW5zKS5sZW5ndGggfSk7XG4gIH1cblxuICBiYWtlUGxhdGZvcm1SZWdpc3RyeShwcm9wc1dpdGhJZHMsIGNvbmZpZy5hcGkuYmFzZVVybCk7XG4gIHJldHVybiB7IHBpcGVsaW5lLCBwcm9wc1dpdGhJZHMsIGJhc2VVcmw6IGNvbmZpZy5hcGkuYmFzZVVybCB9O1xufVxuXG4vKipcbiAqIEFwcGx5IHBhc3MtMSBzZWxmLXJlZmVyZW5jaW5nIHRlbXBsYXRlIHJlc29sdXRpb24gdG8gYHByb3BzV2l0aElkc2AgYW5kIHByaW50IGl0XG4gKiB0byBzdGRvdXQgKHVzZWQgYnkgYHN5bnRoIC0tc2hvdy1yZXNvbHZlZGAgLyBgZGVwbG95IC0tc2hvdy1yZXNvbHZlZGApLiBFeGl0cyB3aXRoXG4gKiBjb2RlIDEgaWYgcmVzb2x1dGlvbiByZXBvcnRzIGVycm9ycy4gYHJlc29sdmVTZWxmUmVmZXJlbmNpbmdgIG11dGF0ZXMgdGhlIG9iamVjdFxuICogaW4gcGxhY2UsIHNvIHRoZSBwcmludGVkIEpTT04gcmVmbGVjdHMgdGhlIGV4cGFuZGVkIHRlbXBsYXRlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByaW50UmVzb2x2ZWRPckV4aXQocHJvcHNXaXRoSWRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHJlc29sdmVTZWxmUmVmZXJlbmNpbmcgfSA9IGF3YWl0IGltcG9ydCgnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZScpO1xuICBjb25zdCBzY29wZSA9IHsgbWV0YWRhdGE6IHByb3BzV2l0aElkcy5tZXRhZGF0YSA/PyB7fSwgdmFyczogcHJvcHNXaXRoSWRzLnZhcnMgPz8ge30gfTtcbiAgY29uc3QgaXNUcGwgPSAoZjogc3RyaW5nKSA9PiBmID09PSAncHJvamVjdE5hbWUnIHx8IGYuc3RhcnRzV2l0aCgnbWV0YWRhdGEuJykgfHwgZi5zdGFydHNXaXRoKCd2YXJzLicpO1xuICBjb25zdCByZXN1bHQgPSByZXNvbHZlU2VsZlJlZmVyZW5jaW5nKHByb3BzV2l0aElkcywgc2NvcGUsIGlzVHBsLCAoZjogc3RyaW5nKSA9PiAoaXNUcGwoZikgPyBmIDogbnVsbCksICdwaXBlbGluZScpO1xuICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGgpIHtcbiAgICBjb25zb2xlLmVycm9yKCdSZXNvbHV0aW9uIGVycm9yczonKTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgcmVzdWx0LmVycm9ycykgY29uc29sZS5lcnJvcihgICBbJHtlLmZpZWxkID8/ICc/J31dICR7ZS5tZXNzYWdlfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShwcm9wc1dpdGhJZHMsIG51bGwsIDIpKTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"platform-secret.d.ts","sourceRoot":"","sources":["../../src/utils/platform-secret.ts"],"names":[],"mappings":"AAiBA,sEAAsE;AACtE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBvF;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAY/F"}
1
+ {"version":3,"file":"platform-secret.d.ts","sourceRoot":"","sources":["../../src/utils/platform-secret.ts"],"names":[],"mappings":"AAiBA,sEAAsE;AACtE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BvF;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAY/F"}
@@ -11,7 +11,7 @@ import { CoreConstants } from '@pipeline-builder/pipeline-core';
11
11
  import axios from 'axios';
12
12
  import { decodeTokenPayload } from './auth-guard.js';
13
13
  import { getConfigWithOptions } from './config-loader.js';
14
- import { printInfo, printSection, printSuccess } from './output-utils.js';
14
+ import { printInfo, printSection, printSuccess, printWarning } from './output-utils.js';
15
15
  /**
16
16
  * Derive the platform secret path from a JWT's organizationId.
17
17
  * Pattern: `{SECRETS_PATH_PREFIX}/{orgId}/platform`.
@@ -38,6 +38,9 @@ export async function ensurePlatformToken(options) {
38
38
  const loginPassword = options.password || process.env.PLATFORM_PASSWORD;
39
39
  if (!loginEmail || !loginPassword)
40
40
  return;
41
+ if (options.password) {
42
+ printWarning('Passing --password on the command line can expose it via shell history; prefer the PLATFORM_PASSWORD env var.');
43
+ }
41
44
  printSection('Login');
42
45
  printInfo('Authenticating with email/password...');
43
46
  const config = getConfigWithOptions(options);
@@ -71,4 +74,4 @@ export async function resolvePlatformSecretName(options) {
71
74
  }
72
75
  return resolveSecretName(process.env.PLATFORM_TOKEN);
73
76
  }
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0tc2VjcmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BsYXRmb3JtLXNlY3JldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFVMUU7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQzdDLE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxjQUFjLENBQUM7SUFDdEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyw2R0FBNkcsQ0FBQyxDQUFDO0lBQ2pJLENBQUM7SUFDRCxPQUFPLEdBQUcsYUFBYSxDQUFDLG1CQUFtQixJQUFJLEtBQUssV0FBVyxDQUFDO0FBQ2xFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsT0FBOEI7SUFDdEUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWM7UUFBRSxPQUFPO0lBQ3ZDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztJQUNwRSxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7SUFDeEUsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLGFBQWE7UUFBRSxPQUFPO0lBRTFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QixTQUFTLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUNuRCxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQ3BDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLGlCQUFpQixFQUN0QyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxFQUM5QztRQUNFLFVBQVUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixLQUFLLEtBQUs7WUFDakQsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2xFLENBQUMsQ0FBQyxTQUFTO0tBQ2QsQ0FDRixDQUFDO0lBQ0YsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQztJQUNqRSxNQUFNLFVBQVUsR0FBRyxTQUFTLEVBQUUsV0FBVyxDQUFDO0lBQzFDLElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUM7SUFDeEMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHlCQUF5QixDQUFDLE9BQThCO0lBQzVFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztJQUN4RSxJQUFJLFFBQVE7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM5QixNQUFNLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0ZBQWdGO2NBQzlFLHdFQUF3RTtjQUN4RSxnRUFBZ0UsQ0FDbkUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNoYXJlZCBwbGF0Zm9ybS10b2tlbiDihpIgc2VjcmV0LW5hbWUgcmVzb2x1dGlvbiwgdXNlZCBieSBib3RoIGBzdG9yZS10b2tlbmBcbiAqICh3aGljaCBXUklURVMgdGhlIEpXVCB0byBTZWNyZXRzIE1hbmFnZXIpIGFuZCBgc2V0dXAtZXZlbnRzYCAod2hpY2ggZGVwbG95cyB0aGVcbiAqIExhbWJkYSB0aGF0IFJFQURTIGl0KS4gQm90aCBtdXN0IGFncmVlIG9uIHRoZSBzYW1lIHNlY3JldCBwYXRoLCBzbyB0aGUgbG9naWNcbiAqIGxpdmVzIGhlcmUgb25jZTogZGVyaXZlIGB7U0VDUkVUU19QQVRIX1BSRUZJWH0ve29yZ0lkfS9wbGF0Zm9ybWAgZnJvbSB0aGUgSldUJ3NcbiAqIG9yZ2FuaXphdGlvbklkLCBsb2dnaW5nIGluIGZpcnN0IGlmIG5lZWRlZCB0byBvYnRhaW4gdGhlIHRva2VuLlxuICovXG5cbmltcG9ydCB7IENvcmVDb25zdGFudHMgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBkZWNvZGVUb2tlblBheWxvYWQgfSBmcm9tICcuL2F1dGgtZ3VhcmQuanMnO1xuaW1wb3J0IHsgZ2V0Q29uZmlnV2l0aE9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy1sb2FkZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRJbmZvLCBwcmludFNlY3Rpb24sIHByaW50U3VjY2VzcyB9IGZyb20gJy4vb3V0cHV0LXV0aWxzLmpzJztcblxuLyoqIExvZ2luL3NlY3JldCBvcHRpb25zIHNoYXJlZCBhY3Jvc3MgdGhlIHBsYXRmb3JtLXNlY3JldCBoZWxwZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybVNlY3JldE9wdGlvbnMge1xuICByZWFkb25seSBzZWNyZXROYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBlbWFpbD86IHN0cmluZztcbiAgcmVhZG9ubHkgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcmlmeVNzbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVyaXZlIHRoZSBwbGF0Zm9ybSBzZWNyZXQgcGF0aCBmcm9tIGEgSldUJ3Mgb3JnYW5pemF0aW9uSWQuXG4gKiBQYXR0ZXJuOiBge1NFQ1JFVFNfUEFUSF9QUkVGSVh9L3tvcmdJZH0vcGxhdGZvcm1gLlxuICogQHRocm93cyBpZiB0aGUgdG9rZW4gY2FycmllcyBubyBvcmdhbml6YXRpb25JZCAoY2FsbGVyIHNob3VsZCBmYWxsIGJhY2sgdG8gLS1zZWNyZXQtbmFtZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2VjcmV0TmFtZSh0b2tlbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGF5bG9hZCA9IGRlY29kZVRva2VuUGF5bG9hZCh0b2tlbik7XG4gIGNvbnN0IG9yZ0lkID0gcGF5bG9hZD8ub3JnYW5pemF0aW9uSWQ7XG4gIGlmICghb3JnSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rva2VuIGRvZXMgbm90IGNvbnRhaW4gb3JnYW5pemF0aW9uSWQg4oCUIGNhbm5vdCBkZXJpdmUgc2VjcmV0IG5hbWUuIFVzZSAtLXNlY3JldC1uYW1lIHRvIHNwZWNpZnkgZXhwbGljaXRseS4nKTtcbiAgfVxuICByZXR1cm4gYCR7Q29yZUNvbnN0YW50cy5TRUNSRVRTX1BBVEhfUFJFRklYfS8ke29yZ0lkfS9wbGF0Zm9ybWA7XG59XG5cbi8qKlxuICogRW5zdXJlIGBwcm9jZXNzLmVudi5QTEFURk9STV9UT0tFTmAgaXMgc2V0LiBOby1vcCBpZiBpdCBhbHJlYWR5IGlzLiBPdGhlcndpc2UsXG4gKiBpZiBsb2dpbiBjcmVkcyBhcmUgYXZhaWxhYmxlIChgLS1lbWFpbC8tLXBhc3N3b3JkYCBvciBgUExBVEZPUk1fSURFTlRJRklFUmAvXG4gKiBgUExBVEZPUk1fUEFTU1dPUkRgIGVudiDigJQgdGhlIGVudiBwYXRoIGxldHMgYHByb3Zpc2lvbmAgcGFzcyBjcmVkcyB3aXRob3V0XG4gKiBwdXR0aW5nIHRoZSBwYXNzd29yZCBvbiB0aGUgY29tbWFuZCBsaW5lKSwgbG9nIGluIGFuZCBzZXQgUExBVEZPUk1fVE9LRU4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVQbGF0Zm9ybVRva2VuKG9wdGlvbnM6IFBsYXRmb3JtU2VjcmV0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pIHJldHVybjtcbiAgY29uc3QgbG9naW5FbWFpbCA9IG9wdGlvbnMuZW1haWwgfHwgcHJvY2Vzcy5lbnYuUExBVEZPUk1fSURFTlRJRklFUjtcbiAgY29uc3QgbG9naW5QYXNzd29yZCA9IG9wdGlvbnMucGFzc3dvcmQgfHwgcHJvY2Vzcy5lbnYuUExBVEZPUk1fUEFTU1dPUkQ7XG4gIGlmICghbG9naW5FbWFpbCB8fCAhbG9naW5QYXNzd29yZCkgcmV0dXJuO1xuXG4gIHByaW50U2VjdGlvbignTG9naW4nKTtcbiAgcHJpbnRJbmZvKCdBdXRoZW50aWNhdGluZyB3aXRoIGVtYWlsL3Bhc3N3b3JkLi4uJyk7XG4gIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ1dpdGhPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBsb2dpblJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdChcbiAgICBgJHtjb25maWcuYXBpLmJhc2VVcmx9L2FwaS9hdXRoL2xvZ2luYCxcbiAgICB7IGVtYWlsOiBsb2dpbkVtYWlsLCBwYXNzd29yZDogbG9naW5QYXNzd29yZCB9LFxuICAgIHtcbiAgICAgIGh0dHBzQWdlbnQ6IGNvbmZpZy5hcGkucmVqZWN0VW5hdXRob3JpemVkID09PSBmYWxzZVxuICAgICAgICA/IG5ldyAoYXdhaXQgaW1wb3J0KCdodHRwcycpKS5BZ2VudCh7IHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UgfSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSxcbiAgKTtcbiAgY29uc3QgbG9naW5EYXRhID0gbG9naW5SZXNwb25zZS5kYXRhPy5kYXRhID8/IGxvZ2luUmVzcG9uc2UuZGF0YTtcbiAgY29uc3QgbG9naW5Ub2tlbiA9IGxvZ2luRGF0YT8uYWNjZXNzVG9rZW47XG4gIGlmICghbG9naW5Ub2tlbiB8fCB0eXBlb2YgbG9naW5Ub2tlbiAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvZ2luIGZhaWxlZCDigJQgbm8gYWNjZXNzIHRva2VuIGluIHJlc3BvbnNlJyk7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4gPSBsb2dpblRva2VuO1xuICBwcmludFN1Y2Nlc3MoJ0xvZ2luIHN1Y2Nlc3NmdWwnKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBwbGF0Zm9ybSBzZWNyZXQgbmFtZTogYW4gZXhwbGljaXQgYC0tc2VjcmV0LW5hbWVgIC8gYFBMQVRGT1JNX1NFQ1JFVF9OQU1FYFxuICogd2luczsgb3RoZXJ3aXNlIGxvZyBpbiBpZiBuZWVkZWQgYW5kIGRlcml2ZSBpdCBmcm9tIHRoZSBwbGF0Zm9ybSB0b2tlbidzIG9yZyDigJQgdGhlXG4gKiBzYW1lIHRva2VuIGBpbml0LXBsYXRmb3JtLnNoYCAocmVnaXN0ZXIpIG1pbnRzLCBzbyB3cml0ZXIgYW5kIHJlYWRlciBhZ3JlZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQbGF0Zm9ybVNlY3JldE5hbWUob3B0aW9uczogUGxhdGZvcm1TZWNyZXRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZXhwbGljaXQgPSBvcHRpb25zLnNlY3JldE5hbWUgfHwgcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUU7XG4gIGlmIChleHBsaWNpdCkgcmV0dXJuIGV4cGxpY2l0O1xuICBhd2FpdCBlbnN1cmVQbGF0Zm9ybVRva2VuKG9wdGlvbnMpO1xuICBpZiAoIXByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0Nhbm5vdCBkZXJpdmUgdGhlIHBsYXRmb3JtIHNlY3JldCBuYW1lOiBubyBQTEFURk9STV9UT0tFTiBhbmQgbm8gbG9naW4gY3JlZHMuICdcbiAgICAgICsgJ1Bhc3MgLS1zZWNyZXQtbmFtZSAvIHNldCBQTEFURk9STV9TRUNSRVRfTkFNRSwgb3IgcHJvdmlkZSBsb2dpbiBjcmVkcyAnXG4gICAgICArICcoLS1lbWFpbC8tLXBhc3N3b3JkIG9yIFBMQVRGT1JNX0lERU5USUZJRVIvUExBVEZPUk1fUEFTU1dPUkQpLicsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZVNlY3JldE5hbWUocHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pO1xufVxuIl19
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0tc2VjcmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BsYXRmb3JtLXNlY3JldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBVXhGOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBYTtJQUM3QyxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBRyxPQUFPLEVBQUUsY0FBYyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsNkdBQTZHLENBQUMsQ0FBQztJQUNqSSxDQUFDO0lBQ0QsT0FBTyxHQUFHLGFBQWEsQ0FBQyxtQkFBbUIsSUFBSSxLQUFLLFdBQVcsQ0FBQztBQUNsRSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG1CQUFtQixDQUFDLE9BQThCO0lBQ3RFLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjO1FBQUUsT0FBTztJQUN2QyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7SUFDcEUsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDO0lBQ3hFLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxhQUFhO1FBQUUsT0FBTztJQUUxQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQixZQUFZLENBQUMsK0dBQStHLENBQUMsQ0FBQztJQUNoSSxDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RCLFNBQVMsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sTUFBTSxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLE1BQU0sYUFBYSxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FDcEMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8saUJBQWlCLEVBQ3RDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLEVBQzlDO1FBQ0UsVUFBVSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEtBQUssS0FBSztZQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDbEUsQ0FBQyxDQUFDLFNBQVM7S0FDZCxDQUNGLENBQUM7SUFDRixNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDO0lBQ2pFLE1BQU0sVUFBVSxHQUFHLFNBQVMsRUFBRSxXQUFXLENBQUM7SUFDMUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQztJQUN4QyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUseUJBQXlCLENBQUMsT0FBOEI7SUFDNUUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDO0lBQ3hFLElBQUksUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzlCLE1BQU0sbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FDYixnRkFBZ0Y7Y0FDOUUsd0VBQXdFO2NBQ3hFLGdFQUFnRSxDQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8saUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU2hhcmVkIHBsYXRmb3JtLXRva2VuIOKGkiBzZWNyZXQtbmFtZSByZXNvbHV0aW9uLCB1c2VkIGJ5IGJvdGggYHN0b3JlLXRva2VuYFxuICogKHdoaWNoIFdSSVRFUyB0aGUgSldUIHRvIFNlY3JldHMgTWFuYWdlcikgYW5kIGBzZXR1cC1ldmVudHNgICh3aGljaCBkZXBsb3lzIHRoZVxuICogTGFtYmRhIHRoYXQgUkVBRFMgaXQpLiBCb3RoIG11c3QgYWdyZWUgb24gdGhlIHNhbWUgc2VjcmV0IHBhdGgsIHNvIHRoZSBsb2dpY1xuICogbGl2ZXMgaGVyZSBvbmNlOiBkZXJpdmUgYHtTRUNSRVRTX1BBVEhfUFJFRklYfS97b3JnSWR9L3BsYXRmb3JtYCBmcm9tIHRoZSBKV1Qnc1xuICogb3JnYW5pemF0aW9uSWQsIGxvZ2dpbmcgaW4gZmlyc3QgaWYgbmVlZGVkIHRvIG9idGFpbiB0aGUgdG9rZW4uXG4gKi9cblxuaW1wb3J0IHsgQ29yZUNvbnN0YW50cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IGRlY29kZVRva2VuUGF5bG9hZCB9IGZyb20gJy4vYXV0aC1ndWFyZC5qcyc7XG5pbXBvcnQgeyBnZXRDb25maWdXaXRoT3B0aW9ucyB9IGZyb20gJy4vY29uZmlnLWxvYWRlci5qcyc7XG5pbXBvcnQgeyBwcmludEluZm8sIHByaW50U2VjdGlvbiwgcHJpbnRTdWNjZXNzLCBwcmludFdhcm5pbmcgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5cbi8qKiBMb2dpbi9zZWNyZXQgb3B0aW9ucyBzaGFyZWQgYWNyb3NzIHRoZSBwbGF0Zm9ybS1zZWNyZXQgaGVscGVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1TZWNyZXRPcHRpb25zIHtcbiAgcmVhZG9ubHkgc2VjcmV0TmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZW1haWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhc3N3b3JkPzogc3RyaW5nO1xuICByZWFkb25seSB2ZXJpZnlTc2w/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIERlcml2ZSB0aGUgcGxhdGZvcm0gc2VjcmV0IHBhdGggZnJvbSBhIEpXVCdzIG9yZ2FuaXphdGlvbklkLlxuICogUGF0dGVybjogYHtTRUNSRVRTX1BBVEhfUFJFRklYfS97b3JnSWR9L3BsYXRmb3JtYC5cbiAqIEB0aHJvd3MgaWYgdGhlIHRva2VuIGNhcnJpZXMgbm8gb3JnYW5pemF0aW9uSWQgKGNhbGxlciBzaG91bGQgZmFsbCBiYWNrIHRvIC0tc2VjcmV0LW5hbWUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNlY3JldE5hbWUodG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBheWxvYWQgPSBkZWNvZGVUb2tlblBheWxvYWQodG9rZW4pO1xuICBjb25zdCBvcmdJZCA9IHBheWxvYWQ/Lm9yZ2FuaXphdGlvbklkO1xuICBpZiAoIW9yZ0lkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBkb2VzIG5vdCBjb250YWluIG9yZ2FuaXphdGlvbklkIOKAlCBjYW5ub3QgZGVyaXZlIHNlY3JldCBuYW1lLiBVc2UgLS1zZWNyZXQtbmFtZSB0byBzcGVjaWZ5IGV4cGxpY2l0bHkuJyk7XG4gIH1cbiAgcmV0dXJuIGAke0NvcmVDb25zdGFudHMuU0VDUkVUU19QQVRIX1BSRUZJWH0vJHtvcmdJZH0vcGxhdGZvcm1gO1xufVxuXG4vKipcbiAqIEVuc3VyZSBgcHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU5gIGlzIHNldC4gTm8tb3AgaWYgaXQgYWxyZWFkeSBpcy4gT3RoZXJ3aXNlLFxuICogaWYgbG9naW4gY3JlZHMgYXJlIGF2YWlsYWJsZSAoYC0tZW1haWwvLS1wYXNzd29yZGAgb3IgYFBMQVRGT1JNX0lERU5USUZJRVJgL1xuICogYFBMQVRGT1JNX1BBU1NXT1JEYCBlbnYg4oCUIHRoZSBlbnYgcGF0aCBsZXRzIGBwcm92aXNpb25gIHBhc3MgY3JlZHMgd2l0aG91dFxuICogcHV0dGluZyB0aGUgcGFzc3dvcmQgb24gdGhlIGNvbW1hbmQgbGluZSksIGxvZyBpbiBhbmQgc2V0IFBMQVRGT1JNX1RPS0VOLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlUGxhdGZvcm1Ub2tlbihvcHRpb25zOiBQbGF0Zm9ybVNlY3JldE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOKSByZXR1cm47XG4gIGNvbnN0IGxvZ2luRW1haWwgPSBvcHRpb25zLmVtYWlsIHx8IHByb2Nlc3MuZW52LlBMQVRGT1JNX0lERU5USUZJRVI7XG4gIGNvbnN0IGxvZ2luUGFzc3dvcmQgPSBvcHRpb25zLnBhc3N3b3JkIHx8IHByb2Nlc3MuZW52LlBMQVRGT1JNX1BBU1NXT1JEO1xuICBpZiAoIWxvZ2luRW1haWwgfHwgIWxvZ2luUGFzc3dvcmQpIHJldHVybjtcblxuICBpZiAob3B0aW9ucy5wYXNzd29yZCkge1xuICAgIHByaW50V2FybmluZygnUGFzc2luZyAtLXBhc3N3b3JkIG9uIHRoZSBjb21tYW5kIGxpbmUgY2FuIGV4cG9zZSBpdCB2aWEgc2hlbGwgaGlzdG9yeTsgcHJlZmVyIHRoZSBQTEFURk9STV9QQVNTV09SRCBlbnYgdmFyLicpO1xuICB9XG5cbiAgcHJpbnRTZWN0aW9uKCdMb2dpbicpO1xuICBwcmludEluZm8oJ0F1dGhlbnRpY2F0aW5nIHdpdGggZW1haWwvcGFzc3dvcmQuLi4nKTtcbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnV2l0aE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGxvZ2luUmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KFxuICAgIGAke2NvbmZpZy5hcGkuYmFzZVVybH0vYXBpL2F1dGgvbG9naW5gLFxuICAgIHsgZW1haWw6IGxvZ2luRW1haWwsIHBhc3N3b3JkOiBsb2dpblBhc3N3b3JkIH0sXG4gICAge1xuICAgICAgaHR0cHNBZ2VudDogY29uZmlnLmFwaS5yZWplY3RVbmF1dGhvcml6ZWQgPT09IGZhbHNlXG4gICAgICAgID8gbmV3IChhd2FpdCBpbXBvcnQoJ2h0dHBzJykpLkFnZW50KHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9KVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9LFxuICApO1xuICBjb25zdCBsb2dpbkRhdGEgPSBsb2dpblJlc3BvbnNlLmRhdGE/LmRhdGEgPz8gbG9naW5SZXNwb25zZS5kYXRhO1xuICBjb25zdCBsb2dpblRva2VuID0gbG9naW5EYXRhPy5hY2Nlc3NUb2tlbjtcbiAgaWYgKCFsb2dpblRva2VuIHx8IHR5cGVvZiBsb2dpblRva2VuICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignTG9naW4gZmFpbGVkIOKAlCBubyBhY2Nlc3MgdG9rZW4gaW4gcmVzcG9uc2UnKTtcbiAgfVxuICBwcm9jZXNzLmVudi5QTEFURk9STV9UT0tFTiA9IGxvZ2luVG9rZW47XG4gIHByaW50U3VjY2VzcygnTG9naW4gc3VjY2Vzc2Z1bCcpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHBsYXRmb3JtIHNlY3JldCBuYW1lOiBhbiBleHBsaWNpdCBgLS1zZWNyZXQtbmFtZWAgLyBgUExBVEZPUk1fU0VDUkVUX05BTUVgXG4gKiB3aW5zOyBvdGhlcndpc2UgbG9nIGluIGlmIG5lZWRlZCBhbmQgZGVyaXZlIGl0IGZyb20gdGhlIHBsYXRmb3JtIHRva2VuJ3Mgb3JnIOKAlCB0aGVcbiAqIHNhbWUgdG9rZW4gYGluaXQtcGxhdGZvcm0uc2hgIChyZWdpc3RlcikgbWludHMsIHNvIHdyaXRlciBhbmQgcmVhZGVyIGFncmVlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBsYXRmb3JtU2VjcmV0TmFtZShvcHRpb25zOiBQbGF0Zm9ybVNlY3JldE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBleHBsaWNpdCA9IG9wdGlvbnMuc2VjcmV0TmFtZSB8fCBwcm9jZXNzLmVudi5QTEFURk9STV9TRUNSRVRfTkFNRTtcbiAgaWYgKGV4cGxpY2l0KSByZXR1cm4gZXhwbGljaXQ7XG4gIGF3YWl0IGVuc3VyZVBsYXRmb3JtVG9rZW4ob3B0aW9ucyk7XG4gIGlmICghcHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQ2Fubm90IGRlcml2ZSB0aGUgcGxhdGZvcm0gc2VjcmV0IG5hbWU6IG5vIFBMQVRGT1JNX1RPS0VOIGFuZCBubyBsb2dpbiBjcmVkcy4gJ1xuICAgICAgKyAnUGFzcyAtLXNlY3JldC1uYW1lIC8gc2V0IFBMQVRGT1JNX1NFQ1JFVF9OQU1FLCBvciBwcm92aWRlIGxvZ2luIGNyZWRzICdcbiAgICAgICsgJygtLWVtYWlsLy0tcGFzc3dvcmQgb3IgUExBVEZPUk1fSURFTlRJRklFUi9QTEFURk9STV9QQVNTV09SRCkuJyxcbiAgICApO1xuICB9XG4gIHJldHVybiByZXNvbHZlU2VjcmV0TmFtZShwcm9jZXNzLmVudi5QTEFURk9STV9UT0tFTik7XG59XG4iXX0=
@@ -1,14 +1,15 @@
1
1
  /**
2
- * Check if auth attempts are currently rate-limited.
2
+ * Check if auth attempts for this identifier are currently rate-limited.
3
3
  * @returns null if allowed, or a message string if blocked.
4
4
  */
5
- export declare function checkAuthRateLimit(): string | null;
5
+ export declare function checkAuthRateLimit(identifier?: string, baseUrl?: string): string | null;
6
6
  /**
7
- * Record a successful auth — resets the failure counter.
7
+ * Record a successful auth for this identifier clears its failure counter.
8
8
  */
9
- export declare function recordAuthSuccess(): void;
9
+ export declare function recordAuthSuccess(identifier?: string, baseUrl?: string): void;
10
10
  /**
11
- * Record a failed auth attempt. After MAX_FAILURES, locks out for COOLDOWN_MS.
11
+ * Record a failed auth attempt for this identifier. After MAX_FAILURES, locks out
12
+ * that identifier for COOLDOWN_MS.
12
13
  */
13
- export declare function recordAuthFailure(): void;
14
+ export declare function recordAuthFailure(identifier?: string, baseUrl?: string): void;
14
15
  //# sourceMappingURL=rate-limiter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAsCA;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAelD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAWxC"}
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AA4DA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBvF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAI7E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAY7E"}
@@ -1,5 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import crypto from 'crypto';
3
4
  import fs from 'fs';
4
5
  import os from 'os';
5
6
  import path from 'path';
@@ -7,59 +8,88 @@ import path from 'path';
7
8
  * Simple file-based rate limiter for auth operations.
8
9
  * Tracks failed attempts and enforces a cooldown period after too many failures.
9
10
  * State is persisted in a temp file so it survives across CLI invocations.
11
+ *
12
+ * State is keyed per (baseUrl, identifier) so a failed login for one account does
13
+ * NOT lock out another account on a shared workstation / CI host. Calls without an
14
+ * identifier fall back to a shared `_default` bucket (coarse anti-bruteforce).
10
15
  */
11
16
  const STATE_FILE = path.join(os.tmpdir(), '.pipeline-manager-auth-state.json');
12
17
  const MAX_FAILURES = 5;
13
18
  const COOLDOWN_MS = 60_000; // 1 minute
14
- function readState() {
19
+ const PRUNE_MS = 60 * 60_000; // drop buckets idle for >1h to bound file growth
20
+ const EMPTY = { failures: 0, lastFailure: 0, lockedUntil: 0 };
21
+ /** Stable, non-reversible bucket key for a (baseUrl, identifier) pair. */
22
+ function keyFor(identifier, baseUrl) {
23
+ if (!identifier)
24
+ return '_default';
25
+ return crypto.createHash('sha256').update(`${baseUrl ?? ''}\n${identifier}`).digest('hex').slice(0, 16);
26
+ }
27
+ function readMap() {
15
28
  try {
16
29
  if (fs.existsSync(STATE_FILE)) {
17
- return JSON.parse(fs.readFileSync(STATE_FILE, 'utf-8'));
30
+ const parsed = JSON.parse(fs.readFileSync(STATE_FILE, 'utf-8'));
31
+ if (parsed && typeof parsed === 'object')
32
+ return parsed;
18
33
  }
19
34
  }
20
35
  catch { /* ignore corrupt state */ }
21
- return { failures: 0, lastFailure: 0, lockedUntil: 0 };
36
+ return {};
22
37
  }
23
- function writeState(state) {
38
+ function writeMap(map) {
39
+ const now = Date.now();
40
+ // Prune idle buckets so the file doesn't grow unbounded across many identifiers.
41
+ for (const [k, s] of Object.entries(map)) {
42
+ if (s.lockedUntil <= now && now - s.lastFailure > PRUNE_MS)
43
+ delete map[k];
44
+ }
24
45
  try {
25
- fs.writeFileSync(STATE_FILE, JSON.stringify(state), { mode: 0o600 });
46
+ fs.writeFileSync(STATE_FILE, JSON.stringify(map), { mode: 0o600 });
26
47
  }
27
48
  catch { /* best-effort */ }
28
49
  }
29
50
  /**
30
- * Check if auth attempts are currently rate-limited.
51
+ * Check if auth attempts for this identifier are currently rate-limited.
31
52
  * @returns null if allowed, or a message string if blocked.
32
53
  */
33
- export function checkAuthRateLimit() {
34
- const state = readState();
54
+ export function checkAuthRateLimit(identifier, baseUrl) {
55
+ const key = keyFor(identifier, baseUrl);
56
+ const map = readMap();
57
+ const state = map[key] ?? EMPTY;
35
58
  const now = Date.now();
36
59
  if (state.lockedUntil > now) {
37
60
  const waitSec = Math.ceil((state.lockedUntil - now) / 1000);
38
61
  return `Too many failed login attempts. Try again in ${waitSec}s.`;
39
62
  }
40
- // Reset if cooldown has passed
41
- if (now - state.lastFailure > COOLDOWN_MS) {
42
- writeState({ failures: 0, lastFailure: 0, lockedUntil: 0 });
63
+ // Reset this bucket once the cooldown window has passed.
64
+ if (state.lastFailure !== 0 && now - state.lastFailure > COOLDOWN_MS) {
65
+ delete map[key];
66
+ writeMap(map);
43
67
  }
44
68
  return null;
45
69
  }
46
70
  /**
47
- * Record a successful auth — resets the failure counter.
71
+ * Record a successful auth for this identifier clears its failure counter.
48
72
  */
49
- export function recordAuthSuccess() {
50
- writeState({ failures: 0, lastFailure: 0, lockedUntil: 0 });
73
+ export function recordAuthSuccess(identifier, baseUrl) {
74
+ const map = readMap();
75
+ delete map[keyFor(identifier, baseUrl)];
76
+ writeMap(map);
51
77
  }
52
78
  /**
53
- * Record a failed auth attempt. After MAX_FAILURES, locks out for COOLDOWN_MS.
79
+ * Record a failed auth attempt for this identifier. After MAX_FAILURES, locks out
80
+ * that identifier for COOLDOWN_MS.
54
81
  */
55
- export function recordAuthFailure() {
56
- const state = readState();
82
+ export function recordAuthFailure(identifier, baseUrl) {
83
+ const key = keyFor(identifier, baseUrl);
84
+ const map = readMap();
57
85
  const now = Date.now();
86
+ const state = { ...(map[key] ?? EMPTY) };
58
87
  state.failures += 1;
59
88
  state.lastFailure = now;
60
89
  if (state.failures >= MAX_FAILURES) {
61
90
  state.lockedUntil = now + COOLDOWN_MS;
62
91
  }
63
- writeState(state);
92
+ map[key] = state;
93
+ writeMap(map);
64
94
  }
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZS1saW1pdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3JhdGUtbGltaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRXhCOzs7O0dBSUc7QUFFSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO0FBQy9FLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxXQUFXO0FBUXZDLFNBQVMsU0FBUztJQUNoQixJQUFJLENBQUM7UUFDSCxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQWMsQ0FBQztRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUFDLE1BQU0sQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDekQsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQWdCO0lBQ2xDLElBQUksQ0FBQztRQUNILEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQUMsTUFBTSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQjtJQUNoQyxNQUFNLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFdkIsSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzVELE9BQU8sZ0RBQWdELE9BQU8sSUFBSSxDQUFDO0lBQ3JFLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFdBQVcsR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixNQUFNLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkIsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7SUFDcEIsS0FBSyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7SUFFeEIsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25DLEtBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQztJQUN4QyxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBTaW1wbGUgZmlsZS1iYXNlZCByYXRlIGxpbWl0ZXIgZm9yIGF1dGggb3BlcmF0aW9ucy5cbiAqIFRyYWNrcyBmYWlsZWQgYXR0ZW1wdHMgYW5kIGVuZm9yY2VzIGEgY29vbGRvd24gcGVyaW9kIGFmdGVyIHRvbyBtYW55IGZhaWx1cmVzLlxuICogU3RhdGUgaXMgcGVyc2lzdGVkIGluIGEgdGVtcCBmaWxlIHNvIGl0IHN1cnZpdmVzIGFjcm9zcyBDTEkgaW52b2NhdGlvbnMuXG4gKi9cblxuY29uc3QgU1RBVEVfRklMRSA9IHBhdGguam9pbihvcy50bXBkaXIoKSwgJy5waXBlbGluZS1tYW5hZ2VyLWF1dGgtc3RhdGUuanNvbicpO1xuY29uc3QgTUFYX0ZBSUxVUkVTID0gNTtcbmNvbnN0IENPT0xET1dOX01TID0gNjBfMDAwOyAvLyAxIG1pbnV0ZVxuXG5pbnRlcmZhY2UgQXV0aFN0YXRlIHtcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgbGFzdEZhaWx1cmU6IG51bWJlcjtcbiAgbG9ja2VkVW50aWw6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gcmVhZFN0YXRlKCk6IEF1dGhTdGF0ZSB7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoU1RBVEVfRklMRSkpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhTVEFURV9GSUxFLCAndXRmLTgnKSkgYXMgQXV0aFN0YXRlO1xuICAgIH1cbiAgfSBjYXRjaCB7IC8qIGlnbm9yZSBjb3JydXB0IHN0YXRlICovIH1cbiAgcmV0dXJuIHsgZmFpbHVyZXM6IDAsIGxhc3RGYWlsdXJlOiAwLCBsb2NrZWRVbnRpbDogMCB9O1xufVxuXG5mdW5jdGlvbiB3cml0ZVN0YXRlKHN0YXRlOiBBdXRoU3RhdGUpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFNUQVRFX0ZJTEUsIEpTT04uc3RyaW5naWZ5KHN0YXRlKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgfSBjYXRjaCB7IC8qIGJlc3QtZWZmb3J0ICovIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhdXRoIGF0dGVtcHRzIGFyZSBjdXJyZW50bHkgcmF0ZS1saW1pdGVkLlxuICogQHJldHVybnMgbnVsbCBpZiBhbGxvd2VkLCBvciBhIG1lc3NhZ2Ugc3RyaW5nIGlmIGJsb2NrZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0F1dGhSYXRlTGltaXQoKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHN0YXRlID0gcmVhZFN0YXRlKCk7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgaWYgKHN0YXRlLmxvY2tlZFVudGlsID4gbm93KSB7XG4gICAgY29uc3Qgd2FpdFNlYyA9IE1hdGguY2VpbCgoc3RhdGUubG9ja2VkVW50aWwgLSBub3cpIC8gMTAwMCk7XG4gICAgcmV0dXJuIGBUb28gbWFueSBmYWlsZWQgbG9naW4gYXR0ZW1wdHMuIFRyeSBhZ2FpbiBpbiAke3dhaXRTZWN9cy5gO1xuICB9XG5cbiAgLy8gUmVzZXQgaWYgY29vbGRvd24gaGFzIHBhc3NlZFxuICBpZiAobm93IC0gc3RhdGUubGFzdEZhaWx1cmUgPiBDT09MRE9XTl9NUykge1xuICAgIHdyaXRlU3RhdGUoeyBmYWlsdXJlczogMCwgbGFzdEZhaWx1cmU6IDAsIGxvY2tlZFVudGlsOiAwIH0pO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVjb3JkIGEgc3VjY2Vzc2Z1bCBhdXRoIOKAlCByZXNldHMgdGhlIGZhaWx1cmUgY291bnRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEF1dGhTdWNjZXNzKCk6IHZvaWQge1xuICB3cml0ZVN0YXRlKHsgZmFpbHVyZXM6IDAsIGxhc3RGYWlsdXJlOiAwLCBsb2NrZWRVbnRpbDogMCB9KTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgYSBmYWlsZWQgYXV0aCBhdHRlbXB0LiBBZnRlciBNQVhfRkFJTFVSRVMsIGxvY2tzIG91dCBmb3IgQ09PTERPV05fTVMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBdXRoRmFpbHVyZSgpOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSByZWFkU3RhdGUoKTtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgc3RhdGUuZmFpbHVyZXMgKz0gMTtcbiAgc3RhdGUubGFzdEZhaWx1cmUgPSBub3c7XG5cbiAgaWYgKHN0YXRlLmZhaWx1cmVzID49IE1BWF9GQUlMVVJFUykge1xuICAgIHN0YXRlLmxvY2tlZFVudGlsID0gbm93ICsgQ09PTERPV05fTVM7XG4gIH1cblxuICB3cml0ZVN0YXRlKHN0YXRlKTtcbn1cbiJdfQ==
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZS1saW1pdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3JhdGUtbGltaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUV4Qjs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLG1DQUFtQyxDQUFDLENBQUM7QUFDL0UsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLFdBQVc7QUFDdkMsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLGlEQUFpRDtBQVUvRSxNQUFNLEtBQUssR0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFFekUsMEVBQTBFO0FBQzFFLFNBQVMsTUFBTSxDQUFDLFVBQW1CLEVBQUUsT0FBZ0I7SUFDbkQsSUFBSSxDQUFDLFVBQVU7UUFBRSxPQUFPLFVBQVUsQ0FBQztJQUNuQyxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxJQUFJLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFFRCxTQUFTLE9BQU87SUFDZCxJQUFJLENBQUM7UUFDSCxJQUFJLEVBQUUsQ0FB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RSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7SUFDekMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7SUFDcEIsS0FBSyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7SUFDeEIsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25DLEtBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNqQixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG4vKipcbiAqIFNpbXBsZSBmaWxlLWJhc2VkIHJhdGUgbGltaXRlciBmb3IgYXV0aCBvcGVyYXRpb25zLlxuICogVHJhY2tzIGZhaWxlZCBhdHRlbXB0cyBhbmQgZW5mb3JjZXMgYSBjb29sZG93biBwZXJpb2QgYWZ0ZXIgdG9vIG1hbnkgZmFpbHVyZXMuXG4gKiBTdGF0ZSBpcyBwZXJzaXN0ZWQgaW4gYSB0ZW1wIGZpbGUgc28gaXQgc3Vydml2ZXMgYWNyb3NzIENMSSBpbnZvY2F0aW9ucy5cbiAqXG4gKiBTdGF0ZSBpcyBrZXllZCBwZXIgKGJhc2VVcmwsIGlkZW50aWZpZXIpIHNvIGEgZmFpbGVkIGxvZ2luIGZvciBvbmUgYWNjb3VudCBkb2VzXG4gKiBOT1QgbG9jayBvdXQgYW5vdGhlciBhY2NvdW50IG9uIGEgc2hhcmVkIHdvcmtzdGF0aW9uIC8gQ0kgaG9zdC4gQ2FsbHMgd2l0aG91dCBhblxuICogaWRlbnRpZmllciBmYWxsIGJhY2sgdG8gYSBzaGFyZWQgYF9kZWZhdWx0YCBidWNrZXQgKGNvYXJzZSBhbnRpLWJydXRlZm9yY2UpLlxuICovXG5cbmNvbnN0IFNUQVRFX0ZJTEUgPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksICcucGlwZWxpbmUtbWFuYWdlci1hdXRoLXN0YXRlLmpzb24nKTtcbmNvbnN0IE1BWF9GQUlMVVJFUyA9IDU7XG5jb25zdCBDT09MRE9XTl9NUyA9IDYwXzAwMDsgLy8gMSBtaW51dGVcbmNvbnN0IFBSVU5FX01TID0gNjAgKiA2MF8wMDA7IC8vIGRyb3AgYnVja2V0cyBpZGxlIGZvciA+MWggdG8gYm91bmQgZmlsZSBncm93dGhcblxuaW50ZXJmYWNlIEF1dGhTdGF0ZSB7XG4gIGZhaWx1cmVzOiBudW1iZXI7XG4gIGxhc3RGYWlsdXJlOiBudW1iZXI7XG4gIGxvY2tlZFVudGlsOiBudW1iZXI7XG59XG5cbnR5cGUgU3RhdGVNYXAgPSBSZWNvcmQ8c3RyaW5nLCBBdXRoU3RhdGU+O1xuXG5jb25zdCBFTVBUWTogQXV0aFN0YXRlID0geyBmYWlsdXJlczogMCwgbGFzdEZhaWx1cmU6IDAsIGxvY2tlZFVudGlsOiAwIH07XG5cbi8qKiBTdGFibGUsIG5vbi1yZXZlcnNpYmxlIGJ1Y2tldCBrZXkgZm9yIGEgKGJhc2VVcmwsIGlkZW50aWZpZXIpIHBhaXIuICovXG5mdW5jdGlvbiBrZXlGb3IoaWRlbnRpZmllcj86IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaWRlbnRpZmllcikgcmV0dXJuICdfZGVmYXVsdCc7XG4gIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGAke2Jhc2VVcmwgPz8gJyd9XFxuJHtpZGVudGlmaWVyfWApLmRpZ2VzdCgnaGV4Jykuc2xpY2UoMCwgMTYpO1xufVxuXG5mdW5jdGlvbiByZWFkTWFwKCk6IFN0YXRlTWFwIHtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhTVEFURV9GSUxFKSkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoU1RBVEVfRklMRSwgJ3V0Zi04JykpIGFzIHVua25vd247XG4gICAgICBpZiAocGFyc2VkICYmIHR5cGVvZiBwYXJzZWQgPT09ICdvYmplY3QnKSByZXR1cm4gcGFyc2VkIGFzIFN0YXRlTWFwO1xuICAgIH1cbiAgfSBjYXRjaCB7IC8qIGlnbm9yZSBjb3JydXB0IHN0YXRlICovIH1cbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiB3cml0ZU1hcChtYXA6IFN0YXRlTWFwKTogdm9pZCB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIC8vIFBydW5lIGlkbGUgYnVja2V0cyBzbyB0aGUgZmlsZSBkb2Vzbid0IGdyb3cgdW5ib3VuZGVkIGFjcm9zcyBtYW55IGlkZW50aWZpZXJzLlxuICBmb3IgKGNvbnN0IFtrLCBzXSBvZiBPYmplY3QuZW50cmllcyhtYXApKSB7XG4gICAgaWYgKHMubG9ja2VkVW50aWwgPD0gbm93ICYmIG5vdyAtIHMubGFzdEZhaWx1cmUgPiBQUlVORV9NUykgZGVsZXRlIG1hcFtrXTtcbiAgfVxuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkobWFwKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgfSBjYXRjaCB7IC8qIGJlc3QtZWZmb3J0ICovIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhdXRoIGF0dGVtcHRzIGZvciB0aGlzIGlkZW50aWZpZXIgYXJlIGN1cnJlbnRseSByYXRlLWxpbWl0ZWQuXG4gKiBAcmV0dXJucyBudWxsIGlmIGFsbG93ZWQsIG9yIGEgbWVzc2FnZSBzdHJpbmcgaWYgYmxvY2tlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQXV0aFJhdGVMaW1pdChpZGVudGlmaWVyPzogc3RyaW5nLCBiYXNlVXJsPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGtleSA9IGtleUZvcihpZGVudGlmaWVyLCBiYXNlVXJsKTtcbiAgY29uc3QgbWFwID0gcmVhZE1hcCgpO1xuICBjb25zdCBzdGF0ZSA9IG1hcFtrZXldID8/IEVNUFRZO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gIGlmIChzdGF0ZS5sb2NrZWRVbnRpbCA+IG5vdykge1xuICAgIGNvbnN0IHdhaXRTZWMgPSBNYXRoLmNlaWwoKHN0YXRlLmxvY2tlZFVudGlsIC0gbm93KSAvIDEwMDApO1xuICAgIHJldHVybiBgVG9vIG1hbnkgZmFpbGVkIGxvZ2luIGF0dGVtcHRzLiBUcnkgYWdhaW4gaW4gJHt3YWl0U2VjfXMuYDtcbiAgfVxuXG4gIC8vIFJlc2V0IHRoaXMgYnVja2V0IG9uY2UgdGhlIGNvb2xkb3duIHdpbmRvdyBoYXMgcGFzc2VkLlxuICBpZiAoc3RhdGUubGFzdEZhaWx1cmUgIT09IDAgJiYgbm93IC0gc3RhdGUubGFzdEZhaWx1cmUgPiBDT09MRE9XTl9NUykge1xuICAgIGRlbGV0ZSBtYXBba2V5XTtcbiAgICB3cml0ZU1hcChtYXApO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVjb3JkIGEgc3VjY2Vzc2Z1bCBhdXRoIGZvciB0aGlzIGlkZW50aWZpZXIg4oCUIGNsZWFycyBpdHMgZmFpbHVyZSBjb3VudGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQXV0aFN1Y2Nlc3MoaWRlbnRpZmllcj86IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBtYXAgPSByZWFkTWFwKCk7XG4gIGRlbGV0ZSBtYXBba2V5Rm9yKGlkZW50aWZpZXIsIGJhc2VVcmwpXTtcbiAgd3JpdGVNYXAobWFwKTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgYSBmYWlsZWQgYXV0aCBhdHRlbXB0IGZvciB0aGlzIGlkZW50aWZpZXIuIEFmdGVyIE1BWF9GQUlMVVJFUywgbG9ja3Mgb3V0XG4gKiB0aGF0IGlkZW50aWZpZXIgZm9yIENPT0xET1dOX01TLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQXV0aEZhaWx1cmUoaWRlbnRpZmllcj86IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBrZXkgPSBrZXlGb3IoaWRlbnRpZmllciwgYmFzZVVybCk7XG4gIGNvbnN0IG1hcCA9IHJlYWRNYXAoKTtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgc3RhdGUgPSB7IC4uLihtYXBba2V5XSA/PyBFTVBUWSkgfTtcbiAgc3RhdGUuZmFpbHVyZXMgKz0gMTtcbiAgc3RhdGUubGFzdEZhaWx1cmUgPSBub3c7XG4gIGlmIChzdGF0ZS5mYWlsdXJlcyA+PSBNQVhfRkFJTFVSRVMpIHtcbiAgICBzdGF0ZS5sb2NrZWRVbnRpbCA9IG5vdyArIENPT0xET1dOX01TO1xuICB9XG4gIG1hcFtrZXldID0gc3RhdGU7XG4gIHdyaXRlTWFwKG1hcCk7XG59XG4iXX0=
@@ -0,0 +1,16 @@
1
+ import https from 'https';
2
+ /**
3
+ * Hosts that legitimately front a self-signed certificate — local dev stacks and
4
+ * kubectl port-forwards. Everything else (a real deploy domain) is expected to
5
+ * present a valid (ACM) certificate and MUST be verified, so a post-deploy probe
6
+ * can't be silently MITM'd.
7
+ */
8
+ export declare function isLocalHttpsHost(url: string): boolean;
9
+ /**
10
+ * Return an https.Agent that skips certificate verification ONLY for local /
11
+ * self-signed hosts; returns `undefined` (Node's default verification) for real
12
+ * domains. Pass the result straight to axios' `httpsAgent` — `undefined` keeps the
13
+ * default secure behavior.
14
+ */
15
+ export declare function httpsAgentForUrl(url: string): https.Agent | undefined;
16
+ //# sourceMappingURL=tls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tls.d.ts","sourceRoot":"","sources":["../../src/utils/tls.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBrD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,SAAS,CAErE"}
@@ -0,0 +1,35 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import https from 'https';
4
+ /**
5
+ * Hosts that legitimately front a self-signed certificate — local dev stacks and
6
+ * kubectl port-forwards. Everything else (a real deploy domain) is expected to
7
+ * present a valid (ACM) certificate and MUST be verified, so a post-deploy probe
8
+ * can't be silently MITM'd.
9
+ */
10
+ export function isLocalHttpsHost(url) {
11
+ let hostname;
12
+ try {
13
+ hostname = new URL(url).hostname;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ return (hostname === 'localhost' ||
19
+ hostname === '127.0.0.1' ||
20
+ hostname === '::1' ||
21
+ hostname.endsWith('.local') ||
22
+ /^10\./.test(hostname) ||
23
+ /^192\.168\./.test(hostname) ||
24
+ /^172\.(1[6-9]|2\d|3[01])\./.test(hostname));
25
+ }
26
+ /**
27
+ * Return an https.Agent that skips certificate verification ONLY for local /
28
+ * self-signed hosts; returns `undefined` (Node's default verification) for real
29
+ * domains. Pass the result straight to axios' `httpsAgent` — `undefined` keeps the
30
+ * default secure behavior.
31
+ */
32
+ export function httpsAgentForUrl(url) {
33
+ return isLocalHttpsHost(url) ? new https.Agent({ rejectUnauthorized: false }) : undefined;
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3Rscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFXO0lBQzFDLElBQUksUUFBZ0IsQ0FBQztJQUNyQixJQUFJLENBQUM7UUFDSCxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLENBQ0wsUUFBUSxLQUFLLFdBQVc7UUFDeEIsUUFBUSxLQUFLLFdBQVc7UUFDeEIsUUFBUSxLQUFLLEtBQUs7UUFDbEIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdEIsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDNUIsNEJBQTRCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUM1QyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQVc7SUFDMUMsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzVGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IGh0dHBzIGZyb20gJ2h0dHBzJztcblxuLyoqXG4gKiBIb3N0cyB0aGF0IGxlZ2l0aW1hdGVseSBmcm9udCBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIOKAlCBsb2NhbCBkZXYgc3RhY2tzIGFuZFxuICoga3ViZWN0bCBwb3J0LWZvcndhcmRzLiBFdmVyeXRoaW5nIGVsc2UgKGEgcmVhbCBkZXBsb3kgZG9tYWluKSBpcyBleHBlY3RlZCB0b1xuICogcHJlc2VudCBhIHZhbGlkIChBQ00pIGNlcnRpZmljYXRlIGFuZCBNVVNUIGJlIHZlcmlmaWVkLCBzbyBhIHBvc3QtZGVwbG95IHByb2JlXG4gKiBjYW4ndCBiZSBzaWxlbnRseSBNSVRNJ2QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xvY2FsSHR0cHNIb3N0KHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBob3N0bmFtZTogc3RyaW5nO1xuICB0cnkge1xuICAgIGhvc3RuYW1lID0gbmV3IFVSTCh1cmwpLmhvc3RuYW1lO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBob3N0bmFtZSA9PT0gJ2xvY2FsaG9zdCcgfHxcbiAgICBob3N0bmFtZSA9PT0gJzEyNy4wLjAuMScgfHxcbiAgICBob3N0bmFtZSA9PT0gJzo6MScgfHxcbiAgICBob3N0bmFtZS5lbmRzV2l0aCgnLmxvY2FsJykgfHxcbiAgICAvXjEwXFwuLy50ZXN0KGhvc3RuYW1lKSB8fFxuICAgIC9eMTkyXFwuMTY4XFwuLy50ZXN0KGhvc3RuYW1lKSB8fFxuICAgIC9eMTcyXFwuKDFbNi05XXwyXFxkfDNbMDFdKVxcLi8udGVzdChob3N0bmFtZSlcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gaHR0cHMuQWdlbnQgdGhhdCBza2lwcyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gT05MWSBmb3IgbG9jYWwgL1xuICogc2VsZi1zaWduZWQgaG9zdHM7IHJldHVybnMgYHVuZGVmaW5lZGAgKE5vZGUncyBkZWZhdWx0IHZlcmlmaWNhdGlvbikgZm9yIHJlYWxcbiAqIGRvbWFpbnMuIFBhc3MgdGhlIHJlc3VsdCBzdHJhaWdodCB0byBheGlvcycgYGh0dHBzQWdlbnRgIOKAlCBgdW5kZWZpbmVkYCBrZWVwcyB0aGVcbiAqIGRlZmF1bHQgc2VjdXJlIGJlaGF2aW9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHR0cHNBZ2VudEZvclVybCh1cmw6IHN0cmluZyk6IGh0dHBzLkFnZW50IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGlzTG9jYWxIdHRwc0hvc3QodXJsKSA/IG5ldyBodHRwcy5BZ2VudCh7IHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UgfSkgOiB1bmRlZmluZWQ7XG59XG4iXX0=
package/package.json CHANGED
@@ -41,8 +41,8 @@
41
41
  "typescript": "6.0.3",
42
42
  "yaml": "2.9.0",
43
43
  "zod": "4.4.3",
44
- "@pipeline-builder/ai-core": "3.4.80",
45
- "@pipeline-builder/pipeline-core": "3.4.94"
44
+ "@pipeline-builder/pipeline-core": "3.4.94",
45
+ "@pipeline-builder/ai-core": "3.4.80"
46
46
  },
47
47
  "keywords": [
48
48
  "ci-cd",
@@ -97,7 +97,7 @@
97
97
  "access": "public",
98
98
  "registry": "https://registry.npmjs.org/"
99
99
  },
100
- "version": "3.4.125",
100
+ "version": "3.4.127",
101
101
  "bugs": {
102
102
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
103
103
  },