@quiltdata/benchling-webhook 0.7.7 → 0.7.9

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 (102) hide show
  1. package/README.md +73 -11
  2. package/dist/bin/cli.js +159 -5
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/bin/commands/config-show.d.ts +14 -0
  5. package/dist/bin/commands/config-show.d.ts.map +1 -0
  6. package/dist/bin/commands/config-show.js +24 -0
  7. package/dist/bin/commands/config-show.js.map +1 -0
  8. package/dist/bin/commands/deploy.d.ts +14 -0
  9. package/dist/bin/commands/deploy.d.ts.map +1 -1
  10. package/dist/bin/commands/deploy.js +1 -0
  11. package/dist/bin/commands/deploy.js.map +1 -1
  12. package/dist/bin/commands/infer-quilt-config.d.ts +4 -0
  13. package/dist/bin/commands/infer-quilt-config.d.ts.map +1 -1
  14. package/dist/bin/commands/infer-quilt-config.js +87 -8
  15. package/dist/bin/commands/infer-quilt-config.js.map +1 -1
  16. package/dist/bin/commands/install.d.ts.map +1 -1
  17. package/dist/bin/commands/install.js +42 -7
  18. package/dist/bin/commands/install.js.map +1 -1
  19. package/dist/bin/commands/logs.d.ts +30 -0
  20. package/dist/bin/commands/logs.d.ts.map +1 -0
  21. package/dist/bin/commands/logs.js +276 -0
  22. package/dist/bin/commands/logs.js.map +1 -0
  23. package/dist/bin/commands/manifest.d.ts +20 -3
  24. package/dist/bin/commands/manifest.d.ts.map +1 -1
  25. package/dist/bin/commands/manifest.js +23 -7
  26. package/dist/bin/commands/manifest.js.map +1 -1
  27. package/dist/bin/commands/setup-wizard.d.ts +67 -13
  28. package/dist/bin/commands/setup-wizard.d.ts.map +1 -1
  29. package/dist/bin/commands/setup-wizard.js +240 -742
  30. package/dist/bin/commands/setup-wizard.js.map +1 -1
  31. package/dist/bin/commands/status.d.ts +38 -0
  32. package/dist/bin/commands/status.d.ts.map +1 -0
  33. package/dist/bin/commands/status.js +171 -0
  34. package/dist/bin/commands/status.js.map +1 -0
  35. package/dist/bin/commands/sync-secrets.d.ts +7 -7
  36. package/dist/bin/commands/sync-secrets.d.ts.map +1 -1
  37. package/dist/bin/commands/sync-secrets.js +55 -15
  38. package/dist/bin/commands/sync-secrets.js.map +1 -1
  39. package/dist/bin/commands/validate.d.ts +18 -3
  40. package/dist/bin/commands/validate.d.ts.map +1 -1
  41. package/dist/bin/commands/validate.js +103 -69
  42. package/dist/bin/commands/validate.js.map +1 -1
  43. package/dist/lib/fargate-service.d.ts.map +1 -1
  44. package/dist/lib/fargate-service.js +3 -1
  45. package/dist/lib/fargate-service.js.map +1 -1
  46. package/dist/lib/next-steps-generator.js +25 -4
  47. package/dist/lib/next-steps-generator.js.map +1 -1
  48. package/dist/lib/types/config.d.ts +13 -0
  49. package/dist/lib/types/config.d.ts.map +1 -1
  50. package/dist/lib/types/config.js +1 -0
  51. package/dist/lib/types/config.js.map +1 -1
  52. package/dist/lib/utils/config.d.ts +14 -17
  53. package/dist/lib/utils/config.d.ts.map +1 -1
  54. package/dist/lib/utils/config.js +6 -88
  55. package/dist/lib/utils/config.js.map +1 -1
  56. package/dist/lib/utils/stack-parameter-update.d.ts +37 -0
  57. package/dist/lib/utils/stack-parameter-update.d.ts.map +1 -0
  58. package/dist/lib/utils/stack-parameter-update.js +129 -0
  59. package/dist/lib/utils/stack-parameter-update.js.map +1 -0
  60. package/dist/lib/wizard/phase1-catalog-discovery.d.ts +41 -0
  61. package/dist/lib/wizard/phase1-catalog-discovery.d.ts.map +1 -0
  62. package/dist/lib/wizard/phase1-catalog-discovery.js +206 -0
  63. package/dist/lib/wizard/phase1-catalog-discovery.js.map +1 -0
  64. package/dist/lib/wizard/phase2-stack-query.d.ts +35 -0
  65. package/dist/lib/wizard/phase2-stack-query.d.ts.map +1 -0
  66. package/dist/lib/wizard/phase2-stack-query.js +105 -0
  67. package/dist/lib/wizard/phase2-stack-query.js.map +1 -0
  68. package/dist/lib/wizard/phase3-parameter-collection.d.ts +24 -0
  69. package/dist/lib/wizard/phase3-parameter-collection.d.ts.map +1 -0
  70. package/dist/lib/wizard/phase3-parameter-collection.js +389 -0
  71. package/dist/lib/wizard/phase3-parameter-collection.js.map +1 -0
  72. package/dist/lib/wizard/phase4-validation.d.ts +22 -0
  73. package/dist/lib/wizard/phase4-validation.d.ts.map +1 -0
  74. package/dist/lib/wizard/phase4-validation.js +294 -0
  75. package/dist/lib/wizard/phase4-validation.js.map +1 -0
  76. package/dist/lib/wizard/phase5-mode-decision.d.ts +22 -0
  77. package/dist/lib/wizard/phase5-mode-decision.d.ts.map +1 -0
  78. package/dist/lib/wizard/phase5-mode-decision.js +65 -0
  79. package/dist/lib/wizard/phase5-mode-decision.js.map +1 -0
  80. package/dist/lib/wizard/phase6-integrated-mode.d.ts +25 -0
  81. package/dist/lib/wizard/phase6-integrated-mode.d.ts.map +1 -0
  82. package/dist/lib/wizard/phase6-integrated-mode.js +230 -0
  83. package/dist/lib/wizard/phase6-integrated-mode.js.map +1 -0
  84. package/dist/lib/wizard/phase7-standalone-mode.d.ts +25 -0
  85. package/dist/lib/wizard/phase7-standalone-mode.d.ts.map +1 -0
  86. package/dist/lib/wizard/phase7-standalone-mode.js +210 -0
  87. package/dist/lib/wizard/phase7-standalone-mode.js.map +1 -0
  88. package/dist/lib/wizard/types.d.ts +178 -0
  89. package/dist/lib/wizard/types.d.ts.map +1 -0
  90. package/dist/lib/wizard/types.js +11 -0
  91. package/dist/lib/wizard/types.js.map +1 -0
  92. package/dist/package.json +3 -4
  93. package/dist/scripts/check-logs.d.ts +9 -2
  94. package/dist/scripts/check-logs.d.ts.map +1 -1
  95. package/dist/scripts/check-logs.js +26 -2
  96. package/dist/scripts/check-logs.js.map +1 -1
  97. package/package.json +3 -4
  98. package/dist/bin/commands/get-env.d.ts +0 -16
  99. package/dist/bin/commands/get-env.d.ts.map +0 -1
  100. package/dist/bin/commands/get-env.js +0 -210
  101. package/dist/bin/commands/get-env.js.map +0 -1
  102. 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,25 @@
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
+ * - Check and optionally enable BenchlingIntegration parameter
18
+ * - Show success message
19
+ * - Return (NO deployment)
20
+ *
21
+ * @param input - Integrated mode input
22
+ * @returns Integrated mode result
23
+ */
24
+ export declare function runIntegratedMode(input: IntegratedModeInput): Promise<IntegratedModeResult>;
25
+ //# 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;AAMH,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAyDpE;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6HjG"}
@@ -0,0 +1,230 @@
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 __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ var __importDefault = (this && this.__importDefault) || function (mod) {
44
+ return (mod && mod.__esModule) ? mod : { "default": mod };
45
+ };
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.runIntegratedMode = runIntegratedMode;
48
+ const chalk_1 = __importDefault(require("chalk"));
49
+ const inquirer_1 = __importDefault(require("inquirer"));
50
+ const sync_secrets_1 = require("../../bin/commands/sync-secrets");
51
+ /**
52
+ * Builds ProfileConfig from collected parameters
53
+ */
54
+ function buildProfileConfig(input) {
55
+ const { stackQuery, parameters, benchlingSecretArn, catalogDns } = input;
56
+ const now = new Date().toISOString();
57
+ const config = {
58
+ quilt: {
59
+ stackArn: stackQuery.stackArn,
60
+ catalog: catalogDns,
61
+ database: stackQuery.database,
62
+ queueUrl: stackQuery.queueUrl,
63
+ region: stackQuery.region,
64
+ },
65
+ benchling: {
66
+ tenant: parameters.benchling.tenant,
67
+ clientId: parameters.benchling.clientId,
68
+ clientSecret: parameters.benchling.clientSecret,
69
+ appDefinitionId: parameters.benchling.appDefinitionId,
70
+ secretArn: benchlingSecretArn,
71
+ },
72
+ packages: {
73
+ bucket: parameters.packages.bucket,
74
+ prefix: parameters.packages.prefix,
75
+ metadataKey: parameters.packages.metadataKey,
76
+ },
77
+ deployment: {
78
+ region: parameters.deployment.region,
79
+ account: parameters.deployment.account,
80
+ },
81
+ integratedStack: true, // CRITICAL: Mark as integrated mode
82
+ logging: {
83
+ level: parameters.logging.level,
84
+ },
85
+ security: {
86
+ enableVerification: parameters.security.enableVerification,
87
+ webhookAllowList: parameters.security.webhookAllowList,
88
+ },
89
+ _metadata: {
90
+ version: "0.7.0",
91
+ createdAt: now,
92
+ updatedAt: now,
93
+ source: "wizard",
94
+ },
95
+ };
96
+ if (parameters.benchling.testEntryId) {
97
+ config.benchling.testEntryId = parameters.benchling.testEntryId;
98
+ }
99
+ return config;
100
+ }
101
+ /**
102
+ * Phase 6: Integrated Mode
103
+ *
104
+ * Responsibilities:
105
+ * - Build complete configuration
106
+ * - Save config with integratedStack: true
107
+ * - Update BenchlingSecret ARN
108
+ * - Check and optionally enable BenchlingIntegration parameter
109
+ * - Show success message
110
+ * - Return (NO deployment)
111
+ *
112
+ * @param input - Integrated mode input
113
+ * @returns Integrated mode result
114
+ */
115
+ async function runIntegratedMode(input) {
116
+ const { profile, configStorage, awsProfile, yes, stackQuery } = input;
117
+ console.log(chalk_1.default.bold("\nIntegrated Stack Mode\n"));
118
+ // Step 1: Build configuration
119
+ const config = buildProfileConfig(input);
120
+ // Step 2: Save configuration
121
+ console.log(`Saving configuration to profile: ${profile}...\n`);
122
+ try {
123
+ configStorage.writeProfile(profile, config);
124
+ console.log(chalk_1.default.green(`✓ Configuration saved to: ~/.config/benchling-webhook/${profile}/config.json\n`));
125
+ }
126
+ catch (error) {
127
+ throw new Error(`Failed to save configuration: ${error.message}`);
128
+ }
129
+ // Step 3: Update BenchlingSecret in Quilt stack
130
+ console.log("Updating BenchlingSecret in Quilt stack...\n");
131
+ try {
132
+ await (0, sync_secrets_1.syncSecretsToAWS)({
133
+ profile,
134
+ awsProfile,
135
+ region: config.deployment.region,
136
+ force: true,
137
+ configStorage,
138
+ });
139
+ console.log(chalk_1.default.green("✓ BenchlingSecret updated in Quilt stack\n"));
140
+ }
141
+ catch (error) {
142
+ console.warn(chalk_1.default.yellow(`⚠️ Failed to sync secrets: ${error.message}`));
143
+ console.warn(chalk_1.default.yellow(" You can sync secrets manually later with:"));
144
+ console.warn(chalk_1.default.cyan(` npm run setup:sync-secrets -- --profile ${profile}\n`));
145
+ }
146
+ // Step 3.5: Check and optionally enable BenchlingIntegration parameter
147
+ console.log("Checking BenchlingIntegration parameter...\n");
148
+ const benchlingIntegrationEnabled = stackQuery.benchlingIntegrationEnabled;
149
+ let integrationStatusUpdated = false;
150
+ if (benchlingIntegrationEnabled === undefined) {
151
+ console.log(chalk_1.default.yellow("⚠️ Could not determine BenchlingIntegration status"));
152
+ console.log(chalk_1.default.dim(" You may need to enable it manually in CloudFormation\n"));
153
+ }
154
+ else if (benchlingIntegrationEnabled) {
155
+ console.log(chalk_1.default.green("✓ BenchlingIntegration is already Enabled\n"));
156
+ }
157
+ else {
158
+ // Parameter is disabled - offer to enable
159
+ console.log(chalk_1.default.yellow("BenchlingIntegration is currently Disabled"));
160
+ let shouldEnable = yes;
161
+ if (!yes) {
162
+ const { enable } = await inquirer_1.default.prompt([
163
+ {
164
+ type: "confirm",
165
+ name: "enable",
166
+ message: "Enable BenchlingIntegration now?",
167
+ default: true,
168
+ },
169
+ ]);
170
+ shouldEnable = enable;
171
+ }
172
+ if (shouldEnable) {
173
+ console.log("\nEnabling BenchlingIntegration parameter...");
174
+ const { updateStackParameter } = await Promise.resolve().then(() => __importStar(require("../utils/stack-parameter-update")));
175
+ const updateResult = await updateStackParameter({
176
+ stackArn: stackQuery.stackArn,
177
+ region: config.deployment.region,
178
+ parameterKey: "BenchlingIntegration",
179
+ parameterValue: "Enabled",
180
+ awsProfile,
181
+ });
182
+ if (updateResult.success) {
183
+ console.log(chalk_1.default.green("✓ Stack update initiated"));
184
+ console.log(chalk_1.default.dim(" The stack is now updating in the background\n"));
185
+ integrationStatusUpdated = true;
186
+ }
187
+ else {
188
+ console.warn(chalk_1.default.yellow(`⚠️ Failed to enable BenchlingIntegration: ${updateResult.error}`));
189
+ console.warn(chalk_1.default.yellow(" You can enable it manually in CloudFormation console\n"));
190
+ }
191
+ }
192
+ else {
193
+ console.log(chalk_1.default.dim(" Skipped - you can enable it later via CloudFormation console\n"));
194
+ }
195
+ }
196
+ // Step 4: Show success message with status monitoring command
197
+ console.log("╔═══════════════════════════════════════════════════════════╗");
198
+ console.log("║ Setup Complete! ║");
199
+ console.log("╚═══════════════════════════════════════════════════════════╝\n");
200
+ console.log(chalk_1.default.bold("Integrated Stack Mode"));
201
+ console.log(chalk_1.default.dim("─".repeat(80)));
202
+ console.log(chalk_1.default.green("✓ BenchlingSecret updated in Quilt stack"));
203
+ // Show integration status
204
+ if (benchlingIntegrationEnabled === true && !integrationStatusUpdated) {
205
+ console.log(chalk_1.default.green("✓ BenchlingIntegration is Enabled"));
206
+ }
207
+ else if (benchlingIntegrationEnabled === false || integrationStatusUpdated) {
208
+ console.log(chalk_1.default.yellow("⚠ BenchlingIntegration update in progress"));
209
+ }
210
+ else {
211
+ console.log(chalk_1.default.dim("✓ BenchlingIntegration status unknown"));
212
+ }
213
+ console.log(chalk_1.default.dim("✓ No separate webhook deployment needed"));
214
+ console.log(chalk_1.default.dim("✓ Quilt stack will handle webhook events\n"));
215
+ console.log(chalk_1.default.bold("Next steps:"));
216
+ console.log(" 1. Monitor stack update:");
217
+ console.log(chalk_1.default.cyan(` npx @quiltdata/benchling-webhook status --profile ${profile}`));
218
+ console.log(" 2. Configure webhook URL in Benchling app settings");
219
+ console.log(" (Get the webhook URL from your Quilt stack outputs)");
220
+ console.log(" 3. Test the webhook integration");
221
+ console.log(" 4. Monitor logs:");
222
+ console.log(chalk_1.default.cyan(` npx @quiltdata/benchling-webhook logs --profile ${profile}`));
223
+ console.log("");
224
+ return {
225
+ success: true,
226
+ configPath: `~/.config/benchling-webhook/${profile}/config.json`,
227
+ secretArn: input.benchlingSecretArn,
228
+ };
229
+ }
230
+ //# sourceMappingURL=phase6-integrated-mode.js.map