@pipeline-builder/pipeline-manager 3.4.69 → 3.4.71

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 (84) hide show
  1. package/README.md +32 -2
  2. package/dist/agent/ai.d.ts +55 -0
  3. package/dist/agent/ai.d.ts.map +1 -0
  4. package/dist/agent/ai.js +130 -0
  5. package/dist/agent/executor.d.ts +24 -0
  6. package/dist/agent/executor.d.ts.map +1 -0
  7. package/dist/agent/executor.js +54 -0
  8. package/dist/agent/health.d.ts +22 -0
  9. package/dist/agent/health.d.ts.map +1 -0
  10. package/dist/agent/health.js +55 -0
  11. package/dist/agent/prereqs.d.ts +16 -0
  12. package/dist/agent/prereqs.d.ts.map +1 -0
  13. package/dist/agent/prereqs.js +73 -0
  14. package/dist/agent/targets.d.ts +83 -0
  15. package/dist/agent/targets.d.ts.map +1 -0
  16. package/dist/agent/targets.js +142 -0
  17. package/dist/agent/troubleshoot.d.ts +30 -0
  18. package/dist/agent/troubleshoot.d.ts.map +1 -0
  19. package/dist/agent/troubleshoot.js +87 -0
  20. package/dist/boilerplate.js +8 -13
  21. package/dist/cli.d.ts.map +1 -1
  22. package/dist/cli.js +114 -116
  23. package/dist/commands/audit-stacks.js +22 -24
  24. package/dist/commands/audit-tokens.js +25 -27
  25. package/dist/commands/bootstrap.js +29 -37
  26. package/dist/commands/create-pipeline.js +55 -92
  27. package/dist/commands/deploy.d.ts.map +1 -1
  28. package/dist/commands/deploy.js +58 -62
  29. package/dist/commands/get-pipeline.js +24 -28
  30. package/dist/commands/get-plugin.js +24 -28
  31. package/dist/commands/list-pipelines.js +30 -31
  32. package/dist/commands/list-plugins.js +32 -33
  33. package/dist/commands/login.js +44 -49
  34. package/dist/commands/org-export.js +22 -60
  35. package/dist/commands/provision.d.ts +12 -0
  36. package/dist/commands/provision.d.ts.map +1 -0
  37. package/dist/commands/provision.js +362 -0
  38. package/dist/commands/register.js +29 -30
  39. package/dist/commands/setup-events.d.ts.map +1 -1
  40. package/dist/commands/setup-events.js +42 -77
  41. package/dist/commands/status.js +20 -25
  42. package/dist/commands/store-token.js +44 -82
  43. package/dist/commands/synth.d.ts.map +1 -1
  44. package/dist/commands/synth.js +36 -35
  45. package/dist/commands/upload-plugin.js +59 -96
  46. package/dist/commands/validate-templates.d.ts.map +1 -1
  47. package/dist/commands/validate-templates.js +23 -29
  48. package/dist/commands/version.js +42 -47
  49. package/dist/config/cli.constants.d.ts.map +1 -1
  50. package/dist/config/cli.constants.js +24 -31
  51. package/dist/types/config.js +2 -3
  52. package/dist/types/error.js +3 -7
  53. package/dist/types/index.d.ts +4 -4
  54. package/dist/types/index.d.ts.map +1 -1
  55. package/dist/types/index.js +5 -21
  56. package/dist/types/pipeline.js +2 -3
  57. package/dist/types/plugin.js +2 -3
  58. package/dist/utils/api-client.d.ts +1 -1
  59. package/dist/utils/api-client.d.ts.map +1 -1
  60. package/dist/utils/api-client.js +23 -28
  61. package/dist/utils/audit-log.js +16 -22
  62. package/dist/utils/auth-guard.js +2 -5
  63. package/dist/utils/aws-secrets.js +17 -23
  64. package/dist/utils/banner.js +16 -23
  65. package/dist/utils/cdk-utils.js +14 -24
  66. package/dist/utils/command-utils.d.ts +1 -1
  67. package/dist/utils/command-utils.d.ts.map +1 -1
  68. package/dist/utils/command-utils.js +32 -44
  69. package/dist/utils/config-loader.d.ts +1 -1
  70. package/dist/utils/config-loader.d.ts.map +1 -1
  71. package/dist/utils/config-loader.js +24 -58
  72. package/dist/utils/error-handler.d.ts +1 -1
  73. package/dist/utils/error-handler.d.ts.map +1 -1
  74. package/dist/utils/error-handler.js +16 -24
  75. package/dist/utils/list-command-utils.js +15 -20
  76. package/dist/utils/output-utils.d.ts +1 -1
  77. package/dist/utils/output-utils.d.ts.map +1 -1
  78. package/dist/utils/output-utils.js +35 -55
  79. package/dist/utils/plugin-resolver.d.ts +1 -1
  80. package/dist/utils/plugin-resolver.d.ts.map +1 -1
  81. package/dist/utils/plugin-resolver.js +6 -8
  82. package/dist/utils/rate-limiter.js +11 -19
  83. package/dist/utils/registry.js +16 -22
  84. package/package.json +26 -17
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Deterministic registry of platform deploy targets — the source of truth the
3
+ * `provision` advisor uses to assemble the EXACT deploy command. The agent is a
4
+ * thin wrapper over the existing deploy scripts; it never reimplements
5
+ * deployment, only validates inputs and assembles the command to run.
6
+ *
7
+ * Keep this in lock-step with the flags the scripts accept — every target's
8
+ * operator entrypoint is `bin/setup.sh` (deploy/<target>/bin/setup.sh).
9
+ */
10
+ export type TargetId = 'local' | 'minikube' | 'ec2' | 'fargate';
11
+ /** A single input the underlying deploy script accepts. */
12
+ export interface InputSpec {
13
+ /** Flag name passed to the script (without the leading `--`). */
14
+ readonly flag: string;
15
+ /** Key on the provision params object. */
16
+ readonly key: string;
17
+ /** Human description — shown when a required input is missing. */
18
+ readonly description: string;
19
+ /** Secret — never printed in the assembled command (masked as `***`). */
20
+ readonly secret?: boolean;
21
+ /** Boolean flag with no value (e.g. `--email`). */
22
+ readonly boolean?: boolean;
23
+ }
24
+ export interface TargetSpec {
25
+ readonly id: TargetId;
26
+ readonly label: string;
27
+ /** Directory the entrypoint runs from (relative to repo root). */
28
+ readonly dir: string;
29
+ /** Entrypoint script (relative to `dir`). */
30
+ readonly entrypoint: string;
31
+ /** Inputs the script REQUIRES — the advisor reports any that are missing. */
32
+ readonly required: readonly InputSpec[];
33
+ /** Optional inputs, passed through only when provided. */
34
+ readonly optional: readonly InputSpec[];
35
+ /** Post-deploy step to surface (registers admin + loads plugins). */
36
+ readonly postDeploy?: string;
37
+ /** Rough monthly cost (from docs). */
38
+ readonly cost: string;
39
+ /** One-line "best for". */
40
+ readonly bestFor: string;
41
+ /** What a teardown of this target destroys — shown before a (gated) teardown. */
42
+ readonly destroys: string;
43
+ }
44
+ export declare const TARGETS: Readonly<Record<TargetId, TargetSpec>>;
45
+ export declare const TARGET_IDS: readonly TargetId[];
46
+ export declare function isTargetId(value: unknown): value is TargetId;
47
+ export interface AssembleResult {
48
+ /** The exact command to run — secrets masked as `***`. */
49
+ readonly command: string;
50
+ /** Required inputs that were not supplied. */
51
+ readonly missing: readonly InputSpec[];
52
+ }
53
+ /**
54
+ * Assemble the deploy command for a target from the provided params. Pure and
55
+ * deterministic — no shell, no LLM. Missing required inputs are reported (never
56
+ * guessed). By default secrets are masked (`***`) for DISPLAY; pass `mask: false`
57
+ * to build the real command for EXECUTION — that string must never be logged or
58
+ * shown to the model.
59
+ */
60
+ export declare function assembleCommand(target: TargetSpec, params: Record<string, unknown>, opts?: {
61
+ mask?: boolean;
62
+ }): AssembleResult;
63
+ export interface TeardownResult {
64
+ /** The exact teardown command to run. */
65
+ readonly command: string;
66
+ /** Whether this teardown irreversibly destroys data (AWS targets). */
67
+ readonly destructive: boolean;
68
+ }
69
+ /**
70
+ * Assemble the teardown command for a target. Pure and deterministic — mirrors
71
+ * `assembleCommand` for the destroy path. local/minikube STOP the stack
72
+ * (non-destructive — on-disk / PVC data survives); ec2/fargate DELETE their
73
+ * CloudFormation stacks and are irreversible. For Fargate, `assumeYes` forwards
74
+ * the native script's own `--yes` (the agent runs its own typed confirmation
75
+ * first, so the script must not also block on stdin); EC2 `delete-stack` has no
76
+ * native prompt, which is exactly why the agent gate is mandatory there.
77
+ */
78
+ export declare function teardownCommand(target: TargetId, opts?: {
79
+ stackName?: string;
80
+ region?: string;
81
+ assumeYes?: boolean;
82
+ }): TeardownResult;
83
+ //# sourceMappingURL=targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../../src/agent/targets.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;AAEhE,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;IACxC,qEAAqE;IACrE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AA0BD,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAiD1D,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAA4C,CAAC;AAEvF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AAED,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;CACxC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5B,cAAc,CAqBhB;AAED,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAOD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,QAAQ,EAChB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACtE,cAAc,CA0BhB"}
@@ -0,0 +1,142 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // --- Shared input specs -----------------------------------------------------
4
+ const DOMAIN = { flag: 'domain', key: 'domain', description: 'Fully-qualified domain name (ALB ACM cert + SES DKIM)' };
5
+ const HOSTED_ZONE = { flag: 'hosted-zone-id', key: 'hostedZoneId', description: 'Public Route 53 hosted zone ID authoritative for the domain' };
6
+ const GHCR_TOKEN = { flag: 'ghcr-token', key: 'ghcrToken', description: 'GitHub PAT with read:packages (avoids ghcr.io anonymous rate limits)', secret: true };
7
+ const REGION = { flag: 'region', key: 'region', description: 'AWS region' };
8
+ const DEPLOY_MODE = { flag: 'deploy-mode', key: 'deployMode', description: 'public (internet-facing ALB) or private (internal, default)' };
9
+ const KEY_PAIR = { flag: 'key-pair', key: 'keyPair', description: 'EC2 key pair in the region (break-glass serial console; routine access is SSM)' };
10
+ const INSTANCE_TYPE = { flag: 'instance-type', key: 'instanceType', description: 'EC2 instance type (default t3.2xlarge)' };
11
+ // SES / email family — shared by ec2 + fargate. SES is provisioned BY DEFAULT
12
+ // on AWS deploys; `--no-email` is the opt-out (`--email` is a harmless no-op kept
13
+ // for back-compat).
14
+ const EMAIL = [
15
+ { flag: 'email', key: 'email', description: 'Enable SES transactional email (on by default for AWS)', boolean: true },
16
+ { flag: 'no-email', key: 'noEmail', description: 'Skip SES (transactional email is provisioned by default)', boolean: true },
17
+ { flag: 'email-from', key: 'emailFrom', description: 'From address (default noreply@<domain>)' },
18
+ { flag: 'email-from-name', key: 'emailFromName', description: 'Display name on outbound email' },
19
+ { flag: 'alert-email', key: 'alertEmail', description: 'Subscribe an address to the bounce/complaint SNS topic' },
20
+ { flag: 'no-create-ses-identity', key: 'noCreateSesIdentity', description: 'Skip SES identity creation (domain already verified)', boolean: true },
21
+ ];
22
+ // --- Targets ----------------------------------------------------------------
23
+ export const TARGETS = {
24
+ local: {
25
+ id: 'local',
26
+ label: 'Local (Docker Compose)',
27
+ dir: 'deploy/local',
28
+ entrypoint: 'bin/setup.sh',
29
+ required: [],
30
+ optional: [],
31
+ postDeploy: './deploy/bin/init-platform.sh local',
32
+ cost: 'Free',
33
+ bestFor: 'Development',
34
+ destroys: 'stops all containers — data under deploy/local/data persists on disk (delete it manually for a clean slate)',
35
+ },
36
+ minikube: {
37
+ id: 'minikube',
38
+ label: 'Minikube (local Kubernetes)',
39
+ dir: 'deploy/minikube',
40
+ entrypoint: 'bin/setup.sh',
41
+ required: [],
42
+ optional: [],
43
+ postDeploy: './deploy/bin/init-platform.sh minikube',
44
+ cost: 'Free',
45
+ bestFor: 'Local Kubernetes',
46
+ destroys: 'stops the minikube stack — persistent volumes (PVC data) remain until the cluster is deleted',
47
+ },
48
+ ec2: {
49
+ id: 'ec2',
50
+ label: 'AWS EC2 (single Minikube instance behind an ALB)',
51
+ dir: 'deploy/aws/ec2',
52
+ entrypoint: 'bin/setup.sh',
53
+ required: [KEY_PAIR, DOMAIN, HOSTED_ZONE],
54
+ optional: [REGION, DEPLOY_MODE, GHCR_TOKEN, INSTANCE_TYPE, ...EMAIL],
55
+ postDeploy: './deploy/bin/init-platform.sh ec2 # from inside the VPC (SSM)',
56
+ cost: '~$140-265/mo',
57
+ bestFor: 'Dev / staging',
58
+ destroys: 'DELETES the CloudFormation stack: the VPC, EC2 instance, and its EBS data volume (databases, registry, plugin builds). Irreversible.',
59
+ },
60
+ fargate: {
61
+ id: 'fargate',
62
+ label: 'AWS Fargate (serverless ECS, 6 CloudFormation stacks)',
63
+ dir: 'deploy/aws/fargate',
64
+ entrypoint: 'bin/setup.sh',
65
+ required: [DOMAIN, HOSTED_ZONE],
66
+ optional: [REGION, DEPLOY_MODE, GHCR_TOKEN, ...EMAIL],
67
+ postDeploy: './deploy/bin/init-platform.sh fargate # from a VPC-attached host',
68
+ cost: '~$100-300/mo',
69
+ bestFor: 'Production',
70
+ destroys: 'DELETES all pb-* CloudFormation stacks: EFS data, databases, and registry. Secrets Manager entries are NOT auto-deleted. Irreversible.',
71
+ },
72
+ };
73
+ export const TARGET_IDS = ['local', 'minikube', 'ec2', 'fargate'];
74
+ export function isTargetId(value) {
75
+ return typeof value === 'string' && TARGET_IDS.includes(value);
76
+ }
77
+ /**
78
+ * Assemble the deploy command for a target from the provided params. Pure and
79
+ * deterministic — no shell, no LLM. Missing required inputs are reported (never
80
+ * guessed). By default secrets are masked (`***`) for DISPLAY; pass `mask: false`
81
+ * to build the real command for EXECUTION — that string must never be logged or
82
+ * shown to the model.
83
+ */
84
+ export function assembleCommand(target, params, opts = {}) {
85
+ const mask = opts.mask ?? true;
86
+ const provided = (spec) => {
87
+ const v = params[spec.key];
88
+ return v !== undefined && v !== '' && v !== false;
89
+ };
90
+ const missing = target.required.filter((spec) => !provided(spec));
91
+ const parts = [`cd ${target.dir} && bash ${target.entrypoint}`];
92
+ for (const spec of [...target.required, ...target.optional]) {
93
+ if (!provided(spec))
94
+ continue;
95
+ if (spec.boolean) {
96
+ parts.push(`--${spec.flag}`);
97
+ continue;
98
+ }
99
+ const value = spec.secret && mask ? '***' : String(params[spec.key]);
100
+ parts.push(`--${spec.flag} ${value}`);
101
+ }
102
+ return { command: parts.join(' \\\n '), missing };
103
+ }
104
+ /** CloudFormation stack name the EC2 setup.sh defaults to. */
105
+ const DEFAULT_EC2_STACK = 'pipeline-builder';
106
+ /** Stack prefix the Fargate teardown.sh defaults to. */
107
+ const DEFAULT_FARGATE_PREFIX = 'pb';
108
+ /**
109
+ * Assemble the teardown command for a target. Pure and deterministic — mirrors
110
+ * `assembleCommand` for the destroy path. local/minikube STOP the stack
111
+ * (non-destructive — on-disk / PVC data survives); ec2/fargate DELETE their
112
+ * CloudFormation stacks and are irreversible. For Fargate, `assumeYes` forwards
113
+ * the native script's own `--yes` (the agent runs its own typed confirmation
114
+ * first, so the script must not also block on stdin); EC2 `delete-stack` has no
115
+ * native prompt, which is exactly why the agent gate is mandatory there.
116
+ */
117
+ export function teardownCommand(target, opts = {}) {
118
+ const region = opts.region || process.env.AWS_REGION || 'us-east-1';
119
+ switch (target) {
120
+ case 'local':
121
+ return { command: 'cd deploy/local && bash bin/shutdown.sh', destructive: false };
122
+ case 'minikube':
123
+ return { command: 'cd deploy/minikube && bash bin/shutdown.sh', destructive: false };
124
+ case 'ec2': {
125
+ const stack = opts.stackName || DEFAULT_EC2_STACK;
126
+ return {
127
+ command: `aws cloudformation delete-stack --stack-name ${stack} --region ${region} && ` +
128
+ `aws cloudformation wait stack-delete-complete --stack-name ${stack} --region ${region}`,
129
+ destructive: true,
130
+ };
131
+ }
132
+ case 'fargate': {
133
+ const prefix = opts.stackName || DEFAULT_FARGATE_PREFIX;
134
+ return {
135
+ command: `cd deploy/aws/fargate && bash bin/teardown.sh --stack-prefix ${prefix} --region ${region}` +
136
+ (opts.assumeYes ? ' --yes' : ''),
137
+ destructive: true,
138
+ };
139
+ }
140
+ }
141
+ }
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZ2VudC90YXJnZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFpRHRDLCtFQUErRTtBQUUvRSxNQUFNLE1BQU0sR0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsdURBQXVELEVBQUUsQ0FBQztBQUNsSSxNQUFNLFdBQVcsR0FBYyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSw2REFBNkQsRUFBRSxDQUFDO0FBQzNKLE1BQU0sVUFBVSxHQUFjLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxzRUFBc0UsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUssTUFBTSxNQUFNLEdBQWMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ3ZGLE1BQU0sV0FBVyxHQUFjLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSw2REFBNkQsRUFBRSxDQUFDO0FBQ3RKLE1BQU0sUUFBUSxHQUFjLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxnRkFBZ0YsRUFBRSxDQUFDO0FBQ2hLLE1BQU0sYUFBYSxHQUFjLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSx3Q0FBd0MsRUFBRSxDQUFDO0FBRXZJLDhFQUE4RTtBQUM5RSxrRkFBa0Y7QUFDbEYsb0JBQW9CO0FBQ3BCLE1BQU0sS0FBSyxHQUF5QjtJQUNsQyxFQUFFLElBQUks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SSxzQkFBc0IsQ0FBQztZQUN4RCxPQUFPO2dCQUNMLE9BQU8sRUFDTCxnRUFBZ0UsTUFBTSxhQUFhLE1BQU0sRUFBRTtvQkFDM0YsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsV0FBVyxFQUFFLElBQUk7YUFDbEIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIERldGVybWluaXN0aWMgcmVnaXN0cnkgb2YgcGxhdGZvcm0gZGVwbG95IHRhcmdldHMg4oCUIHRoZSBzb3VyY2Ugb2YgdHJ1dGggdGhlXG4gKiBgcHJvdmlzaW9uYCBhZHZpc29yIHVzZXMgdG8gYXNzZW1ibGUgdGhlIEVYQUNUIGRlcGxveSBjb21tYW5kLiBUaGUgYWdlbnQgaXMgYVxuICogdGhpbiB3cmFwcGVyIG92ZXIgdGhlIGV4aXN0aW5nIGRlcGxveSBzY3JpcHRzOyBpdCBuZXZlciByZWltcGxlbWVudHNcbiAqIGRlcGxveW1lbnQsIG9ubHkgdmFsaWRhdGVzIGlucHV0cyBhbmQgYXNzZW1ibGVzIHRoZSBjb21tYW5kIHRvIHJ1bi5cbiAqXG4gKiBLZWVwIHRoaXMgaW4gbG9jay1zdGVwIHdpdGggdGhlIGZsYWdzIHRoZSBzY3JpcHRzIGFjY2VwdCDigJQgZXZlcnkgdGFyZ2V0J3NcbiAqIG9wZXJhdG9yIGVudHJ5cG9pbnQgaXMgYGJpbi9zZXR1cC5zaGAgKGRlcGxveS88dGFyZ2V0Pi9iaW4vc2V0dXAuc2gpLlxuICovXG5cbmV4cG9ydCB0eXBlIFRhcmdldElkID0gJ2xvY2FsJyB8ICdtaW5pa3ViZScgfCAnZWMyJyB8ICdmYXJnYXRlJztcblxuLyoqIEEgc2luZ2xlIGlucHV0IHRoZSB1bmRlcmx5aW5nIGRlcGxveSBzY3JpcHQgYWNjZXB0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXRTcGVjIHtcbiAgLyoqIEZsYWcgbmFtZSBwYXNzZWQgdG8gdGhlIHNjcmlwdCAod2l0aG91dCB0aGUgbGVhZGluZyBgLS1gKS4gKi9cbiAgcmVhZG9ubHkgZmxhZzogc3RyaW5nO1xuICAvKiogS2V5IG9uIHRoZSBwcm92aXNpb24gcGFyYW1zIG9iamVjdC4gKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIC8qKiBIdW1hbiBkZXNjcmlwdGlvbiDigJQgc2hvd24gd2hlbiBhIHJlcXVpcmVkIGlucHV0IGlzIG1pc3NpbmcuICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKiBTZWNyZXQg4oCUIG5ldmVyIHByaW50ZWQgaW4gdGhlIGFzc2VtYmxlZCBjb21tYW5kIChtYXNrZWQgYXMgYCoqKmApLiAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBib29sZWFuO1xuICAvKiogQm9vbGVhbiBmbGFnIHdpdGggbm8gdmFsdWUgKGUuZy4gYC0tZW1haWxgKS4gKi9cbiAgcmVhZG9ubHkgYm9vbGVhbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFyZ2V0U3BlYyB7XG4gIHJlYWRvbmx5IGlkOiBUYXJnZXRJZDtcbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcbiAgLyoqIERpcmVjdG9yeSB0aGUgZW50cnlwb2ludCBydW5zIGZyb20gKHJlbGF0aXZlIHRvIHJlcG8gcm9vdCkuICovXG4gIHJlYWRvbmx5IGRpcjogc3RyaW5nO1xuICAvKiogRW50cnlwb2ludCBzY3JpcHQgKHJlbGF0aXZlIHRvIGBkaXJgKS4gKi9cbiAgcmVhZG9ubHkgZW50cnlwb2ludDogc3RyaW5nO1xuICAvKiogSW5wdXRzIHRoZSBzY3JpcHQgUkVRVUlSRVMg4oCUIHRoZSBhZHZpc29yIHJlcG9ydHMgYW55IHRoYXQgYXJlIG1pc3NpbmcuICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkOiByZWFkb25seSBJbnB1dFNwZWNbXTtcbiAgLyoqIE9wdGlvbmFsIGlucHV0cywgcGFzc2VkIHRocm91Z2ggb25seSB3aGVuIHByb3ZpZGVkLiAqL1xuICByZWFkb25seSBvcHRpb25hbDogcmVhZG9ubHkgSW5wdXRTcGVjW107XG4gIC8qKiBQb3N0LWRlcGxveSBzdGVwIHRvIHN1cmZhY2UgKHJlZ2lzdGVycyBhZG1pbiArIGxvYWRzIHBsdWdpbnMpLiAqL1xuICByZWFkb25seSBwb3N0RGVwbG95Pzogc3RyaW5nO1xuICAvKiogUm91Z2ggbW9udGhseSBjb3N0IChmcm9tIGRvY3MpLiAqL1xuICByZWFkb25seSBjb3N0OiBzdHJpbmc7XG4gIC8qKiBPbmUtbGluZSBcImJlc3QgZm9yXCIuICovXG4gIHJlYWRvbmx5IGJlc3RGb3I6IHN0cmluZztcbiAgLyoqIFdoYXQgYSB0ZWFyZG93biBvZiB0aGlzIHRhcmdldCBkZXN0cm95cyDigJQgc2hvd24gYmVmb3JlIGEgKGdhdGVkKSB0ZWFyZG93bi4gKi9cbiAgcmVhZG9ubHkgZGVzdHJveXM6IHN0cmluZztcbn1cblxuLy8gLS0tIFNoYXJlZCBpbnB1dCBzcGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBET01BSU46IElucHV0U3BlYyA9IHsgZmxhZzogJ2RvbWFpbicsIGtleTogJ2RvbWFpbicsIGRlc2NyaXB0aW9uOiAnRnVsbHktcXVhbGlmaWVkIGRvbWFpbiBuYW1lIChBTEIgQUNNIGNlcnQgKyBTRVMgREtJTSknIH07XG5jb25zdCBIT1NURURfWk9ORTogSW5wdXRTcGVjID0geyBmbGFnOiAnaG9zdGVkLXpvbmUtaWQnLCBrZXk6ICdob3N0ZWRab25lSWQnLCBkZXNjcmlwdGlvbjogJ1B1YmxpYyBSb3V0ZSA1MyBob3N0ZWQgem9uZSBJRCBhdXRob3JpdGF0aXZlIGZvciB0aGUgZG9tYWluJyB9O1xuY29uc3QgR0hDUl9UT0tFTjogSW5wdXRTcGVjID0geyBmbGFnOiAnZ2hjci10b2tlbicsIGtleTogJ2doY3JUb2tlbicsIGRlc2NyaXB0aW9uOiAnR2l0SHViIFBBVCB3aXRoIHJlYWQ6cGFja2FnZXMgKGF2b2lkcyBnaGNyLmlvIGFub255bW91cyByYXRlIGxpbWl0cyknLCBzZWNyZXQ6IHRydWUgfTtcbmNvbnN0IFJFR0lPTjogSW5wdXRTcGVjID0geyBmbGFnOiAncmVnaW9uJywga2V5OiAncmVnaW9uJywgZGVzY3JpcHRpb246ICdBV1MgcmVnaW9uJyB9O1xuY29uc3QgREVQTE9ZX01PREU6IElucHV0U3BlYyA9IHsgZmxhZzogJ2RlcGxveS1tb2RlJywga2V5OiAnZGVwbG95TW9kZScsIGRlc2NyaXB0aW9uOiAncHVibGljIChpbnRlcm5ldC1mYWNpbmcgQUxCKSBvciBwcml2YXRlIChpbnRlcm5hbCwgZGVmYXVsdCknIH07XG5jb25zdCBLRVlfUEFJUjogSW5wdXRTcGVjID0geyBmbGFnOiAna2V5LXBhaXInLCBrZXk6ICdrZXlQYWlyJywgZGVzY3JpcHRpb246ICdFQzIga2V5IHBhaXIgaW4gdGhlIHJlZ2lvbiAoYnJlYWstZ2xhc3Mgc2VyaWFsIGNvbnNvbGU7IHJvdXRpbmUgYWNjZXNzIGlzIFNTTSknIH07XG5jb25zdCBJTlNUQU5DRV9UWVBFOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdpbnN0YW5jZS10eXBlJywga2V5OiAnaW5zdGFuY2VUeXBlJywgZGVzY3JpcHRpb246ICdFQzIgaW5zdGFuY2UgdHlwZSAoZGVmYXVsdCB0My4yeGxhcmdlKScgfTtcblxuLy8gU0VTIC8gZW1haWwgZmFtaWx5IOKAlCBzaGFyZWQgYnkgZWMyICsgZmFyZ2F0ZS4gU0VTIGlzIHByb3Zpc2lvbmVkIEJZIERFRkFVTFRcbi8vIG9uIEFXUyBkZXBsb3lzOyBgLS1uby1lbWFpbGAgaXMgdGhlIG9wdC1vdXQgKGAtLWVtYWlsYCBpcyBhIGhhcm1sZXNzIG5vLW9wIGtlcHRcbi8vIGZvciBiYWNrLWNvbXBhdCkuXG5jb25zdCBFTUFJTDogcmVhZG9ubHkgSW5wdXRTcGVjW10gPSBbXG4gIHsgZmxhZzogJ2VtYWlsJywga2V5OiAnZW1haWwnLCBkZXNjcmlwdGlvbjogJ0VuYWJsZSBTRVMgdHJhbnNhY3Rpb25hbCBlbWFpbCAob24gYnkgZGVmYXVsdCBmb3IgQVdTKScsIGJvb2xlYW46IHRydWUgfSxcbiAgeyBmbGFnOiAnbm8tZW1haWwnLCBrZXk6ICdub0VtYWlsJywgZGVzY3JpcHRpb246ICdTa2lwIFNFUyAodHJhbnNhY3Rpb25hbCBlbWFpbCBpcyBwcm92aXNpb25lZCBieSBkZWZhdWx0KScsIGJvb2xlYW46IHRydWUgfSxcbiAgeyBmbGFnOiAnZW1haWwtZnJvbScsIGtleTogJ2VtYWlsRnJvbScsIGRlc2NyaXB0aW9uOiAnRnJvbSBhZGRyZXNzIChkZWZhdWx0IG5vcmVwbHlAPGRvbWFpbj4pJyB9LFxuICB7IGZsYWc6ICdlbWFpbC1mcm9tLW5hbWUnLCBrZXk6ICdlbWFpbEZyb21OYW1lJywgZGVzY3JpcHRpb246ICdEaXNwbGF5IG5hbWUgb24gb3V0Ym91bmQgZW1haWwnIH0sXG4gIHsgZmxhZzogJ2FsZXJ0LWVtYWlsJywga2V5OiAnYWxlcnRFbWFpbCcsIGRlc2NyaXB0aW9uOiAnU3Vic2NyaWJlIGFuIGFkZHJlc3MgdG8gdGhlIGJvdW5jZS9jb21wbGFpbnQgU05TIHRvcGljJyB9LFxuICB7IGZsYWc6ICduby1jcmVhdGUtc2VzLWlkZW50aXR5Jywga2V5OiAnbm9DcmVhdGVTZXNJZGVudGl0eScsIGRlc2NyaXB0aW9uOiAnU2tpcCBTRVMgaWRlbnRpdHkgY3JlYXRpb24gKGRvbWFpbiBhbHJlYWR5IHZlcmlmaWVkKScsIGJvb2xlYW46IHRydWUgfSxcbl07XG5cbi8vIC0tLSBUYXJnZXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IFRBUkdFVFM6IFJlYWRvbmx5PFJlY29yZDxUYXJnZXRJZCwgVGFyZ2V0U3BlYz4+ID0ge1xuICBsb2NhbDoge1xuICAgIGlkOiAnbG9jYWwnLFxuICAgIGxhYmVsOiAnTG9jYWwgKERvY2tlciBDb21wb3NlKScsXG4gICAgZGlyOiAnZGVwbG95L2xvY2FsJyxcbiAgICBlbnRyeXBvaW50OiAnYmluL3NldHVwLnNoJyxcbiAgICByZXF1aXJlZDogW10sXG4gICAgb3B0aW9uYWw6IFtdLFxuICAgIHBvc3REZXBsb3k6ICcuL2RlcGxveS9iaW4vaW5pdC1wbGF0Zm9ybS5zaCBsb2NhbCcsXG4gICAgY29zdDogJ0ZyZWUnLFxuICAgIGJlc3RGb3I6ICdEZXZlbG9wbWVudCcsXG4gICAgZGVzdHJveXM6ICdzdG9wcyBhbGwgY29udGFpbmVycyDigJQgZGF0YSB1bmRlciBkZXBsb3kvbG9jYWwvZGF0YSBwZXJzaXN0cyBvbiBkaXNrIChkZWxldGUgaXQgbWFudWFsbHkgZm9yIGEgY2xlYW4gc2xhdGUpJyxcbiAgfSxcbiAgbWluaWt1YmU6IHtcbiAgICBpZDogJ21pbmlrdWJlJyxcbiAgICBsYWJlbDogJ01pbmlrdWJlIChsb2NhbCBLdWJlcm5ldGVzKScsXG4gICAgZGlyOiAnZGVwbG95L21pbmlrdWJlJyxcbiAgICBlbnRyeXBvaW50OiAnYmluL3NldHVwLnNoJyxcbiAgICByZXF1aXJlZDogW10sXG4gICAgb3B0aW9uYWw6IFtdLFxuICAgIHBvc3REZXBsb3k6ICcuL2RlcGxveS9iaW4vaW5pdC1wbGF0Zm9ybS5zaCBtaW5pa3ViZScsXG4gICAgY29zdDogJ0ZyZWUnLFxuICAgIGJlc3RGb3I6ICdMb2NhbCBLdWJlcm5ldGVzJyxcbiAgICBkZXN0cm95czogJ3N0b3BzIHRoZSBtaW5pa3ViZSBzdGFjayDigJQgcGVyc2lzdGVudCB2b2x1bWVzIChQVkMgZGF0YSkgcmVtYWluIHVudGlsIHRoZSBjbHVzdGVyIGlzIGRlbGV0ZWQnLFxuICB9LFxuICBlYzI6IHtcbiAgICBpZDogJ2VjMicsXG4gICAgbGFiZWw6ICdBV1MgRUMyIChzaW5nbGUgTWluaWt1YmUgaW5zdGFuY2UgYmVoaW5kIGFuIEFMQiknLFxuICAgIGRpcjogJ2RlcGxveS9hd3MvZWMyJyxcbiAgICBlbnRyeXBvaW50OiAnYmluL3NldHVwLnNoJyxcbiAgICByZXF1aXJlZDogW0tFWV9QQUlSLCBET01BSU4sIEhPU1RFRF9aT05FXSxcbiAgICBvcHRpb25hbDogW1JFR0lPTiwgREVQTE9ZX01PREUsIEdIQ1JfVE9LRU4sIElOU1RBTkNFX1RZUEUsIC4uLkVNQUlMXSxcbiAgICBwb3N0RGVwbG95OiAnLi9kZXBsb3kvYmluL2luaXQtcGxhdGZvcm0uc2ggZWMyICAjIGZyb20gaW5zaWRlIHRoZSBWUEMgKFNTTSknLFxuICAgIGNvc3Q6ICd+JDE0MC0yNjUvbW8nLFxuICAgIGJlc3RGb3I6ICdEZXYgLyBzdGFnaW5nJyxcbiAgICBkZXN0cm95czogJ0RFTEVURVMgdGhlIENsb3VkRm9ybWF0aW9uIHN0YWNrOiB0aGUgVlBDLCBFQzIgaW5zdGFuY2UsIGFuZCBpdHMgRUJTIGRhdGEgdm9sdW1lIChkYXRhYmFzZXMsIHJlZ2lzdHJ5LCBwbHVnaW4gYnVpbGRzKS4gSXJyZXZlcnNpYmxlLicsXG4gIH0sXG4gIGZhcmdhdGU6IHtcbiAgICBpZDogJ2ZhcmdhdGUnLFxuICAgIGxhYmVsOiAnQVdTIEZhcmdhdGUgKHNlcnZlcmxlc3MgRUNTLCA2IENsb3VkRm9ybWF0aW9uIHN0YWNrcyknLFxuICAgIGRpcjogJ2RlcGxveS9hd3MvZmFyZ2F0ZScsXG4gICAgZW50cnlwb2ludDogJ2Jpbi9zZXR1cC5zaCcsXG4gICAgcmVxdWlyZWQ6IFtET01BSU4sIEhPU1RFRF9aT05FXSxcbiAgICBvcHRpb25hbDogW1JFR0lPTiwgREVQTE9ZX01PREUsIEdIQ1JfVE9LRU4sIC4uLkVNQUlMXSxcbiAgICBwb3N0RGVwbG95OiAnLi9kZXBsb3kvYmluL2luaXQtcGxhdGZvcm0uc2ggZmFyZ2F0ZSAgIyBmcm9tIGEgVlBDLWF0dGFjaGVkIGhvc3QnLFxuICAgIGNvc3Q6ICd+JDEwMC0zMDAvbW8nLFxuICAgIGJlc3RGb3I6ICdQcm9kdWN0aW9uJyxcbiAgICBkZXN0cm95czogJ0RFTEVURVMgYWxsIHBiLSogQ2xvdWRGb3JtYXRpb24gc3RhY2tzOiBFRlMgZGF0YSwgZGF0YWJhc2VzLCBhbmQgcmVnaXN0cnkuIFNlY3JldHMgTWFuYWdlciBlbnRyaWVzIGFyZSBOT1QgYXV0by1kZWxldGVkLiBJcnJldmVyc2libGUuJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBUQVJHRVRfSURTOiByZWFkb25seSBUYXJnZXRJZFtdID0gWydsb2NhbCcsICdtaW5pa3ViZScsICdlYzInLCAnZmFyZ2F0ZSddO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNUYXJnZXRJZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRhcmdldElkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgKFRBUkdFVF9JRFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHZhbHVlKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3NlbWJsZVJlc3VsdCB7XG4gIC8qKiBUaGUgZXhhY3QgY29tbWFuZCB0byBydW4g4oCUIHNlY3JldHMgbWFza2VkIGFzIGAqKipgLiAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG4gIC8qKiBSZXF1aXJlZCBpbnB1dHMgdGhhdCB3ZXJlIG5vdCBzdXBwbGllZC4gKi9cbiAgcmVhZG9ubHkgbWlzc2luZzogcmVhZG9ubHkgSW5wdXRTcGVjW107XG59XG5cbi8qKlxuICogQXNzZW1ibGUgdGhlIGRlcGxveSBjb21tYW5kIGZvciBhIHRhcmdldCBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbXMuIFB1cmUgYW5kXG4gKiBkZXRlcm1pbmlzdGljIOKAlCBubyBzaGVsbCwgbm8gTExNLiBNaXNzaW5nIHJlcXVpcmVkIGlucHV0cyBhcmUgcmVwb3J0ZWQgKG5ldmVyXG4gKiBndWVzc2VkKS4gQnkgZGVmYXVsdCBzZWNyZXRzIGFyZSBtYXNrZWQgKGAqKipgKSBmb3IgRElTUExBWTsgcGFzcyBgbWFzazogZmFsc2VgXG4gKiB0byBidWlsZCB0aGUgcmVhbCBjb21tYW5kIGZvciBFWEVDVVRJT04g4oCUIHRoYXQgc3RyaW5nIG11c3QgbmV2ZXIgYmUgbG9nZ2VkIG9yXG4gKiBzaG93biB0byB0aGUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZUNvbW1hbmQoXG4gIHRhcmdldDogVGFyZ2V0U3BlYyxcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0czogeyBtYXNrPzogYm9vbGVhbiB9ID0ge30sXG4pOiBBc3NlbWJsZVJlc3VsdCB7XG4gIGNvbnN0IG1hc2sgPSBvcHRzLm1hc2sgPz8gdHJ1ZTtcbiAgY29uc3QgcHJvdmlkZWQgPSAoc3BlYzogSW5wdXRTcGVjKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgdiA9IHBhcmFtc1tzcGVjLmtleV07XG4gICAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSAnJyAmJiB2ICE9PSBmYWxzZTtcbiAgfTtcblxuICBjb25zdCBtaXNzaW5nID0gdGFyZ2V0LnJlcXVpcmVkLmZpbHRlcigoc3BlYykgPT4gIXByb3ZpZGVkKHNwZWMpKTtcblxuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbYGNkICR7dGFyZ2V0LmRpcn0gJiYgYmFzaCAke3RhcmdldC5lbnRyeXBvaW50fWBdO1xuICBmb3IgKGNvbnN0IHNwZWMgb2YgWy4uLnRhcmdldC5yZXF1aXJlZCwgLi4udGFyZ2V0Lm9wdGlvbmFsXSkge1xuICAgIGlmICghcHJvdmlkZWQoc3BlYykpIGNvbnRpbnVlO1xuICAgIGlmIChzcGVjLmJvb2xlYW4pIHtcbiAgICAgIHBhcnRzLnB1c2goYC0tJHtzcGVjLmZsYWd9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBzcGVjLnNlY3JldCAmJiBtYXNrID8gJyoqKicgOiBTdHJpbmcocGFyYW1zW3NwZWMua2V5XSk7XG4gICAgcGFydHMucHVzaChgLS0ke3NwZWMuZmxhZ30gJHt2YWx1ZX1gKTtcbiAgfVxuXG4gIHJldHVybiB7IGNvbW1hbmQ6IHBhcnRzLmpvaW4oJyBcXFxcXFxuICAnKSwgbWlzc2luZyB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlYXJkb3duUmVzdWx0IHtcbiAgLyoqIFRoZSBleGFjdCB0ZWFyZG93biBjb21tYW5kIHRvIHJ1bi4gKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGlzIHRlYXJkb3duIGlycmV2ZXJzaWJseSBkZXN0cm95cyBkYXRhIChBV1MgdGFyZ2V0cykuICovXG4gIHJlYWRvbmx5IGRlc3RydWN0aXZlOiBib29sZWFuO1xufVxuXG4vKiogQ2xvdWRGb3JtYXRpb24gc3RhY2sgbmFtZSB0aGUgRUMyIHNldHVwLnNoIGRlZmF1bHRzIHRvLiAqL1xuY29uc3QgREVGQVVMVF9FQzJfU1RBQ0sgPSAncGlwZWxpbmUtYnVpbGRlcic7XG4vKiogU3RhY2sgcHJlZml4IHRoZSBGYXJnYXRlIHRlYXJkb3duLnNoIGRlZmF1bHRzIHRvLiAqL1xuY29uc3QgREVGQVVMVF9GQVJHQVRFX1BSRUZJWCA9ICdwYic7XG5cbi8qKlxuICogQXNzZW1ibGUgdGhlIHRlYXJkb3duIGNvbW1hbmQgZm9yIGEgdGFyZ2V0LiBQdXJlIGFuZCBkZXRlcm1pbmlzdGljIOKAlCBtaXJyb3JzXG4gKiBgYXNzZW1ibGVDb21tYW5kYCBmb3IgdGhlIGRlc3Ryb3kgcGF0aC4gbG9jYWwvbWluaWt1YmUgU1RPUCB0aGUgc3RhY2tcbiAqIChub24tZGVzdHJ1Y3RpdmUg4oCUIG9uLWRpc2sgLyBQVkMgZGF0YSBzdXJ2aXZlcyk7IGVjMi9mYXJnYXRlIERFTEVURSB0aGVpclxuICogQ2xvdWRGb3JtYXRpb24gc3RhY2tzIGFuZCBhcmUgaXJyZXZlcnNpYmxlLiBGb3IgRmFyZ2F0ZSwgYGFzc3VtZVllc2AgZm9yd2FyZHNcbiAqIHRoZSBuYXRpdmUgc2NyaXB0J3Mgb3duIGAtLXllc2AgKHRoZSBhZ2VudCBydW5zIGl0cyBvd24gdHlwZWQgY29uZmlybWF0aW9uXG4gKiBmaXJzdCwgc28gdGhlIHNjcmlwdCBtdXN0IG5vdCBhbHNvIGJsb2NrIG9uIHN0ZGluKTsgRUMyIGBkZWxldGUtc3RhY2tgIGhhcyBub1xuICogbmF0aXZlIHByb21wdCwgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhlIGFnZW50IGdhdGUgaXMgbWFuZGF0b3J5IHRoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVhcmRvd25Db21tYW5kKFxuICB0YXJnZXQ6IFRhcmdldElkLFxuICBvcHRzOiB7IHN0YWNrTmFtZT86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nOyBhc3N1bWVZZXM/OiBib29sZWFuIH0gPSB7fSxcbik6IFRlYXJkb3duUmVzdWx0IHtcbiAgY29uc3QgcmVnaW9uID0gb3B0cy5yZWdpb24gfHwgcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCAndXMtZWFzdC0xJztcbiAgc3dpdGNoICh0YXJnZXQpIHtcbiAgICBjYXNlICdsb2NhbCc6XG4gICAgICByZXR1cm4geyBjb21tYW5kOiAnY2QgZGVwbG95L2xvY2FsICYmIGJhc2ggYmluL3NodXRkb3duLnNoJywgZGVzdHJ1Y3RpdmU6IGZhbHNlIH07XG4gICAgY2FzZSAnbWluaWt1YmUnOlxuICAgICAgcmV0dXJuIHsgY29tbWFuZDogJ2NkIGRlcGxveS9taW5pa3ViZSAmJiBiYXNoIGJpbi9zaHV0ZG93bi5zaCcsIGRlc3RydWN0aXZlOiBmYWxzZSB9O1xuICAgIGNhc2UgJ2VjMic6IHtcbiAgICAgIGNvbnN0IHN0YWNrID0gb3B0cy5zdGFja05hbWUgfHwgREVGQVVMVF9FQzJfU1RBQ0s7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kOlxuICAgICAgICAgIGBhd3MgY2xvdWRmb3JtYXRpb24gZGVsZXRlLXN0YWNrIC0tc3RhY2stbmFtZSAke3N0YWNrfSAtLXJlZ2lvbiAke3JlZ2lvbn0gJiYgYCArXG4gICAgICAgICAgYGF3cyBjbG91ZGZvcm1hdGlvbiB3YWl0IHN0YWNrLWRlbGV0ZS1jb21wbGV0ZSAtLXN0YWNrLW5hbWUgJHtzdGFja30gLS1yZWdpb24gJHtyZWdpb259YCxcbiAgICAgICAgZGVzdHJ1Y3RpdmU6IHRydWUsXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdmYXJnYXRlJzoge1xuICAgICAgY29uc3QgcHJlZml4ID0gb3B0cy5zdGFja05hbWUgfHwgREVGQVVMVF9GQVJHQVRFX1BSRUZJWDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmQ6XG4gICAgICAgICAgYGNkIGRlcGxveS9hd3MvZmFyZ2F0ZSAmJiBiYXNoIGJpbi90ZWFyZG93bi5zaCAtLXN0YWNrLXByZWZpeCAke3ByZWZpeH0gLS1yZWdpb24gJHtyZWdpb259YCArXG4gICAgICAgICAgKG9wdHMuYXNzdW1lWWVzID8gJyAtLXllcycgOiAnJyksXG4gICAgICAgIGRlc3RydWN0aXZlOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Deterministic known-issue matcher for deploy failures. This is the structured,
3
+ * safe complement to the LLM diagnosis: it recognizes well-known CloudFormation /
4
+ * deploy signatures and maps them to a concrete cause + suggestion, and — for a
5
+ * few — a param fix the executor can re-apply for a gated retry. Pattern matching
6
+ * on output is a script's job, not the model's; the LLM only adds free-form
7
+ * diagnosis on top.
8
+ */
9
+ export interface KnownIssue {
10
+ readonly id: string;
11
+ /** Plain-English root cause. */
12
+ readonly cause: string;
13
+ /** Concrete next step. */
14
+ readonly suggestion: string;
15
+ /** Whether a re-run can plausibly resolve it (deploy scripts are idempotent). */
16
+ readonly retryable: boolean;
17
+ /** A param the executor can set, then re-run automatically (gated). */
18
+ readonly paramFix?: {
19
+ readonly key: string;
20
+ readonly value: unknown;
21
+ };
22
+ }
23
+ /** Return every known issue whose signature appears in the failure output. */
24
+ export declare function matchIssues(failureText: string): KnownIssue[];
25
+ /**
26
+ * Post-deploy guidance to print after a successful deploy that enabled SES.
27
+ * Surfaces the two things the operator must act on (async DKIM, the sandbox).
28
+ */
29
+ export declare function sesPostDeployGuidance(): string[];
30
+ //# sourceMappingURL=troubleshoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"troubleshoot.d.ts","sourceRoot":"","sources":["../../src/agent/troubleshoot.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iFAAiF;IACjF,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;CACvE;AAwED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,EAAE,CAE7D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAMhD"}
@@ -0,0 +1,87 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ const RULES = [
4
+ {
5
+ // SES identity already verified in this account/region → reuse it.
6
+ // CFN phrasings vary: "Email identity … already exists", "SesEmailIdentity … AlreadyExists".
7
+ match: /(?:email\s*identity|ses[\s\S]{0,40}?identity|:identity\/)[\s\S]{0,160}?(?:already exists|AlreadyExists)/i,
8
+ issue: {
9
+ id: 'ses-identity-exists',
10
+ cause: 'The SES email identity for this domain already exists in the account/region.',
11
+ suggestion: 'Reuse it with --skip-ses-identity instead of creating a new one.',
12
+ retryable: true,
13
+ paramFix: { key: 'noCreateSesIdentity', value: true },
14
+ },
15
+ },
16
+ {
17
+ // A prior failed attempt left the stack un-updatable.
18
+ match: /ROLLBACK_COMPLETE|is in ROLLBACK_COMPLETE state and can not be updated/i,
19
+ issue: {
20
+ id: 'stack-rollback-complete',
21
+ cause: 'A previous attempt left the stack in ROLLBACK_COMPLETE — CloudFormation cannot update a stack in that state.',
22
+ suggestion: 'Delete the failed stack (aws cloudformation delete-stack --stack-name <name>), then re-run. Destructive — not auto-applied.',
23
+ retryable: false,
24
+ },
25
+ },
26
+ {
27
+ match: /toomanyrequests|rate.?limit|HTTP 429|denied: requested access to the resource is denied/i,
28
+ issue: {
29
+ id: 'ghcr-rate-limit',
30
+ cause: 'ghcr.io anonymous pulls are rate-limited (60/hr) and tripped mid-deploy.',
31
+ suggestion: 'Pass --ghcr-token <GitHub PAT with read:packages>, then re-run.',
32
+ retryable: false, // needs a token value the agent does not hold
33
+ },
34
+ },
35
+ {
36
+ match: /ses:SendEmail|FromAddress|MessageRejected|Email address (?:is )?not verified/i,
37
+ issue: {
38
+ id: 'ses-from-mismatch',
39
+ cause: 'SES rejected the sender — the From address is not verified or not covered by the identity.',
40
+ suggestion: 'Make sure --email-from is on the verified domain; in the SES sandbox, verify the recipient too.',
41
+ retryable: false,
42
+ },
43
+ },
44
+ {
45
+ match: /ExpiredToken|InvalidClientTokenId|Unable to locate credentials|security token.*invalid|AuthFailure/i,
46
+ issue: {
47
+ id: 'aws-credentials',
48
+ cause: 'AWS credentials are missing or expired.',
49
+ suggestion: 'Refresh credentials (aws configure / AWS_PROFILE / SSO login), then re-run.',
50
+ retryable: false,
51
+ },
52
+ },
53
+ {
54
+ match: /(?:HostedZone|hosted zone)[\s\S]{0,80}?(?:not found|NoSuchHostedZone|does not exist)/i,
55
+ issue: {
56
+ id: 'hosted-zone-not-found',
57
+ cause: 'The Route 53 hosted zone could not be found.',
58
+ suggestion: 'Check --hosted-zone-id is the PUBLIC zone ID authoritative for --domain.',
59
+ retryable: false,
60
+ },
61
+ },
62
+ {
63
+ match: /Certificate[\s\S]{0,80}?(?:failed|timed out|PENDING_VALIDATION)|CertificateValidation.*(?:FAILED|timed out)/i,
64
+ issue: {
65
+ id: 'acm-validation',
66
+ cause: 'The ACM certificate did not validate in time — DNS validation needs the CNAME in the hosted zone, and propagation can take several minutes.',
67
+ suggestion: 'Confirm --hosted-zone-id matches --domain, then re-run to resume once DNS propagates.',
68
+ retryable: true, // a plain re-run can resume
69
+ },
70
+ },
71
+ ];
72
+ /** Return every known issue whose signature appears in the failure output. */
73
+ export function matchIssues(failureText) {
74
+ return RULES.filter((r) => r.match.test(failureText)).map((r) => r.issue);
75
+ }
76
+ /**
77
+ * Post-deploy guidance to print after a successful deploy that enabled SES.
78
+ * Surfaces the two things the operator must act on (async DKIM, the sandbox).
79
+ */
80
+ export function sesPostDeployGuidance() {
81
+ return [
82
+ 'DKIM verification is ASYNCHRONOUS (minutes–hours) — check SES console → Verified identities.',
83
+ 'New SES accounts are SANDBOXED: you can only send to verified recipients (200/day) until you request production access. To smoke-test in sandbox, verify a REAL recipient — never admin@internal.',
84
+ 'Bounces/complaints publish to the stack\'s SNS topic — subscribe to it (or pass --alert-email next time) to get warned before SES throttles you.',
85
+ ];
86
+ }
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJvdWJsZXNob290LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50L3Ryb3VibGVzaG9vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBdUJ0QyxNQUFNLEtBQUssR0FBMEU7SUFDbkY7UUFDRSxtRUFBbUU7UUFDbkUsNkZBQTZGO1FBQzdGLEtBQUssRUFBRSwwR0FBMEc7UUFDakgsS0FBSyxFQUFFO1lBQ0wsRUFBRSxFQUFFLHFCQUFxQjtZQUN6QixLQUFLLEVBQUUsOEVBQThFO1lBQ3JGLFVBQVUsRUFBRSxrRUFBa0U7WUFDOUUsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtTQUN0RDtLQUNGO0lBQ0Q7UUFDRSxzREFBc0Q7UUFDdEQsS0FBSyxFQUFFLHlFQUF5RTtRQUNoRixLQUFLLEVBQUU7WUFDTCxFQUFFLEVBQUUseUJBQXlCO1lBQzdCLEtBQUssRUFBRSw4R0FBOEc7WUFDckgsVUFBVSxFQUFFLDZIQUE2SDtZQUN6SSxTQUFTLEVBQUUsS0FBSztTQUNqQjtLQUNGO0lBQ0Q7UUFDRSxLQUFLLEVBQUUsMEZBQTBGO1FBQ2pHLEtBQUssRUFBRTtZQUNMLEVBQUUsRUFBRSxpQkFBaUI7WUFDckIsS0FBSyxFQUFFLDBFQUEwRTtZQUNqRixVQUFVLEVBQUUsaUVBQWlFO1lBQzdFLFNBQVMsRUFBRSxLQUFLLEVBQUUsOENBQThDO1NBQ2pFO0tBQ0Y7SUFDRDtRQUNFLEtBQUssRUFBRSwrRUFBK0U7UUFDdEYsS0FBSyxFQUFFO1lBQ0wsRUFBRSxFQUFFLG1CQUFtQjtZQUN2QixLQUFLLEVBQUUsNEZBQTRGO1lBQ25HLFVBQVUsRUFBRSxpR0FBaUc7WUFDN0csU0FBUyxFQUFFLEtBQUs7U0FDakI7S0FDRjtJQUNEO1FBQ0UsS0FBSyxFQUFFLHFHQUFxRztRQUM1RyxLQUFLLEVBQUU7WUFDTCxFQUFFLEVBQUUsaUJBQWlCO1lBQ3JCLEtBQUssRUFBRSx5Q0FBeUM7WUFDaEQsVUFBVSxFQUFFLDZFQUE2RTtZQUN6RixTQUFTLEVBQUUsS0FBSztTQUNqQjtLQUNGO0lBQ0Q7UUFDRSxLQUFLLEVBQUUsdUZBQXVGO1FBQzlGLEtBQUssRUFBRTtZQUNMLEVBQUUsRUFBRSx1QkFBdUI7WUFDM0IsS0FBSyxFQUFFLDhDQUE4QztZQUNyRCxVQUFVLEVBQUUsMEVBQTBFO1lBQ3RGLFNBQVMsRUFBRSxLQUFLO1NBQ2pCO0tBQ0Y7SUFDRDtRQUNFLEtBQUssRUFBRSw4R0FBOEc7UUFDckgsS0FBSyxFQUFFO1lBQ0wsRUFBRSxFQUFFLGdCQUFnQjtZQUNwQixLQUFLLEVBQUUsNklBQTZJO1lBQ3BKLFVBQVUsRUFBRSx1RkFBdUY7WUFDbkcsU0FBUyxFQUFFLElBQUksRUFBRSw0QkFBNEI7U0FDOUM7S0FDRjtDQUNGLENBQUM7QUFFRiw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLFdBQVcsQ0FBQyxXQUFtQjtJQUM3QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTztRQUNMLDhGQUE4RjtRQUM5RixtTUFBbU07UUFDbk0sa0pBQWtKO0tBQ25KLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogRGV0ZXJtaW5pc3RpYyBrbm93bi1pc3N1ZSBtYXRjaGVyIGZvciBkZXBsb3kgZmFpbHVyZXMuIFRoaXMgaXMgdGhlIHN0cnVjdHVyZWQsXG4gKiBzYWZlIGNvbXBsZW1lbnQgdG8gdGhlIExMTSBkaWFnbm9zaXM6IGl0IHJlY29nbml6ZXMgd2VsbC1rbm93biBDbG91ZEZvcm1hdGlvbiAvXG4gKiBkZXBsb3kgc2lnbmF0dXJlcyBhbmQgbWFwcyB0aGVtIHRvIGEgY29uY3JldGUgY2F1c2UgKyBzdWdnZXN0aW9uLCBhbmQg4oCUIGZvciBhXG4gKiBmZXcg4oCUIGEgcGFyYW0gZml4IHRoZSBleGVjdXRvciBjYW4gcmUtYXBwbHkgZm9yIGEgZ2F0ZWQgcmV0cnkuIFBhdHRlcm4gbWF0Y2hpbmdcbiAqIG9uIG91dHB1dCBpcyBhIHNjcmlwdCdzIGpvYiwgbm90IHRoZSBtb2RlbCdzOyB0aGUgTExNIG9ubHkgYWRkcyBmcmVlLWZvcm1cbiAqIGRpYWdub3NpcyBvbiB0b3AuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBLbm93bklzc3VlIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgLyoqIFBsYWluLUVuZ2xpc2ggcm9vdCBjYXVzZS4gKi9cbiAgcmVhZG9ubHkgY2F1c2U6IHN0cmluZztcbiAgLyoqIENvbmNyZXRlIG5leHQgc3RlcC4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGlvbjogc3RyaW5nO1xuICAvKiogV2hldGhlciBhIHJlLXJ1biBjYW4gcGxhdXNpYmx5IHJlc29sdmUgaXQgKGRlcGxveSBzY3JpcHRzIGFyZSBpZGVtcG90ZW50KS4gKi9cbiAgcmVhZG9ubHkgcmV0cnlhYmxlOiBib29sZWFuO1xuICAvKiogQSBwYXJhbSB0aGUgZXhlY3V0b3IgY2FuIHNldCwgdGhlbiByZS1ydW4gYXV0b21hdGljYWxseSAoZ2F0ZWQpLiAqL1xuICByZWFkb25seSBwYXJhbUZpeD86IHsgcmVhZG9ubHkga2V5OiBzdHJpbmc7IHJlYWRvbmx5IHZhbHVlOiB1bmtub3duIH07XG59XG5cbmNvbnN0IFJVTEVTOiBSZWFkb25seUFycmF5PHsgcmVhZG9ubHkgbWF0Y2g6IFJlZ0V4cDsgcmVhZG9ubHkgaXNzdWU6IEtub3duSXNzdWUgfT4gPSBbXG4gIHtcbiAgICAvLyBTRVMgaWRlbnRpdHkgYWxyZWFkeSB2ZXJpZmllZCBpbiB0aGlzIGFjY291bnQvcmVnaW9uIOKGkiByZXVzZSBpdC5cbiAgICAvLyBDRk4gcGhyYXNpbmdzIHZhcnk6IFwiRW1haWwgaWRlbnRpdHkg4oCmIGFscmVhZHkgZXhpc3RzXCIsIFwiU2VzRW1haWxJZGVudGl0eSDigKYgQWxyZWFkeUV4aXN0c1wiLlxuICAgIG1hdGNoOiAvKD86ZW1haWxcXHMqaWRlbnRpdHl8c2VzW1xcc1xcU117MCw0MH0/aWRlbnRpdHl8OmlkZW50aXR5XFwvKVtcXHNcXFNdezAsMTYwfT8oPzphbHJlYWR5IGV4aXN0c3xBbHJlYWR5RXhpc3RzKS9pLFxuICAgIGlzc3VlOiB7XG4gICAgICBpZDogJ3Nlcy1pZGVudGl0eS1leGlzdHMnLFxuICAgICAgY2F1c2U6ICdUaGUgU0VTIGVtYWlsIGlkZW50aXR5IGZvciB0aGlzIGRvbWFpbiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYWNjb3VudC9yZWdpb24uJyxcbiAgICAgIHN1Z2dlc3Rpb246ICdSZXVzZSBpdCB3aXRoIC0tc2tpcC1zZXMtaWRlbnRpdHkgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuJyxcbiAgICAgIHJldHJ5YWJsZTogdHJ1ZSxcbiAgICAgIHBhcmFtRml4OiB7IGtleTogJ25vQ3JlYXRlU2VzSWRlbnRpdHknLCB2YWx1ZTogdHJ1ZSB9LFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICAvLyBBIHByaW9yIGZhaWxlZCBhdHRlbXB0IGxlZnQgdGhlIHN0YWNrIHVuLXVwZGF0YWJsZS5cbiAgICBtYXRjaDogL1JPTExCQUNLX0NPTVBMRVRFfGlzIGluIFJPTExCQUNLX0NPTVBMRVRFIHN0YXRlIGFuZCBjYW4gbm90IGJlIHVwZGF0ZWQvaSxcbiAgICBpc3N1ZToge1xuICAgICAgaWQ6ICdzdGFjay1yb2xsYmFjay1jb21wbGV0ZScsXG4gICAgICBjYXVzZTogJ0EgcHJldmlvdXMgYXR0ZW1wdCBsZWZ0IHRoZSBzdGFjayBpbiBST0xMQkFDS19DT01QTEVURSDigJQgQ2xvdWRGb3JtYXRpb24gY2Fubm90IHVwZGF0ZSBhIHN0YWNrIGluIHRoYXQgc3RhdGUuJyxcbiAgICAgIHN1Z2dlc3Rpb246ICdEZWxldGUgdGhlIGZhaWxlZCBzdGFjayAoYXdzIGNsb3VkZm9ybWF0aW9uIGRlbGV0ZS1zdGFjayAtLXN0YWNrLW5hbWUgPG5hbWU+KSwgdGhlbiByZS1ydW4uIERlc3RydWN0aXZlIOKAlCBub3QgYXV0by1hcHBsaWVkLicsXG4gICAgICByZXRyeWFibGU6IGZhbHNlLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBtYXRjaDogL3Rvb21hbnlyZXF1ZXN0c3xyYXRlLj9saW1pdHxIVFRQIDQyOXxkZW5pZWQ6IHJlcXVlc3RlZCBhY2Nlc3MgdG8gdGhlIHJlc291cmNlIGlzIGRlbmllZC9pLFxuICAgIGlzc3VlOiB7XG4gICAgICBpZDogJ2doY3ItcmF0ZS1saW1pdCcsXG4gICAgICBjYXVzZTogJ2doY3IuaW8gYW5vbnltb3VzIHB1bGxzIGFyZSByYXRlLWxpbWl0ZWQgKDYwL2hyKSBhbmQgdHJpcHBlZCBtaWQtZGVwbG95LicsXG4gICAgICBzdWdnZXN0aW9uOiAnUGFzcyAtLWdoY3ItdG9rZW4gPEdpdEh1YiBQQVQgd2l0aCByZWFkOnBhY2thZ2VzPiwgdGhlbiByZS1ydW4uJyxcbiAgICAgIHJldHJ5YWJsZTogZmFsc2UsIC8vIG5lZWRzIGEgdG9rZW4gdmFsdWUgdGhlIGFnZW50IGRvZXMgbm90IGhvbGRcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbWF0Y2g6IC9zZXM6U2VuZEVtYWlsfEZyb21BZGRyZXNzfE1lc3NhZ2VSZWplY3RlZHxFbWFpbCBhZGRyZXNzICg/OmlzICk/bm90IHZlcmlmaWVkL2ksXG4gICAgaXNzdWU6IHtcbiAgICAgIGlkOiAnc2VzLWZyb20tbWlzbWF0Y2gnLFxuICAgICAgY2F1c2U6ICdTRVMgcmVqZWN0ZWQgdGhlIHNlbmRlciDigJQgdGhlIEZyb20gYWRkcmVzcyBpcyBub3QgdmVyaWZpZWQgb3Igbm90IGNvdmVyZWQgYnkgdGhlIGlkZW50aXR5LicsXG4gICAgICBzdWdnZXN0aW9uOiAnTWFrZSBzdXJlIC0tZW1haWwtZnJvbSBpcyBvbiB0aGUgdmVyaWZpZWQgZG9tYWluOyBpbiB0aGUgU0VTIHNhbmRib3gsIHZlcmlmeSB0aGUgcmVjaXBpZW50IHRvby4nLFxuICAgICAgcmV0cnlhYmxlOiBmYWxzZSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbWF0Y2g6IC9FeHBpcmVkVG9rZW58SW52YWxpZENsaWVudFRva2VuSWR8VW5hYmxlIHRvIGxvY2F0ZSBjcmVkZW50aWFsc3xzZWN1cml0eSB0b2tlbi4qaW52YWxpZHxBdXRoRmFpbHVyZS9pLFxuICAgIGlzc3VlOiB7XG4gICAgICBpZDogJ2F3cy1jcmVkZW50aWFscycsXG4gICAgICBjYXVzZTogJ0FXUyBjcmVkZW50aWFscyBhcmUgbWlzc2luZyBvciBleHBpcmVkLicsXG4gICAgICBzdWdnZXN0aW9uOiAnUmVmcmVzaCBjcmVkZW50aWFscyAoYXdzIGNvbmZpZ3VyZSAvIEFXU19QUk9GSUxFIC8gU1NPIGxvZ2luKSwgdGhlbiByZS1ydW4uJyxcbiAgICAgIHJldHJ5YWJsZTogZmFsc2UsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG1hdGNoOiAvKD86SG9zdGVkWm9uZXxob3N0ZWQgem9uZSlbXFxzXFxTXXswLDgwfT8oPzpub3QgZm91bmR8Tm9TdWNoSG9zdGVkWm9uZXxkb2VzIG5vdCBleGlzdCkvaSxcbiAgICBpc3N1ZToge1xuICAgICAgaWQ6ICdob3N0ZWQtem9uZS1ub3QtZm91bmQnLFxuICAgICAgY2F1c2U6ICdUaGUgUm91dGUgNTMgaG9zdGVkIHpvbmUgY291bGQgbm90IGJlIGZvdW5kLicsXG4gICAgICBzdWdnZXN0aW9uOiAnQ2hlY2sgLS1ob3N0ZWQtem9uZS1pZCBpcyB0aGUgUFVCTElDIHpvbmUgSUQgYXV0aG9yaXRhdGl2ZSBmb3IgLS1kb21haW4uJyxcbiAgICAgIHJldHJ5YWJsZTogZmFsc2UsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG1hdGNoOiAvQ2VydGlmaWNhdGVbXFxzXFxTXXswLDgwfT8oPzpmYWlsZWR8dGltZWQgb3V0fFBFTkRJTkdfVkFMSURBVElPTil8Q2VydGlmaWNhdGVWYWxpZGF0aW9uLiooPzpGQUlMRUR8dGltZWQgb3V0KS9pLFxuICAgIGlzc3VlOiB7XG4gICAgICBpZDogJ2FjbS12YWxpZGF0aW9uJyxcbiAgICAgIGNhdXNlOiAnVGhlIEFDTSBjZXJ0aWZpY2F0ZSBkaWQgbm90IHZhbGlkYXRlIGluIHRpbWUg4oCUIEROUyB2YWxpZGF0aW9uIG5lZWRzIHRoZSBDTkFNRSBpbiB0aGUgaG9zdGVkIHpvbmUsIGFuZCBwcm9wYWdhdGlvbiBjYW4gdGFrZSBzZXZlcmFsIG1pbnV0ZXMuJyxcbiAgICAgIHN1Z2dlc3Rpb246ICdDb25maXJtIC0taG9zdGVkLXpvbmUtaWQgbWF0Y2hlcyAtLWRvbWFpbiwgdGhlbiByZS1ydW4gdG8gcmVzdW1lIG9uY2UgRE5TIHByb3BhZ2F0ZXMuJyxcbiAgICAgIHJldHJ5YWJsZTogdHJ1ZSwgLy8gYSBwbGFpbiByZS1ydW4gY2FuIHJlc3VtZVxuICAgIH0sXG4gIH0sXG5dO1xuXG4vKiogUmV0dXJuIGV2ZXJ5IGtub3duIGlzc3VlIHdob3NlIHNpZ25hdHVyZSBhcHBlYXJzIGluIHRoZSBmYWlsdXJlIG91dHB1dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaElzc3VlcyhmYWlsdXJlVGV4dDogc3RyaW5nKTogS25vd25Jc3N1ZVtdIHtcbiAgcmV0dXJuIFJVTEVTLmZpbHRlcigocikgPT4gci5tYXRjaC50ZXN0KGZhaWx1cmVUZXh0KSkubWFwKChyKSA9PiByLmlzc3VlKTtcbn1cblxuLyoqXG4gKiBQb3N0LWRlcGxveSBndWlkYW5jZSB0byBwcmludCBhZnRlciBhIHN1Y2Nlc3NmdWwgZGVwbG95IHRoYXQgZW5hYmxlZCBTRVMuXG4gKiBTdXJmYWNlcyB0aGUgdHdvIHRoaW5ncyB0aGUgb3BlcmF0b3IgbXVzdCBhY3Qgb24gKGFzeW5jIERLSU0sIHRoZSBzYW5kYm94KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlc1Bvc3REZXBsb3lHdWlkYW5jZSgpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgJ0RLSU0gdmVyaWZpY2F0aW9uIGlzIEFTWU5DSFJPTk9VUyAobWludXRlc+KAk2hvdXJzKSDigJQgY2hlY2sgU0VTIGNvbnNvbGUg4oaSIFZlcmlmaWVkIGlkZW50aXRpZXMuJyxcbiAgICAnTmV3IFNFUyBhY2NvdW50cyBhcmUgU0FOREJPWEVEOiB5b3UgY2FuIG9ubHkgc2VuZCB0byB2ZXJpZmllZCByZWNpcGllbnRzICgyMDAvZGF5KSB1bnRpbCB5b3UgcmVxdWVzdCBwcm9kdWN0aW9uIGFjY2Vzcy4gVG8gc21va2UtdGVzdCBpbiBzYW5kYm94LCB2ZXJpZnkgYSBSRUFMIHJlY2lwaWVudCDigJQgbmV2ZXIgYWRtaW5AaW50ZXJuYWwuJyxcbiAgICAnQm91bmNlcy9jb21wbGFpbnRzIHB1Ymxpc2ggdG8gdGhlIHN0YWNrXFwncyBTTlMgdG9waWMg4oCUIHN1YnNjcmliZSB0byBpdCAob3IgcGFzcyAtLWFsZXJ0LWVtYWlsIG5leHQgdGltZSkgdG8gZ2V0IHdhcm5lZCBiZWZvcmUgU0VTIHRocm90dGxlcyB5b3UuJyxcbiAgXTtcbn1cbiJdfQ==
@@ -1,16 +1,11 @@
1
1
  #!/usr/bin/env node
2
- "use strict";
3
2
  // Copyright 2026 Pipeline Builder Contributors
4
3
  // SPDX-License-Identifier: Apache-2.0
5
- var __importDefault = (this && this.__importDefault) || function (mod) {
6
- return (mod && mod.__esModule) ? mod : { "default": mod };
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- const pipeline_core_1 = require("@pipeline-builder/pipeline-core");
10
- const aws_cdk_lib_1 = require("aws-cdk-lib");
11
- const picocolors_1 = __importDefault(require("picocolors"));
12
- const { cyan, green, dim, bold, magenta, red } = picocolors_1.default;
13
- const app = new aws_cdk_lib_1.App();
4
+ import { PipelineBuilder } from '@pipeline-builder/pipeline-core';
5
+ import { App, Stack } from 'aws-cdk-lib';
6
+ import pico from 'picocolors';
7
+ const { cyan, green, dim, bold, magenta, red } = pico;
8
+ const app = new App();
14
9
  /**
15
10
  * Parse PIPELINE_PROPS from environment variable (base64-encoded JSON).
16
11
  * This is always set by the `synth` or `deploy` command before invoking boilerplate.
@@ -41,8 +36,8 @@ function main() {
41
36
  organization: props.organization,
42
37
  componentId,
43
38
  });
44
- const stack = new aws_cdk_lib_1.Stack(app, stackName, {});
45
- new pipeline_core_1.PipelineBuilder(stack, componentId, props);
39
+ const stack = new Stack(app, stackName, {});
40
+ new PipelineBuilder(stack, componentId, props);
46
41
  console.log(green(bold('Success')), green('CDK constructs synthesized successfully'));
47
42
  }
48
43
  try {
@@ -55,4 +50,4 @@ catch (error) {
55
50
  }
56
51
  process.exit(1);
57
52
  }
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9pbGVycGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYm9pbGVycGxhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7OztBQUV0QyxtRUFBZ0Y7QUFDaEYsNkNBQXlDO0FBQ3pDLDREQUE4QjtBQUU5QixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxvQkFBSSxDQUFDO0FBRXRELE1BQU0sR0FBRyxHQUFHLElBQUksaUJBQUcsRUFBRSxDQUFDO0FBRXRCOzs7R0FHRztBQUNILFNBQVMsS0FBSztJQUNaLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO0lBRWhELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksS0FBSyxDQUNiLGtEQUFrRDtZQUNsRCwwRkFBMEYsQ0FDM0YsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBaUIsQ0FBQztJQUM3QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxLQUFLLENBQ2IsbUNBQW1DLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixFQUFFLENBQzNHLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsSUFBSTtJQUNYLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTFFLE9BQU8sQ0FBQyxHQUFHLENBQ1QsR0FBRyxPQUFPLENBQUMsWUFBWSxXQUFXLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQzlFLENBQUM7SUFFRixNQUFNLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUV0QixNQUFNLFNBQVMsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3pFLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDO0lBRXZDLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUU7UUFDckMsU0FBUztRQUNULE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztRQUN0QixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7UUFDaEMsV0FBVztLQUNaLENBQUMsQ0FBQztJQUVILE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLElBQUksK0JBQWUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRS9DLE9BQU8sQ0FBQyxHQUFHLENBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUN0QixLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FDakQsQ0FBQztBQUNKLENBQUM7QUFFRCxJQUFJLENBQUM7SUFDSCxJQUFJLEVBQUUsQ0FBQztBQUNULENBQUM7QUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FDWCxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFDM0IsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUN2RCxDQUFDO0lBRUYsSUFBSSxLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMxQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFBpcGVsaW5lQnVpbGRlciwgQnVpbGRlclByb3BzIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgeyBBcHAsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycyc7XG5cbmNvbnN0IHsgY3lhbiwgZ3JlZW4sIGRpbSwgYm9sZCwgbWFnZW50YSwgcmVkIH0gPSBwaWNvO1xuXG5jb25zdCBhcHAgPSBuZXcgQXBwKCk7XG5cbi8qKlxuICogUGFyc2UgUElQRUxJTkVfUFJPUFMgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZSAoYmFzZTY0LWVuY29kZWQgSlNPTikuXG4gKiBUaGlzIGlzIGFsd2F5cyBzZXQgYnkgdGhlIGBzeW50aGAgb3IgYGRlcGxveWAgY29tbWFuZCBiZWZvcmUgaW52b2tpbmcgYm9pbGVycGxhdGUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKCk6IEJ1aWxkZXJQcm9wcyB7XG4gIGNvbnN0IGVuY29kZWRQcm9wcyA9IHByb2Nlc3MuZW52LlBJUEVMSU5FX1BST1BTO1xuXG4gIGlmICghZW5jb2RlZFByb3BzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1BJUEVMSU5FX1BST1BTIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG1pc3NpbmcuICcgK1xuICAgICAgJ1VzZSBcInBpcGVsaW5lLW1hbmFnZXIgc3ludGggLS1pZCA8aWQ+XCIgb3IgXCJwaXBlbGluZS1tYW5hZ2VyIGRlcGxveSAtLWlkIDxpZD5cIiB0byBzZXQgaXQuJyxcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oZW5jb2RlZFByb3BzLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZCkgYXMgQnVpbGRlclByb3BzO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gcGFyc2UgUElQRUxJTkVfUFJPUFM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBCYXNlNjQvSlNPTiBmb3JtYXQnfWAsXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWluKCk6IHZvaWQge1xuICBjb25zdCBleGVjdXRpb25JZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZyg3KS50b1VwcGVyQ2FzZSgpO1xuXG4gIGNvbnNvbGUubG9nKFxuICAgIGAke21hZ2VudGEoYFtDREstQVBQLSR7ZXhlY3V0aW9uSWR9XWApfSAke2N5YW4oJ1BpcGVsaW5lIGJ1aWxkZXIgc3RhcnRpbmcnKX1gLFxuICApO1xuXG4gIGNvbnN0IHByb3BzID0gcGFyc2UoKTtcblxuICBjb25zdCBzdGFja05hbWUgPSBgJHtwcm9wcy5wcm9qZWN0fS0ke3Byb3BzLm9yZ2FuaXphdGlvbn1gLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGNvbXBvbmVudElkID0gJ3BpcGVsaW5lLWJ1aWxkZXInO1xuXG4gIGNvbnNvbGUubG9nKCdQaXBlbGluZSBjb25maWd1cmF0aW9uOicsIHtcbiAgICBzdGFja05hbWUsXG4gICAgcHJvamVjdDogcHJvcHMucHJvamVjdCxcbiAgICBvcmdhbml6YXRpb246IHByb3BzLm9yZ2FuaXphdGlvbixcbiAgICBjb21wb25lbnRJZCxcbiAgfSk7XG5cbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCBzdGFja05hbWUsIHt9KTtcbiAgbmV3IFBpcGVsaW5lQnVpbGRlcihzdGFjaywgY29tcG9uZW50SWQsIHByb3BzKTtcblxuICBjb25zb2xlLmxvZyhcbiAgICBncmVlbihib2xkKCdTdWNjZXNzJykpLFxuICAgIGdyZWVuKCdDREsgY29uc3RydWN0cyBzeW50aGVzaXplZCBzdWNjZXNzZnVsbHknKSxcbiAgKTtcbn1cblxudHJ5IHtcbiAgbWFpbigpO1xufSBjYXRjaCAoZXJyb3IpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICBib2xkKHJlZCgnW0JVSUxEIEZBSUxFRF0nKSksXG4gICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICApO1xuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLnN0YWNrKSB7XG4gICAgY29uc29sZS5lcnJvcihkaW0oZXJyb3Iuc3RhY2spKTtcbiAgfVxuXG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cbiJdfQ==
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9pbGVycGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYm9pbGVycGxhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGVBQWUsRUFBcUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRixPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFFOUIsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXRELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFFdEI7OztHQUdHO0FBQ0gsU0FBUyxLQUFLO0lBQ1osTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7SUFFaEQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0RBQWtEO1lBQ2xELDBGQUEwRixDQUMzRixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFpQixDQUFDO0lBQzdDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FDYixtQ0FBbUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsNEJBQTRCLEVBQUUsQ0FDM0csQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxJQUFJO0lBQ1gsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFMUUsT0FBTyxDQUFDLEdBQUcsQ0FDVCxHQUFHLE9BQU8sQ0FBQyxZQUFZLFdBQVcsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FDOUUsQ0FBQztJQUVGLE1BQU0sS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDO0lBRXRCLE1BQU0sU0FBUyxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekUsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUM7SUFFdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRTtRQUNyQyxTQUFTO1FBQ1QsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtRQUNoQyxXQUFXO0tBQ1osQ0FBQyxDQUFDO0lBRUgsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1QyxJQUFJLGVBQWUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRS9DLE9BQU8sQ0FBQyxHQUFHLENBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUN0QixLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FDakQsQ0FBQztBQUNKLENBQUM7QUFFRCxJQUFJLENBQUM7SUFDSCxJQUFJLEVBQUUsQ0FBQztBQUNULENBQUM7QUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FDWCxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFDM0IsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUN2RCxDQUFDO0lBRUYsSUFBSSxLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMxQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFBpcGVsaW5lQnVpbGRlciwgdHlwZSBCdWlsZGVyUHJvcHMgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCB7IEFwcCwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgcGljbyBmcm9tICdwaWNvY29sb3JzJztcblxuY29uc3QgeyBjeWFuLCBncmVlbiwgZGltLCBib2xkLCBtYWdlbnRhLCByZWQgfSA9IHBpY287XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcblxuLyoqXG4gKiBQYXJzZSBQSVBFTElORV9QUk9QUyBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlIChiYXNlNjQtZW5jb2RlZCBKU09OKS5cbiAqIFRoaXMgaXMgYWx3YXlzIHNldCBieSB0aGUgYHN5bnRoYCBvciBgZGVwbG95YCBjb21tYW5kIGJlZm9yZSBpbnZva2luZyBib2lsZXJwbGF0ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2UoKTogQnVpbGRlclByb3BzIHtcbiAgY29uc3QgZW5jb2RlZFByb3BzID0gcHJvY2Vzcy5lbnYuUElQRUxJTkVfUFJPUFM7XG5cbiAgaWYgKCFlbmNvZGVkUHJvcHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnUElQRUxJTkVfUFJPUFMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbWlzc2luZy4gJyArXG4gICAgICAnVXNlIFwicGlwZWxpbmUtbWFuYWdlciBzeW50aCAtLWlkIDxpZD5cIiBvciBcInBpcGVsaW5lLW1hbmFnZXIgZGVwbG95IC0taWQgPGlkPlwiIHRvIHNldCBpdC4nLFxuICAgICk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShlbmNvZGVkUHJvcHMsICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkKSBhcyBCdWlsZGVyUHJvcHM7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBwYXJzZSBQSVBFTElORV9QUk9QUzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdJbnZhbGlkIEJhc2U2NC9KU09OIGZvcm1hdCd9YCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1haW4oKTogdm9pZCB7XG4gIGNvbnN0IGV4ZWN1dGlvbklkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnRvVXBwZXJDYXNlKCk7XG5cbiAgY29uc29sZS5sb2coXG4gICAgYCR7bWFnZW50YShgW0NESy1BUFAtJHtleGVjdXRpb25JZH1dYCl9ICR7Y3lhbignUGlwZWxpbmUgYnVpbGRlciBzdGFydGluZycpfWAsXG4gICk7XG5cbiAgY29uc3QgcHJvcHMgPSBwYXJzZSgpO1xuXG4gIGNvbnN0IHN0YWNrTmFtZSA9IGAke3Byb3BzLnByb2plY3R9LSR7cHJvcHMub3JnYW5pemF0aW9ufWAudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgY29tcG9uZW50SWQgPSAncGlwZWxpbmUtYnVpbGRlcic7XG5cbiAgY29uc29sZS5sb2coJ1BpcGVsaW5lIGNvbmZpZ3VyYXRpb246Jywge1xuICAgIHN0YWNrTmFtZSxcbiAgICBwcm9qZWN0OiBwcm9wcy5wcm9qZWN0LFxuICAgIG9yZ2FuaXphdGlvbjogcHJvcHMub3JnYW5pemF0aW9uLFxuICAgIGNvbXBvbmVudElkLFxuICB9KTtcblxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsIHN0YWNrTmFtZSwge30pO1xuICBuZXcgUGlwZWxpbmVCdWlsZGVyKHN0YWNrLCBjb21wb25lbnRJZCwgcHJvcHMpO1xuXG4gIGNvbnNvbGUubG9nKFxuICAgIGdyZWVuKGJvbGQoJ1N1Y2Nlc3MnKSksXG4gICAgZ3JlZW4oJ0NESyBjb25zdHJ1Y3RzIHN5bnRoZXNpemVkIHN1Y2Nlc3NmdWxseScpLFxuICApO1xufVxuXG50cnkge1xuICBtYWluKCk7XG59IGNhdGNoIChlcnJvcikge1xuICBjb25zb2xlLmVycm9yKFxuICAgIGJvbGQocmVkKCdbQlVJTEQgRkFJTEVEXScpKSxcbiAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICk7XG5cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3Iuc3RhY2spIHtcbiAgICBjb25zb2xlLmVycm9yKGRpbShlcnJvci5zdGFjaykpO1xuICB9XG5cbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuIl19
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAoCA;;GAEG;AACH,UAAU,UAAU;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAwOD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,UAAe,GAAG,IAAI,CAyD5D;AAiDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,UAAe,GAAG,IAAI,CA0BnD"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAqCA;;GAEG;AACH,UAAU,UAAU;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAyOD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,UAAe,GAAG,IAAI,CAyD5D;AAiDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,UAAe,GAAG,IAAI,CA0BnD"}