@cdklabs/cdk-appmod-catalog-blueprints 1.0.1 → 1.2.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.
- package/.jsii +701 -204
- package/README.md +100 -160
- package/lib/document-processing/adapter/adapter.d.ts +47 -0
- package/lib/document-processing/adapter/adapter.js +5 -0
- package/lib/document-processing/adapter/index.d.ts +2 -0
- package/lib/document-processing/adapter/index.js +19 -0
- package/lib/document-processing/adapter/queued-s3-adapter.d.ts +66 -0
- package/lib/document-processing/adapter/queued-s3-adapter.js +230 -0
- package/lib/document-processing/agentic-document-processing.d.ts +22 -0
- package/lib/document-processing/agentic-document-processing.js +11 -14
- package/lib/document-processing/base-document-processing.d.ts +8 -44
- package/lib/document-processing/base-document-processing.js +23 -190
- package/lib/document-processing/bedrock-document-processing.js +3 -13
- package/lib/document-processing/default-document-processing-config.d.ts +3 -0
- package/lib/document-processing/default-document-processing-config.js +14 -0
- package/lib/document-processing/index.d.ts +2 -0
- package/lib/document-processing/index.js +3 -1
- package/lib/document-processing/resources/default-bedrock-invoke/index.py +36 -24
- package/lib/document-processing/resources/default-sqs-consumer/index.py +10 -5
- package/lib/document-processing/resources/default-strands-agent/index.py +8 -5
- package/lib/document-processing/tests/agentic-document-processing-nag.test.js +6 -2
- package/lib/document-processing/tests/agentic-document-processing.test.js +5 -19
- package/lib/document-processing/tests/bedrock-document-processing-nag.test.js +6 -2
- package/lib/framework/custom-resource/default-runtimes.js +1 -1
- package/lib/framework/foundation/access-log.js +1 -1
- package/lib/framework/foundation/eventbridge-broker.js +1 -1
- package/lib/framework/foundation/network.js +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/utilities/data-loader.js +1 -1
- package/lib/utilities/lambda-iam-utils.js +1 -1
- package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
- package/lib/utilities/observability/default-observability-config.d.ts +9 -0
- package/lib/utilities/observability/default-observability-config.js +20 -0
- package/lib/utilities/observability/index.d.ts +1 -0
- package/lib/utilities/observability/index.js +2 -1
- package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
- package/lib/utilities/observability/powertools-config.js +1 -1
- package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
- package/lib/webapp/frontend-construct.js +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.QueuedS3Adapter = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
7
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
8
|
+
const path = require("node:path");
|
|
9
|
+
const aws_lambda_python_alpha_1 = require("@aws-cdk/aws-lambda-python-alpha");
|
|
10
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
11
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
12
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
13
|
+
const aws_kms_1 = require("aws-cdk-lib/aws-kms");
|
|
14
|
+
const aws_lambda_event_sources_1 = require("aws-cdk-lib/aws-lambda-event-sources");
|
|
15
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
16
|
+
const aws_s3_notifications_1 = require("aws-cdk-lib/aws-s3-notifications");
|
|
17
|
+
const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
|
|
18
|
+
const aws_stepfunctions_1 = require("aws-cdk-lib/aws-stepfunctions");
|
|
19
|
+
const aws_stepfunctions_tasks_1 = require("aws-cdk-lib/aws-stepfunctions-tasks");
|
|
20
|
+
const framework_1 = require("../../framework");
|
|
21
|
+
const utilities_1 = require("../../utilities");
|
|
22
|
+
const default_document_processing_config_1 = require("../default-document-processing-config");
|
|
23
|
+
/**
|
|
24
|
+
* This adapter allows the intelligent document processing workflow
|
|
25
|
+
* to be triggered by files that are uploaded into a S3 Bucket.
|
|
26
|
+
*/
|
|
27
|
+
class QueuedS3Adapter {
|
|
28
|
+
constructor(adapterProps = {}) {
|
|
29
|
+
this.adapterProps = adapterProps;
|
|
30
|
+
this.resources = {};
|
|
31
|
+
this.prefixes = {
|
|
32
|
+
raw: this.adapterProps.rawPrefix || 'raw/',
|
|
33
|
+
processed: this.adapterProps.processedPrefix || 'processed/',
|
|
34
|
+
failed: this.adapterProps.failedPrefix || 'failed/',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
init(scope, props) {
|
|
38
|
+
if (props.network) {
|
|
39
|
+
props.network.createServiceEndpoint('vpce-sqs', aws_ec2_1.InterfaceVpcEndpointAwsService.SQS);
|
|
40
|
+
props.network.createServiceEndpoint('vpce-s3', aws_ec2_1.InterfaceVpcEndpointAwsService.S3);
|
|
41
|
+
}
|
|
42
|
+
const encryptionKey = props.encryptionKey || new aws_kms_1.Key(scope, 'QueuedS3AdapterEncryptionKey', {
|
|
43
|
+
enableKeyRotation: true,
|
|
44
|
+
removalPolicy: props.removalPolicy || aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
45
|
+
});
|
|
46
|
+
this.resources.encryptionKey = encryptionKey;
|
|
47
|
+
const bucket = this.adapterProps.bucket || new aws_s3_1.Bucket(scope, 'DocumentProcessingBucket', {
|
|
48
|
+
autoDeleteObjects: (props.removalPolicy && props.removalPolicy === aws_cdk_lib_1.RemovalPolicy.DESTROY) || !props.removalPolicy ? true : false,
|
|
49
|
+
removalPolicy: props.removalPolicy || aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
50
|
+
encryption: aws_s3_1.BucketEncryption.KMS,
|
|
51
|
+
enforceSSL: true,
|
|
52
|
+
bucketKeyEnabled: true,
|
|
53
|
+
});
|
|
54
|
+
this.resources.bucket = bucket;
|
|
55
|
+
const deadLetterQueue = new aws_sqs_1.Queue(scope, 'DocumentProcessingDLQ', {
|
|
56
|
+
visibilityTimeout: this.adapterProps.queueVisibilityTimeout || aws_cdk_lib_1.Duration.seconds(300),
|
|
57
|
+
removalPolicy: props.removalPolicy || aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
58
|
+
enforceSSL: true,
|
|
59
|
+
encryption: aws_sqs_1.QueueEncryption.KMS,
|
|
60
|
+
encryptionMasterKey: encryptionKey,
|
|
61
|
+
});
|
|
62
|
+
const queue = new aws_sqs_1.Queue(scope, 'DocumentProcessingQueue', {
|
|
63
|
+
visibilityTimeout: this.adapterProps.queueVisibilityTimeout || aws_cdk_lib_1.Duration.seconds(300),
|
|
64
|
+
removalPolicy: props.removalPolicy || aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
65
|
+
enforceSSL: true,
|
|
66
|
+
deadLetterQueue: {
|
|
67
|
+
maxReceiveCount: this.adapterProps.dlqMaxReceiveCount || 5,
|
|
68
|
+
queue: deadLetterQueue,
|
|
69
|
+
},
|
|
70
|
+
encryption: aws_sqs_1.QueueEncryption.KMS,
|
|
71
|
+
encryptionMasterKey: encryptionKey,
|
|
72
|
+
});
|
|
73
|
+
this.resources.deadLetterQueue = deadLetterQueue;
|
|
74
|
+
this.resources.queue = queue;
|
|
75
|
+
}
|
|
76
|
+
createIngressTrigger(scope, stateMachine, props) {
|
|
77
|
+
const bucket = this.resources.bucket;
|
|
78
|
+
const queue = this.resources.queue;
|
|
79
|
+
const encryptionKey = this.resources.encryptionKey;
|
|
80
|
+
bucket.addEventNotification(aws_s3_1.EventType.OBJECT_CREATED, new aws_s3_notifications_1.SqsDestination(queue), {
|
|
81
|
+
prefix: this.prefixes.raw,
|
|
82
|
+
});
|
|
83
|
+
const sqsConsumerLambdaFn = this.createSQSConsumerLambda(scope, stateMachine, props, encryptionKey, queue);
|
|
84
|
+
this.resources.sqsConsumerLambdaFunction = sqsConsumerLambdaFn;
|
|
85
|
+
return this.resources;
|
|
86
|
+
}
|
|
87
|
+
createSQSConsumerLambda(scope, stateMachine, props, encryptionKey, queue) {
|
|
88
|
+
const metricNamespace = props.metricNamespace || utilities_1.DefaultObservabilityConfig.DEFAULT_METRIC_NAMESPACE;
|
|
89
|
+
const metricServiceName = props.metricServiceName || default_document_processing_config_1.DefaultDocumentProcessingConfig.DEFAULT_OBSERVABILITY_METRIC_SVC_NAME;
|
|
90
|
+
const { region, account } = utilities_1.LambdaIamUtils.getStackInfo(scope);
|
|
91
|
+
// Create logs permissions and get unique function name
|
|
92
|
+
const logsPermissions = utilities_1.LambdaIamUtils.createLogsPermissions({
|
|
93
|
+
scope,
|
|
94
|
+
functionName: 'SQSConsumer',
|
|
95
|
+
region,
|
|
96
|
+
account,
|
|
97
|
+
enableObservability: props.enableObservability,
|
|
98
|
+
});
|
|
99
|
+
// Create policy statements for SQS consumer Lambda
|
|
100
|
+
const policyStatements = [
|
|
101
|
+
...logsPermissions.policyStatements,
|
|
102
|
+
new aws_iam_1.PolicyStatement({
|
|
103
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
104
|
+
actions: ['states:StartExecution'],
|
|
105
|
+
resources: [stateMachine.stateMachineArn],
|
|
106
|
+
}),
|
|
107
|
+
];
|
|
108
|
+
if (props.network) {
|
|
109
|
+
policyStatements.push(utilities_1.LambdaIamUtils.generateLambdaVPCPermissions());
|
|
110
|
+
}
|
|
111
|
+
// Create IAM role for SQS consumer Lambda
|
|
112
|
+
const sqsConsumerRole = new aws_iam_1.Role(scope, 'SQSConsumerRole', {
|
|
113
|
+
assumedBy: new aws_iam_1.ServicePrincipal('lambda.amazonaws.com'),
|
|
114
|
+
inlinePolicies: {
|
|
115
|
+
SQSConsumerExecutionPolicy: new aws_iam_1.PolicyDocument({
|
|
116
|
+
statements: policyStatements,
|
|
117
|
+
}),
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
encryptionKey.grantEncryptDecrypt(sqsConsumerRole);
|
|
121
|
+
// Create SQS consumer Lambda function
|
|
122
|
+
const sqsConsumerLambda = new aws_lambda_python_alpha_1.PythonFunction(scope, 'SQSConsumer', {
|
|
123
|
+
functionName: logsPermissions.uniqueFunctionName,
|
|
124
|
+
runtime: framework_1.DefaultRuntimes.PYTHON,
|
|
125
|
+
role: sqsConsumerRole,
|
|
126
|
+
entry: path.join(__dirname, '/../resources/default-sqs-consumer'),
|
|
127
|
+
environment: {
|
|
128
|
+
STATE_MACHINE_ARN: stateMachine.stateMachineArn,
|
|
129
|
+
RAW_PREFIX: this.prefixes.raw,
|
|
130
|
+
...utilities_1.PowertoolsConfig.generateDefaultLambdaConfig(props.enableObservability, metricNamespace, metricServiceName),
|
|
131
|
+
},
|
|
132
|
+
timeout: aws_cdk_lib_1.Duration.minutes(5),
|
|
133
|
+
description: 'Consumes SQS messages and triggers Step Functions executions for document processing',
|
|
134
|
+
environmentEncryption: encryptionKey,
|
|
135
|
+
vpc: props.network ? props.network.vpc : undefined,
|
|
136
|
+
vpcSubnets: props.network ? props.network.applicationSubnetSelection() : undefined,
|
|
137
|
+
});
|
|
138
|
+
// Add SQS event source to Lambda
|
|
139
|
+
sqsConsumerLambda.addEventSource(new aws_lambda_event_sources_1.SqsEventSource(queue, {
|
|
140
|
+
batchSize: 10,
|
|
141
|
+
maxBatchingWindow: aws_cdk_lib_1.Duration.seconds(5),
|
|
142
|
+
reportBatchItemFailures: true,
|
|
143
|
+
}));
|
|
144
|
+
return sqsConsumerLambda;
|
|
145
|
+
}
|
|
146
|
+
generateAdapterIAMPolicies(additionalIAMActions, narrowActions) {
|
|
147
|
+
const bucket = this.resources.bucket;
|
|
148
|
+
const normalizedIAMActions = additionalIAMActions || [];
|
|
149
|
+
const statements = [];
|
|
150
|
+
if (!narrowActions) {
|
|
151
|
+
statements.push(new aws_iam_1.PolicyStatement({
|
|
152
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
153
|
+
actions: ['s3:GetObject', 's3:CopyObject', 's3:DeleteObject', 's3:PutObject', ...normalizedIAMActions],
|
|
154
|
+
resources: [`${bucket.bucketArn}/*`],
|
|
155
|
+
}));
|
|
156
|
+
if (bucket.encryptionKey) {
|
|
157
|
+
statements.push(new aws_iam_1.PolicyStatement({
|
|
158
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
159
|
+
actions: [
|
|
160
|
+
'kms:Encrypt',
|
|
161
|
+
'kms:ReEncrypt*',
|
|
162
|
+
'kms:GenerateDataKey*',
|
|
163
|
+
'kms:Decrypt',
|
|
164
|
+
],
|
|
165
|
+
resources: [bucket.encryptionKey.keyArn],
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
statements.push(new aws_iam_1.PolicyStatement({
|
|
171
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
172
|
+
actions: normalizedIAMActions,
|
|
173
|
+
resources: [`${bucket.bucketArn}/*`],
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
return statements;
|
|
177
|
+
}
|
|
178
|
+
createFailedChain(scope) {
|
|
179
|
+
const bucket = this.resources.bucket;
|
|
180
|
+
const failedChain = new aws_stepfunctions_tasks_1.CallAwsService(scope, 'CopyToFailed', {
|
|
181
|
+
service: 's3',
|
|
182
|
+
action: 'copyObject',
|
|
183
|
+
parameters: {
|
|
184
|
+
Bucket: aws_stepfunctions_1.JsonPath.stringAt('$.content.bucket'),
|
|
185
|
+
CopySource: aws_stepfunctions_1.JsonPath.format('{}/{}', aws_stepfunctions_1.JsonPath.stringAt('$.content.bucket'), aws_stepfunctions_1.JsonPath.stringAt('$.content.key')),
|
|
186
|
+
Key: aws_stepfunctions_1.JsonPath.format(`${this.prefixes.failed}/{}`, aws_stepfunctions_1.JsonPath.stringAt('$.content.filename')),
|
|
187
|
+
},
|
|
188
|
+
iamResources: [`${bucket.bucketArn}/*`],
|
|
189
|
+
resultPath: aws_stepfunctions_1.JsonPath.DISCARD,
|
|
190
|
+
}).next(new aws_stepfunctions_tasks_1.CallAwsService(scope, 'DeleteFromRaw', {
|
|
191
|
+
service: 's3',
|
|
192
|
+
action: 'deleteObject',
|
|
193
|
+
parameters: {
|
|
194
|
+
Bucket: aws_stepfunctions_1.JsonPath.stringAt('$.content.bucket'),
|
|
195
|
+
Key: aws_stepfunctions_1.JsonPath.stringAt('$.content.key'),
|
|
196
|
+
},
|
|
197
|
+
iamResources: [`${bucket.bucketArn}/*`],
|
|
198
|
+
resultPath: aws_stepfunctions_1.JsonPath.DISCARD,
|
|
199
|
+
}));
|
|
200
|
+
return failedChain;
|
|
201
|
+
}
|
|
202
|
+
createSuccessChain(scope) {
|
|
203
|
+
const bucket = this.resources.bucket;
|
|
204
|
+
const chain = new aws_stepfunctions_tasks_1.CallAwsService(scope, 'CopyToProcessed', {
|
|
205
|
+
service: 's3',
|
|
206
|
+
action: 'copyObject',
|
|
207
|
+
parameters: {
|
|
208
|
+
Bucket: aws_stepfunctions_1.JsonPath.stringAt('$.content.bucket'),
|
|
209
|
+
CopySource: aws_stepfunctions_1.JsonPath.format('{}/{}', aws_stepfunctions_1.JsonPath.stringAt('$.content.bucket'), aws_stepfunctions_1.JsonPath.stringAt('$.content.key')),
|
|
210
|
+
Key: aws_stepfunctions_1.JsonPath.format(`${this.prefixes.processed}/{}`, aws_stepfunctions_1.JsonPath.stringAt('$.content.filename')),
|
|
211
|
+
},
|
|
212
|
+
iamResources: [`${bucket.bucketArn}/*`],
|
|
213
|
+
resultPath: aws_stepfunctions_1.JsonPath.DISCARD,
|
|
214
|
+
}).next(new aws_stepfunctions_tasks_1.CallAwsService(scope, 'DeleteFromRawSuccess', {
|
|
215
|
+
service: 's3',
|
|
216
|
+
action: 'deleteObject',
|
|
217
|
+
parameters: {
|
|
218
|
+
Bucket: aws_stepfunctions_1.JsonPath.stringAt('$.content.bucket'),
|
|
219
|
+
Key: aws_stepfunctions_1.JsonPath.stringAt('$.content.key'),
|
|
220
|
+
},
|
|
221
|
+
iamResources: [`${bucket.bucketArn}/*`],
|
|
222
|
+
resultPath: aws_stepfunctions_1.JsonPath.DISCARD,
|
|
223
|
+
}));
|
|
224
|
+
return chain;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
exports.QueuedS3Adapter = QueuedS3Adapter;
|
|
228
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
229
|
+
QueuedS3Adapter[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.QueuedS3Adapter", version: "1.2.0" };
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVldWVkLXMzLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy9hZGFwdGVyL3F1ZXVlZC1zMy1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUV0QyxrQ0FBa0M7QUFDbEMsOEVBQWtFO0FBQ2xFLDZDQUFzRDtBQUN0RCxpREFBcUU7QUFDckUsaURBQXNHO0FBQ3RHLGlEQUEwQztBQUUxQyxtRkFBc0U7QUFDdEUsK0NBQXlFO0FBQ3pFLDJFQUFrRTtBQUNsRSxpREFBNkQ7QUFDN0QscUVBQThFO0FBQzlFLGlGQUFxRTtBQUlyRSwrQ0FBa0Q7QUFDbEQsK0NBQStGO0FBQy9GLDhGQUF3RjtBQTREeEY7OztHQUdHO0FBQ0gsTUFBYSxlQUFlO0lBSzFCLFlBQVksZUFBcUMsRUFBRTtRQUNqRCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2QsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxJQUFJLE1BQU07WUFDMUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxJQUFJLFlBQVk7WUFDNUQsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxJQUFJLFNBQVM7U0FDcEQsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBZ0IsRUFBRSxLQUFrQztRQUN2RCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSx3Q0FBOEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRixLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFB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QUM3QixDQUFDLENBQUMsSUFBSSxDQUNMLElBQUksd0NBQWMsQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLEVBQUU7WUFDaEQsT0FBTyxFQUFFLElBQUk7WUFDYixNQUFNLEVBQUUsY0FBYztZQUN0QixVQUFVLEVBQUU7Z0JBQ1YsTUFBTSxFQUFFLDRCQUFRLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDO2dCQUM3QyxHQUFHLEVBQUUsNEJBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO2FBQ3hDO1lBQ0QsWUFBWSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUM7WUFDdkMsVUFBVSxFQUFFLDRCQUFRLENBQUMsT0FBTztTQUM3QixDQUFDLENBQ0gsQ0FBQztRQUVGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7QUFsUEgsMENBbVBDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBQeXRob25GdW5jdGlvbiB9IGZyb20gJ0Bhd3MtY2RrL2F3cy1sYW1iZGEtcHl0aG9uLWFscGhhJztcbmltcG9ydCB7IER1cmF0aW9uLCBSZW1vdmFsUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBFZmZlY3QsIFBvbGljeURvY3VtZW50LCBQb2xpY3lTdGF0ZW1lbnQsIFJvbGUsIFNlcnZpY2VQcmluY2lwYWwgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEtleSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0IHsgRnVuY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IFNxc0V2ZW50U291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ldmVudC1zb3VyY2VzJztcbmltcG9ydCB7IEJ1Y2tldCwgQnVja2V0RW5jcnlwdGlvbiwgRXZlbnRUeXBlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IFNxc0Rlc3RpbmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLW5vdGlmaWNhdGlvbnMnO1xuaW1wb3J0IHsgUXVldWUsIFF1ZXVlRW5jcnlwdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zcXMnO1xuaW1wb3J0IHsgQ2hhaW4sIEpzb25QYXRoLCBTdGF0ZU1hY2hpbmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucyc7XG5pbXBvcnQgeyBDYWxsQXdzU2VydmljZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zLXRhc2tzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzZURvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIH0gZnJvbSAnLi4vYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmltcG9ydCB7IElBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyJztcbmltcG9ydCB7IERlZmF1bHRSdW50aW1lcyB9IGZyb20gJy4uLy4uL2ZyYW1ld29yayc7XG5pbXBvcnQgeyBEZWZhdWx0T2JzZXJ2YWJpbGl0eUNvbmZpZywgTGFtYmRhSWFtVXRpbHMsIFBvd2VydG9vbHNDb25maWcgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMnO1xuaW1wb3J0IHsgRGVmYXVsdERvY3VtZW50UHJvY2Vzc2luZ0NvbmZpZyB9IGZyb20gJy4uL2RlZmF1bHQtZG9jdW1lbnQtcHJvY2Vzc2luZy1jb25maWcnO1xuXG4vKipcbiAqIFN0cnVjdCBmb3IgUzMgUHJlZml4ZXNcbiAqL1xuaW50ZXJmYWNlIFMzUHJlZml4ZXMge1xuICByZWFkb25seSByYXc6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvY2Vzc2VkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZhaWxlZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgUXVldWVkIFMzIEFkYXB0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZWRTM0FkYXB0ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBTMyBidWNrZXQgZm9yIGRvY3VtZW50IHN0b3JhZ2Ugd2l0aCBvcmdhbml6ZWQgcHJlZml4ZXMgKHJhdy8sIHByb2Nlc3NlZC8sIGZhaWxlZC8pLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgbmV3IGJ1Y2tldCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhdXRvLWRlbGV0ZSBlbmFibGVkIGJhc2VkIG9uIHJlbW92YWxQb2xpY3kuXG4gICAqXG4gICAqIEBkZWZhdWx0IGNyZWF0ZSBhIG5ldyBidWNrZXRcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldD86IEJ1Y2tldDtcblxuICAvKipcbiAgICogUzMgcHJlZml4IHdoZXJlIHRoZSByYXcgZmlsZXMgd291bGQgYmUgc3RvcmVkLlxuICAgKiBUaGlzIHNlcnZlcyBhcyB0aGUgdHJpZ2dlciBwb2ludCBmb3IgcHJvY2Vzc2luZ1xuICAgKlxuICAgKiBAZGVmYXVsdCBcInJhdy9cIlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3UHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTMyBwcmVmaXggd2hlcmUgdGhlIHByb2Nlc3NlZCBmaWxlcyB3b3VsZCBiZSBzdG9yZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwicHJvY2Vzc2VkL1wiXG4gICAqL1xuICByZWFkb25seSBwcm9jZXNzZWRQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFMzIHByZWZpeCB3aGVyZSB0aGUgZmlsZXMgdGhhdCBmYWlsZWQgcHJvY2Vzc2luZyB3b3VsZCBiZSBzdG9yZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiZmFpbGVkL1wiXG4gICAqL1xuICByZWFkb25seSBmYWlsZWRQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNRUyBxdWV1ZSB2aXNpYmlsaXR5IHRpbWVvdXQgZm9yIHByb2Nlc3NpbmcgbWVzc2FnZXMuXG4gICAqIFNob3VsZCBiZSBsb25nZXIgdGhhbiBleHBlY3RlZCBwcm9jZXNzaW5nIHRpbWUgdG8gcHJldmVudCBkdXBsaWNhdGUgcHJvY2Vzc2luZy5cbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygzMDApXG4gICAqL1xuICByZWFkb25seSBxdWV1ZVZpc2liaWxpdHlUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgdGltZXMgYSBtZXNzYWdlIGNhbiBiZSB1bnN1Y2Nlc3NmdWxseSBkZXF1ZXVlZCBiZWZvcmUgYmVpbmcgbW92ZWQgdG8gdGhlIGRlYWQtbGV0dGVyIHF1ZXVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSBkbHFNYXhSZWNlaXZlQ291bnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhpcyBhZGFwdGVyIGFsbG93cyB0aGUgaW50ZWxsaWdlbnQgZG9jdW1lbnQgcHJvY2Vzc2luZyB3b3JrZmxvd1xuICogdG8gYmUgdHJpZ2dlcmVkIGJ5IGZpbGVzIHRoYXQgYXJlIHVwbG9hZGVkIGludG8gYSBTMyBCdWNrZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWV1ZWRTM0FkYXB0ZXIgaW1wbGVtZW50cyBJQWRhcHRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRhcHRlclByb3BzOiBRdWV1ZWRTM0FkYXB0ZXJQcm9wcztcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4ZXM6IFMzUHJlZml4ZXM7XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlclByb3BzOiBRdWV1ZWRTM0FkYXB0ZXJQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5hZGFwdGVyUHJvcHMgPSBhZGFwdGVyUHJvcHM7XG4gICAgdGhpcy5yZXNvdXJjZXMgPSB7fTtcbiAgICB0aGlzLnByZWZpeGVzID0ge1xuICAgICAgcmF3OiB0aGlzLmFkYXB0ZXJQcm9wcy5yYXdQcmVmaXggfHwgJ3Jhdy8nLFxuICAgICAgcHJvY2Vzc2VkOiB0aGlzLmFkYXB0ZXJQcm9wcy5wcm9jZXNzZWRQcmVmaXggfHwgJ3Byb2Nlc3NlZC8nLFxuICAgICAgZmFpbGVkOiB0aGlzLmFkYXB0ZXJQcm9wcy5mYWlsZWRQcmVmaXggfHwgJ2ZhaWxlZC8nLFxuICAgIH07XG4gIH1cblxuICBpbml0KHNjb3BlOiBDb25zdHJ1Y3QsIHByb3BzOiBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMpOiB2b2lkIHtcbiAgICBpZiAocHJvcHMubmV0d29yaykge1xuICAgICAgcHJvcHMubmV0d29yay5jcmVhdGVTZXJ2aWNlRW5kcG9pbnQoJ3ZwY2Utc3FzJywgSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLlNRUyk7XG4gICAgICBwcm9wcy5uZXR3b3JrLmNyZWF0ZVNlcnZpY2VFbmRwb2ludCgndnBjZS1zMycsIEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5TMyk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHByb3BzLmVuY3J5cHRpb25LZXkgfHwgbmV3IEtleShzY29wZSwgJ1F1ZXVlZFMzQWRhcHRlckVuY3J5cHRpb25LZXknLCB7XG4gICAgICBlbmFibGVLZXlSb3RhdGlvbjogdHJ1ZSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNvdXJjZXMuZW5jcnlwdGlvbktleSA9IGVuY3J5cHRpb25LZXk7XG5cbiAgICBjb25zdCBidWNrZXQgPSB0aGlzLmFkYXB0ZXJQcm9wcy5idWNrZXQgfHwgbmV3IEJ1Y2tldChzY29wZSwgJ0RvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldCcsIHtcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiAocHJvcHMucmVtb3ZhbFBvbGljeSAmJiBwcm9wcy5yZW1vdmFsUG9saWN5ID09PSBSZW1vdmFsUG9saWN5LkRFU1RST1kpIHx8ICFwcm9wcy5yZW1vdmFsUG9saWN5ID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICBlbmNyeXB0aW9uOiBCdWNrZXRFbmNyeXB0aW9uLktNUyxcbiAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICBidWNrZXRLZXlFbmFibGVkOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNvdXJjZXMuYnVja2V0ID0gYnVja2V0O1xuXG4gICAgY29uc3QgZGVhZExldHRlclF1ZXVlID0gbmV3IFF1ZXVlKHNjb3BlLCAnRG9jdW1lbnRQcm9jZXNzaW5nRExRJywge1xuICAgICAgdmlzaWJpbGl0eVRpbWVvdXQ6IHRoaXMuYWRhcHRlclByb3BzLnF1ZXVlVmlzaWJpbGl0eVRpbWVvdXQgfHwgRHVyYXRpb24uc2Vjb25kcygzMDApLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgZW5jcnlwdGlvbjogUXVldWVFbmNyeXB0aW9uLktNUyxcbiAgICAgIGVuY3J5cHRpb25NYXN0ZXJLZXk6IGVuY3J5cHRpb25LZXksXG4gICAgfSk7XG5cbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBRdWV1ZShzY29wZSwgJ0RvY3VtZW50UHJvY2Vzc2luZ1F1ZXVlJywge1xuICAgICAgdmlzaWJpbGl0eVRpbWVvdXQ6IHRoaXMuYWRhcHRlclByb3BzLnF1ZXVlVmlzaWJpbGl0eVRpbWVvdXQgfHwgRHVyYXRpb24uc2Vjb25kcygzMDApLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgZGVhZExldHRlclF1ZXVlOiB7XG4gICAgICAgIG1heFJlY2VpdmVDb3VudDogdGhpcy5hZGFwdGVyUHJvcHMuZGxxTWF4UmVjZWl2ZUNvdW50IHx8IDUsXG4gICAgICAgIHF1ZXVlOiBkZWFkTGV0dGVyUXVldWUsXG4gICAgICB9LFxuICAgICAgZW5jcnlwdGlvbjogUXVldWVFbmNyeXB0aW9uLktNUyxcbiAgICAgIGVuY3J5cHRpb25NYXN0ZXJLZXk6IGVuY3J5cHRpb25LZXksXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc291cmNlcy5kZWFkTGV0dGVyUXVldWUgPSBkZWFkTGV0dGVyUXVldWU7XG4gICAgdGhpcy5yZXNvdXJjZXMucXVldWUgPSBxdWV1ZTtcbiAgfVxuXG4gIGNyZWF0ZUluZ3Jlc3NUcmlnZ2VyKHNjb3BlOiBDb25zdHJ1Y3QsIHN0YXRlTWFjaGluZTogU3RhdGVNYWNoaW5lLCBwcm9wczogQmFzZURvY3VtZW50UHJvY2Vzc2luZ1Byb3BzKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgYnVja2V0OiBCdWNrZXQgPSB0aGlzLnJlc291cmNlcy5idWNrZXQ7XG4gICAgY29uc3QgcXVldWU6IFF1ZXVlID0gdGhpcy5yZXNvdXJjZXMucXVldWU7XG4gICAgY29uc3QgZW5jcnlwdGlvbktleTogS2V5ID0gdGhpcy5yZXNvdXJjZXMuZW5jcnlwdGlvbktleTtcblxuICAgIGJ1Y2tldC5hZGRFdmVudE5vdGlmaWNhdGlvbihFdmVudFR5cGUuT0JKRUNUX0NSRUFURUQsIG5ldyBTcXNEZXN0aW5hdGlvbihxdWV1ZSksIHtcbiAgICAgIHByZWZpeDogdGhpcy5wcmVmaXhlcy5yYXcsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzcXNDb25zdW1lckxhbWJkYUZuID0gdGhpcy5jcmVhdGVTUVNDb25zdW1lckxhbWJkYShzY29wZSwgc3RhdGVNYWNoaW5lLCBwcm9wcywgZW5jcnlwdGlvbktleSwgcXVldWUpO1xuXG4gICAgdGhpcy5yZXNvdXJjZXMuc3FzQ29uc3VtZXJMYW1iZGFGdW5jdGlvbiA9IHNxc0NvbnN1bWVyTGFtYmRhRm47XG5cbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXM7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNRU0NvbnN1bWVyTGFtYmRhKHNjb3BlOiBDb25zdHJ1Y3QsIHN0YXRlTWFjaGluZTogU3RhdGVNYWNoaW5lXG4gICAgLCBwcm9wczogQmFzZURvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLCBlbmNyeXB0aW9uS2V5OiBLZXksIHF1ZXVlOiBRdWV1ZSk6IEZ1bmN0aW9uIHtcbiAgICBjb25zdCBtZXRyaWNOYW1lc3BhY2UgPSBwcm9wcy5tZXRyaWNOYW1lc3BhY2UgfHwgRGVmYXVsdE9ic2VydmFiaWxpdHlDb25maWcuREVGQVVMVF9NRVRSSUNfTkFNRVNQQUNFO1xuICAgIGNvbnN0IG1ldHJpY1NlcnZpY2VOYW1lID0gcHJvcHMubWV0cmljU2VydmljZU5hbWUgfHwgRGVmYXVsdERvY3VtZW50UHJvY2Vzc2luZ0NvbmZpZy5ERUZBVUxUX09CU0VSVkFCSUxJVFlfTUVUUklDX1NWQ19OQU1FO1xuXG4gICAgY29uc3QgeyByZWdpb24sIGFjY291bnQgfSA9IExhbWJkYUlhbVV0aWxzLmdldFN0YWNrSW5mbyhzY29wZSk7XG4gICAgLy8gQ3JlYXRlIGxvZ3MgcGVybWlzc2lvbnMgYW5kIGdldCB1bmlxdWUgZnVuY3Rpb24gbmFtZVxuICAgIGNvbnN0IGxvZ3NQZXJtaXNzaW9ucyA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICBzY29wZSxcbiAgICAgIGZ1bmN0aW9uTmFtZTogJ1NRU0NvbnN1bWVyJyxcbiAgICAgIHJlZ2lvbixcbiAgICAgIGFjY291bnQsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiBwcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIHBvbGljeSBzdGF0ZW1lbnRzIGZvciBTUVMgY29uc3VtZXIgTGFtYmRhXG4gICAgY29uc3QgcG9saWN5U3RhdGVtZW50cyA9IFtcbiAgICAgIC4uLmxvZ3NQZXJtaXNzaW9ucy5wb2xpY3lTdGF0ZW1lbnRzLFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbJ3N0YXRlczpTdGFydEV4ZWN1dGlvbiddLFxuICAgICAgICByZXNvdXJjZXM6IFtzdGF0ZU1hY2hpbmUuc3RhdGVNYWNoaW5lQXJuXSxcbiAgICAgIH0pLFxuICAgIF07XG5cbiAgICBpZiAocHJvcHMubmV0d29yaykge1xuICAgICAgcG9saWN5U3RhdGVtZW50cy5wdXNoKExhbWJkYUlhbVV0aWxzLmdlbmVyYXRlTGFtYmRhVlBDUGVybWlzc2lvbnMoKSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIElBTSByb2xlIGZvciBTUVMgY29uc3VtZXIgTGFtYmRhXG4gICAgY29uc3Qgc3FzQ29uc3VtZXJSb2xlID0gbmV3IFJvbGUoc2NvcGUsICdTUVNDb25zdW1lclJvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgU1FTQ29uc3VtZXJFeGVjdXRpb25Qb2xpY3k6IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogcG9saWN5U3RhdGVtZW50cyxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgZW5jcnlwdGlvbktleS5ncmFudEVuY3J5cHREZWNyeXB0KHNxc0NvbnN1bWVyUm9sZSk7XG5cbiAgICAvLyBDcmVhdGUgU1FTIGNvbnN1bWVyIExhbWJkYSBmdW5jdGlvblxuICAgIGNvbnN0IHNxc0NvbnN1bWVyTGFtYmRhID0gbmV3IFB5dGhvbkZ1bmN0aW9uKHNjb3BlLCAnU1FTQ29uc3VtZXInLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGxvZ3NQZXJtaXNzaW9ucy51bmlxdWVGdW5jdGlvbk5hbWUsXG4gICAgICBydW50aW1lOiBEZWZhdWx0UnVudGltZXMuUFlUSE9OLFxuICAgICAgcm9sZTogc3FzQ29uc3VtZXJSb2xlLFxuICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICcvLi4vcmVzb3VyY2VzL2RlZmF1bHQtc3FzLWNvbnN1bWVyJyksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBTVEFURV9NQUNISU5FX0FSTjogc3RhdGVNYWNoaW5lLnN0YXRlTWFjaGluZUFybixcbiAgICAgICAgUkFXX1BSRUZJWDogdGhpcy5wcmVmaXhlcy5yYXcsXG4gICAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKHByb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksIG1ldHJpY05hbWVzcGFjZSwgbWV0cmljU2VydmljZU5hbWUpLFxuICAgICAgfSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICBkZXNjcmlwdGlvbjogJ0NvbnN1bWVzIFNRUyBtZXNzYWdlcyBhbmQgdHJpZ2dlcnMgU3RlcCBGdW5jdGlvbnMgZXhlY3V0aW9ucyBmb3IgZG9jdW1lbnQgcHJvY2Vzc2luZycsXG4gICAgICBlbnZpcm9ubWVudEVuY3J5cHRpb246IGVuY3J5cHRpb25LZXksXG4gICAgICB2cGM6IHByb3BzLm5ldHdvcmsgPyBwcm9wcy5uZXR3b3JrLnZwYyA6IHVuZGVmaW5lZCxcbiAgICAgIHZwY1N1Ym5ldHM6IHByb3BzLm5ldHdvcmsgPyBwcm9wcy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKCkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgU1FTIGV2ZW50IHNvdXJjZSB0byBMYW1iZGFcbiAgICBzcXNDb25zdW1lckxhbWJkYS5hZGRFdmVudFNvdXJjZShcbiAgICAgIG5ldyBTcXNFdmVudFNvdXJjZShxdWV1ZSwge1xuICAgICAgICBiYXRjaFNpemU6IDEwLFxuICAgICAgICBtYXhCYXRjaGluZ1dpbmRvdzogRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgICAgcmVwb3J0QmF0Y2hJdGVtRmFpbHVyZXM6IHRydWUsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHNxc0NvbnN1bWVyTGFtYmRhO1xuICB9XG5cbiAgZ2VuZXJhdGVBZGFwdGVySUFNUG9saWNpZXMoYWRkaXRpb25hbElBTUFjdGlvbnM/OiBzdHJpbmdbXSwgbmFycm93QWN0aW9ucz86IGJvb2xlYW4pOiBQb2xpY3lTdGF0ZW1lbnRbXSB7XG4gICAgY29uc3QgYnVja2V0OiBCdWNrZXQgPSB0aGlzLnJlc291cmNlcy5idWNrZXQ7XG5cbiAgICBjb25zdCBub3JtYWxpemVkSUFNQWN0aW9ucyA9IGFkZGl0aW9uYWxJQU1BY3Rpb25zIHx8IFtdO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IFtdO1xuICAgIGlmICghbmFycm93QWN0aW9ucykge1xuICAgICAgc3RhdGVtZW50cy5wdXNoKG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogWydzMzpHZXRPYmplY3QnLCAnczM6Q29weU9iamVjdCcsICdzMzpEZWxldGVPYmplY3QnLCAnczM6UHV0T2JqZWN0JywgLi4ubm9ybWFsaXplZElBTUFjdGlvbnNdLFxuICAgICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXQuYnVja2V0QXJufS8qYF0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChidWNrZXQuZW5jcnlwdGlvbktleSkge1xuICAgICAgICBzdGF0ZW1lbnRzLnB1c2gobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgJ2ttczpFbmNyeXB0JyxcbiAgICAgICAgICAgICdrbXM6UmVFbmNyeXB0KicsXG4gICAgICAgICAgICAna21zOkdlbmVyYXRlRGF0YUtleSonLFxuICAgICAgICAgICAgJ2ttczpEZWNyeXB0JyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogW2J1Y2tldC5lbmNyeXB0aW9uS2V5LmtleUFybl0sXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZW1lbnRzLnB1c2gobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBub3JtYWxpemVkSUFNQWN0aW9ucyxcbiAgICAgICAgcmVzb3VyY2VzOiBbYCR7YnVja2V0LmJ1Y2tldEFybn0vKmBdLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZW1lbnRzO1xuICB9XG5cbiAgY3JlYXRlRmFpbGVkQ2hhaW4oc2NvcGU6IENvbnN0cnVjdCk6IENoYWluIHtcbiAgICBjb25zdCBidWNrZXQ6IEJ1Y2tldCA9IHRoaXMucmVzb3VyY2VzLmJ1Y2tldDtcblxuICAgIGNvbnN0IGZhaWxlZENoYWluID0gbmV3IENhbGxBd3NTZXJ2aWNlKHNjb3BlLCAnQ29weVRvRmFpbGVkJywge1xuICAgICAgc2VydmljZTogJ3MzJyxcbiAgICAgIGFjdGlvbjogJ2NvcHlPYmplY3QnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBCdWNrZXQ6IEpzb25QYXRoLnN0cmluZ0F0KCckLmNvbnRlbnQuYnVja2V0JyksXG4gICAgICAgIENvcHlTb3VyY2U6IEpzb25QYXRoLmZvcm1hdCgne30ve30nLCBKc29uUGF0aC5zdHJpbmdBdCgnJC5jb250ZW50LmJ1Y2tldCcpLCBKc29uUGF0aC5zdHJpbmdBdCgnJC5jb250ZW50LmtleScpKSxcbiAgICAgICAgS2V5OiBKc29uUGF0aC5mb3JtYXQoYCR7dGhpcy5wcmVmaXhlcy5mYWlsZWR9L3t9YCwgSnNvblBhdGguc3RyaW5nQXQoJyQuY29udGVudC5maWxlbmFtZScpKSxcbiAgICAgIH0sXG4gICAgICBpYW1SZXNvdXJjZXM6IFtgJHtidWNrZXQuYnVja2V0QXJufS8qYF0sXG4gICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgIH0pLm5leHQoXG4gICAgICBuZXcgQ2FsbEF3c1NlcnZpY2Uoc2NvcGUsICdEZWxldGVGcm9tUmF3Jywge1xuICAgICAgICBzZXJ2aWNlOiAnczMnLFxuICAgICAgICBhY3Rpb246ICdkZWxldGVPYmplY3QnLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgQnVja2V0OiBKc29uUGF0aC5zdHJpbmdBdCgnJC5jb250ZW50LmJ1Y2tldCcpLFxuICAgICAgICAgIEtleTogSnNvblBhdGguc3RyaW5nQXQoJyQuY29udGVudC5rZXknKSxcbiAgICAgICAgfSxcbiAgICAgICAgaWFtUmVzb3VyY2VzOiBbYCR7YnVja2V0LmJ1Y2tldEFybn0vKmBdLFxuICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiBmYWlsZWRDaGFpbjtcbiAgfVxuXG4gIGNyZWF0ZVN1Y2Nlc3NDaGFpbihzY29wZTogQ29uc3RydWN0KTogQ2hhaW4ge1xuICAgIGNvbnN0IGJ1Y2tldDogQnVja2V0ID0gdGhpcy5yZXNvdXJjZXMuYnVja2V0O1xuXG4gICAgY29uc3QgY2hhaW4gPSBuZXcgQ2FsbEF3c1NlcnZpY2Uoc2NvcGUsICdDb3B5VG9Qcm9jZXNzZWQnLCB7XG4gICAgICBzZXJ2aWNlOiAnczMnLFxuICAgICAgYWN0aW9uOiAnY29weU9iamVjdCcsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIEJ1Y2tldDogSnNvblBhdGguc3RyaW5nQXQoJyQuY29udGVudC5idWNrZXQnKSxcbiAgICAgICAgQ29weVNvdXJjZTogSnNvblBhdGguZm9ybWF0KCd7fS97fScsIEpzb25QYXRoLnN0cmluZ0F0KCckLmNvbnRlbnQuYnVja2V0JyksIEpzb25QYXRoLnN0cmluZ0F0KCckLmNvbnRlbnQua2V5JykpLFxuICAgICAgICBLZXk6IEpzb25QYXRoLmZvcm1hdChgJHt0aGlzLnByZWZpeGVzLnByb2Nlc3NlZH0ve31gLCBKc29uUGF0aC5zdHJpbmdBdCgnJC5jb250ZW50LmZpbGVuYW1lJykpLFxuICAgICAgfSxcbiAgICAgIGlhbVJlc291cmNlczogW2Ake2J1Y2tldC5idWNrZXRBcm59LypgXSxcbiAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgfSkubmV4dChcbiAgICAgIG5ldyBDYWxsQXdzU2VydmljZShzY29wZSwgJ0RlbGV0ZUZyb21SYXdTdWNjZXNzJywge1xuICAgICAgICBzZXJ2aWNlOiAnczMnLFxuICAgICAgICBhY3Rpb246ICdkZWxldGVPYmplY3QnLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgQnVja2V0OiBKc29uUGF0aC5zdHJpbmdBdCgnJC5jb250ZW50LmJ1Y2tldCcpLFxuICAgICAgICAgIEtleTogSnNvblBhdGguc3RyaW5nQXQoJyQuY29udGVudC5rZXknKSxcbiAgICAgICAgfSxcbiAgICAgICAgaWFtUmVzb3VyY2VzOiBbYCR7YnVja2V0LmJ1Y2tldEFybn0vKmBdLFxuICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiBjaGFpbjtcbiAgfVxufSJdfQ==
|
|
@@ -1,10 +1,32 @@
|
|
|
1
1
|
import { LayerVersion } from 'aws-cdk-lib/aws-lambda';
|
|
2
|
+
import { Bucket } from 'aws-cdk-lib/aws-s3';
|
|
2
3
|
import { Construct } from 'constructs';
|
|
3
4
|
import { DocumentProcessingStepType } from './base-document-processing';
|
|
4
5
|
import { BedrockDocumentProcessing, BedrockDocumentProcessingProps } from './bedrock-document-processing';
|
|
5
6
|
export interface AgentProps {
|
|
7
|
+
/**
|
|
8
|
+
* Bucket where the tools are located in
|
|
9
|
+
* Primarily use to grant read permission to the
|
|
10
|
+
* processing agent to access the tools.
|
|
11
|
+
*
|
|
12
|
+
* @default No extra IAM permissions would be automatically
|
|
13
|
+
* assigned to the processing agent.
|
|
14
|
+
*/
|
|
15
|
+
readonly toolsBucket?: Bucket;
|
|
16
|
+
/**
|
|
17
|
+
* System prompt for the agent
|
|
18
|
+
*/
|
|
6
19
|
readonly agentSystemPrompt?: string;
|
|
20
|
+
/**
|
|
21
|
+
* S3 path where the tools are located.
|
|
22
|
+
* The agent would dynamically load the tools
|
|
23
|
+
*/
|
|
7
24
|
readonly toolsLocation?: string[];
|
|
25
|
+
/**
|
|
26
|
+
* If there are python dependencies that are needed by
|
|
27
|
+
* the provided tools, provide the Lambda Layers with the
|
|
28
|
+
* dependencies.
|
|
29
|
+
*/
|
|
8
30
|
readonly lambdaLayers?: LayerVersion[];
|
|
9
31
|
}
|
|
10
32
|
export interface AgenticDocumentProcessingProps extends BedrockDocumentProcessingProps {
|
|
@@ -5,7 +5,6 @@ exports.AgenticDocumentProcessing = void 0;
|
|
|
5
5
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
6
|
const aws_lambda_python_alpha_1 = require("@aws-cdk/aws-lambda-python-alpha");
|
|
7
7
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
8
|
-
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
9
8
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
10
9
|
const aws_stepfunctions_tasks_1 = require("aws-cdk-lib/aws-stepfunctions-tasks");
|
|
11
10
|
const bedrock_document_processing_1 = require("./bedrock-document-processing");
|
|
@@ -21,23 +20,21 @@ class AgenticDocumentProcessing extends bedrock_document_processing_1.BedrockDoc
|
|
|
21
20
|
const fmModel = this.bedrockDocumentProcessingProps.processingModelId || bedrock_document_processing_1.BedrockDocumentProcessing.DEFAULT_PROCESSING_MODEL_ID;
|
|
22
21
|
const adjustedModelId = this.bedrockDocumentProcessingProps.useCrossRegionInference ? `${this.crossRegionInferencePrefix}.${fmModel.modelId}` : fmModel.modelId;
|
|
23
22
|
const role = this.generateLambdaRoleForBedrock(fmModel, 'ProcessingAgentLambdaRole');
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
's3:ListBucket',
|
|
28
|
-
],
|
|
29
|
-
resources: [
|
|
30
|
-
this.bucket.bucketArn,
|
|
31
|
-
],
|
|
32
|
-
}));
|
|
23
|
+
this.ingressAdapter.generateAdapterIAMPolicies(['s3:ListBucket']).forEach((statement) => {
|
|
24
|
+
role.addToPrincipalPolicy(statement);
|
|
25
|
+
});
|
|
33
26
|
const environmentVariables = {
|
|
34
27
|
MODEL_ID: adjustedModelId,
|
|
35
28
|
INVOKE_TYPE: 'agent',
|
|
36
29
|
...powertools_config_1.PowertoolsConfig.generateDefaultLambdaConfig(this.bedrockDocumentProcessingProps.enableObservability, this.metricNamespace, this.metricServiceName),
|
|
37
30
|
};
|
|
38
31
|
this.encryptionKey.grantEncryptDecrypt(role);
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
const toolsBucket = agentProps.processingAgentParameters?.toolsBucket;
|
|
33
|
+
if (toolsBucket) {
|
|
34
|
+
toolsBucket.grantRead(role);
|
|
35
|
+
if (toolsBucket.encryptionKey) {
|
|
36
|
+
toolsBucket.encryptionKey.grantDecrypt(role);
|
|
37
|
+
}
|
|
41
38
|
}
|
|
42
39
|
if (agentProps.processingAgentParameters?.toolsLocation) {
|
|
43
40
|
environmentVariables.TOOLS_CONFIG = JSON.stringify(agentProps.processingAgentParameters?.toolsLocation);
|
|
@@ -87,5 +84,5 @@ class AgenticDocumentProcessing extends bedrock_document_processing_1.BedrockDoc
|
|
|
87
84
|
}
|
|
88
85
|
exports.AgenticDocumentProcessing = AgenticDocumentProcessing;
|
|
89
86
|
_a = JSII_RTTI_SYMBOL_1;
|
|
90
|
-
AgenticDocumentProcessing[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.AgenticDocumentProcessing", version: "1.0
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOEVBQWtFO0FBQ2xFLDZDQUE4QztBQUM5QyxpREFBOEQ7QUFDOUQsdURBQW9FO0FBQ3BFLGlGQUFtRTtBQUduRSwrRUFBMEc7QUFDMUcsNENBQStDO0FBQy9DLDRDQUE4QztBQUM5QyxvRkFBZ0Y7QUFZaEYsTUFBYSx5QkFBMEIsU0FBUSx1REFBeUI7SUFDdEUsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFxQztRQUM3RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRVMsY0FBYztRQUN0QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsOEJBQWdFLENBQUM7UUFDekYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLGlCQUFpQixJQUFJLHVEQUF5QixDQUFDLDJCQUEyQixDQUFDO1FBQy9ILE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2hLLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSx5QkFBZSxDQUFDO1lBQzVDLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7WUFDcEIsT0FBTyxFQUFFO2dCQUNQLGVBQWU7YUFDaEI7WUFDRCxTQUFTLEVBQUU7Z0JB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LDhCQUE4QixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hELGVBQWUsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLENBQUMsMEJBQWMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUVELE9BQU8sSUFBSSxzQ0FBWSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUM5QyxjQUFjLEVBQUUsZUFBZTtZQUMvQixVQUFVLEVBQUUsb0JBQW9CO1lBQ2hDLGNBQWMsRUFBRTtnQkFDZCxVQUFVLEVBQUUsa0JBQWtCO2FBQy9CO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFyRkgsOERBc0ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHl0aG9uRnVuY3Rpb24gfSBmcm9tICdAYXdzLWNkay9hd3MtbGFtYmRhLXB5dGhvbi1hbHBoYSc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQXJjaGl0ZWN0dXJlLCBMYXllclZlcnNpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IExhbWJkYUludm9rZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zLXRhc2tzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfSBmcm9tICcuL2Jhc2UtZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5pbXBvcnQgeyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nLCBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMgfSBmcm9tICcuL2JlZHJvY2stZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5pbXBvcnQgeyBEZWZhdWx0UnVudGltZXMgfSBmcm9tICcuLi9mcmFtZXdvcmsnO1xuaW1wb3J0IHsgTGFtYmRhSWFtVXRpbHMgfSBmcm9tICcuLi91dGlsaXRpZXMnO1xuaW1wb3J0IHsgUG93ZXJ0b29sc0NvbmZpZyB9IGZyb20gJy4uL3V0aWxpdGllcy9vYnNlcnZhYmlsaXR5L3Bvd2VydG9vbHMtY29uZmlnJztcblxuZXhwb3J0IGludGVyZmFjZSBBZ2VudFByb3BzIHtcbiAgcmVhZG9ubHkgYWdlbnRTeXN0ZW1Qcm9tcHQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRvb2xzTG9jYXRpb24/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgbGFtYmRhTGF5ZXJzPzogTGF5ZXJWZXJzaW9uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIGV4dGVuZHMgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIHtcbiAgcmVhZG9ubHkgcHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVycz86IEFnZW50UHJvcHM7XG59XG5cbmV4cG9ydCBjbGFzcyBBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nIGV4dGVuZHMgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgY29uc3QgYWdlbnRQcm9wcyA9IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIGFzIEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmdQcm9wcztcbiAgICBjb25zdCBmbU1vZGVsID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucHJvY2Vzc2luZ01vZGVsSWQgfHwgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZy5ERUZBVUxUX1BST0NFU1NJTkdfTU9ERUxfSUQ7XG4gICAgY29uc3QgYWRqdXN0ZWRNb2RlbElkID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMudXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2UgPyBgJHt0aGlzLmNyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4fS4ke2ZtTW9kZWwubW9kZWxJZH1gIDogZm1Nb2RlbC5tb2RlbElkO1xuICAgIGNvbnN0IHJvbGUgPSB0aGlzLmdlbmVyYXRlTGFtYmRhUm9sZUZvckJlZHJvY2soZm1Nb2RlbCwgJ1Byb2Nlc3NpbmdBZ2VudExhbWJkYVJvbGUnKTtcbiAgICByb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdzMzpMaXN0QnVja2V0JyxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgdGhpcy5idWNrZXQuYnVja2V0QXJuLFxuICAgICAgXSxcbiAgICB9KSk7XG4gICAgY29uc3QgZW52aXJvbm1lbnRWYXJpYWJsZXM6UmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIE1PREVMX0lEOiBhZGp1c3RlZE1vZGVsSWQsXG4gICAgICBJTlZPS0VfVFlQRTogJ2FnZW50JyxcbiAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICB0aGlzLm1ldHJpY05hbWVzcGFjZSxcbiAgICAgICAgdGhpcy5tZXRyaWNTZXJ2aWNlTmFtZSxcbiAgICAgICksXG4gICAgfTtcblxuICAgIHRoaXMuZW5jcnlwdGlvbktleS5ncmFudEVuY3J5cHREZWNyeXB0KHJvbGUpO1xuICAgIGlmICh0aGlzLmJ1Y2tldEVuY3J5cHRpb25LZXkpIHtcbiAgICAgIHRoaXMuYnVja2V0RW5jcnlwdGlvbktleS5ncmFudEVuY3J5cHREZWNyeXB0KHJvbGUpO1xuICAgIH1cblxuICAgIGlmIChhZ2VudFByb3BzLnByb2Nlc3NpbmdBZ2VudFBhcmFtZXRlcnM/LnRvb2xzTG9jYXRpb24pIHtcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVzLlRPT0xTX0NPTkZJRyA9IEpTT04uc3RyaW5naWZ5KGFnZW50UHJvcHMucHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVycz8udG9vbHNMb2NhdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGFnZW50UHJvcHMucHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVycz8uYWdlbnRTeXN0ZW1Qcm9tcHQpIHtcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVzLlNZU1RFTV9QUk9NUFQgPSBhZ2VudFByb3BzLnByb2Nlc3NpbmdBZ2VudFBhcmFtZXRlcnM/LmFnZW50U3lzdGVtUHJvbXB0O1xuICAgIH1cblxuICAgIGlmIChhZ2VudFByb3BzLnByb2Nlc3NpbmdQcm9tcHQpIHtcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVzLlBST01QVCA9IGFnZW50UHJvcHMucHJvY2Vzc2luZ1Byb21wdDtcbiAgICB9XG5cbiAgICBjb25zdCB7IHJlZ2lvbiwgYWNjb3VudCB9ID0gU3RhY2sub2YodGhpcyk7XG4gICAgY29uc3QgZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMgPSBMYW1iZGFJYW1VdGlscy5jcmVhdGVMb2dzUGVybWlzc2lvbnMoe1xuICAgICAgYWNjb3VudCxcbiAgICAgIGZ1bmN0aW9uTmFtZTogJ2FnZW50aWMtaWRwLXByb2Nlc3NpbmcnLFxuICAgICAgcmVnaW9uLFxuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgIH0pO1xuXG4gICAgY29uc3QgYWdlbnRpY0Z1bmN0aW9uID0gbmV3IFB5dGhvbkZ1bmN0aW9uKHRoaXMsICdQcm9jZXNzaW5nQWdlbnRGdW5jdGlvbicsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMudW5pcXVlRnVuY3Rpb25OYW1lLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuWDg2XzY0LFxuICAgICAgZW50cnk6IGAke19fZGlybmFtZX0vcmVzb3VyY2VzL2RlZmF1bHQtc3RyYW5kcy1hZ2VudGAsXG4gICAgICBydW50aW1lOiBEZWZhdWx0UnVudGltZXMuUFlUSE9OLFxuICAgICAgbGF5ZXJzOiBhZ2VudFByb3BzLnByb2Nlc3NpbmdBZ2VudFBhcmFtZXRlcnM/LmxhbWJkYUxheWVycyxcbiAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudFZhcmlhYmxlcyxcbiAgICAgIHJvbGUsXG4gICAgICB0aW1lb3V0OiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5zdGVwVGltZW91dHMgfHwgRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgIG1lbW9yeVNpemU6IDEwMjQsXG4gICAgICBlbnZpcm9ubWVudEVuY3J5cHRpb246IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICAgIHZwYzogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yayA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsudnBjIDogdW5kZWZpbmVkLFxuICAgICAgdnBjU3VibmV0czogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yayA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnBvbGljeVN0YXRlbWVudHMpIHtcbiAgICAgIGFnZW50aWNGdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrKSB7XG4gICAgICBhZ2VudGljRnVuY3Rpb24ucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3koTGFtYmRhSWFtVXRpbHMuZ2VuZXJhdGVMYW1iZGFWUENQZXJtaXNzaW9ucygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnUHJvY2Vzc2luZ1N0ZXAnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogYWdlbnRpY0Z1bmN0aW9uLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgICByZXN1bHRTZWxlY3Rvcjoge1xuICAgICAgICAncmVzdWx0LiQnOiAnJC5QYXlsb2FkLnJlc3VsdCcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59Il19
|
|
87
|
+
AgenticDocumentProcessing[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.AgenticDocumentProcessing", version: "1.2.0" };
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOEVBQWtFO0FBQ2xFLDZDQUE4QztBQUM5Qyx1REFBb0U7QUFFcEUsaUZBQW1FO0FBR25FLCtFQUEwRztBQUMxRyw0Q0FBK0M7QUFDL0MsNENBQThDO0FBQzlDLG9GQUFnRjtBQW9DaEYsTUFBYSx5QkFBMEIsU0FBUSx1REFBeUI7SUFDdEUsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFxQztRQUM3RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRVMsY0FBYztRQUN0QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsOEJBQWdFLENBQUM7UUFDekYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLGlCQUFpQixJQUFJLHVEQUF5QixDQUFDLDJCQUEyQixDQUFDO1FBQy9ILE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2hLLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUN0RixJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFD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LENBQUM7WUFDakUsZUFBZSxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEQsZUFBZSxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQywwQkFBYyxDQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBRUQsT0FBTyxJQUFJLHNDQUFZLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzlDLGNBQWMsRUFBRSxlQUFlO1lBQy9CLFVBQVUsRUFBRSxvQkFBb0I7WUFDaEMsY0FBYyxFQUFFO2dCQUNkLFVBQVUsRUFBRSxrQkFBa0I7YUFDL0I7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQXRGSCw4REF1RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQeXRob25GdW5jdGlvbiB9IGZyb20gJ0Bhd3MtY2RrL2F3cy1sYW1iZGEtcHl0aG9uLWFscGhhJztcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEFyY2hpdGVjdHVyZSwgTGF5ZXJWZXJzaW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgTGFtYmRhSW52b2tlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB9IGZyb20gJy4vYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmltcG9ydCB7IEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcsIEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcyB9IGZyb20gJy4vYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmltcG9ydCB7IERlZmF1bHRSdW50aW1lcyB9IGZyb20gJy4uL2ZyYW1ld29yayc7XG5pbXBvcnQgeyBMYW1iZGFJYW1VdGlscyB9IGZyb20gJy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBQb3dlcnRvb2xzQ29uZmlnIH0gZnJvbSAnLi4vdXRpbGl0aWVzL29ic2VydmFiaWxpdHkvcG93ZXJ0b29scy1jb25maWcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50UHJvcHMge1xuICAvKipcbiAgICogQnVja2V0IHdoZXJlIHRoZSB0b29scyBhcmUgbG9jYXRlZCBpblxuICAgKiBQcmltYXJpbHkgdXNlIHRvIGdyYW50IHJlYWQgcGVybWlzc2lvbiB0byB0aGVcbiAgICogcHJvY2Vzc2luZyBhZ2VudCB0byBhY2Nlc3MgdGhlIHRvb2xzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBleHRyYSBJQU0gcGVybWlzc2lvbnMgd291bGQgYmUgYXV0b21hdGljYWxseVxuICAgKiBhc3NpZ25lZCB0byB0aGUgcHJvY2Vzc2luZyBhZ2VudC5cbiAgICovXG4gIHJlYWRvbmx5IHRvb2xzQnVja2V0PzogQnVja2V0O1xuXG4gIC8qKlxuICAgKiBTeXN0ZW0gcHJvbXB0IGZvciB0aGUgYWdlbnRcbiAgICovXG4gIHJlYWRvbmx5IGFnZW50U3lzdGVtUHJvbXB0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTMyBwYXRoIHdoZXJlIHRoZSB0b29scyBhcmUgbG9jYXRlZC5cbiAgICogVGhlIGFnZW50IHdvdWxkIGR5bmFtaWNhbGx5IGxvYWQgdGhlIHRvb2xzXG4gICAqL1xuICByZWFkb25seSB0b29sc0xvY2F0aW9uPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIElmIHRoZXJlIGFyZSBweXRob24gZGVwZW5kZW5jaWVzIHRoYXQgYXJlIG5lZWRlZCBieVxuICAgKiB0aGUgcHJvdmlkZWQgdG9vbHMsIHByb3ZpZGUgdGhlIExhbWJkYSBMYXllcnMgd2l0aCB0aGVcbiAgICogZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFtYmRhTGF5ZXJzPzogTGF5ZXJWZXJzaW9uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIGV4dGVuZHMgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIHtcbiAgcmVhZG9ubHkgcHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVycz86IEFnZW50UHJvcHM7XG59XG5cbmV4cG9ydCBjbGFzcyBBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nIGV4dGVuZHMgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgY29uc3QgYWdlbnRQcm9wcyA9IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIGFzIEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmdQcm9wcztcbiAgICBjb25zdCBmbU1vZGVsID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucHJvY2Vzc2luZ01vZGVsSWQgfHwgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZy5ERUZBVUxUX1BST0NFU1NJTkdfTU9ERUxfSUQ7XG4gICAgY29uc3QgYWRqdXN0ZWRNb2RlbElkID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMudXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2UgPyBgJHt0aGlzLmNyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4fS4ke2ZtTW9kZWwubW9kZWxJZH1gIDogZm1Nb2RlbC5tb2RlbElkO1xuICAgIGNvbnN0IHJvbGUgPSB0aGlzLmdlbmVyYXRlTGFtYmRhUm9sZUZvckJlZHJvY2soZm1Nb2RlbCwgJ1Byb2Nlc3NpbmdBZ2VudExhbWJkYVJvbGUnKTtcbiAgICB0aGlzLmluZ3Jlc3NBZGFwdGVyLmdlbmVyYXRlQWRhcHRlcklBTVBvbGljaWVzKFsnczM6TGlzdEJ1Y2tldCddKS5mb3JFYWNoKChzdGF0ZW1lbnQpID0+IHtcbiAgICAgIHJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgICB9KTtcbiAgICBjb25zdCBlbnZpcm9ubWVudFZhcmlhYmxlczpSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgTU9ERUxfSUQ6IGFkanVzdGVkTW9kZWxJZCxcbiAgICAgIElOVk9LRV9UWVBFOiAnYWdlbnQnLFxuICAgICAgLi4uUG93ZXJ0b29sc0NvbmZpZy5nZW5lcmF0ZURlZmF1bHRMYW1iZGFDb25maWcoXG4gICAgICAgIHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICAgIHRoaXMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICB0aGlzLm1ldHJpY1NlcnZpY2VOYW1lLFxuICAgICAgKSxcbiAgICB9O1xuXG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG5cbiAgICBjb25zdCB0b29sc0J1Y2tldCA9IGFnZW50UHJvcHMucHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVycz8udG9vbHNCdWNrZXQ7XG5cbiAgICBpZiAodG9vbHNCdWNrZXQpIHtcbiAgICAgIHRvb2xzQnVja2V0LmdyYW50UmVhZChyb2xlKTtcblxuICAgICAgaWYgKHRvb2xzQnVja2V0LmVuY3J5cHRpb25LZXkpIHtcbiAgICAgICAgdG9vbHNCdWNrZXQuZW5jcnlwdGlvbktleS5ncmFudERlY3J5cHQocm9sZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFnZW50UHJvcHMucHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVycz8udG9vbHNMb2NhdGlvbikge1xuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXMuVE9PTFNfQ09ORklHID0gSlNPTi5zdHJpbmdpZnkoYWdlbnRQcm9wcy5wcm9jZXNzaW5nQWdlbnRQYXJhbWV0ZXJzPy50b29sc0xvY2F0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoYWdlbnRQcm9wcy5wcm9jZXNzaW5nQWdlbnRQYXJhbWV0ZXJzPy5hZ2VudFN5c3RlbVByb21wdCkge1xuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXMuU1lTVEVNX1BST01QVCA9IGFnZW50UHJvcHMucHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVycz8uYWdlbnRTeXN0ZW1Qcm9tcHQ7XG4gICAgfVxuXG4gICAgaWYgKGFnZW50UHJvcHMucHJvY2Vzc2luZ1Byb21wdCkge1xuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXMuUFJPTVBUID0gYWdlbnRQcm9wcy5wcm9jZXNzaW5nUHJvbXB0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucyA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICBhY2NvdW50LFxuICAgICAgZnVuY3Rpb25OYW1lOiAnYWdlbnRpYy1pZHAtcHJvY2Vzc2luZycsXG4gICAgICByZWdpb24sXG4gICAgICBzY29wZTogdGhpcyxcbiAgICAgIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgfSk7XG5cbiAgICBjb25zdCBhZ2VudGljRnVuY3Rpb24gPSBuZXcgUHl0aG9uRnVuY3Rpb24odGhpcywgJ1Byb2Nlc3NpbmdBZ2VudEZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy51bmlxdWVGdW5jdGlvbk5hbWUsXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgICBlbnRyeTogYCR7X19kaXJuYW1lfS9yZXNvdXJjZXMvZGVmYXVsdC1zdHJhbmRzLWFnZW50YCxcbiAgICAgIHJ1bnRpbWU6IERlZmF1bHRSdW50aW1lcy5QWVRIT04sXG4gICAgICBsYXllcnM6IGFnZW50UHJvcHMucHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVycz8ubGFtYmRhTGF5ZXJzLFxuICAgICAgZW52aXJvbm1lbnQ6IGVudmlyb25tZW50VmFyaWFibGVzLFxuICAgICAgcm9sZSxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnN0ZXBUaW1lb3V0cyB8fCBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgbWVtb3J5U2l6ZTogMTAyNCxcbiAgICAgIGVudmlyb25tZW50RW5jcnlwdGlvbjogdGhpcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgdnBjOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrID8gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yay52cGMgOiB1bmRlZmluZWQsXG4gICAgICB2cGNTdWJuZXRzOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrID8gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yay5hcHBsaWNhdGlvblN1Ym5ldFNlbGVjdGlvbigpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMucG9saWN5U3RhdGVtZW50cykge1xuICAgICAgYWdlbnRpY0Z1bmN0aW9uLnJvbGU/LmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmspIHtcbiAgICAgIGFnZW50aWNGdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShMYW1iZGFJYW1VdGlscy5nZW5lcmF0ZUxhbWJkYVZQQ1Blcm1pc3Npb25zKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdQcm9jZXNzaW5nU3RlcCcsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiBhZ2VudGljRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wcm9jZXNzaW5nUmVzdWx0JyxcbiAgICAgIHJlc3VsdFNlbGVjdG9yOiB7XG4gICAgICAgICdyZXN1bHQuJCc6ICckLlBheWxvYWQucmVzdWx0JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn0iXX0=
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { Duration, RemovalPolicy } from 'aws-cdk-lib';
|
|
2
2
|
import { IMetric } from 'aws-cdk-lib/aws-cloudwatch';
|
|
3
3
|
import { Table } from 'aws-cdk-lib/aws-dynamodb';
|
|
4
|
-
import {
|
|
5
|
-
import { Bucket } from 'aws-cdk-lib/aws-s3';
|
|
6
|
-
import { Queue } from 'aws-cdk-lib/aws-sqs';
|
|
4
|
+
import { Key } from 'aws-cdk-lib/aws-kms';
|
|
7
5
|
import { StateMachine } from 'aws-cdk-lib/aws-stepfunctions';
|
|
8
6
|
import { BedrockInvokeModel, LambdaInvoke, StepFunctionsStartExecution } from 'aws-cdk-lib/aws-stepfunctions-tasks';
|
|
9
7
|
import { Construct } from 'constructs';
|
|
8
|
+
import { IAdapter } from './adapter';
|
|
10
9
|
import { Network } from '../framework';
|
|
11
10
|
import { EventbridgeBroker } from '../framework/foundation/eventbridge-broker';
|
|
12
11
|
import { LogGroupDataProtectionProps } from '../utilities';
|
|
@@ -16,27 +15,16 @@ import { IObservable, ObservableProps } from '../utilities/observability/observa
|
|
|
16
15
|
*/
|
|
17
16
|
export interface BaseDocumentProcessingProps extends ObservableProps {
|
|
18
17
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* Adapter that defines how the document processing workflow is triggered
|
|
19
|
+
*
|
|
20
|
+
* @default QueuedS3Adapter
|
|
21
21
|
*/
|
|
22
|
-
readonly
|
|
22
|
+
readonly ingressAdapter?: IAdapter;
|
|
23
23
|
/**
|
|
24
24
|
* DynamoDB table for storing document processing metadata and workflow state.
|
|
25
25
|
* If not provided, a new table will be created with DocumentId as partition key.
|
|
26
26
|
*/
|
|
27
27
|
readonly documentProcessingTable?: Table;
|
|
28
|
-
/**
|
|
29
|
-
* SQS queue visibility timeout for processing messages.
|
|
30
|
-
* Should be longer than expected processing time to prevent duplicate processing.
|
|
31
|
-
* @default Duration.seconds(300)
|
|
32
|
-
*/
|
|
33
|
-
readonly queueVisibilityTimeout?: Duration;
|
|
34
|
-
/**
|
|
35
|
-
* The number of times a message can be unsuccessfully dequeued before being moved to the dead-letter queue.
|
|
36
|
-
*
|
|
37
|
-
* @default 5
|
|
38
|
-
*/
|
|
39
|
-
readonly dlqMaxReceiveCount?: number;
|
|
40
28
|
/**
|
|
41
29
|
* Maximum execution time for the Step Functions workflow.
|
|
42
30
|
* @default Duration.minutes(30)
|
|
@@ -68,22 +56,6 @@ export interface BaseDocumentProcessingProps extends ObservableProps {
|
|
|
68
56
|
*/
|
|
69
57
|
readonly encryptionKey?: Key;
|
|
70
58
|
}
|
|
71
|
-
/**
|
|
72
|
-
* S3 prefix constants for organizing documents throughout the processing lifecycle.
|
|
73
|
-
*
|
|
74
|
-
* Documents flow through these prefixes based on processing outcomes:
|
|
75
|
-
* - Upload → raw/ (triggers processing)
|
|
76
|
-
* - Success → processed/ (workflow completed successfully)
|
|
77
|
-
* - Failure → failed/ (workflow encountered errors)
|
|
78
|
-
*/
|
|
79
|
-
export declare enum DocumentProcessingPrefix {
|
|
80
|
-
/** Prefix for newly uploaded documents awaiting processing */
|
|
81
|
-
RAW = "raw/",
|
|
82
|
-
/** Prefix for documents that failed processing */
|
|
83
|
-
FAILED = "failed/",
|
|
84
|
-
/** Prefix for successfully processed documents */
|
|
85
|
-
PROCESSED = "processed/"
|
|
86
|
-
}
|
|
87
59
|
/**
|
|
88
60
|
* Union type for Step Functions tasks that can be used in document processing workflows.
|
|
89
61
|
* Supports Bedrock model invocation, Lambda function invocation, and nested Step Functions execution.
|
|
@@ -118,20 +90,14 @@ export declare abstract class BaseDocumentProcessing extends Construct implement
|
|
|
118
90
|
readonly metricNamespace: string;
|
|
119
91
|
/** log group data protection configuration */
|
|
120
92
|
readonly logGroupDataProtection: LogGroupDataProtectionProps;
|
|
121
|
-
/** S3 bucket for document storage with organized prefixes (raw/, processed/, failed/) */
|
|
122
|
-
readonly bucket: Bucket;
|
|
123
|
-
/** SQS queue for reliable message processing with dead letter queue support */
|
|
124
|
-
readonly queue: Queue;
|
|
125
93
|
/** DynamoDB table for storing document processing metadata and workflow state */
|
|
126
94
|
readonly documentProcessingTable: Table;
|
|
127
95
|
/** Configuration properties for the document processing pipeline */
|
|
128
96
|
private readonly props;
|
|
129
|
-
/** Dead letter queue */
|
|
130
|
-
readonly deadLetterQueue: Queue;
|
|
131
97
|
/** KMS key */
|
|
132
98
|
readonly encryptionKey: Key;
|
|
133
|
-
/**
|
|
134
|
-
readonly
|
|
99
|
+
/** Ingress adapter, responsible for triggering workflow */
|
|
100
|
+
readonly ingressAdapter: IAdapter;
|
|
135
101
|
/**
|
|
136
102
|
* Creates a new BaseDocumentProcessing construct.
|
|
137
103
|
*
|
|
@@ -144,8 +110,6 @@ export declare abstract class BaseDocumentProcessing extends Construct implement
|
|
|
144
110
|
*/
|
|
145
111
|
constructor(scope: Construct, id: string, props: BaseDocumentProcessingProps);
|
|
146
112
|
protected handleStateMachineCreation(stateMachineId: string): StateMachine;
|
|
147
|
-
protected handleWorkflowTrigger(stateMachine: StateMachine): void;
|
|
148
|
-
private createSQSConsumerLambda;
|
|
149
113
|
private createStateMachineRole;
|
|
150
114
|
private createMoveToFailedChain;
|
|
151
115
|
private createMoveToProcessedChain;
|