@pipeline-builder/pipeline-manager 4.4.6 → 4.4.7

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 (64) hide show
  1. package/dist/agent/ai.d.ts +11 -0
  2. package/dist/agent/ai.d.ts.map +1 -1
  3. package/dist/agent/ai.js +47 -4
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +9 -2
  6. package/dist/commands/create-pat.d.ts.map +1 -1
  7. package/dist/commands/create-pat.js +3 -1
  8. package/dist/commands/create-pipeline.d.ts.map +1 -1
  9. package/dist/commands/create-pipeline.js +11 -2
  10. package/dist/commands/deploy.d.ts.map +1 -1
  11. package/dist/commands/deploy.js +20 -2
  12. package/dist/commands/report.js +4 -4
  13. package/dist/commands/security-report.d.ts +42 -0
  14. package/dist/commands/security-report.d.ts.map +1 -0
  15. package/dist/commands/security-report.js +89 -0
  16. package/dist/commands/setup-events.d.ts.map +1 -1
  17. package/dist/commands/setup-events.js +14 -1
  18. package/dist/commands/store-token.d.ts +1 -0
  19. package/dist/commands/store-token.d.ts.map +1 -1
  20. package/dist/commands/store-token.js +45 -19
  21. package/dist/commands/synth.d.ts +7 -1
  22. package/dist/commands/synth.d.ts.map +1 -1
  23. package/dist/commands/synth.js +66 -4
  24. package/dist/commands/verify-plugins.d.ts +45 -0
  25. package/dist/commands/verify-plugins.d.ts.map +1 -0
  26. package/dist/commands/verify-plugins.js +134 -0
  27. package/dist/lambda/token-renew-handler.d.ts +3 -1
  28. package/dist/lambda/token-renew-handler.d.ts.map +1 -1
  29. package/dist/lambda/token-renew-handler.js +31 -5
  30. package/dist/templates/events-stack.json +10 -0
  31. package/dist/utils/api-client.d.ts.map +1 -1
  32. package/dist/utils/api-client.js +20 -3
  33. package/dist/utils/auth-utils.d.ts.map +1 -1
  34. package/dist/utils/auth-utils.js +3 -1
  35. package/dist/utils/cdk-utils.js +2 -2
  36. package/dist/utils/command-utils.d.ts.map +1 -1
  37. package/dist/utils/command-utils.js +5 -2
  38. package/dist/utils/config-loader.d.ts.map +1 -1
  39. package/dist/utils/config-loader.js +9 -4
  40. package/dist/utils/deploy-runner.d.ts +25 -0
  41. package/dist/utils/deploy-runner.d.ts.map +1 -1
  42. package/dist/utils/deploy-runner.js +34 -5
  43. package/dist/utils/device-auth.d.ts.map +1 -1
  44. package/dist/utils/device-auth.js +4 -3
  45. package/dist/utils/error-handler.d.ts.map +1 -1
  46. package/dist/utils/error-handler.js +8 -1
  47. package/dist/utils/pipeline-config.d.ts +3 -0
  48. package/dist/utils/pipeline-config.d.ts.map +1 -1
  49. package/dist/utils/pipeline-config.js +4 -3
  50. package/dist/utils/platform-secret.d.ts.map +1 -1
  51. package/dist/utils/platform-secret.js +3 -1
  52. package/dist/utils/plugin-resolver.d.ts +41 -3
  53. package/dist/utils/plugin-resolver.d.ts.map +1 -1
  54. package/dist/utils/plugin-resolver.js +125 -21
  55. package/dist/utils/registration-client.d.ts +28 -0
  56. package/dist/utils/registration-client.d.ts.map +1 -0
  57. package/dist/utils/registration-client.js +57 -0
  58. package/dist/utils/request-context.d.ts +11 -0
  59. package/dist/utils/request-context.d.ts.map +1 -0
  60. package/dist/utils/request-context.js +62 -0
  61. package/dist/utils/service-account.d.ts +6 -4
  62. package/dist/utils/service-account.d.ts.map +1 -1
  63. package/dist/utils/service-account.js +14 -9
  64. package/package.json +3 -2
@@ -1,7 +1,8 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { ErrorCode, errorMessage } from '@pipeline-builder/api-core';
4
- import { pluginArtifactAlias, pluginLookupFilter, unwrapLookup } from '@pipeline-builder/pipeline-core';
4
+ import { collectPluginSteps, exactPinNotFoundMessage, lookupNotFoundState, pluginArtifactAlias, pluginLookupFilter, summarizeLookupWarnings, unwrapLookup, } from '@pipeline-builder/pipeline-core';
5
+ import pico from 'picocolors';
5
6
  import { ApiClient } from './api-client.js';
6
7
  import { printWarning } from './output-utils.js';
7
8
  /**
@@ -61,17 +62,20 @@ function collectPluginRefs(props) {
61
62
  /**
62
63
  * Lookup refusals that must STOP the synth rather than fall back to
63
64
  * deploy-time resolution: an image whose signature doesn't verify, a listing
64
- * the org can't use (not installed, blocked by its policy, yanked or
65
- * suspended), and — with `PLUGIN_BLOCK_ON_NEW_CRITICAL` on — a pin to a
66
- * version the nightly rescan flagged. Falling back would quietly turn each into
67
- * an unresolved step that fails at run time instead of now.
65
+ * the org can't use (not installed, blocked by its allow/deny policy, yanked
66
+ * or suspended), and an org plugin that was deleted. Falling back would
67
+ * quietly turn each into an unresolved step that fails at run time instead of
68
+ * now. Vulnerability state is NEVER one of these: it arrives as graded
69
+ * warnings beside a resolved plugin.
68
70
  */
69
71
  const FATAL_LOOKUP_CODES = [
70
72
  ErrorCode.IMAGE_VERIFICATION_FAILED,
71
73
  ErrorCode.PLUGIN_NOT_INSTALLED,
72
74
  ErrorCode.PLUGIN_BLOCKED_BY_POLICY,
73
75
  ErrorCode.PLUGIN_UNAVAILABLE,
74
- ErrorCode.PLUGIN_VERSION_VULN_BLOCKED,
76
+ // The org's own plugin was deleted: the lookup refuses it rather than fall
77
+ // through to a same-name listing. (Plugin service code; matched as a string.)
78
+ 'PLUGIN_DELETED',
75
79
  ];
76
80
  /** The error code of a plugin service answer, when it is one of {@link FATAL_LOOKUP_CODES}. */
77
81
  function fatalLookupCode(err) {
@@ -79,6 +83,68 @@ function fatalLookupCode(err) {
79
83
  const code = data && typeof data === 'object' ? data.code : undefined;
80
84
  return typeof code === 'string' && FATAL_LOOKUP_CODES.includes(code) ? code : null;
81
85
  }
86
+ /** Whether the plugin service answered "no such plugin/version" (404 NOT_FOUND). */
87
+ function isNotFound(err) {
88
+ const response = err?.response;
89
+ const code = response?.data && typeof response.data === 'object' ? response.data.code : undefined;
90
+ return response?.status === 404 || code === ErrorCode.NOT_FOUND;
91
+ }
92
+ /**
93
+ * The version a reference PINS — one exact `x.y.z[-pre]`, not a range or
94
+ * `latest`. A pin names a version that must exist: if it doesn't (never
95
+ * published, or refused by the build's vulnerability gate, which saves
96
+ * nothing), there is no outage to ride out and nothing for the deploy-time
97
+ * lookup to find either.
98
+ */
99
+ function exactVersionPin(ref) {
100
+ const version = ref.filter?.version;
101
+ return typeof version === 'string' && /^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(version) ? version : null;
102
+ }
103
+ /**
104
+ * Every fatal refusal of one pre-resolution pass. Carries the structured list
105
+ * as well as the human message, so the synth can emit a machine-readable
106
+ * failure line (`PB_SYNTH_FAILURE`) the execution events pick up.
107
+ */
108
+ export class PluginResolutionError extends Error {
109
+ refusals;
110
+ constructor(refusals) {
111
+ super(refusals.length === 1
112
+ ? refusals[0].message
113
+ : `${refusals.length} plugins can't be used:\n${refusals.map((r) => ` - ${r.message}`).join('\n')}`);
114
+ this.refusals = refusals;
115
+ this.name = 'PluginResolutionError';
116
+ }
117
+ }
118
+ /**
119
+ * Why an exact pin was not found, phrased from the 404's `details.state`
120
+ * (`deleted` / `inactive` / `yanked` / `missing`). Without a state the answer
121
+ * cannot tell the cases apart, so the message names the two likeliest.
122
+ * Shared with the deploy-time Lambda's CloudFormation reason (pipeline-core).
123
+ */
124
+ function pinNotFoundMessage(label, pin, err) {
125
+ return exactPinNotFoundMessage(label, pin, lookupNotFoundState(err));
126
+ }
127
+ const SEVERITY_STYLE = {
128
+ info: pico.cyan,
129
+ warning: pico.yellow,
130
+ error: pico.red,
131
+ critical: (t) => pico.bold(pico.red(t)),
132
+ };
133
+ /** Print one lookup warning, prefixed and coloured by its severity. */
134
+ export function printLookupWarning(label, warning) {
135
+ const tag = SEVERITY_STYLE[warning.severity](`[${warning.severity.toUpperCase()}]`);
136
+ printWarning(`${tag} Plugin "${label}": ${warning.message}`);
137
+ }
138
+ /** Print the one-line severity summary of a synth's lookup warnings (nothing when none). */
139
+ export function printLookupWarningSummary(warnings) {
140
+ const line = summarizeLookupWarnings(warnings);
141
+ if (!line)
142
+ return;
143
+ const worst = warnings.some((w) => w.severity === 'critical') ? 'critical'
144
+ : warnings.some((w) => w.severity === 'error') ? 'error'
145
+ : warnings.some((w) => w.severity === 'warning') ? 'warning' : 'info';
146
+ printWarning(SEVERITY_STYLE[worst](line));
147
+ }
82
148
  /** The plugin service's own refusal message, when the answer carries one. */
83
149
  function serviceMessage(err) {
84
150
  const data = err?.response?.data;
@@ -95,16 +161,40 @@ function serviceMessage(err) {
95
161
  *
96
162
  * Failures are non-fatal: a missing plugin or unreachable API logs a warning
97
163
  * and falls through to the deploy-time custom resource path so partial
98
- * platform outages don't block synth/deploy. The exception is an image that
99
- * fails signature verification — that aborts the synth.
164
+ * platform outages don't block synth/deploy. The exceptions abort the synth:
165
+ * the {@link FATAL_LOOKUP_CODES} refusals, and an exact version pin that does
166
+ * not exist.
167
+ *
168
+ * Every reference is looked up before anything is thrown, and ALL fatal
169
+ * refusals are reported together. Stopping at the first meant a pipeline with
170
+ * three refused plugins took three synth attempts to learn about all three.
171
+ *
172
+ * Every lookup warning is printed, graded by severity, and appended to
173
+ * `warningSink` when given (the synth prints a one-line summary at its end).
174
+ * A warning never fails the synth — vulnerability state is reported, not
175
+ * enforced.
176
+ *
177
+ * When the props carry a `pipelineId`, each lookup also sends
178
+ * `context: { pipelineId, stepKeys }` — the label (`pluginStepLabel`: `synth` or
179
+ * `<stage>/<alias ?? name>`) of EVERY step the de-duplicated reference serves —
180
+ * so the plugin service can record the warnings it returns against each of
181
+ * those pipeline steps, not only print them into this synth's log.
100
182
  *
101
183
  * Keyed by `alias || name` to match `PluginLookup.plugin()`.
102
184
  */
103
- export async function resolvePluginsForProps(client, props) {
185
+ export async function resolvePluginsForProps(client, props, warningSink) {
104
186
  const refs = collectPluginRefs(props);
105
187
  if (refs.length === 0)
106
188
  return {};
189
+ const pipelineId = typeof props.pipelineId === 'string' && props.pipelineId.length > 0 ? props.pipelineId : undefined;
190
+ // One lookup per alias may serve several steps: the labels of each, by alias.
191
+ const stepKeys = new Map();
192
+ for (const step of collectPluginSteps(props)) {
193
+ const key = cacheKey(step);
194
+ stepKeys.set(key, [...(stepKeys.get(key) ?? []), step.label]);
195
+ }
107
196
  const resolved = {};
197
+ const fatal = [];
108
198
  await Promise.all(refs.map(async (ref) => {
109
199
  const key = cacheKey(ref);
110
200
  const label = ref.publisher ? `${ref.publisher}/${ref.name}` : ref.name;
@@ -117,15 +207,24 @@ export async function resolvePluginsForProps(client, props) {
117
207
  // the ref's plugin name; an explicit filter `name` still takes precedence.
118
208
  // Shared with the pipeline service's contract check (same filter, same plugin).
119
209
  const filter = pluginLookupFilter(ref);
210
+ const pin = exactVersionPin(ref);
211
+ const refuse = (code, message) => { fatal.push({ plugin: label, code, message }); };
120
212
  try {
121
- const res = await client.post('/api/plugins/lookup', { filter });
213
+ const res = await client.post('/api/plugins/lookup', {
214
+ filter,
215
+ ...(pipelineId && stepKeys.has(key) ? { context: { pipelineId, stepKeys: stepKeys.get(key) } } : {}),
216
+ });
122
217
  const { plugin, warnings } = unwrapLookup(res);
123
218
  for (const warning of warnings) {
124
- printWarning(`Plugin "${label}": ${warning}`);
219
+ printLookupWarning(label, warning);
220
+ warningSink?.push(warning);
125
221
  }
126
222
  if (plugin) {
127
223
  resolved[key] = plugin;
128
224
  }
225
+ else if (pin) {
226
+ refuse('PLUGIN_VERSION_NOT_FOUND', pinNotFoundMessage(label, pin));
227
+ }
129
228
  else {
130
229
  printWarning(`Plugin "${label}" lookup returned no record — falling back to deploy-time resolution`);
131
230
  }
@@ -134,20 +233,25 @@ export async function resolvePluginsForProps(client, props) {
134
233
  // A plugin whose image signature doesn't verify, or a listing the org
135
234
  // can't use, is NOT an outage to ride out: falling back would quietly
136
235
  // turn it into an unresolved step. Stop.
137
- const fatal = fatalLookupCode(err);
138
- if (fatal === ErrorCode.IMAGE_VERIFICATION_FAILED) {
139
- throw new Error(`Plugin "${label}" image failed signature verification: ${errorMessage(err)}`);
236
+ const code = fatalLookupCode(err);
237
+ if (code === ErrorCode.IMAGE_VERIFICATION_FAILED) {
238
+ refuse(code, `Plugin "${label}" image failed signature verification: ${errorMessage(err)}`);
239
+ return;
240
+ }
241
+ if (code) {
242
+ refuse(code, `Plugin "${label}" can't be used (${code}): ${serviceMessage(err) ?? errorMessage(err)}`);
243
+ return;
244
+ }
245
+ if (pin && isNotFound(err)) {
246
+ refuse('PLUGIN_VERSION_NOT_FOUND', pinNotFoundMessage(label, pin, err));
247
+ return;
140
248
  }
141
- // The block-mode refusal already names the version, the CVEs and the fix:
142
- // print it as the platform wrote it.
143
- if (fatal === ErrorCode.PLUGIN_VERSION_VULN_BLOCKED)
144
- throw new Error(serviceMessage(err) ?? errorMessage(err));
145
- if (fatal)
146
- throw new Error(`Plugin "${label}" can't be used (${fatal}): ${errorMessage(err)}`);
147
249
  const msg = errorMessage(err);
148
250
  printWarning(`Plugin "${label}" pre-resolution failed (${msg}) — falling back to deploy-time resolution`);
149
251
  }
150
252
  }));
253
+ if (fatal.length > 0)
254
+ throw new PluginResolutionError(fatal);
151
255
  return resolved;
152
256
  }
153
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BsdWdpbi1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFXakQ7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQWM7SUFDOUIsT0FBTyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQThCO0lBQ3ZELE1BQU0sSUFBSSxHQUFnQixFQUFFLENBQUM7SUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFdkMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFZLEVBQVEsRUFBRTtRQUNsQyxJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLEdBQWdCLENBQUM7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNwQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSxNQUFNLElBQUksR0FBSSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQTJCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxD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QztZQUNiLHNFQUFzRTtZQUN0RSxzRUFBc0U7WUFDdEUseUNBQXlDO1lBQ3pDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssMENBQTBDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakcsQ0FBQztZQUNELDBFQUEwRTtZQUMxRSxxQ0FBcUM7WUFDckMsSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDLDJCQUEyQjtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvRyxJQUFJLEtBQUs7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssb0JBQW9CLEtBQUssTUFBTSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9GLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixZQUFZLENBQUMsV0FBVyxLQUFLLDRCQUE0QixHQUFHLDRDQUE0QyxDQUFDLENBQUM7UUFDNUcsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFSixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgcGx1Z2luQXJ0aWZhY3RBbGlhcywgcGx1Z2luTG9va3VwRmlsdGVyLCB1bndyYXBMb29rdXAgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCB7IEFwaUNsaWVudCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBwcmludFdhcm5pbmcgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5cbi8qKiBNaW5pbWFsIHBsdWdpbiByZWZlcmVuY2Ugc2hhcGUg4oCUIG1hdGNoZXMgUGx1Z2luT3B0aW9ucyBmcm9tIHBpcGVsaW5lLWNvcmUuICovXG5pbnRlcmZhY2UgUGx1Z2luUmVmIHtcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogUHVibGlzaGVyIGhhbmRsZSBvZiBhbiBpbnN0YWxsZWQgbGlzdGluZy4gKi9cbiAgcHVibGlzaGVyPzogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbiAgZmlsdGVyPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2FjaGUga2V5IG1hdGNoaW5nIGBQbHVnaW5Mb29rdXAubm9ybWFsaXplKClgOiB0aGUgZXhwbGljaXQgYWxpYXMgd2hlbiBzZXQsXG4gKiBvdGhlcndpc2UgYFs8cHVibGlzaGVyPi1dPG5hbWU+LWFsaWFzYCDigJQgcGlwZWxpbmUtY29yZSdzXG4gKiBgcGx1Z2luQXJ0aWZhY3RBbGlhc2AsIHRoZSBvbmUgcnVsZSBldmVyeSBjb25zdW1lciBvZiB0aGlzIG1hcCB1c2VzLlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShyZWY6IFBsdWdpblJlZik6IHN0cmluZyB7XG4gIHJldHVybiBwbHVnaW5BcnRpZmFjdEFsaWFzKHJlZik7XG59XG5cbi8qKlxuICogV2FsayB0aGUgcGlwZWxpbmUgcHJvcHMgdHJlZSB0byBjb2xsZWN0IGV2ZXJ5IHBsdWdpbiByZWZlcmVuY2UuIFBsdWdpbnNcbiAqIGFwcGVhciBhdCBgc3ludGgucGx1Z2luYCBhbmQgYXQgYHN0YWdlc1tdLnN0ZXBzW10ucGx1Z2luYC4gRW50cmllcyBhcmVcbiAqIGRlLWR1cGxpY2F0ZWQgYnkgYGNhY2hlS2V5KClgIOKAlCB0aGUgc2FtZSBrZXkgYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAgdXNlcyxcbiAqIHNvIHRoZSByZXNvbHZlZC1wbHVnaW5zIG1hcCBsb29rdXBzIG1hdGNoIGRvd25zdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFBsdWdpblJlZltdIHtcbiAgY29uc3QgcmVmczogUGx1Z2luUmVmW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgY29uc3QgcHVzaCA9IChyYXc6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGNvbnN0IHIgPSByYXcgYXMgUGx1Z2luUmVmO1xuICAgIGlmICghci5uYW1lKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkocik7XG4gICAgLy8gVGhlIG5hbWUgdGhlIGxvb2t1cCB3aWxsIFRBUkdFVCDigJQgYW4gZXhwbGljaXQgYGZpbHRlci5uYW1lYCB3aW5zIChzZWVcbiAgICAvLyBiZWxvdyksIHNvIHR3byByZWZzIHRoYXQgcmVzb2x2ZSB0byB0aGUgc2FtZSBwbHVnaW4gYXJlIG5vdCBhIGNvbGxpc2lvbi5cbiAgICBjb25zdCBuYW1lID0gKHIuZmlsdGVyPy5uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gci5uYW1lO1xuICAgIGNvbnN0IHRhcmdldCA9IHIucHVibGlzaGVyID8gYCR7ci5wdWJsaXNoZXJ9LyR7bmFtZX1gIDogbmFtZTtcbiAgICBjb25zdCBob2xkZXIgPSBzZWVuLmdldChrZXkpO1xuICAgIGlmIChob2xkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT25lIGFsaWFzIGNhbiBvbmx5IGV2ZXIgbWVhbiBvbmUgcGx1Z2luLiBEZWR1cGxpY2F0aW5nIG9uIHRoZSBhbGlhc1xuICAgICAgLy8gYWxvbmUga2VwdCB0aGUgRklSU1QgcGx1Z2luIGFuZCBzaWxlbnRseSBkcm9wcGVkIHRoZSBzZWNvbmQsIHNvIGEgc3RlcFxuICAgICAgLy8gZGVjbGFyaW5nIGB7IG5hbWU6ICdtYXZlbi1idWlsZCcsIGFsaWFzOiAnYnVpbGQnIH1gIGFmdGVyIGFub3RoZXJcbiAgICAgIC8vIGRlY2xhcmluZyBgeyBuYW1lOiAnbm9kZWpzLWJ1aWxkJywgYWxpYXM6ICdidWlsZCcgfWAgcmFuIG5vZGVqcy1idWlsZCdzXG4gICAgICAvLyBpbWFnZSBhbmQgY29tbWFuZHMg4oCUIG5vIGVycm9yLCBqdXN0IHRoZSB3cm9uZyBidWlsZC5cbiAgICAgIGlmIChob2xkZXIgIT09IHRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBsdWdpbiBhbGlhcyBcIiR7a2V5fVwiIGlzIHVzZWQgZm9yIHR3byBkaWZmZXJlbnQgcGx1Z2lucyAoXCIke2hvbGRlcn1cIiBhbmQgXCIke3RhcmdldH1cIikuIGBcbiAgICAgICAgICArICdHaXZlIGVhY2ggcGx1Z2luIGl0cyBvd24gYWxpYXMuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2Vlbi5zZXQoa2V5LCB0YXJnZXQpO1xuICAgIHJlZnMucHVzaChyKTtcbiAgfTtcblxuICBjb25zdCBzeW50aCA9IHByb3BzLnN5bnRoIGFzIHsgcGx1Z2luPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBwdXNoKHN5bnRoPy5wbHVnaW4pO1xuXG4gIGNvbnN0IHN0YWdlcyA9IHByb3BzLnN0YWdlcyBhcyBBcnJheTx7IHN0ZXBzPzogQXJyYXk8eyBwbHVnaW4/OiB1bmtub3duIH0+IH0+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcyA/PyBbXSkge1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGFnZS5zdGVwcyA/PyBbXSkge1xuICAgICAgcHVzaChzdGVwLnBsdWdpbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlZnM7XG59XG5cbi8qKlxuICogTG9va3VwIHJlZnVzYWxzIHRoYXQgbXVzdCBTVE9QIHRoZSBzeW50aCByYXRoZXIgdGhhbiBmYWxsIGJhY2sgdG9cbiAqIGRlcGxveS10aW1lIHJlc29sdXRpb246IGFuIGltYWdlIHdob3NlIHNpZ25hdHVyZSBkb2Vzbid0IHZlcmlmeSwgYSBsaXN0aW5nXG4gKiB0aGUgb3JnIGNhbid0IHVzZSAobm90IGluc3RhbGxlZCwgYmxvY2tlZCBieSBpdHMgcG9saWN5LCB5YW5rZWQgb3JcbiAqIHN1c3BlbmRlZCksIGFuZCDigJQgd2l0aCBgUExVR0lOX0JMT0NLX09OX05FV19DUklUSUNBTGAgb24g4oCUIGEgcGluIHRvIGFcbiAqIHZlcnNpb24gdGhlIG5pZ2h0bHkgcmVzY2FuIGZsYWdnZWQuIEZhbGxpbmcgYmFjayB3b3VsZCBxdWlldGx5IHR1cm4gZWFjaCBpbnRvXG4gKiBhbiB1bnJlc29sdmVkIHN0ZXAgdGhhdCBmYWlscyBhdCBydW4gdGltZSBpbnN0ZWFkIG9mIG5vdy5cbiAqL1xuY29uc3QgRkFUQUxfTE9PS1VQX0NPREVTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgRXJyb3JDb2RlLklNQUdFX1ZFUklGSUNBVElPTl9GQUlMRUQsXG4gIEVycm9yQ29kZS5QTFVHSU5fTk9UX0lOU1RBTExFRCxcbiAgRXJyb3JDb2RlLlBMVUdJTl9CTE9DS0VEX0JZX1BPTElDWSxcbiAgRXJyb3JDb2RlLlBMVUdJTl9VTkFWQUlMQUJMRSxcbiAgRXJyb3JDb2RlLlBMVUdJTl9WRVJTSU9OX1ZVTE5fQkxPQ0tFRCxcbl07XG5cbi8qKiBUaGUgZXJyb3IgY29kZSBvZiBhIHBsdWdpbiBzZXJ2aWNlIGFuc3dlciwgd2hlbiBpdCBpcyBvbmUgb2Yge0BsaW5rIEZBVEFMX0xPT0tVUF9DT0RFU30uICovXG5mdW5jdGlvbiBmYXRhbExvb2t1cENvZGUoZXJyOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGRhdGEgPSAoZXJyIGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlPy5kYXRhO1xuICBjb25zdCBjb2RlID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycgJiYgRkFUQUxfTE9PS1VQX0NPREVTLmluY2x1ZGVzKGNvZGUpID8gY29kZSA6IG51bGw7XG59XG5cbi8qKiBUaGUgcGx1Z2luIHNlcnZpY2UncyBvd24gcmVmdXNhbCBtZXNzYWdlLCB3aGVuIHRoZSBhbnN3ZXIgY2FycmllcyBvbmUuICovXG5mdW5jdGlvbiBzZXJ2aWNlTWVzc2FnZShlcnI6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZGF0YSA9IChlcnIgYXMgeyByZXNwb25zZT86IHsgZGF0YT86IHVua25vd24gfSB9IHwgdW5kZWZpbmVkKT8ucmVzcG9uc2U/LmRhdGE7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IChkYXRhIGFzIHsgbWVzc2FnZT86IHVua25vd24gfSkubWVzc2FnZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyAmJiBtZXNzYWdlLmxlbmd0aCA+IDAgPyBtZXNzYWdlIDogbnVsbDtcbn1cblxuLyoqXG4gKiBQcmUtcmVzb2x2ZSBwbHVnaW5zIGJ5IGNhbGxpbmcgdGhlIHNhbWUgYFBPU1QgL2FwaS9wbHVnaW5zL2xvb2t1cGAgZW5kcG9pbnRcbiAqIHRoZSBkZXBsb3ktdGltZSBjdXN0b20gcmVzb3VyY2UgTGFtYmRhIHVzZXMuIFJldHVybmluZyB0aGUgZnVsbCBQbHVnaW5cbiAqIHJlY29yZCBhdCBzeW50aCB0aW1lIGlzIHdoYXQgYWxsb3dzIHRoZSByZXN1bHRpbmcgQ0ZOIHRlbXBsYXRlIHRvIHNoaXBcbiAqIHdpdGggcmVhbCBDb2RlQnVpbGQgaW1hZ2UgVVJJcyAoYDxob3N0Pi88bnM+LzxuYW1lPjo8dmVyc2lvbj5gKSByYXRoZXIgdGhhblxuICogdGhlIGBhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjcuMGAgZmFsbGJhY2sgdGhhdCB0aGUgc3ludGgtdGltZSB0b2tlbiBwYXRoXG4gKiBmb3JjZXMuXG4gKlxuICogRmFpbHVyZXMgYXJlIG5vbi1mYXRhbDogYSBtaXNzaW5nIHBsdWdpbiBvciB1bnJlYWNoYWJsZSBBUEkgbG9ncyBhIHdhcm5pbmdcbiAqIGFuZCBmYWxscyB0aHJvdWdoIHRvIHRoZSBkZXBsb3ktdGltZSBjdXN0b20gcmVzb3VyY2UgcGF0aCBzbyBwYXJ0aWFsXG4gKiBwbGF0Zm9ybSBvdXRhZ2VzIGRvbid0IGJsb2NrIHN5bnRoL2RlcGxveS4gVGhlIGV4Y2VwdGlvbiBpcyBhbiBpbWFnZSB0aGF0XG4gKiBmYWlscyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIOKAlCB0aGF0IGFib3J0cyB0aGUgc3ludGguXG4gKlxuICogS2V5ZWQgYnkgYGFsaWFzIHx8IG5hbWVgIHRvIG1hdGNoIGBQbHVnaW5Mb29rdXAucGx1Z2luKClgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBsdWdpbnNGb3JQcm9wcyhcbiAgY2xpZW50OiBBcGlDbGllbnQsXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgcmVmcyA9IGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzKTtcbiAgaWYgKHJlZnMubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG5cbiAgY29uc3QgcmVzb2x2ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocmVmcy5tYXAoYXN5bmMgKHJlZikgPT4ge1xuICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHJlZik7XG4gICAgY29uc3QgbGFiZWwgPSByZWYucHVibGlzaGVyID8gYCR7cmVmLnB1Ymxpc2hlcn0vJHtyZWYubmFtZX1gIDogcmVmLm5hbWU7XG4gICAgLy8gVGhlIHBsdWdpbiBOQU1FIGxpdmVzIG9uIHRoZSByZWYgKGEgc2libGluZyBvZiBgZmlsdGVyYCksIE5PVCBpbnNpZGUgdGhlXG4gICAgLy8gZmlsdGVyIG9iamVjdCDigJQgYnV0IHRoZSBsb29rdXAgbWF0Y2hlcyBvbiB0aGUgZmlsdGVyLiBBIGZpbHRlciB3aXRob3V0XG4gICAgLy8gYG5hbWVgIChlLmcuIGB7dmVyc2lvbiwgdmlzaWJpbGl0eSwgaXNBY3RpdmUsIGlzRGVmYXVsdH1gKSBtYXRjaGVzIEFOWVxuICAgIC8vIHBsdWdpbiB3aXRoIHRob3NlIGF0dHJpYnV0ZXMsIGFuZCB0aGUgZW5kcG9pbnQgcmV0dXJucyBhbiBhcmJpdHJhcnkgb25lXG4gICAgLy8gKHNlZW46IGBkb2NrZXJmaWxlLW11bHRpLXByb3ZpZGVyYCkuIFRoYXQgbWFkZSB0aGUgc3ludGggYW5kIGV2ZXJ5IHN0ZXBcbiAgICAvLyByZXNvbHZlIHRvIHRoZSBXUk9ORyBwbHVnaW4uIFNvIHdoZW4gdGhlIGZpbHRlciBvbWl0cyBgbmFtZWAsIGZhbGwgYmFjayB0b1xuICAgIC8vIHRoZSByZWYncyBwbHVnaW4gbmFtZTsgYW4gZXhwbGljaXQgZmlsdGVyIGBuYW1lYCBzdGlsbCB0YWtlcyBwcmVjZWRlbmNlLlxuICAgIC8vIFNoYXJlZCB3aXRoIHRoZSBwaXBlbGluZSBzZXJ2aWNlJ3MgY29udHJhY3QgY2hlY2sgKHNhbWUgZmlsdGVyLCBzYW1lIHBsdWdpbikuXG4gICAgY29uc3QgZmlsdGVyID0gcGx1Z2luTG9va3VwRmlsdGVyKHJlZik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5wb3N0PHVua25vd24+KCcvYXBpL3BsdWdpbnMvbG9va3VwJywgeyBmaWx0ZXIgfSk7XG4gICAgICBjb25zdCB7IHBsdWdpbiwgd2FybmluZ3MgfSA9IHVud3JhcExvb2t1cChyZXMpO1xuICAgICAgZm9yIChjb25zdCB3YXJuaW5nIG9mIHdhcm5pbmdzKSB7XG4gICAgICAgIHByaW50V2FybmluZyhgUGx1Z2luIFwiJHtsYWJlbH1cIjogJHt3YXJuaW5nfWApO1xuICAgICAgfVxuICAgICAgaWYgKHBsdWdpbikge1xuICAgICAgICByZXNvbHZlZFtrZXldID0gcGx1Z2luO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKGBQbHVnaW4gXCIke2xhYmVsfVwiIGxvb2t1cCByZXR1cm5lZCBubyByZWNvcmQg4oCUIGZhbGxpbmcgYmFjayB0byBkZXBsb3ktdGltZSByZXNvbHV0aW9uYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBBIHBsdWdpbiB3aG9zZSBpbWFnZSBzaWduYXR1cmUgZG9lc24ndCB2ZXJpZnksIG9yIGEgbGlzdGluZyB0aGUgb3JnXG4gICAgICAvLyBjYW4ndCB1c2UsIGlzIE5PVCBhbiBvdXRhZ2UgdG8gcmlkZSBvdXQ6IGZhbGxpbmcgYmFjayB3b3VsZCBxdWlldGx5XG4gICAgICAvLyB0dXJuIGl0IGludG8gYW4gdW5yZXNvbHZlZCBzdGVwLiBTdG9wLlxuICAgICAgY29uc3QgZmF0YWwgPSBmYXRhbExvb2t1cENvZGUoZXJyKTtcbiAgICAgIGlmIChmYXRhbCA9PT0gRXJyb3JDb2RlLklNQUdFX1ZFUklGSUNBVElPTl9GQUlMRUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gXCIke2xhYmVsfVwiIGltYWdlIGZhaWxlZCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uOiAke2Vycm9yTWVzc2FnZShlcnIpfWApO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGJsb2NrLW1vZGUgcmVmdXNhbCBhbHJlYWR5IG5hbWVzIHRoZSB2ZXJzaW9uLCB0aGUgQ1ZFcyBhbmQgdGhlIGZpeDpcbiAgICAgIC8vIHByaW50IGl0IGFzIHRoZSBwbGF0Zm9ybSB3cm90ZSBpdC5cbiAgICAgIGlmIChmYXRhbCA9PT0gRXJyb3JDb2RlLlBMVUdJTl9WRVJTSU9OX1ZVTE5fQkxPQ0tFRCkgdGhyb3cgbmV3IEVycm9yKHNlcnZpY2VNZXNzYWdlKGVycikgPz8gZXJyb3JNZXNzYWdlKGVycikpO1xuICAgICAgaWYgKGZhdGFsKSB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBcIiR7bGFiZWx9XCIgY2FuJ3QgYmUgdXNlZCAoJHtmYXRhbH0pOiAke2Vycm9yTWVzc2FnZShlcnIpfWApO1xuICAgICAgY29uc3QgbXNnID0gZXJyb3JNZXNzYWdlKGVycik7XG4gICAgICBwcmludFdhcm5pbmcoYFBsdWdpbiBcIiR7bGFiZWx9XCIgcHJlLXJlc29sdXRpb24gZmFpbGVkICgke21zZ30pIOKAlCBmYWxsaW5nIGJhY2sgdG8gZGVwbG95LXRpbWUgcmVzb2x1dGlvbmApO1xuICAgIH1cbiAgfSkpO1xuXG4gIHJldHVybiByZXNvbHZlZDtcbn1cbiJdfQ==
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BsdWdpbi1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUNMLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLG1CQUFtQixFQUNoRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSxZQUFZLEdBQy9FLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFXakQ7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQWM7SUFDOUIsT0FBTyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQThCO0lBQ3ZELE1BQU0sSUFBSSxHQUFnQixFQUFFLENBQUM7SUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFdkMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFZLEVBQVEsRUFBRTtRQUNsQyxJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLEdBQWdCLENBQUM7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNwQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSxNQUFNLElB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VUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLFlBQVksQ0FBQyxXQUFXLEtBQUssNEJBQTRCLEdBQUcsNENBQTRDLENBQUMsQ0FBQztRQUM1RyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVKLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQge1xuICBjb2xsZWN0UGx1Z2luU3RlcHMsIGV4YWN0UGluTm90Rm91bmRNZXNzYWdlLCBsb29rdXBOb3RGb3VuZFN0YXRlLCB0eXBlIExvb2t1cFdhcm5pbmcsIHR5cGUgTG9va3VwV2FybmluZ1NldmVyaXR5LFxuICBwbHVnaW5BcnRpZmFjdEFsaWFzLCBwbHVnaW5Mb29rdXBGaWx0ZXIsIHN1bW1hcml6ZUxvb2t1cFdhcm5pbmdzLCB1bndyYXBMb29rdXAsXG59IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyBBcGlDbGllbnQgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgcHJpbnRXYXJuaW5nIH0gZnJvbSAnLi9vdXRwdXQtdXRpbHMuanMnO1xuXG4vKiogTWluaW1hbCBwbHVnaW4gcmVmZXJlbmNlIHNoYXBlIOKAlCBtYXRjaGVzIFBsdWdpbk9wdGlvbnMgZnJvbSBwaXBlbGluZS1jb3JlLiAqL1xuaW50ZXJmYWNlIFBsdWdpblJlZiB7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFB1Ymxpc2hlciBoYW5kbGUgb2YgYW4gaW5zdGFsbGVkIGxpc3RpbmcuICovXG4gIHB1Ymxpc2hlcj86IHN0cmluZztcbiAgYWxpYXM/OiBzdHJpbmc7XG4gIGZpbHRlcj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIENhY2hlIGtleSBtYXRjaGluZyBgUGx1Z2luTG9va3VwLm5vcm1hbGl6ZSgpYDogdGhlIGV4cGxpY2l0IGFsaWFzIHdoZW4gc2V0LFxuICogb3RoZXJ3aXNlIGBbPHB1Ymxpc2hlcj4tXTxuYW1lPi1hbGlhc2Ag4oCUIHBpcGVsaW5lLWNvcmUnc1xuICogYHBsdWdpbkFydGlmYWN0QWxpYXNgLCB0aGUgb25lIHJ1bGUgZXZlcnkgY29uc3VtZXIgb2YgdGhpcyBtYXAgdXNlcy5cbiAqL1xuZnVuY3Rpb24gY2FjaGVLZXkocmVmOiBQbHVnaW5SZWYpOiBzdHJpbmcge1xuICByZXR1cm4gcGx1Z2luQXJ0aWZhY3RBbGlhcyhyZWYpO1xufVxuXG4vKipcbiAqIFdhbGsgdGhlIHBpcGVsaW5lIHByb3BzIHRyZWUgdG8gY29sbGVjdCBldmVyeSBwbHVnaW4gcmVmZXJlbmNlLiBQbHVnaW5zXG4gKiBhcHBlYXIgYXQgYHN5bnRoLnBsdWdpbmAgYW5kIGF0IGBzdGFnZXNbXS5zdGVwc1tdLnBsdWdpbmAuIEVudHJpZXMgYXJlXG4gKiBkZS1kdXBsaWNhdGVkIGJ5IGBjYWNoZUtleSgpYCDigJQgdGhlIHNhbWUga2V5IGBQbHVnaW5Mb29rdXAucGx1Z2luKClgIHVzZXMsXG4gKiBzbyB0aGUgcmVzb2x2ZWQtcGx1Z2lucyBtYXAgbG9va3VwcyBtYXRjaCBkb3duc3RyZWFtLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0UGx1Z2luUmVmcyhwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQbHVnaW5SZWZbXSB7XG4gIGNvbnN0IHJlZnM6IFBsdWdpblJlZltdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGNvbnN0IHB1c2ggPSAocmF3OiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ29iamVjdCcpIHJldHVybjtcbiAgICBjb25zdCByID0gcmF3IGFzIFBsdWdpblJlZjtcbiAgICBpZiAoIXIubmFtZSkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHIpO1xuICAgIC8vIFRoZSBuYW1lIHRoZSBsb29rdXAgd2lsbCBUQVJHRVQg4oCUIGFuIGV4cGxpY2l0IGBmaWx0ZXIubmFtZWAgd2lucyAoc2VlXG4gICAgLy8gYmVsb3cpLCBzbyB0d28gcmVmcyB0aGF0IHJlc29sdmUgdG8gdGhlIHNhbWUgcGx1Z2luIGFyZSBub3QgYSBjb2xsaXNpb24uXG4gICAgY29uc3QgbmFtZSA9IChyLmZpbHRlcj8ubmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/IHIubmFtZTtcbiAgICBjb25zdCB0YXJnZXQgPSByLnB1Ymxpc2hlciA/IGAke3IucHVibGlzaGVyfS8ke25hbWV9YCA6IG5hbWU7XG4gICAgY29uc3QgaG9sZGVyID0gc2Vlbi5nZXQoa2V5KTtcbiAgICBpZiAoaG9sZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9uZSBhbGlhcyBjYW4gb25seSBldmVyIG1lYW4gb25lIHBsdWdpbi4gRGVkdXBsaWNhdGluZyBvbiB0aGUgYWxpYXNcbiAgICAgIC8vIGFsb25lIGtlcHQgdGhlIEZJUlNUIHBsdWdpbiBhbmQgc2lsZW50bHkgZHJvcHBlZCB0aGUgc2Vjb25kLCBzbyBhIHN0ZXBcbiAgICAgIC8vIGRlY2xhcmluZyBgeyBuYW1lOiAnbWF2ZW4tYnVpbGQnLCBhbGlhczogJ2J1aWxkJyB9YCBhZnRlciBhbm90aGVyXG4gICAgICAvLyBkZWNsYXJpbmcgYHsgbmFtZTogJ25vZGVqcy1idWlsZCcsIGFsaWFzOiAnYnVpbGQnIH1gIHJhbiBub2RlanMtYnVpbGQnc1xuICAgICAgLy8gaW1hZ2UgYW5kIGNvbW1hbmRzIOKAlCBubyBlcnJvciwganVzdCB0aGUgd3JvbmcgYnVpbGQuXG4gICAgICBpZiAoaG9sZGVyICE9PSB0YXJnZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQbHVnaW4gYWxpYXMgXCIke2tleX1cIiBpcyB1c2VkIGZvciB0d28gZGlmZmVyZW50IHBsdWdpbnMgKFwiJHtob2xkZXJ9XCIgYW5kIFwiJHt0YXJnZXR9XCIpLiBgXG4gICAgICAgICAgKyAnR2l2ZSBlYWNoIHBsdWdpbiBpdHMgb3duIGFsaWFzLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlZW4uc2V0KGtleSwgdGFyZ2V0KTtcbiAgICByZWZzLnB1c2gocik7XG4gIH07XG5cbiAgY29uc3Qgc3ludGggPSBwcm9wcy5zeW50aCBhcyB7IHBsdWdpbj86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgcHVzaChzeW50aD8ucGx1Z2luKTtcblxuICBjb25zdCBzdGFnZXMgPSBwcm9wcy5zdGFnZXMgYXMgQXJyYXk8eyBzdGVwcz86IEFycmF5PHsgcGx1Z2luPzogdW5rbm93biB9PiB9PiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBzdGFnZSBvZiBzdGFnZXMgPz8gW10pIHtcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RhZ2Uuc3RlcHMgPz8gW10pIHtcbiAgICAgIHB1c2goc3RlcC5wbHVnaW4pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWZzO1xufVxuXG4vKipcbiAqIExvb2t1cCByZWZ1c2FscyB0aGF0IG11c3QgU1RPUCB0aGUgc3ludGggcmF0aGVyIHRoYW4gZmFsbCBiYWNrIHRvXG4gKiBkZXBsb3ktdGltZSByZXNvbHV0aW9uOiBhbiBpbWFnZSB3aG9zZSBzaWduYXR1cmUgZG9lc24ndCB2ZXJpZnksIGEgbGlzdGluZ1xuICogdGhlIG9yZyBjYW4ndCB1c2UgKG5vdCBpbnN0YWxsZWQsIGJsb2NrZWQgYnkgaXRzIGFsbG93L2RlbnkgcG9saWN5LCB5YW5rZWRcbiAqIG9yIHN1c3BlbmRlZCksIGFuZCBhbiBvcmcgcGx1Z2luIHRoYXQgd2FzIGRlbGV0ZWQuIEZhbGxpbmcgYmFjayB3b3VsZFxuICogcXVpZXRseSB0dXJuIGVhY2ggaW50byBhbiB1bnJlc29sdmVkIHN0ZXAgdGhhdCBmYWlscyBhdCBydW4gdGltZSBpbnN0ZWFkIG9mXG4gKiBub3cuIFZ1bG5lcmFiaWxpdHkgc3RhdGUgaXMgTkVWRVIgb25lIG9mIHRoZXNlOiBpdCBhcnJpdmVzIGFzIGdyYWRlZFxuICogd2FybmluZ3MgYmVzaWRlIGEgcmVzb2x2ZWQgcGx1Z2luLlxuICovXG5jb25zdCBGQVRBTF9MT09LVVBfQ09ERVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICBFcnJvckNvZGUuSU1BR0VfVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgRXJyb3JDb2RlLlBMVUdJTl9OT1RfSU5TVEFMTEVELFxuICBFcnJvckNvZGUuUExVR0lOX0JMT0NLRURfQllfUE9MSUNZLFxuICBFcnJvckNvZGUuUExVR0lOX1VOQVZBSUxBQkxFLFxuICAvLyBUaGUgb3JnJ3Mgb3duIHBsdWdpbiB3YXMgZGVsZXRlZDogdGhlIGxvb2t1cCByZWZ1c2VzIGl0IHJhdGhlciB0aGFuIGZhbGxcbiAgLy8gdGhyb3VnaCB0byBhIHNhbWUtbmFtZSBsaXN0aW5nLiAoUGx1Z2luIHNlcnZpY2UgY29kZTsgbWF0Y2hlZCBhcyBhIHN0cmluZy4pXG4gICdQTFVHSU5fREVMRVRFRCcsXG5dO1xuXG4vKiogVGhlIGVycm9yIGNvZGUgb2YgYSBwbHVnaW4gc2VydmljZSBhbnN3ZXIsIHdoZW4gaXQgaXMgb25lIG9mIHtAbGluayBGQVRBTF9MT09LVVBfQ09ERVN9LiAqL1xuZnVuY3Rpb24gZmF0YWxMb29rdXBDb2RlKGVycjogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBkYXRhID0gKGVyciBhcyB7IHJlc3BvbnNlPzogeyBkYXRhPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZXNwb25zZT8uZGF0YTtcbiAgY29uc3QgY29kZSA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gKGRhdGEgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnICYmIEZBVEFMX0xPT0tVUF9DT0RFUy5pbmNsdWRlcyhjb2RlKSA/IGNvZGUgOiBudWxsO1xufVxuXG4vKiogV2hldGhlciB0aGUgcGx1Z2luIHNlcnZpY2UgYW5zd2VyZWQgXCJubyBzdWNoIHBsdWdpbi92ZXJzaW9uXCIgKDQwNCBOT1RfRk9VTkQpLiAqL1xuZnVuY3Rpb24gaXNOb3RGb3VuZChlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgY29uc3QgcmVzcG9uc2UgPSAoZXJyIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IHVua25vd247IGRhdGE/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlO1xuICBjb25zdCBjb2RlID0gcmVzcG9uc2U/LmRhdGEgJiYgdHlwZW9mIHJlc3BvbnNlLmRhdGEgPT09ICdvYmplY3QnID8gKHJlc3BvbnNlLmRhdGEgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlIDogdW5kZWZpbmVkO1xuICByZXR1cm4gcmVzcG9uc2U/LnN0YXR1cyA9PT0gNDA0IHx8IGNvZGUgPT09IEVycm9yQ29kZS5OT1RfRk9VTkQ7XG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gYSByZWZlcmVuY2UgUElOUyDigJQgb25lIGV4YWN0IGB4LnkuelstcHJlXWAsIG5vdCBhIHJhbmdlIG9yXG4gKiBgbGF0ZXN0YC4gQSBwaW4gbmFtZXMgYSB2ZXJzaW9uIHRoYXQgbXVzdCBleGlzdDogaWYgaXQgZG9lc24ndCAobmV2ZXJcbiAqIHB1Ymxpc2hlZCwgb3IgcmVmdXNlZCBieSB0aGUgYnVpbGQncyB2dWxuZXJhYmlsaXR5IGdhdGUsIHdoaWNoIHNhdmVzXG4gKiBub3RoaW5nKSwgdGhlcmUgaXMgbm8gb3V0YWdlIHRvIHJpZGUgb3V0IGFuZCBub3RoaW5nIGZvciB0aGUgZGVwbG95LXRpbWVcbiAqIGxvb2t1cCB0byBmaW5kIGVpdGhlci5cbiAqL1xuZnVuY3Rpb24gZXhhY3RWZXJzaW9uUGluKHJlZjogUGx1Z2luUmVmKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHZlcnNpb24gPSByZWYuZmlsdGVyPy52ZXJzaW9uO1xuICByZXR1cm4gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnICYmIC9eXFxkK1xcLlxcZCtcXC5cXGQrKC1bMC05QS1aYS16Li1dKyk/JC8udGVzdCh2ZXJzaW9uKSA/IHZlcnNpb24gOiBudWxsO1xufVxuXG4vKiogT25lIHBsdWdpbiB0aGUgc3ludGggY291bGQgbm90IHVzZSwgYXMge0BsaW5rIFBsdWdpblJlc29sdXRpb25FcnJvcn0gcmVwb3J0cyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luUmVmdXNhbCB7XG4gIC8qKiBgWzxwdWJsaXNoZXI+L108bmFtZT5gIG9mIHRoZSByZWZlcmVuY2UuICovXG4gIHJlYWRvbmx5IHBsdWdpbjogc3RyaW5nO1xuICAvKiogVGhlIHBsdWdpbiBzZXJ2aWNlJ3MgZXJyb3IgY29kZSwgb3IgYSBsb2NhbCBvbmUgKGBQTFVHSU5fVkVSU0lPTl9OT1RfRk9VTkRgKS4gKi9cbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXZlcnkgZmF0YWwgcmVmdXNhbCBvZiBvbmUgcHJlLXJlc29sdXRpb24gcGFzcy4gQ2FycmllcyB0aGUgc3RydWN0dXJlZCBsaXN0XG4gKiBhcyB3ZWxsIGFzIHRoZSBodW1hbiBtZXNzYWdlLCBzbyB0aGUgc3ludGggY2FuIGVtaXQgYSBtYWNoaW5lLXJlYWRhYmxlXG4gKiBmYWlsdXJlIGxpbmUgKGBQQl9TWU5USF9GQUlMVVJFYCkgdGhlIGV4ZWN1dGlvbiBldmVudHMgcGljayB1cC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpblJlc29sdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocmVhZG9ubHkgcmVmdXNhbHM6IHJlYWRvbmx5IFBsdWdpblJlZnVzYWxbXSkge1xuICAgIHN1cGVyKHJlZnVzYWxzLmxlbmd0aCA9PT0gMVxuICAgICAgPyByZWZ1c2Fsc1swXSEubWVzc2FnZVxuICAgICAgOiBgJHtyZWZ1c2Fscy5sZW5ndGh9IHBsdWdpbnMgY2FuJ3QgYmUgdXNlZDpcXG4ke3JlZnVzYWxzLm1hcCgocikgPT4gYCAgLSAke3IubWVzc2FnZX1gKS5qb2luKCdcXG4nKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luUmVzb2x1dGlvbkVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFdoeSBhbiBleGFjdCBwaW4gd2FzIG5vdCBmb3VuZCwgcGhyYXNlZCBmcm9tIHRoZSA0MDQncyBgZGV0YWlscy5zdGF0ZWBcbiAqIChgZGVsZXRlZGAgLyBgaW5hY3RpdmVgIC8gYHlhbmtlZGAgLyBgbWlzc2luZ2ApLiBXaXRob3V0IGEgc3RhdGUgdGhlIGFuc3dlclxuICogY2Fubm90IHRlbGwgdGhlIGNhc2VzIGFwYXJ0LCBzbyB0aGUgbWVzc2FnZSBuYW1lcyB0aGUgdHdvIGxpa2VsaWVzdC5cbiAqIFNoYXJlZCB3aXRoIHRoZSBkZXBsb3ktdGltZSBMYW1iZGEncyBDbG91ZEZvcm1hdGlvbiByZWFzb24gKHBpcGVsaW5lLWNvcmUpLlxuICovXG5mdW5jdGlvbiBwaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWw6IHN0cmluZywgcGluOiBzdHJpbmcsIGVycj86IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWwsIHBpbiwgbG9va3VwTm90Rm91bmRTdGF0ZShlcnIpKTtcbn1cblxuY29uc3QgU0VWRVJJVFlfU1RZTEU6IFJlY29yZDxMb29rdXBXYXJuaW5nU2V2ZXJpdHksIChzOiBzdHJpbmcpID0+IHN0cmluZz4gPSB7XG4gIGluZm86IHBpY28uY3lhbixcbiAgd2FybmluZzogcGljby55ZWxsb3csXG4gIGVycm9yOiBwaWNvLnJlZCxcbiAgY3JpdGljYWw6ICh0KSA9PiBwaWNvLmJvbGQocGljby5yZWQodCkpLFxufTtcblxuLyoqIFByaW50IG9uZSBsb29rdXAgd2FybmluZywgcHJlZml4ZWQgYW5kIGNvbG91cmVkIGJ5IGl0cyBzZXZlcml0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludExvb2t1cFdhcm5pbmcobGFiZWw6IHN0cmluZywgd2FybmluZzogTG9va3VwV2FybmluZyk6IHZvaWQge1xuICBjb25zdCB0YWcgPSBTRVZFUklUWV9TVFlMRVt3YXJuaW5nLnNldmVyaXR5XShgWyR7d2FybmluZy5zZXZlcml0eS50b1VwcGVyQ2FzZSgpfV1gKTtcbiAgcHJpbnRXYXJuaW5nKGAke3RhZ30gUGx1Z2luIFwiJHtsYWJlbH1cIjogJHt3YXJuaW5nLm1lc3NhZ2V9YCk7XG59XG5cbi8qKiBQcmludCB0aGUgb25lLWxpbmUgc2V2ZXJpdHkgc3VtbWFyeSBvZiBhIHN5bnRoJ3MgbG9va3VwIHdhcm5pbmdzIChub3RoaW5nIHdoZW4gbm9uZSkuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRMb29rdXBXYXJuaW5nU3VtbWFyeSh3YXJuaW5nczogcmVhZG9ubHkgTG9va3VwV2FybmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGxpbmUgPSBzdW1tYXJpemVMb29rdXBXYXJuaW5ncyh3YXJuaW5ncyk7XG4gIGlmICghbGluZSkgcmV0dXJuO1xuICBjb25zdCB3b3JzdCA9IHdhcm5pbmdzLnNvbWUoKHcpID0+IHcuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpID8gJ2NyaXRpY2FsJ1xuICAgIDogd2FybmluZ3Muc29tZSgodykgPT4gdy5zZXZlcml0eSA9PT0gJ2Vycm9yJykgPyAnZXJyb3InXG4gICAgICA6IHdhcm5pbmdzLnNvbWUoKHcpID0+IHcuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJykgPyAnd2FybmluZycgOiAnaW5mbyc7XG4gIHByaW50V2FybmluZyhTRVZFUklUWV9TVFlMRVt3b3JzdF0obGluZSkpO1xufVxuXG4vKiogVGhlIHBsdWdpbiBzZXJ2aWNlJ3Mgb3duIHJlZnVzYWwgbWVzc2FnZSwgd2hlbiB0aGUgYW5zd2VyIGNhcnJpZXMgb25lLiAqL1xuZnVuY3Rpb24gc2VydmljZU1lc3NhZ2UoZXJyOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGRhdGEgPSAoZXJyIGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlPy5kYXRhO1xuICBjb25zdCBtZXNzYWdlID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IG1lc3NhZ2U/OiB1bmtub3duIH0pLm1lc3NhZ2UgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgbWVzc2FnZS5sZW5ndGggPiAwID8gbWVzc2FnZSA6IG51bGw7XG59XG5cbi8qKlxuICogUHJlLXJlc29sdmUgcGx1Z2lucyBieSBjYWxsaW5nIHRoZSBzYW1lIGBQT1NUIC9hcGkvcGx1Z2lucy9sb29rdXBgIGVuZHBvaW50XG4gKiB0aGUgZGVwbG95LXRpbWUgY3VzdG9tIHJlc291cmNlIExhbWJkYSB1c2VzLiBSZXR1cm5pbmcgdGhlIGZ1bGwgUGx1Z2luXG4gKiByZWNvcmQgYXQgc3ludGggdGltZSBpcyB3aGF0IGFsbG93cyB0aGUgcmVzdWx0aW5nIENGTiB0ZW1wbGF0ZSB0byBzaGlwXG4gKiB3aXRoIHJlYWwgQ29kZUJ1aWxkIGltYWdlIFVSSXMgKGA8aG9zdD4vPG5zPi88bmFtZT46PHZlcnNpb24+YCkgcmF0aGVyIHRoYW5cbiAqIHRoZSBgYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo3LjBgIGZhbGxiYWNrIHRoYXQgdGhlIHN5bnRoLXRpbWUgdG9rZW4gcGF0aFxuICogZm9yY2VzLlxuICpcbiAqIEZhaWx1cmVzIGFyZSBub24tZmF0YWw6IGEgbWlzc2luZyBwbHVnaW4gb3IgdW5yZWFjaGFibGUgQVBJIGxvZ3MgYSB3YXJuaW5nXG4gKiBhbmQgZmFsbHMgdGhyb3VnaCB0byB0aGUgZGVwbG95LXRpbWUgY3VzdG9tIHJlc291cmNlIHBhdGggc28gcGFydGlhbFxuICogcGxhdGZvcm0gb3V0YWdlcyBkb24ndCBibG9jayBzeW50aC9kZXBsb3kuIFRoZSBleGNlcHRpb25zIGFib3J0IHRoZSBzeW50aDpcbiAqIHRoZSB7QGxpbmsgRkFUQUxfTE9PS1VQX0NPREVTfSByZWZ1c2FscywgYW5kIGFuIGV4YWN0IHZlcnNpb24gcGluIHRoYXQgZG9lc1xuICogbm90IGV4aXN0LlxuICpcbiAqIEV2ZXJ5IHJlZmVyZW5jZSBpcyBsb29rZWQgdXAgYmVmb3JlIGFueXRoaW5nIGlzIHRocm93biwgYW5kIEFMTCBmYXRhbFxuICogcmVmdXNhbHMgYXJlIHJlcG9ydGVkIHRvZ2V0aGVyLiBTdG9wcGluZyBhdCB0aGUgZmlyc3QgbWVhbnQgYSBwaXBlbGluZSB3aXRoXG4gKiB0aHJlZSByZWZ1c2VkIHBsdWdpbnMgdG9vayB0aHJlZSBzeW50aCBhdHRlbXB0cyB0byBsZWFybiBhYm91dCBhbGwgdGhyZWUuXG4gKlxuICogRXZlcnkgbG9va3VwIHdhcm5pbmcgaXMgcHJpbnRlZCwgZ3JhZGVkIGJ5IHNldmVyaXR5LCBhbmQgYXBwZW5kZWQgdG9cbiAqIGB3YXJuaW5nU2lua2Agd2hlbiBnaXZlbiAodGhlIHN5bnRoIHByaW50cyBhIG9uZS1saW5lIHN1bW1hcnkgYXQgaXRzIGVuZCkuXG4gKiBBIHdhcm5pbmcgbmV2ZXIgZmFpbHMgdGhlIHN5bnRoIOKAlCB2dWxuZXJhYmlsaXR5IHN0YXRlIGlzIHJlcG9ydGVkLCBub3RcbiAqIGVuZm9yY2VkLlxuICpcbiAqIFdoZW4gdGhlIHByb3BzIGNhcnJ5IGEgYHBpcGVsaW5lSWRgLCBlYWNoIGxvb2t1cCBhbHNvIHNlbmRzXG4gKiBgY29udGV4dDogeyBwaXBlbGluZUlkLCBzdGVwS2V5cyB9YCDigJQgdGhlIGxhYmVsIChgcGx1Z2luU3RlcExhYmVsYDogYHN5bnRoYCBvclxuICogYDxzdGFnZT4vPGFsaWFzID8/IG5hbWU+YCkgb2YgRVZFUlkgc3RlcCB0aGUgZGUtZHVwbGljYXRlZCByZWZlcmVuY2Ugc2VydmVzIOKAlFxuICogc28gdGhlIHBsdWdpbiBzZXJ2aWNlIGNhbiByZWNvcmQgdGhlIHdhcm5pbmdzIGl0IHJldHVybnMgYWdhaW5zdCBlYWNoIG9mXG4gKiB0aG9zZSBwaXBlbGluZSBzdGVwcywgbm90IG9ubHkgcHJpbnQgdGhlbSBpbnRvIHRoaXMgc3ludGgncyBsb2cuXG4gKlxuICogS2V5ZWQgYnkgYGFsaWFzIHx8IG5hbWVgIHRvIG1hdGNoIGBQbHVnaW5Mb29rdXAucGx1Z2luKClgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBsdWdpbnNGb3JQcm9wcyhcbiAgY2xpZW50OiBBcGlDbGllbnQsXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgd2FybmluZ1Npbms/OiBMb29rdXBXYXJuaW5nW10sXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IHJlZnMgPSBjb2xsZWN0UGx1Z2luUmVmcyhwcm9wcyk7XG4gIGlmIChyZWZzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9O1xuXG4gIGNvbnN0IHBpcGVsaW5lSWQgPSB0eXBlb2YgcHJvcHMucGlwZWxpbmVJZCA9PT0gJ3N0cmluZycgJiYgcHJvcHMucGlwZWxpbmVJZC5sZW5ndGggPiAwID8gcHJvcHMucGlwZWxpbmVJZCA6IHVuZGVmaW5lZDtcbiAgLy8gT25lIGxvb2t1cCBwZXIgYWxpYXMgbWF5IHNlcnZlIHNldmVyYWwgc3RlcHM6IHRoZSBsYWJlbHMgb2YgZWFjaCwgYnkgYWxpYXMuXG4gIGNvbnN0IHN0ZXBLZXlzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBmb3IgKGNvbnN0IHN0ZXAgb2YgY29sbGVjdFBsdWdpblN0ZXBzKHByb3BzKSkge1xuICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHN0ZXApO1xuICAgIHN0ZXBLZXlzLnNldChrZXksIFsuLi4oc3RlcEtleXMuZ2V0KGtleSkgPz8gW10pLCBzdGVwLmxhYmVsXSk7XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGNvbnN0IGZhdGFsOiBQbHVnaW5SZWZ1c2FsW10gPSBbXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChyZWZzLm1hcChhc3luYyAocmVmKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkocmVmKTtcbiAgICBjb25zdCBsYWJlbCA9IHJlZi5wdWJsaXNoZXIgPyBgJHtyZWYucHVibGlzaGVyfS8ke3JlZi5uYW1lfWAgOiByZWYubmFtZTtcbiAgICAvLyBUaGUgcGx1Z2luIE5BTUUgbGl2ZXMgb24gdGhlIHJlZiAoYSBzaWJsaW5nIG9mIGBmaWx0ZXJgKSwgTk9UIGluc2lkZSB0aGVcbiAgICAvLyBmaWx0ZXIgb2JqZWN0IOKAlCBidXQgdGhlIGxvb2t1cCBtYXRjaGVzIG9uIHRoZSBmaWx0ZXIuIEEgZmlsdGVyIHdpdGhvdXRcbiAgICAvLyBgbmFtZWAgKGUuZy4gYHt2ZXJzaW9uLCB2aXNpYmlsaXR5LCBpc0FjdGl2ZSwgaXNEZWZhdWx0fWApIG1hdGNoZXMgQU5ZXG4gICAgLy8gcGx1Z2luIHdpdGggdGhvc2UgYXR0cmlidXRlcywgYW5kIHRoZSBlbmRwb2ludCByZXR1cm5zIGFuIGFyYml0cmFyeSBvbmVcbiAgICAvLyAoc2VlbjogYGRvY2tlcmZpbGUtbXVsdGktcHJvdmlkZXJgKS4gVGhhdCBtYWRlIHRoZSBzeW50aCBhbmQgZXZlcnkgc3RlcFxuICAgIC8vIHJlc29sdmUgdG8gdGhlIFdST05HIHBsdWdpbi4gU28gd2hlbiB0aGUgZmlsdGVyIG9taXRzIGBuYW1lYCwgZmFsbCBiYWNrIHRvXG4gICAgLy8gdGhlIHJlZidzIHBsdWdpbiBuYW1lOyBhbiBleHBsaWNpdCBmaWx0ZXIgYG5hbWVgIHN0aWxsIHRha2VzIHByZWNlZGVuY2UuXG4gICAgLy8gU2hhcmVkIHdpdGggdGhlIHBpcGVsaW5lIHNlcnZpY2UncyBjb250cmFjdCBjaGVjayAoc2FtZSBmaWx0ZXIsIHNhbWUgcGx1Z2luKS5cbiAgICBjb25zdCBmaWx0ZXIgPSBwbHVnaW5Mb29rdXBGaWx0ZXIocmVmKTtcbiAgICBjb25zdCBwaW4gPSBleGFjdFZlcnNpb25QaW4ocmVmKTtcbiAgICBjb25zdCByZWZ1c2UgPSAoY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkID0+IHsgZmF0YWwucHVzaCh7IHBsdWdpbjogbGFiZWwsIGNvZGUsIG1lc3NhZ2UgfSk7IH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5wb3N0PHVua25vd24+KCcvYXBpL3BsdWdpbnMvbG9va3VwJywge1xuICAgICAgICBmaWx0ZXIsXG4gICAgICAgIC4uLihwaXBlbGluZUlkICYmIHN0ZXBLZXlzLmhhcyhrZXkpID8geyBjb250ZXh0OiB7IHBpcGVsaW5lSWQsIHN0ZXBLZXlzOiBzdGVwS2V5cy5nZXQoa2V5KSB9IH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgcGx1Z2luLCB3YXJuaW5ncyB9ID0gdW53cmFwTG9va3VwKHJlcyk7XG4gICAgICBmb3IgKGNvbnN0IHdhcm5pbmcgb2Ygd2FybmluZ3MpIHtcbiAgICAgICAgcHJpbnRMb29rdXBXYXJuaW5nKGxhYmVsLCB3YXJuaW5nKTtcbiAgICAgICAgd2FybmluZ1Npbms/LnB1c2god2FybmluZyk7XG4gICAgICB9XG4gICAgICBpZiAocGx1Z2luKSB7XG4gICAgICAgIHJlc29sdmVkW2tleV0gPSBwbHVnaW47XG4gICAgICB9IGVsc2UgaWYgKHBpbikge1xuICAgICAgICByZWZ1c2UoJ1BMVUdJTl9WRVJTSU9OX05PVF9GT1VORCcsIHBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbCwgcGluKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmludFdhcm5pbmcoYFBsdWdpbiBcIiR7bGFiZWx9XCIgbG9va3VwIHJldHVybmVkIG5vIHJlY29yZCDigJQgZmFsbGluZyBiYWNrIHRvIGRlcGxveS10aW1lIHJlc29sdXRpb25gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIEEgcGx1Z2luIHdob3NlIGltYWdlIHNpZ25hdHVyZSBkb2Vzbid0IHZlcmlmeSwgb3IgYSBsaXN0aW5nIHRoZSBvcmdcbiAgICAgIC8vIGNhbid0IHVzZSwgaXMgTk9UIGFuIG91dGFnZSB0byByaWRlIG91dDogZmFsbGluZyBiYWNrIHdvdWxkIHF1aWV0bHlcbiAgICAgIC8vIHR1cm4gaXQgaW50byBhbiB1bnJlc29sdmVkIHN0ZXAuIFN0b3AuXG4gICAgICBjb25zdCBjb2RlID0gZmF0YWxMb29rdXBDb2RlKGVycik7XG4gICAgICBpZiAoY29kZSA9PT0gRXJyb3JDb2RlLklNQUdFX1ZFUklGSUNBVElPTl9GQUlMRUQpIHtcbiAgICAgICAgcmVmdXNlKGNvZGUsIGBQbHVnaW4gXCIke2xhYmVsfVwiIGltYWdlIGZhaWxlZCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uOiAke2Vycm9yTWVzc2FnZShlcnIpfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29kZSkge1xuICAgICAgICByZWZ1c2UoY29kZSwgYFBsdWdpbiBcIiR7bGFiZWx9XCIgY2FuJ3QgYmUgdXNlZCAoJHtjb2RlfSk6ICR7c2VydmljZU1lc3NhZ2UoZXJyKSA/PyBlcnJvck1lc3NhZ2UoZXJyKX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHBpbiAmJiBpc05vdEZvdW5kKGVycikpIHtcbiAgICAgICAgcmVmdXNlKCdQTFVHSU5fVkVSU0lPTl9OT1RfRk9VTkQnLCBwaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWwsIHBpbiwgZXJyKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1zZyA9IGVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgcHJpbnRXYXJuaW5nKGBQbHVnaW4gXCIke2xhYmVsfVwiIHByZS1yZXNvbHV0aW9uIGZhaWxlZCAoJHttc2d9KSDigJQgZmFsbGluZyBiYWNrIHRvIGRlcGxveS10aW1lIHJlc29sdXRpb25gKTtcbiAgICB9XG4gIH0pKTtcblxuICBpZiAoZmF0YWwubGVuZ3RoID4gMCkgdGhyb3cgbmV3IFBsdWdpblJlc29sdXRpb25FcnJvcihmYXRhbCk7XG4gIHJldHVybiByZXNvbHZlZDtcbn1cbiJdfQ==
@@ -0,0 +1,28 @@
1
+ import { ApiClient } from './api-client.js';
2
+ /** The command that provisions the registration key, named in every skip warning. */
3
+ export declare const REGISTRATION_KEY_COMMAND = "pipeline-manager infra store-token --scope pipeline_registry:write --schedule";
4
+ /**
5
+ * The client a pipeline-registry write (`POST /pipelines/registry`) is made with.
6
+ *
7
+ * - **A person's credential** (`auth login`, or a `PLATFORM_TOKEN` they set):
8
+ * the same client. People hold `pipeline_registry:write` beside
9
+ * `pipelines:write` through the Member and Admin Roles.
10
+ * - **The stored machine credential** (`--store-tokens`): NOT that client. The
11
+ * `platform` key holds the Pipeline Automation Role — pipeline and plugin reads
12
+ * only — so the registration goes out on the separate `pipeline-register` key,
13
+ * read from the secret named by `PIPELINE_REGISTRATION_SECRET_NAME` (the synth
14
+ * CodeBuild project carries it) or derived from the pipeline's org.
15
+ *
16
+ * There is no fallback to the platform key. When the registration key is absent
17
+ * or unreadable this returns `undefined` after a loud warning naming the
18
+ * `store-token` command that provisions it, and the caller skips registering —
19
+ * a stale step manifest is reported, a broken synth is not acceptable.
20
+ */
21
+ export declare function resolveRegistrationClient(opts: {
22
+ client: ApiClient;
23
+ storeTokens?: boolean;
24
+ orgId?: string;
25
+ region?: string;
26
+ profile?: string;
27
+ }): Promise<ApiClient | undefined>;
28
+ //# sourceMappingURL=registration-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration-client.d.ts","sourceRoot":"","sources":["../../src/utils/registration-client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,kFAA8F,CAAC;AAEpI;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CA6BjC"}
@@ -0,0 +1,57 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { errorMessage } from '@pipeline-builder/api-core';
4
+ import { PIPELINE_REGISTRATION_CAPABILITY, PIPELINE_REGISTRATION_SECRET_ENV, PIPELINE_REGISTRATION_SECRET_LEAF } from '@pipeline-builder/pipeline-core';
5
+ import { ApiClient } from './api-client.js';
6
+ import { getSecretValue } from './aws-secrets.js';
7
+ import { printInfo, printWarning } from './output-utils.js';
8
+ import { secretNameForOrg } from './platform-secret.js';
9
+ /** The command that provisions the registration key, named in every skip warning. */
10
+ export const REGISTRATION_KEY_COMMAND = `pipeline-manager infra store-token --scope ${PIPELINE_REGISTRATION_CAPABILITY} --schedule`;
11
+ /**
12
+ * The client a pipeline-registry write (`POST /pipelines/registry`) is made with.
13
+ *
14
+ * - **A person's credential** (`auth login`, or a `PLATFORM_TOKEN` they set):
15
+ * the same client. People hold `pipeline_registry:write` beside
16
+ * `pipelines:write` through the Member and Admin Roles.
17
+ * - **The stored machine credential** (`--store-tokens`): NOT that client. The
18
+ * `platform` key holds the Pipeline Automation Role — pipeline and plugin reads
19
+ * only — so the registration goes out on the separate `pipeline-register` key,
20
+ * read from the secret named by `PIPELINE_REGISTRATION_SECRET_NAME` (the synth
21
+ * CodeBuild project carries it) or derived from the pipeline's org.
22
+ *
23
+ * There is no fallback to the platform key. When the registration key is absent
24
+ * or unreadable this returns `undefined` after a loud warning naming the
25
+ * `store-token` command that provisions it, and the caller skips registering —
26
+ * a stale step manifest is reported, a broken synth is not acceptable.
27
+ */
28
+ export async function resolveRegistrationClient(opts) {
29
+ if (!opts.storeTokens)
30
+ return opts.client;
31
+ const secretName = process.env[PIPELINE_REGISTRATION_SECRET_ENV]
32
+ || (opts.orgId ? secretNameForOrg(opts.orgId, PIPELINE_REGISTRATION_SECRET_LEAF) : undefined);
33
+ if (!secretName) {
34
+ printWarning(`SKIPPING pipeline registration: no ${PIPELINE_REGISTRATION_SECRET_ENV} and no orgId to derive the registration key's secret from. `
35
+ + `The stored platform key cannot register pipelines. Provision the registration key with: ${REGISTRATION_KEY_COMMAND}`);
36
+ return undefined;
37
+ }
38
+ let key;
39
+ try {
40
+ const secret = JSON.parse(await getSecretValue(secretName, { region: opts.region, profile: opts.profile }));
41
+ key = secret.password;
42
+ }
43
+ catch (err) {
44
+ printWarning(`SKIPPING pipeline registration: could not read the registration key from ${secretName} (${errorMessage(err)}). `
45
+ + 'The stored platform key cannot register pipelines, so the platform\'s step manifest for this pipeline is now stale. '
46
+ + `Provision the registration key with: ${REGISTRATION_KEY_COMMAND}`);
47
+ return undefined;
48
+ }
49
+ if (!key) {
50
+ printWarning(`SKIPPING pipeline registration: ${secretName} holds no key (password field). Re-provision it with: ${REGISTRATION_KEY_COMMAND}`);
51
+ return undefined;
52
+ }
53
+ printInfo('Registering with the pipeline-registration key', { secret: secretName });
54
+ const config = opts.client.getConfig();
55
+ return new ApiClient({ ...config, auth: { ...config.auth, token: key } });
56
+ }
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cmF0aW9uLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9yZWdpc3RyYXRpb24tY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxnQ0FBZ0MsRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hKLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxxRkFBcUY7QUFDckYsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsOENBQThDLGdDQUFnQyxhQUFhLENBQUM7QUFFcEk7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHlCQUF5QixDQUFDLElBTS9DO0lBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBRTFDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLENBQUM7V0FDM0QsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixZQUFZLENBQUMsc0NBQXNDLGdDQUFnQyw4REFBOEQ7Y0FDN0ksMkZBQTJGLHdCQUF3QixFQUFFLENBQUMsQ0FBQztRQUMzSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxHQUF1QixDQUFDO0lBQzVCLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxjQUFjLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUEwQixDQUFDO1FBQ3JJLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3hCLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsWUFBWSxDQUFDLDRFQUE0RSxVQUFVLEtBQUssWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLO2NBQzFILHNIQUFzSDtjQUN0SCx3Q0FBd0Msd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCxZQUFZLENBQUMsbUNBQW1DLFVBQVUseURBQXlELHdCQUF3QixFQUFFLENBQUMsQ0FBQztRQUMvSSxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsU0FBUyxDQUFDLGdEQUFnRCxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDcEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN2QyxPQUFPLElBQUksU0FBUyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBQSVBFTElORV9SRUdJU1RSQVRJT05fQ0FQQUJJTElUWSwgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9FTlYsIFBJUEVMSU5FX1JFR0lTVFJBVElPTl9TRUNSRVRfTEVBRiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHsgQXBpQ2xpZW50IH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcbmltcG9ydCB7IGdldFNlY3JldFZhbHVlIH0gZnJvbSAnLi9hd3Mtc2VjcmV0cy5qcyc7XG5pbXBvcnQgeyBwcmludEluZm8sIHByaW50V2FybmluZyB9IGZyb20gJy4vb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IHNlY3JldE5hbWVGb3JPcmcgfSBmcm9tICcuL3BsYXRmb3JtLXNlY3JldC5qcyc7XG5cbi8qKiBUaGUgY29tbWFuZCB0aGF0IHByb3Zpc2lvbnMgdGhlIHJlZ2lzdHJhdGlvbiBrZXksIG5hbWVkIGluIGV2ZXJ5IHNraXAgd2FybmluZy4gKi9cbmV4cG9ydCBjb25zdCBSRUdJU1RSQVRJT05fS0VZX0NPTU1BTkQgPSBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlICR7UElQRUxJTkVfUkVHSVNUUkFUSU9OX0NBUEFCSUxJVFl9IC0tc2NoZWR1bGVgO1xuXG4vKipcbiAqIFRoZSBjbGllbnQgYSBwaXBlbGluZS1yZWdpc3RyeSB3cml0ZSAoYFBPU1QgL3BpcGVsaW5lcy9yZWdpc3RyeWApIGlzIG1hZGUgd2l0aC5cbiAqXG4gKiAtICoqQSBwZXJzb24ncyBjcmVkZW50aWFsKiogKGBhdXRoIGxvZ2luYCwgb3IgYSBgUExBVEZPUk1fVE9LRU5gIHRoZXkgc2V0KTpcbiAqICAgdGhlIHNhbWUgY2xpZW50LiBQZW9wbGUgaG9sZCBgcGlwZWxpbmVfcmVnaXN0cnk6d3JpdGVgIGJlc2lkZVxuICogICBgcGlwZWxpbmVzOndyaXRlYCB0aHJvdWdoIHRoZSBNZW1iZXIgYW5kIEFkbWluIFJvbGVzLlxuICogLSAqKlRoZSBzdG9yZWQgbWFjaGluZSBjcmVkZW50aWFsKiogKGAtLXN0b3JlLXRva2Vuc2ApOiBOT1QgdGhhdCBjbGllbnQuIFRoZVxuICogICBgcGxhdGZvcm1gIGtleSBob2xkcyB0aGUgUGlwZWxpbmUgQXV0b21hdGlvbiBSb2xlIOKAlCBwaXBlbGluZSBhbmQgcGx1Z2luIHJlYWRzXG4gKiAgIG9ubHkg4oCUIHNvIHRoZSByZWdpc3RyYXRpb24gZ29lcyBvdXQgb24gdGhlIHNlcGFyYXRlIGBwaXBlbGluZS1yZWdpc3RlcmAga2V5LFxuICogICByZWFkIGZyb20gdGhlIHNlY3JldCBuYW1lZCBieSBgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9OQU1FYCAodGhlIHN5bnRoXG4gKiAgIENvZGVCdWlsZCBwcm9qZWN0IGNhcnJpZXMgaXQpIG9yIGRlcml2ZWQgZnJvbSB0aGUgcGlwZWxpbmUncyBvcmcuXG4gKlxuICogVGhlcmUgaXMgbm8gZmFsbGJhY2sgdG8gdGhlIHBsYXRmb3JtIGtleS4gV2hlbiB0aGUgcmVnaXN0cmF0aW9uIGtleSBpcyBhYnNlbnRcbiAqIG9yIHVucmVhZGFibGUgdGhpcyByZXR1cm5zIGB1bmRlZmluZWRgIGFmdGVyIGEgbG91ZCB3YXJuaW5nIG5hbWluZyB0aGVcbiAqIGBzdG9yZS10b2tlbmAgY29tbWFuZCB0aGF0IHByb3Zpc2lvbnMgaXQsIGFuZCB0aGUgY2FsbGVyIHNraXBzIHJlZ2lzdGVyaW5nIOKAlFxuICogYSBzdGFsZSBzdGVwIG1hbmlmZXN0IGlzIHJlcG9ydGVkLCBhIGJyb2tlbiBzeW50aCBpcyBub3QgYWNjZXB0YWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVSZWdpc3RyYXRpb25DbGllbnQob3B0czoge1xuICBjbGllbnQ6IEFwaUNsaWVudDtcbiAgc3RvcmVUb2tlbnM/OiBib29sZWFuO1xuICBvcmdJZD86IHN0cmluZztcbiAgcmVnaW9uPzogc3RyaW5nO1xuICBwcm9maWxlPzogc3RyaW5nO1xufSk6IFByb21pc2U8QXBpQ2xpZW50IHwgdW5kZWZpbmVkPiB7XG4gIGlmICghb3B0cy5zdG9yZVRva2VucykgcmV0dXJuIG9wdHMuY2xpZW50O1xuXG4gIGNvbnN0IHNlY3JldE5hbWUgPSBwcm9jZXNzLmVudltQSVBFTElORV9SRUdJU1RSQVRJT05fU0VDUkVUX0VOVl1cbiAgICB8fCAob3B0cy5vcmdJZCA/IHNlY3JldE5hbWVGb3JPcmcob3B0cy5vcmdJZCwgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9MRUFGKSA6IHVuZGVmaW5lZCk7XG4gIGlmICghc2VjcmV0TmFtZSkge1xuICAgIHByaW50V2FybmluZyhgU0tJUFBJTkcgcGlwZWxpbmUgcmVnaXN0cmF0aW9uOiBubyAke1BJUEVMSU5FX1JFR0lTVFJBVElPTl9TRUNSRVRfRU5WfSBhbmQgbm8gb3JnSWQgdG8gZGVyaXZlIHRoZSByZWdpc3RyYXRpb24ga2V5J3Mgc2VjcmV0IGZyb20uIGBcbiAgICAgICsgYFRoZSBzdG9yZWQgcGxhdGZvcm0ga2V5IGNhbm5vdCByZWdpc3RlciBwaXBlbGluZXMuIFByb3Zpc2lvbiB0aGUgcmVnaXN0cmF0aW9uIGtleSB3aXRoOiAke1JFR0lTVFJBVElPTl9LRVlfQ09NTUFORH1gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGNvbnN0IHNlY3JldCA9IEpTT04ucGFyc2UoYXdhaXQgZ2V0U2VjcmV0VmFsdWUoc2VjcmV0TmFtZSwgeyByZWdpb246IG9wdHMucmVnaW9uLCBwcm9maWxlOiBvcHRzLnByb2ZpbGUgfSkpIGFzIHsgcGFzc3dvcmQ/OiBzdHJpbmcgfTtcbiAgICBrZXkgPSBzZWNyZXQucGFzc3dvcmQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHByaW50V2FybmluZyhgU0tJUFBJTkcgcGlwZWxpbmUgcmVnaXN0cmF0aW9uOiBjb3VsZCBub3QgcmVhZCB0aGUgcmVnaXN0cmF0aW9uIGtleSBmcm9tICR7c2VjcmV0TmFtZX0gKCR7ZXJyb3JNZXNzYWdlKGVycil9KS4gYFxuICAgICAgKyAnVGhlIHN0b3JlZCBwbGF0Zm9ybSBrZXkgY2Fubm90IHJlZ2lzdGVyIHBpcGVsaW5lcywgc28gdGhlIHBsYXRmb3JtXFwncyBzdGVwIG1hbmlmZXN0IGZvciB0aGlzIHBpcGVsaW5lIGlzIG5vdyBzdGFsZS4gJ1xuICAgICAgKyBgUHJvdmlzaW9uIHRoZSByZWdpc3RyYXRpb24ga2V5IHdpdGg6ICR7UkVHSVNUUkFUSU9OX0tFWV9DT01NQU5EfWApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKCFrZXkpIHtcbiAgICBwcmludFdhcm5pbmcoYFNLSVBQSU5HIHBpcGVsaW5lIHJlZ2lzdHJhdGlvbjogJHtzZWNyZXROYW1lfSBob2xkcyBubyBrZXkgKHBhc3N3b3JkIGZpZWxkKS4gUmUtcHJvdmlzaW9uIGl0IHdpdGg6ICR7UkVHSVNUUkFUSU9OX0tFWV9DT01NQU5EfWApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcmludEluZm8oJ1JlZ2lzdGVyaW5nIHdpdGggdGhlIHBpcGVsaW5lLXJlZ2lzdHJhdGlvbiBrZXknLCB7IHNlY3JldDogc2VjcmV0TmFtZSB9KTtcbiAgY29uc3QgY29uZmlnID0gb3B0cy5jbGllbnQuZ2V0Q29uZmlnKCk7XG4gIHJldHVybiBuZXcgQXBpQ2xpZW50KHsgLi4uY29uZmlnLCBhdXRoOiB7IC4uLmNvbmZpZy5hdXRoLCB0b2tlbjoga2V5IH0gfSk7XG59XG4iXX0=
@@ -0,0 +1,11 @@
1
+ /** The header the platform's quota attribution reads the pipeline from. */
2
+ export declare const PIPELINE_ID_HEADER = "X-Pipeline-Id";
3
+ /** Name the pipeline this invocation's platform calls are made for (unset with `undefined`). */
4
+ export declare function setPipelineId(id: string | undefined): void;
5
+ /** Adopt the command's execution id as this invocation's request id. */
6
+ export declare function setInvocationId(id: string): void;
7
+ /** This invocation's request id — the command's execution id, else a per-process uuid. */
8
+ export declare function getInvocationId(): string;
9
+ /** The correlation headers for this invocation (values sanitized, unknown ids omitted). */
10
+ export declare function requestCorrelationHeaders(env?: NodeJS.ProcessEnv): Record<string, string>;
11
+ //# sourceMappingURL=request-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/utils/request-context.ts"],"names":[],"mappings":"AA8BA,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,gGAAgG;AAChG,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE1D;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED,2FAA2F;AAC3F,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYtG"}
@@ -0,0 +1,62 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { randomUUID } from 'node:crypto';
4
+ import { correlationHeaders, sanitizeCorrelationValue } from '@pipeline-builder/pipeline-core';
5
+ /**
6
+ * The audit-correlation headers every platform call from this CLI carries, so
7
+ * a server-side audit row joins back to the run that caused it.
8
+ *
9
+ * - `X-Request-Id` — the command's execution id (the `[EXE-…]` printed in the
10
+ * header and the local audit log), or a uuid for this process when no command
11
+ * header was printed.
12
+ * - `X-CodeBuild-Build-Id` — CODEBUILD_BUILD_ID (`<project>:<uuid>`) when running
13
+ * inside CodeBuild.
14
+ * - `X-Pipeline-Execution-Id` — PIPELINE_EXECUTION_ID, which the synth injects into
15
+ * every CodeBuild step from `#{codepipeline.PipelineExecutionId}`. Sent only
16
+ * when set: CODEBUILD_INITIATOR (`codepipeline/<name>`) names the pipeline, not
17
+ * the execution, so nothing is derived from it.
18
+ * - `X-Pipeline-Id` — the platform pipeline a command works on (synth, deploy,
19
+ * plugin verify, security-report), once the command knows it
20
+ * ({@link setPipelineId}). The quota service's usage ledger records it, so
21
+ * "what spent our calls?" can answer "this pipeline's builds".
22
+ *
23
+ * Never an ARN — nothing here can carry an AWS account id.
24
+ */
25
+ let invocationId;
26
+ let pipelineId;
27
+ /** The header the platform's quota attribution reads the pipeline from. */
28
+ export const PIPELINE_ID_HEADER = 'X-Pipeline-Id';
29
+ /** Name the pipeline this invocation's platform calls are made for (unset with `undefined`). */
30
+ export function setPipelineId(id) {
31
+ pipelineId = id;
32
+ }
33
+ /** Adopt the command's execution id as this invocation's request id. */
34
+ export function setInvocationId(id) {
35
+ invocationId = id;
36
+ }
37
+ /** This invocation's request id — the command's execution id, else a per-process uuid. */
38
+ export function getInvocationId() {
39
+ invocationId ??= randomUUID();
40
+ return invocationId;
41
+ }
42
+ /** The correlation headers for this invocation (values sanitized, unknown ids omitted). */
43
+ export function requestCorrelationHeaders(env = process.env) {
44
+ const inCodeBuild = Boolean(env.CODEBUILD_BUILD_ID);
45
+ const headers = correlationHeaders({
46
+ requestId: getInvocationId(),
47
+ codeBuildBuildId: inCodeBuild ? env.CODEBUILD_BUILD_ID : undefined,
48
+ pipelineExecutionId: inCodeBuild ? env.PIPELINE_EXECUTION_ID : undefined,
49
+ });
50
+ // Same sanitizer as the other ids: a value that isn't a plain id is dropped,
51
+ // never sent mangled.
52
+ const pipeline = sanitizeCorrelationValue(pipelineId);
53
+ if (pipeline)
54
+ headers[PIPELINE_ID_HEADER] = pipeline;
55
+ return headers;
56
+ }
57
+ /** @internal Test-only: forget the invocation id. */
58
+ export function _resetInvocationIdForTests() {
59
+ invocationId = undefined;
60
+ pipelineId = undefined;
61
+ }
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3JlcXVlc3QtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFL0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxJQUFJLFlBQWdDLENBQUM7QUFDckMsSUFBSSxVQUE4QixDQUFDO0FBRW5DLDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUM7QUFFbEQsZ0dBQWdHO0FBQ2hHLE1BQU0sVUFBVSxhQUFhLENBQUMsRUFBc0I7SUFDbEQsVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUNsQixDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sVUFBVSxlQUFlLENBQUMsRUFBVTtJQUN4QyxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLENBQUM7QUFFRCwwRkFBMEY7QUFDMUYsTUFBTSxVQUFVLGVBQWU7SUFDN0IsWUFBWSxLQUFLLFVBQVUsRUFBRSxDQUFDO0lBQzlCLE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCwyRkFBMkY7QUFDM0YsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEdBQUcsR0FBc0IsT0FBTyxDQUFDLEdBQUc7SUFDNUUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDO1FBQ2pDLFNBQVMsRUFBRSxlQUFlLEVBQUU7UUFDNUIsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbEUsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDekUsQ0FBQyxDQUFDO0lBQ0gsNkVBQTZFO0lBQzdFLHNCQUFzQjtJQUN0QixNQUFNLFFBQVEsR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0RCxJQUFJLFFBQVE7UUFBRSxPQUFPLENBQUMsa0JBQWtCLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDckQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELHFEQUFxRDtBQUNyRCxNQUFNLFVBQVUsMEJBQTBCO0lBQ3hDLFlBQVksR0FBRyxTQUFTLENBQUM7SUFDekIsVUFBVSxHQUFHLFNBQVMsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjb3JyZWxhdGlvbkhlYWRlcnMsIHNhbml0aXplQ29ycmVsYXRpb25WYWx1ZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuXG4vKipcbiAqIFRoZSBhdWRpdC1jb3JyZWxhdGlvbiBoZWFkZXJzIGV2ZXJ5IHBsYXRmb3JtIGNhbGwgZnJvbSB0aGlzIENMSSBjYXJyaWVzLCBzb1xuICogYSBzZXJ2ZXItc2lkZSBhdWRpdCByb3cgam9pbnMgYmFjayB0byB0aGUgcnVuIHRoYXQgY2F1c2VkIGl0LlxuICpcbiAqIC0gYFgtUmVxdWVzdC1JZGAg4oCUIHRoZSBjb21tYW5kJ3MgZXhlY3V0aW9uIGlkICh0aGUgYFtFWEUt4oCmXWAgcHJpbnRlZCBpbiB0aGVcbiAqICAgaGVhZGVyIGFuZCB0aGUgbG9jYWwgYXVkaXQgbG9nKSwgb3IgYSB1dWlkIGZvciB0aGlzIHByb2Nlc3Mgd2hlbiBubyBjb21tYW5kXG4gKiAgIGhlYWRlciB3YXMgcHJpbnRlZC5cbiAqIC0gYFgtQ29kZUJ1aWxkLUJ1aWxkLUlkYCDigJQgQ09ERUJVSUxEX0JVSUxEX0lEIChgPHByb2plY3Q+Ojx1dWlkPmApIHdoZW4gcnVubmluZ1xuICogICBpbnNpZGUgQ29kZUJ1aWxkLlxuICogLSBgWC1QaXBlbGluZS1FeGVjdXRpb24tSWRgIOKAlCBQSVBFTElORV9FWEVDVVRJT05fSUQsIHdoaWNoIHRoZSBzeW50aCBpbmplY3RzIGludG9cbiAqICAgZXZlcnkgQ29kZUJ1aWxkIHN0ZXAgZnJvbSBgI3tjb2RlcGlwZWxpbmUuUGlwZWxpbmVFeGVjdXRpb25JZH1gLiBTZW50IG9ubHlcbiAqICAgd2hlbiBzZXQ6IENPREVCVUlMRF9JTklUSUFUT1IgKGBjb2RlcGlwZWxpbmUvPG5hbWU+YCkgbmFtZXMgdGhlIHBpcGVsaW5lLCBub3RcbiAqICAgdGhlIGV4ZWN1dGlvbiwgc28gbm90aGluZyBpcyBkZXJpdmVkIGZyb20gaXQuXG4gKiAtIGBYLVBpcGVsaW5lLUlkYCDigJQgdGhlIHBsYXRmb3JtIHBpcGVsaW5lIGEgY29tbWFuZCB3b3JrcyBvbiAoc3ludGgsIGRlcGxveSxcbiAqICAgcGx1Z2luIHZlcmlmeSwgc2VjdXJpdHktcmVwb3J0KSwgb25jZSB0aGUgY29tbWFuZCBrbm93cyBpdFxuICogICAoe0BsaW5rIHNldFBpcGVsaW5lSWR9KS4gVGhlIHF1b3RhIHNlcnZpY2UncyB1c2FnZSBsZWRnZXIgcmVjb3JkcyBpdCwgc29cbiAqICAgXCJ3aGF0IHNwZW50IG91ciBjYWxscz9cIiBjYW4gYW5zd2VyIFwidGhpcyBwaXBlbGluZSdzIGJ1aWxkc1wiLlxuICpcbiAqIE5ldmVyIGFuIEFSTiDigJQgbm90aGluZyBoZXJlIGNhbiBjYXJyeSBhbiBBV1MgYWNjb3VudCBpZC5cbiAqL1xuXG5sZXQgaW52b2NhdGlvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgcGlwZWxpbmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4vKiogVGhlIGhlYWRlciB0aGUgcGxhdGZvcm0ncyBxdW90YSBhdHRyaWJ1dGlvbiByZWFkcyB0aGUgcGlwZWxpbmUgZnJvbS4gKi9cbmV4cG9ydCBjb25zdCBQSVBFTElORV9JRF9IRUFERVIgPSAnWC1QaXBlbGluZS1JZCc7XG5cbi8qKiBOYW1lIHRoZSBwaXBlbGluZSB0aGlzIGludm9jYXRpb24ncyBwbGF0Zm9ybSBjYWxscyBhcmUgbWFkZSBmb3IgKHVuc2V0IHdpdGggYHVuZGVmaW5lZGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFBpcGVsaW5lSWQoaWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBwaXBlbGluZUlkID0gaWQ7XG59XG5cbi8qKiBBZG9wdCB0aGUgY29tbWFuZCdzIGV4ZWN1dGlvbiBpZCBhcyB0aGlzIGludm9jYXRpb24ncyByZXF1ZXN0IGlkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEludm9jYXRpb25JZChpZDogc3RyaW5nKTogdm9pZCB7XG4gIGludm9jYXRpb25JZCA9IGlkO1xufVxuXG4vKiogVGhpcyBpbnZvY2F0aW9uJ3MgcmVxdWVzdCBpZCDigJQgdGhlIGNvbW1hbmQncyBleGVjdXRpb24gaWQsIGVsc2UgYSBwZXItcHJvY2VzcyB1dWlkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEludm9jYXRpb25JZCgpOiBzdHJpbmcge1xuICBpbnZvY2F0aW9uSWQgPz89IHJhbmRvbVVVSUQoKTtcbiAgcmV0dXJuIGludm9jYXRpb25JZDtcbn1cblxuLyoqIFRoZSBjb3JyZWxhdGlvbiBoZWFkZXJzIGZvciB0aGlzIGludm9jYXRpb24gKHZhbHVlcyBzYW5pdGl6ZWQsIHVua25vd24gaWRzIG9taXR0ZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RDb3JyZWxhdGlvbkhlYWRlcnMoZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHByb2Nlc3MuZW52KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGluQ29kZUJ1aWxkID0gQm9vbGVhbihlbnYuQ09ERUJVSUxEX0JVSUxEX0lEKTtcbiAgY29uc3QgaGVhZGVycyA9IGNvcnJlbGF0aW9uSGVhZGVycyh7XG4gICAgcmVxdWVzdElkOiBnZXRJbnZvY2F0aW9uSWQoKSxcbiAgICBjb2RlQnVpbGRCdWlsZElkOiBpbkNvZGVCdWlsZCA/IGVudi5DT0RFQlVJTERfQlVJTERfSUQgOiB1bmRlZmluZWQsXG4gICAgcGlwZWxpbmVFeGVjdXRpb25JZDogaW5Db2RlQnVpbGQgPyBlbnYuUElQRUxJTkVfRVhFQ1VUSU9OX0lEIDogdW5kZWZpbmVkLFxuICB9KTtcbiAgLy8gU2FtZSBzYW5pdGl6ZXIgYXMgdGhlIG90aGVyIGlkczogYSB2YWx1ZSB0aGF0IGlzbid0IGEgcGxhaW4gaWQgaXMgZHJvcHBlZCxcbiAgLy8gbmV2ZXIgc2VudCBtYW5nbGVkLlxuICBjb25zdCBwaXBlbGluZSA9IHNhbml0aXplQ29ycmVsYXRpb25WYWx1ZShwaXBlbGluZUlkKTtcbiAgaWYgKHBpcGVsaW5lKSBoZWFkZXJzW1BJUEVMSU5FX0lEX0hFQURFUl0gPSBwaXBlbGluZTtcbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5cbi8qKiBAaW50ZXJuYWwgVGVzdC1vbmx5OiBmb3JnZXQgdGhlIGludm9jYXRpb24gaWQuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0SW52b2NhdGlvbklkRm9yVGVzdHMoKTogdm9pZCB7XG4gIGludm9jYXRpb25JZCA9IHVuZGVmaW5lZDtcbiAgcGlwZWxpbmVJZCA9IHVuZGVmaW5lZDtcbn1cbiJdfQ==
@@ -1,3 +1,4 @@
1
+ import type { SeedBundleId } from '@pipeline-builder/api-core';
1
2
  import type { ApiClient } from './api-client.js';
2
3
  /** What the caller wants provisioned. */
3
4
  export interface ProvisionKeyOptions {
@@ -10,11 +11,12 @@ export interface ProvisionKeyOptions {
10
11
  /** Human description recorded on a newly created account. */
11
12
  description: string;
12
13
  /**
13
- * Roles to grant a NEWLY created account: `'admin'` for the full-privilege
14
- * platform credential (synth/deploy callbacks, plugin lookup, image push),
15
- * `'none'` for a scoped credential, which needs no Roles at all.
14
+ * The built-in Role (by seed bundle) to grant a NEWLY created account —
15
+ * `pipeline_automation` for the platform credential, `pipeline_registration`
16
+ * for the registration one. Absent for a scoped credential, which needs no
17
+ * Role at all.
16
18
  */
17
- roles: 'admin' | 'none';
19
+ role?: SeedBundleId;
18
20
  /** Narrow capability scope stamped on the KEY (not the account). */
19
21
  scope?: string;
20
22
  /** Key lifetime in seconds (platform caps this at 365 days). */
@@ -1 +1 @@
1
- {"version":3,"file":"service-account.d.ts","sourceRoot":"","sources":["../../src/utils/service-account.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMjD,yCAAyC;AACzC,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,MAAM,EAAE,SAAS,CAAC;IAClB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC7B,mFAAmF;IACnF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAiDD,iDAAiD;AACjD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9E;AA0DD,qFAAqF;AACrF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAKf;AAyCD;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAanG"}
1
+ {"version":3,"file":"service-account.d.ts","sourceRoot":"","sources":["../../src/utils/service-account.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMjD,yCAAyC;AACzC,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,MAAM,EAAE,SAAS,CAAC;IAClB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC7B,mFAAmF;IACnF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAiDD,iDAAiD;AACjD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9E;AA+DD,qFAAqF;AACrF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAKf;AAyCD;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAanG"}