@quiltdata/benchling-webhook 0.7.7 → 0.7.8-20251115T063729Z
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/README.md +24 -11
- package/dist/bin/cli.js +77 -3
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/commands/config-show.d.ts +14 -0
- package/dist/bin/commands/config-show.d.ts.map +1 -0
- package/dist/bin/commands/config-show.js +24 -0
- package/dist/bin/commands/config-show.js.map +1 -0
- package/dist/bin/commands/deploy.d.ts +14 -0
- package/dist/bin/commands/deploy.d.ts.map +1 -1
- package/dist/bin/commands/deploy.js +1 -0
- package/dist/bin/commands/deploy.js.map +1 -1
- package/dist/bin/commands/infer-quilt-config.d.ts +3 -0
- package/dist/bin/commands/infer-quilt-config.d.ts.map +1 -1
- package/dist/bin/commands/infer-quilt-config.js +74 -8
- package/dist/bin/commands/infer-quilt-config.js.map +1 -1
- package/dist/bin/commands/install.d.ts.map +1 -1
- package/dist/bin/commands/install.js +40 -7
- package/dist/bin/commands/install.js.map +1 -1
- package/dist/bin/commands/manifest.d.ts +20 -3
- package/dist/bin/commands/manifest.d.ts.map +1 -1
- package/dist/bin/commands/manifest.js +23 -7
- package/dist/bin/commands/manifest.js.map +1 -1
- package/dist/bin/commands/setup-wizard.d.ts +67 -13
- package/dist/bin/commands/setup-wizard.d.ts.map +1 -1
- package/dist/bin/commands/setup-wizard.js +239 -742
- package/dist/bin/commands/setup-wizard.js.map +1 -1
- package/dist/bin/commands/sync-secrets.d.ts +7 -7
- package/dist/bin/commands/sync-secrets.d.ts.map +1 -1
- package/dist/bin/commands/sync-secrets.js +55 -15
- package/dist/bin/commands/sync-secrets.js.map +1 -1
- package/dist/bin/commands/validate.d.ts +18 -3
- package/dist/bin/commands/validate.d.ts.map +1 -1
- package/dist/bin/commands/validate.js +103 -69
- package/dist/bin/commands/validate.js.map +1 -1
- package/dist/lib/types/config.d.ts +13 -0
- package/dist/lib/types/config.d.ts.map +1 -1
- package/dist/lib/types/config.js +1 -0
- package/dist/lib/types/config.js.map +1 -1
- package/dist/lib/utils/config.d.ts +14 -17
- package/dist/lib/utils/config.d.ts.map +1 -1
- package/dist/lib/utils/config.js +6 -88
- package/dist/lib/utils/config.js.map +1 -1
- package/dist/lib/wizard/phase1-catalog-discovery.d.ts +41 -0
- package/dist/lib/wizard/phase1-catalog-discovery.d.ts.map +1 -0
- package/dist/lib/wizard/phase1-catalog-discovery.js +206 -0
- package/dist/lib/wizard/phase1-catalog-discovery.js.map +1 -0
- package/dist/lib/wizard/phase2-stack-query.d.ts +35 -0
- package/dist/lib/wizard/phase2-stack-query.d.ts.map +1 -0
- package/dist/lib/wizard/phase2-stack-query.js +99 -0
- package/dist/lib/wizard/phase2-stack-query.js.map +1 -0
- package/dist/lib/wizard/phase3-parameter-collection.d.ts +24 -0
- package/dist/lib/wizard/phase3-parameter-collection.d.ts.map +1 -0
- package/dist/lib/wizard/phase3-parameter-collection.js +399 -0
- package/dist/lib/wizard/phase3-parameter-collection.js.map +1 -0
- package/dist/lib/wizard/phase4-validation.d.ts +22 -0
- package/dist/lib/wizard/phase4-validation.d.ts.map +1 -0
- package/dist/lib/wizard/phase4-validation.js +294 -0
- package/dist/lib/wizard/phase4-validation.js.map +1 -0
- package/dist/lib/wizard/phase5-mode-decision.d.ts +22 -0
- package/dist/lib/wizard/phase5-mode-decision.d.ts.map +1 -0
- package/dist/lib/wizard/phase5-mode-decision.js +65 -0
- package/dist/lib/wizard/phase5-mode-decision.js.map +1 -0
- package/dist/lib/wizard/phase6-integrated-mode.d.ts +24 -0
- package/dist/lib/wizard/phase6-integrated-mode.d.ts.map +1 -0
- package/dist/lib/wizard/phase6-integrated-mode.js +131 -0
- package/dist/lib/wizard/phase6-integrated-mode.js.map +1 -0
- package/dist/lib/wizard/phase7-standalone-mode.d.ts +25 -0
- package/dist/lib/wizard/phase7-standalone-mode.d.ts.map +1 -0
- package/dist/lib/wizard/phase7-standalone-mode.js +210 -0
- package/dist/lib/wizard/phase7-standalone-mode.js.map +1 -0
- package/dist/lib/wizard/types.d.ts +175 -0
- package/dist/lib/wizard/types.d.ts.map +1 -0
- package/dist/lib/wizard/types.js +11 -0
- package/dist/lib/wizard/types.js.map +1 -0
- package/dist/package.json +3 -4
- package/package.json +3 -4
- package/dist/bin/commands/get-env.d.ts +0 -16
- package/dist/bin/commands/get-env.d.ts.map +0 -1
- package/dist/bin/commands/get-env.js +0 -210
- package/dist/bin/commands/get-env.js.map +0 -1
- package/env.template +0 -79
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Phase 4: Validation
|
|
4
|
+
*
|
|
5
|
+
* Validates all collected parameters before proceeding to mode decision.
|
|
6
|
+
*
|
|
7
|
+
* @module wizard/phase4-validation
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
43
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
44
|
+
};
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.runValidation = runValidation;
|
|
47
|
+
const https = __importStar(require("https"));
|
|
48
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
49
|
+
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
50
|
+
/**
|
|
51
|
+
* Detects the actual region of an S3 bucket
|
|
52
|
+
*/
|
|
53
|
+
async function detectBucketRegion(bucketName, awsProfile) {
|
|
54
|
+
try {
|
|
55
|
+
const clientConfig = {
|
|
56
|
+
region: "us-east-1", // Use us-east-1 as the API endpoint for GetBucketLocation
|
|
57
|
+
};
|
|
58
|
+
if (awsProfile) {
|
|
59
|
+
const { fromIni } = await Promise.resolve().then(() => __importStar(require("@aws-sdk/credential-providers")));
|
|
60
|
+
clientConfig.credentials = fromIni({ profile: awsProfile });
|
|
61
|
+
}
|
|
62
|
+
const s3Client = new client_s3_1.S3Client(clientConfig);
|
|
63
|
+
const command = new client_s3_1.GetBucketLocationCommand({ Bucket: bucketName });
|
|
64
|
+
const response = await s3Client.send(command);
|
|
65
|
+
// AWS returns null for us-east-1, otherwise returns the region constraint
|
|
66
|
+
const region = response.LocationConstraint || "us-east-1";
|
|
67
|
+
return region;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Validates Benchling tenant accessibility
|
|
75
|
+
*/
|
|
76
|
+
async function validateBenchlingTenant(tenant) {
|
|
77
|
+
const result = { isValid: false, errors: [], warnings: [] };
|
|
78
|
+
if (!tenant || tenant.trim().length === 0) {
|
|
79
|
+
result.errors.push("Tenant name cannot be empty");
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
if (!/^[a-zA-Z0-9-_]+$/.test(tenant)) {
|
|
83
|
+
result.errors.push("Tenant name contains invalid characters (only alphanumeric, dash, underscore allowed)");
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
const tenantUrl = `https://${tenant}.benchling.com`;
|
|
87
|
+
console.log(` Testing Benchling tenant URL: ${tenantUrl}`);
|
|
88
|
+
return new Promise((resolve) => {
|
|
89
|
+
https.get(tenantUrl, { timeout: 5000 }, (res) => {
|
|
90
|
+
if (res.statusCode === 200 || res.statusCode === 302 || res.statusCode === 301) {
|
|
91
|
+
result.isValid = true;
|
|
92
|
+
console.log(` ✓ Tenant URL accessible: ${tenantUrl}`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
result.warnings.push(`Tenant URL ${tenantUrl} returned status ${res.statusCode}`);
|
|
96
|
+
result.isValid = true; // Consider this a warning, not an error
|
|
97
|
+
}
|
|
98
|
+
resolve(result);
|
|
99
|
+
}).on("error", (error) => {
|
|
100
|
+
result.warnings.push(`Could not verify tenant URL ${tenantUrl}: ${error.message}`);
|
|
101
|
+
result.isValid = true; // Allow proceeding with warning
|
|
102
|
+
resolve(result);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Validates Benchling OAuth credentials
|
|
108
|
+
*/
|
|
109
|
+
async function validateBenchlingCredentials(tenant, clientId, clientSecret) {
|
|
110
|
+
const result = { isValid: false, errors: [], warnings: [] };
|
|
111
|
+
if (!clientId || clientId.trim().length === 0) {
|
|
112
|
+
result.errors.push("Client ID cannot be empty");
|
|
113
|
+
}
|
|
114
|
+
if (!clientSecret || clientSecret.trim().length === 0) {
|
|
115
|
+
result.errors.push("Client secret cannot be empty");
|
|
116
|
+
}
|
|
117
|
+
if (result.errors.length > 0) {
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
const tokenUrl = `https://${tenant}.benchling.com/api/v2/token`;
|
|
121
|
+
const authString = Buffer.from(`${clientId}:${clientSecret}`).toString("base64");
|
|
122
|
+
console.log(` Testing OAuth credentials: ${tokenUrl} (Client ID: ${clientId.substring(0, 8)}...)`);
|
|
123
|
+
return new Promise((resolve) => {
|
|
124
|
+
const postData = "grant_type=client_credentials";
|
|
125
|
+
const options = {
|
|
126
|
+
method: "POST",
|
|
127
|
+
headers: {
|
|
128
|
+
"Authorization": `Basic ${authString}`,
|
|
129
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
130
|
+
"Content-Length": postData.length,
|
|
131
|
+
},
|
|
132
|
+
timeout: 10000,
|
|
133
|
+
};
|
|
134
|
+
const req = https.request(tokenUrl, options, (res) => {
|
|
135
|
+
let data = "";
|
|
136
|
+
res.on("data", (chunk) => {
|
|
137
|
+
data += chunk;
|
|
138
|
+
});
|
|
139
|
+
res.on("end", () => {
|
|
140
|
+
if (res.statusCode === 200) {
|
|
141
|
+
result.isValid = true;
|
|
142
|
+
console.log(" ✓ OAuth credentials validated successfully");
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
let errorDetail = data.substring(0, 200);
|
|
146
|
+
try {
|
|
147
|
+
const parsed = JSON.parse(data);
|
|
148
|
+
if (parsed.error_description) {
|
|
149
|
+
errorDetail = parsed.error_description;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Keep the raw data if not JSON
|
|
154
|
+
}
|
|
155
|
+
result.errors.push(`OAuth validation failed for tenant '${tenant}':\n` +
|
|
156
|
+
` Tested: POST ${tokenUrl}\n` +
|
|
157
|
+
` Status: ${res.statusCode}\n` +
|
|
158
|
+
` Error: ${errorDetail}\n` +
|
|
159
|
+
" Hint: Verify Client ID and Secret are correct and match the app definition");
|
|
160
|
+
}
|
|
161
|
+
resolve(result);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
req.on("error", (error) => {
|
|
165
|
+
result.warnings.push(`Could not validate OAuth credentials at ${tokenUrl}: ${error.message}\n` +
|
|
166
|
+
" This may be a network issue. Credentials will be validated during deployment.");
|
|
167
|
+
result.isValid = true; // Allow proceeding with warning
|
|
168
|
+
resolve(result);
|
|
169
|
+
});
|
|
170
|
+
req.write(postData);
|
|
171
|
+
req.end();
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Validates S3 bucket access
|
|
176
|
+
*/
|
|
177
|
+
async function validateS3BucketAccess(bucketName, region, awsProfile) {
|
|
178
|
+
const result = { isValid: false, errors: [], warnings: [] };
|
|
179
|
+
if (!bucketName || bucketName.trim().length === 0) {
|
|
180
|
+
result.errors.push("Bucket name cannot be empty");
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
console.log(` Detecting region for bucket: ${bucketName}`);
|
|
184
|
+
const actualRegion = await detectBucketRegion(bucketName, awsProfile);
|
|
185
|
+
let regionToUse = region;
|
|
186
|
+
if (actualRegion && actualRegion !== region) {
|
|
187
|
+
console.log(` ⚠ Bucket is in ${actualRegion}, not ${region} - using detected region`);
|
|
188
|
+
regionToUse = actualRegion;
|
|
189
|
+
}
|
|
190
|
+
else if (actualRegion) {
|
|
191
|
+
console.log(` ✓ Bucket region confirmed: ${actualRegion}`);
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
const clientConfig = { region: regionToUse };
|
|
195
|
+
if (awsProfile) {
|
|
196
|
+
const { fromIni } = await Promise.resolve().then(() => __importStar(require("@aws-sdk/credential-providers")));
|
|
197
|
+
clientConfig.credentials = fromIni({ profile: awsProfile });
|
|
198
|
+
}
|
|
199
|
+
const s3Client = new client_s3_1.S3Client(clientConfig);
|
|
200
|
+
console.log(` Testing S3 bucket access: ${bucketName} (region: ${regionToUse}${awsProfile ? `, profile: ${awsProfile}` : ""})`);
|
|
201
|
+
const headCommand = new client_s3_1.HeadBucketCommand({ Bucket: bucketName });
|
|
202
|
+
await s3Client.send(headCommand);
|
|
203
|
+
console.log(` ✓ S3 bucket accessible: ${bucketName}`);
|
|
204
|
+
const listCommand = new client_s3_1.ListObjectsV2Command({
|
|
205
|
+
Bucket: bucketName,
|
|
206
|
+
MaxKeys: 1,
|
|
207
|
+
});
|
|
208
|
+
await s3Client.send(listCommand);
|
|
209
|
+
console.log(" ✓ S3 bucket list permission confirmed");
|
|
210
|
+
result.isValid = true;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
const err = error;
|
|
214
|
+
const errorCode = err.Code || err.name || "UnknownError";
|
|
215
|
+
const errorMsg = err.message || "Unknown error occurred";
|
|
216
|
+
const statusCode = err.$metadata?.httpStatusCode;
|
|
217
|
+
let hint = "Verify bucket exists, region is correct, and you have s3:GetBucketLocation and s3:ListBucket permissions";
|
|
218
|
+
if (errorCode === "NoSuchBucket" || errorMsg.includes("does not exist")) {
|
|
219
|
+
hint = "The bucket does not exist. Verify the bucket name is correct.";
|
|
220
|
+
}
|
|
221
|
+
else if (errorCode === "AccessDenied" || errorCode === "403" || statusCode === 403) {
|
|
222
|
+
hint = "Access denied. Verify your AWS credentials have s3:GetBucketLocation and s3:ListBucket permissions for this bucket.";
|
|
223
|
+
}
|
|
224
|
+
else if (errorCode === "PermanentRedirect" || errorCode === "301" || statusCode === 301) {
|
|
225
|
+
hint = `The bucket exists but is in a different region. Try specifying the correct region for bucket '${bucketName}'.`;
|
|
226
|
+
}
|
|
227
|
+
result.errors.push(`S3 bucket validation failed for '${bucketName}' in region '${regionToUse}'${awsProfile ? ` (AWS profile: ${awsProfile})` : ""}:\n` +
|
|
228
|
+
` Error: ${errorCode}${statusCode ? ` (HTTP ${statusCode})` : ""}\n` +
|
|
229
|
+
` Message: ${errorMsg}\n` +
|
|
230
|
+
" Tested: HeadBucket operation\n" +
|
|
231
|
+
` Hint: ${hint}`);
|
|
232
|
+
}
|
|
233
|
+
return result;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Phase 4: Validation
|
|
237
|
+
*
|
|
238
|
+
* Responsibilities:
|
|
239
|
+
* - Validate Benchling credentials (OAuth test)
|
|
240
|
+
* - Validate S3 bucket access
|
|
241
|
+
* - Validate app definition ID exists
|
|
242
|
+
* - Return validation result with errors
|
|
243
|
+
*
|
|
244
|
+
* @param input - Validation input
|
|
245
|
+
* @returns Validation result
|
|
246
|
+
*/
|
|
247
|
+
async function runValidation(input) {
|
|
248
|
+
const { stackQuery, parameters, awsProfile } = input;
|
|
249
|
+
const result = {
|
|
250
|
+
success: true,
|
|
251
|
+
errors: [],
|
|
252
|
+
warnings: [],
|
|
253
|
+
shouldExitForManifest: false,
|
|
254
|
+
};
|
|
255
|
+
// Validate Benchling tenant
|
|
256
|
+
const tenantValidation = await validateBenchlingTenant(parameters.benchling.tenant);
|
|
257
|
+
if (!tenantValidation.isValid) {
|
|
258
|
+
result.success = false;
|
|
259
|
+
result.errors.push(...tenantValidation.errors);
|
|
260
|
+
}
|
|
261
|
+
result.warnings.push(...tenantValidation.warnings);
|
|
262
|
+
// Validate OAuth credentials
|
|
263
|
+
const credValidation = await validateBenchlingCredentials(parameters.benchling.tenant, parameters.benchling.clientId, parameters.benchling.clientSecret);
|
|
264
|
+
if (!credValidation.isValid) {
|
|
265
|
+
result.success = false;
|
|
266
|
+
result.errors.push(...credValidation.errors);
|
|
267
|
+
}
|
|
268
|
+
result.warnings.push(...credValidation.warnings);
|
|
269
|
+
// Validate S3 bucket access
|
|
270
|
+
const bucketValidation = await validateS3BucketAccess(parameters.packages.bucket, parameters.deployment.region, awsProfile);
|
|
271
|
+
if (!bucketValidation.isValid) {
|
|
272
|
+
result.success = false;
|
|
273
|
+
result.errors.push(...bucketValidation.errors);
|
|
274
|
+
}
|
|
275
|
+
result.warnings.push(...bucketValidation.warnings);
|
|
276
|
+
if (result.success) {
|
|
277
|
+
console.log(chalk_1.default.green("✓ Configuration validated successfully\n"));
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
console.error(chalk_1.default.red("\n❌ Configuration validation failed:"));
|
|
281
|
+
console.error(chalk_1.default.gray(" The following validations were performed:"));
|
|
282
|
+
console.error(chalk_1.default.gray(` - Benchling tenant: ${parameters.benchling.tenant}`));
|
|
283
|
+
console.error(chalk_1.default.gray(` - OAuth credentials: Client ID ${parameters.benchling.clientId.substring(0, 8)}...`));
|
|
284
|
+
console.error(chalk_1.default.gray(` - S3 bucket: ${parameters.packages.bucket} (region: ${parameters.deployment.region})`));
|
|
285
|
+
console.error("");
|
|
286
|
+
result.errors.forEach((err) => console.error(`${err}\n`));
|
|
287
|
+
}
|
|
288
|
+
if (result.warnings.length > 0) {
|
|
289
|
+
console.warn(chalk_1.default.yellow("\n⚠ Warnings:"));
|
|
290
|
+
result.warnings.forEach((warn) => console.warn(` ${warn}\n`));
|
|
291
|
+
}
|
|
292
|
+
return result;
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=phase4-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase4-validation.js","sourceRoot":"","sources":["../../../lib/wizard/phase4-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 5: Mode Decision
|
|
3
|
+
*
|
|
4
|
+
* Determines whether to use integrated mode (existing BenchlingSecret in Quilt stack)
|
|
5
|
+
* or standalone mode (create new dedicated secret).
|
|
6
|
+
*
|
|
7
|
+
* @module wizard/phase5-mode-decision
|
|
8
|
+
*/
|
|
9
|
+
import { ModeDecisionInput, ModeDecisionResult } from "./types";
|
|
10
|
+
/**
|
|
11
|
+
* Phase 5: Mode Decision
|
|
12
|
+
*
|
|
13
|
+
* Responsibilities:
|
|
14
|
+
* - Determine if integrated mode is available (BenchlingSecret exists)
|
|
15
|
+
* - Ask user to choose mode (if applicable)
|
|
16
|
+
* - Return mode decision
|
|
17
|
+
*
|
|
18
|
+
* @param input - Mode decision input
|
|
19
|
+
* @returns Mode decision result
|
|
20
|
+
*/
|
|
21
|
+
export declare function runModeDecision(input: ModeDecisionInput): Promise<ModeDecisionResult>;
|
|
22
|
+
//# sourceMappingURL=phase5-mode-decision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase5-mode-decision.d.ts","sourceRoot":"","sources":["../../../lib/wizard/phase5-mode-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAyBhE;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmB3F"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Phase 5: Mode Decision
|
|
4
|
+
*
|
|
5
|
+
* Determines whether to use integrated mode (existing BenchlingSecret in Quilt stack)
|
|
6
|
+
* or standalone mode (create new dedicated secret).
|
|
7
|
+
*
|
|
8
|
+
* @module wizard/phase5-mode-decision
|
|
9
|
+
*/
|
|
10
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.runModeDecision = runModeDecision;
|
|
15
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
16
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
17
|
+
/**
|
|
18
|
+
* Prompts user whether to use existing BenchlingSecret or create a new one
|
|
19
|
+
*
|
|
20
|
+
* @param yes - If true, auto-confirm using existing secret
|
|
21
|
+
* @returns True if user wants to use existing secret, false otherwise
|
|
22
|
+
*/
|
|
23
|
+
async function shouldUseExisting(yes) {
|
|
24
|
+
if (yes) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
const { useExisting } = await inquirer_1.default.prompt([
|
|
28
|
+
{
|
|
29
|
+
type: "confirm",
|
|
30
|
+
name: "useExisting",
|
|
31
|
+
message: "Using Webhook built into the Quilt Stack (update existing secret)?",
|
|
32
|
+
default: true,
|
|
33
|
+
},
|
|
34
|
+
]);
|
|
35
|
+
return useExisting;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Phase 5: Mode Decision
|
|
39
|
+
*
|
|
40
|
+
* Responsibilities:
|
|
41
|
+
* - Determine if integrated mode is available (BenchlingSecret exists)
|
|
42
|
+
* - Ask user to choose mode (if applicable)
|
|
43
|
+
* - Return mode decision
|
|
44
|
+
*
|
|
45
|
+
* @param input - Mode decision input
|
|
46
|
+
* @returns Mode decision result
|
|
47
|
+
*/
|
|
48
|
+
async function runModeDecision(input) {
|
|
49
|
+
const { stackQuery, yes = false } = input;
|
|
50
|
+
const hasBenchlingSecret = Boolean(stackQuery.benchlingSecretArn);
|
|
51
|
+
// Use integrated mode if: (1) secret exists AND (2) user confirms usage
|
|
52
|
+
if (hasBenchlingSecret && await shouldUseExisting(yes)) {
|
|
53
|
+
console.log(chalk_1.default.blue("Using integrated webhook mode (built-in secret)\n"));
|
|
54
|
+
return {
|
|
55
|
+
mode: "integrated",
|
|
56
|
+
benchlingSecretArn: stackQuery.benchlingSecretArn,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Otherwise, use standalone mode
|
|
60
|
+
console.log(chalk_1.default.blue("Using standalone webhook mode (dedicated secret)\n"));
|
|
61
|
+
return {
|
|
62
|
+
mode: "standalone",
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=phase5-mode-decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase5-mode-decision.js","sourceRoot":"","sources":["../../../lib/wizard/phase5-mode-decision.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;AAwCH,0CAmBC;AAzDD,wDAAgC;AAChC,kDAA0B;AAG1B;;;;;GAKG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAY;IACzC,IAAI,GAAG,EAAE,CAAC;QACN,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QAC1C;YACI,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,oEAAoE;YAC7E,OAAO,EAAE,IAAI;SAChB;KACJ,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACvB,CAAC;AAED;;;;;;;;;;GAUG;AACI,KAAK,UAAU,eAAe,CAAC,KAAwB;IAC1D,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC;IAE1C,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAElE,wEAAwE;IACxE,IAAI,kBAAkB,IAAI,MAAM,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC7E,OAAO;YACH,IAAI,EAAE,YAAY;YAClB,kBAAkB,EAAE,UAAU,CAAC,kBAAmB;SACrD,CAAC;IACN,CAAC;IAED,iCAAiC;IACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAC9E,OAAO;QACH,IAAI,EAAE,YAAY;KACrB,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 6: Integrated Mode
|
|
3
|
+
*
|
|
4
|
+
* Handles integrated stack mode where the BenchlingSecret from the Quilt stack
|
|
5
|
+
* is updated with webhook configuration. NO deployment is performed.
|
|
6
|
+
*
|
|
7
|
+
* @module wizard/phase6-integrated-mode
|
|
8
|
+
*/
|
|
9
|
+
import { IntegratedModeInput, IntegratedModeResult } from "./types";
|
|
10
|
+
/**
|
|
11
|
+
* Phase 6: Integrated Mode
|
|
12
|
+
*
|
|
13
|
+
* Responsibilities:
|
|
14
|
+
* - Build complete configuration
|
|
15
|
+
* - Save config with integratedStack: true
|
|
16
|
+
* - Update BenchlingSecret ARN
|
|
17
|
+
* - Show success message
|
|
18
|
+
* - Return (NO deployment)
|
|
19
|
+
*
|
|
20
|
+
* @param input - Integrated mode input
|
|
21
|
+
* @returns Integrated mode result
|
|
22
|
+
*/
|
|
23
|
+
export declare function runIntegratedMode(input: IntegratedModeInput): Promise<IntegratedModeResult>;
|
|
24
|
+
//# sourceMappingURL=phase6-integrated-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase6-integrated-mode.d.ts","sourceRoot":"","sources":["../../../lib/wizard/phase6-integrated-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAyDpE;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyDjG"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Phase 6: Integrated Mode
|
|
4
|
+
*
|
|
5
|
+
* Handles integrated stack mode where the BenchlingSecret from the Quilt stack
|
|
6
|
+
* is updated with webhook configuration. NO deployment is performed.
|
|
7
|
+
*
|
|
8
|
+
* @module wizard/phase6-integrated-mode
|
|
9
|
+
*/
|
|
10
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.runIntegratedMode = runIntegratedMode;
|
|
15
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
16
|
+
const sync_secrets_1 = require("../../bin/commands/sync-secrets");
|
|
17
|
+
/**
|
|
18
|
+
* Builds ProfileConfig from collected parameters
|
|
19
|
+
*/
|
|
20
|
+
function buildProfileConfig(input) {
|
|
21
|
+
const { stackQuery, parameters, benchlingSecretArn, catalogDns } = input;
|
|
22
|
+
const now = new Date().toISOString();
|
|
23
|
+
const config = {
|
|
24
|
+
quilt: {
|
|
25
|
+
stackArn: stackQuery.stackArn,
|
|
26
|
+
catalog: catalogDns,
|
|
27
|
+
database: stackQuery.database,
|
|
28
|
+
queueUrl: stackQuery.queueUrl,
|
|
29
|
+
region: stackQuery.region,
|
|
30
|
+
},
|
|
31
|
+
benchling: {
|
|
32
|
+
tenant: parameters.benchling.tenant,
|
|
33
|
+
clientId: parameters.benchling.clientId,
|
|
34
|
+
clientSecret: parameters.benchling.clientSecret,
|
|
35
|
+
appDefinitionId: parameters.benchling.appDefinitionId,
|
|
36
|
+
secretArn: benchlingSecretArn,
|
|
37
|
+
},
|
|
38
|
+
packages: {
|
|
39
|
+
bucket: parameters.packages.bucket,
|
|
40
|
+
prefix: parameters.packages.prefix,
|
|
41
|
+
metadataKey: parameters.packages.metadataKey,
|
|
42
|
+
},
|
|
43
|
+
deployment: {
|
|
44
|
+
region: parameters.deployment.region,
|
|
45
|
+
account: parameters.deployment.account,
|
|
46
|
+
},
|
|
47
|
+
integratedStack: true, // CRITICAL: Mark as integrated mode
|
|
48
|
+
logging: {
|
|
49
|
+
level: parameters.logging.level,
|
|
50
|
+
},
|
|
51
|
+
security: {
|
|
52
|
+
enableVerification: parameters.security.enableVerification,
|
|
53
|
+
webhookAllowList: parameters.security.webhookAllowList,
|
|
54
|
+
},
|
|
55
|
+
_metadata: {
|
|
56
|
+
version: "0.7.0",
|
|
57
|
+
createdAt: now,
|
|
58
|
+
updatedAt: now,
|
|
59
|
+
source: "wizard",
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
if (parameters.benchling.testEntryId) {
|
|
63
|
+
config.benchling.testEntryId = parameters.benchling.testEntryId;
|
|
64
|
+
}
|
|
65
|
+
return config;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Phase 6: Integrated Mode
|
|
69
|
+
*
|
|
70
|
+
* Responsibilities:
|
|
71
|
+
* - Build complete configuration
|
|
72
|
+
* - Save config with integratedStack: true
|
|
73
|
+
* - Update BenchlingSecret ARN
|
|
74
|
+
* - Show success message
|
|
75
|
+
* - Return (NO deployment)
|
|
76
|
+
*
|
|
77
|
+
* @param input - Integrated mode input
|
|
78
|
+
* @returns Integrated mode result
|
|
79
|
+
*/
|
|
80
|
+
async function runIntegratedMode(input) {
|
|
81
|
+
const { profile, configStorage, awsProfile } = input;
|
|
82
|
+
console.log(chalk_1.default.bold("\nIntegrated Stack Mode\n"));
|
|
83
|
+
// Step 1: Build configuration
|
|
84
|
+
const config = buildProfileConfig(input);
|
|
85
|
+
// Step 2: Save configuration
|
|
86
|
+
console.log(`Saving configuration to profile: ${profile}...\n`);
|
|
87
|
+
try {
|
|
88
|
+
configStorage.writeProfile(profile, config);
|
|
89
|
+
console.log(chalk_1.default.green(`✓ Configuration saved to: ~/.config/benchling-webhook/${profile}/config.json\n`));
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
throw new Error(`Failed to save configuration: ${error.message}`);
|
|
93
|
+
}
|
|
94
|
+
// Step 3: Update BenchlingSecret in Quilt stack
|
|
95
|
+
console.log("Updating BenchlingSecret in Quilt stack...\n");
|
|
96
|
+
try {
|
|
97
|
+
await (0, sync_secrets_1.syncSecretsToAWS)({
|
|
98
|
+
profile,
|
|
99
|
+
awsProfile,
|
|
100
|
+
region: config.deployment.region,
|
|
101
|
+
force: true,
|
|
102
|
+
configStorage,
|
|
103
|
+
});
|
|
104
|
+
console.log(chalk_1.default.green("✓ BenchlingSecret updated in Quilt stack\n"));
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.warn(chalk_1.default.yellow(`⚠️ Failed to sync secrets: ${error.message}`));
|
|
108
|
+
console.warn(chalk_1.default.yellow(" You can sync secrets manually later with:"));
|
|
109
|
+
console.warn(chalk_1.default.cyan(` npm run setup:sync-secrets -- --profile ${profile}\n`));
|
|
110
|
+
}
|
|
111
|
+
// Step 4: Show success message
|
|
112
|
+
console.log("╔═══════════════════════════════════════════════════════════╗");
|
|
113
|
+
console.log("║ Setup Complete! ║");
|
|
114
|
+
console.log("╚═══════════════════════════════════════════════════════════╝\n");
|
|
115
|
+
console.log(chalk_1.default.bold("Integrated Stack Mode"));
|
|
116
|
+
console.log(chalk_1.default.dim("─".repeat(80)));
|
|
117
|
+
console.log(chalk_1.default.green("✓ BenchlingSecret updated in Quilt stack"));
|
|
118
|
+
console.log(chalk_1.default.dim("✓ No separate webhook deployment needed"));
|
|
119
|
+
console.log(chalk_1.default.dim("✓ Quilt stack will handle webhook events\n"));
|
|
120
|
+
console.log(chalk_1.default.bold("Next steps:"));
|
|
121
|
+
console.log(" 1. Configure webhook URL in Benchling app settings");
|
|
122
|
+
console.log(" (Get the webhook URL from your Quilt stack outputs)");
|
|
123
|
+
console.log(" 2. Test the webhook integration");
|
|
124
|
+
console.log(` 3. Monitor logs: npx ts-node scripts/check-logs.ts --profile ${profile}\n`);
|
|
125
|
+
return {
|
|
126
|
+
success: true,
|
|
127
|
+
configPath: `~/.config/benchling-webhook/${profile}/config.json`,
|
|
128
|
+
secretArn: input.benchlingSecretArn,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=phase6-integrated-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase6-integrated-mode.js","sourceRoot":"","sources":["../../../lib/wizard/phase6-integrated-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 7: Standalone Mode
|
|
3
|
+
*
|
|
4
|
+
* Handles standalone webhook mode where a new dedicated BenchlingSecret is created
|
|
5
|
+
* and optionally deployed as a separate stack.
|
|
6
|
+
*
|
|
7
|
+
* @module wizard/phase7-standalone-mode
|
|
8
|
+
*/
|
|
9
|
+
import { StandaloneModeInput, StandaloneModeResult } from "./types";
|
|
10
|
+
/**
|
|
11
|
+
* Phase 7: Standalone Mode
|
|
12
|
+
*
|
|
13
|
+
* Responsibilities:
|
|
14
|
+
* - Build complete configuration
|
|
15
|
+
* - Save config with integratedStack: false
|
|
16
|
+
* - Create new secret with pattern
|
|
17
|
+
* - Ask about deployment
|
|
18
|
+
* - Deploy if user confirms
|
|
19
|
+
* - Show next steps
|
|
20
|
+
*
|
|
21
|
+
* @param input - Standalone mode input
|
|
22
|
+
* @returns Standalone mode result
|
|
23
|
+
*/
|
|
24
|
+
export declare function runStandaloneMode(input: StandaloneModeInput): Promise<StandaloneModeResult>;
|
|
25
|
+
//# sourceMappingURL=phase7-standalone-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase7-standalone-mode.d.ts","sourceRoot":"","sources":["../../../lib/wizard/phase7-standalone-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAyDpE;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAuGjG"}
|