@autonoma-io/a6s 5.2.2 → 5.3.0

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 (72) hide show
  1. package/bin/binaries/a6s-darwin-arm64 +0 -0
  2. package/bin/binaries/a6s-darwin-x64 +0 -0
  3. package/bin/binaries/a6s-linux-arm64 +0 -0
  4. package/bin/binaries/a6s-linux-x64 +0 -0
  5. package/bin/binaries/a6s-win32-x64.exe +0 -0
  6. package/dist/go-bridge.d.ts +14 -0
  7. package/dist/go-bridge.d.ts.map +1 -0
  8. package/dist/go-bridge.js +92 -0
  9. package/dist/go-bridge.js.map +1 -0
  10. package/dist/go-verbs.generated.d.ts +2 -0
  11. package/dist/go-verbs.generated.d.ts.map +1 -0
  12. package/dist/go-verbs.generated.js +46 -0
  13. package/dist/go-verbs.generated.js.map +1 -0
  14. package/dist/index.js +79 -230
  15. package/dist/index.js.map +1 -1
  16. package/dist/interactive.d.ts +9 -2
  17. package/dist/interactive.d.ts.map +1 -1
  18. package/dist/interactive.js +38 -160
  19. package/dist/interactive.js.map +1 -1
  20. package/dist/nlp/command-map.d.ts +33 -0
  21. package/dist/nlp/command-map.d.ts.map +1 -0
  22. package/dist/nlp/command-map.js +275 -0
  23. package/dist/nlp/command-map.js.map +1 -0
  24. package/dist/nlp/processor.d.ts +10 -0
  25. package/dist/nlp/processor.d.ts.map +1 -1
  26. package/dist/nlp/processor.js +81 -94
  27. package/dist/nlp/processor.js.map +1 -1
  28. package/package.json +6 -30
  29. package/dist/commands/ai-learning-demo.d.ts +0 -3
  30. package/dist/commands/ai-learning-demo.d.ts.map +0 -1
  31. package/dist/commands/ai-learning-demo.js +0 -176
  32. package/dist/commands/ai-learning-demo.js.map +0 -1
  33. package/dist/commands/auth.d.ts +0 -33
  34. package/dist/commands/auth.d.ts.map +0 -1
  35. package/dist/commands/auth.js +0 -603
  36. package/dist/commands/auth.js.map +0 -1
  37. package/dist/modules/ab-testing.d.ts +0 -16
  38. package/dist/modules/ab-testing.d.ts.map +0 -1
  39. package/dist/modules/ab-testing.js +0 -375
  40. package/dist/modules/ab-testing.js.map +0 -1
  41. package/dist/modules/ai-orchestration.d.ts +0 -70
  42. package/dist/modules/ai-orchestration.d.ts.map +0 -1
  43. package/dist/modules/ai-orchestration.js +0 -546
  44. package/dist/modules/ai-orchestration.js.map +0 -1
  45. package/dist/modules/auth-access-control.d.ts +0 -118
  46. package/dist/modules/auth-access-control.d.ts.map +0 -1
  47. package/dist/modules/auth-access-control.js +0 -832
  48. package/dist/modules/auth-access-control.js.map +0 -1
  49. package/dist/modules/database.d.ts +0 -14
  50. package/dist/modules/database.d.ts.map +0 -1
  51. package/dist/modules/database.js +0 -253
  52. package/dist/modules/database.js.map +0 -1
  53. package/dist/modules/edge-computing.d.ts +0 -130
  54. package/dist/modules/edge-computing.d.ts.map +0 -1
  55. package/dist/modules/edge-computing.js +0 -656
  56. package/dist/modules/edge-computing.js.map +0 -1
  57. package/dist/modules/load-testing.d.ts +0 -21
  58. package/dist/modules/load-testing.d.ts.map +0 -1
  59. package/dist/modules/load-testing.js +0 -372
  60. package/dist/modules/load-testing.js.map +0 -1
  61. package/dist/modules/monitoring.d.ts +0 -18
  62. package/dist/modules/monitoring.d.ts.map +0 -1
  63. package/dist/modules/monitoring.js +0 -375
  64. package/dist/modules/monitoring.js.map +0 -1
  65. package/dist/modules/onboarding.d.ts +0 -20
  66. package/dist/modules/onboarding.d.ts.map +0 -1
  67. package/dist/modules/onboarding.js +0 -455
  68. package/dist/modules/onboarding.js.map +0 -1
  69. package/dist/utils/db-client.d.ts +0 -35
  70. package/dist/utils/db-client.d.ts.map +0 -1
  71. package/dist/utils/db-client.js +0 -132
  72. package/dist/utils/db-client.js.map +0 -1
@@ -1,455 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.OnboardingModule = void 0;
7
- const mail_1 = __importDefault(require("@sendgrid/mail"));
8
- const chalk_1 = __importDefault(require("chalk"));
9
- const ora_1 = __importDefault(require("ora"));
10
- const table_1 = require("table");
11
- const crypto_1 = __importDefault(require("crypto"));
12
- const db_client_1 = require("../utils/db-client");
13
- class OnboardingModule {
14
- dbClient;
15
- constructor() {
16
- const sendgridKey = process.env.SENDGRID_API_KEY;
17
- if (!sendgridKey) {
18
- throw new Error('SENDGRID_API_KEY environment variable is required for OnboardingModule');
19
- }
20
- mail_1.default.setApiKey(sendgridKey);
21
- // Initialize database with secure SSL configuration using AWS RDS CA bundle
22
- this.dbClient = (0, db_client_1.createDbClient)();
23
- }
24
- async sendInvitation(email, options = {}) {
25
- const spinner = (0, ora_1.default)('Sending invitation...').start();
26
- try {
27
- await this.dbClient.connect();
28
- // Check if customer already exists
29
- const existingCustomer = await this.dbClient.query('SELECT id, status FROM customers WHERE email = $1', [email]);
30
- if (existingCustomer.rows.length > 0) {
31
- const customer = existingCustomer.rows[0];
32
- if (customer.status === 'active') {
33
- spinner.fail('Customer already active');
34
- return;
35
- }
36
- else if (customer.status === 'invited') {
37
- spinner.warn('Invitation already sent');
38
- console.log(chalk_1.default.yellow('\n⚠️ Resending invitation...'));
39
- }
40
- }
41
- spinner.text = 'Generating invitation token...';
42
- // Generate unique invitation token
43
- const invitationToken = crypto_1.default.randomBytes(32).toString('hex');
44
- const expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); // 7 days
45
- // Create or update customer record
46
- if (existingCustomer.rows.length === 0) {
47
- // Check if customers table exists
48
- const tableExists = await this.dbClient.query(`
49
- SELECT EXISTS (
50
- SELECT FROM information_schema.tables
51
- WHERE table_name = 'customers'
52
- );
53
- `);
54
- if (!tableExists.rows[0].exists) {
55
- spinner.text = 'Creating customers table...';
56
- await this.dbClient.query(`
57
- CREATE TABLE customers (
58
- id SERIAL PRIMARY KEY,
59
- email VARCHAR(255) UNIQUE NOT NULL,
60
- organization_name VARCHAR(255),
61
- tier VARCHAR(50) DEFAULT 'standard',
62
- plan VARCHAR(50) DEFAULT 'enterprise',
63
- status VARCHAR(50) DEFAULT 'invited',
64
- invitation_token VARCHAR(255),
65
- invitation_expires_at TIMESTAMP,
66
- onboarding_completed_at TIMESTAMP,
67
- metadata JSONB,
68
- created_at TIMESTAMP DEFAULT NOW(),
69
- updated_at TIMESTAMP DEFAULT NOW()
70
- );
71
-
72
- CREATE TABLE customer_features (
73
- id SERIAL PRIMARY KEY,
74
- customer_id INTEGER REFERENCES customers(id),
75
- feature_name VARCHAR(100) NOT NULL,
76
- enabled BOOLEAN DEFAULT true,
77
- config JSONB,
78
- created_at TIMESTAMP DEFAULT NOW()
79
- );
80
-
81
- CREATE INDEX idx_customers_email ON customers(email);
82
- CREATE INDEX idx_customers_status ON customers(status);
83
- CREATE INDEX idx_customer_features_customer_id ON customer_features(customer_id);
84
- `);
85
- }
86
- await this.dbClient.query(`
87
- INSERT INTO customers (email, tier, invitation_token, invitation_expires_at, status)
88
- VALUES ($1, $2, $3, $4, 'invited')
89
- `, [email, options.tier || 'standard', invitationToken, expiresAt]);
90
- }
91
- else {
92
- await this.dbClient.query(`
93
- UPDATE customers
94
- SET invitation_token = $1,
95
- invitation_expires_at = $2,
96
- status = 'invited',
97
- updated_at = NOW()
98
- WHERE email = $3
99
- `, [invitationToken, expiresAt, email]);
100
- }
101
- spinner.text = 'Sending invitation email...';
102
- // Prepare invitation email
103
- const invitationUrl = `https://www.theautonoma.io/alpha/register?token=${invitationToken}`;
104
- const msg = {
105
- to: email,
106
- from: 'noreply@theautonoma.io',
107
- subject: 'Welcome to Autonoma Alpha Program',
108
- html: `
109
- <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
110
- <h1>Welcome to Autonoma Alpha Program!</h1>
111
- <p>You've been invited to join the exclusive Autonoma Alpha Program.</p>
112
- ${options.customMessage ? `<p>${options.customMessage}</p>` : ''}
113
- <p>As an Alpha customer, you'll get:</p>
114
- <ul>
115
- <li>Early access to Level 5 autonomous development</li>
116
- <li>Direct influence on product roadmap</li>
117
- <li>Dedicated support from our engineering team</li>
118
- <li>Lifetime discount on all future services</li>
119
- </ul>
120
- <p>Click the button below to complete your registration:</p>
121
- <a href="${invitationUrl}" style="display: inline-block; background-color: #7c3aed; color: white; padding: 12px 24px; text-decoration: none; border-radius: 4px; margin: 20px 0;">
122
- Complete Registration
123
- </a>
124
- <p style="color: #666; font-size: 12px;">
125
- This invitation expires in 7 days. If the button doesn't work, copy this link: ${invitationUrl}
126
- </p>
127
- </div>
128
- `
129
- };
130
- await mail_1.default.send(msg);
131
- spinner.succeed('Invitation sent successfully');
132
- console.log(chalk_1.default.green('\n✅ Invitation Details:'));
133
- console.log(` Email: ${email}`);
134
- console.log(` Tier: ${options.tier || 'standard'}`);
135
- console.log(` Token: ${invitationToken.substring(0, 8)}...`);
136
- console.log(` Expires: ${expiresAt.toLocaleDateString()}`);
137
- console.log(` URL: ${chalk_1.default.blue(invitationUrl)}`);
138
- }
139
- catch (error) {
140
- spinner.fail('Failed to send invitation');
141
- console.error(chalk_1.default.red('Error:'), error.message);
142
- throw error;
143
- }
144
- finally {
145
- await this.dbClient.end();
146
- }
147
- }
148
- async provisionOrganization(orgName, options = {}) {
149
- const spinner = (0, ora_1.default)(`Provisioning organization: ${orgName}...`).start();
150
- try {
151
- await this.dbClient.connect();
152
- const plan = options.plan || 'enterprise';
153
- const features = options.features || ['deployment', 'monitoring', 'ai-agents', 'analytics'];
154
- spinner.text = 'Creating organization...';
155
- // Check if organizations table exists
156
- const tableExists = await this.dbClient.query(`
157
- SELECT EXISTS (
158
- SELECT FROM information_schema.tables
159
- WHERE table_name = 'organizations'
160
- );
161
- `);
162
- if (!tableExists.rows[0].exists) {
163
- spinner.text = 'Setting up organization schema...';
164
- await this.dbClient.query(`
165
- CREATE TABLE organizations (
166
- id SERIAL PRIMARY KEY,
167
- name VARCHAR(255) UNIQUE NOT NULL,
168
- slug VARCHAR(255) UNIQUE NOT NULL,
169
- plan VARCHAR(50) DEFAULT 'enterprise',
170
- status VARCHAR(50) DEFAULT 'provisioning',
171
- api_key VARCHAR(255),
172
- webhook_url VARCHAR(500),
173
- config JSONB,
174
- created_at TIMESTAMP DEFAULT NOW(),
175
- updated_at TIMESTAMP DEFAULT NOW()
176
- );
177
-
178
- CREATE TABLE organization_users (
179
- id SERIAL PRIMARY KEY,
180
- organization_id INTEGER REFERENCES organizations(id),
181
- customer_id INTEGER REFERENCES customers(id),
182
- role VARCHAR(50) DEFAULT 'member',
183
- permissions JSONB,
184
- created_at TIMESTAMP DEFAULT NOW()
185
- );
186
-
187
- CREATE INDEX idx_organizations_slug ON organizations(slug);
188
- CREATE INDEX idx_organization_users_org_id ON organization_users(organization_id);
189
- `);
190
- }
191
- // Generate organization slug and API key
192
- const slug = orgName.toLowerCase().replace(/[^a-z0-9]/g, '-');
193
- const apiKey = `ak_${crypto_1.default.randomBytes(32).toString('hex')}`;
194
- // Create organization
195
- const orgResult = await this.dbClient.query(`
196
- INSERT INTO organizations (name, slug, plan, api_key, config, status)
197
- VALUES ($1, $2, $3, $4, $5, 'provisioning')
198
- RETURNING id
199
- `, [
200
- orgName,
201
- slug,
202
- plan,
203
- apiKey,
204
- JSON.stringify({
205
- features: features,
206
- limits: this.getPlanLimits(plan),
207
- customConfig: options.customConfig || {}
208
- })
209
- ]);
210
- const orgId = orgResult.rows[0].id;
211
- spinner.text = 'Provisioning infrastructure...';
212
- // Simulate infrastructure provisioning steps
213
- const provisioningSteps = [
214
- { name: 'Creating AWS resources', duration: 2000 },
215
- { name: 'Setting up database', duration: 1500 },
216
- { name: 'Configuring AI agents', duration: 1000 },
217
- { name: 'Enabling monitoring', duration: 500 },
218
- { name: 'Generating API credentials', duration: 500 }
219
- ];
220
- for (const step of provisioningSteps) {
221
- spinner.text = step.name + '...';
222
- await new Promise(resolve => setTimeout(resolve, step.duration));
223
- }
224
- // Mark organization as active
225
- await this.dbClient.query(`
226
- UPDATE organizations
227
- SET status = 'active',
228
- updated_at = NOW()
229
- WHERE id = $1
230
- `, [orgId]);
231
- spinner.succeed('Organization provisioned successfully');
232
- // Display provisioning summary
233
- console.log(chalk_1.default.cyan('\n🏢 Organization Details:\n'));
234
- const summaryData = [
235
- ['Property', 'Value'],
236
- ['Name', orgName],
237
- ['Slug', slug],
238
- ['Plan', plan],
239
- ['API Key', `${apiKey.substring(0, 12)}...`],
240
- ['Status', chalk_1.default.green('Active')],
241
- ['Features', features.join(', ')]
242
- ];
243
- console.log((0, table_1.table)(summaryData));
244
- // Display plan limits
245
- const limits = this.getPlanLimits(plan);
246
- console.log(chalk_1.default.cyan('\n📊 Plan Limits:\n'));
247
- console.log(` Deployments/month: ${limits.deployments}`);
248
- console.log(` API Calls/month: ${limits.apiCalls}`);
249
- console.log(` AI Agents: ${limits.aiAgents}`);
250
- console.log(` Team Members: ${limits.teamMembers}`);
251
- // Generate onboarding URLs
252
- console.log(chalk_1.default.cyan('\n🔗 Onboarding URLs:\n'));
253
- console.log(` Dashboard: ${chalk_1.default.blue(`https://www.theautonoma.io/dashboard/${slug}`)}`);
254
- console.log(` API Docs: ${chalk_1.default.blue(`https://www.theautonoma.io/docs/api/${slug}`)}`);
255
- console.log(` Webhooks: ${chalk_1.default.blue(`https://www.theautonoma.io/webhooks/${slug}`)}`);
256
- // Next steps
257
- console.log(chalk_1.default.cyan('\n✅ Next Steps:\n'));
258
- console.log(' 1. Share API key with development team');
259
- console.log(' 2. Configure webhook endpoints');
260
- console.log(' 3. Install Autonoma SDK in your codebase');
261
- console.log(' 4. Deploy your first autonomous agent');
262
- }
263
- catch (error) {
264
- spinner.fail('Provisioning failed');
265
- console.error(chalk_1.default.red('Error:'), error.message);
266
- throw error;
267
- }
268
- finally {
269
- await this.dbClient.end();
270
- }
271
- }
272
- async validateSetup(orgName) {
273
- const spinner = (0, ora_1.default)('Validating organization setup...').start();
274
- try {
275
- await this.dbClient.connect();
276
- // Get organization
277
- const orgResult = await this.dbClient.query(`
278
- SELECT
279
- o.*,
280
- COUNT(DISTINCT ou.customer_id) as user_count
281
- FROM organizations o
282
- LEFT JOIN organization_users ou ON o.id = ou.organization_id
283
- WHERE o.name = $1 OR o.slug = $1
284
- GROUP BY o.id
285
- `, [orgName.toLowerCase()]);
286
- if (orgResult.rows.length === 0) {
287
- spinner.fail('Organization not found');
288
- return;
289
- }
290
- const org = orgResult.rows[0];
291
- const config = org.config || {};
292
- spinner.stop();
293
- console.log(chalk_1.default.cyan('\n🔍 Setup Validation Report\n'));
294
- console.log(`Organization: ${org.name}`);
295
- console.log(`Status: ${this.getStatusIcon(org.status)}`);
296
- console.log(`Created: ${org.created_at.toLocaleDateString()}`);
297
- // Validation checks
298
- const checks = [
299
- {
300
- name: 'Organization Status',
301
- passed: org.status === 'active',
302
- message: org.status === 'active' ? 'Active' : `Status: ${org.status}`
303
- },
304
- {
305
- name: 'API Key Generated',
306
- passed: !!org.api_key,
307
- message: org.api_key ? 'API key exists' : 'No API key'
308
- },
309
- {
310
- name: 'Users Added',
311
- passed: org.user_count > 0,
312
- message: `${org.user_count} user(s) added`
313
- },
314
- {
315
- name: 'Webhook Configured',
316
- passed: !!org.webhook_url,
317
- message: org.webhook_url ? org.webhook_url : 'No webhook URL'
318
- },
319
- {
320
- name: 'Features Enabled',
321
- passed: config.features && config.features.length > 0,
322
- message: config.features ? `${config.features.length} features` : 'No features'
323
- }
324
- ];
325
- // Connectivity checks
326
- spinner.start('Running connectivity checks...');
327
- // Check API endpoint
328
- let apiCheck = false;
329
- try {
330
- const apiResponse = await fetch(`https://www.theautonoma.io/api/health`);
331
- apiCheck = apiResponse.ok;
332
- }
333
- catch (error) {
334
- apiCheck = false;
335
- }
336
- checks.push({
337
- name: 'API Connectivity',
338
- passed: apiCheck,
339
- message: apiCheck ? 'API accessible' : 'API unreachable'
340
- });
341
- // Check webhook if configured
342
- if (org.webhook_url) {
343
- let webhookCheck = false;
344
- try {
345
- const webhookResponse = await fetch(org.webhook_url, {
346
- method: 'POST',
347
- headers: { 'Content-Type': 'application/json' },
348
- body: JSON.stringify({ type: 'test', timestamp: Date.now() })
349
- });
350
- webhookCheck = webhookResponse.ok;
351
- }
352
- catch (error) {
353
- webhookCheck = false;
354
- }
355
- checks.push({
356
- name: 'Webhook Connectivity',
357
- passed: webhookCheck,
358
- message: webhookCheck ? 'Webhook responsive' : 'Webhook unreachable'
359
- });
360
- }
361
- spinner.stop();
362
- // Display validation results
363
- console.log(chalk_1.default.cyan('\n📋 Validation Results:\n'));
364
- const tableData = [
365
- ['Check', 'Status', 'Details'],
366
- ...checks.map(check => [
367
- check.name,
368
- check.passed ? chalk_1.default.green('✅ Passed') : chalk_1.default.red('❌ Failed'),
369
- check.message
370
- ])
371
- ];
372
- console.log((0, table_1.table)(tableData));
373
- // Calculate score
374
- const passedChecks = checks.filter(c => c.passed).length;
375
- const totalChecks = checks.length;
376
- const score = Math.round((passedChecks / totalChecks) * 100);
377
- console.log(chalk_1.default.cyan('\n📊 Validation Score:\n'));
378
- console.log(` Score: ${score}% (${passedChecks}/${totalChecks} passed)`);
379
- if (score === 100) {
380
- console.log(chalk_1.default.green('\n✅ Organization is fully configured and ready!'));
381
- }
382
- else if (score >= 80) {
383
- console.log(chalk_1.default.yellow('\n⚠️ Organization is mostly ready but has minor issues'));
384
- }
385
- else {
386
- console.log(chalk_1.default.red('\n❌ Organization setup is incomplete'));
387
- }
388
- // Recommendations
389
- if (score < 100) {
390
- console.log(chalk_1.default.cyan('\n💡 Recommendations:\n'));
391
- checks.filter(c => !c.passed).forEach(check => {
392
- switch (check.name) {
393
- case 'Users Added':
394
- console.log(' • Invite team members to the organization');
395
- break;
396
- case 'Webhook Configured':
397
- console.log(' • Configure webhook URL for event notifications');
398
- break;
399
- case 'API Connectivity':
400
- console.log(' • Check network connectivity and firewall rules');
401
- break;
402
- case 'Webhook Connectivity':
403
- console.log(' • Verify webhook endpoint is accessible and responsive');
404
- break;
405
- }
406
- });
407
- }
408
- }
409
- catch (error) {
410
- spinner.fail('Validation failed');
411
- console.error(chalk_1.default.red('Error:'), error.message);
412
- throw error;
413
- }
414
- finally {
415
- await this.dbClient.end();
416
- }
417
- }
418
- getPlanLimits(plan) {
419
- const limits = {
420
- 'starter': {
421
- deployments: 100,
422
- apiCalls: 10000,
423
- aiAgents: 3,
424
- teamMembers: 5
425
- },
426
- 'standard': {
427
- deployments: 500,
428
- apiCalls: 100000,
429
- aiAgents: 10,
430
- teamMembers: 20
431
- },
432
- 'enterprise': {
433
- deployments: 'Unlimited',
434
- apiCalls: 'Unlimited',
435
- aiAgents: 'Unlimited',
436
- teamMembers: 'Unlimited'
437
- }
438
- };
439
- return limits[plan] || limits['standard'];
440
- }
441
- getStatusIcon(status) {
442
- switch (status) {
443
- case 'active':
444
- return chalk_1.default.green('✅ Active');
445
- case 'provisioning':
446
- return chalk_1.default.yellow('⏳ Provisioning');
447
- case 'suspended':
448
- return chalk_1.default.red('❌ Suspended');
449
- default:
450
- return status;
451
- }
452
- }
453
- }
454
- exports.OnboardingModule = OnboardingModule;
455
- //# sourceMappingURL=onboarding.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/modules/onboarding.ts"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- /**
2
- * Database Client Utility
3
- *
4
- * Provides secure PostgreSQL client with proper AWS RDS certificate validation.
5
- * Uses AWS RDS global CA bundle instead of disabling SSL verification.
6
- *
7
- * Security: This replaces the insecure NODE_TLS_REJECT_UNAUTHORIZED=0 approach
8
- * Reference: AWS RDS Certificate Authority documentation
9
- */
10
- import { Client, ClientConfig } from 'pg';
11
- /**
12
- * Get SSL configuration for PostgreSQL client
13
- * Uses CA bundle if available, falls back to insecure mode with warning
14
- */
15
- export declare function getSSLConfig(): ClientConfig['ssl'];
16
- /**
17
- * Default database connection string
18
- * Uses environment variable or falls back to default
19
- */
20
- export declare const DEFAULT_CONNECTION_STRING: string;
21
- /**
22
- * Create a new PostgreSQL client with secure SSL configuration
23
- *
24
- * @param connectionString - Optional connection string (defaults to DATABASE_URL)
25
- * @returns Configured pg Client instance
26
- */
27
- export declare function createDbClient(connectionString?: string): Client;
28
- /**
29
- * Create a new PostgreSQL client and connect it
30
- *
31
- * @param connectionString - Optional connection string (defaults to DATABASE_URL)
32
- * @returns Promise resolving to connected pg Client instance
33
- */
34
- export declare function createConnectedDbClient(connectionString?: string): Promise<Client>;
35
- //# sourceMappingURL=db-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"db-client.d.ts","sourceRoot":"","sources":["../../src/utils/db-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AA2C1C;;;GAGG;AACH,wBAAgB,YAAY,IAAI,YAAY,CAAC,KAAK,CAAC,CAclD;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAuC,CAAC;AAEhF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIxF"}
@@ -1,132 +0,0 @@
1
- "use strict";
2
- /**
3
- * Database Client Utility
4
- *
5
- * Provides secure PostgreSQL client with proper AWS RDS certificate validation.
6
- * Uses AWS RDS global CA bundle instead of disabling SSL verification.
7
- *
8
- * Security: This replaces the insecure NODE_TLS_REJECT_UNAUTHORIZED=0 approach
9
- * Reference: AWS RDS Certificate Authority documentation
10
- */
11
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
- if (k2 === undefined) k2 = k;
13
- var desc = Object.getOwnPropertyDescriptor(m, k);
14
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
- desc = { enumerable: true, get: function() { return m[k]; } };
16
- }
17
- Object.defineProperty(o, k2, desc);
18
- }) : (function(o, m, k, k2) {
19
- if (k2 === undefined) k2 = k;
20
- o[k2] = m[k];
21
- }));
22
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
- Object.defineProperty(o, "default", { enumerable: true, value: v });
24
- }) : function(o, v) {
25
- o["default"] = v;
26
- });
27
- var __importStar = (this && this.__importStar) || (function () {
28
- var ownKeys = function(o) {
29
- ownKeys = Object.getOwnPropertyNames || function (o) {
30
- var ar = [];
31
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
- return ar;
33
- };
34
- return ownKeys(o);
35
- };
36
- return function (mod) {
37
- if (mod && mod.__esModule) return mod;
38
- var result = {};
39
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
- __setModuleDefault(result, mod);
41
- return result;
42
- };
43
- })();
44
- Object.defineProperty(exports, "__esModule", { value: true });
45
- exports.DEFAULT_CONNECTION_STRING = void 0;
46
- exports.getSSLConfig = getSSLConfig;
47
- exports.createDbClient = createDbClient;
48
- exports.createConnectedDbClient = createConnectedDbClient;
49
- const pg_1 = require("pg");
50
- const fs = __importStar(require("fs"));
51
- const path = __importStar(require("path"));
52
- // CA bundle paths to check (in order of preference)
53
- const CA_BUNDLE_PATHS = [
54
- path.join(__dirname, '../../certs/rds-global-bundle.pem'),
55
- path.join(__dirname, '../../../certs/rds-global-bundle.pem'),
56
- '/app/certs/rds-global-bundle.pem',
57
- '/etc/ssl/certs/rds-global-bundle.pem'
58
- ];
59
- // Cache the certificate to avoid repeated file reads
60
- let rdsCaCertificate = null;
61
- let certificateLoaded = false;
62
- /**
63
- * Load the RDS CA certificate bundle
64
- * Tries multiple paths and caches the result
65
- */
66
- function loadCaCertificate() {
67
- if (certificateLoaded) {
68
- return rdsCaCertificate;
69
- }
70
- for (const certPath of CA_BUNDLE_PATHS) {
71
- try {
72
- if (fs.existsSync(certPath)) {
73
- rdsCaCertificate = fs.readFileSync(certPath, 'utf-8');
74
- console.log(`[db-client] Loaded RDS CA bundle from: ${certPath}`);
75
- certificateLoaded = true;
76
- return rdsCaCertificate;
77
- }
78
- }
79
- catch (error) {
80
- // Continue to next path
81
- }
82
- }
83
- console.warn('[db-client] Could not load RDS CA bundle from any path, falling back to insecure mode');
84
- certificateLoaded = true;
85
- return null;
86
- }
87
- /**
88
- * Get SSL configuration for PostgreSQL client
89
- * Uses CA bundle if available, falls back to insecure mode with warning
90
- */
91
- function getSSLConfig() {
92
- const caCert = loadCaCertificate();
93
- if (caCert) {
94
- return {
95
- rejectUnauthorized: true,
96
- ca: caCert
97
- };
98
- }
99
- // Fallback to insecure mode (only for development/testing)
100
- return {
101
- rejectUnauthorized: false
102
- };
103
- }
104
- /**
105
- * Default database connection string
106
- * Uses environment variable or falls back to default
107
- */
108
- exports.DEFAULT_CONNECTION_STRING = process.env.DATABASE_URL || '';
109
- /**
110
- * Create a new PostgreSQL client with secure SSL configuration
111
- *
112
- * @param connectionString - Optional connection string (defaults to DATABASE_URL)
113
- * @returns Configured pg Client instance
114
- */
115
- function createDbClient(connectionString) {
116
- return new pg_1.Client({
117
- connectionString: connectionString || exports.DEFAULT_CONNECTION_STRING,
118
- ssl: getSSLConfig()
119
- });
120
- }
121
- /**
122
- * Create a new PostgreSQL client and connect it
123
- *
124
- * @param connectionString - Optional connection string (defaults to DATABASE_URL)
125
- * @returns Promise resolving to connected pg Client instance
126
- */
127
- async function createConnectedDbClient(connectionString) {
128
- const client = createDbClient(connectionString);
129
- await client.connect();
130
- return client;
131
- }
132
- //# sourceMappingURL=db-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"db-client.js","sourceRoot":"","sources":["../../src/utils/db-client.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDH,oCAcC;AAcD,wCAKC;AAQD,0DAIC;AA5FD,2BAA0C;AAC1C,uCAAyB;AACzB,2CAA6B;AAE7B,oDAAoD;AACpD,MAAM,eAAe,GAAG;IACtB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mCAAmC,CAAC;IACzD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sCAAsC,CAAC;IAC5D,kCAAkC;IAClC,sCAAsC;CACvC,CAAC;AAEF,qDAAqD;AACrD,IAAI,gBAAgB,GAAkB,IAAI,CAAC;AAC3C,IAAI,iBAAiB,GAAG,KAAK,CAAC;AAE9B;;;GAGG;AACH,SAAS,iBAAiB;IACxB,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,gBAAgB,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAC;gBAClE,iBAAiB,GAAG,IAAI,CAAC;gBACzB,OAAO,gBAAgB,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;IACtG,iBAAiB,GAAG,IAAI,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY;IAC1B,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IAEnC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,kBAAkB,EAAE,IAAI;YACxB,EAAE,EAAE,MAAM;SACX,CAAC;IACJ,CAAC;IAED,2DAA2D;IAC3D,OAAO;QACL,kBAAkB,EAAE,KAAK;KAC1B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACU,QAAA,yBAAyB,GAAW,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;AAEhF;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,gBAAyB;IACtD,OAAO,IAAI,WAAM,CAAC;QAChB,gBAAgB,EAAE,gBAAgB,IAAI,iCAAyB;QAC/D,GAAG,EAAE,YAAY,EAAE;KACpB,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,uBAAuB,CAAC,gBAAyB;IACrE,MAAM,MAAM,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAChD,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC"}