@ts-cloud/core 0.2.3 → 0.2.4
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/dist/advanced-features.test.d.ts +1 -0
- package/dist/aws/cloudformation.d.ts +136 -0
- package/dist/aws/cloudfront.d.ts +45 -0
- package/dist/aws/credentials.d.ts +77 -0
- package/dist/aws/credentials.test.d.ts +4 -0
- package/dist/aws/index.d.ts +10 -0
- package/dist/aws/s3.d.ts +256 -0
- package/dist/aws/s3.test.d.ts +4 -0
- package/dist/aws/signature.d.ts +142 -0
- package/dist/aws/signature.test.d.ts +4 -0
- package/dist/backup/disaster-recovery.d.ts +140 -0
- package/dist/backup/disaster-recovery.test.d.ts +1 -0
- package/dist/backup/index.d.ts +8 -0
- package/dist/backup/manager.d.ts +172 -0
- package/dist/backup/manager.test.d.ts +1 -0
- package/dist/cicd/circleci.d.ts +50 -0
- package/dist/cicd/github-actions.d.ts +62 -0
- package/dist/cicd/gitlab-ci.d.ts +50 -0
- package/dist/cicd/index.d.ts +7 -0
- package/dist/cli/history.d.ts +137 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/progress.d.ts +193 -0
- package/dist/cli/repl.d.ts +148 -0
- package/dist/cli/suggestions.d.ts +74 -0
- package/dist/cli/table.d.ts +73 -0
- package/dist/cli/table.test.d.ts +1 -0
- package/dist/cloudformation/builder.d.ts +93 -0
- package/dist/cloudformation/builder.test.d.ts +4 -0
- package/dist/cloudformation/builders/api-gateway.d.ts +30 -0
- package/dist/cloudformation/builders/cache.d.ts +35 -0
- package/dist/cloudformation/builders/cdn.d.ts +34 -0
- package/dist/cloudformation/builders/compute.d.ts +68 -0
- package/dist/cloudformation/builders/database.d.ts +61 -0
- package/dist/cloudformation/builders/functions.d.ts +32 -0
- package/dist/cloudformation/builders/messaging.d.ts +17 -0
- package/dist/cloudformation/builders/monitoring.d.ts +39 -0
- package/dist/cloudformation/builders/network.d.ts +14 -0
- package/dist/cloudformation/builders/queue.d.ts +16 -0
- package/dist/cloudformation/builders/security.d.ts +31 -0
- package/dist/cloudformation/builders/storage.d.ts +36 -0
- package/dist/cloudformation/index.d.ts +10 -0
- package/dist/cloudformation/types.d.ts +200 -0
- package/dist/compliance/aws-config.d.ts +175 -0
- package/dist/compliance/cloudtrail.d.ts +132 -0
- package/dist/compliance/compliance.test.d.ts +1 -0
- package/dist/compliance/guardduty.d.ts +176 -0
- package/dist/compliance/index.d.ts +12 -0
- package/dist/compliance/security-hub.d.ts +178 -0
- package/dist/containers/build-optimization.d.ts +155 -0
- package/dist/containers/containers.test.d.ts +1 -0
- package/dist/containers/image-scanning.d.ts +144 -0
- package/dist/containers/index.d.ts +8 -0
- package/dist/containers/registry.d.ts +129 -0
- package/dist/containers/service-mesh.d.ts +254 -0
- package/dist/database/database.test.d.ts +1 -0
- package/dist/database/index.d.ts +8 -0
- package/dist/database/migrations.d.ts +153 -0
- package/dist/database/performance.d.ts +219 -0
- package/dist/database/replicas.d.ts +218 -0
- package/dist/database/users.d.ts +165 -0
- package/dist/dependency-graph.d.ts +37 -0
- package/dist/deployment/ab-testing.d.ts +165 -0
- package/dist/deployment/blue-green.d.ts +140 -0
- package/dist/deployment/canary.d.ts +165 -0
- package/dist/deployment/deployment.test.d.ts +1 -0
- package/dist/deployment/index.d.ts +12 -0
- package/dist/deployment/progressive.d.ts +50 -0
- package/dist/dns/dns.test.d.ts +1 -0
- package/dist/dns/dnssec.d.ts +120 -0
- package/dist/dns/index.d.ts +7 -0
- package/dist/dns/resolver.d.ts +216 -0
- package/dist/dns/routing.d.ts +277 -0
- package/dist/email/advanced/analytics.d.ts +107 -0
- package/dist/email/advanced/index.d.ts +10 -0
- package/dist/email/advanced/rules.d.ts +131 -0
- package/dist/email/advanced/scheduling.d.ts +81 -0
- package/dist/email/advanced/search.d.ts +91 -0
- package/dist/email/advanced/shared-mailboxes.d.ts +109 -0
- package/dist/email/advanced/templates.d.ts +95 -0
- package/dist/email/advanced/threading.d.ts +65 -0
- package/dist/email/analytics.d.ts +189 -0
- package/dist/email/bounce-handling.d.ts +171 -0
- package/dist/email/email.test.d.ts +1 -0
- package/dist/email/handlers/__tests__/inbound.test.d.ts +1 -0
- package/dist/email/handlers/__tests__/outbound.test.d.ts +1 -0
- package/dist/email/handlers/converter.d.ts +11 -0
- package/dist/email/handlers/feedback.d.ts +11 -0
- package/dist/email/handlers/inbound.d.ts +13 -0
- package/dist/email/handlers/outbound.d.ts +13 -0
- package/dist/email/index.d.ts +10 -0
- package/dist/email/reputation.d.ts +133 -0
- package/dist/email/templates.d.ts +124 -0
- package/dist/errors/index.d.ts +177 -0
- package/dist/errors/index.test.d.ts +4 -0
- package/dist/health-checks/index.d.ts +35 -0
- package/dist/index.d.ts +15 -256
- package/dist/index.js +228 -80
- package/dist/intrinsic-functions.d.ts +77 -0
- package/dist/lambda/concurrency.d.ts +146 -0
- package/dist/lambda/destinations.d.ts +141 -0
- package/dist/lambda/dlq.d.ts +160 -0
- package/dist/lambda/index.d.ts +10 -0
- package/dist/lambda/lambda.test.d.ts +1 -0
- package/dist/lambda/layers.d.ts +117 -0
- package/dist/lambda/versions.d.ts +145 -0
- package/dist/lambda/vpc.d.ts +164 -0
- package/dist/local/config.d.ts +44 -0
- package/dist/local/index.d.ts +5 -0
- package/dist/local/mock-aws.d.ts +69 -0
- package/dist/modules/ai.d.ts +108 -0
- package/dist/modules/api.d.ts +157 -0
- package/dist/modules/auth.d.ts +262 -0
- package/dist/modules/cache.d.ts +108 -0
- package/dist/modules/cdn.d.ts +305 -0
- package/dist/modules/communication.d.ts +117 -0
- package/dist/modules/compute.d.ts +1376 -0
- package/dist/modules/database.d.ts +144 -0
- package/dist/modules/deployment.d.ts +372 -0
- package/dist/modules/dns.d.ts +143 -0
- package/dist/modules/email.d.ts +314 -0
- package/dist/modules/filesystem.d.ts +132 -0
- package/dist/modules/index.d.ts +31 -0
- package/dist/modules/messaging.d.ts +210 -0
- package/dist/modules/monitoring.d.ts +574 -0
- package/dist/modules/network.d.ts +148 -0
- package/dist/modules/parameter-store.d.ts +143 -0
- package/dist/modules/permissions.d.ts +245 -0
- package/dist/modules/phone.d.ts +125 -0
- package/dist/modules/queue.d.ts +411 -0
- package/dist/modules/redirects.d.ts +140 -0
- package/dist/modules/registry.d.ts +189 -0
- package/dist/modules/search.d.ts +135 -0
- package/dist/modules/secrets.d.ts +149 -0
- package/dist/modules/security.d.ts +219 -0
- package/dist/modules/sms.d.ts +130 -0
- package/dist/modules/storage.d.ts +344 -0
- package/dist/modules/workflow.d.ts +288 -0
- package/dist/multi-account/config.d.ts +166 -0
- package/dist/multi-account/index.d.ts +6 -0
- package/dist/multi-account/manager.d.ts +181 -0
- package/dist/multi-region/cross-region.d.ts +204 -0
- package/dist/multi-region/index.d.ts +7 -0
- package/dist/multi-region/manager.d.ts +136 -0
- package/dist/multi-region/regions.d.ts +98 -0
- package/dist/network-security/index.d.ts +55 -0
- package/dist/observability/index.d.ts +8 -0
- package/dist/observability/logs.d.ts +213 -0
- package/dist/observability/metrics.d.ts +187 -0
- package/dist/observability/observability.test.d.ts +1 -0
- package/dist/observability/synthetics.d.ts +189 -0
- package/dist/observability/xray.d.ts +193 -0
- package/dist/phone/advanced/analytics.d.ts +83 -0
- package/dist/phone/advanced/callbacks.d.ts +67 -0
- package/dist/phone/advanced/index.d.ts +7 -0
- package/dist/phone/advanced/ivr-builder.d.ts +130 -0
- package/dist/phone/advanced/recording.d.ts +62 -0
- package/dist/phone/handlers/__tests__/incoming-call.test.d.ts +1 -0
- package/dist/phone/handlers/incoming-call.d.ts +10 -0
- package/dist/phone/handlers/missed-call.d.ts +9 -0
- package/dist/phone/handlers/voicemail.d.ts +10 -0
- package/dist/phone/index.d.ts +5 -0
- package/dist/presets/api-backend.d.ts +11 -0
- package/dist/presets/data-pipeline.d.ts +11 -0
- package/dist/presets/extend.d.ts +194 -0
- package/dist/presets/extend.test.d.ts +4 -0
- package/dist/presets/fullstack-app.d.ts +12 -0
- package/dist/presets/index.d.ts +13 -0
- package/dist/presets/jamstack.d.ts +12 -0
- package/dist/presets/microservices.d.ts +18 -0
- package/dist/presets/ml-api.d.ts +13 -0
- package/dist/presets/nodejs-server.d.ts +14 -0
- package/dist/presets/nodejs-serverless.d.ts +14 -0
- package/dist/presets/realtime-app.d.ts +11 -0
- package/dist/presets/static-site.d.ts +12 -0
- package/dist/presets/traditional-web-app.d.ts +16 -0
- package/dist/presets/wordpress.d.ts +12 -0
- package/dist/preview/github.d.ts +32 -0
- package/dist/preview/github.test.d.ts +1 -0
- package/dist/preview/index.d.ts +10 -0
- package/dist/preview/manager.d.ts +101 -0
- package/dist/preview/manager.test.d.ts +1 -0
- package/dist/preview/notifications.d.ts +89 -0
- package/dist/preview/notifications.test.d.ts +1 -0
- package/dist/queue/batch-processing.d.ts +138 -0
- package/dist/queue/dlq-monitoring.d.ts +143 -0
- package/dist/queue/fifo.d.ts +131 -0
- package/dist/queue/index.d.ts +8 -0
- package/dist/queue/management.d.ts +162 -0
- package/dist/queue/queue.test.d.ts +1 -0
- package/dist/resource-mgmt/index.d.ts +44 -0
- package/dist/resource-naming.d.ts +26 -0
- package/dist/s3/index.d.ts +227 -0
- package/dist/schema/index.d.ts +12 -0
- package/dist/security/certificate-manager.d.ts +184 -0
- package/dist/security/index.d.ts +8 -0
- package/dist/security/scanning.d.ts +196 -0
- package/dist/security/secrets-manager.d.ts +204 -0
- package/dist/security/secrets-rotation.d.ts +167 -0
- package/dist/security/security.test.d.ts +1 -0
- package/dist/sms/advanced/ab-testing.d.ts +74 -0
- package/dist/sms/advanced/analytics.d.ts +75 -0
- package/dist/sms/advanced/campaigns.d.ts +96 -0
- package/dist/sms/advanced/chatbot.d.ts +67 -0
- package/dist/sms/advanced/index.d.ts +9 -0
- package/dist/sms/advanced/link-tracking.d.ts +60 -0
- package/dist/sms/advanced/mms.d.ts +60 -0
- package/dist/sms/handlers/__tests__/send.test.d.ts +1 -0
- package/dist/sms/handlers/delivery-status.d.ts +10 -0
- package/dist/sms/handlers/receive.d.ts +10 -0
- package/dist/sms/handlers/send.d.ts +10 -0
- package/dist/sms/index.d.ts +5 -0
- package/dist/stack-diff.d.ts +38 -0
- package/dist/static-site/index.d.ts +49 -0
- package/dist/template-builder.d.ts +42 -0
- package/dist/template-validator.d.ts +28 -0
- package/dist/types.d.ts +2514 -0
- package/dist/utils/cache.d.ts +117 -0
- package/dist/utils/diff.d.ts +52 -0
- package/dist/utils/hash.d.ts +73 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/parallel.d.ts +78 -0
- package/dist/validators/credentials.d.ts +30 -0
- package/dist/validators/credentials.test.d.ts +4 -0
- package/dist/validators/quotas.d.ts +64 -0
- package/dist/validators/quotas.test.d.ts +4 -0
- package/package.json +2 -2
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS X-Ray Integration
|
|
3
|
+
* Distributed tracing for microservices and serverless applications
|
|
4
|
+
*/
|
|
5
|
+
export interface XRayConfig {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
serviceName: string;
|
|
9
|
+
samplingRate: number;
|
|
10
|
+
enableActiveTracing: boolean;
|
|
11
|
+
segmentDocuments?: SegmentDocument[];
|
|
12
|
+
}
|
|
13
|
+
export interface SegmentDocument {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
startTime: number;
|
|
17
|
+
endTime?: number;
|
|
18
|
+
subsegments?: SubSegment[];
|
|
19
|
+
annotations?: Record<string, string | number | boolean>;
|
|
20
|
+
metadata?: Record<string, any>;
|
|
21
|
+
http?: HttpData;
|
|
22
|
+
aws?: AWSData;
|
|
23
|
+
error?: boolean;
|
|
24
|
+
fault?: boolean;
|
|
25
|
+
throttle?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface SubSegment {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
startTime: number;
|
|
31
|
+
endTime?: number;
|
|
32
|
+
namespace?: 'aws' | 'remote';
|
|
33
|
+
http?: HttpData;
|
|
34
|
+
sql?: SqlData;
|
|
35
|
+
annotations?: Record<string, string | number | boolean>;
|
|
36
|
+
metadata?: Record<string, any>;
|
|
37
|
+
}
|
|
38
|
+
export interface HttpData {
|
|
39
|
+
request?: {
|
|
40
|
+
method?: string;
|
|
41
|
+
url?: string;
|
|
42
|
+
userAgent?: string;
|
|
43
|
+
clientIp?: string;
|
|
44
|
+
};
|
|
45
|
+
response?: {
|
|
46
|
+
status?: number;
|
|
47
|
+
contentLength?: number;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export interface AWSData {
|
|
51
|
+
accountId?: string;
|
|
52
|
+
operation?: string;
|
|
53
|
+
region?: string;
|
|
54
|
+
requestId?: string;
|
|
55
|
+
queueUrl?: string;
|
|
56
|
+
tableName?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface SqlData {
|
|
59
|
+
url?: string;
|
|
60
|
+
preparation?: 'statement' | 'call';
|
|
61
|
+
databaseType?: string;
|
|
62
|
+
databaseVersion?: string;
|
|
63
|
+
driverVersion?: string;
|
|
64
|
+
user?: string;
|
|
65
|
+
sanitizedQuery?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface SamplingRule {
|
|
68
|
+
id: string;
|
|
69
|
+
ruleName: string;
|
|
70
|
+
priority: number;
|
|
71
|
+
fixedRate: number;
|
|
72
|
+
reservoirSize: number;
|
|
73
|
+
serviceName: string;
|
|
74
|
+
serviceType: string;
|
|
75
|
+
host: string;
|
|
76
|
+
httpMethod: string;
|
|
77
|
+
urlPath: string;
|
|
78
|
+
version: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* X-Ray manager
|
|
82
|
+
*/
|
|
83
|
+
export declare class XRayManager {
|
|
84
|
+
private configs;
|
|
85
|
+
private samplingRules;
|
|
86
|
+
private configCounter;
|
|
87
|
+
private ruleCounter;
|
|
88
|
+
/**
|
|
89
|
+
* Create X-Ray configuration
|
|
90
|
+
*/
|
|
91
|
+
createConfig(config: Omit<XRayConfig, 'id'>): XRayConfig;
|
|
92
|
+
/**
|
|
93
|
+
* Create Lambda X-Ray configuration
|
|
94
|
+
*/
|
|
95
|
+
createLambdaConfig(options: {
|
|
96
|
+
functionName: string;
|
|
97
|
+
samplingRate?: number;
|
|
98
|
+
}): XRayConfig;
|
|
99
|
+
/**
|
|
100
|
+
* Create ECS X-Ray configuration
|
|
101
|
+
*/
|
|
102
|
+
createECSConfig(options: {
|
|
103
|
+
serviceName: string;
|
|
104
|
+
clusterName: string;
|
|
105
|
+
samplingRate?: number;
|
|
106
|
+
}): XRayConfig;
|
|
107
|
+
/**
|
|
108
|
+
* Create API Gateway X-Ray configuration
|
|
109
|
+
*/
|
|
110
|
+
createAPIGatewayConfig(options: {
|
|
111
|
+
apiName: string;
|
|
112
|
+
stage: string;
|
|
113
|
+
samplingRate?: number;
|
|
114
|
+
}): XRayConfig;
|
|
115
|
+
/**
|
|
116
|
+
* Create sampling rule
|
|
117
|
+
*/
|
|
118
|
+
createSamplingRule(rule: Omit<SamplingRule, 'id'>): SamplingRule;
|
|
119
|
+
/**
|
|
120
|
+
* Create high-priority sampling rule (always trace)
|
|
121
|
+
*/
|
|
122
|
+
createHighPrioritySamplingRule(options: {
|
|
123
|
+
ruleName: string;
|
|
124
|
+
serviceName: string;
|
|
125
|
+
urlPath: string;
|
|
126
|
+
}): SamplingRule;
|
|
127
|
+
/**
|
|
128
|
+
* Create error sampling rule (trace all errors)
|
|
129
|
+
*/
|
|
130
|
+
createErrorSamplingRule(serviceName: string): SamplingRule;
|
|
131
|
+
/**
|
|
132
|
+
* Create default sampling rule
|
|
133
|
+
*/
|
|
134
|
+
createDefaultSamplingRule(serviceName: string, samplingRate?: number): SamplingRule;
|
|
135
|
+
/**
|
|
136
|
+
* Get config
|
|
137
|
+
*/
|
|
138
|
+
getConfig(id: string): XRayConfig | undefined;
|
|
139
|
+
/**
|
|
140
|
+
* List configs
|
|
141
|
+
*/
|
|
142
|
+
listConfigs(): XRayConfig[];
|
|
143
|
+
/**
|
|
144
|
+
* Get sampling rule
|
|
145
|
+
*/
|
|
146
|
+
getSamplingRule(id: string): SamplingRule | undefined;
|
|
147
|
+
/**
|
|
148
|
+
* List sampling rules
|
|
149
|
+
*/
|
|
150
|
+
listSamplingRules(): SamplingRule[];
|
|
151
|
+
/**
|
|
152
|
+
* Generate CloudFormation for Lambda X-Ray
|
|
153
|
+
*/
|
|
154
|
+
generateLambdaXRayCF(config: XRayConfig): any;
|
|
155
|
+
/**
|
|
156
|
+
* Generate CloudFormation for API Gateway X-Ray
|
|
157
|
+
*/
|
|
158
|
+
generateAPIGatewayXRayCF(config: XRayConfig): any;
|
|
159
|
+
/**
|
|
160
|
+
* Generate ECS task definition with X-Ray sidecar
|
|
161
|
+
*/
|
|
162
|
+
generateECSXRaySidecarCF(): any;
|
|
163
|
+
/**
|
|
164
|
+
* Generate sampling rules CloudFormation
|
|
165
|
+
*/
|
|
166
|
+
generateSamplingRuleCF(rule: SamplingRule): any;
|
|
167
|
+
/**
|
|
168
|
+
* Create a distributed trace
|
|
169
|
+
*/
|
|
170
|
+
createTrace(traceId: string, spans: Array<{
|
|
171
|
+
spanId: string;
|
|
172
|
+
name: string;
|
|
173
|
+
duration: number;
|
|
174
|
+
tags: Record<string, any>;
|
|
175
|
+
}>): {
|
|
176
|
+
id: string;
|
|
177
|
+
traceId: string;
|
|
178
|
+
spans: Array<{
|
|
179
|
+
spanId: string;
|
|
180
|
+
name: string;
|
|
181
|
+
duration: number;
|
|
182
|
+
tags: Record<string, any>;
|
|
183
|
+
}>;
|
|
184
|
+
};
|
|
185
|
+
/**
|
|
186
|
+
* Clear all data
|
|
187
|
+
*/
|
|
188
|
+
clear(): void;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Global X-Ray manager instance
|
|
192
|
+
*/
|
|
193
|
+
export declare const xrayManager: XRayManager;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Analytics and Reporting
|
|
3
|
+
*
|
|
4
|
+
* Provides call metrics, reporting, and insights
|
|
5
|
+
*/
|
|
6
|
+
export interface CallMetrics {
|
|
7
|
+
period: string;
|
|
8
|
+
totalCalls: number;
|
|
9
|
+
answeredCalls: number;
|
|
10
|
+
missedCalls: number;
|
|
11
|
+
abandonedCalls: number;
|
|
12
|
+
voicemails: number;
|
|
13
|
+
averageWaitTime: number;
|
|
14
|
+
averageHandleTime: number;
|
|
15
|
+
averageTalkTime: number;
|
|
16
|
+
serviceLevel: number;
|
|
17
|
+
abandonRate: number;
|
|
18
|
+
answerRate: number;
|
|
19
|
+
}
|
|
20
|
+
export interface AgentMetrics {
|
|
21
|
+
agentId: string;
|
|
22
|
+
agentName: string;
|
|
23
|
+
callsHandled: number;
|
|
24
|
+
averageHandleTime: number;
|
|
25
|
+
averageTalkTime: number;
|
|
26
|
+
averageHoldTime: number;
|
|
27
|
+
occupancy: number;
|
|
28
|
+
availability: number;
|
|
29
|
+
}
|
|
30
|
+
export interface QueueMetrics {
|
|
31
|
+
queueId: string;
|
|
32
|
+
queueName: string;
|
|
33
|
+
callsInQueue: number;
|
|
34
|
+
oldestCallWaitTime: number;
|
|
35
|
+
averageWaitTime: number;
|
|
36
|
+
agentsAvailable: number;
|
|
37
|
+
agentsOnCall: number;
|
|
38
|
+
}
|
|
39
|
+
export interface CallInsight {
|
|
40
|
+
callId: string;
|
|
41
|
+
sentiment: 'positive' | 'neutral' | 'negative';
|
|
42
|
+
topics: string[];
|
|
43
|
+
keywords: string[];
|
|
44
|
+
issues: string[];
|
|
45
|
+
resolution: boolean;
|
|
46
|
+
customerSatisfaction?: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Call Analytics Module
|
|
50
|
+
*/
|
|
51
|
+
export declare class CallAnalytics {
|
|
52
|
+
/**
|
|
53
|
+
* Lambda code for aggregating call metrics
|
|
54
|
+
*/
|
|
55
|
+
static MetricsAggregatorCode: string;
|
|
56
|
+
/**
|
|
57
|
+
* Lambda code for real-time queue metrics
|
|
58
|
+
*/
|
|
59
|
+
static QueueMetricsCode: string;
|
|
60
|
+
/**
|
|
61
|
+
* Create metrics DynamoDB table
|
|
62
|
+
*/
|
|
63
|
+
static createMetricsTable(config: {
|
|
64
|
+
slug: string;
|
|
65
|
+
}): Record<string, any>;
|
|
66
|
+
/**
|
|
67
|
+
* Create metrics aggregator Lambda
|
|
68
|
+
*/
|
|
69
|
+
static createMetricsAggregatorLambda(config: {
|
|
70
|
+
slug: string;
|
|
71
|
+
roleArn: string;
|
|
72
|
+
callLogTable: string;
|
|
73
|
+
metricsTable: string;
|
|
74
|
+
}): Record<string, any>;
|
|
75
|
+
/**
|
|
76
|
+
* Create EventBridge rule for hourly metrics
|
|
77
|
+
*/
|
|
78
|
+
static createMetricsSchedule(config: {
|
|
79
|
+
slug: string;
|
|
80
|
+
lambdaArn: string;
|
|
81
|
+
}): Record<string, any>;
|
|
82
|
+
}
|
|
83
|
+
export default CallAnalytics;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Callback Requests and Queue Management
|
|
3
|
+
*
|
|
4
|
+
* Provides callback scheduling and queue management
|
|
5
|
+
*/
|
|
6
|
+
export interface CallbackRequest {
|
|
7
|
+
id: string;
|
|
8
|
+
phoneNumber: string;
|
|
9
|
+
customerName?: string;
|
|
10
|
+
reason?: string;
|
|
11
|
+
preferredTime?: string;
|
|
12
|
+
queueId?: string;
|
|
13
|
+
priority: number;
|
|
14
|
+
status: 'pending' | 'scheduled' | 'in-progress' | 'completed' | 'failed' | 'cancelled';
|
|
15
|
+
attempts: number;
|
|
16
|
+
maxAttempts: number;
|
|
17
|
+
createdAt: string;
|
|
18
|
+
scheduledFor?: string;
|
|
19
|
+
completedAt?: string;
|
|
20
|
+
notes?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface QueuePosition {
|
|
23
|
+
position: number;
|
|
24
|
+
estimatedWaitTime: number;
|
|
25
|
+
callersAhead: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Callback Module
|
|
29
|
+
*/
|
|
30
|
+
export declare class Callbacks {
|
|
31
|
+
/**
|
|
32
|
+
* Lambda code for callback request handling
|
|
33
|
+
*/
|
|
34
|
+
static CallbackRequestCode: string;
|
|
35
|
+
/**
|
|
36
|
+
* Lambda code for processing callbacks
|
|
37
|
+
*/
|
|
38
|
+
static CallbackProcessorCode: string;
|
|
39
|
+
/**
|
|
40
|
+
* Create callbacks DynamoDB table
|
|
41
|
+
*/
|
|
42
|
+
static createCallbacksTable(config: {
|
|
43
|
+
slug: string;
|
|
44
|
+
}): Record<string, any>;
|
|
45
|
+
/**
|
|
46
|
+
* Create callback request Lambda
|
|
47
|
+
*/
|
|
48
|
+
static createCallbackRequestLambda(config: {
|
|
49
|
+
slug: string;
|
|
50
|
+
roleArn: string;
|
|
51
|
+
callbacksTable: string;
|
|
52
|
+
notificationTopicArn?: string;
|
|
53
|
+
}): Record<string, any>;
|
|
54
|
+
/**
|
|
55
|
+
* Create callback processor Lambda
|
|
56
|
+
*/
|
|
57
|
+
static createCallbackProcessorLambda(config: {
|
|
58
|
+
slug: string;
|
|
59
|
+
roleArn: string;
|
|
60
|
+
callbacksTable: string;
|
|
61
|
+
connectInstanceId: string;
|
|
62
|
+
contactFlowId: string;
|
|
63
|
+
sourcePhoneNumber: string;
|
|
64
|
+
queueId?: string;
|
|
65
|
+
}): Record<string, any>;
|
|
66
|
+
}
|
|
67
|
+
export default Callbacks;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IVR Builder (Visual Contact Flow Editor)
|
|
3
|
+
*
|
|
4
|
+
* Provides a programmatic way to build Amazon Connect contact flows
|
|
5
|
+
*/
|
|
6
|
+
export interface IVRFlow {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
nodes: IVRNode[];
|
|
11
|
+
connections: IVRConnection[];
|
|
12
|
+
startNodeId: string;
|
|
13
|
+
version: number;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
updatedAt: string;
|
|
16
|
+
}
|
|
17
|
+
export interface IVRNode {
|
|
18
|
+
id: string;
|
|
19
|
+
type: IVRNodeType;
|
|
20
|
+
position: {
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
};
|
|
24
|
+
config: Record<string, any>;
|
|
25
|
+
label?: string;
|
|
26
|
+
}
|
|
27
|
+
export type IVRNodeType = 'start' | 'play-prompt' | 'get-input' | 'menu' | 'transfer-queue' | 'transfer-agent' | 'transfer-phone' | 'invoke-lambda' | 'set-attribute' | 'check-attribute' | 'check-hours' | 'check-queue' | 'record-voicemail' | 'disconnect' | 'loop' | 'wait';
|
|
28
|
+
export interface IVRConnection {
|
|
29
|
+
id: string;
|
|
30
|
+
sourceNodeId: string;
|
|
31
|
+
targetNodeId: string;
|
|
32
|
+
sourcePort: string;
|
|
33
|
+
label?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* IVR Builder Module
|
|
37
|
+
*/
|
|
38
|
+
export declare class IVRBuilder {
|
|
39
|
+
private nodes;
|
|
40
|
+
private connections;
|
|
41
|
+
private startNodeId;
|
|
42
|
+
/**
|
|
43
|
+
* Create a new IVR flow
|
|
44
|
+
*/
|
|
45
|
+
static create(name: string): IVRBuilder;
|
|
46
|
+
/**
|
|
47
|
+
* Add a start node
|
|
48
|
+
*/
|
|
49
|
+
start(): this;
|
|
50
|
+
/**
|
|
51
|
+
* Add a play prompt node
|
|
52
|
+
*/
|
|
53
|
+
playPrompt(text: string, options?: {
|
|
54
|
+
ssml?: boolean;
|
|
55
|
+
voice?: string;
|
|
56
|
+
}): this;
|
|
57
|
+
/**
|
|
58
|
+
* Add a get input node (DTMF)
|
|
59
|
+
*/
|
|
60
|
+
getInput(prompt: string, options?: {
|
|
61
|
+
maxDigits?: number;
|
|
62
|
+
timeout?: number;
|
|
63
|
+
errorPrompt?: string;
|
|
64
|
+
}): this;
|
|
65
|
+
/**
|
|
66
|
+
* Add a menu node
|
|
67
|
+
*/
|
|
68
|
+
menu(prompt: string, options: Record<string, string>): this;
|
|
69
|
+
/**
|
|
70
|
+
* Add a transfer to queue node
|
|
71
|
+
*/
|
|
72
|
+
transferToQueue(queueArn: string, options?: {
|
|
73
|
+
priority?: number;
|
|
74
|
+
}): this;
|
|
75
|
+
/**
|
|
76
|
+
* Add a transfer to phone number node
|
|
77
|
+
*/
|
|
78
|
+
transferToPhone(phoneNumber: string): this;
|
|
79
|
+
/**
|
|
80
|
+
* Add a Lambda invocation node
|
|
81
|
+
*/
|
|
82
|
+
invokeLambda(functionArn: string, options?: {
|
|
83
|
+
timeout?: number;
|
|
84
|
+
}): this;
|
|
85
|
+
/**
|
|
86
|
+
* Add a set attribute node
|
|
87
|
+
*/
|
|
88
|
+
setAttribute(key: string, value: string): this;
|
|
89
|
+
/**
|
|
90
|
+
* Add a check hours node
|
|
91
|
+
*/
|
|
92
|
+
checkHours(hoursOfOperationArn: string): this;
|
|
93
|
+
/**
|
|
94
|
+
* Add a record voicemail node
|
|
95
|
+
*/
|
|
96
|
+
recordVoicemail(options?: {
|
|
97
|
+
maxDuration?: number;
|
|
98
|
+
greeting?: string;
|
|
99
|
+
beep?: boolean;
|
|
100
|
+
}): this;
|
|
101
|
+
/**
|
|
102
|
+
* Add a wait node
|
|
103
|
+
*/
|
|
104
|
+
wait(seconds: number): this;
|
|
105
|
+
/**
|
|
106
|
+
* Add a disconnect node
|
|
107
|
+
*/
|
|
108
|
+
disconnect(): this;
|
|
109
|
+
/**
|
|
110
|
+
* Build the IVR flow
|
|
111
|
+
*/
|
|
112
|
+
build(): IVRFlow;
|
|
113
|
+
/**
|
|
114
|
+
* Convert to Amazon Connect contact flow format
|
|
115
|
+
*/
|
|
116
|
+
toContactFlow(): string;
|
|
117
|
+
private nodeToAction;
|
|
118
|
+
private connectToLast;
|
|
119
|
+
private getNextNodeId;
|
|
120
|
+
private generateId;
|
|
121
|
+
/**
|
|
122
|
+
* Pre-built IVR templates
|
|
123
|
+
*/
|
|
124
|
+
static readonly Templates: {
|
|
125
|
+
basicSupport: () => IVRBuilder;
|
|
126
|
+
afterHours: (greeting: string) => IVRBuilder;
|
|
127
|
+
callbackRequest: (lambdaArn: string) => IVRBuilder;
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
export default IVRBuilder;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Recording with Transcription
|
|
3
|
+
*
|
|
4
|
+
* Provides call recording storage and transcription
|
|
5
|
+
*/
|
|
6
|
+
export interface CallRecording {
|
|
7
|
+
recordingId: string;
|
|
8
|
+
contactId: string;
|
|
9
|
+
startTime: string;
|
|
10
|
+
endTime: string;
|
|
11
|
+
duration: number;
|
|
12
|
+
participants: string[];
|
|
13
|
+
recordingUrl: string;
|
|
14
|
+
transcription?: CallTranscription;
|
|
15
|
+
status: 'recording' | 'processing' | 'completed' | 'failed';
|
|
16
|
+
createdAt: string;
|
|
17
|
+
}
|
|
18
|
+
export interface CallTranscription {
|
|
19
|
+
transcriptId: string;
|
|
20
|
+
text: string;
|
|
21
|
+
segments: TranscriptionSegment[];
|
|
22
|
+
language: string;
|
|
23
|
+
confidence: number;
|
|
24
|
+
status: 'pending' | 'processing' | 'completed' | 'failed';
|
|
25
|
+
}
|
|
26
|
+
export interface TranscriptionSegment {
|
|
27
|
+
speaker: string;
|
|
28
|
+
startTime: number;
|
|
29
|
+
endTime: number;
|
|
30
|
+
text: string;
|
|
31
|
+
confidence: number;
|
|
32
|
+
sentiment?: 'positive' | 'neutral' | 'negative';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Call Recording Module
|
|
36
|
+
*/
|
|
37
|
+
export declare class CallRecording {
|
|
38
|
+
/**
|
|
39
|
+
* Lambda code for processing call recordings
|
|
40
|
+
*/
|
|
41
|
+
static RecordingProcessorCode: string;
|
|
42
|
+
/**
|
|
43
|
+
* Lambda code for transcription completion
|
|
44
|
+
*/
|
|
45
|
+
static TranscriptionCompleteCode: string;
|
|
46
|
+
/**
|
|
47
|
+
* Create recordings DynamoDB table
|
|
48
|
+
*/
|
|
49
|
+
static createRecordingsTable(config: {
|
|
50
|
+
slug: string;
|
|
51
|
+
}): Record<string, any>;
|
|
52
|
+
/**
|
|
53
|
+
* Create recording processor Lambda
|
|
54
|
+
*/
|
|
55
|
+
static createRecordingProcessorLambda(config: {
|
|
56
|
+
slug: string;
|
|
57
|
+
roleArn: string;
|
|
58
|
+
recordingBucket: string;
|
|
59
|
+
recordingsTable: string;
|
|
60
|
+
}): Record<string, any>;
|
|
61
|
+
}
|
|
62
|
+
export default CallRecording;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incoming Call Lambda Handler
|
|
3
|
+
*
|
|
4
|
+
* Processes incoming calls from Amazon Connect:
|
|
5
|
+
* - Logs call details
|
|
6
|
+
* - Sends notifications (SNS, webhook)
|
|
7
|
+
* - Routes based on caller ID
|
|
8
|
+
*/
|
|
9
|
+
export declare const handler = "\nconst { SNSClient, PublishCommand } = require('@aws-sdk/client-sns');\nconst { DynamoDBClient, PutItemCommand } = require('@aws-sdk/client-dynamodb');\n\nconst sns = new SNSClient({});\nconst dynamodb = new DynamoDBClient({});\n\nexports.handler = async (event) => {\n console.log('Incoming call event:', JSON.stringify(event, null, 2));\n\n const notificationTopicArn = process.env.NOTIFICATION_TOPIC_ARN;\n const callLogTable = process.env.CALL_LOG_TABLE;\n const webhookUrl = process.env.WEBHOOK_URL;\n\n try {\n // Extract call details from Connect event\n const contactData = event.Details?.ContactData || {};\n const parameters = event.Details?.Parameters || {};\n\n const callDetails = {\n contactId: contactData.ContactId,\n channel: contactData.Channel || 'VOICE',\n initiationMethod: contactData.InitiationMethod,\n customerEndpoint: contactData.CustomerEndpoint?.Address,\n systemEndpoint: contactData.SystemEndpoint?.Address,\n queue: contactData.Queue?.Name,\n attributes: contactData.Attributes || {},\n timestamp: new Date().toISOString(),\n };\n\n console.log('Call details:', callDetails);\n\n // Log call to DynamoDB\n if (callLogTable) {\n await dynamodb.send(new PutItemCommand({\n TableName: callLogTable,\n Item: {\n contactId: { S: callDetails.contactId },\n timestamp: { S: callDetails.timestamp },\n callerNumber: { S: callDetails.customerEndpoint || 'unknown' },\n calledNumber: { S: callDetails.systemEndpoint || 'unknown' },\n channel: { S: callDetails.channel },\n initiationMethod: { S: callDetails.initiationMethod || 'unknown' },\n status: { S: 'incoming' },\n ttl: { N: String(Math.floor(Date.now() / 1000) + 90 * 24 * 60 * 60) }, // 90 days\n },\n }));\n }\n\n // Send SNS notification\n if (notificationTopicArn) {\n await sns.send(new PublishCommand({\n TopicArn: notificationTopicArn,\n Subject: 'Incoming Call',\n Message: JSON.stringify({\n type: 'incoming_call',\n from: callDetails.customerEndpoint,\n to: callDetails.systemEndpoint,\n contactId: callDetails.contactId,\n timestamp: callDetails.timestamp,\n }, null, 2),\n MessageAttributes: {\n eventType: {\n DataType: 'String',\n StringValue: 'incoming_call',\n },\n },\n }));\n }\n\n // Send webhook notification\n if (webhookUrl) {\n try {\n await fetch(webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n event: 'incoming_call',\n data: callDetails,\n }),\n });\n }\ncatch (err) {\n console.error('Webhook notification failed:', err.message);\n }\n }\n\n // Return routing decision\n // Can be customized based on caller ID, time of day, etc.\n return {\n statusCode: 200,\n route: parameters.defaultRoute || 'main_queue',\n callerInfo: {\n number: callDetails.customerEndpoint,\n isKnown: false, // Could lookup in CRM\n },\n };\n\n }\ncatch (error) {\n console.error('Error processing incoming call:', error);\n return {\n statusCode: 500,\n error: error.message,\n };\n }\n};\n";
|
|
10
|
+
export default handler;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Missed Call Lambda Handler
|
|
3
|
+
*
|
|
4
|
+
* Processes missed call events:
|
|
5
|
+
* - Logs missed call
|
|
6
|
+
* - Sends notification
|
|
7
|
+
*/
|
|
8
|
+
export declare const handler = "\nconst { SNSClient, PublishCommand } = require('@aws-sdk/client-sns');\nconst { DynamoDBClient, UpdateItemCommand } = require('@aws-sdk/client-dynamodb');\n\nconst sns = new SNSClient({});\nconst dynamodb = new DynamoDBClient({});\n\nexports.handler = async (event) => {\n console.log('Missed call event:', JSON.stringify(event, null, 2));\n\n const notificationTopicArn = process.env.NOTIFICATION_TOPIC_ARN;\n const callLogTable = process.env.CALL_LOG_TABLE;\n const webhookUrl = process.env.WEBHOOK_URL;\n\n try {\n // Extract call details from Connect event\n const contactData = event.Details?.ContactData || {};\n\n const callDetails = {\n contactId: contactData.ContactId,\n customerEndpoint: contactData.CustomerEndpoint?.Address,\n systemEndpoint: contactData.SystemEndpoint?.Address,\n queue: contactData.Queue?.Name,\n waitTime: contactData.Queue?.EnqueueTimestamp\n ? Math.floor((Date.now() - new Date(contactData.Queue.EnqueueTimestamp).getTime()) / 1000)\n : 0,\n disconnectReason: event.Details?.Parameters?.disconnectReason || 'customer_abandoned',\n timestamp: new Date().toISOString(),\n };\n\n console.log('Missed call details:', callDetails);\n\n // Update call log\n if (callLogTable && callDetails.contactId) {\n await dynamodb.send(new UpdateItemCommand({\n TableName: callLogTable,\n Key: {\n contactId: { S: callDetails.contactId },\n },\n UpdateExpression: 'SET #status = :status, disconnectReason = :reason, waitTime = :wait, missedAt = :at',\n ExpressionAttributeNames: {\n '#status': 'status',\n },\n ExpressionAttributeValues: {\n ':status': { S: 'missed' },\n ':reason': { S: callDetails.disconnectReason },\n ':wait': { N: String(callDetails.waitTime) },\n ':at': { S: callDetails.timestamp },\n },\n }));\n }\n\n // Send SNS notification\n if (notificationTopicArn) {\n await sns.send(new PublishCommand({\n TopicArn: notificationTopicArn,\n Subject: 'Missed Call Alert',\n Message: JSON.stringify({\n type: 'missed_call',\n from: callDetails.customerEndpoint,\n to: callDetails.systemEndpoint,\n queue: callDetails.queue,\n waitTime: callDetails.waitTime,\n reason: callDetails.disconnectReason,\n contactId: callDetails.contactId,\n timestamp: callDetails.timestamp,\n }, null, 2),\n MessageAttributes: {\n eventType: {\n DataType: 'String',\n StringValue: 'missed_call',\n },\n },\n }));\n }\n\n // Send webhook notification\n if (webhookUrl) {\n try {\n await fetch(webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n event: 'missed_call',\n data: callDetails,\n }),\n });\n }\ncatch (err) {\n console.error('Webhook notification failed:', err.message);\n }\n }\n\n return {\n statusCode: 200,\n message: 'Missed call logged',\n };\n\n }\ncatch (error) {\n console.error('Error processing missed call:', error);\n return {\n statusCode: 500,\n error: error.message,\n };\n }\n};\n";
|
|
9
|
+
export default handler;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voicemail Lambda Handler
|
|
3
|
+
*
|
|
4
|
+
* Processes voicemail recordings:
|
|
5
|
+
* - Processes voicemail recordings from S3
|
|
6
|
+
* - Transcribes using Amazon Transcribe
|
|
7
|
+
* - Sends notification with transcription
|
|
8
|
+
*/
|
|
9
|
+
export declare const handler = "\nconst { S3Client, GetObjectCommand, PutObjectCommand } = require('@aws-sdk/client-s3');\nconst { TranscribeClient, StartTranscriptionJobCommand, GetTranscriptionJobCommand } = require('@aws-sdk/client-transcribe');\nconst { SNSClient, PublishCommand } = require('@aws-sdk/client-sns');\nconst { DynamoDBClient, UpdateItemCommand } = require('@aws-sdk/client-dynamodb');\n\nconst s3 = new S3Client({});\nconst transcribe = new TranscribeClient({});\nconst sns = new SNSClient({});\nconst dynamodb = new DynamoDBClient({});\n\nexports.handler = async (event) => {\n console.log('Voicemail event:', JSON.stringify(event, null, 2));\n\n const notificationTopicArn = process.env.NOTIFICATION_TOPIC_ARN;\n const voicemailBucket = process.env.VOICEMAIL_BUCKET;\n const callLogTable = process.env.CALL_LOG_TABLE;\n const transcriptionEnabled = process.env.TRANSCRIPTION_ENABLED === 'true';\n\n for (const record of event.Records) {\n try {\n const s3Event = record.s3 || {};\n const bucket = s3Event.bucket?.name || voicemailBucket;\n const key = decodeURIComponent(s3Event.object?.key?.replace(/\\+/g, ' ') || '');\n\n if (!key.includes('voicemail') || !key.endsWith('.wav')) {\n continue;\n }\n\n console.log(`Processing voicemail: ${key}`);\n\n // Extract metadata from key (format: voicemails/{contactId}/{timestamp}.wav)\n const parts = key.split('/');\n const contactId = parts[1] || 'unknown';\n const filename = parts[parts.length - 1];\n const timestamp = filename.replace('.wav', '');\n\n // Get voicemail metadata if exists\n let metadata = {};\n try {\n const metaResult = await s3.send(new GetObjectCommand({\n Bucket: bucket,\n Key: key.replace('.wav', '.json'),\n }));\n metadata = JSON.parse(await metaResult.Body.transformToString());\n }\ncatch {\n // No metadata file\n }\n\n let transcription = null;\n\n // Start transcription if enabled\n if (transcriptionEnabled) {\n const jobName = `voicemail-${contactId}-${Date.now()}`;\n\n await transcribe.send(new StartTranscriptionJobCommand({\n TranscriptionJobName: jobName,\n LanguageCode: 'en-US',\n MediaFormat: 'wav',\n Media: {\n MediaFileUri: `s3://${bucket}/${key}`,\n },\n OutputBucketName: bucket,\n OutputKey: key.replace('.wav', '-transcript.json'),\n }));\n\n // Wait for transcription (with timeout)\n let attempts = 0;\n const maxAttempts = 30; // 5 minutes max\n\n while (attempts < maxAttempts) {\n await new Promise(resolve => setTimeout(resolve, 10000)); // 10 seconds\n\n const jobResult = await transcribe.send(new GetTranscriptionJobCommand({\n TranscriptionJobName: jobName,\n }));\n\n const status = jobResult.TranscriptionJob?.TranscriptionJobStatus;\n\n if (status === 'COMPLETED') {\n // Get transcription result\n try {\n const transcriptResult = await s3.send(new GetObjectCommand({\n Bucket: bucket,\n Key: key.replace('.wav', '-transcript.json'),\n }));\n const transcriptData = JSON.parse(await transcriptResult.Body.transformToString());\n transcription = transcriptData.results?.transcripts?.[0]?.transcript || '';\n }\ncatch (err) {\n console.error('Error getting transcription:', err.message);\n }\n break;\n }\nelse if (status === 'FAILED') {\n console.error('Transcription failed');\n break;\n }\n\n attempts++;\n }\n }\n\n // Update call log\n if (callLogTable && contactId !== 'unknown') {\n await dynamodb.send(new UpdateItemCommand({\n TableName: callLogTable,\n Key: {\n contactId: { S: contactId },\n },\n UpdateExpression: 'SET voicemailKey = :key, voicemailTranscript = :transcript, voicemailAt = :at',\n ExpressionAttributeValues: {\n ':key': { S: key },\n ':transcript': { S: transcription || '' },\n ':at': { S: new Date().toISOString() },\n },\n }));\n }\n\n // Save voicemail metadata\n await s3.send(new PutObjectCommand({\n Bucket: bucket,\n Key: key.replace('.wav', '-metadata.json'),\n Body: JSON.stringify({\n contactId,\n callerNumber: metadata.callerNumber || 'unknown',\n calledNumber: metadata.calledNumber || 'unknown',\n duration: metadata.duration || 0,\n recordedAt: timestamp,\n processedAt: new Date().toISOString(),\n transcription,\n audioKey: key,\n }, null, 2),\n ContentType: 'application/json',\n }));\n\n // Send notification\n if (notificationTopicArn) {\n await sns.send(new PublishCommand({\n TopicArn: notificationTopicArn,\n Subject: 'New Voicemail',\n Message: JSON.stringify({\n type: 'voicemail',\n contactId,\n from: metadata.callerNumber || 'unknown',\n to: metadata.calledNumber || 'unknown',\n duration: metadata.duration || 0,\n transcription: transcription || '(transcription not available)',\n audioUrl: `s3://${bucket}/${key}`,\n timestamp: new Date().toISOString(),\n }, null, 2),\n MessageAttributes: {\n eventType: {\n DataType: 'String',\n StringValue: 'voicemail',\n },\n },\n }));\n }\n\n console.log(`Processed voicemail: ${contactId}`);\n\n }\ncatch (error) {\n console.error('Error processing voicemail:', error);\n }\n }\n\n return { statusCode: 200, body: 'OK' };\n};\n";
|
|
10
|
+
export default handler;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CloudConfig } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* API-Only Backend Preset
|
|
4
|
+
* Perfect for: REST APIs, GraphQL APIs, mobile backends
|
|
5
|
+
* Includes: API Gateway + Lambda functions + DynamoDB
|
|
6
|
+
*/
|
|
7
|
+
export declare function createApiBackendPreset(options: {
|
|
8
|
+
name: string;
|
|
9
|
+
slug: string;
|
|
10
|
+
domain?: string;
|
|
11
|
+
}): Partial<CloudConfig>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CloudConfig } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Data Pipeline Preset
|
|
4
|
+
* Perfect for: ETL pipelines, data processing, analytics workflows
|
|
5
|
+
* Includes: Kinesis + Lambda + S3 + Athena + Glue
|
|
6
|
+
*/
|
|
7
|
+
export declare function createDataPipelinePreset(options: {
|
|
8
|
+
name: string;
|
|
9
|
+
slug: string;
|
|
10
|
+
retentionDays?: number;
|
|
11
|
+
}): Partial<CloudConfig>;
|