@looopy-ai/aws 1.0.1 → 1.0.3

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.
@@ -0,0 +1,7 @@
1
+ export interface LoadSecretsOptions {
2
+ secretKeys: string[];
3
+ awsRegion?: string;
4
+ environment?: string;
5
+ secretPrefix?: string;
6
+ }
7
+ export declare function loadSecrets(options: LoadSecretsOptions): Promise<void>;
@@ -0,0 +1,50 @@
1
+ import { GetSecretValueCommand, SecretsManagerClient, SecretsManagerServiceException, } from '@aws-sdk/client-secrets-manager';
2
+ import { getLogger } from '@looopy-ai/core';
3
+ export async function loadSecrets(options) {
4
+ const { secretKeys, awsRegion = process.env.AWS_REGION || 'us-west-2', environment = (process.env.ENVIRONMENT || 'dev').toLowerCase(), secretPrefix = 'agents', } = options;
5
+ const logger = getLogger({ component: 'secrets-loader' });
6
+ let client;
7
+ try {
8
+ client = new SecretsManagerClient({ region: awsRegion });
9
+ }
10
+ catch (error) {
11
+ logger.error(`Failed to create Secrets Manager client: ${error}`);
12
+ return;
13
+ }
14
+ for (const key of secretKeys) {
15
+ const secretId = `${secretPrefix}-${environment}${key}`;
16
+ try {
17
+ const command = new GetSecretValueCommand({ SecretId: secretId });
18
+ const response = await client.send(command);
19
+ if (!response.SecretString) {
20
+ logger.warn(`Secret ${secretId} has no SecretString`);
21
+ continue;
22
+ }
23
+ const secretData = JSON.parse(response.SecretString);
24
+ for (const [envKey, envValue] of Object.entries(secretData)) {
25
+ process.env[envKey] = String(envValue);
26
+ logger.debug(`Loaded secret key: ${envKey}`);
27
+ }
28
+ logger.info(`Successfully loaded secret: ${secretId}`);
29
+ }
30
+ catch (error) {
31
+ if (error instanceof SecretsManagerServiceException) {
32
+ if (error.name === 'ResourceNotFoundException') {
33
+ logger.warn(`Secret not found: ${secretId}`);
34
+ }
35
+ else if (error.name === 'AccessDeniedException') {
36
+ logger.error(`Access denied to secret: ${secretId}`);
37
+ }
38
+ else {
39
+ logger.error(`Error loading secret ${secretId}: ${error.message}`);
40
+ }
41
+ }
42
+ else if (error instanceof SyntaxError) {
43
+ logger.error(`Failed to parse secret ${secretId} as JSON: ${error.message}`);
44
+ }
45
+ else {
46
+ logger.error(`Unexpected error loading secret ${secretId}: ${error}`);
47
+ }
48
+ }
49
+ }
50
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@looopy-ai/aws",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "AWS storage and providers for Looopy AI",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -38,6 +38,7 @@
38
38
  "dependencies": {
39
39
  "@aws-sdk/client-bedrock-agentcore": "^3.932.0",
40
40
  "@aws-sdk/client-dynamodb": "^3.932.0",
41
+ "@aws-sdk/client-secrets-manager": "^3.932.0",
41
42
  "@aws-sdk/lib-dynamodb": "^3.932.0",
42
43
  "@hono/node-server": "^1.19.6",
43
44
  "@opentelemetry/exporter-metrics-otlp-http": "^0.207.0",
@@ -51,7 +52,7 @@
51
52
  "@smithy/types": "^4.9.0",
52
53
  "hono": "^4.10.5",
53
54
  "pino-http": "^11.0.0",
54
- "@looopy-ai/core": "1.0.1"
55
+ "@looopy-ai/core": "1.0.2"
55
56
  },
56
57
  "publishConfig": {
57
58
  "access": "public"