@pipeline-builder/pipeline-manager 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +145 -0
- package/cdk.json +91 -0
- package/config.yml +94 -0
- package/dist/agent/ai.d.ts +48 -0
- package/dist/agent/ai.d.ts.map +1 -0
- package/dist/agent/ai.js +149 -0
- package/dist/agent/bootstrap.d.ts +39 -0
- package/dist/agent/bootstrap.d.ts.map +1 -0
- package/dist/agent/bootstrap.js +66 -0
- package/dist/agent/env-file.d.ts +17 -0
- package/dist/agent/env-file.d.ts.map +1 -0
- package/dist/agent/env-file.js +47 -0
- package/dist/agent/executor.d.ts +30 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +60 -0
- package/dist/agent/health.d.ts +43 -0
- package/dist/agent/health.d.ts.map +1 -0
- package/dist/agent/health.js +109 -0
- package/dist/agent/ports.d.ts +26 -0
- package/dist/agent/ports.d.ts.map +1 -0
- package/dist/agent/ports.js +132 -0
- package/dist/agent/post-steps.d.ts +61 -0
- package/dist/agent/post-steps.d.ts.map +1 -0
- package/dist/agent/post-steps.js +131 -0
- package/dist/agent/prereqs.d.ts +26 -0
- package/dist/agent/prereqs.d.ts.map +1 -0
- package/dist/agent/prereqs.js +134 -0
- package/dist/agent/targets.d.ts +128 -0
- package/dist/agent/targets.d.ts.map +1 -0
- package/dist/agent/targets.js +265 -0
- package/dist/agent/tools.d.ts +13 -0
- package/dist/agent/tools.d.ts.map +1 -0
- package/dist/agent/tools.js +75 -0
- package/dist/agent/troubleshoot.d.ts +30 -0
- package/dist/agent/troubleshoot.d.ts.map +1 -0
- package/dist/agent/troubleshoot.js +87 -0
- package/dist/boilerplate.d.ts +3 -0
- package/dist/boilerplate.d.ts.map +1 -0
- package/dist/boilerplate.js +54 -0
- package/dist/cdk.json +91 -0
- package/dist/cli.d.ts +62 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +463 -0
- package/dist/commands/audit-stacks.d.ts +24 -0
- package/dist/commands/audit-stacks.d.ts.map +1 -0
- package/dist/commands/audit-stacks.js +182 -0
- package/dist/commands/audit-tokens.d.ts +21 -0
- package/dist/commands/audit-tokens.d.ts.map +1 -0
- package/dist/commands/audit-tokens.js +153 -0
- package/dist/commands/bootstrap.d.ts +11 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +159 -0
- package/dist/commands/create-pat.d.ts +27 -0
- package/dist/commands/create-pat.d.ts.map +1 -0
- package/dist/commands/create-pat.js +194 -0
- package/dist/commands/create-pipeline.d.ts +12 -0
- package/dist/commands/create-pipeline.d.ts.map +1 -0
- package/dist/commands/create-pipeline.js +315 -0
- package/dist/commands/deploy.d.ts +15 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +157 -0
- package/dist/commands/entity-get.d.ts +51 -0
- package/dist/commands/entity-get.d.ts.map +1 -0
- package/dist/commands/entity-get.js +69 -0
- package/dist/commands/entity-list.d.ts +39 -0
- package/dist/commands/entity-list.d.ts.map +1 -0
- package/dist/commands/entity-list.js +88 -0
- package/dist/commands/get-pipeline.d.ts +13 -0
- package/dist/commands/get-pipeline.d.ts.map +1 -0
- package/dist/commands/get-pipeline.js +49 -0
- package/dist/commands/get-plugin.d.ts +13 -0
- package/dist/commands/get-plugin.d.ts.map +1 -0
- package/dist/commands/get-plugin.js +51 -0
- package/dist/commands/instantiate-template.d.ts +20 -0
- package/dist/commands/instantiate-template.d.ts.map +1 -0
- package/dist/commands/instantiate-template.js +274 -0
- package/dist/commands/list-pipelines.d.ts +20 -0
- package/dist/commands/list-pipelines.d.ts.map +1 -0
- package/dist/commands/list-pipelines.js +99 -0
- package/dist/commands/list-plugins.d.ts +20 -0
- package/dist/commands/list-plugins.d.ts.map +1 -0
- package/dist/commands/list-plugins.js +92 -0
- package/dist/commands/login.d.ts +21 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +174 -0
- package/dist/commands/new-plugin.d.ts +12 -0
- package/dist/commands/new-plugin.d.ts.map +1 -0
- package/dist/commands/new-plugin.js +129 -0
- package/dist/commands/org-export.d.ts +25 -0
- package/dist/commands/org-export.d.ts.map +1 -0
- package/dist/commands/org-export.js +100 -0
- package/dist/commands/provision.d.ts +122 -0
- package/dist/commands/provision.d.ts.map +1 -0
- package/dist/commands/provision.js +867 -0
- package/dist/commands/redrive-events.d.ts +24 -0
- package/dist/commands/redrive-events.d.ts.map +1 -0
- package/dist/commands/redrive-events.js +127 -0
- package/dist/commands/register.d.ts +38 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +160 -0
- package/dist/commands/setup-events.d.ts +15 -0
- package/dist/commands/setup-events.d.ts.map +1 -0
- package/dist/commands/setup-events.js +168 -0
- package/dist/commands/status.d.ts +11 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +81 -0
- package/dist/commands/store-token.d.ts +26 -0
- package/dist/commands/store-token.d.ts.map +1 -0
- package/dist/commands/store-token.js +305 -0
- package/dist/commands/synth.d.ts +21 -0
- package/dist/commands/synth.d.ts.map +1 -0
- package/dist/commands/synth.js +158 -0
- package/dist/commands/upload-plugin.d.ts +21 -0
- package/dist/commands/upload-plugin.d.ts.map +1 -0
- package/dist/commands/upload-plugin.js +275 -0
- package/dist/commands/validate-plugin.d.ts +12 -0
- package/dist/commands/validate-plugin.d.ts.map +1 -0
- package/dist/commands/validate-plugin.js +175 -0
- package/dist/commands/validate-templates.d.ts +11 -0
- package/dist/commands/validate-templates.d.ts.map +1 -0
- package/dist/commands/validate-templates.js +116 -0
- package/dist/commands/version.d.ts +12 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +216 -0
- package/dist/config/cli.constants.d.ts +116 -0
- package/dist/config/cli.constants.d.ts.map +1 -0
- package/dist/config/cli.constants.js +194 -0
- package/dist/config.yml +94 -0
- package/dist/lambda/token-renew-handler.d.ts +2 -0
- package/dist/lambda/token-renew-handler.d.ts.map +1 -0
- package/dist/lambda/token-renew-handler.js +125 -0
- package/dist/templates/events-stack.json +174 -0
- package/dist/templates/token-renew-stack.json +122 -0
- package/dist/types/config.d.ts +53 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +4 -0
- package/dist/types/error.d.ts +61 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +35 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/pipeline-template.d.ts +48 -0
- package/dist/types/pipeline-template.d.ts.map +1 -0
- package/dist/types/pipeline-template.js +4 -0
- package/dist/types/pipeline.d.ts +121 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +4 -0
- package/dist/types/plugin.d.ts +135 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +4 -0
- package/dist/utils/api-client.d.ts +26 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +151 -0
- package/dist/utils/audit-log.d.ts +8 -0
- package/dist/utils/audit-log.d.ts.map +1 -0
- package/dist/utils/audit-log.js +57 -0
- package/dist/utils/auth-guard.d.ts +20 -0
- package/dist/utils/auth-guard.d.ts.map +1 -0
- package/dist/utils/auth-guard.js +22 -0
- package/dist/utils/auth-utils.d.ts +68 -0
- package/dist/utils/auth-utils.d.ts.map +1 -0
- package/dist/utils/auth-utils.js +77 -0
- package/dist/utils/aws-env.d.ts +21 -0
- package/dist/utils/aws-env.d.ts.map +1 -0
- package/dist/utils/aws-env.js +34 -0
- package/dist/utils/aws-secrets.d.ts +48 -0
- package/dist/utils/aws-secrets.d.ts.map +1 -0
- package/dist/utils/aws-secrets.js +115 -0
- package/dist/utils/banner.d.ts +19 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +52 -0
- package/dist/utils/cdk-utils.d.ts +74 -0
- package/dist/utils/cdk-utils.d.ts.map +1 -0
- package/dist/utils/cdk-utils.js +152 -0
- package/dist/utils/command-utils.d.ts +75 -0
- package/dist/utils/command-utils.d.ts.map +1 -0
- package/dist/utils/command-utils.js +155 -0
- package/dist/utils/config-loader.d.ts +33 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +154 -0
- package/dist/utils/cron.d.ts +28 -0
- package/dist/utils/cron.d.ts.map +1 -0
- package/dist/utils/cron.js +119 -0
- package/dist/utils/deploy-runner.d.ts +38 -0
- package/dist/utils/deploy-runner.d.ts.map +1 -0
- package/dist/utils/deploy-runner.js +112 -0
- package/dist/utils/error-handler.d.ts +29 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +302 -0
- package/dist/utils/list-command-utils.d.ts +23 -0
- package/dist/utils/list-command-utils.d.ts.map +1 -0
- package/dist/utils/list-command-utils.js +57 -0
- package/dist/utils/output-utils.d.ts +40 -0
- package/dist/utils/output-utils.d.ts.map +1 -0
- package/dist/utils/output-utils.js +250 -0
- package/dist/utils/pipeline-config.d.ts +33 -0
- package/dist/utils/pipeline-config.d.ts.map +1 -0
- package/dist/utils/pipeline-config.js +55 -0
- package/dist/utils/platform-secret.d.ts +27 -0
- package/dist/utils/platform-secret.d.ts.map +1 -0
- package/dist/utils/platform-secret.js +92 -0
- package/dist/utils/plugin-resolver.d.ts +17 -0
- package/dist/utils/plugin-resolver.d.ts.map +1 -0
- package/dist/utils/plugin-resolver.js +101 -0
- package/dist/utils/preflight.d.ts +26 -0
- package/dist/utils/preflight.d.ts.map +1 -0
- package/dist/utils/preflight.js +59 -0
- package/dist/utils/rate-limiter.d.ts +15 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +164 -0
- package/dist/utils/registry.d.ts +86 -0
- package/dist/utils/registry.d.ts.map +1 -0
- package/dist/utils/registry.js +140 -0
- package/dist/utils/response-utils.d.ts +21 -0
- package/dist/utils/response-utils.d.ts.map +1 -0
- package/dist/utils/response-utils.js +70 -0
- package/dist/utils/tls.d.ts +52 -0
- package/dist/utils/tls.d.ts.map +1 -0
- package/dist/utils/tls.js +88 -0
- package/package.json +181 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Deterministic, READ-ONLY prerequisite checks per target. No LLM, no mutation —
|
|
5
|
+
* every command here only inspects (presence checks, `aws sts get-caller-identity`,
|
|
6
|
+
* `docker info`). This is the kind of thing a script does better than an agent,
|
|
7
|
+
* so it stays deterministic; the LLM is reserved for NL parsing + diagnosis.
|
|
8
|
+
*/
|
|
9
|
+
import { execSync } from 'child_process';
|
|
10
|
+
/** True if `cmd` is on PATH. */
|
|
11
|
+
function has(cmd) {
|
|
12
|
+
try {
|
|
13
|
+
execSync(`command -v ${cmd}`, { stdio: 'ignore', timeout: 5000 });
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Run a read-only command; return its trimmed stdout or null on failure. */
|
|
21
|
+
function read(cmd) {
|
|
22
|
+
try {
|
|
23
|
+
return execSync(cmd, { stdio: ['ignore', 'pipe', 'ignore'], timeout: 15000 }).toString().trim();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function dockerRunning() {
|
|
30
|
+
return has('docker') && read('docker info --format "{{.ServerVersion}}"') !== null;
|
|
31
|
+
}
|
|
32
|
+
/** Docker Compose v2 (`docker compose`) or legacy v1 (`docker-compose`) — setup.sh needs one. */
|
|
33
|
+
function dockerComposeAvailable() {
|
|
34
|
+
return read('docker compose version') !== null || has('docker-compose');
|
|
35
|
+
}
|
|
36
|
+
function awsIdentity() {
|
|
37
|
+
if (!has('aws'))
|
|
38
|
+
return null;
|
|
39
|
+
return read('aws sts get-caller-identity --query Account --output text');
|
|
40
|
+
}
|
|
41
|
+
/** Parsed `git --version` as [major, minor], or null if git is absent/unparseable. */
|
|
42
|
+
function gitVersion() {
|
|
43
|
+
const out = read('git --version');
|
|
44
|
+
const m = out?.match(/(\d+)\.(\d+)/);
|
|
45
|
+
return m ? [Number(m[1]), Number(m[2])] : null;
|
|
46
|
+
}
|
|
47
|
+
/** True when git is on PATH (required to bootstrap a clone at all). */
|
|
48
|
+
export function gitAvailable() {
|
|
49
|
+
return gitVersion() !== null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Cone `sparse-checkout` (+ `--filter=blob:none`) needs git ≥ 2.27. Below that,
|
|
53
|
+
* the bootstrap falls back to a (correct, just larger) full clone.
|
|
54
|
+
*/
|
|
55
|
+
export function gitSupportsSparseCheckout() {
|
|
56
|
+
const v = gitVersion();
|
|
57
|
+
return v !== null && (v[0] > 2 || (v[0] === 2 && v[1] >= 27));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Build a PrereqCheck from a SINGLE presence evaluation. Collapses the repeated
|
|
61
|
+
* `{ ok: probe(), detail: probe() ? a : b }` shape — which also called the probe
|
|
62
|
+
* twice — into one place; the caller evaluates the probe once and passes the result.
|
|
63
|
+
*/
|
|
64
|
+
function check(name, present, presentDetail, missingDetail, required = true) {
|
|
65
|
+
return { name, ok: present, detail: present ? presentDetail : missingDetail, required };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Run the read-only prerequisite checks for a target. Pure inspection — safe to
|
|
69
|
+
* run unconditionally (the plan assembles this before the gated execution).
|
|
70
|
+
*/
|
|
71
|
+
export function checkPrereqs(target, opts = {}) {
|
|
72
|
+
const checks = [];
|
|
73
|
+
// setup.sh (docker) + setup.sh (minikube) both generate the TLS cert + registry JWT key with openssl.
|
|
74
|
+
const OPENSSL_TLS = 'install openssl — setup.sh generates the TLS cert + registry JWT key with it';
|
|
75
|
+
// `--repo` bootstrap git-clones the platform repo first → git is required. A
|
|
76
|
+
// git below 2.27 still works (full-clone fallback), so the version is advisory.
|
|
77
|
+
if (opts.bootstrap) {
|
|
78
|
+
const v = gitVersion();
|
|
79
|
+
checks.push({ name: 'git', ok: v !== null, detail: v ? `on PATH (${v[0]}.${v[1]})` : 'install git', required: true });
|
|
80
|
+
if (v !== null && !gitSupportsSparseCheckout()) {
|
|
81
|
+
checks.push({ name: 'git ≥ 2.27', ok: false, detail: 'sparse clone needs git ≥ 2.27 — falling back to a full clone', required: false });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (target === 'docker') {
|
|
85
|
+
// deploy/local/docker/bin/setup.sh hard-checks all of these at startup and aborts if
|
|
86
|
+
// any is missing — mirror them here so provision blocks up front instead of
|
|
87
|
+
// failing mid-deploy (e.g. the classic "yq is not installed").
|
|
88
|
+
checks.push(check('Docker', dockerRunning(), 'daemon reachable', 'install Docker and start the daemon'));
|
|
89
|
+
checks.push(check('Docker Compose', dockerComposeAvailable(), 'available', 'needs `docker compose` (v2 plugin) or `docker-compose` (v1)'));
|
|
90
|
+
checks.push(check('yq', has('yq'), 'on PATH', 'install yq (macOS: `brew install yq`) — setup.sh requires it'));
|
|
91
|
+
checks.push(check('openssl', has('openssl'), 'on PATH', OPENSSL_TLS));
|
|
92
|
+
return checks;
|
|
93
|
+
}
|
|
94
|
+
if (target === 'minikube') {
|
|
95
|
+
checks.push(check('Docker', dockerRunning(), 'daemon reachable', 'install Docker and start the daemon'));
|
|
96
|
+
checks.push(check('minikube', has('minikube'), 'on PATH', 'install minikube'));
|
|
97
|
+
checks.push(check('kubectl', has('kubectl'), 'on PATH', 'install kubectl'));
|
|
98
|
+
checks.push(check('openssl', has('openssl'), 'on PATH', OPENSSL_TLS));
|
|
99
|
+
// minikube's setup.sh doesn't need yq, but --with-plugins builds images
|
|
100
|
+
// (build-plugin-images.sh) which does.
|
|
101
|
+
if (opts.withPlugins) {
|
|
102
|
+
checks.push(check('yq', has('yq'), 'on PATH', 'install yq (macOS: `brew install yq`) — required to build plugins'));
|
|
103
|
+
}
|
|
104
|
+
return checks;
|
|
105
|
+
}
|
|
106
|
+
// ec2 + eks — both deploy to AWS via the CLI, so both need the AWS CLI + working creds.
|
|
107
|
+
const account = awsIdentity();
|
|
108
|
+
checks.push(check('AWS CLI', has('aws'), 'on PATH', 'install the AWS CLI v2'));
|
|
109
|
+
checks.push({ name: 'AWS credentials', ok: account !== null, detail: account ? `authenticated (account ${account})` : 'run `aws configure` / set AWS_PROFILE', required: true });
|
|
110
|
+
// eks: setup.sh creates the Auto Mode cluster (eksctl), applies the manifests (kubectl,
|
|
111
|
+
// rendered through envsubst), and generates the registry token-signing keypair on the
|
|
112
|
+
// host (openssl) before creating the k8s secret. ec2 bootstraps its secrets on the
|
|
113
|
+
// instance, so it needs none of these.
|
|
114
|
+
if (target === 'eks') {
|
|
115
|
+
// eksctl: setup.sh installs the latest binary automatically when it's not on PATH
|
|
116
|
+
// (downloaded from the eksctl-io GitHub release via curl), so it isn't a hard prereq —
|
|
117
|
+
// we just confirm curl is available to fetch it.
|
|
118
|
+
const eksctlOnPath = has('eksctl');
|
|
119
|
+
checks.push(check('eksctl', eksctlOnPath || has('curl'), eksctlOnPath ? 'on PATH' : 'setup.sh will install the binary (via curl)', 'install eksctl, or ensure curl is available (setup.sh downloads the eksctl binary)'));
|
|
120
|
+
checks.push(check('kubectl', has('kubectl'), 'on PATH', 'install kubectl — applies the manifests to the cluster'));
|
|
121
|
+
checks.push(check('openssl', has('openssl'), 'on PATH', 'install openssl — setup.sh generates the registry token keypair'));
|
|
122
|
+
checks.push(check('envsubst', has('envsubst'), 'on PATH', 'install gettext (macOS: `brew install gettext`) — setup.sh renders cluster.yaml + manifests with envsubst'));
|
|
123
|
+
// Like minikube, --with-plugins builds plugin images on the host, which needs yq.
|
|
124
|
+
if (opts.withPlugins) {
|
|
125
|
+
checks.push(check('yq', has('yq'), 'on PATH', 'install yq (macOS: `brew install yq`) — required to build plugins'));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return checks;
|
|
129
|
+
}
|
|
130
|
+
/** True when every REQUIRED prerequisite passed. */
|
|
131
|
+
export function prereqsSatisfied(checks) {
|
|
132
|
+
return checks.every((c) => c.ok || !c.required);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcmVxcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZ2VudC9wcmVyZXFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBV3pDLGdDQUFnQztBQUNoQyxTQUFTLEdBQUcsQ0FBQyxHQUFXO0lBQ3RCLElBQUksQ0FBQztRQUNILFFBQVEsQ0FBQyxjQUFjLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQVMsSUFBSSxDQUFDLEdBQVc7SUFDdkIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsRyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsYUFBYTtJQUNwQixPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsMkNBQTJDLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDckYsQ0FBQztBQUVELGlHQUFpRztBQUNqRyxTQUFTLHNCQUFzQjtJQUM3QixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMxRSxD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UyxFQUFFLGlFQUFpRSxDQUFDLENBQUMsQ0FBQztRQUM1SCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFNBQVMsRUFBRSwyR0FBMkcsQ0FBQyxDQUFDLENBQUM7UUFDeEssa0ZBQWtGO1FBQ2xGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLG1FQUFtRSxDQUFDLENBQUMsQ0FBQztRQUN0SCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxvREFBb0Q7QUFDcEQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQThCO0lBQzdELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNsRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogRGV0ZXJtaW5pc3RpYywgUkVBRC1PTkxZIHByZXJlcXVpc2l0ZSBjaGVja3MgcGVyIHRhcmdldC4gTm8gTExNLCBubyBtdXRhdGlvbiDigJRcbiAqIGV2ZXJ5IGNvbW1hbmQgaGVyZSBvbmx5IGluc3BlY3RzIChwcmVzZW5jZSBjaGVja3MsIGBhd3Mgc3RzIGdldC1jYWxsZXItaWRlbnRpdHlgLFxuICogYGRvY2tlciBpbmZvYCkuIFRoaXMgaXMgdGhlIGtpbmQgb2YgdGhpbmcgYSBzY3JpcHQgZG9lcyBiZXR0ZXIgdGhhbiBhbiBhZ2VudCxcbiAqIHNvIGl0IHN0YXlzIGRldGVybWluaXN0aWM7IHRoZSBMTE0gaXMgcmVzZXJ2ZWQgZm9yIE5MIHBhcnNpbmcgKyBkaWFnbm9zaXMuXG4gKi9cblxuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgVGFyZ2V0SWQgfSBmcm9tICcuL3RhcmdldHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByZXJlcUNoZWNrIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBvazogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZGV0YWlsOiBzdHJpbmc7XG4gIC8qKiBBIGZhaWxpbmcgcmVxdWlyZWQgY2hlY2sgYmxvY2tzIGRlcGxveW1lbnQ7IGFkdmlzb3J5IG9uZXMgYXJlIHdhcm5pbmdzLiAqL1xuICByZWFkb25seSByZXF1aXJlZDogYm9vbGVhbjtcbn1cblxuLyoqIFRydWUgaWYgYGNtZGAgaXMgb24gUEFUSC4gKi9cbmZ1bmN0aW9uIGhhcyhjbWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGV4ZWNTeW5jKGBjb21tYW5kIC12ICR7Y21kfWAsIHsgc3RkaW86ICdpZ25vcmUnLCB0aW1lb3V0OiA1MDAwIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIFJ1biBhIHJlYWQtb25seSBjb21tYW5kOyByZXR1cm4gaXRzIHRyaW1tZWQgc3Rkb3V0IG9yIG51bGwgb24gZmFpbHVyZS4gKi9cbmZ1bmN0aW9uIHJlYWQoY21kOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXhlY1N5bmMoY21kLCB7IHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLCB0aW1lb3V0OiAxNTAwMCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZG9ja2VyUnVubmluZygpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhcygnZG9ja2VyJykgJiYgcmVhZCgnZG9ja2VyIGluZm8gLS1mb3JtYXQgXCJ7ey5TZXJ2ZXJWZXJzaW9ufX1cIicpICE9PSBudWxsO1xufVxuXG4vKiogRG9ja2VyIENvbXBvc2UgdjIgKGBkb2NrZXIgY29tcG9zZWApIG9yIGxlZ2FjeSB2MSAoYGRvY2tlci1jb21wb3NlYCkg4oCUIHNldHVwLnNoIG5lZWRzIG9uZS4gKi9cbmZ1bmN0aW9uIGRvY2tlckNvbXBvc2VBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWFkKCdkb2NrZXIgY29tcG9zZSB2ZXJzaW9uJykgIT09IG51bGwgfHwgaGFzKCdkb2NrZXItY29tcG9zZScpO1xufVxuXG5mdW5jdGlvbiBhd3NJZGVudGl0eSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFoYXMoJ2F3cycpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHJlYWQoJ2F3cyBzdHMgZ2V0LWNhbGxlci1pZGVudGl0eSAtLXF1ZXJ5IEFjY291bnQgLS1vdXRwdXQgdGV4dCcpO1xufVxuXG4vKiogUGFyc2VkIGBnaXQgLS12ZXJzaW9uYCBhcyBbbWFqb3IsIG1pbm9yXSwgb3IgbnVsbCBpZiBnaXQgaXMgYWJzZW50L3VucGFyc2VhYmxlLiAqL1xuZnVuY3Rpb24gZ2l0VmVyc2lvbigpOiBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCB7XG4gIGNvbnN0IG91dCA9IHJlYWQoJ2dpdCAtLXZlcnNpb24nKTtcbiAgY29uc3QgbSA9IG91dD8ubWF0Y2goLyhcXGQrKVxcLihcXGQrKS8pO1xuICByZXR1cm4gbSA/IFtOdW1iZXIobVsxXSksIE51bWJlcihtWzJdKV0gOiBudWxsO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGdpdCBpcyBvbiBQQVRIIChyZXF1aXJlZCB0byBib290c3RyYXAgYSBjbG9uZSBhdCBhbGwpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdpdEF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdpdFZlcnNpb24oKSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBDb25lIGBzcGFyc2UtY2hlY2tvdXRgICgrIGAtLWZpbHRlcj1ibG9iOm5vbmVgKSBuZWVkcyBnaXQg4omlIDIuMjcuIEJlbG93IHRoYXQsXG4gKiB0aGUgYm9vdHN0cmFwIGZhbGxzIGJhY2sgdG8gYSAoY29ycmVjdCwganVzdCBsYXJnZXIpIGZ1bGwgY2xvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnaXRTdXBwb3J0c1NwYXJzZUNoZWNrb3V0KCk6IGJvb2xlYW4ge1xuICBjb25zdCB2ID0gZ2l0VmVyc2lvbigpO1xuICByZXR1cm4gdiAhPT0gbnVsbCAmJiAodlswXSA+IDIgfHwgKHZbMF0gPT09IDIgJiYgdlsxXSA+PSAyNykpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgUHJlcmVxQ2hlY2sgZnJvbSBhIFNJTkdMRSBwcmVzZW5jZSBldmFsdWF0aW9uLiBDb2xsYXBzZXMgdGhlIHJlcGVhdGVkXG4gKiBgeyBvazogcHJvYmUoKSwgZGV0YWlsOiBwcm9iZSgpID8gYSA6IGIgfWAgc2hhcGUg4oCUIHdoaWNoIGFsc28gY2FsbGVkIHRoZSBwcm9iZVxuICogdHdpY2Ug4oCUIGludG8gb25lIHBsYWNlOyB0aGUgY2FsbGVyIGV2YWx1YXRlcyB0aGUgcHJvYmUgb25jZSBhbmQgcGFzc2VzIHRoZSByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrKG5hbWU6IHN0cmluZywgcHJlc2VudDogYm9vbGVhbiwgcHJlc2VudERldGFpbDogc3RyaW5nLCBtaXNzaW5nRGV0YWlsOiBzdHJpbmcsIHJlcXVpcmVkID0gdHJ1ZSk6IFByZXJlcUNoZWNrIHtcbiAgcmV0dXJuIHsgbmFtZSwgb2s6IHByZXNlbnQsIGRldGFpbDogcHJlc2VudCA/IHByZXNlbnREZXRhaWwgOiBtaXNzaW5nRGV0YWlsLCByZXF1aXJlZCB9O1xufVxuXG4vKipcbiAqIFJ1biB0aGUgcmVhZC1vbmx5IHByZXJlcXVpc2l0ZSBjaGVja3MgZm9yIGEgdGFyZ2V0LiBQdXJlIGluc3BlY3Rpb24g4oCUIHNhZmUgdG9cbiAqIHJ1biB1bmNvbmRpdGlvbmFsbHkgKHRoZSBwbGFuIGFzc2VtYmxlcyB0aGlzIGJlZm9yZSB0aGUgZ2F0ZWQgZXhlY3V0aW9uKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUHJlcmVxcyh0YXJnZXQ6IFRhcmdldElkLCBvcHRzOiB7IGJvb3RzdHJhcD86IGJvb2xlYW47IHdpdGhQbHVnaW5zPzogYm9vbGVhbiB9ID0ge30pOiBQcmVyZXFDaGVja1tdIHtcbiAgY29uc3QgY2hlY2tzOiBQcmVyZXFDaGVja1tdID0gW107XG4gIC8vIHNldHVwLnNoIChkb2NrZXIpICsgc2V0dXAuc2ggKG1pbmlrdWJlKSBib3RoIGdlbmVyYXRlIHRoZSBUTFMgY2VydCArIHJlZ2lzdHJ5IEpXVCBrZXkgd2l0aCBvcGVuc3NsLlxuICBjb25zdCBPUEVOU1NMX1RMUyA9ICdpbnN0YWxsIG9wZW5zc2wg4oCUIHNldHVwLnNoIGdlbmVyYXRlcyB0aGUgVExTIGNlcnQgKyByZWdpc3RyeSBKV1Qga2V5IHdpdGggaXQnO1xuXG4gIC8vIGAtLXJlcG9gIGJvb3RzdHJhcCBnaXQtY2xvbmVzIHRoZSBwbGF0Zm9ybSByZXBvIGZpcnN0IOKGkiBnaXQgaXMgcmVxdWlyZWQuIEFcbiAgLy8gZ2l0IGJlbG93IDIuMjcgc3RpbGwgd29ya3MgKGZ1bGwtY2xvbmUgZmFsbGJhY2spLCBzbyB0aGUgdmVyc2lvbiBpcyBhZHZpc29yeS5cbiAgaWYgKG9wdHMuYm9vdHN0cmFwKSB7XG4gICAgY29uc3QgdiA9IGdpdFZlcnNpb24oKTtcbiAgICBjaGVja3MucHVzaCh7IG5hbWU6ICdnaXQnLCBvazogdiAhPT0gbnVsbCwgZGV0YWlsOiB2ID8gYG9uIFBBVEggKCR7dlswXX0uJHt2WzFdfSlgIDogJ2luc3RhbGwgZ2l0JywgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgaWYgKHYgIT09IG51bGwgJiYgIWdpdFN1cHBvcnRzU3BhcnNlQ2hlY2tvdXQoKSkge1xuICAgICAgY2hlY2tzLnB1c2goeyBuYW1lOiAnZ2l0IOKJpSAyLjI3Jywgb2s6IGZhbHNlLCBkZXRhaWw6ICdzcGFyc2UgY2xvbmUgbmVlZHMgZ2l0IOKJpSAyLjI3IOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmdWxsIGNsb25lJywgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0YXJnZXQgPT09ICdkb2NrZXInKSB7XG4gICAgLy8gZGVwbG95L2xvY2FsL2RvY2tlci9iaW4vc2V0dXAuc2ggaGFyZC1jaGVja3MgYWxsIG9mIHRoZXNlIGF0IHN0YXJ0dXAgYW5kIGFib3J0cyBpZlxuICAgIC8vIGFueSBpcyBtaXNzaW5nIOKAlCBtaXJyb3IgdGhlbSBoZXJlIHNvIHByb3Zpc2lvbiBibG9ja3MgdXAgZnJvbnQgaW5zdGVhZCBvZlxuICAgIC8vIGZhaWxpbmcgbWlkLWRlcGxveSAoZS5nLiB0aGUgY2xhc3NpYyBcInlxIGlzIG5vdCBpbnN0YWxsZWRcIikuXG4gICAgY2hlY2tzLnB1c2goY2hlY2soJ0RvY2tlcicsIGRvY2tlclJ1bm5pbmcoKSwgJ2RhZW1vbiByZWFjaGFibGUnLCAnaW5zdGFsbCBEb2NrZXIgYW5kIHN0YXJ0IHRoZSBkYWVtb24nKSk7XG4gICAgY2hlY2tzLnB1c2goY2hlY2soJ0RvY2tlciBDb21wb3NlJywgZG9ja2VyQ29tcG9zZUF2YWlsYWJsZSgpLCAnYXZhaWxhYmxlJywgJ25lZWRzIGBkb2NrZXIgY29tcG9zZWAgKHYyIHBsdWdpbikgb3IgYGRvY2tlci1jb21wb3NlYCAodjEpJykpO1xuICAgIGNoZWNrcy5wdXNoKGNoZWNrKCd5cScsIGhhcygneXEnKSwgJ29uIFBBVEgnLCAnaW5zdGFsbCB5cSAobWFjT1M6IGBicmV3IGluc3RhbGwgeXFgKSDigJQgc2V0dXAuc2ggcmVxdWlyZXMgaXQnKSk7XG4gICAgY2hlY2tzLnB1c2goY2hlY2soJ29wZW5zc2wnLCBoYXMoJ29wZW5zc2wnKSwgJ29uIFBBVEgnLCBPUEVOU1NMX1RMUykpO1xuICAgIHJldHVybiBjaGVja3M7XG4gIH1cblxuICBpZiAodGFyZ2V0ID09PSAnbWluaWt1YmUnKSB7XG4gICAgY2hlY2tzLnB1c2goY2hlY2soJ0RvY2tlcicsIGRvY2tlclJ1bm5pbmcoKSwgJ2RhZW1vbiByZWFjaGFibGUnLCAnaW5zdGFsbCBEb2NrZXIgYW5kIHN0YXJ0IHRoZSBkYWVtb24nKSk7XG4gICAgY2hlY2tzLnB1c2goY2hlY2soJ21pbmlrdWJlJywgaGFzKCdtaW5pa3ViZScpLCAnb24gUEFUSCcsICdpbnN0YWxsIG1pbmlrdWJlJykpO1xuICAgIGNoZWNrcy5wdXNoKGNoZWNrKCdrdWJlY3RsJywgaGFzKCdrdWJlY3RsJyksICdvbiBQQVRIJywgJ2luc3RhbGwga3ViZWN0bCcpKTtcbiAgICBjaGVja3MucHVzaChjaGVjaygnb3BlbnNzbCcsIGhhcygnb3BlbnNzbCcpLCAnb24gUEFUSCcsIE9QRU5TU0xfVExTKSk7XG4gICAgLy8gbWluaWt1YmUncyBzZXR1cC5zaCBkb2Vzbid0IG5lZWQgeXEsIGJ1dCAtLXdpdGgtcGx1Z2lucyBidWlsZHMgaW1hZ2VzXG4gICAgLy8gKGJ1aWxkLXBsdWdpbi1pbWFnZXMuc2gpIHdoaWNoIGRvZXMuXG4gICAgaWYgKG9wdHMud2l0aFBsdWdpbnMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKGNoZWNrKCd5cScsIGhhcygneXEnKSwgJ29uIFBBVEgnLCAnaW5zdGFsbCB5cSAobWFjT1M6IGBicmV3IGluc3RhbGwgeXFgKSDigJQgcmVxdWlyZWQgdG8gYnVpbGQgcGx1Z2lucycpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrcztcbiAgfVxuXG4gIC8vIGVjMiArIGVrcyDigJQgYm90aCBkZXBsb3kgdG8gQVdTIHZpYSB0aGUgQ0xJLCBzbyBib3RoIG5lZWQgdGhlIEFXUyBDTEkgKyB3b3JraW5nIGNyZWRzLlxuICBjb25zdCBhY2NvdW50ID0gYXdzSWRlbnRpdHkoKTtcbiAgY2hlY2tzLnB1c2goY2hlY2soJ0FXUyBDTEknLCBoYXMoJ2F3cycpLCAnb24gUEFUSCcsICdpbnN0YWxsIHRoZSBBV1MgQ0xJIHYyJykpO1xuICBjaGVja3MucHVzaCh7IG5hbWU6ICdBV1MgY3JlZGVudGlhbHMnLCBvazogYWNjb3VudCAhPT0gbnVsbCwgZGV0YWlsOiBhY2NvdW50ID8gYGF1dGhlbnRpY2F0ZWQgKGFjY291bnQgJHthY2NvdW50fSlgIDogJ3J1biBgYXdzIGNvbmZpZ3VyZWAgLyBzZXQgQVdTX1BST0ZJTEUnLCByZXF1aXJlZDogdHJ1ZSB9KTtcbiAgLy8gZWtzOiBzZXR1cC5zaCBjcmVhdGVzIHRoZSBBdXRvIE1vZGUgY2x1c3RlciAoZWtzY3RsKSwgYXBwbGllcyB0aGUgbWFuaWZlc3RzIChrdWJlY3RsLFxuICAvLyByZW5kZXJlZCB0aHJvdWdoIGVudnN1YnN0KSwgYW5kIGdlbmVyYXRlcyB0aGUgcmVnaXN0cnkgdG9rZW4tc2lnbmluZyBrZXlwYWlyIG9uIHRoZVxuICAvLyBob3N0IChvcGVuc3NsKSBiZWZvcmUgY3JlYXRpbmcgdGhlIGs4cyBzZWNyZXQuIGVjMiBib290c3RyYXBzIGl0cyBzZWNyZXRzIG9uIHRoZVxuICAvLyBpbnN0YW5jZSwgc28gaXQgbmVlZHMgbm9uZSBvZiB0aGVzZS5cbiAgaWYgKHRhcmdldCA9PT0gJ2VrcycpIHtcbiAgICAvLyBla3NjdGw6IHNldHVwLnNoIGluc3RhbGxzIHRoZSBsYXRlc3QgYmluYXJ5IGF1dG9tYXRpY2FsbHkgd2hlbiBpdCdzIG5vdCBvbiBQQVRIXG4gICAgLy8gKGRvd25sb2FkZWQgZnJvbSB0aGUgZWtzY3RsLWlvIEdpdEh1YiByZWxlYXNlIHZpYSBjdXJsKSwgc28gaXQgaXNuJ3QgYSBoYXJkIHByZXJlcSDigJRcbiAgICAvLyB3ZSBqdXN0IGNvbmZpcm0gY3VybCBpcyBhdmFpbGFibGUgdG8gZmV0Y2ggaXQuXG4gICAgY29uc3QgZWtzY3RsT25QYXRoID0gaGFzKCdla3NjdGwnKTtcbiAgICBjaGVja3MucHVzaChjaGVjaygnZWtzY3RsJywgZWtzY3RsT25QYXRoIHx8IGhhcygnY3VybCcpLFxuICAgICAgZWtzY3RsT25QYXRoID8gJ29uIFBBVEgnIDogJ3NldHVwLnNoIHdpbGwgaW5zdGFsbCB0aGUgYmluYXJ5ICh2aWEgY3VybCknLFxuICAgICAgJ2luc3RhbGwgZWtzY3RsLCBvciBlbnN1cmUgY3VybCBpcyBhdmFpbGFibGUgKHNldHVwLnNoIGRvd25sb2FkcyB0aGUgZWtzY3RsIGJpbmFyeSknKSk7XG4gICAgY2hlY2tzLnB1c2goY2hlY2soJ2t1YmVjdGwnLCBoYXMoJ2t1YmVjdGwnKSwgJ29uIFBBVEgnLCAnaW5zdGFsbCBrdWJlY3RsIOKAlCBhcHBsaWVzIHRoZSBtYW5pZmVzdHMgdG8gdGhlIGNsdXN0ZXInKSk7XG4gICAgY2hlY2tzLnB1c2goY2hlY2soJ29wZW5zc2wnLCBoYXMoJ29wZW5zc2wnKSwgJ29uIFBBVEgnLCAnaW5zdGFsbCBvcGVuc3NsIOKAlCBzZXR1cC5zaCBnZW5lcmF0ZXMgdGhlIHJlZ2lzdHJ5IHRva2VuIGtleXBhaXInKSk7XG4gICAgY2hlY2tzLnB1c2goY2hlY2soJ2VudnN1YnN0JywgaGFzKCdlbnZzdWJzdCcpLCAnb24gUEFUSCcsICdpbnN0YWxsIGdldHRleHQgKG1hY09TOiBgYnJldyBpbnN0YWxsIGdldHRleHRgKSDigJQgc2V0dXAuc2ggcmVuZGVycyBjbHVzdGVyLnlhbWwgKyBtYW5pZmVzdHMgd2l0aCBlbnZzdWJzdCcpKTtcbiAgICAvLyBMaWtlIG1pbmlrdWJlLCAtLXdpdGgtcGx1Z2lucyBidWlsZHMgcGx1Z2luIGltYWdlcyBvbiB0aGUgaG9zdCwgd2hpY2ggbmVlZHMgeXEuXG4gICAgaWYgKG9wdHMud2l0aFBsdWdpbnMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKGNoZWNrKCd5cScsIGhhcygneXEnKSwgJ29uIFBBVEgnLCAnaW5zdGFsbCB5cSAobWFjT1M6IGBicmV3IGluc3RhbGwgeXFgKSDigJQgcmVxdWlyZWQgdG8gYnVpbGQgcGx1Z2lucycpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoZWNrcztcbn1cblxuLyoqIFRydWUgd2hlbiBldmVyeSBSRVFVSVJFRCBwcmVyZXF1aXNpdGUgcGFzc2VkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXJlcXNTYXRpc2ZpZWQoY2hlY2tzOiByZWFkb25seSBQcmVyZXFDaGVja1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGVja3MuZXZlcnkoKGMpID0+IGMub2sgfHwgIWMucmVxdWlyZWQpO1xufVxuIl19
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
export type TargetId = 'docker' | 'minikube' | 'ec2' | 'eks';
|
|
2
|
+
/** A single input the underlying deploy script accepts. */
|
|
3
|
+
export interface InputSpec {
|
|
4
|
+
/** Flag name passed to the script (without the leading `--`). */
|
|
5
|
+
readonly flag: string;
|
|
6
|
+
/** Key on the provision params object. */
|
|
7
|
+
readonly key: string;
|
|
8
|
+
/** Human description — shown when a required input is missing. */
|
|
9
|
+
readonly description: string;
|
|
10
|
+
/** Secret — never printed in the assembled command (masked as `***`). */
|
|
11
|
+
readonly secret?: boolean;
|
|
12
|
+
/** Boolean flag with no value (e.g. `--email`). */
|
|
13
|
+
readonly boolean?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface TargetSpec {
|
|
16
|
+
readonly id: TargetId;
|
|
17
|
+
readonly label: string;
|
|
18
|
+
/** Directory the entrypoint runs from (relative to repo root). */
|
|
19
|
+
readonly dir: string;
|
|
20
|
+
/** Entrypoint script (relative to `dir`). */
|
|
21
|
+
readonly entrypoint: string;
|
|
22
|
+
/** Inputs the script REQUIRES — the advisor reports any that are missing. */
|
|
23
|
+
readonly required: readonly InputSpec[];
|
|
24
|
+
/** Optional inputs, passed through only when provided. */
|
|
25
|
+
readonly optional: readonly InputSpec[];
|
|
26
|
+
/**
|
|
27
|
+
* Repo folder(s) this target's deploy needs, for a sparse `--repo` bootstrap.
|
|
28
|
+
* Combined with COMMON_SPARSE_PATHS and any selected load steps' paths.
|
|
29
|
+
*/
|
|
30
|
+
readonly sparsePaths: readonly string[];
|
|
31
|
+
/** Post-deploy step to surface (registers admin + loads plugins). */
|
|
32
|
+
readonly postDeploy?: string;
|
|
33
|
+
/** Rough monthly cost (from docs). */
|
|
34
|
+
readonly cost: string;
|
|
35
|
+
/** One-line "best for". */
|
|
36
|
+
readonly bestFor: string;
|
|
37
|
+
/** What the deploy creates — shown when deploying so "Deploying" isn't opaque. */
|
|
38
|
+
readonly deploys: string;
|
|
39
|
+
/** What a teardown of this target destroys — shown before a (gated) teardown. */
|
|
40
|
+
readonly destroys: string;
|
|
41
|
+
/**
|
|
42
|
+
* Host ports the deploy binds — a FALLBACK only. The live list is DERIVED from the
|
|
43
|
+
* cloned deploy source at runtime (ports.ts `discoverHostPorts`): local from
|
|
44
|
+
* docker-compose.yml's published ports, minikube from setup.sh's port-forwards. This
|
|
45
|
+
* static copy is used only when that source can't be read. Empty for remote targets
|
|
46
|
+
* (ec2/eks bind nothing on the operator's machine).
|
|
47
|
+
*/
|
|
48
|
+
readonly hostPorts: readonly {
|
|
49
|
+
service: string;
|
|
50
|
+
port: number;
|
|
51
|
+
}[];
|
|
52
|
+
}
|
|
53
|
+
export declare const TARGETS: Readonly<Record<TargetId, TargetSpec>>;
|
|
54
|
+
export declare const TARGET_IDS: readonly TargetId[];
|
|
55
|
+
export declare function isTargetId(value: unknown): value is TargetId;
|
|
56
|
+
/**
|
|
57
|
+
* Folders every `--repo` bootstrap needs regardless of target: the orchestration
|
|
58
|
+
* scripts. Each target's setup.sh + init-platform.sh live in / drive these.
|
|
59
|
+
* Deliberately minimal — heavier folders (plugins/compliance/samples) are pulled
|
|
60
|
+
* in only when their post-install option is selected (see LOAD_STEPS).
|
|
61
|
+
*/
|
|
62
|
+
export declare const COMMON_SPARSE_PATHS: readonly string[];
|
|
63
|
+
/**
|
|
64
|
+
* Opt-in post-install load steps. Each maps a provision `--with-*` flag to the
|
|
65
|
+
* init-platform env var that enables it AND the repo folder(s) it reads — so the
|
|
66
|
+
* sparse checkout grows exactly with the selected options.
|
|
67
|
+
*/
|
|
68
|
+
export declare const LOAD_STEPS: readonly [{
|
|
69
|
+
readonly id: 'plugins';
|
|
70
|
+
readonly flag: 'withPlugins';
|
|
71
|
+
readonly env: 'LOAD_PLUGINS';
|
|
72
|
+
readonly paths: readonly ['deploy/plugins', 'deploy/codebuild'];
|
|
73
|
+
}, {
|
|
74
|
+
readonly id: 'compliance';
|
|
75
|
+
readonly flag: 'withCompliance';
|
|
76
|
+
readonly env: 'LOAD_COMPLIANCE';
|
|
77
|
+
readonly paths: readonly ['deploy/compliance'];
|
|
78
|
+
}, {
|
|
79
|
+
readonly id: 'samples';
|
|
80
|
+
readonly flag: 'withSamples';
|
|
81
|
+
readonly env: 'LOAD_TEMPLATES';
|
|
82
|
+
readonly paths: readonly ['deploy/samples'];
|
|
83
|
+
}];
|
|
84
|
+
export type LoadStepId = (typeof LOAD_STEPS)[number]['id'];
|
|
85
|
+
/**
|
|
86
|
+
* The de-duplicated set of sparse paths for a target plus the enabled load
|
|
87
|
+
* steps: common base ∪ target folder(s) ∪ each enabled step's folder(s).
|
|
88
|
+
*/
|
|
89
|
+
export declare function sparsePathsFor(target: TargetId, enabledLoadIds: readonly string[]): string[];
|
|
90
|
+
export interface AssembleResult {
|
|
91
|
+
/** The exact command to run — secrets masked as `***`. */
|
|
92
|
+
readonly command: string;
|
|
93
|
+
/** Required inputs that were not supplied. */
|
|
94
|
+
readonly missing: readonly InputSpec[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Assemble the deploy command for a target from the provided params. Pure and
|
|
98
|
+
* deterministic — no shell, no LLM. Missing required inputs are reported (never
|
|
99
|
+
* guessed). By default secrets are masked (`***`) for DISPLAY; pass `mask: false`
|
|
100
|
+
* to build the real command for EXECUTION — that string must never be logged or
|
|
101
|
+
* shown to the model.
|
|
102
|
+
*/
|
|
103
|
+
export declare function assembleCommand(target: TargetSpec, params: Record<string, unknown>, opts?: {
|
|
104
|
+
mask?: boolean;
|
|
105
|
+
}): AssembleResult;
|
|
106
|
+
export interface TeardownResult {
|
|
107
|
+
/** The exact teardown command to run. */
|
|
108
|
+
readonly command: string;
|
|
109
|
+
/** Whether this teardown irreversibly destroys data (AWS targets). */
|
|
110
|
+
readonly destructive: boolean;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Assemble the teardown command for a target. Pure and deterministic — mirrors
|
|
114
|
+
* `assembleCommand` for the destroy path. local/minikube STOP the stack
|
|
115
|
+
* (non-destructive — on-disk / PVC data survives); ec2 DELETEs its CloudFormation
|
|
116
|
+
* stack and eks DELETEs its cluster (eksctl) — both irreversible. EC2 `delete-stack`
|
|
117
|
+
* and `eksctl delete cluster` have no native prompt, which is exactly why the agent's
|
|
118
|
+
* typed-confirmation gate is mandatory there.
|
|
119
|
+
*/
|
|
120
|
+
export declare function teardownCommand(target: TargetId, opts?: {
|
|
121
|
+
stackName?: string;
|
|
122
|
+
clusterName?: string;
|
|
123
|
+
region?: string;
|
|
124
|
+
domain?: string;
|
|
125
|
+
hostedZoneId?: string;
|
|
126
|
+
assumeYes?: boolean;
|
|
127
|
+
}): TeardownResult;
|
|
128
|
+
//# sourceMappingURL=targets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../../src/agent/targets.ts"],"names":[],"mappings":"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"}
|