@pipeline-builder/pipeline-core 4.4.3 → 4.4.4

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 (43) hide show
  1. package/lib/config/app-config.d.ts +1 -0
  2. package/lib/config/app-config.js +7 -1
  3. package/lib/config/config-types.d.ts +9 -0
  4. package/lib/config/config-types.js +1 -1
  5. package/lib/config/handler-constants.d.ts +7 -0
  6. package/lib/config/handler-constants.js +8 -1
  7. package/lib/config/infrastructure-config.js +2 -1
  8. package/lib/core/audit-correlation.d.ts +34 -0
  9. package/lib/core/audit-correlation.js +50 -0
  10. package/lib/core/pipeline-helpers.js +50 -6
  11. package/lib/core/pipeline-registration.d.ts +25 -0
  12. package/lib/core/pipeline-registration.js +28 -0
  13. package/lib/core/platform-tls.d.ts +43 -0
  14. package/lib/core/platform-tls.js +70 -0
  15. package/lib/core/plugin-contract.d.ts +8 -0
  16. package/lib/core/plugin-contract.js +15 -3
  17. package/lib/core/plugin-lookup-envelope.d.ts +30 -2
  18. package/lib/core/plugin-lookup-envelope.js +58 -7
  19. package/lib/core/quota-exceeded.d.ts +11 -0
  20. package/lib/core/quota-exceeded.js +44 -0
  21. package/lib/core/runtime-check.d.ts +53 -0
  22. package/lib/core/runtime-check.js +56 -0
  23. package/lib/core/security-reports.d.ts +26 -0
  24. package/lib/core/security-reports.js +28 -0
  25. package/lib/core/step-manifest.d.ts +7 -0
  26. package/lib/core/step-manifest.js +1 -1
  27. package/lib/core/synth-failure.d.ts +38 -0
  28. package/lib/core/synth-failure.js +63 -0
  29. package/lib/handlers/plugin-lookup-handler.d.ts +19 -2
  30. package/lib/handlers/plugin-lookup-handler.js +107 -17
  31. package/lib/index.d.ts +9 -2
  32. package/lib/index.js +10 -3
  33. package/lib/pipeline/pipeline-builder.js +55 -8
  34. package/lib/pipeline/plugin-lookup.d.ts +18 -1
  35. package/lib/pipeline/plugin-lookup.js +28 -7
  36. package/lib/pipeline/runtime-vuln-check-step.d.ts +29 -0
  37. package/lib/pipeline/runtime-vuln-check-step.js +36 -0
  38. package/lib/pipeline/stage-builder.d.ts +9 -0
  39. package/lib/pipeline/stage-builder.js +28 -7
  40. package/lib/pipeline/step-manifest-recorder.d.ts +2 -2
  41. package/lib/pipeline/step-manifest-recorder.js +8 -6
  42. package/lib/testing/exports.json +35 -0
  43. package/package.json +5 -4
@@ -137,6 +137,18 @@ function toRef(raw, path, label) {
137
137
  ...(filter ? { filter } : {}),
138
138
  };
139
139
  }
140
+ /**
141
+ * THE step label: `synth` for the synth step, else
142
+ * `<stageName>/<alias ?? [<publisher>/]name>`. Every per-step record keys on it —
143
+ * the lookup `context.stepKeys` synth sends (CLI pre-resolver and the deploy-time
144
+ * custom resource), the step manifest, the runtime check, the declared
145
+ * resolution rows and the pipeline security view that joins them.
146
+ */
147
+ export function pluginStepLabel(stageName, ref) {
148
+ if (stageName === null)
149
+ return 'synth';
150
+ return `${stageName}/${ref.alias ?? (ref.publisher ? `${ref.publisher}/${ref.name}` : ref.name)}`;
151
+ }
140
152
  /**
141
153
  * Every plugin reference in a pipeline's props: `synth.plugin`, then each
142
154
  * `stages[].steps[].plugin` in order. One entry per STEP (not de-duplicated) —
@@ -145,7 +157,7 @@ function toRef(raw, path, label) {
145
157
  export function collectPluginSteps(props) {
146
158
  const p = asRecord(props);
147
159
  const out = [];
148
- const synth = toRef(asRecord(p.synth).plugin, 'synth', () => 'synth');
160
+ const synth = toRef(asRecord(p.synth).plugin, 'synth', (name) => pluginStepLabel(null, { name }));
149
161
  if (synth)
150
162
  out.push(synth);
151
163
  const stages = Array.isArray(p.stages) ? p.stages : [];
@@ -154,7 +166,7 @@ export function collectPluginSteps(props) {
154
166
  const stageName = typeof s.stageName === 'string' ? s.stageName : `stage ${i + 1}`;
155
167
  const steps = Array.isArray(s.steps) ? s.steps : [];
156
168
  steps.forEach((step, j) => {
157
- const ref = toRef(asRecord(step).plugin, `stages[${i}].steps[${j}]`, (name, alias, publisher) => `${stageName}/${alias ?? (publisher ? `${publisher}/${name}` : name)}`);
169
+ const ref = toRef(asRecord(step).plugin, `stages[${i}].steps[${j}]`, (name, alias, publisher) => pluginStepLabel(stageName, { name, alias, publisher }));
158
170
  if (ref)
159
171
  out.push(ref);
160
172
  });
@@ -214,4 +226,4 @@ export function pluginStepIdAlias(plugin) {
214
226
  // `??`, not `||`: an explicit (even empty) alias keeps the id it always had.
215
227
  return plugin.alias ?? (plugin.publisher ? `${sanitizePublisher(plugin.publisher)}-${plugin.name}` : plugin.name);
216
228
  }
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGx1Z2luLWNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFzQzlDLFNBQVMsUUFBUSxDQUFDLENBQVU7SUFDMUIsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBNEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzdGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQXlCO0lBQzdELE9BQU8sS0FBSyxDQUNWLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFpQixFQUN0QyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQWlCLEVBQzNELFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBaUIsQ0FDekQsQ0FBQztBQUNKLENBQUM7QUFFRCxvRkFBb0Y7QUFDcEYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQXlCO0lBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNoRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLDhCQUE4QixDQUFDLGFBQWdEO0lBQzdGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEQs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QUFDO0lBQ3RDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQztBQUNuSCxDQUFDO0FBVUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFNBQWlCO0lBQ2pELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQXlCO0lBQ3pELDZFQUE2RTtJQUM3RSxPQUFPLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGx1Z2luIGNvbnRyYWN0IGVuZm9yY2VtZW50LiBBIHBsdWdpbiBzcGVjIGRlY2xhcmVzXG4gKiB0aGUgYHt7IHBpcGVsaW5lLm1ldGFkYXRhLlggfX1gIC8gYHt7IHBpcGVsaW5lLnZhcnMuWCB9fWAga2V5cyBhIHBpcGVsaW5lXG4gKiBtdXN0IHN1cHBseSAoYHJlcXVpcmVkTWV0YWRhdGFgIC8gYHJlcXVpcmVkVmFyc2ApIGFuZCB0aGUgY29lcmNpb24gdHlwZSBvZlxuICogZWFjaCAoYG1ldGFkYXRhVHlwZXNgIC8gYHZhcnNUeXBlc2ApLiBUaGUgdXBsb2FkIHZhbGlkYXRlcyB0aGUgc3BlYyBhZ2FpbnN0XG4gKiBpdHMgb3duIHRlbXBsYXRlczsgdGhpcyBtb2R1bGUgY2hlY2tzIGEgUElQRUxJTkUgYWdhaW5zdCB0aGUgY29udHJhY3RzIG9mXG4gKiB0aGUgcGx1Z2lucyBpdCByZWZlcmVuY2VzLlxuICpcbiAqIENESy1mcmVlOiBzaGFyZWQgYnkgdGhlIHBpcGVsaW5lIHNlcnZpY2UgKGNyZWF0ZSAvIHVwZGF0ZSDihpIgNDAwIGxpc3RpbmdcbiAqIGV2ZXJ5IHByb2JsZW0gcGVyIHN0ZXApIGFuZCB0aGUgc3ludGggKGZhaWwgZmFzdCBmb3IgYSBwaXBlbGluZSB0aGF0IG5ldmVyXG4gKiB3ZW50IHRocm91Z2ggdGhlIEFQSSwgZS5nLiBhIENMSS1hdXRob3JlZCBwcm9wcyBmaWxlKS5cbiAqXG4gKiBUaGUgY2hlY2tzIG1pcnJvciB0aGUgdGVtcGxhdGUgZXZhbHVhdG9yIChgdGVtcGxhdGUvZXZhbHVhdG9yLnRzYCkgZXhhY3RseSxcbiAqIHNvIFwicGFzc2VzIGhlcmVcIiBtZWFucyBcInJlc29sdmVzIGF0IHN5bnRoXCI6XG4gKiAgIC0gYSBrZXkgaXMgTUlTU0lORyB3aGVuIGFic2VudCwgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nICh0aGUgZXZhbHVhdG9yXG4gKiAgICAgZmFsbHMgdG8gYHwgZGVmYXVsdDpgIG9yIGZhaWxzIGZvciBhbGwgdGhyZWUpO1xuICogICAtIGFuIG9iamVjdC9hcnJheSB2YWx1ZSBuZXZlciBpbnRlcnBvbGF0ZXM7XG4gKiAgIC0gYG51bWJlcmAgLyBgYm9vbGAgLyBganNvbmAgYWNjZXB0IHdoYXQgdGhlIGB8IG51bWJlcmAgLyBgfCBib29sYCAvXG4gKiAgICAgYHwganNvbmAgZmlsdGVycyBhY2NlcHQgYWZ0ZXIgc3RyaW5naWZpY2F0aW9uLlxuICovXG5cbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnLi9tZXRhZGF0YS1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgTWV0YURhdGFUeXBlIH0gZnJvbSAnLi9waXBlbGluZS10eXBlcy5qcyc7XG5cbi8qKiBEZWNsYXJlZCBjb2VyY2lvbiB0eXBlIG9mIGEgY29udHJhY3Qga2V5LiAqL1xuZXhwb3J0IHR5cGUgQ29udHJhY3RWYWx1ZVR5cGUgPSAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2wnIHwgJ2pzb24nO1xuXG4vKiogVGhlIGNvbnRyYWN0IGZpZWxkcyBvZiBhIHBsdWdpbiByZWNvcmQgKGFzIGBwbHVnaW5zYCBzdG9yZXMgdGhlbSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbnRyYWN0IHtcbiAgcmVhZG9ubHkgcmVxdWlyZWRNZXRhZGF0YT86IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbDtcbiAgcmVhZG9ubHkgcmVxdWlyZWRWYXJzPzogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsO1xuICByZWFkb25seSBtZXRhZGF0YVR5cGVzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ29udHJhY3RWYWx1ZVR5cGU+PiB8IG51bGw7XG4gIHJlYWRvbmx5IHZhcnNUeXBlcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENvbnRyYWN0VmFsdWVUeXBlPj4gfCBudWxsO1xufVxuXG4vKiogV2hhdCBge3sgcGlwZWxpbmUubWV0YWRhdGEuKiB9fWAgYW5kIGB7eyBwaXBlbGluZS52YXJzLiogfX1gIHJlc29sdmUgYWdhaW5zdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJhY3RTY29wZSB7XG4gIHJlYWRvbmx5IG1ldGFkYXRhOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIHJlYWRvbmx5IHZhcnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuLyoqIE9uZSB1bm1ldCBjb250cmFjdCBrZXkuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyYWN0SXNzdWUge1xuICByZWFkb25seSBraW5kOiAnbWV0YWRhdGEnIHwgJ3ZhcnMnO1xuICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvYmxlbTogJ21pc3NpbmcnIHwgJ3R5cGUnO1xuICAvKiogVGhlIGRlY2xhcmVkIHR5cGUsIGZvciBhIGB0eXBlYCBwcm9ibGVtLiAqL1xuICByZWFkb25seSBleHBlY3RlZD86IENvbnRyYWN0VmFsdWVUeXBlO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgcGlwZWxpbmUtcHJvcHMgZmllbGRzIHRoZSBjb250cmFjdCBzY29wZSBpcyBidWlsdCBmcm9tIChCdWlsZGVyUHJvcHMgc3Vic2V0KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJhY3RTY29wZVByb3BzIHtcbiAgcmVhZG9ubHkgZ2xvYmFsPzogdW5rbm93bjtcbiAgcmVhZG9ubHkgZGVmYXVsdHM/OiB1bmtub3duO1xuICByZWFkb25seSBzeW50aD86IHVua25vd247XG4gIHJlYWRvbmx5IHZhcnM/OiB1bmtub3duO1xufVxuXG5mdW5jdGlvbiBhc1JlY29yZCh2OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodikgPyB2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IDoge307XG59XG5cbi8qKlxuICogYHBpcGVsaW5lLm1ldGFkYXRhYCBhcyBzeW50aCBidWlsZHMgaXQ6IGBnbG9iYWxgIOKGkCBgZGVmYXVsdHMubWV0YWRhdGFgIOKGkFxuICogYHN5bnRoLm1ldGFkYXRhYCAobGFzdCB3aW5zKS4gVGhlIHNpbmdsZSBkZWZpbml0aW9uIOKAlCBgUGlwZWxpbmVDb25maWd1cmF0aW9uYFxuICogdXNlcyBpdCB0b28sIHNvIHRoZSBBUEkgY2hlY2sgYW5kIHRoZSBzeW50aCBzY29wZSBjYW5ub3QgZHJpZnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaXBlbGluZVNjb3BlTWV0YWRhdGEocHJvcHM6IENvbnRyYWN0U2NvcGVQcm9wcyk6IE1ldGFEYXRhVHlwZSB7XG4gIHJldHVybiBtZXJnZShcbiAgICBhc1JlY29yZChwcm9wcy5nbG9iYWwpIGFzIE1ldGFEYXRhVHlwZSxcbiAgICBhc1JlY29yZChhc1JlY29yZChwcm9wcy5kZWZhdWx0cykubWV0YWRhdGEpIGFzIE1ldGFEYXRhVHlwZSxcbiAgICBhc1JlY29yZChhc1JlY29yZChwcm9wcy5zeW50aCkubWV0YWRhdGEpIGFzIE1ldGFEYXRhVHlwZSxcbiAgKTtcbn1cblxuLyoqIFRoZSBjb250cmFjdCBzY29wZSBvZiBhIHBpcGVsaW5lJ3MgcHJvcHMgKHNlZSB7QGxpbmsgcGlwZWxpbmVTY29wZU1ldGFkYXRhfSkuICovXG5leHBvcnQgZnVuY3Rpb24gcGlwZWxpbmVDb250cmFjdFNjb3BlKHByb3BzOiBDb250cmFjdFNjb3BlUHJvcHMpOiBDb250cmFjdFNjb3BlIHtcbiAgcmV0dXJuIHsgbWV0YWRhdGE6IHBpcGVsaW5lU2NvcGVNZXRhZGF0YShwcm9wcyksIHZhcnM6IGFzUmVjb3JkKHByb3BzLnZhcnMpIH07XG59XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IHNjb3BlIGluc2lkZSBhIHN5bnRoIHRlbXBsYXRlIHNjb3BlIChgeyBwaXBlbGluZTogeyBtZXRhZGF0YSxcbiAqIHZhcnMsIOKApiB9IH1gLCBzZWUgYFBpcGVsaW5lQ29uZmlndXJhdGlvbi5nZXRQaXBlbGluZVNjb3BlYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cmFjdFNjb3BlRnJvbVRlbXBsYXRlU2NvcGUodGVtcGxhdGVTY29wZTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogQ29udHJhY3RTY29wZSB7XG4gIGNvbnN0IHBpcGVsaW5lID0gYXNSZWNvcmQodGVtcGxhdGVTY29wZS5waXBlbGluZSk7XG4gIHJldHVybiB7IG1ldGFkYXRhOiBhc1JlY29yZChwaXBlbGluZS5tZXRhZGF0YSksIHZhcnM6IGFzUmVjb3JkKHBpcGVsaW5lLnZhcnMpIH07XG59XG5cbi8qKiBXb3VsZCB0aGUgZXZhbHVhdG9yIHRyZWF0IGB2YWx1ZWAgYXMgYWJzZW50IChtaXNzaW5nIC8gbnVsbCAvIGVtcHR5IHN0cmluZyk/ICovXG5mdW5jdGlvbiBpc01pc3NpbmcodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnO1xufVxuXG4vKipcbiAqIERvZXMgYHZhbHVlYCBzYXRpc2Z5IHRoZSBkZWNsYXJlZCBgdHlwZWAgb25jZSBpbnRlcnBvbGF0ZWQ/IE1pcnJvcnMgdGhlXG4gKiBldmFsdWF0b3IncyBgcmVzb2x2ZU9uZWAgKG9iamVjdHMgbmV2ZXIgaW50ZXJwb2xhdGUpIGFuZCBgYXBwbHlDb2VyY2lvbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRyYWN0VmFsdWVPZlR5cGUodmFsdWU6IHVua25vd24sIHR5cGU6IENvbnRyYWN0VmFsdWVUeXBlKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJhdyA9IFN0cmluZyh2YWx1ZSk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShOdW1iZXIocmF3KSk7XG4gICAgY2FzZSAnYm9vbCc6XG4gICAgICByZXR1cm4gWyd0cnVlJywgJzEnLCAneWVzJywgJ2ZhbHNlJywgJzAnLCAnbm8nLCAnJ10uaW5jbHVkZXMocmF3LnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjYXNlICdqc29uJzpcbiAgICAgIHRyeSB7XG4gICAgICAgIEpTT04ucGFyc2UocmF3KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICB9XG59XG5cbi8qKiBBIHZhbHVlIHN0aWxsIGNhcnJ5aW5nIGB7eyDigKYgfX1gIGlzIHJlc29sdmVkIGxhdGVyIChwaXBlbGluZSBwYXNzIDEpLCBzbyBpdHMgdHlwZSBjYW4ndCBiZSBqdWRnZWQgeWV0LiAqL1xuZnVuY3Rpb24gaXNVbnJlc29sdmVkVGVtcGxhdGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuaW5jbHVkZXMoJ3t7Jyk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrS2luZChcbiAga2luZDogJ21ldGFkYXRhJyB8ICd2YXJzJyxcbiAgcmVxdWlyZWQ6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdHlwZXM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENvbnRyYWN0VmFsdWVUeXBlPj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBzdXBwbGllZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuKTogQ29udHJhY3RJc3N1ZVtdIHtcbiAgY29uc3QgaXNzdWVzOiBDb250cmFjdElzc3VlW10gPSBbXTtcbiAgY29uc3Qgd2hlcmUgPSBraW5kID09PSAnbWV0YWRhdGEnID8gJ21ldGFkYXRhIChnbG9iYWwgLyBkZWZhdWx0cy5tZXRhZGF0YSAvIHN5bnRoLm1ldGFkYXRhKScgOiAndmFycyc7XG4gIGZvciAoY29uc3Qga2V5IG9mIG5ldyBTZXQocmVxdWlyZWQgPz8gW10pKSB7XG4gICAgaWYgKGlzTWlzc2luZyhzdXBwbGllZFtrZXldKSkge1xuICAgICAgaXNzdWVzLnB1c2goeyBraW5kLCBrZXksIHByb2JsZW06ICdtaXNzaW5nJywgbWVzc2FnZTogYHBpcGVsaW5lICR7d2hlcmV9IG11c3Qgc3VwcGx5ICcke2tleX0nYCB9KTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCBleHBlY3RlZF0gb2YgT2JqZWN0LmVudHJpZXModHlwZXMgPz8ge30pKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdXBwbGllZFtrZXldO1xuICAgIGlmIChpc01pc3NpbmcodmFsdWUpIHx8IGlzVW5yZXNvbHZlZFRlbXBsYXRlKHZhbHVlKSkgY29udGludWU7XG4gICAgaWYgKCFpc0NvbnRyYWN0VmFsdWVPZlR5cGUodmFsdWUsIGV4cGVjdGVkKSkge1xuICAgICAgY29uc3QgZ290ID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IChBcnJheS5pc0FycmF5KHZhbHVlKSA/ICdhbiBhcnJheScgOiAnYW4gb2JqZWN0JykgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICBpc3N1ZXMucHVzaCh7IGtpbmQsIGtleSwgcHJvYmxlbTogJ3R5cGUnLCBleHBlY3RlZCwgbWVzc2FnZTogYHBpcGVsaW5lICR7a2luZH0uJHtrZXl9IG11c3QgYmUgYSAke2V4cGVjdGVkfSwgZ290ICR7Z290fWAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpc3N1ZXM7XG59XG5cbi8qKlxuICogQ2hlY2sgb25lIHBsdWdpbidzIGNvbnRyYWN0IGFnYWluc3QgdGhlIHBpcGVsaW5lJ3Mgc2NvcGUuIFJldHVybnMgZXZlcnlcbiAqIGlzc3VlIChtaXNzaW5nIGtleXMgZmlyc3QsIHRoZW4gaWxsLXR5cGVkIG9uZXMsIG1ldGFkYXRhIGJlZm9yZSB2YXJzKTtcbiAqIGVtcHR5IHdoZW4gdGhlIGNvbnRyYWN0IGlzIG1ldC4gRGVjbGFyZWQgdHlwZXMgYXJlIGNoZWNrZWQgZm9yIGV2ZXJ5XG4gKiBTVVBQTElFRCBrZXksIHJlcXVpcmVkIG9yIG5vdCAoYW4gb3B0aW9uYWwga2V5IHdpdGggYSBgfCBkZWZhdWx0OmAgaXMgc3RpbGxcbiAqIGNvZXJjZWQgd2hlbiBpdCBpcyBzdXBwbGllZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BsdWdpbkNvbnRyYWN0KGNvbnRyYWN0OiBQbHVnaW5Db250cmFjdCwgc2NvcGU6IENvbnRyYWN0U2NvcGUpOiBDb250cmFjdElzc3VlW10ge1xuICByZXR1cm4gW1xuICAgIC4uLmNoZWNrS2luZCgnbWV0YWRhdGEnLCBjb250cmFjdC5yZXF1aXJlZE1ldGFkYXRhLCBjb250cmFjdC5tZXRhZGF0YVR5cGVzLCBzY29wZS5tZXRhZGF0YSksXG4gICAgLi4uY2hlY2tLaW5kKCd2YXJzJywgY29udHJhY3QucmVxdWlyZWRWYXJzLCBjb250cmFjdC52YXJzVHlwZXMsIHNjb3BlLnZhcnMpLFxuICBdO1xufVxuXG4vKipcbiAqIFN5bnRoLXRpbWUgZ3VhcmQ6IHRocm93IHdoZW4gYHBsdWdpbmAgKHJlc29sdmVkIGZvciBgc3RlcGApIGhhcyB1bm1ldFxuICogY29udHJhY3Qga2V5cy4gVGhlIEFQSSByZWZ1c2VzIHN1Y2ggYSBwaXBlbGluZSBhdCBjcmVhdGUvdXBkYXRlOyB0aGlzXG4gKiBjYXRjaGVzIG9uZSB0aGF0IHJlYWNoZWQgc3ludGggYW5vdGhlciB3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQbHVnaW5Db250cmFjdChcbiAgcGx1Z2luOiBQbHVnaW5Db250cmFjdCAmIHsgcmVhZG9ubHkgbmFtZTogc3RyaW5nOyByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nIH0sXG4gIHNjb3BlOiBDb250cmFjdFNjb3BlLFxuICBzdGVwOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3QgaXNzdWVzID0gY2hlY2tQbHVnaW5Db250cmFjdChwbHVnaW4sIHNjb3BlKTtcbiAgaWYgKGlzc3Vlcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBTdGVwIFwiJHtzdGVwfVwiIHVzZXMgcGx1Z2luIFwiJHtwbHVnaW4ubmFtZX0ke3BsdWdpbi52ZXJzaW9uID8gYEAke3BsdWdpbi52ZXJzaW9ufWAgOiAnJ31cIiB3aG9zZSBjb250cmFjdCBpcyBub3QgbWV0OlxcbmBcbiAgICArIGlzc3Vlcy5tYXAoKGkpID0+IGAgIOKAoiAke2kubWVzc2FnZX1gKS5qb2luKCdcXG4nKSxcbiAgKTtcbn1cblxuLyoqIEEgcGx1Z2luIHJlZmVyZW5jZSBpbiBwaXBlbGluZSBwcm9wcywgd2l0aCB3aGVyZSBpdCBzaXRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TdGVwUmVmIHtcbiAgLyoqIEpTT04gcGF0aCBvZiB0aGUgc3RlcDogYHN5bnRoYCBvciBgc3RhZ2VzW2ldLnN0ZXBzW2pdYC4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAvKiogSHVtYW4gbGFiZWw6IGBzeW50aGAgb3IgYDxzdGFnZU5hbWU+LzxhbGlhcyA/PyBuYW1lPmAuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFB1Ymxpc2hlciBoYW5kbGUgb2YgYW4gaW5zdGFsbGVkIGxpc3RpbmcuICovXG4gIHJlYWRvbmx5IHB1Ymxpc2hlcj86IHN0cmluZztcbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZpbHRlcj86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuZnVuY3Rpb24gdG9SZWYocmF3OiB1bmtub3duLCBwYXRoOiBzdHJpbmcsIGxhYmVsOiAobmFtZTogc3RyaW5nLCBhbGlhcz86IHN0cmluZywgcHVibGlzaGVyPzogc3RyaW5nKSA9PiBzdHJpbmcpOiBQbHVnaW5TdGVwUmVmIHwgbnVsbCB7XG4gIGNvbnN0IHIgPSBhc1JlY29yZChyYXcpO1xuICBpZiAodHlwZW9mIHIubmFtZSAhPT0gJ3N0cmluZycgfHwgci5uYW1lLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFsaWFzID0gdHlwZW9mIHIuYWxpYXMgPT09ICdzdHJpbmcnID8gci5hbGlhcyA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcHVibGlzaGVyID0gdHlwZW9mIHIucHVibGlzaGVyID09PSAnc3RyaW5nJyAmJiByLnB1Ymxpc2hlci5sZW5ndGggPiAwID8gci5wdWJsaXNoZXIgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbHRlciA9IHIuZmlsdGVyICYmIHR5cGVvZiByLmZpbHRlciA9PT0gJ29iamVjdCcgPyByLmZpbHRlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBwYXRoLFxuICAgIGxhYmVsOiBsYWJlbChyLm5hbWUsIGFsaWFzLCBwdWJsaXNoZXIpLFxuICAgIG5hbWU6IHIubmFtZSxcbiAgICAuLi4ocHVibGlzaGVyID8geyBwdWJsaXNoZXIgfSA6IHt9KSxcbiAgICAuLi4oYWxpYXMgPyB7IGFsaWFzIH0gOiB7fSksXG4gICAgLi4uKGZpbHRlciA/IHsgZmlsdGVyIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogRXZlcnkgcGx1Z2luIHJlZmVyZW5jZSBpbiBhIHBpcGVsaW5lJ3MgcHJvcHM6IGBzeW50aC5wbHVnaW5gLCB0aGVuIGVhY2hcbiAqIGBzdGFnZXNbXS5zdGVwc1tdLnBsdWdpbmAgaW4gb3JkZXIuIE9uZSBlbnRyeSBwZXIgU1RFUCAobm90IGRlLWR1cGxpY2F0ZWQpIOKAlFxuICogdGhlIGNvbnRyYWN0IHJlc3VsdCBpcyByZXBvcnRlZCBwZXIgc3RlcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RQbHVnaW5TdGVwcyhwcm9wczogdW5rbm93bik6IFBsdWdpblN0ZXBSZWZbXSB7XG4gIGNvbnN0IHAgPSBhc1JlY29yZChwcm9wcyk7XG4gIGNvbnN0IG91dDogUGx1Z2luU3RlcFJlZltdID0gW107XG4gIGNvbnN0IHN5bnRoID0gdG9SZWYoYXNSZWNvcmQocC5zeW50aCkucGx1Z2luLCAnc3ludGgnLCAoKSA9PiAnc3ludGgnKTtcbiAgaWYgKHN5bnRoKSBvdXQucHVzaChzeW50aCk7XG4gIGNvbnN0IHN0YWdlcyA9IEFycmF5LmlzQXJyYXkocC5zdGFnZXMpID8gcC5zdGFnZXMgOiBbXTtcbiAgc3RhZ2VzLmZvckVhY2goKHN0YWdlLCBpKSA9PiB7XG4gICAgY29uc3QgcyA9IGFzUmVjb3JkKHN0YWdlKTtcbiAgICBjb25zdCBzdGFnZU5hbWUgPSB0eXBlb2Ygcy5zdGFnZU5hbWUgPT09ICdzdHJpbmcnID8gcy5zdGFnZU5hbWUgOiBgc3RhZ2UgJHtpICsgMX1gO1xuICAgIGNvbnN0IHN0ZXBzID0gQXJyYXkuaXNBcnJheShzLnN0ZXBzKSA/IHMuc3RlcHMgOiBbXTtcbiAgICBzdGVwcy5mb3JFYWNoKChzdGVwLCBqKSA9PiB7XG4gICAgICBjb25zdCByZWYgPSB0b1JlZihhc1JlY29yZChzdGVwKS5wbHVnaW4sIGBzdGFnZXNbJHtpfV0uc3RlcHNbJHtqfV1gLFxuICAgICAgICAobmFtZSwgYWxpYXMsIHB1Ymxpc2hlcikgPT4gYCR7c3RhZ2VOYW1lfS8ke2FsaWFzID8/IChwdWJsaXNoZXIgPyBgJHtwdWJsaXNoZXJ9LyR7bmFtZX1gIDogbmFtZSl9YCk7XG4gICAgICBpZiAocmVmKSBvdXQucHVzaChyZWYpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBUaGUgbG9va3VwIGZpbHRlciBzeW50aCBzZW5kcyBmb3IgYSByZWZlcmVuY2UgKHBpcGVsaW5lLW1hbmFnZXJcbiAqIGByZXNvbHZlUGx1Z2luc0ZvclByb3BzYCwgdGhlIGRlcGxveS10aW1lIGN1c3RvbSByZXNvdXJjZSwgdGhlIHBpcGVsaW5lXG4gKiBzZXJ2aWNlJ3MgY29udHJhY3QgY2hlY2spOiB0aGUgcmVmJ3MgbmFtZSDigJQgYW5kIGl0cyBgcHVibGlzaGVyYCwgd2hpY2hcbiAqIHJvdXRlcyB0aGUgbG9va3VwIHRvIHRoYXQgcHVibGlzaGVyJ3MgaW5zdGFsbGVkIGxpc3Rpbmcg4oCUIG92ZXJsYWlkIGJ5XG4gKiBhbiBleHBsaWNpdCBgZmlsdGVyYCAod2hvc2UgYG5hbWVgIHdpbnMpLCBlbHNlIHRoZSBkZWZhdWx0IGFjdGl2ZStkZWZhdWx0XG4gKiB2ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luTG9va3VwRmlsdGVyKHJlZjogUGljazxQbHVnaW5TdGVwUmVmLCAnbmFtZScgfCAnZmlsdGVyJyB8ICdwdWJsaXNoZXInPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiByZWYubmFtZSxcbiAgICAuLi4ocmVmLnB1Ymxpc2hlciA/IHsgcHVibGlzaGVyOiByZWYucHVibGlzaGVyIH0gOiB7fSksXG4gICAgLi4uKHJlZi5maWx0ZXIgPz8geyBpc0FjdGl2ZTogdHJ1ZSwgaXNEZWZhdWx0OiB0cnVlIH0pLFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVmZXJlbmNlIGlkZW50aXR5IChDREstZnJlZTogdGhlIENMSSwgdGhlIHBpcGVsaW5lIHNlcnZpY2UgYW5kIHN5bnRoIHNoYXJlIGl0KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUaGUgcGx1Z2luLWFsaWFzIFNFR01FTlQgb2YgYW4gYXJ0aWZhY3Qga2V5IOKAlCBhbmQgdGhlIHJlc29sdmVyJ3MgY2FjaGUga2V5OlxuICogdGhlIGV4cGxpY2l0IGFsaWFzLCBvciBgJHtuYW1lfS1hbGlhc2Agd2hlbiB0aGVyZSBpcyBub25lXG4gKiAoYCR7cHVibGlzaGVyfS0ke25hbWV9LWFsaWFzYCBmb3IgYSBxdWFsaWZpZWQgcmVmZXJlbmNlKS4gVEhFIHJ1bGUg4oCUIHRoZSBmcm9udGVuZCdzIGFydGlmYWN0IHBpY2tlclxuICogKGBmcm9udGVuZC9zcmMvbGliL2FydGlmYWN0LWtleXMudHNgKSwgdGhlIENMSSdzIHByZS1yZXNvbHZlciBhbmRcbiAqIGBQbHVnaW5Mb29rdXAubm9ybWFsaXplYCBhbGwgYnVpbGQga2V5cyB0aGlzIHdheS5cbiAqXG4gKiBUaGUgcGxhY2VzIHRoYXQgUkVHSVNURVIga2V5cyBtdXN0IHVzZSBpdCB0b286IGEgc3RhZ2Ugc3RlcCByZWdpc3RlcmluZyB0aGVcbiAqIGJhcmUgbmFtZSAoYG5vZGVqcy1idWlsZGApIG9yIGEgc3ludGggc3RlcCBzdWZmaXhpbmcgYW4gZXhwbGljaXQgYWxpYXNcbiAqIChgbXktc3ludGgtYWxpYXNgKSB3b3VsZCBmYWlsIGFueSBVSS1waWNrZWQgaW5wdXQgYXJ0aWZhY3Qgd2l0aCBcIk5vIGFydGlmYWN0XG4gKiByZWdpc3RlcmVkXCIsIGJlY2F1c2UgdGhlIGtleSBpdCBhc2tzIGZvciBpcyBuZXZlciB0aGUga2V5IHRoYXQgd2FzIHN0b3JlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpbkFydGlmYWN0QWxpYXMocGx1Z2luOiBQbHVnaW5SZWZJZGVudGl0eSk6IHN0cmluZyB7XG4gIGlmIChwbHVnaW4uYWxpYXMpIHJldHVybiBwbHVnaW4uYWxpYXM7XG4gIHJldHVybiBwbHVnaW4ucHVibGlzaGVyID8gYCR7c2FuaXRpemVQdWJsaXNoZXIocGx1Z2luLnB1Ymxpc2hlcil9LSR7cGx1Z2luLm5hbWV9LWFsaWFzYCA6IGAke3BsdWdpbi5uYW1lfS1hbGlhc2A7XG59XG5cbi8qKiBUaGUgZmllbGRzIG9mIGEgcGx1Z2luIFJFRkVSRU5DRSB0aGF0IGlkZW50aWZ5IGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5SZWZJZGVudGl0eSB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG4gIC8qKiBQdWJsaXNoZXIgaGFuZGxlIG9mIGFuIGluc3RhbGxlZCBsaXN0aW5nOyBhYnNlbnQgZm9yIGFuIHVucXVhbGlmaWVkIHJlZmVyZW5jZS4gKi9cbiAgcmVhZG9ubHkgcHVibGlzaGVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcHVibGlzaGVyIGhhbmRsZSBhcyBpdCBtYXkgYXBwZWFyIGluIGEgY29uc3RydWN0IGlkIG9yIGEga2V5OiBvbmx5XG4gKiBgW0EtWmEtejAtOV8tXWAgKGhhbmRsZXMgYWxyZWFkeSBhcmU7IHRoaXMgaXMgdGhlIGd1YXJhbnRlZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZVB1Ymxpc2hlcihwdWJsaXNoZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwdWJsaXNoZXIucmVwbGFjZSgvW15BLVphLXowLTlfLV0vZywgJy0nKTtcbn1cblxuLyoqXG4gKiBUaGUgY29uc3RydWN0LWlkIHNlZ21lbnQgb2YgYSBwbHVnaW4gc3RlcDogdGhlIGV4cGxpY2l0IGFsaWFzLCBlbHNlXG4gKiBgPHB1Ymxpc2hlcj4tPG5hbWU+YCBmb3IgYSBxdWFsaWZpZWQgcmVmZXJlbmNlLCBlbHNlIHRoZSBiYXJlIG5hbWUg4oCUIHNvIGFcbiAqIHN0ZXAgdXNpbmcgYGFjbWVgJ3MgYGxpbnRgIGFuZCBvbmUgdXNpbmcgdGhlIG9yZydzIG93biBgbGludGAgbmV2ZXIgY29sbGlkZSxcbiAqIHdoaWxlIGFuIHVucXVhbGlmaWVkIHN0ZXAga2VlcHMgdGhlIGlkIGl0IGFsd2F5cyBoYWQgKHJlbmFtaW5nIGl0IHdvdWxkIG1ha2VcbiAqIENsb3VkRm9ybWF0aW9uIHJlcGxhY2UgaXRzIENvZGVCdWlsZCBwcm9qZWN0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpblN0ZXBJZEFsaWFzKHBsdWdpbjogUGx1Z2luUmVmSWRlbnRpdHkpOiBzdHJpbmcge1xuICAvLyBgPz9gLCBub3QgYHx8YDogYW4gZXhwbGljaXQgKGV2ZW4gZW1wdHkpIGFsaWFzIGtlZXBzIHRoZSBpZCBpdCBhbHdheXMgaGFkLlxuICByZXR1cm4gcGx1Z2luLmFsaWFzID8/IChwbHVnaW4ucHVibGlzaGVyID8gYCR7c2FuaXRpemVQdWJsaXNoZXIocGx1Z2luLnB1Ymxpc2hlcil9LSR7cGx1Z2luLm5hbWV9YCA6IHBsdWdpbi5uYW1lKTtcbn1cbiJdfQ==
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGx1Z2luLWNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFzQzlDLFNBQVMsUUFBUSxDQUFDLENBQVU7SUFDMUIsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBNEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzdGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQXlCO0lBQzdELE9BQU8sS0FBSyxDQUNWLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFpQixFQUN0QyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQWlCLEVBQzNELFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBaUIsQ0FDekQsQ0FBQztBQUNKLENBQUM7QUFFRCxvRkFBb0Y7QUFDcEYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQXlCO0lBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNoRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLDhCQUE4QixDQUFDLGFBQWdEO0lBQzdGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEQs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QUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RELEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7S0FDdkQsQ0FBQztBQUNKLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsa0ZBQWtGO0FBQ2xGLGdGQUFnRjtBQUVoRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUF5QjtJQUMzRCxJQUFJLE1BQU0sQ0FBQyxLQUFLO1FBQUUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ3RDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQztBQUNuSCxDQUFDO0FBVUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFNBQWlCO0lBQ2pELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQXlCO0lBQ3pELDZFQUE2RTtJQUM3RSxPQUFPLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGx1Z2luIGNvbnRyYWN0IGVuZm9yY2VtZW50LiBBIHBsdWdpbiBzcGVjIGRlY2xhcmVzXG4gKiB0aGUgYHt7IHBpcGVsaW5lLm1ldGFkYXRhLlggfX1gIC8gYHt7IHBpcGVsaW5lLnZhcnMuWCB9fWAga2V5cyBhIHBpcGVsaW5lXG4gKiBtdXN0IHN1cHBseSAoYHJlcXVpcmVkTWV0YWRhdGFgIC8gYHJlcXVpcmVkVmFyc2ApIGFuZCB0aGUgY29lcmNpb24gdHlwZSBvZlxuICogZWFjaCAoYG1ldGFkYXRhVHlwZXNgIC8gYHZhcnNUeXBlc2ApLiBUaGUgdXBsb2FkIHZhbGlkYXRlcyB0aGUgc3BlYyBhZ2FpbnN0XG4gKiBpdHMgb3duIHRlbXBsYXRlczsgdGhpcyBtb2R1bGUgY2hlY2tzIGEgUElQRUxJTkUgYWdhaW5zdCB0aGUgY29udHJhY3RzIG9mXG4gKiB0aGUgcGx1Z2lucyBpdCByZWZlcmVuY2VzLlxuICpcbiAqIENESy1mcmVlOiBzaGFyZWQgYnkgdGhlIHBpcGVsaW5lIHNlcnZpY2UgKGNyZWF0ZSAvIHVwZGF0ZSDihpIgNDAwIGxpc3RpbmdcbiAqIGV2ZXJ5IHByb2JsZW0gcGVyIHN0ZXApIGFuZCB0aGUgc3ludGggKGZhaWwgZmFzdCBmb3IgYSBwaXBlbGluZSB0aGF0IG5ldmVyXG4gKiB3ZW50IHRocm91Z2ggdGhlIEFQSSwgZS5nLiBhIENMSS1hdXRob3JlZCBwcm9wcyBmaWxlKS5cbiAqXG4gKiBUaGUgY2hlY2tzIG1pcnJvciB0aGUgdGVtcGxhdGUgZXZhbHVhdG9yIChgdGVtcGxhdGUvZXZhbHVhdG9yLnRzYCkgZXhhY3RseSxcbiAqIHNvIFwicGFzc2VzIGhlcmVcIiBtZWFucyBcInJlc29sdmVzIGF0IHN5bnRoXCI6XG4gKiAgIC0gYSBrZXkgaXMgTUlTU0lORyB3aGVuIGFic2VudCwgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nICh0aGUgZXZhbHVhdG9yXG4gKiAgICAgZmFsbHMgdG8gYHwgZGVmYXVsdDpgIG9yIGZhaWxzIGZvciBhbGwgdGhyZWUpO1xuICogICAtIGFuIG9iamVjdC9hcnJheSB2YWx1ZSBuZXZlciBpbnRlcnBvbGF0ZXM7XG4gKiAgIC0gYG51bWJlcmAgLyBgYm9vbGAgLyBganNvbmAgYWNjZXB0IHdoYXQgdGhlIGB8IG51bWJlcmAgLyBgfCBib29sYCAvXG4gKiAgICAgYHwganNvbmAgZmlsdGVycyBhY2NlcHQgYWZ0ZXIgc3RyaW5naWZpY2F0aW9uLlxuICovXG5cbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnLi9tZXRhZGF0YS1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgTWV0YURhdGFUeXBlIH0gZnJvbSAnLi9waXBlbGluZS10eXBlcy5qcyc7XG5cbi8qKiBEZWNsYXJlZCBjb2VyY2lvbiB0eXBlIG9mIGEgY29udHJhY3Qga2V5LiAqL1xuZXhwb3J0IHR5cGUgQ29udHJhY3RWYWx1ZVR5cGUgPSAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2wnIHwgJ2pzb24nO1xuXG4vKiogVGhlIGNvbnRyYWN0IGZpZWxkcyBvZiBhIHBsdWdpbiByZWNvcmQgKGFzIGBwbHVnaW5zYCBzdG9yZXMgdGhlbSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbnRyYWN0IHtcbiAgcmVhZG9ubHkgcmVxdWlyZWRNZXRhZGF0YT86IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbDtcbiAgcmVhZG9ubHkgcmVxdWlyZWRWYXJzPzogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsO1xuICByZWFkb25seSBtZXRhZGF0YVR5cGVzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ29udHJhY3RWYWx1ZVR5cGU+PiB8IG51bGw7XG4gIHJlYWRvbmx5IHZhcnNUeXBlcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENvbnRyYWN0VmFsdWVUeXBlPj4gfCBudWxsO1xufVxuXG4vKiogV2hhdCBge3sgcGlwZWxpbmUubWV0YWRhdGEuKiB9fWAgYW5kIGB7eyBwaXBlbGluZS52YXJzLiogfX1gIHJlc29sdmUgYWdhaW5zdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJhY3RTY29wZSB7XG4gIHJlYWRvbmx5IG1ldGFkYXRhOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIHJlYWRvbmx5IHZhcnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuLyoqIE9uZSB1bm1ldCBjb250cmFjdCBrZXkuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyYWN0SXNzdWUge1xuICByZWFkb25seSBraW5kOiAnbWV0YWRhdGEnIHwgJ3ZhcnMnO1xuICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvYmxlbTogJ21pc3NpbmcnIHwgJ3R5cGUnO1xuICAvKiogVGhlIGRlY2xhcmVkIHR5cGUsIGZvciBhIGB0eXBlYCBwcm9ibGVtLiAqL1xuICByZWFkb25seSBleHBlY3RlZD86IENvbnRyYWN0VmFsdWVUeXBlO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgcGlwZWxpbmUtcHJvcHMgZmllbGRzIHRoZSBjb250cmFjdCBzY29wZSBpcyBidWlsdCBmcm9tIChCdWlsZGVyUHJvcHMgc3Vic2V0KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJhY3RTY29wZVByb3BzIHtcbiAgcmVhZG9ubHkgZ2xvYmFsPzogdW5rbm93bjtcbiAgcmVhZG9ubHkgZGVmYXVsdHM/OiB1bmtub3duO1xuICByZWFkb25seSBzeW50aD86IHVua25vd247XG4gIHJlYWRvbmx5IHZhcnM/OiB1bmtub3duO1xufVxuXG5mdW5jdGlvbiBhc1JlY29yZCh2OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodikgPyB2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IDoge307XG59XG5cbi8qKlxuICogYHBpcGVsaW5lLm1ldGFkYXRhYCBhcyBzeW50aCBidWlsZHMgaXQ6IGBnbG9iYWxgIOKGkCBgZGVmYXVsdHMubWV0YWRhdGFgIOKGkFxuICogYHN5bnRoLm1ldGFkYXRhYCAobGFzdCB3aW5zKS4gVGhlIHNpbmdsZSBkZWZpbml0aW9uIOKAlCBgUGlwZWxpbmVDb25maWd1cmF0aW9uYFxuICogdXNlcyBpdCB0b28sIHNvIHRoZSBBUEkgY2hlY2sgYW5kIHRoZSBzeW50aCBzY29wZSBjYW5ub3QgZHJpZnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaXBlbGluZVNjb3BlTWV0YWRhdGEocHJvcHM6IENvbnRyYWN0U2NvcGVQcm9wcyk6IE1ldGFEYXRhVHlwZSB7XG4gIHJldHVybiBtZXJnZShcbiAgICBhc1JlY29yZChwcm9wcy5nbG9iYWwpIGFzIE1ldGFEYXRhVHlwZSxcbiAgICBhc1JlY29yZChhc1JlY29yZChwcm9wcy5kZWZhdWx0cykubWV0YWRhdGEpIGFzIE1ldGFEYXRhVHlwZSxcbiAgICBhc1JlY29yZChhc1JlY29yZChwcm9wcy5zeW50aCkubWV0YWRhdGEpIGFzIE1ldGFEYXRhVHlwZSxcbiAgKTtcbn1cblxuLyoqIFRoZSBjb250cmFjdCBzY29wZSBvZiBhIHBpcGVsaW5lJ3MgcHJvcHMgKHNlZSB7QGxpbmsgcGlwZWxpbmVTY29wZU1ldGFkYXRhfSkuICovXG5leHBvcnQgZnVuY3Rpb24gcGlwZWxpbmVDb250cmFjdFNjb3BlKHByb3BzOiBDb250cmFjdFNjb3BlUHJvcHMpOiBDb250cmFjdFNjb3BlIHtcbiAgcmV0dXJuIHsgbWV0YWRhdGE6IHBpcGVsaW5lU2NvcGVNZXRhZGF0YShwcm9wcyksIHZhcnM6IGFzUmVjb3JkKHByb3BzLnZhcnMpIH07XG59XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IHNjb3BlIGluc2lkZSBhIHN5bnRoIHRlbXBsYXRlIHNjb3BlIChgeyBwaXBlbGluZTogeyBtZXRhZGF0YSxcbiAqIHZhcnMsIOKApiB9IH1gLCBzZWUgYFBpcGVsaW5lQ29uZmlndXJhdGlvbi5nZXRQaXBlbGluZVNjb3BlYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cmFjdFNjb3BlRnJvbVRlbXBsYXRlU2NvcGUodGVtcGxhdGVTY29wZTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogQ29udHJhY3RTY29wZSB7XG4gIGNvbnN0IHBpcGVsaW5lID0gYXNSZWNvcmQodGVtcGxhdGVTY29wZS5waXBlbGluZSk7XG4gIHJldHVybiB7IG1ldGFkYXRhOiBhc1JlY29yZChwaXBlbGluZS5tZXRhZGF0YSksIHZhcnM6IGFzUmVjb3JkKHBpcGVsaW5lLnZhcnMpIH07XG59XG5cbi8qKiBXb3VsZCB0aGUgZXZhbHVhdG9yIHRyZWF0IGB2YWx1ZWAgYXMgYWJzZW50IChtaXNzaW5nIC8gbnVsbCAvIGVtcHR5IHN0cmluZyk/ICovXG5mdW5jdGlvbiBpc01pc3NpbmcodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnO1xufVxuXG4vKipcbiAqIERvZXMgYHZhbHVlYCBzYXRpc2Z5IHRoZSBkZWNsYXJlZCBgdHlwZWAgb25jZSBpbnRlcnBvbGF0ZWQ/IE1pcnJvcnMgdGhlXG4gKiBldmFsdWF0b3IncyBgcmVzb2x2ZU9uZWAgKG9iamVjdHMgbmV2ZXIgaW50ZXJwb2xhdGUpIGFuZCBgYXBwbHlDb2VyY2lvbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRyYWN0VmFsdWVPZlR5cGUodmFsdWU6IHVua25vd24sIHR5cGU6IENvbnRyYWN0VmFsdWVUeXBlKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJhdyA9IFN0cmluZyh2YWx1ZSk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShOdW1iZXIocmF3KSk7XG4gICAgY2FzZSAnYm9vbCc6XG4gICAgICByZXR1cm4gWyd0cnVlJywgJzEnLCAneWVzJywgJ2ZhbHNlJywgJzAnLCAnbm8nLCAnJ10uaW5jbHVkZXMocmF3LnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjYXNlICdqc29uJzpcbiAgICAgIHRyeSB7XG4gICAgICAgIEpTT04ucGFyc2UocmF3KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICB9XG59XG5cbi8qKiBBIHZhbHVlIHN0aWxsIGNhcnJ5aW5nIGB7eyDigKYgfX1gIGlzIHJlc29sdmVkIGxhdGVyIChwaXBlbGluZSBwYXNzIDEpLCBzbyBpdHMgdHlwZSBjYW4ndCBiZSBqdWRnZWQgeWV0LiAqL1xuZnVuY3Rpb24gaXNVbnJlc29sdmVkVGVtcGxhdGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuaW5jbHVkZXMoJ3t7Jyk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrS2luZChcbiAga2luZDogJ21ldGFkYXRhJyB8ICd2YXJzJyxcbiAgcmVxdWlyZWQ6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdHlwZXM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENvbnRyYWN0VmFsdWVUeXBlPj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBzdXBwbGllZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuKTogQ29udHJhY3RJc3N1ZVtdIHtcbiAgY29uc3QgaXNzdWVzOiBDb250cmFjdElzc3VlW10gPSBbXTtcbiAgY29uc3Qgd2hlcmUgPSBraW5kID09PSAnbWV0YWRhdGEnID8gJ21ldGFkYXRhIChnbG9iYWwgLyBkZWZhdWx0cy5tZXRhZGF0YSAvIHN5bnRoLm1ldGFkYXRhKScgOiAndmFycyc7XG4gIGZvciAoY29uc3Qga2V5IG9mIG5ldyBTZXQocmVxdWlyZWQgPz8gW10pKSB7XG4gICAgaWYgKGlzTWlzc2luZyhzdXBwbGllZFtrZXldKSkge1xuICAgICAgaXNzdWVzLnB1c2goeyBraW5kLCBrZXksIHByb2JsZW06ICdtaXNzaW5nJywgbWVzc2FnZTogYHBpcGVsaW5lICR7d2hlcmV9IG11c3Qgc3VwcGx5ICcke2tleX0nYCB9KTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCBleHBlY3RlZF0gb2YgT2JqZWN0LmVudHJpZXModHlwZXMgPz8ge30pKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdXBwbGllZFtrZXldO1xuICAgIGlmIChpc01pc3NpbmcodmFsdWUpIHx8IGlzVW5yZXNvbHZlZFRlbXBsYXRlKHZhbHVlKSkgY29udGludWU7XG4gICAgaWYgKCFpc0NvbnRyYWN0VmFsdWVPZlR5cGUodmFsdWUsIGV4cGVjdGVkKSkge1xuICAgICAgY29uc3QgZ290ID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IChBcnJheS5pc0FycmF5KHZhbHVlKSA/ICdhbiBhcnJheScgOiAnYW4gb2JqZWN0JykgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICBpc3N1ZXMucHVzaCh7IGtpbmQsIGtleSwgcHJvYmxlbTogJ3R5cGUnLCBleHBlY3RlZCwgbWVzc2FnZTogYHBpcGVsaW5lICR7a2luZH0uJHtrZXl9IG11c3QgYmUgYSAke2V4cGVjdGVkfSwgZ290ICR7Z290fWAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpc3N1ZXM7XG59XG5cbi8qKlxuICogQ2hlY2sgb25lIHBsdWdpbidzIGNvbnRyYWN0IGFnYWluc3QgdGhlIHBpcGVsaW5lJ3Mgc2NvcGUuIFJldHVybnMgZXZlcnlcbiAqIGlzc3VlIChtaXNzaW5nIGtleXMgZmlyc3QsIHRoZW4gaWxsLXR5cGVkIG9uZXMsIG1ldGFkYXRhIGJlZm9yZSB2YXJzKTtcbiAqIGVtcHR5IHdoZW4gdGhlIGNvbnRyYWN0IGlzIG1ldC4gRGVjbGFyZWQgdHlwZXMgYXJlIGNoZWNrZWQgZm9yIGV2ZXJ5XG4gKiBTVVBQTElFRCBrZXksIHJlcXVpcmVkIG9yIG5vdCAoYW4gb3B0aW9uYWwga2V5IHdpdGggYSBgfCBkZWZhdWx0OmAgaXMgc3RpbGxcbiAqIGNvZXJjZWQgd2hlbiBpdCBpcyBzdXBwbGllZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BsdWdpbkNvbnRyYWN0KGNvbnRyYWN0OiBQbHVnaW5Db250cmFjdCwgc2NvcGU6IENvbnRyYWN0U2NvcGUpOiBDb250cmFjdElzc3VlW10ge1xuICByZXR1cm4gW1xuICAgIC4uLmNoZWNrS2luZCgnbWV0YWRhdGEnLCBjb250cmFjdC5yZXF1aXJlZE1ldGFkYXRhLCBjb250cmFjdC5tZXRhZGF0YVR5cGVzLCBzY29wZS5tZXRhZGF0YSksXG4gICAgLi4uY2hlY2tLaW5kKCd2YXJzJywgY29udHJhY3QucmVxdWlyZWRWYXJzLCBjb250cmFjdC52YXJzVHlwZXMsIHNjb3BlLnZhcnMpLFxuICBdO1xufVxuXG4vKipcbiAqIFN5bnRoLXRpbWUgZ3VhcmQ6IHRocm93IHdoZW4gYHBsdWdpbmAgKHJlc29sdmVkIGZvciBgc3RlcGApIGhhcyB1bm1ldFxuICogY29udHJhY3Qga2V5cy4gVGhlIEFQSSByZWZ1c2VzIHN1Y2ggYSBwaXBlbGluZSBhdCBjcmVhdGUvdXBkYXRlOyB0aGlzXG4gKiBjYXRjaGVzIG9uZSB0aGF0IHJlYWNoZWQgc3ludGggYW5vdGhlciB3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQbHVnaW5Db250cmFjdChcbiAgcGx1Z2luOiBQbHVnaW5Db250cmFjdCAmIHsgcmVhZG9ubHkgbmFtZTogc3RyaW5nOyByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nIH0sXG4gIHNjb3BlOiBDb250cmFjdFNjb3BlLFxuICBzdGVwOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3QgaXNzdWVzID0gY2hlY2tQbHVnaW5Db250cmFjdChwbHVnaW4sIHNjb3BlKTtcbiAgaWYgKGlzc3Vlcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBTdGVwIFwiJHtzdGVwfVwiIHVzZXMgcGx1Z2luIFwiJHtwbHVnaW4ubmFtZX0ke3BsdWdpbi52ZXJzaW9uID8gYEAke3BsdWdpbi52ZXJzaW9ufWAgOiAnJ31cIiB3aG9zZSBjb250cmFjdCBpcyBub3QgbWV0OlxcbmBcbiAgICArIGlzc3Vlcy5tYXAoKGkpID0+IGAgIOKAoiAke2kubWVzc2FnZX1gKS5qb2luKCdcXG4nKSxcbiAgKTtcbn1cblxuLyoqIEEgcGx1Z2luIHJlZmVyZW5jZSBpbiBwaXBlbGluZSBwcm9wcywgd2l0aCB3aGVyZSBpdCBzaXRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TdGVwUmVmIHtcbiAgLyoqIEpTT04gcGF0aCBvZiB0aGUgc3RlcDogYHN5bnRoYCBvciBgc3RhZ2VzW2ldLnN0ZXBzW2pdYC4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAvKiogSHVtYW4gbGFiZWw6IGBzeW50aGAgb3IgYDxzdGFnZU5hbWU+LzxhbGlhcyA/PyBuYW1lPmAuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFB1Ymxpc2hlciBoYW5kbGUgb2YgYW4gaW5zdGFsbGVkIGxpc3RpbmcuICovXG4gIHJlYWRvbmx5IHB1Ymxpc2hlcj86IHN0cmluZztcbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZpbHRlcj86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuZnVuY3Rpb24gdG9SZWYocmF3OiB1bmtub3duLCBwYXRoOiBzdHJpbmcsIGxhYmVsOiAobmFtZTogc3RyaW5nLCBhbGlhcz86IHN0cmluZywgcHVibGlzaGVyPzogc3RyaW5nKSA9PiBzdHJpbmcpOiBQbHVnaW5TdGVwUmVmIHwgbnVsbCB7XG4gIGNvbnN0IHIgPSBhc1JlY29yZChyYXcpO1xuICBpZiAodHlwZW9mIHIubmFtZSAhPT0gJ3N0cmluZycgfHwgci5uYW1lLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFsaWFzID0gdHlwZW9mIHIuYWxpYXMgPT09ICdzdHJpbmcnID8gci5hbGlhcyA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcHVibGlzaGVyID0gdHlwZW9mIHIucHVibGlzaGVyID09PSAnc3RyaW5nJyAmJiByLnB1Ymxpc2hlci5sZW5ndGggPiAwID8gci5wdWJsaXNoZXIgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbHRlciA9IHIuZmlsdGVyICYmIHR5cGVvZiByLmZpbHRlciA9PT0gJ29iamVjdCcgPyByLmZpbHRlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBwYXRoLFxuICAgIGxhYmVsOiBsYWJlbChyLm5hbWUsIGFsaWFzLCBwdWJsaXNoZXIpLFxuICAgIG5hbWU6IHIubmFtZSxcbiAgICAuLi4ocHVibGlzaGVyID8geyBwdWJsaXNoZXIgfSA6IHt9KSxcbiAgICAuLi4oYWxpYXMgPyB7IGFsaWFzIH0gOiB7fSksXG4gICAgLi4uKGZpbHRlciA/IHsgZmlsdGVyIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogVEhFIHN0ZXAgbGFiZWw6IGBzeW50aGAgZm9yIHRoZSBzeW50aCBzdGVwLCBlbHNlXG4gKiBgPHN0YWdlTmFtZT4vPGFsaWFzID8/IFs8cHVibGlzaGVyPi9dbmFtZT5gLiBFdmVyeSBwZXItc3RlcCByZWNvcmQga2V5cyBvbiBpdCDigJRcbiAqIHRoZSBsb29rdXAgYGNvbnRleHQuc3RlcEtleXNgIHN5bnRoIHNlbmRzIChDTEkgcHJlLXJlc29sdmVyIGFuZCB0aGUgZGVwbG95LXRpbWVcbiAqIGN1c3RvbSByZXNvdXJjZSksIHRoZSBzdGVwIG1hbmlmZXN0LCB0aGUgcnVudGltZSBjaGVjaywgdGhlIGRlY2xhcmVkXG4gKiByZXNvbHV0aW9uIHJvd3MgYW5kIHRoZSBwaXBlbGluZSBzZWN1cml0eSB2aWV3IHRoYXQgam9pbnMgdGhlbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpblN0ZXBMYWJlbChzdGFnZU5hbWU6IHN0cmluZyB8IG51bGwsIHJlZjogUGx1Z2luUmVmSWRlbnRpdHkpOiBzdHJpbmcge1xuICBpZiAoc3RhZ2VOYW1lID09PSBudWxsKSByZXR1cm4gJ3N5bnRoJztcbiAgcmV0dXJuIGAke3N0YWdlTmFtZX0vJHtyZWYuYWxpYXMgPz8gKHJlZi5wdWJsaXNoZXIgPyBgJHtyZWYucHVibGlzaGVyfS8ke3JlZi5uYW1lfWAgOiByZWYubmFtZSl9YDtcbn1cblxuLyoqXG4gKiBFdmVyeSBwbHVnaW4gcmVmZXJlbmNlIGluIGEgcGlwZWxpbmUncyBwcm9wczogYHN5bnRoLnBsdWdpbmAsIHRoZW4gZWFjaFxuICogYHN0YWdlc1tdLnN0ZXBzW10ucGx1Z2luYCBpbiBvcmRlci4gT25lIGVudHJ5IHBlciBTVEVQIChub3QgZGUtZHVwbGljYXRlZCkg4oCUXG4gKiB0aGUgY29udHJhY3QgcmVzdWx0IGlzIHJlcG9ydGVkIHBlciBzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFBsdWdpblN0ZXBzKHByb3BzOiB1bmtub3duKTogUGx1Z2luU3RlcFJlZltdIHtcbiAgY29uc3QgcCA9IGFzUmVjb3JkKHByb3BzKTtcbiAgY29uc3Qgb3V0OiBQbHVnaW5TdGVwUmVmW10gPSBbXTtcbiAgY29uc3Qgc3ludGggPSB0b1JlZihhc1JlY29yZChwLnN5bnRoKS5wbHVnaW4sICdzeW50aCcsIChuYW1lKSA9PiBwbHVnaW5TdGVwTGFiZWwobnVsbCwgeyBuYW1lIH0pKTtcbiAgaWYgKHN5bnRoKSBvdXQucHVzaChzeW50aCk7XG4gIGNvbnN0IHN0YWdlcyA9IEFycmF5LmlzQXJyYXkocC5zdGFnZXMpID8gcC5zdGFnZXMgOiBbXTtcbiAgc3RhZ2VzLmZvckVhY2goKHN0YWdlLCBpKSA9PiB7XG4gICAgY29uc3QgcyA9IGFzUmVjb3JkKHN0YWdlKTtcbiAgICBjb25zdCBzdGFnZU5hbWUgPSB0eXBlb2Ygcy5zdGFnZU5hbWUgPT09ICdzdHJpbmcnID8gcy5zdGFnZU5hbWUgOiBgc3RhZ2UgJHtpICsgMX1gO1xuICAgIGNvbnN0IHN0ZXBzID0gQXJyYXkuaXNBcnJheShzLnN0ZXBzKSA/IHMuc3RlcHMgOiBbXTtcbiAgICBzdGVwcy5mb3JFYWNoKChzdGVwLCBqKSA9PiB7XG4gICAgICBjb25zdCByZWYgPSB0b1JlZihhc1JlY29yZChzdGVwKS5wbHVnaW4sIGBzdGFnZXNbJHtpfV0uc3RlcHNbJHtqfV1gLFxuICAgICAgICAobmFtZSwgYWxpYXMsIHB1Ymxpc2hlcikgPT4gcGx1Z2luU3RlcExhYmVsKHN0YWdlTmFtZSwgeyBuYW1lLCBhbGlhcywgcHVibGlzaGVyIH0pKTtcbiAgICAgIGlmIChyZWYpIG91dC5wdXNoKHJlZik7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRoZSBsb29rdXAgZmlsdGVyIHN5bnRoIHNlbmRzIGZvciBhIHJlZmVyZW5jZSAocGlwZWxpbmUtbWFuYWdlclxuICogYHJlc29sdmVQbHVnaW5zRm9yUHJvcHNgLCB0aGUgZGVwbG95LXRpbWUgY3VzdG9tIHJlc291cmNlLCB0aGUgcGlwZWxpbmVcbiAqIHNlcnZpY2UncyBjb250cmFjdCBjaGVjayk6IHRoZSByZWYncyBuYW1lIOKAlCBhbmQgaXRzIGBwdWJsaXNoZXJgLCB3aGljaFxuICogcm91dGVzIHRoZSBsb29rdXAgdG8gdGhhdCBwdWJsaXNoZXIncyBpbnN0YWxsZWQgbGlzdGluZyDigJQgb3ZlcmxhaWQgYnlcbiAqIGFuIGV4cGxpY2l0IGBmaWx0ZXJgICh3aG9zZSBgbmFtZWAgd2lucyksIGVsc2UgdGhlIGRlZmF1bHQgYWN0aXZlK2RlZmF1bHRcbiAqIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5Mb29rdXBGaWx0ZXIocmVmOiBQaWNrPFBsdWdpblN0ZXBSZWYsICduYW1lJyB8ICdmaWx0ZXInIHwgJ3B1Ymxpc2hlcic+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IHJlZi5uYW1lLFxuICAgIC4uLihyZWYucHVibGlzaGVyID8geyBwdWJsaXNoZXI6IHJlZi5wdWJsaXNoZXIgfSA6IHt9KSxcbiAgICAuLi4ocmVmLmZpbHRlciA/PyB7IGlzQWN0aXZlOiB0cnVlLCBpc0RlZmF1bHQ6IHRydWUgfSksXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZWZlcmVuY2UgaWRlbnRpdHkgKENESy1mcmVlOiB0aGUgQ0xJLCB0aGUgcGlwZWxpbmUgc2VydmljZSBhbmQgc3ludGggc2hhcmUgaXQpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRoZSBwbHVnaW4tYWxpYXMgU0VHTUVOVCBvZiBhbiBhcnRpZmFjdCBrZXkg4oCUIGFuZCB0aGUgcmVzb2x2ZXIncyBjYWNoZSBrZXk6XG4gKiB0aGUgZXhwbGljaXQgYWxpYXMsIG9yIGAke25hbWV9LWFsaWFzYCB3aGVuIHRoZXJlIGlzIG5vbmVcbiAqIChgJHtwdWJsaXNoZXJ9LSR7bmFtZX0tYWxpYXNgIGZvciBhIHF1YWxpZmllZCByZWZlcmVuY2UpLiBUSEUgcnVsZSDigJQgdGhlIGZyb250ZW5kJ3MgYXJ0aWZhY3QgcGlja2VyXG4gKiAoYGZyb250ZW5kL3NyYy9saWIvYXJ0aWZhY3Qta2V5cy50c2ApLCB0aGUgQ0xJJ3MgcHJlLXJlc29sdmVyIGFuZFxuICogYFBsdWdpbkxvb2t1cC5ub3JtYWxpemVgIGFsbCBidWlsZCBrZXlzIHRoaXMgd2F5LlxuICpcbiAqIFRoZSBwbGFjZXMgdGhhdCBSRUdJU1RFUiBrZXlzIG11c3QgdXNlIGl0IHRvbzogYSBzdGFnZSBzdGVwIHJlZ2lzdGVyaW5nIHRoZVxuICogYmFyZSBuYW1lIChgbm9kZWpzLWJ1aWxkYCkgb3IgYSBzeW50aCBzdGVwIHN1ZmZpeGluZyBhbiBleHBsaWNpdCBhbGlhc1xuICogKGBteS1zeW50aC1hbGlhc2ApIHdvdWxkIGZhaWwgYW55IFVJLXBpY2tlZCBpbnB1dCBhcnRpZmFjdCB3aXRoIFwiTm8gYXJ0aWZhY3RcbiAqIHJlZ2lzdGVyZWRcIiwgYmVjYXVzZSB0aGUga2V5IGl0IGFza3MgZm9yIGlzIG5ldmVyIHRoZSBrZXkgdGhhdCB3YXMgc3RvcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luQXJ0aWZhY3RBbGlhcyhwbHVnaW46IFBsdWdpblJlZklkZW50aXR5KTogc3RyaW5nIHtcbiAgaWYgKHBsdWdpbi5hbGlhcykgcmV0dXJuIHBsdWdpbi5hbGlhcztcbiAgcmV0dXJuIHBsdWdpbi5wdWJsaXNoZXIgPyBgJHtzYW5pdGl6ZVB1Ymxpc2hlcihwbHVnaW4ucHVibGlzaGVyKX0tJHtwbHVnaW4ubmFtZX0tYWxpYXNgIDogYCR7cGx1Z2luLm5hbWV9LWFsaWFzYDtcbn1cblxuLyoqIFRoZSBmaWVsZHMgb2YgYSBwbHVnaW4gUkVGRVJFTkNFIHRoYXQgaWRlbnRpZnkgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblJlZklkZW50aXR5IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcbiAgLyoqIFB1Ymxpc2hlciBoYW5kbGUgb2YgYW4gaW5zdGFsbGVkIGxpc3Rpbmc7IGFic2VudCBmb3IgYW4gdW5xdWFsaWZpZWQgcmVmZXJlbmNlLiAqL1xuICByZWFkb25seSBwdWJsaXNoZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwdWJsaXNoZXIgaGFuZGxlIGFzIGl0IG1heSBhcHBlYXIgaW4gYSBjb25zdHJ1Y3QgaWQgb3IgYSBrZXk6IG9ubHlcbiAqIGBbQS1aYS16MC05Xy1dYCAoaGFuZGxlcyBhbHJlYWR5IGFyZTsgdGhpcyBpcyB0aGUgZ3VhcmFudGVlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplUHVibGlzaGVyKHB1Ymxpc2hlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHB1Ymxpc2hlci5yZXBsYWNlKC9bXkEtWmEtejAtOV8tXS9nLCAnLScpO1xufVxuXG4vKipcbiAqIFRoZSBjb25zdHJ1Y3QtaWQgc2VnbWVudCBvZiBhIHBsdWdpbiBzdGVwOiB0aGUgZXhwbGljaXQgYWxpYXMsIGVsc2VcbiAqIGA8cHVibGlzaGVyPi08bmFtZT5gIGZvciBhIHF1YWxpZmllZCByZWZlcmVuY2UsIGVsc2UgdGhlIGJhcmUgbmFtZSDigJQgc28gYVxuICogc3RlcCB1c2luZyBgYWNtZWAncyBgbGludGAgYW5kIG9uZSB1c2luZyB0aGUgb3JnJ3Mgb3duIGBsaW50YCBuZXZlciBjb2xsaWRlLFxuICogd2hpbGUgYW4gdW5xdWFsaWZpZWQgc3RlcCBrZWVwcyB0aGUgaWQgaXQgYWx3YXlzIGhhZCAocmVuYW1pbmcgaXQgd291bGQgbWFrZVxuICogQ2xvdWRGb3JtYXRpb24gcmVwbGFjZSBpdHMgQ29kZUJ1aWxkIHByb2plY3QpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luU3RlcElkQWxpYXMocGx1Z2luOiBQbHVnaW5SZWZJZGVudGl0eSk6IHN0cmluZyB7XG4gIC8vIGA/P2AsIG5vdCBgfHxgOiBhbiBleHBsaWNpdCAoZXZlbiBlbXB0eSkgYWxpYXMga2VlcHMgdGhlIGlkIGl0IGFsd2F5cyBoYWQuXG4gIHJldHVybiBwbHVnaW4uYWxpYXMgPz8gKHBsdWdpbi5wdWJsaXNoZXIgPyBgJHtzYW5pdGl6ZVB1Ymxpc2hlcihwbHVnaW4ucHVibGlzaGVyKX0tJHtwbHVnaW4ubmFtZX1gIDogcGx1Z2luLm5hbWUpO1xufVxuIl19
@@ -1,14 +1,42 @@
1
1
  import type { Plugin } from '@pipeline-builder/pipeline-data';
2
+ /** How serious a lookup warning is (vulnerability state is graded, never refused). */
3
+ export type LookupWarningSeverity = 'info' | 'warning' | 'error' | 'critical';
4
+ /** Severities, least to most serious. */
5
+ export declare const LOOKUP_WARNING_SEVERITIES: readonly LookupWarningSeverity[];
6
+ /** One warning riding beside a resolved plugin. */
7
+ export interface LookupWarning {
8
+ readonly code?: string;
9
+ readonly message: string;
10
+ /** Absent on the wire → `warning`. */
11
+ readonly severity: LookupWarningSeverity;
12
+ }
2
13
  /**
3
14
  * Unwrap a `/plugins/lookup` answer. The platform's success envelope is
4
15
  * `{ success, statusCode, data: { plugin, warnings } }` (note the double
5
16
  * nesting: `data.plugin`); `{ data: Plugin }`, `{ plugin }` and a bare Plugin
6
17
  * are tolerated too. Returns the plugin (null when absent or nameless) and the
7
- * lifecycle warning messages (deprecated / yanked-but-pinned) that ride beside it.
18
+ * graded warnings (lifecycle, vulnerability, compliance) that ride beside it.
8
19
  *
9
20
  * Dependency-free (type-only imports) so the plugin-lookup Lambda can bundle it.
10
21
  */
11
22
  export declare function unwrapLookup(body: unknown): {
12
23
  plugin: Plugin | null;
13
- warnings: string[];
24
+ warnings: LookupWarning[];
14
25
  };
26
+ /**
27
+ * One line summarizing graded warnings, most serious first —
28
+ * `3 plugin warnings: 1 critical, 2 error`. Null when there are none.
29
+ */
30
+ export declare function summarizeLookupWarnings(warnings: readonly Pick<LookupWarning, 'severity'>[]): string | null;
31
+ /** Why a lookup found nothing, as the plugin service's 404 `details.state` reports it. */
32
+ export type LookupNotFoundState = 'deleted' | 'inactive' | 'yanked' | 'missing';
33
+ /**
34
+ * `details.state` of a refused lookup, read off either an axios-style error
35
+ * (`err.response.data`) or the response body itself. Null when absent/unknown.
36
+ */
37
+ export declare function lookupNotFoundState(errOrBody: unknown): LookupNotFoundState | null;
38
+ /**
39
+ * The message for an exact version pin that did not resolve. Shared by the
40
+ * CLI's pre-resolution and the deploy-time Lambda's CloudFormation reason.
41
+ */
42
+ export declare function exactPinNotFoundMessage(label: string, pin: string, state: LookupNotFoundState | null): string;
@@ -1,11 +1,13 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ /** Severities, least to most serious. */
4
+ export const LOOKUP_WARNING_SEVERITIES = ['info', 'warning', 'error', 'critical'];
3
5
  /**
4
6
  * Unwrap a `/plugins/lookup` answer. The platform's success envelope is
5
7
  * `{ success, statusCode, data: { plugin, warnings } }` (note the double
6
8
  * nesting: `data.plugin`); `{ data: Plugin }`, `{ plugin }` and a bare Plugin
7
9
  * are tolerated too. Returns the plugin (null when absent or nameless) and the
8
- * lifecycle warning messages (deprecated / yanked-but-pinned) that ride beside it.
10
+ * graded warnings (lifecycle, vulnerability, compliance) that ride beside it.
9
11
  *
10
12
  * Dependency-free (type-only imports) so the plugin-lookup Lambda can bundle it.
11
13
  */
@@ -19,11 +21,60 @@ export function unwrapLookup(body) {
19
21
  && candidate.name.length > 0
20
22
  ? candidate
21
23
  : null;
22
- const warnings = Array.isArray(container.warnings)
23
- ? container.warnings
24
- .map((w) => (w && typeof w === 'object' ? w.message : undefined))
25
- .filter((m) => typeof m === 'string' && m.length > 0)
26
- : [];
24
+ const warnings = [];
25
+ if (Array.isArray(container.warnings)) {
26
+ for (const w of container.warnings) {
27
+ if (!w || typeof w !== 'object')
28
+ continue;
29
+ const { code, message, severity } = w;
30
+ if (typeof message !== 'string' || message.length === 0)
31
+ continue;
32
+ warnings.push({
33
+ ...(typeof code === 'string' ? { code } : {}),
34
+ message,
35
+ severity: LOOKUP_WARNING_SEVERITIES.includes(severity) ? severity : 'warning',
36
+ });
37
+ }
38
+ }
27
39
  return { plugin, warnings };
28
40
  }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3BsdWdpbi1sb29rdXAtZW52ZWxvcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUl0Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBYTtJQUN4QyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDN0UsTUFBTSxLQUFLLEdBQUksSUFBMkIsQ0FBQyxJQUFJLENBQUM7SUFDaEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBNkMsQ0FBQztJQUNsSCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxTQUFTLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQVEsU0FBZ0MsQ0FBQyxJQUFJLEtBQUssUUFBUTtXQUNqSCxTQUE4QixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNsRCxDQUFDLENBQUMsU0FBbUI7UUFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNULE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUNoRCxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVE7YUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFFLENBQTJCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUMzRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQWUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1AsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5cbi8qKlxuICogVW53cmFwIGEgYC9wbHVnaW5zL2xvb2t1cGAgYW5zd2VyLiBUaGUgcGxhdGZvcm0ncyBzdWNjZXNzIGVudmVsb3BlIGlzXG4gKiBgeyBzdWNjZXNzLCBzdGF0dXNDb2RlLCBkYXRhOiB7IHBsdWdpbiwgd2FybmluZ3MgfSB9YCAobm90ZSB0aGUgZG91YmxlXG4gKiBuZXN0aW5nOiBgZGF0YS5wbHVnaW5gKTsgYHsgZGF0YTogUGx1Z2luIH1gLCBgeyBwbHVnaW4gfWAgYW5kIGEgYmFyZSBQbHVnaW5cbiAqIGFyZSB0b2xlcmF0ZWQgdG9vLiBSZXR1cm5zIHRoZSBwbHVnaW4gKG51bGwgd2hlbiBhYnNlbnQgb3IgbmFtZWxlc3MpIGFuZCB0aGVcbiAqIGxpZmVjeWNsZSB3YXJuaW5nIG1lc3NhZ2VzIChkZXByZWNhdGVkIC8geWFua2VkLWJ1dC1waW5uZWQpIHRoYXQgcmlkZSBiZXNpZGUgaXQuXG4gKlxuICogRGVwZW5kZW5jeS1mcmVlICh0eXBlLW9ubHkgaW1wb3J0cykgc28gdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhIGNhbiBidW5kbGUgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBMb29rdXAoYm9keTogdW5rbm93bik6IHsgcGx1Z2luOiBQbHVnaW4gfCBudWxsOyB3YXJuaW5nczogc3RyaW5nW10gfSB7XG4gIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gJ29iamVjdCcpIHJldHVybiB7IHBsdWdpbjogbnVsbCwgd2FybmluZ3M6IFtdIH07XG4gIGNvbnN0IGlubmVyID0gKGJvZHkgYXMgeyBkYXRhPzogdW5rbm93biB9KS5kYXRhO1xuICBjb25zdCBjb250YWluZXIgPSAoaW5uZXIgJiYgdHlwZW9mIGlubmVyID09PSAnb2JqZWN0JyA/IGlubmVyIDogYm9keSkgYXMgeyBwbHVnaW4/OiB1bmtub3duOyB3YXJuaW5ncz86IHVua25vd24gfTtcbiAgY29uc3QgY2FuZGlkYXRlID0gY29udGFpbmVyLnBsdWdpbiA/PyBjb250YWluZXI7XG4gIGNvbnN0IHBsdWdpbiA9IGNhbmRpZGF0ZSAmJiB0eXBlb2YgY2FuZGlkYXRlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKGNhbmRpZGF0ZSBhcyB7IG5hbWU/OiB1bmtub3duIH0pLm5hbWUgPT09ICdzdHJpbmcnXG4gICAgJiYgKGNhbmRpZGF0ZSBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lLmxlbmd0aCA+IDBcbiAgICA/IGNhbmRpZGF0ZSBhcyBQbHVnaW5cbiAgICA6IG51bGw7XG4gIGNvbnN0IHdhcm5pbmdzID0gQXJyYXkuaXNBcnJheShjb250YWluZXIud2FybmluZ3MpXG4gICAgPyBjb250YWluZXIud2FybmluZ3NcbiAgICAgIC5tYXAoKHcpID0+ICh3ICYmIHR5cGVvZiB3ID09PSAnb2JqZWN0JyA/ICh3IGFzIHsgbWVzc2FnZT86IHVua25vd24gfSkubWVzc2FnZSA6IHVuZGVmaW5lZCkpXG4gICAgICAuZmlsdGVyKChtKTogbSBpcyBzdHJpbmcgPT4gdHlwZW9mIG0gPT09ICdzdHJpbmcnICYmIG0ubGVuZ3RoID4gMClcbiAgICA6IFtdO1xuICByZXR1cm4geyBwbHVnaW4sIHdhcm5pbmdzIH07XG59XG4iXX0=
41
+ /**
42
+ * One line summarizing graded warnings, most serious first —
43
+ * `3 plugin warnings: 1 critical, 2 error`. Null when there are none.
44
+ */
45
+ export function summarizeLookupWarnings(warnings) {
46
+ if (warnings.length === 0)
47
+ return null;
48
+ const parts = [...LOOKUP_WARNING_SEVERITIES].reverse()
49
+ .map((sev) => [sev, warnings.filter((w) => w.severity === sev).length])
50
+ .filter(([, n]) => n > 0)
51
+ .map(([sev, n]) => `${n} ${sev}`);
52
+ return `${warnings.length} plugin warning${warnings.length === 1 ? '' : 's'}: ${parts.join(', ')}`;
53
+ }
54
+ const NOT_FOUND_STATES = ['deleted', 'inactive', 'yanked', 'missing'];
55
+ /**
56
+ * `details.state` of a refused lookup, read off either an axios-style error
57
+ * (`err.response.data`) or the response body itself. Null when absent/unknown.
58
+ */
59
+ export function lookupNotFoundState(errOrBody) {
60
+ if (!errOrBody || typeof errOrBody !== 'object')
61
+ return null;
62
+ const data = errOrBody.response?.data ?? errOrBody;
63
+ const details = data && typeof data === 'object' ? data.details : undefined;
64
+ const state = details && typeof details === 'object' ? details.state : undefined;
65
+ return typeof state === 'string' && NOT_FOUND_STATES.includes(state) ? state : null;
66
+ }
67
+ /**
68
+ * The message for an exact version pin that did not resolve. Shared by the
69
+ * CLI's pre-resolution and the deploy-time Lambda's CloudFormation reason.
70
+ */
71
+ export function exactPinNotFoundMessage(label, pin, state) {
72
+ switch (state) {
73
+ case 'deleted': return `Plugin "${label}" version ${pin} was deleted from your organization`;
74
+ case 'inactive': return `Plugin "${label}" version ${pin} is inactive`;
75
+ case 'yanked': return `Plugin "${label}" version ${pin} was yanked`;
76
+ case 'missing': return `Plugin "${label}" version ${pin} does not exist`;
77
+ default: return `Plugin "${label}" version ${pin} does not exist (never published, or refused by its build's vulnerability scan)`;
78
+ }
79
+ }
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3BsdWdpbi1sb29rdXAtZW52ZWxvcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQU90Qyx5Q0FBeUM7QUFDekMsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXFDLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFVcEg7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQWE7SUFDeEMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzdFLE1BQU0sS0FBSyxHQUFJLElBQTJCLENBQUMsSUFBSSxDQUFDO0lBQ2hELE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQTZDLENBQUM7SUFDbEgsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFRLFNBQWdDLENBQUMsSUFBSSxLQUFLLFFBQVE7V0FDakgsU0FBOEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDbEQsQ0FBQyxDQUFDLFNBQW1CO1FBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDVCxNQUFNLFFBQVEsR0FBb0IsRUFBRSxDQUFDO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN0QyxLQUFLLE1B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S0FBYSxFQUFFLEdBQVcsRUFBRSxLQUFpQztJQUNuRyxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxTQUFTLEVBQUUsT0FBTyxXQUFXLEtBQUssYUFBYSxHQUFHLHFDQUFxQyxDQUFDO1FBQzdGLEtBQUssVUFBVSxFQUFFLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxjQUFjLENBQUM7UUFDdkUsS0FBSyxRQUFRLEVBQUUsT0FBTyxXQUFXLEtBQUssYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNwRSxLQUFLLFNBQVMsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcsaUJBQWlCLENBQUM7UUFDekUsU0FBUyxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcsaUZBQWlGLENBQUM7SUFDcEksQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1kYXRhJztcblxuLyoqIEhvdyBzZXJpb3VzIGEgbG9va3VwIHdhcm5pbmcgaXMgKHZ1bG5lcmFiaWxpdHkgc3RhdGUgaXMgZ3JhZGVkLCBuZXZlciByZWZ1c2VkKS4gKi9cbmV4cG9ydCB0eXBlIExvb2t1cFdhcm5pbmdTZXZlcml0eSA9ICdpbmZvJyB8ICd3YXJuaW5nJyB8ICdlcnJvcicgfCAnY3JpdGljYWwnO1xuXG4vKiogU2V2ZXJpdGllcywgbGVhc3QgdG8gbW9zdCBzZXJpb3VzLiAqL1xuZXhwb3J0IGNvbnN0IExPT0tVUF9XQVJOSU5HX1NFVkVSSVRJRVM6IHJlYWRvbmx5IExvb2t1cFdhcm5pbmdTZXZlcml0eVtdID0gWydpbmZvJywgJ3dhcm5pbmcnLCAnZXJyb3InLCAnY3JpdGljYWwnXTtcblxuLyoqIE9uZSB3YXJuaW5nIHJpZGluZyBiZXNpZGUgYSByZXNvbHZlZCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIExvb2t1cFdhcm5pbmcge1xuICByZWFkb25seSBjb2RlPzogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBBYnNlbnQgb24gdGhlIHdpcmUg4oaSIGB3YXJuaW5nYC4gKi9cbiAgcmVhZG9ubHkgc2V2ZXJpdHk6IExvb2t1cFdhcm5pbmdTZXZlcml0eTtcbn1cblxuLyoqXG4gKiBVbndyYXAgYSBgL3BsdWdpbnMvbG9va3VwYCBhbnN3ZXIuIFRoZSBwbGF0Zm9ybSdzIHN1Y2Nlc3MgZW52ZWxvcGUgaXNcbiAqIGB7IHN1Y2Nlc3MsIHN0YXR1c0NvZGUsIGRhdGE6IHsgcGx1Z2luLCB3YXJuaW5ncyB9IH1gIChub3RlIHRoZSBkb3VibGVcbiAqIG5lc3Rpbmc6IGBkYXRhLnBsdWdpbmApOyBgeyBkYXRhOiBQbHVnaW4gfWAsIGB7IHBsdWdpbiB9YCBhbmQgYSBiYXJlIFBsdWdpblxuICogYXJlIHRvbGVyYXRlZCB0b28uIFJldHVybnMgdGhlIHBsdWdpbiAobnVsbCB3aGVuIGFic2VudCBvciBuYW1lbGVzcykgYW5kIHRoZVxuICogZ3JhZGVkIHdhcm5pbmdzIChsaWZlY3ljbGUsIHZ1bG5lcmFiaWxpdHksIGNvbXBsaWFuY2UpIHRoYXQgcmlkZSBiZXNpZGUgaXQuXG4gKlxuICogRGVwZW5kZW5jeS1mcmVlICh0eXBlLW9ubHkgaW1wb3J0cykgc28gdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhIGNhbiBidW5kbGUgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBMb29rdXAoYm9keTogdW5rbm93bik6IHsgcGx1Z2luOiBQbHVnaW4gfCBudWxsOyB3YXJuaW5nczogTG9va3VwV2FybmluZ1tdIH0ge1xuICBpZiAoIWJvZHkgfHwgdHlwZW9mIGJvZHkgIT09ICdvYmplY3QnKSByZXR1cm4geyBwbHVnaW46IG51bGwsIHdhcm5pbmdzOiBbXSB9O1xuICBjb25zdCBpbm5lciA9IChib2R5IGFzIHsgZGF0YT86IHVua25vd24gfSkuZGF0YTtcbiAgY29uc3QgY29udGFpbmVyID0gKGlubmVyICYmIHR5cGVvZiBpbm5lciA9PT0gJ29iamVjdCcgPyBpbm5lciA6IGJvZHkpIGFzIHsgcGx1Z2luPzogdW5rbm93bjsgd2FybmluZ3M/OiB1bmtub3duIH07XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IGNvbnRhaW5lci5wbHVnaW4gPz8gY29udGFpbmVyO1xuICBjb25zdCBwbHVnaW4gPSBjYW5kaWRhdGUgJiYgdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIChjYW5kaWRhdGUgYXMgeyBuYW1lPzogdW5rbm93biB9KS5uYW1lID09PSAnc3RyaW5nJ1xuICAgICYmIChjYW5kaWRhdGUgYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZS5sZW5ndGggPiAwXG4gICAgPyBjYW5kaWRhdGUgYXMgUGx1Z2luXG4gICAgOiBudWxsO1xuICBjb25zdCB3YXJuaW5nczogTG9va3VwV2FybmluZ1tdID0gW107XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lci53YXJuaW5ncykpIHtcbiAgICBmb3IgKGNvbnN0IHcgb2YgY29udGFpbmVyLndhcm5pbmdzKSB7XG4gICAgICBpZiAoIXcgfHwgdHlwZW9mIHcgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSwgc2V2ZXJpdHkgfSA9IHcgYXMgeyBjb2RlPzogdW5rbm93bjsgbWVzc2FnZT86IHVua25vd247IHNldmVyaXR5PzogdW5rbm93biB9O1xuICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlICE9PSAnc3RyaW5nJyB8fCBtZXNzYWdlLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgLi4uKHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJyA/IHsgY29kZSB9IDoge30pLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBzZXZlcml0eTogKExPT0tVUF9XQVJOSU5HX1NFVkVSSVRJRVMgYXMgcmVhZG9ubHkgdW5rbm93bltdKS5pbmNsdWRlcyhzZXZlcml0eSkgPyBzZXZlcml0eSBhcyBMb29rdXBXYXJuaW5nU2V2ZXJpdHkgOiAnd2FybmluZycsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcGx1Z2luLCB3YXJuaW5ncyB9O1xufVxuXG4vKipcbiAqIE9uZSBsaW5lIHN1bW1hcml6aW5nIGdyYWRlZCB3YXJuaW5ncywgbW9zdCBzZXJpb3VzIGZpcnN0IOKAlFxuICogYDMgcGx1Z2luIHdhcm5pbmdzOiAxIGNyaXRpY2FsLCAyIGVycm9yYC4gTnVsbCB3aGVuIHRoZXJlIGFyZSBub25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplTG9va3VwV2FybmluZ3Mod2FybmluZ3M6IHJlYWRvbmx5IFBpY2s8TG9va3VwV2FybmluZywgJ3NldmVyaXR5Jz5bXSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAod2FybmluZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGFydHMgPSBbLi4uTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFU10ucmV2ZXJzZSgpXG4gICAgLm1hcCgoc2V2KSA9PiBbc2V2LCB3YXJuaW5ncy5maWx0ZXIoKHcpID0+IHcuc2V2ZXJpdHkgPT09IHNldikubGVuZ3RoXSBhcyBjb25zdClcbiAgICAuZmlsdGVyKChbLCBuXSkgPT4gbiA+IDApXG4gICAgLm1hcCgoW3Nldiwgbl0pID0+IGAke259ICR7c2V2fWApO1xuICByZXR1cm4gYCR7d2FybmluZ3MubGVuZ3RofSBwbHVnaW4gd2FybmluZyR7d2FybmluZ3MubGVuZ3RoID09PSAxID8gJycgOiAncyd9OiAke3BhcnRzLmpvaW4oJywgJyl9YDtcbn1cblxuLyoqIFdoeSBhIGxvb2t1cCBmb3VuZCBub3RoaW5nLCBhcyB0aGUgcGx1Z2luIHNlcnZpY2UncyA0MDQgYGRldGFpbHMuc3RhdGVgIHJlcG9ydHMgaXQuICovXG5leHBvcnQgdHlwZSBMb29rdXBOb3RGb3VuZFN0YXRlID0gJ2RlbGV0ZWQnIHwgJ2luYWN0aXZlJyB8ICd5YW5rZWQnIHwgJ21pc3NpbmcnO1xuXG5jb25zdCBOT1RfRk9VTkRfU1RBVEVTOiByZWFkb25seSBMb29rdXBOb3RGb3VuZFN0YXRlW10gPSBbJ2RlbGV0ZWQnLCAnaW5hY3RpdmUnLCAneWFua2VkJywgJ21pc3NpbmcnXTtcblxuLyoqXG4gKiBgZGV0YWlscy5zdGF0ZWAgb2YgYSByZWZ1c2VkIGxvb2t1cCwgcmVhZCBvZmYgZWl0aGVyIGFuIGF4aW9zLXN0eWxlIGVycm9yXG4gKiAoYGVyci5yZXNwb25zZS5kYXRhYCkgb3IgdGhlIHJlc3BvbnNlIGJvZHkgaXRzZWxmLiBOdWxsIHdoZW4gYWJzZW50L3Vua25vd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb29rdXBOb3RGb3VuZFN0YXRlKGVyck9yQm9keTogdW5rbm93bik6IExvb2t1cE5vdEZvdW5kU3RhdGUgfCBudWxsIHtcbiAgaWYgKCFlcnJPckJvZHkgfHwgdHlwZW9mIGVyck9yQm9keSAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICBjb25zdCBkYXRhID0gKGVyck9yQm9keSBhcyB7IHJlc3BvbnNlPzogeyBkYXRhPzogdW5rbm93biB9IH0pLnJlc3BvbnNlPy5kYXRhID8/IGVyck9yQm9keTtcbiAgY29uc3QgZGV0YWlscyA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gKGRhdGEgYXMgeyBkZXRhaWxzPzogdW5rbm93biB9KS5kZXRhaWxzIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0ZSA9IGRldGFpbHMgJiYgdHlwZW9mIGRldGFpbHMgPT09ICdvYmplY3QnID8gKGRldGFpbHMgYXMgeyBzdGF0ZT86IHVua25vd24gfSkuc3RhdGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09ICdzdHJpbmcnICYmIChOT1RfRk9VTkRfU1RBVEVTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhzdGF0ZSkgPyBzdGF0ZSBhcyBMb29rdXBOb3RGb3VuZFN0YXRlIDogbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgbWVzc2FnZSBmb3IgYW4gZXhhY3QgdmVyc2lvbiBwaW4gdGhhdCBkaWQgbm90IHJlc29sdmUuIFNoYXJlZCBieSB0aGVcbiAqIENMSSdzIHByZS1yZXNvbHV0aW9uIGFuZCB0aGUgZGVwbG95LXRpbWUgTGFtYmRhJ3MgQ2xvdWRGb3JtYXRpb24gcmVhc29uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWw6IHN0cmluZywgcGluOiBzdHJpbmcsIHN0YXRlOiBMb29rdXBOb3RGb3VuZFN0YXRlIHwgbnVsbCk6IHN0cmluZyB7XG4gIHN3aXRjaCAoc3RhdGUpIHtcbiAgICBjYXNlICdkZWxldGVkJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IHdhcyBkZWxldGVkIGZyb20geW91ciBvcmdhbml6YXRpb25gO1xuICAgIGNhc2UgJ2luYWN0aXZlJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGlzIGluYWN0aXZlYDtcbiAgICBjYXNlICd5YW5rZWQnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gd2FzIHlhbmtlZGA7XG4gICAgY2FzZSAnbWlzc2luZyc6IHJldHVybiBgUGx1Z2luIFwiJHtsYWJlbH1cIiB2ZXJzaW9uICR7cGlufSBkb2VzIG5vdCBleGlzdGA7XG4gICAgZGVmYXVsdDogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGRvZXMgbm90IGV4aXN0IChuZXZlciBwdWJsaXNoZWQsIG9yIHJlZnVzZWQgYnkgaXRzIGJ1aWxkJ3MgdnVsbmVyYWJpbGl0eSBzY2FuKWA7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ /** The error `code` api-core's `sendQuotaExceeded` answers with. */
2
+ export declare const QUOTA_EXCEEDED_CODE = "QUOTA_EXCEEDED";
3
+ /** Whether an error response body is a quota refusal (`code: 'QUOTA_EXCEEDED'`). */
4
+ export declare function isQuotaExceededBody(body: unknown): boolean;
5
+ /**
6
+ * `"API call quota reached (25,000/25,000); resets 2026-11-05. Upgrade:
7
+ * https://pb.example.com/dashboard/billing"` for a quota refusal body, or
8
+ * `undefined` for anything else. `platformUrl` prefixes the RELATIVE upgrade
9
+ * path the server sends (the dashboard and API share an origin behind nginx).
10
+ */
11
+ export declare function describeQuotaExceeded(body: unknown, platformUrl: string): string | undefined;
@@ -0,0 +1,44 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Rendering a `429 QUOTA_EXCEEDED` for a person reading a terminal or a
5
+ * CloudFormation event — shared by the pipeline-manager CLI and the
6
+ * plugin-lookup Lambda so both say the same thing.
7
+ *
8
+ * A quota refusal is NOT a rate limit: waiting a moment changes nothing, the
9
+ * counter only empties when the period resets (or the limit is raised). So the
10
+ * message names the quota, the numbers, the reset date and where to raise it,
11
+ * and the callers never retry it. A 429 WITHOUT this code is an ordinary rate
12
+ * limit (nginx, a per-org burst limiter) and keeps rate-limit wording.
13
+ *
14
+ * Deliberately a dependency-free leaf (the label table is a side-effect-free
15
+ * deep import): the Lambda bundle must not pull the api-core barrel.
16
+ */
17
+ import { QUOTA_TYPE_LABELS, QUOTA_UPGRADE_PATH } from '@pipeline-builder/api-core/lib/types/common.js';
18
+ /** The error `code` api-core's `sendQuotaExceeded` answers with. */
19
+ export const QUOTA_EXCEEDED_CODE = 'QUOTA_EXCEEDED';
20
+ /** Whether an error response body is a quota refusal (`code: 'QUOTA_EXCEEDED'`). */
21
+ export function isQuotaExceededBody(body) {
22
+ return !!body && typeof body === 'object' && body.code === QUOTA_EXCEEDED_CODE;
23
+ }
24
+ /**
25
+ * `"API call quota reached (25,000/25,000); resets 2026-11-05. Upgrade:
26
+ * https://pb.example.com/dashboard/billing"` for a quota refusal body, or
27
+ * `undefined` for anything else. `platformUrl` prefixes the RELATIVE upgrade
28
+ * path the server sends (the dashboard and API share an origin behind nginx).
29
+ */
30
+ export function describeQuotaExceeded(body, platformUrl) {
31
+ if (!isQuotaExceededBody(body))
32
+ return undefined;
33
+ const details = (body.details ?? {});
34
+ const type = typeof details.quotaType === 'string' ? details.quotaType : undefined;
35
+ const label = (type && QUOTA_TYPE_LABELS[type]) ?? (type ? type : 'Usage');
36
+ const used = typeof details.used === 'number' ? details.used.toLocaleString('en-US') : '?';
37
+ const limit = typeof details.limit === 'number' ? details.limit.toLocaleString('en-US') : '?';
38
+ const resets = typeof details.resetAt === 'string' && details.resetAt.length >= 10
39
+ ? `resets ${details.resetAt.slice(0, 10)}`
40
+ : 'resets at the end of the period';
41
+ const path = typeof details.upgradeUrl === 'string' && details.upgradeUrl.startsWith('/') ? details.upgradeUrl : QUOTA_UPGRADE_PATH;
42
+ return `${label} quota reached (${used}/${limit}); ${resets}. Upgrade: ${platformUrl.replace(/\/+$/, '')}${path}`;
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtZXhjZWVkZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9xdW90YS1leGNlZWRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQWtCLE1BQU0sZ0RBQWdELENBQUM7QUFFdkgsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDO0FBVXBELG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFBYTtJQUMvQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFLLElBQTJCLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDO0FBQ3pHLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUFhLEVBQUUsV0FBbUI7SUFDdEUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2pELE1BQU0sT0FBTyxHQUFHLENBQUUsSUFBOEIsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUF5QixDQUFDO0lBQ3hGLE1BQU0sSUFBSSxHQUFHLE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNuRixNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxJQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RixNQUFNLElBQUksR0FBRyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzNGLE1BQU0sS0FBSyxHQUFHLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDOUYsTUFBTSxNQUFNLEdBQUcsT0FBTyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFO1FBQ2hGLENBQUMsQ0FBQyxVQUFVLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUMxQyxDQUFDLENBQUMsaUNBQWlDLENBQUM7SUFDdEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxPQUFPLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7SUFDcEksT0FBTyxHQUFHLEtBQUssbUJBQW1CLElBQUksSUFBSSxLQUFLLE1BQU0sTUFBTSxjQUFjLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ3BILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBSZW5kZXJpbmcgYSBgNDI5IFFVT1RBX0VYQ0VFREVEYCBmb3IgYSBwZXJzb24gcmVhZGluZyBhIHRlcm1pbmFsIG9yIGFcbiAqIENsb3VkRm9ybWF0aW9uIGV2ZW50IOKAlCBzaGFyZWQgYnkgdGhlIHBpcGVsaW5lLW1hbmFnZXIgQ0xJIGFuZCB0aGVcbiAqIHBsdWdpbi1sb29rdXAgTGFtYmRhIHNvIGJvdGggc2F5IHRoZSBzYW1lIHRoaW5nLlxuICpcbiAqIEEgcXVvdGEgcmVmdXNhbCBpcyBOT1QgYSByYXRlIGxpbWl0OiB3YWl0aW5nIGEgbW9tZW50IGNoYW5nZXMgbm90aGluZywgdGhlXG4gKiBjb3VudGVyIG9ubHkgZW1wdGllcyB3aGVuIHRoZSBwZXJpb2QgcmVzZXRzIChvciB0aGUgbGltaXQgaXMgcmFpc2VkKS4gU28gdGhlXG4gKiBtZXNzYWdlIG5hbWVzIHRoZSBxdW90YSwgdGhlIG51bWJlcnMsIHRoZSByZXNldCBkYXRlIGFuZCB3aGVyZSB0byByYWlzZSBpdCxcbiAqIGFuZCB0aGUgY2FsbGVycyBuZXZlciByZXRyeSBpdC4gQSA0MjkgV0lUSE9VVCB0aGlzIGNvZGUgaXMgYW4gb3JkaW5hcnkgcmF0ZVxuICogbGltaXQgKG5naW54LCBhIHBlci1vcmcgYnVyc3QgbGltaXRlcikgYW5kIGtlZXBzIHJhdGUtbGltaXQgd29yZGluZy5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgYSBkZXBlbmRlbmN5LWZyZWUgbGVhZiAodGhlIGxhYmVsIHRhYmxlIGlzIGEgc2lkZS1lZmZlY3QtZnJlZVxuICogZGVlcCBpbXBvcnQpOiB0aGUgTGFtYmRhIGJ1bmRsZSBtdXN0IG5vdCBwdWxsIHRoZSBhcGktY29yZSBiYXJyZWwuXG4gKi9cblxuaW1wb3J0IHsgUVVPVEFfVFlQRV9MQUJFTFMsIFFVT1RBX1VQR1JBREVfUEFUSCwgdHlwZSBRdW90YVR5cGUgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZS9saWIvdHlwZXMvY29tbW9uLmpzJztcblxuLyoqIFRoZSBlcnJvciBgY29kZWAgYXBpLWNvcmUncyBgc2VuZFF1b3RhRXhjZWVkZWRgIGFuc3dlcnMgd2l0aC4gKi9cbmV4cG9ydCBjb25zdCBRVU9UQV9FWENFRURFRF9DT0RFID0gJ1FVT1RBX0VYQ0VFREVEJztcblxuaW50ZXJmYWNlIFF1b3RhRXhjZWVkZWREZXRhaWxzIHtcbiAgcXVvdGFUeXBlPzogdW5rbm93bjtcbiAgbGltaXQ/OiB1bmtub3duO1xuICB1c2VkPzogdW5rbm93bjtcbiAgcmVzZXRBdD86IHVua25vd247XG4gIHVwZ3JhZGVVcmw/OiB1bmtub3duO1xufVxuXG4vKiogV2hldGhlciBhbiBlcnJvciByZXNwb25zZSBib2R5IGlzIGEgcXVvdGEgcmVmdXNhbCAoYGNvZGU6ICdRVU9UQV9FWENFRURFRCdgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1F1b3RhRXhjZWVkZWRCb2R5KGJvZHk6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuICEhYm9keSAmJiB0eXBlb2YgYm9keSA9PT0gJ29iamVjdCcgJiYgKGJvZHkgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlID09PSBRVU9UQV9FWENFRURFRF9DT0RFO1xufVxuXG4vKipcbiAqIGBcIkFQSSBjYWxsIHF1b3RhIHJlYWNoZWQgKDI1LDAwMC8yNSwwMDApOyByZXNldHMgMjAyNi0xMS0wNS4gVXBncmFkZTpcbiAqIGh0dHBzOi8vcGIuZXhhbXBsZS5jb20vZGFzaGJvYXJkL2JpbGxpbmdcImAgZm9yIGEgcXVvdGEgcmVmdXNhbCBib2R5LCBvclxuICogYHVuZGVmaW5lZGAgZm9yIGFueXRoaW5nIGVsc2UuIGBwbGF0Zm9ybVVybGAgcHJlZml4ZXMgdGhlIFJFTEFUSVZFIHVwZ3JhZGVcbiAqIHBhdGggdGhlIHNlcnZlciBzZW5kcyAodGhlIGRhc2hib2FyZCBhbmQgQVBJIHNoYXJlIGFuIG9yaWdpbiBiZWhpbmQgbmdpbngpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVRdW90YUV4Y2VlZGVkKGJvZHk6IHVua25vd24sIHBsYXRmb3JtVXJsOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWlzUXVvdGFFeGNlZWRlZEJvZHkoYm9keSkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRldGFpbHMgPSAoKGJvZHkgYXMgeyBkZXRhaWxzPzogdW5rbm93biB9KS5kZXRhaWxzID8/IHt9KSBhcyBRdW90YUV4Y2VlZGVkRGV0YWlscztcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiBkZXRhaWxzLnF1b3RhVHlwZSA9PT0gJ3N0cmluZycgPyBkZXRhaWxzLnF1b3RhVHlwZSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbGFiZWwgPSAodHlwZSAmJiBRVU9UQV9UWVBFX0xBQkVMU1t0eXBlIGFzIFF1b3RhVHlwZV0pID8/ICh0eXBlID8gdHlwZSA6ICdVc2FnZScpO1xuICBjb25zdCB1c2VkID0gdHlwZW9mIGRldGFpbHMudXNlZCA9PT0gJ251bWJlcicgPyBkZXRhaWxzLnVzZWQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJykgOiAnPyc7XG4gIGNvbnN0IGxpbWl0ID0gdHlwZW9mIGRldGFpbHMubGltaXQgPT09ICdudW1iZXInID8gZGV0YWlscy5saW1pdC50b0xvY2FsZVN0cmluZygnZW4tVVMnKSA6ICc/JztcbiAgY29uc3QgcmVzZXRzID0gdHlwZW9mIGRldGFpbHMucmVzZXRBdCA9PT0gJ3N0cmluZycgJiYgZGV0YWlscy5yZXNldEF0Lmxlbmd0aCA+PSAxMFxuICAgID8gYHJlc2V0cyAke2RldGFpbHMucmVzZXRBdC5zbGljZSgwLCAxMCl9YFxuICAgIDogJ3Jlc2V0cyBhdCB0aGUgZW5kIG9mIHRoZSBwZXJpb2QnO1xuICBjb25zdCBwYXRoID0gdHlwZW9mIGRldGFpbHMudXBncmFkZVVybCA9PT0gJ3N0cmluZycgJiYgZGV0YWlscy51cGdyYWRlVXJsLnN0YXJ0c1dpdGgoJy8nKSA/IGRldGFpbHMudXBncmFkZVVybCA6IFFVT1RBX1VQR1JBREVfUEFUSDtcbiAgcmV0dXJuIGAke2xhYmVsfSBxdW90YSByZWFjaGVkICgke3VzZWR9LyR7bGltaXR9KTsgJHtyZXNldHN9LiBVcGdyYWRlOiAke3BsYXRmb3JtVXJsLnJlcGxhY2UoL1xcLyskLywgJycpfSR7cGF0aH1gO1xufVxuIl19
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Run-time plugin vulnerability check — the CDK-free half.
3
+ *
4
+ * A step's image is pinned at synth. A CVE published (or a KEV listing, or an
5
+ * org-policy change) AFTER that synth never reaches a pipeline that is simply
6
+ * re-run, so a pipeline can opt in to re-asking the plugin service at run
7
+ * time: with {@link RUNTIME_VULN_CHECK_KEY} set, the synth adds one verify
8
+ * step to each stage that runs `pipeline-manager plugin verify --pipeline-id …`,
9
+ * which posts the stage's (stepKey, imageDigest) pairs to
10
+ * `POST /api/plugins/runtime-check` and prints the graded verdict into the
11
+ * build log (the platform also notifies on a pipeline running a vulnerable
12
+ * plugin). It NEVER fails the stage: vulnerability state is reported, not
13
+ * enforced.
14
+ *
15
+ * Dependency-free so the CLI and the synth share one shape.
16
+ */
17
+ /**
18
+ * Pipeline metadata flag (boolean, default false). Under `aws:cdk:` so it is
19
+ * never exported into a step's environment like plain metadata keys are.
20
+ */
21
+ export declare const RUNTIME_VULN_CHECK_KEY = "aws:cdk:operations:runtimevulncheck";
22
+ /** Env var carrying the verify step's JSON `RuntimeCheckStep[]`. */
23
+ export declare const RUNTIME_CHECK_STEPS_ENV = "PB_VERIFY_STEPS";
24
+ /** One step the run-time check asks about. `stepKey` is the step label (`pluginStepLabel`). */
25
+ export interface RuntimeCheckStep {
26
+ readonly stepKey: string;
27
+ readonly imageDigest: string;
28
+ }
29
+ /** Graded verdict, least to most serious. Never a refusal. */
30
+ export type RuntimeCheckVerdict = 'ok' | 'info' | 'warning' | 'error' | 'critical';
31
+ export declare const RUNTIME_CHECK_VERDICTS: readonly RuntimeCheckVerdict[];
32
+ /** `POST /api/plugins/runtime-check` answer. */
33
+ export interface RuntimeCheckResult {
34
+ readonly verdict: RuntimeCheckVerdict;
35
+ readonly steps: ReadonlyArray<{
36
+ readonly stepKey: string;
37
+ readonly imageDigest: string;
38
+ readonly verdict: RuntimeCheckVerdict;
39
+ readonly reasons: ReadonlyArray<{
40
+ readonly code: string;
41
+ readonly message: string;
42
+ readonly severity?: string;
43
+ }>;
44
+ }>;
45
+ }
46
+ /**
47
+ * Parse a JSON `RuntimeCheckStep[]` (the env var, or a file). Throws on
48
+ * anything malformed: a verify step that silently checked nothing would be a
49
+ * false green.
50
+ */
51
+ export declare function parseRuntimeCheckSteps(json: string): RuntimeCheckStep[];
52
+ /** Whether a metadata value turns the check on (`true` / `"true"`). */
53
+ export declare function isRuntimeVulnCheckEnabled(metadata: Record<string, unknown> | undefined): boolean;
@@ -0,0 +1,56 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Run-time plugin vulnerability check — the CDK-free half.
5
+ *
6
+ * A step's image is pinned at synth. A CVE published (or a KEV listing, or an
7
+ * org-policy change) AFTER that synth never reaches a pipeline that is simply
8
+ * re-run, so a pipeline can opt in to re-asking the plugin service at run
9
+ * time: with {@link RUNTIME_VULN_CHECK_KEY} set, the synth adds one verify
10
+ * step to each stage that runs `pipeline-manager plugin verify --pipeline-id …`,
11
+ * which posts the stage's (stepKey, imageDigest) pairs to
12
+ * `POST /api/plugins/runtime-check` and prints the graded verdict into the
13
+ * build log (the platform also notifies on a pipeline running a vulnerable
14
+ * plugin). It NEVER fails the stage: vulnerability state is reported, not
15
+ * enforced.
16
+ *
17
+ * Dependency-free so the CLI and the synth share one shape.
18
+ */
19
+ /**
20
+ * Pipeline metadata flag (boolean, default false). Under `aws:cdk:` so it is
21
+ * never exported into a step's environment like plain metadata keys are.
22
+ */
23
+ export const RUNTIME_VULN_CHECK_KEY = 'aws:cdk:operations:runtimevulncheck';
24
+ /** Env var carrying the verify step's JSON `RuntimeCheckStep[]`. */
25
+ export const RUNTIME_CHECK_STEPS_ENV = 'PB_VERIFY_STEPS';
26
+ export const RUNTIME_CHECK_VERDICTS = ['ok', 'info', 'warning', 'error', 'critical'];
27
+ const DIGEST_RE = /^sha256:[0-9a-f]{64}$/;
28
+ /**
29
+ * Parse a JSON `RuntimeCheckStep[]` (the env var, or a file). Throws on
30
+ * anything malformed: a verify step that silently checked nothing would be a
31
+ * false green.
32
+ */
33
+ export function parseRuntimeCheckSteps(json) {
34
+ let parsed;
35
+ try {
36
+ parsed = JSON.parse(json);
37
+ }
38
+ catch {
39
+ throw new Error(`${RUNTIME_CHECK_STEPS_ENV} is not valid JSON`);
40
+ }
41
+ if (!Array.isArray(parsed))
42
+ throw new Error(`${RUNTIME_CHECK_STEPS_ENV} must be a JSON array of { stepKey, imageDigest }`);
43
+ return parsed.map((entry, i) => {
44
+ const e = entry;
45
+ if (!e || typeof e.stepKey !== 'string' || e.stepKey.length === 0 || typeof e.imageDigest !== 'string' || !DIGEST_RE.test(e.imageDigest)) {
46
+ throw new Error(`${RUNTIME_CHECK_STEPS_ENV}[${i}] must be { stepKey: string, imageDigest: sha256:<64 hex> }`);
47
+ }
48
+ return { stepKey: e.stepKey, imageDigest: e.imageDigest };
49
+ });
50
+ }
51
+ /** Whether a metadata value turns the check on (`true` / `"true"`). */
52
+ export function isRuntimeVulnCheckEnabled(metadata) {
53
+ const v = metadata?.[RUNTIME_VULN_CHECK_KEY];
54
+ return v === true || (typeof v === 'string' && v.toLowerCase() === 'true');
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1jaGVjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtY2hlY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxxQ0FBcUMsQ0FBQztBQUU1RSxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsaUJBQWlCLENBQUM7QUFXekQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQW1DLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBYXJILE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDO0FBRTFDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsSUFBWTtJQUNqRCxJQUFJLE1BQWUsQ0FBQztJQUNwQixJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLHVCQUF1QixvQkFBb0IsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsdUJBQXVCLG1EQUFtRCxDQUFDLENBQUM7SUFDM0gsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLEtBQXlDLENBQUM7UUFDcEQsSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN6SSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsdUJBQXVCLElBQUksQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO1FBQ2hILENBQUM7UUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFFBQTZDO0lBQ3JGLE1BQU0sQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDN0MsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQztBQUM3RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUnVuLXRpbWUgcGx1Z2luIHZ1bG5lcmFiaWxpdHkgY2hlY2sg4oCUIHRoZSBDREstZnJlZSBoYWxmLlxuICpcbiAqIEEgc3RlcCdzIGltYWdlIGlzIHBpbm5lZCBhdCBzeW50aC4gQSBDVkUgcHVibGlzaGVkIChvciBhIEtFViBsaXN0aW5nLCBvciBhblxuICogb3JnLXBvbGljeSBjaGFuZ2UpIEFGVEVSIHRoYXQgc3ludGggbmV2ZXIgcmVhY2hlcyBhIHBpcGVsaW5lIHRoYXQgaXMgc2ltcGx5XG4gKiByZS1ydW4sIHNvIGEgcGlwZWxpbmUgY2FuIG9wdCBpbiB0byByZS1hc2tpbmcgdGhlIHBsdWdpbiBzZXJ2aWNlIGF0IHJ1blxuICogdGltZTogd2l0aCB7QGxpbmsgUlVOVElNRV9WVUxOX0NIRUNLX0tFWX0gc2V0LCB0aGUgc3ludGggYWRkcyBvbmUgdmVyaWZ5XG4gKiBzdGVwIHRvIGVhY2ggc3RhZ2UgdGhhdCBydW5zIGBwaXBlbGluZS1tYW5hZ2VyIHBsdWdpbiB2ZXJpZnkgLS1waXBlbGluZS1pZCDigKZgLFxuICogd2hpY2ggcG9zdHMgdGhlIHN0YWdlJ3MgKHN0ZXBLZXksIGltYWdlRGlnZXN0KSBwYWlycyB0b1xuICogYFBPU1QgL2FwaS9wbHVnaW5zL3J1bnRpbWUtY2hlY2tgIGFuZCBwcmludHMgdGhlIGdyYWRlZCB2ZXJkaWN0IGludG8gdGhlXG4gKiBidWlsZCBsb2cgKHRoZSBwbGF0Zm9ybSBhbHNvIG5vdGlmaWVzIG9uIGEgcGlwZWxpbmUgcnVubmluZyBhIHZ1bG5lcmFibGVcbiAqIHBsdWdpbikuIEl0IE5FVkVSIGZhaWxzIHRoZSBzdGFnZTogdnVsbmVyYWJpbGl0eSBzdGF0ZSBpcyByZXBvcnRlZCwgbm90XG4gKiBlbmZvcmNlZC5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgc28gdGhlIENMSSBhbmQgdGhlIHN5bnRoIHNoYXJlIG9uZSBzaGFwZS5cbiAqL1xuXG4vKipcbiAqIFBpcGVsaW5lIG1ldGFkYXRhIGZsYWcgKGJvb2xlYW4sIGRlZmF1bHQgZmFsc2UpLiBVbmRlciBgYXdzOmNkazpgIHNvIGl0IGlzXG4gKiBuZXZlciBleHBvcnRlZCBpbnRvIGEgc3RlcCdzIGVudmlyb25tZW50IGxpa2UgcGxhaW4gbWV0YWRhdGEga2V5cyBhcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBSVU5USU1FX1ZVTE5fQ0hFQ0tfS0VZID0gJ2F3czpjZGs6b3BlcmF0aW9uczpydW50aW1ldnVsbmNoZWNrJztcblxuLyoqIEVudiB2YXIgY2FycnlpbmcgdGhlIHZlcmlmeSBzdGVwJ3MgSlNPTiBgUnVudGltZUNoZWNrU3RlcFtdYC4gKi9cbmV4cG9ydCBjb25zdCBSVU5USU1FX0NIRUNLX1NURVBTX0VOViA9ICdQQl9WRVJJRllfU1RFUFMnO1xuXG4vKiogT25lIHN0ZXAgdGhlIHJ1bi10aW1lIGNoZWNrIGFza3MgYWJvdXQuIGBzdGVwS2V5YCBpcyB0aGUgc3RlcCBsYWJlbCAoYHBsdWdpblN0ZXBMYWJlbGApLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lQ2hlY2tTdGVwIHtcbiAgcmVhZG9ubHkgc3RlcEtleTogc3RyaW5nO1xuICByZWFkb25seSBpbWFnZURpZ2VzdDogc3RyaW5nO1xufVxuXG4vKiogR3JhZGVkIHZlcmRpY3QsIGxlYXN0IHRvIG1vc3Qgc2VyaW91cy4gTmV2ZXIgYSByZWZ1c2FsLiAqL1xuZXhwb3J0IHR5cGUgUnVudGltZUNoZWNrVmVyZGljdCA9ICdvaycgfCAnaW5mbycgfCAnd2FybmluZycgfCAnZXJyb3InIHwgJ2NyaXRpY2FsJztcblxuZXhwb3J0IGNvbnN0IFJVTlRJTUVfQ0hFQ0tfVkVSRElDVFM6IHJlYWRvbmx5IFJ1bnRpbWVDaGVja1ZlcmRpY3RbXSA9IFsnb2snLCAnaW5mbycsICd3YXJuaW5nJywgJ2Vycm9yJywgJ2NyaXRpY2FsJ107XG5cbi8qKiBgUE9TVCAvYXBpL3BsdWdpbnMvcnVudGltZS1jaGVja2AgYW5zd2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lQ2hlY2tSZXN1bHQge1xuICByZWFkb25seSB2ZXJkaWN0OiBSdW50aW1lQ2hlY2tWZXJkaWN0O1xuICByZWFkb25seSBzdGVwczogUmVhZG9ubHlBcnJheTx7XG4gICAgcmVhZG9ubHkgc3RlcEtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGltYWdlRGlnZXN0OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmVyZGljdDogUnVudGltZUNoZWNrVmVyZGljdDtcbiAgICByZWFkb25seSByZWFzb25zOiBSZWFkb25seUFycmF5PHsgcmVhZG9ubHkgY29kZTogc3RyaW5nOyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7IHJlYWRvbmx5IHNldmVyaXR5Pzogc3RyaW5nIH0+O1xuICB9Pjtcbn1cblxuY29uc3QgRElHRVNUX1JFID0gL15zaGEyNTY6WzAtOWEtZl17NjR9JC87XG5cbi8qKlxuICogUGFyc2UgYSBKU09OIGBSdW50aW1lQ2hlY2tTdGVwW11gICh0aGUgZW52IHZhciwgb3IgYSBmaWxlKS4gVGhyb3dzIG9uXG4gKiBhbnl0aGluZyBtYWxmb3JtZWQ6IGEgdmVyaWZ5IHN0ZXAgdGhhdCBzaWxlbnRseSBjaGVja2VkIG5vdGhpbmcgd291bGQgYmUgYVxuICogZmFsc2UgZ3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJ1bnRpbWVDaGVja1N0ZXBzKGpzb246IHN0cmluZyk6IFJ1bnRpbWVDaGVja1N0ZXBbXSB7XG4gIGxldCBwYXJzZWQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShqc29uKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke1JVTlRJTUVfQ0hFQ0tfU1RFUFNfRU5WfSBpcyBub3QgdmFsaWQgSlNPTmApO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXJzZWQpKSB0aHJvdyBuZXcgRXJyb3IoYCR7UlVOVElNRV9DSEVDS19TVEVQU19FTlZ9IG11c3QgYmUgYSBKU09OIGFycmF5IG9mIHsgc3RlcEtleSwgaW1hZ2VEaWdlc3QgfWApO1xuICByZXR1cm4gcGFyc2VkLm1hcCgoZW50cnksIGkpID0+IHtcbiAgICBjb25zdCBlID0gZW50cnkgYXMgUGFydGlhbDxSdW50aW1lQ2hlY2tTdGVwPiB8IG51bGw7XG4gICAgaWYgKCFlIHx8IHR5cGVvZiBlLnN0ZXBLZXkgIT09ICdzdHJpbmcnIHx8IGUuc3RlcEtleS5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGUuaW1hZ2VEaWdlc3QgIT09ICdzdHJpbmcnIHx8ICFESUdFU1RfUkUudGVzdChlLmltYWdlRGlnZXN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1JVTlRJTUVfQ0hFQ0tfU1RFUFNfRU5WfVske2l9XSBtdXN0IGJlIHsgc3RlcEtleTogc3RyaW5nLCBpbWFnZURpZ2VzdDogc2hhMjU2Ojw2NCBoZXg+IH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RlcEtleTogZS5zdGVwS2V5LCBpbWFnZURpZ2VzdDogZS5pbWFnZURpZ2VzdCB9O1xuICB9KTtcbn1cblxuLyoqIFdoZXRoZXIgYSBtZXRhZGF0YSB2YWx1ZSB0dXJucyB0aGUgY2hlY2sgb24gKGB0cnVlYCAvIGBcInRydWVcImApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUnVudGltZVZ1bG5DaGVja0VuYWJsZWQobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGNvbnN0IHYgPSBtZXRhZGF0YT8uW1JVTlRJTUVfVlVMTl9DSEVDS19LRVldO1xuICByZXR1cm4gdiA9PT0gdHJ1ZSB8fCAodHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnKTtcbn1cbiJdfQ==
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Uploading a step's security reports (SARIF / trivy JSON / grype JSON) to
3
+ * `POST /api/pipelines/:id/security-reports`.
4
+ *
5
+ * A plugin step has no platform credential: plugin images don't carry
6
+ * `pipeline-manager`, and the org's `platform` secret is the full-privilege
7
+ * automation key, which a container that builds user code must not hold. So a
8
+ * step that opts in (`PB_UPLOAD_SECURITY_REPORTS=true` in its env, metadata or
9
+ * the plugin's defaults) gets the org's `reporting:ingest`-SCOPED key instead —
10
+ * the same least-privilege credential the events Lambda reports with, minted by
11
+ * `pipeline-manager infra store-token --scope reporting:ingest` — injected by
12
+ * CodeBuild from Secrets Manager as {@link SECURITY_REPORT_KEY_ENV}. The plugin
13
+ * POSTs with it as a Bearer credential. Opting in without that secret fails the
14
+ * build at DOWNLOAD_SOURCE (CodeBuild requires the secret) — loud, not skipped.
15
+ *
16
+ * Dependency-free so the CLI and the synth share the names.
17
+ */
18
+ /** Step env flag that opts a step in to report upload. */
19
+ export declare const SECURITY_REPORT_UPLOAD_ENV = "PB_UPLOAD_SECURITY_REPORTS";
20
+ /** Env var the scoped upload key is injected as. */
21
+ export declare const SECURITY_REPORT_KEY_ENV = "PB_SECURITY_REPORT_KEY";
22
+ /** Secrets Manager leaf of the scoped key (`scopeSecretLeaf('reporting:ingest')`). */
23
+ export declare const SECURITY_REPORT_SECRET_LEAF = "reporting-ingest";
24
+ /** Report formats the ingest endpoint accepts. */
25
+ export declare const SECURITY_REPORT_FORMATS: readonly ['sarif', 'trivy-json', 'grype-json'];
26
+ export type SecurityReportFormat = (typeof SECURITY_REPORT_FORMATS)[number];
@@ -0,0 +1,28 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Uploading a step's security reports (SARIF / trivy JSON / grype JSON) to
5
+ * `POST /api/pipelines/:id/security-reports`.
6
+ *
7
+ * A plugin step has no platform credential: plugin images don't carry
8
+ * `pipeline-manager`, and the org's `platform` secret is the full-privilege
9
+ * automation key, which a container that builds user code must not hold. So a
10
+ * step that opts in (`PB_UPLOAD_SECURITY_REPORTS=true` in its env, metadata or
11
+ * the plugin's defaults) gets the org's `reporting:ingest`-SCOPED key instead —
12
+ * the same least-privilege credential the events Lambda reports with, minted by
13
+ * `pipeline-manager infra store-token --scope reporting:ingest` — injected by
14
+ * CodeBuild from Secrets Manager as {@link SECURITY_REPORT_KEY_ENV}. The plugin
15
+ * POSTs with it as a Bearer credential. Opting in without that secret fails the
16
+ * build at DOWNLOAD_SOURCE (CodeBuild requires the secret) — loud, not skipped.
17
+ *
18
+ * Dependency-free so the CLI and the synth share the names.
19
+ */
20
+ /** Step env flag that opts a step in to report upload. */
21
+ export const SECURITY_REPORT_UPLOAD_ENV = 'PB_UPLOAD_SECURITY_REPORTS';
22
+ /** Env var the scoped upload key is injected as. */
23
+ export const SECURITY_REPORT_KEY_ENV = 'PB_SECURITY_REPORT_KEY';
24
+ /** Secrets Manager leaf of the scoped key (`scopeSecretLeaf('reporting:ingest')`). */
25
+ export const SECURITY_REPORT_SECRET_LEAF = 'reporting-ingest';
26
+ /** Report formats the ingest endpoint accepts. */
27
+ export const SECURITY_REPORT_FORMATS = ['sarif', 'trivy-json', 'grype-json'];
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktcmVwb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3NlY3VyaXR5LXJlcG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILDBEQUEwRDtBQUMxRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw0QkFBNEIsQ0FBQztBQUV2RSxvREFBb0Q7QUFDcEQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsd0JBQXdCLENBQUM7QUFFaEUsc0ZBQXNGO0FBQ3RGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLGtCQUFrQixDQUFDO0FBRTlELGtEQUFrRDtBQUNsRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBVcGxvYWRpbmcgYSBzdGVwJ3Mgc2VjdXJpdHkgcmVwb3J0cyAoU0FSSUYgLyB0cml2eSBKU09OIC8gZ3J5cGUgSlNPTikgdG9cbiAqIGBQT1NUIC9hcGkvcGlwZWxpbmVzLzppZC9zZWN1cml0eS1yZXBvcnRzYC5cbiAqXG4gKiBBIHBsdWdpbiBzdGVwIGhhcyBubyBwbGF0Zm9ybSBjcmVkZW50aWFsOiBwbHVnaW4gaW1hZ2VzIGRvbid0IGNhcnJ5XG4gKiBgcGlwZWxpbmUtbWFuYWdlcmAsIGFuZCB0aGUgb3JnJ3MgYHBsYXRmb3JtYCBzZWNyZXQgaXMgdGhlIGZ1bGwtcHJpdmlsZWdlXG4gKiBhdXRvbWF0aW9uIGtleSwgd2hpY2ggYSBjb250YWluZXIgdGhhdCBidWlsZHMgdXNlciBjb2RlIG11c3Qgbm90IGhvbGQuIFNvIGFcbiAqIHN0ZXAgdGhhdCBvcHRzIGluIChgUEJfVVBMT0FEX1NFQ1VSSVRZX1JFUE9SVFM9dHJ1ZWAgaW4gaXRzIGVudiwgbWV0YWRhdGEgb3JcbiAqIHRoZSBwbHVnaW4ncyBkZWZhdWx0cykgZ2V0cyB0aGUgb3JnJ3MgYHJlcG9ydGluZzppbmdlc3RgLVNDT1BFRCBrZXkgaW5zdGVhZCDigJRcbiAqIHRoZSBzYW1lIGxlYXN0LXByaXZpbGVnZSBjcmVkZW50aWFsIHRoZSBldmVudHMgTGFtYmRhIHJlcG9ydHMgd2l0aCwgbWludGVkIGJ5XG4gKiBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlcG9ydGluZzppbmdlc3RgIOKAlCBpbmplY3RlZCBieVxuICogQ29kZUJ1aWxkIGZyb20gU2VjcmV0cyBNYW5hZ2VyIGFzIHtAbGluayBTRUNVUklUWV9SRVBPUlRfS0VZX0VOVn0uIFRoZSBwbHVnaW5cbiAqIFBPU1RzIHdpdGggaXQgYXMgYSBCZWFyZXIgY3JlZGVudGlhbC4gT3B0aW5nIGluIHdpdGhvdXQgdGhhdCBzZWNyZXQgZmFpbHMgdGhlXG4gKiBidWlsZCBhdCBET1dOTE9BRF9TT1VSQ0UgKENvZGVCdWlsZCByZXF1aXJlcyB0aGUgc2VjcmV0KSDigJQgbG91ZCwgbm90IHNraXBwZWQuXG4gKlxuICogRGVwZW5kZW5jeS1mcmVlIHNvIHRoZSBDTEkgYW5kIHRoZSBzeW50aCBzaGFyZSB0aGUgbmFtZXMuXG4gKi9cblxuLyoqIFN0ZXAgZW52IGZsYWcgdGhhdCBvcHRzIGEgc3RlcCBpbiB0byByZXBvcnQgdXBsb2FkLiAqL1xuZXhwb3J0IGNvbnN0IFNFQ1VSSVRZX1JFUE9SVF9VUExPQURfRU5WID0gJ1BCX1VQTE9BRF9TRUNVUklUWV9SRVBPUlRTJztcblxuLyoqIEVudiB2YXIgdGhlIHNjb3BlZCB1cGxvYWQga2V5IGlzIGluamVjdGVkIGFzLiAqL1xuZXhwb3J0IGNvbnN0IFNFQ1VSSVRZX1JFUE9SVF9LRVlfRU5WID0gJ1BCX1NFQ1VSSVRZX1JFUE9SVF9LRVknO1xuXG4vKiogU2VjcmV0cyBNYW5hZ2VyIGxlYWYgb2YgdGhlIHNjb3BlZCBrZXkgKGBzY29wZVNlY3JldExlYWYoJ3JlcG9ydGluZzppbmdlc3QnKWApLiAqL1xuZXhwb3J0IGNvbnN0IFNFQ1VSSVRZX1JFUE9SVF9TRUNSRVRfTEVBRiA9ICdyZXBvcnRpbmctaW5nZXN0JztcblxuLyoqIFJlcG9ydCBmb3JtYXRzIHRoZSBpbmdlc3QgZW5kcG9pbnQgYWNjZXB0cy4gKi9cbmV4cG9ydCBjb25zdCBTRUNVUklUWV9SRVBPUlRfRk9STUFUUyA9IFsnc2FyaWYnLCAndHJpdnktanNvbicsICdncnlwZS1qc29uJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTZWN1cml0eVJlcG9ydEZvcm1hdCA9ICh0eXBlb2YgU0VDVVJJVFlfUkVQT1JUX0ZPUk1BVFMpW251bWJlcl07XG4iXX0=
@@ -27,6 +27,13 @@ export interface StepManifestEntry {
27
27
  readonly pluginVersion: string;
28
28
  /** Signed image digest the step is pinned to; null for image-less plugins. */
29
29
  readonly imageDigest: string | null;
30
+ /**
31
+ * The step's label (`pluginStepLabel`: `synth` or `<stage>/<alias ?? name>`) —
32
+ * what the CLI and the lookup Lambda send as lookup `context.stepKeys`, and the
33
+ * run-time check asks about. Lets the platform join lookup warnings to this
34
+ * manifest row.
35
+ */
36
+ readonly stepKey?: string;
30
37
  }
31
38
  /** The plugin fields {@link pluginImageRepository} reads. */
32
39
  export interface PluginImageRef {