@cdklabs/cdk-appmod-catalog-blueprints 1.2.2 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/.jsii +804 -173
  2. package/README.md +76 -98
  3. package/lib/document-processing/adapter/queued-s3-adapter.js +1 -1
  4. package/lib/document-processing/agentic-document-processing.d.ts +5 -28
  5. package/lib/document-processing/agentic-document-processing.js +8 -63
  6. package/lib/document-processing/base-document-processing.js +4 -20
  7. package/lib/document-processing/bedrock-document-processing.d.ts +4 -32
  8. package/lib/document-processing/bedrock-document-processing.js +10 -37
  9. package/lib/document-processing/default-document-processing-config.js +1 -1
  10. package/lib/document-processing/tests/agentic-document-processing-nag.test.js +12 -11
  11. package/lib/document-processing/tests/agentic-document-processing.test.js +136 -67
  12. package/lib/document-processing/tests/base-document-processing-nag.test.d.ts +1 -0
  13. package/lib/document-processing/tests/base-document-processing-nag.test.js +161 -0
  14. package/lib/document-processing/tests/base-document-processing.test.d.ts +1 -0
  15. package/lib/document-processing/tests/base-document-processing.test.js +499 -0
  16. package/lib/document-processing/tests/bedrock-document-processing-nag.test.js +3 -2
  17. package/lib/document-processing/tests/bedrock-document-processing.test.js +221 -40
  18. package/lib/document-processing/tests/queued-s3-adapter-nag.test.d.ts +1 -0
  19. package/lib/document-processing/tests/queued-s3-adapter-nag.test.js +122 -0
  20. package/lib/document-processing/tests/queued-s3-adapter.test.d.ts +1 -0
  21. package/lib/document-processing/tests/queued-s3-adapter.test.js +276 -0
  22. package/lib/framework/agents/base-agent.d.ts +90 -0
  23. package/lib/framework/agents/base-agent.js +55 -0
  24. package/lib/framework/agents/batch-agent.d.ts +11 -0
  25. package/lib/framework/agents/batch-agent.js +64 -0
  26. package/lib/framework/agents/default-agent-config.d.ts +3 -0
  27. package/lib/framework/agents/default-agent-config.js +12 -0
  28. package/lib/framework/agents/index.d.ts +3 -0
  29. package/lib/framework/agents/index.js +20 -0
  30. package/lib/framework/agents/resources/default-strands-agent/batch.py +99 -0
  31. package/lib/framework/agents/resources/default-strands-agent/models.py +7 -0
  32. package/lib/framework/agents/resources/default-strands-agent/requirements.txt +7 -0
  33. package/lib/framework/agents/resources/default-strands-agent/utils.py +36 -0
  34. package/lib/framework/bedrock/bedrock.d.ts +38 -0
  35. package/lib/framework/bedrock/bedrock.js +54 -0
  36. package/lib/framework/bedrock/index.d.ts +1 -0
  37. package/lib/framework/bedrock/index.js +18 -0
  38. package/lib/framework/custom-resource/default-runtimes.js +1 -1
  39. package/lib/framework/foundation/access-log.js +1 -1
  40. package/lib/framework/foundation/eventbridge-broker.js +1 -1
  41. package/lib/framework/foundation/network.js +1 -1
  42. package/lib/framework/index.d.ts +2 -0
  43. package/lib/framework/index.js +3 -1
  44. package/lib/framework/tests/access-log.test.d.ts +1 -0
  45. package/lib/framework/tests/access-log.test.js +146 -0
  46. package/lib/framework/tests/batch-agent.test.d.ts +1 -0
  47. package/lib/framework/tests/batch-agent.test.js +164 -0
  48. package/lib/framework/tests/bedrock.test.d.ts +1 -0
  49. package/lib/framework/tests/bedrock.test.js +68 -0
  50. package/lib/framework/tests/eventbridge-broker.test.d.ts +1 -0
  51. package/lib/framework/tests/eventbridge-broker.test.js +73 -0
  52. package/lib/framework/tests/framework-nag.test.d.ts +1 -0
  53. package/lib/framework/tests/framework-nag.test.js +155 -0
  54. package/lib/framework/tests/network.test.d.ts +1 -0
  55. package/lib/framework/tests/network.test.js +120 -0
  56. package/lib/tsconfig.tsbuildinfo +1 -1
  57. package/lib/utilities/data-loader.js +1 -1
  58. package/lib/utilities/lambda-iam-utils.js +4 -3
  59. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
  60. package/lib/utilities/observability/default-observability-config.js +1 -1
  61. package/lib/utilities/observability/index.d.ts +1 -0
  62. package/lib/utilities/observability/index.js +2 -1
  63. package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
  64. package/lib/utilities/observability/log-group-data-protection-utils.d.ts +6 -0
  65. package/lib/utilities/observability/log-group-data-protection-utils.js +37 -0
  66. package/lib/utilities/observability/powertools-config.js +1 -1
  67. package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
  68. package/lib/webapp/frontend-construct.js +1 -1
  69. package/package.json +8 -8
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const aws_cdk_lib_1 = require("aws-cdk-lib");
4
4
  const assertions_1 = require("aws-cdk-lib/assertions");
5
5
  const aws_s3_1 = require("aws-cdk-lib/aws-s3");
6
+ const aws_s3_assets_1 = require("aws-cdk-lib/aws-s3-assets");
6
7
  const cdk_nag_1 = require("cdk-nag");
7
8
  const framework_1 = require("../../framework");
8
9
  const adapter_1 = require("../adapter");
@@ -25,23 +26,23 @@ const bucket = new aws_s3_1.Bucket(stack, 'AgenticDocumentProcessingBucket', {
25
26
  const adapter = new adapter_1.QueuedS3Adapter({
26
27
  bucket,
27
28
  });
29
+ const systemPrompt = new aws_s3_assets_1.Asset(stack, 'SystemPrompt', {
30
+ path: __dirname + '/../resources/default-strands-agent',
31
+ });
28
32
  // Create the main AgenticDocumentProcessing construct
29
33
  new agentic_document_processing_1.AgenticDocumentProcessing(stack, 'AgenticDocumentProcessing', {
30
34
  ingressAdapter: adapter,
31
- useCrossRegionInference: true,
32
35
  processingAgentParameters: {
33
- agentSystemPrompt: `
34
- You're an insurance claims specialist. Use the provided tools to ensure that the submitted claims and supporting documents are valid and there are no discrepancies.
35
- `,
36
- toolsLocation: [
37
- `s3://${bucket.bucketName}/agentic-tools/download_policy.py`,
38
- `s3://${bucket.bucketName}/agentic-tools/download_supporting_documents.py`,
39
- ],
40
- },
41
- processingPrompt: `
36
+ agentName: 'ClaimsSpecialist',
37
+ agentDefinition: {
38
+ bedrockModel: { useCrossRegionInference: true },
39
+ systemPrompt,
40
+ },
41
+ prompt: `
42
42
  Analyze the attached insurance claim document and check if this is a valid claim or not.
43
43
  Final output should in JSON format with claim_approved and justification fields.
44
44
  `,
45
+ },
45
46
  enableObservability: true,
46
47
  });
47
48
  // Suppress CDK-managed BucketNotificationsHandler AWS managed policy
@@ -108,4 +109,4 @@ test('No unsuppressed errors', () => {
108
109
  }
109
110
  expect(errors).toHaveLength(0);
110
111
  });
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQWtEO0FBQ2xELHVEQUE0RDtBQUM1RCwrQ0FBNEM7QUFDNUMscUNBQThEO0FBQzlELCtDQUE0QztBQUM1Qyx3Q0FBNkM7QUFDN0MsZ0ZBQTJFO0FBRTNFLHVCQUF1QjtBQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztBQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRTtJQUN4QyxHQUFHLEVBQUU7UUFDSCxPQUFPLEVBQUUsY0FBYztRQUN2QixNQUFNLEVBQUUsV0FBVztLQUNwQjtDQUNGLENBQUMsQ0FBQztBQUVILE1BQU0sU0FBUyxHQUFHLElBQUkscUJBQVMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFFcEQscUNBQXFDO0FBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEtBQUssRUFBRSxpQ0FBaUMsRUFBRTtJQUNsRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsTUFBTTtJQUN4QyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsWUFBWTtJQUM5QyxVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDLENBQUM7QUFFSCxNQUFNLE9BQU8sR0FBRyxJQUFJLHlCQUFlLENBQUM7SUFDbEMsTUFBTTtDQUNQLENBQUMsQ0FBQztBQUVILHNEQUFzRDtBQUN0RCxJQUFJLHVEQUF5QixDQUFDLEtBQUssRUFBRSwyQkFBMkIsRUFBRTtJQUNoRSxjQUFjLEVBQUUsT0FBTztJQUN2Qix1QkFBdUIsRUFBRSxJQUFJO0lBQzdCLHlCQUF5QixFQUFFO1FB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LE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcCwgU3RhY2ssIEFzcGVjdHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgTWF0Y2ggfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBBd3NTb2x1dGlvbnNDaGVja3MsIE5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ2Nkay1uYWcnO1xuaW1wb3J0IHsgQWNjZXNzTG9nIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrJztcbmltcG9ydCB7IFF1ZXVlZFMzQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXInO1xuaW1wb3J0IHsgQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZyB9IGZyb20gJy4uL2FnZW50aWMtZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5cbi8vIENyZWF0ZSBhcHAgYW5kIHN0YWNrXG5jb25zdCBhcHAgPSBuZXcgQXBwKCk7XG5jb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsICdUZXN0U3RhY2snLCB7XG4gIGVudjoge1xuICAgIGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLFxuICAgIHJlZ2lvbjogJ3VzLWVhc3QtMScsXG4gIH0sXG59KTtcblxuY29uc3QgYWNjZXNzTG9nID0gbmV3IEFjY2Vzc0xvZyhzdGFjaywgJ0FjY2Vzc0xvZycpO1xuXG4vLyBDcmVhdGUgUzMgYnVja2V0IGZvciBhZ2VudGljIHRvb2xzXG5jb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHN0YWNrLCAnQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldCcsIHtcbiAgc2VydmVyQWNjZXNzTG9nc0J1Y2tldDogYWNjZXNzTG9nLmJ1Y2tldCxcbiAgc2VydmVyQWNjZXNzTG9nc1ByZWZpeDogYWNjZXNzTG9nLmJ1Y2tldFByZWZpeCxcbiAgZW5mb3JjZVNTTDogdHJ1ZSxcbn0pO1xuXG5jb25zdCBhZGFwdGVyID0gbmV3IFF1ZXVlZFMzQWRhcHRlcih7XG4gIGJ1Y2tldCxcbn0pO1xuXG4vLyBDcmVhdGUgdGhlIG1haW4gQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZyBjb25zdHJ1Y3Rcbm5ldyBBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nKHN0YWNrLCAnQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZycsIHtcbiAgaW5ncmVzc0FkYXB0ZXI6IGFkYXB0ZXIsXG4gIHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlLFxuICBwcm9jZXNzaW5nQWdlbnRQYXJhbWV0ZXJzOiB7XG4gICAgYWdlbnRTeXN0ZW1Qcm9tcHQ6IGBcbiAgICAgIFlvdSdyZSBhbiBpbnN1cmFuY2UgY2xhaW1zIHNwZWNpYWxpc3QuIFVzZSB0aGUgcHJvdmlkZWQgdG9vbHMgdG8gZW5zdXJlIHRoYXQgdGhlIHN1Ym1pdHRlZCBjbGFpbXMgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRzIGFyZSB2YWxpZCBhbmQgdGhlcmUgYXJlIG5vIGRpc2NyZXBhbmNpZXMuXG4gICAgYCxcbiAgICB0b29sc0xvY2F0aW9uOiBbXG4gICAgICBgczM6Ly8ke2J1Y2tldC5idWNrZXROYW1lfS9hZ2VudGljLXRvb2xzL2Rvd25sb2FkX3BvbGljeS5weWAsXG4gICAgICBgczM6Ly8ke2J1Y2tldC5idWNrZXROYW1lfS9hZ2VudGljLXRvb2xzL2Rvd25sb2FkX3N1cHBvcnRpbmdfZG9jdW1lbnRzLnB5YCxcbiAgICBdLFxuICB9LFxuICBwcm9jZXNzaW5nUHJvbXB0OiBgXG4gICAgQW5hbHl6ZSB0aGUgYXR0YWNoZWQgaW5zdXJhbmNlIGNsYWltIGRvY3VtZW50IGFuZCBjaGVjayBpZiB0aGlzIGlzIGEgdmFsaWQgY2xhaW0gb3Igbm90LlxuICAgIEZpbmFsIG91dHB1dCBzaG91bGQgaW4gSlNPTiBmb3JtYXQgd2l0aCBjbGFpbV9hcHByb3ZlZCBhbmQganVzdGlmaWNhdGlvbiBmaWVsZHMuXG4gIGAsXG4gIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRydWUsXG59KTtcblxuLy8gU3VwcHJlc3MgQ0RLLW1hbmFnZWQgQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIgQVdTIG1hbmFnZWQgcG9saWN5XG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnNCeVBhdGgoXG4gIHN0YWNrLFxuICAnL1Rlc3RTdGFjay9CdWNrZXROb3RpZmljYXRpb25zSGFuZGxlcjA1MGEwNTg3Yjc1NDQ1NDdiZjMyNWYwOTRhM2RiODM0L1JvbGUnLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICByZWFzb246ICdDREstbWFuYWdlZCBCdWNrZXROb3RpZmljYXRpb25zSGFuZGxlciByZXF1aXJlcyBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUgZm9yIFMzIGV2ZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1BvbGljeTo6YXJuOjxBV1M6OlBhcnRpdGlvbj46aWFtOjphd3M6cG9saWN5L3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUnXSxcbiAgICB9LFxuICBdLFxuKTtcblxuLy8gU3VwcHJlc3MgUzMgYnVja2V0IHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgcm9sZXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBmdW5jdGlvbnMgcmVxdWlyZSB3aWxkY2FyZCBhY2Nlc3MgdG8gUzMgYnVja2V0IG9iamVjdHMgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1Jlc291cmNlOjo8QWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldEM0RTI1NEVDLkFybj4vKiddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWwgd2lsZGNhcmQgcGVybWlzc2lvbnNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0Nyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgcmVxdWlyZXMgd2lsZGNhcmQgcmVnaW9uIGFjY2VzcyB0byBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWxzJyxcbiAgICAgIGFwcGxpZXNUbzogWydSZXNvdXJjZTo6YXJuOmF3czpiZWRyb2NrOio6OmZvdW5kYXRpb24tbW9kZWwvYW50aHJvcGljLmNsYXVkZS0zLTctc29ubmV0LTIwMjUwMjE5LXYxOjAnXSxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgU1FTQ29uc3VtZXJSb2xlIHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgbG9nIHN0cmVhbXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBsb2cgc3RyZWFtIEFSTiBpcyBvbmx5IGtub3duIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgU3RhdGVNYWNoaW5lUm9sZSB3aWxkY2FyZCBwZXJtaXNzaW9ucyBmb3IgTGFtYmRhIGludm9jYXRpb25cbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9uc0J5UGF0aChcbiAgc3RhY2ssXG4gICcvVGVzdFN0YWNrL0FnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcvU3RhdGVNYWNoaW5lUm9sZS9EZWZhdWx0UG9saWN5JyxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnU3RlcCBGdW5jdGlvbnMgcmVxdWlyZXMgd2lsZGNhcmQgcGVybWlzc2lvbnMgdG8gaW52b2tlIExhbWJkYSBmdW5jdGlvbnMgd2l0aCB2ZXJzaW9uLXNwZWNpZmljIEFSTnMnLFxuICAgIH0sXG4gIF0sXG4pO1xuXG4vLyBTdXBwcmVzcyBMYW1iZGEgbG9nIGdyb3VwIHdpbGRjYXJkIHBlcm1pc3Npb25zXG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gIHN0YWNrLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdMYW1iZGEgbG9nIHN0cmVhbSBuYW1lcyBhcmUgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuXG4vLyBBcHBseSBDREsgTmFnIGNoZWNrc1xuQXNwZWN0cy5vZihhcHApLmFkZChuZXcgQXdzU29sdXRpb25zQ2hlY2tzKHsgdmVyYm9zZTogdHJ1ZSB9KSk7XG5cbi8vIFN5bnRoZXNpemUgdGhlIHN0YWNrIGFuZCBjaGVjayBmb3IgdW5zdXBwcmVzc2VkIHdhcm5pbmdzIGFuZCBlcnJvcnNcbmNvbnN0IHdhcm5pbmdzID0gQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5maW5kV2FybmluZygnKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbmNvbnN0IGVycm9ycyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZEVycm9yKCcqJywgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cCgnQXdzU29sdXRpb25zLS4qJykpO1xuXG4vLyBUZXN0OiBObyB1bnN1cHByZXNzZWQgd2FybmluZ3NcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCB3YXJuaW5ncycsICgpID0+IHtcbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZygnQ0RLIE5hZyBXYXJuaW5nczonLCBKU09OLnN0cmluZ2lmeSh3YXJuaW5ncywgbnVsbCwgMikpO1xuICB9XG4gIGV4cGVjdCh3YXJuaW5ncykudG9IYXZlTGVuZ3RoKDApO1xufSk7XG5cbi8vIFRlc3Q6IE5vIHVuc3VwcHJlc3NlZCBlcnJvcnNcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCBlcnJvcnMnLCAoKSA9PiB7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKCdDREsgTmFnIEVycm9yczonLCBKU09OLnN0cmluZ2lmeShlcnJvcnMsIG51bGwsIDIpKTtcbiAgfVxuICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG59KTtcbiJdfQ==
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQWtEO0FBQ2xELHVEQUE0RDtBQUM1RCwrQ0FBNEM7QUFDNUMsNkRBQWtEO0FBQ2xELHFDQUE4RDtBQUM5RCwrQ0FBNEM7QUFDNUMsd0NBQTZDO0FBQzdDLGdGQUEyRTtBQUUzRSx1QkFBdUI7QUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBRyxFQUFFLENBQUM7QUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUU7SUFDeEMsR0FBRyxFQUFFO1FBQ0gsT0FBTyxFQUFFLGNBQWM7UUFDdkIsTUFBTSxFQUFFLFdBQVc7S0FDcEI7Q0FDRixDQUFDLENBQUM7QUFFSCxNQUFNLFNBQVMsR0FBRyxJQUFJLHFCQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBRXBELHFDQUFxQztBQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxLQUFLLEVBQUUsaUNBQWlDLEVBQUU7SUFDbEUsc0JBQXNCLEVBQUUsU0FBUyxDQUFDLE1BQU07SUFDeEMsc0JBQXNCLEVBQUUsU0FBUyxDQUFDLFlBQVk7SUFDOUMsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxPQUFPLEdBQUcsSUFBSSx5QkFBZSxDQUFDO0lBQ2xDLE1BQU07Q0FDUCxDQUFDLENBQUM7QUFFSCxNQUFNLFlBQVksR0FBRyxJQUFJLHFCQUFLLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRTtJQUNwRCxJQUFJLEVBQUUsU0FBUyxHQUFHLHFDQUFxQztDQUN4RCxDQUFDLENBQUM7QUFF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bkMsQ0FBQyxDQUFDLENBQUM7QUFFSCwrQkFBK0I7QUFDL0IsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtJQUNsQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcCwgU3RhY2ssIEFzcGVjdHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgTWF0Y2ggfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuaW1wb3J0IHsgQXdzU29sdXRpb25zQ2hlY2tzLCBOYWdTdXBwcmVzc2lvbnMgfSBmcm9tICdjZGstbmFnJztcbmltcG9ydCB7IEFjY2Vzc0xvZyB9IGZyb20gJy4uLy4uL2ZyYW1ld29yayc7XG5pbXBvcnQgeyBRdWV1ZWRTM0FkYXB0ZXIgfSBmcm9tICcuLi9hZGFwdGVyJztcbmltcG9ydCB7IEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcgfSBmcm9tICcuLi9hZ2VudGljLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG4vLyBDcmVhdGUgYXBwIGFuZCBzdGFja1xuY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJywge1xuICBlbnY6IHtcbiAgICBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJyxcbiAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICB9LFxufSk7XG5cbmNvbnN0IGFjY2Vzc0xvZyA9IG5ldyBBY2Nlc3NMb2coc3RhY2ssICdBY2Nlc3NMb2cnKTtcblxuLy8gQ3JlYXRlIFMzIGJ1Y2tldCBmb3IgYWdlbnRpYyB0b29sc1xuY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldChzdGFjaywgJ0FnZW50aWNEb2N1bWVudFByb2Nlc3NpbmdCdWNrZXQnLCB7XG4gIHNlcnZlckFjY2Vzc0xvZ3NCdWNrZXQ6IGFjY2Vzc0xvZy5idWNrZXQsXG4gIHNlcnZlckFjY2Vzc0xvZ3NQcmVmaXg6IGFjY2Vzc0xvZy5idWNrZXRQcmVmaXgsXG4gIGVuZm9yY2VTU0w6IHRydWUsXG59KTtcblxuY29uc3QgYWRhcHRlciA9IG5ldyBRdWV1ZWRTM0FkYXB0ZXIoe1xuICBidWNrZXQsXG59KTtcblxuY29uc3Qgc3lzdGVtUHJvbXB0ID0gbmV3IEFzc2V0KHN0YWNrLCAnU3lzdGVtUHJvbXB0Jywge1xuICBwYXRoOiBfX2Rpcm5hbWUgKyAnLy4uL3Jlc291cmNlcy9kZWZhdWx0LXN0cmFuZHMtYWdlbnQnLFxufSk7XG5cbi8vIENyZWF0ZSB0aGUgbWFpbiBBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nIGNvbnN0cnVjdFxubmV3IEFnZW50aWNEb2N1bWVudFByb2Nlc3Npbmcoc3RhY2ssICdBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nJywge1xuICBpbmdyZXNzQWRhcHRlcjogYWRhcHRlcixcbiAgcHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVyczoge1xuICAgIGFnZW50TmFtZTogJ0NsYWltc1NwZWNpYWxpc3QnLFxuICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgYmVkcm9ja01vZGVsOiB7IHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlIH0sXG4gICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgfSxcbiAgICBwcm9tcHQ6IGBcbiAgICBBbmFseXplIHRoZSBhdHRhY2hlZCBpbnN1cmFuY2UgY2xhaW0gZG9jdW1lbnQgYW5kIGNoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBjbGFpbSBvciBub3QuXG4gICAgRmluYWwgb3V0cHV0IHNob3VsZCBpbiBKU09OIGZvcm1hdCB3aXRoIGNsYWltX2FwcHJvdmVkIGFuZCBqdXN0aWZpY2F0aW9uIGZpZWxkcy5cbiAgYCxcbiAgfSxcbiAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogdHJ1ZSxcbn0pO1xuXG4vLyBTdXBwcmVzcyBDREstbWFuYWdlZCBCdWNrZXROb3RpZmljYXRpb25zSGFuZGxlciBBV1MgbWFuYWdlZCBwb2xpY3lcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9uc0J5UGF0aChcbiAgc3RhY2ssXG4gICcvVGVzdFN0YWNrL0J1Y2tldE5vdGlmaWNhdGlvbnNIYW5kbGVyMDUwYTA1ODdiNzU0NDU0N2JmMzI1ZjA5NGEzZGI4MzQvUm9sZScsXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JyxcbiAgICAgIHJlYXNvbjogJ0NESy1tYW5hZ2VkIEJ1Y2tldE5vdGlmaWNhdGlvbnNIYW5kbGVyIHJlcXVpcmVzIEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZSBmb3IgUzMgZXZlbnQgcHJvY2Vzc2luZycsXG4gICAgICBhcHBsaWVzVG86IFsnUG9saWN5Ojphcm46PEFXUzo6UGFydGl0aW9uPjppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZSddLFxuICAgIH0sXG4gIF0sXG4pO1xuXG4vLyBTdXBwcmVzcyBTMyBidWNrZXQgd2lsZGNhcmQgcGVybWlzc2lvbnMgZm9yIExhbWJkYSByb2xlc1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnTGFtYmRhIGZ1bmN0aW9ucyByZXF1aXJlIHdpbGRjYXJkIGFjY2VzcyB0byBTMyBidWNrZXQgb2JqZWN0cyBmb3IgZG9jdW1lbnQgcHJvY2Vzc2luZycsXG4gICAgICBhcHBsaWVzVG86IFsnUmVzb3VyY2U6OjxBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nQnVja2V0QzRFMjU0RUMuQXJuPi8qJ10sXG4gICAgfSxcbiAgXSxcbiAgdHJ1ZSxcbik7XG5cbi8vIFN1cHByZXNzIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbCB3aWxkY2FyZCBwZXJtaXNzaW9uc1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnQ3Jvc3MtcmVnaW9uIGluZmVyZW5jZSByZXF1aXJlcyB3aWxkY2FyZCByZWdpb24gYWNjZXNzIHRvIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbHMnLFxuICAgICAgYXBwbGllc1RvOiBbJ1Jlc291cmNlOjphcm46YXdzOmJlZHJvY2s6Kjo6Zm91bmRhdGlvbi1tb2RlbC9hbnRocm9waWMuY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTktdjE6MCddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBTUVNDb25zdW1lclJvbGUgd2lsZGNhcmQgcGVybWlzc2lvbnMgZm9yIExhbWJkYSBsb2cgc3RyZWFtc1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnTGFtYmRhIGxvZyBzdHJlYW0gQVJOIGlzIG9ubHkga25vd24gYXQgcnVudGltZSwgd2lsZGNhcmQgcmVxdWlyZWQgZm9yIENsb3VkV2F0Y2ggTG9ncyBhY2Nlc3MnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBTdGF0ZU1hY2hpbmVSb2xlIHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgaW52b2NhdGlvblxuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zQnlQYXRoKFxuICBzdGFjayxcbiAgJy9UZXN0U3RhY2svQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZy9TdGF0ZU1hY2hpbmVSb2xlL0RlZmF1bHRQb2xpY3knLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdTdGVwIEZ1bmN0aW9ucyByZXF1aXJlcyB3aWxkY2FyZCBwZXJtaXNzaW9ucyB0byBpbnZva2UgTGFtYmRhIGZ1bmN0aW9ucyB3aXRoIHZlcnNpb24tc3BlY2lmaWMgQVJOcycsXG4gICAgfSxcbiAgXSxcbik7XG5cbi8vIFN1cHByZXNzIExhbWJkYSBsb2cgZ3JvdXAgd2lsZGNhcmQgcGVybWlzc2lvbnNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBsb2cgc3RyZWFtIG5hbWVzIGFyZSBnZW5lcmF0ZWQgYXQgcnVudGltZSwgd2lsZGNhcmQgcmVxdWlyZWQgZm9yIENsb3VkV2F0Y2ggTG9ncyBhY2Nlc3MnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG5cbi8vIEFwcGx5IENESyBOYWcgY2hlY2tzXG5Bc3BlY3RzLm9mKGFwcCkuYWRkKG5ldyBBd3NTb2x1dGlvbnNDaGVja3MoeyB2ZXJib3NlOiB0cnVlIH0pKTtcblxuLy8gU3ludGhlc2l6ZSB0aGUgc3RhY2sgYW5kIGNoZWNrIGZvciB1bnN1cHByZXNzZWQgd2FybmluZ3MgYW5kIGVycm9yc1xuY29uc3Qgd2FybmluZ3MgPSBBbm5vdGF0aW9ucy5mcm9tU3RhY2soc3RhY2spLmZpbmRXYXJuaW5nKCcqJywgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cCgnQXdzU29sdXRpb25zLS4qJykpO1xuY29uc3QgZXJyb3JzID0gQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5maW5kRXJyb3IoJyonLCBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKCdBd3NTb2x1dGlvbnMtLionKSk7XG5cbi8vIFRlc3Q6IE5vIHVuc3VwcHJlc3NlZCB3YXJuaW5nc1xudGVzdCgnTm8gdW5zdXBwcmVzc2VkIHdhcm5pbmdzJywgKCkgPT4ge1xuICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKCdDREsgTmFnIFdhcm5pbmdzOicsIEpTT04uc3RyaW5naWZ5KHdhcm5pbmdzLCBudWxsLCAyKSk7XG4gIH1cbiAgZXhwZWN0KHdhcm5pbmdzKS50b0hhdmVMZW5ndGgoMCk7XG59KTtcblxuLy8gVGVzdDogTm8gdW5zdXBwcmVzc2VkIGVycm9yc1xudGVzdCgnTm8gdW5zdXBwcmVzc2VkIGVycm9ycycsICgpID0+IHtcbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coJ0NESyBOYWcgRXJyb3JzOicsIEpTT04uc3RyaW5naWZ5KGVycm9ycywgbnVsbCwgMikpO1xuICB9XG4gIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbn0pO1xuIl19
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const aws_cdk_lib_1 = require("aws-cdk-lib");
4
4
  const assertions_1 = require("aws-cdk-lib/assertions");
5
+ const aws_s3_assets_1 = require("aws-cdk-lib/aws-s3-assets");
5
6
  const agentic_document_processing_1 = require("../agentic-document-processing");
6
7
  describe('AgenticDocumentProcessing', () => {
7
8
  let basicStack;
@@ -11,101 +12,169 @@ describe('AgenticDocumentProcessing', () => {
11
12
  let crossRegionTemplate;
12
13
  let defaultModelTemplate;
13
14
  beforeAll(() => {
14
- // Create all stacks and constructs first
15
15
  basicStack = new aws_cdk_lib_1.Stack();
16
+ const systemPrompt = new aws_s3_assets_1.Asset(basicStack, 'SystemPrompt', {
17
+ path: __dirname + '/../resources/default-strands-agent',
18
+ });
16
19
  new agentic_document_processing_1.AgenticDocumentProcessing(basicStack, 'BasicTest', {
17
- processingPrompt: 'Custom processing prompt',
18
20
  processingAgentParameters: {
19
- agentSystemPrompt: 'Test system prompt',
20
- toolsLocation: ['tool1', 'tool2'],
21
+ agentName: 'TestAgent',
22
+ agentDefinition: {
23
+ bedrockModel: {},
24
+ systemPrompt,
25
+ },
26
+ prompt: 'Custom processing prompt',
21
27
  },
22
28
  });
23
29
  crossRegionStack = new aws_cdk_lib_1.Stack();
30
+ const crossRegionPrompt = new aws_s3_assets_1.Asset(crossRegionStack, 'SystemPrompt', {
31
+ path: __dirname + '/../resources/default-strands-agent',
32
+ });
24
33
  new agentic_document_processing_1.AgenticDocumentProcessing(crossRegionStack, 'CrossRegionTest', {
25
- useCrossRegionInference: true,
34
+ processingAgentParameters: {
35
+ agentName: 'CrossRegionAgent',
36
+ agentDefinition: {
37
+ bedrockModel: { useCrossRegionInference: true },
38
+ systemPrompt: crossRegionPrompt,
39
+ },
40
+ prompt: 'Test prompt',
41
+ },
26
42
  });
27
43
  defaultModelStack = new aws_cdk_lib_1.Stack();
44
+ const defaultPrompt = new aws_s3_assets_1.Asset(defaultModelStack, 'SystemPrompt', {
45
+ path: __dirname + '/../resources/default-strands-agent',
46
+ });
28
47
  new agentic_document_processing_1.AgenticDocumentProcessing(defaultModelStack, 'DefaultModelTest', {
29
- useCrossRegionInference: false,
48
+ processingAgentParameters: {
49
+ agentName: 'DefaultAgent',
50
+ agentDefinition: {
51
+ bedrockModel: { useCrossRegionInference: false },
52
+ systemPrompt: defaultPrompt,
53
+ },
54
+ prompt: 'Test prompt',
55
+ },
30
56
  });
31
- // Generate templates once after all constructs are created
32
57
  basicTemplate = assertions_1.Template.fromStack(basicStack);
33
58
  crossRegionTemplate = assertions_1.Template.fromStack(crossRegionStack);
34
59
  defaultModelTemplate = assertions_1.Template.fromStack(defaultModelStack);
35
60
  });
36
- test('creates basic infrastructure', () => {
37
- basicTemplate.hasResourceProperties('AWS::S3::Bucket', {});
38
- basicTemplate.hasResourceProperties('AWS::Lambda::Function', {
39
- Runtime: 'python3.13',
61
+ describe('Basic infrastructure', () => {
62
+ test('creates basic infrastructure', () => {
63
+ basicTemplate.hasResourceProperties('AWS::S3::Bucket', {});
64
+ basicTemplate.hasResourceProperties('AWS::Lambda::Function', {
65
+ Runtime: 'python3.13',
66
+ });
67
+ basicTemplate.resourceCountIs('AWS::Lambda::Function', 5);
68
+ });
69
+ test('inherits bedrock document processing functionality', () => {
70
+ basicTemplate.hasResourceProperties('AWS::S3::Bucket', {});
71
+ basicTemplate.hasResourceProperties('AWS::DynamoDB::Table', {});
72
+ basicTemplate.hasResourceProperties('AWS::SQS::Queue', {});
73
+ basicTemplate.hasResourceProperties('AWS::StepFunctions::StateMachine', {});
40
74
  });
41
- basicTemplate.resourceCountIs('AWS::Lambda::Function', 5);
42
75
  });
43
- test('configures all agent parameters', () => {
44
- basicTemplate.hasResourceProperties('AWS::Lambda::Function', {
45
- Environment: {
46
- Variables: {
47
- SYSTEM_PROMPT: 'Test system prompt',
48
- TOOLS_CONFIG: '["tool1","tool2"]',
49
- PROMPT: 'Custom processing prompt',
76
+ describe('Agent configuration', () => {
77
+ test('configures all agent parameters', () => {
78
+ basicTemplate.hasResourceProperties('AWS::Lambda::Function', {
79
+ Environment: {
80
+ Variables: {
81
+ PROMPT: 'Custom processing prompt',
82
+ },
50
83
  },
51
- },
84
+ });
85
+ });
86
+ test('configures timeout and memory for processing function', () => {
87
+ basicTemplate.hasResourceProperties('AWS::Lambda::Function', {
88
+ Timeout: 600,
89
+ MemorySize: 1024,
90
+ });
91
+ });
92
+ test('uses cross-region inference when enabled', () => {
93
+ crossRegionTemplate.hasResourceProperties('AWS::Lambda::Function', {
94
+ Environment: {
95
+ Variables: {
96
+ MODEL_ID: 'us.anthropic.claude-sonnet-4-20250514-v1:0',
97
+ },
98
+ },
99
+ });
100
+ });
101
+ test('uses default model when cross-region inference is disabled', () => {
102
+ defaultModelTemplate.hasResourceProperties('AWS::Lambda::Function', {
103
+ Environment: {
104
+ Variables: {
105
+ MODEL_ID: 'anthropic.claude-sonnet-4-20250514-v1:0',
106
+ },
107
+ },
108
+ });
52
109
  });
53
110
  });
54
- test('inherits bedrock document processing functionality', () => {
55
- basicTemplate.hasResourceProperties('AWS::S3::Bucket', {});
56
- basicTemplate.hasResourceProperties('AWS::DynamoDB::Table', {});
57
- basicTemplate.hasResourceProperties('AWS::SQS::Queue', {});
58
- basicTemplate.hasResourceProperties('AWS::StepFunctions::StateMachine', {});
59
- });
60
- test('creates IAM role with correct permissions', () => {
61
- basicTemplate.hasResourceProperties('AWS::IAM::Role', {
62
- AssumeRolePolicyDocument: {
63
- Statement: [{
64
- Action: 'sts:AssumeRole',
65
- Effect: 'Allow',
66
- Principal: {
67
- Service: 'lambda.amazonaws.com',
111
+ describe('IAM permissions', () => {
112
+ test('creates IAM role with correct permissions', () => {
113
+ basicTemplate.hasResourceProperties('AWS::IAM::Role', {
114
+ AssumeRolePolicyDocument: {
115
+ Statement: [{
116
+ Action: 'sts:AssumeRole',
117
+ Effect: 'Allow',
118
+ Principal: {
119
+ Service: 'lambda.amazonaws.com',
120
+ },
121
+ }],
122
+ },
123
+ });
124
+ basicTemplate.hasResourceProperties('AWS::IAM::Role', {
125
+ Policies: [{
126
+ PolicyDocument: {
127
+ Statement: assertions_1.Match.arrayWith([
128
+ assertions_1.Match.objectLike({
129
+ Effect: 'Allow',
130
+ Action: ['bedrock:InvokeModel', 'bedrock:InvokeModelWithResponseStream'],
131
+ }),
132
+ ]),
68
133
  },
134
+ PolicyName: 'BedrockInvokePolicy',
69
135
  }],
70
- },
136
+ });
71
137
  });
72
- basicTemplate.hasResourceProperties('AWS::IAM::Role', {
73
- Policies: [{
74
- PolicyDocument: {
75
- Statement: assertions_1.Match.arrayWith([
76
- assertions_1.Match.objectLike({
77
- Effect: 'Allow',
78
- Action: ['bedrock:InvokeModel', 'bedrock:InvokeModelWithResponseStream'],
79
- }),
80
- ]),
81
- },
82
- PolicyName: 'BedrockInvokePolicy',
83
- }],
138
+ test('grants S3 access to agent function', () => {
139
+ basicTemplate.hasResourceProperties('AWS::IAM::Role', {
140
+ Policies: assertions_1.Match.arrayWith([
141
+ assertions_1.Match.objectLike({
142
+ PolicyDocument: {
143
+ Statement: assertions_1.Match.arrayWith([
144
+ assertions_1.Match.objectLike({
145
+ Action: assertions_1.Match.arrayWith(['s3:GetObject']),
146
+ Effect: 'Allow',
147
+ }),
148
+ ]),
149
+ },
150
+ }),
151
+ ]),
152
+ });
84
153
  });
85
154
  });
86
- test('configures timeout and memory for processing function', () => {
87
- basicTemplate.hasResourceProperties('AWS::Lambda::Function', {
88
- Timeout: 300,
89
- MemorySize: 1024,
155
+ describe('State machine integration', () => {
156
+ test('integrates agent as processing step in workflow', () => {
157
+ basicTemplate.hasResourceProperties('AWS::StepFunctions::StateMachine', {
158
+ DefinitionString: assertions_1.Match.objectLike({
159
+ 'Fn::Join': assertions_1.Match.arrayWith(['']),
160
+ }),
161
+ });
90
162
  });
91
- });
92
- test('uses cross-region inference when enabled', () => {
93
- crossRegionTemplate.hasResourceProperties('AWS::Lambda::Function', {
94
- Environment: {
95
- Variables: {
96
- MODEL_ID: 'us.anthropic.claude-3-7-sonnet-20250219-v1:0',
97
- },
98
- },
163
+ test('creates state machine with encryption', () => {
164
+ basicTemplate.hasResourceProperties('AWS::StepFunctions::StateMachine', {
165
+ EncryptionConfiguration: assertions_1.Match.objectLike({
166
+ Type: 'CUSTOMER_MANAGED_KMS_KEY',
167
+ }),
168
+ });
99
169
  });
100
170
  });
101
- test('uses default model when cross-region inference is disabled', () => {
102
- defaultModelTemplate.hasResourceProperties('AWS::Lambda::Function', {
103
- Environment: {
104
- Variables: {
105
- MODEL_ID: 'anthropic.claude-3-7-sonnet-20250219-v1:0',
106
- },
107
- },
171
+ describe('Resource counts', () => {
172
+ test('creates expected number of Lambda functions', () => {
173
+ basicTemplate.resourceCountIs('AWS::Lambda::Function', 5);
174
+ });
175
+ test('creates single state machine', () => {
176
+ basicTemplate.resourceCountIs('AWS::StepFunctions::StateMachine', 1);
108
177
  });
109
178
  });
110
179
  });
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy90ZXN0cy9hZ2VudGljLWRvY3VtZW50LXByb2Nlc3NpbmcudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFvQztBQUNwQyx1REFBeUQ7QUFDekQsZ0ZBQTJFO0FBRTNFLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7SUFDekMsSUFBSSxVQUFpQixDQUFDO0lBQ3RCLElBQUksZ0JBQXVCLENBQUM7SUFDNUIsSUFBSSxpQkFBd0IsQ0FBQztJQUM3QixJQUFJLGFBQXVCLENBQUM7SUFDNUIsSUFBSSxtQkFBNkIsQ0FBQztJQUNsQyxJQUFJLG9CQUE4QixDQUFDO0lBRW5DLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYix5Q0FBeUM7UUFDekMsVUFBVSxHQUFHLElBQUksbUJBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksdURBQXlCLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRTtZQUNyRCxnQkFBZ0IsRUFBRSwwQkFBMEI7WUFDNUMseUJBQXlCLEVBQUU7Z0JBQ3pCLGlCQUFpQixFQUFFLG9CQUFvQjtnQkFDdkMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQzthQUNsQztTQUNGLENBQUMsQ0FBQztRQUVILGdCQUFnQixHQUFHLElBQUksbUJBQUssRUFBRSxDQUFDO1FBQy9CLElBQUksdURBQXlCLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUU7WUFDakUsdUJBQXVCLEVBQUUsSUFBSTtTQUM5QixDQUFDLENBQUM7UUFFSCxpQkFBaUIsR0FBRyxJQUFJLG1CQUFLLEVBQUUsQ0FBQztRQUNoQyxJQUFJLHVEQUF5QixDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFO1lBQ25FLHVCQUF1QixFQUFFLEtBQUs7U0FDL0IsQ0FBQyxD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QUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDREQUE0RCxFQUFFLEdBQUcsRUFBRTtRQUN0RSxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsRUFBRTtZQUNsRSxXQUFXLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFO29CQUNULFFBQVEsRUFBRSwyQ0FBMkM7aUJBQ3REO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgTWF0Y2ggfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcgfSBmcm9tICcuLi9hZ2VudGljLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG5kZXNjcmliZSgnQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZycsICgpID0+IHtcbiAgbGV0IGJhc2ljU3RhY2s6IFN0YWNrO1xuICBsZXQgY3Jvc3NSZWdpb25TdGFjazogU3RhY2s7XG4gIGxldCBkZWZhdWx0TW9kZWxTdGFjazogU3RhY2s7XG4gIGxldCBiYXNpY1RlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgbGV0IGNyb3NzUmVnaW9uVGVtcGxhdGU6IFRlbXBsYXRlO1xuICBsZXQgZGVmYXVsdE1vZGVsVGVtcGxhdGU6IFRlbXBsYXRlO1xuXG4gIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGFsbCBzdGFja3MgYW5kIGNvbnN0cnVjdHMgZmlyc3RcbiAgICBiYXNpY1N0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgbmV3IEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcoYmFzaWNTdGFjaywgJ0Jhc2ljVGVzdCcsIHtcbiAgICAgIHByb2Nlc3NpbmdQcm9tcHQ6ICdDdXN0b20gcHJvY2Vzc2luZyBwcm9tcHQnLFxuICAgICAgcHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVyczoge1xuICAgICAgICBhZ2VudFN5c3RlbVByb21wdDogJ1Rlc3Qgc3lzdGVtIHByb21wdCcsXG4gICAgICAgIHRvb2xzTG9jYXRpb246IFsndG9vbDEnLCAndG9vbDInXSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjcm9zc1JlZ2lvblN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgbmV3IEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcoY3Jvc3NSZWdpb25TdGFjaywgJ0Nyb3NzUmVnaW9uVGVzdCcsIHtcbiAgICAgIHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgZGVmYXVsdE1vZGVsU3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICBuZXcgQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZyhkZWZhdWx0TW9kZWxTdGFjaywgJ0RlZmF1bHRNb2RlbFRlc3QnLCB7XG4gICAgICB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSB0ZW1wbGF0ZXMgb25jZSBhZnRlciBhbGwgY29uc3RydWN0cyBhcmUgY3JlYXRlZFxuICAgIGJhc2ljVGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soYmFzaWNTdGFjayk7XG4gICAgY3Jvc3NSZWdpb25UZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhjcm9zc1JlZ2lvblN0YWNrKTtcbiAgICBkZWZhdWx0TW9kZWxUZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhkZWZhdWx0TW9kZWxTdGFjayk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgYmFzaWMgaW5mcmFzdHJ1Y3R1cmUnLCAoKSA9PiB7XG4gICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHt9KTtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgUnVudGltZTogJ3B5dGhvbjMuMTMnLFxuICAgIH0pO1xuICAgIGJhc2ljVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCA1KTtcbiAgfSk7XG5cbiAgdGVzdCgnY29uZmlndXJlcyBhbGwgYWdlbnQgcGFyYW1ldGVycycsICgpID0+IHtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVmFyaWFibGVzOiB7XG4gICAgICAgICAgU1lTVEVNX1BST01QVDogJ1Rlc3Qgc3lzdGVtIHByb21wdCcsXG4gICAgICAgICAgVE9PTFNfQ09ORklHOiAnW1widG9vbDFcIixcInRvb2wyXCJdJyxcbiAgICAgICAgICBQUk9NUFQ6ICdDdXN0b20gcHJvY2Vzc2luZyBwcm9tcHQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnaW5oZXJpdHMgYmVkcm9jayBkb2N1bWVudCBwcm9jZXNzaW5nIGZ1bmN0aW9uYWxpdHknLCAoKSA9PiB7XG4gICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHt9KTtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7fSk7XG4gICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U1FTOjpRdWV1ZScsIHt9KTtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7fSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgSUFNIHJvbGUgd2l0aCBjb3JyZWN0IHBlcm1pc3Npb25zJywgKCkgPT4ge1xuICAgIGJhc2ljVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OklBTTo6Um9sZScsIHtcbiAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICBTdGF0ZW1lbnQ6IFt7XG4gICAgICAgICAgQWN0aW9uOiAnc3RzOkFzc3VtZVJvbGUnLFxuICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgIFNlcnZpY2U6ICdsYW1iZGEuYW1hem9uYXdzLmNvbScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfV0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgUG9saWNpZXM6IFt7XG4gICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgU3RhdGVtZW50OiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgICAgTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgQWN0aW9uOiBbJ2JlZHJvY2s6SW52b2tlTW9kZWwnLCAnYmVkcm9jazpJbnZva2VNb2RlbFdpdGhSZXNwb25zZVN0cmVhbSddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIFBvbGljeU5hbWU6ICdCZWRyb2NrSW52b2tlUG9saWN5JyxcbiAgICAgIH1dLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdjb25maWd1cmVzIHRpbWVvdXQgYW5kIG1lbW9yeSBmb3IgcHJvY2Vzc2luZyBmdW5jdGlvbicsICgpID0+IHtcbiAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgVGltZW91dDogMzAwLFxuICAgICAgTWVtb3J5U2l6ZTogMTAyNCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgndXNlcyBjcm9zcy1yZWdpb24gaW5mZXJlbmNlIHdoZW4gZW5hYmxlZCcsICgpID0+IHtcbiAgICBjcm9zc1JlZ2lvblRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVmFyaWFibGVzOiB7XG4gICAgICAgICAgTU9ERUxfSUQ6ICd1cy5hbnRocm9waWMuY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTktdjE6MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCd1c2VzIGRlZmF1bHQgbW9kZWwgd2hlbiBjcm9zcy1yZWdpb24gaW5mZXJlbmNlIGlzIGRpc2FibGVkJywgKCkgPT4ge1xuICAgIGRlZmF1bHRNb2RlbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVmFyaWFibGVzOiB7XG4gICAgICAgICAgTU9ERUxfSUQ6ICdhbnRocm9waWMuY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTktdjE6MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy90ZXN0cy9hZ2VudGljLWRvY3VtZW50LXByb2Nlc3NpbmcudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFvQztBQUNwQyx1REFBeUQ7QUFDekQsNkRBQWtEO0FBQ2xELGdGQUEyRTtBQUUzRSxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO0lBQ3pDLElBQUksVUFBaUIsQ0FBQztJQUN0QixJQUFJLGdCQUF1QixDQUFDO0lBQzVCLElBQUksaUJBQXdCLENBQUM7SUFDN0IsSUFBSSxhQUF1QixDQUFDO0lBQzVCLElBQUksbUJBQTZCLENBQUM7SUFDbEMsSUFBSSxvQkFBOEIsQ0FBQztJQUVuQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsVUFBVSxHQUFHLElBQUksbUJBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sWUFBWSxHQUFHLElBQUkscUJBQUssQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFO1lBQ3pELElBQUksRUFBRSxTQUFTLEdBQUcscUNBQXFDO1NBQ3hELENBQUMsQ0FBQztRQUNILElBQUksdURBQXlCLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRTtZQUNyRCx5QkFBeUIsRUFBRTtnQkFDekIsU0FBUyxFQUFFLFdBQVc7Z0JBQ3RCLGVBQWUsRUFBRTtvQkFDZixZQUFZLEVBQUUsRUFBRTtvQkFDaEIsWUFBWTtpQkFDYjtnQkFDRCxNQUFNLEVBQUUsMEJBQTBCO2FBQ25DO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsZ0JBQWdCLEdBQUcsSUFBSSxtQkFBSyxFQUFFLENBQUM7UUFDL0IsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLHFCQUFLLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFO1lBQ3BFLElBQUksRUFBRSxTQUFTLEdBQUcscUNBQXFD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QUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO1FBQy9CLElBQUksQ0FBQyw2Q0FBNkMsRUFBRSxHQUFHLEVBQUU7WUFDdkQsYUFBYSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7WUFDeEMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IE1hdGNoLCBUZW1wbGF0ZSB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xuaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbmltcG9ydCB7IEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcgfSBmcm9tICcuLi9hZ2VudGljLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG5kZXNjcmliZSgnQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZycsICgpID0+IHtcbiAgbGV0IGJhc2ljU3RhY2s6IFN0YWNrO1xuICBsZXQgY3Jvc3NSZWdpb25TdGFjazogU3RhY2s7XG4gIGxldCBkZWZhdWx0TW9kZWxTdGFjazogU3RhY2s7XG4gIGxldCBiYXNpY1RlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgbGV0IGNyb3NzUmVnaW9uVGVtcGxhdGU6IFRlbXBsYXRlO1xuICBsZXQgZGVmYXVsdE1vZGVsVGVtcGxhdGU6IFRlbXBsYXRlO1xuXG4gIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgYmFzaWNTdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIGNvbnN0IHN5c3RlbVByb21wdCA9IG5ldyBBc3NldChiYXNpY1N0YWNrLCAnU3lzdGVtUHJvbXB0Jywge1xuICAgICAgcGF0aDogX19kaXJuYW1lICsgJy8uLi9yZXNvdXJjZXMvZGVmYXVsdC1zdHJhbmRzLWFnZW50JyxcbiAgICB9KTtcbiAgICBuZXcgQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZyhiYXNpY1N0YWNrLCAnQmFzaWNUZXN0Jywge1xuICAgICAgcHJvY2Vzc2luZ0FnZW50UGFyYW1ldGVyczoge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHt9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgICAgcHJvbXB0OiAnQ3VzdG9tIHByb2Nlc3NpbmcgcHJvbXB0JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjcm9zc1JlZ2lvblN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgY29uc3QgY3Jvc3NSZWdpb25Qcm9tcHQgPSBuZXcgQXNzZXQoY3Jvc3NSZWdpb25TdGFjaywgJ1N5c3RlbVByb21wdCcsIHtcbiAgICAgIHBhdGg6IF9fZGlybmFtZSArICcvLi4vcmVzb3VyY2VzL2RlZmF1bHQtc3RyYW5kcy1hZ2VudCcsXG4gICAgfSk7XG4gICAgbmV3IEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmcoY3Jvc3NSZWdpb25TdGFjaywgJ0Nyb3NzUmVnaW9uVGVzdCcsIHtcbiAgICAgIHByb2Nlc3NpbmdBZ2VudFBhcmFtZXRlcnM6IHtcbiAgICAgICAgYWdlbnROYW1lOiAnQ3Jvc3NSZWdpb25BZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogdHJ1ZSB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdDogY3Jvc3NSZWdpb25Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICAgIHByb21wdDogJ1Rlc3QgcHJvbXB0JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBkZWZhdWx0TW9kZWxTdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIGNvbnN0IGRlZmF1bHRQcm9tcHQgPSBuZXcgQXNzZXQoZGVmYXVsdE1vZGVsU3RhY2ssICdTeXN0ZW1Qcm9tcHQnLCB7XG4gICAgICBwYXRoOiBfX2Rpcm5hbWUgKyAnLy4uL3Jlc291cmNlcy9kZWZhdWx0LXN0cmFuZHMtYWdlbnQnLFxuICAgIH0pO1xuICAgIG5ldyBBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nKGRlZmF1bHRNb2RlbFN0YWNrLCAnRGVmYXVsdE1vZGVsVGVzdCcsIHtcbiAgICAgIHByb2Nlc3NpbmdBZ2VudFBhcmFtZXRlcnM6IHtcbiAgICAgICAgYWdlbnROYW1lOiAnRGVmYXVsdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiBmYWxzZSB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdDogZGVmYXVsdFByb21wdCxcbiAgICAgICAgfSxcbiAgICAgICAgcHJvbXB0OiAnVGVzdCBwcm9tcHQnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGJhc2ljVGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soYmFzaWNTdGFjayk7XG4gICAgY3Jvc3NSZWdpb25UZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhjcm9zc1JlZ2lvblN0YWNrKTtcbiAgICBkZWZhdWx0TW9kZWxUZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhkZWZhdWx0TW9kZWxTdGFjayk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCYXNpYyBpbmZyYXN0cnVjdHVyZScsICgpID0+IHtcbiAgICB0ZXN0KCdjcmVhdGVzIGJhc2ljIGluZnJhc3RydWN0dXJlJywgKCkgPT4ge1xuICAgICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHt9KTtcbiAgICAgIGJhc2ljVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICAgIFJ1bnRpbWU6ICdweXRob24zLjEzJyxcbiAgICAgIH0pO1xuICAgICAgYmFzaWNUZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIDUpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnaW5oZXJpdHMgYmVkcm9jayBkb2N1bWVudCBwcm9jZXNzaW5nIGZ1bmN0aW9uYWxpdHknLCAoKSA9PiB7XG4gICAgICBiYXNpY1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTMzo6QnVja2V0Jywge30pO1xuICAgICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RHluYW1vREI6OlRhYmxlJywge30pO1xuICAgICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U1FTOjpRdWV1ZScsIHt9KTtcbiAgICAgIGJhc2ljVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIHt9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0FnZW50IGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgdGVzdCgnY29uZmlndXJlcyBhbGwgYWdlbnQgcGFyYW1ldGVycycsICgpID0+IHtcbiAgICAgIGJhc2ljVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgICAgVmFyaWFibGVzOiB7XG4gICAgICAgICAgICBQUk9NUFQ6ICdDdXN0b20gcHJvY2Vzc2luZyBwcm9tcHQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NvbmZpZ3VyZXMgdGltZW91dCBhbmQgbWVtb3J5IGZvciBwcm9jZXNzaW5nIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgICAgVGltZW91dDogNjAwLFxuICAgICAgICBNZW1vcnlTaXplOiAxMDI0LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd1c2VzIGNyb3NzLXJlZ2lvbiBpbmZlcmVuY2Ugd2hlbiBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY3Jvc3NSZWdpb25UZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBWYXJpYWJsZXM6IHtcbiAgICAgICAgICAgIE1PREVMX0lEOiAndXMuYW50aHJvcGljLmNsYXVkZS1zb25uZXQtNC0yMDI1MDUxNC12MTowJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd1c2VzIGRlZmF1bHQgbW9kZWwgd2hlbiBjcm9zcy1yZWdpb24gaW5mZXJlbmNlIGlzIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgZGVmYXVsdE1vZGVsVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgICAgVmFyaWFibGVzOiB7XG4gICAgICAgICAgICBNT0RFTF9JRDogJ2FudGhyb3BpYy5jbGF1ZGUtc29ubmV0LTQtMjAyNTA1MTQtdjE6MCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnSUFNIHBlcm1pc3Npb25zJywgKCkgPT4ge1xuICAgIHRlc3QoJ2NyZWF0ZXMgSUFNIHJvbGUgd2l0aCBjb3JyZWN0IHBlcm1pc3Npb25zJywgKCkgPT4ge1xuICAgICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgICBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgICBTdGF0ZW1lbnQ6IFt7XG4gICAgICAgICAgICBBY3Rpb246ICdzdHM6QXNzdW1lUm9sZScsXG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgICAgU2VydmljZTogJ2xhbWJkYS5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfV0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgYmFzaWNUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgICBQb2xpY2llczogW3tcbiAgICAgICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgICAgU3RhdGVtZW50OiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICAgICAgQWN0aW9uOiBbJ2JlZHJvY2s6SW52b2tlTW9kZWwnLCAnYmVkcm9jazpJbnZva2VNb2RlbFdpdGhSZXNwb25zZVN0cmVhbSddLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUG9saWN5TmFtZTogJ0JlZHJvY2tJbnZva2VQb2xpY3knLFxuICAgICAgICB9XSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZ3JhbnRzIFMzIGFjY2VzcyB0byBhZ2VudCBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIGJhc2ljVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OklBTTo6Um9sZScsIHtcbiAgICAgICAgUG9saWNpZXM6IE1hdGNoLmFycmF5V2l0aChbXG4gICAgICAgICAgTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgICAgICBTdGF0ZW1lbnQ6IE1hdGNoLmFycmF5V2l0aChbXG4gICAgICAgICAgICAgICAgTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICAgICAgICBBY3Rpb246IE1hdGNoLmFycmF5V2l0aChbJ3MzOkdldE9iamVjdCddKSxcbiAgICAgICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICBdKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU3RhdGUgbWFjaGluZSBpbnRlZ3JhdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCdpbnRlZ3JhdGVzIGFnZW50IGFzIHByb2Nlc3Npbmcgc3RlcCBpbiB3b3JrZmxvdycsICgpID0+IHtcbiAgICAgIGJhc2ljVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIHtcbiAgICAgICAgRGVmaW5pdGlvblN0cmluZzogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgJ0ZuOjpKb2luJzogTWF0Y2guYXJyYXlXaXRoKFsnJ10pLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnY3JlYXRlcyBzdGF0ZSBtYWNoaW5lIHdpdGggZW5jcnlwdGlvbicsICgpID0+IHtcbiAgICAgIGJhc2ljVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIHtcbiAgICAgICAgRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIFR5cGU6ICdDVVNUT01FUl9NQU5BR0VEX0tNU19LRVknLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVzb3VyY2UgY291bnRzJywgKCkgPT4ge1xuICAgIHRlc3QoJ2NyZWF0ZXMgZXhwZWN0ZWQgbnVtYmVyIG9mIExhbWJkYSBmdW5jdGlvbnMnLCAoKSA9PiB7XG4gICAgICBiYXNpY1RlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywgNSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjcmVhdGVzIHNpbmdsZSBzdGF0ZSBtYWNoaW5lJywgKCkgPT4ge1xuICAgICAgYmFzaWNUZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywgMSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
4
+ const assertions_1 = require("aws-cdk-lib/assertions");
5
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
6
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
7
+ const aws_stepfunctions_tasks_1 = require("aws-cdk-lib/aws-stepfunctions-tasks");
8
+ const cdk_nag_1 = require("cdk-nag");
9
+ const framework_1 = require("../../framework");
10
+ const eventbridge_broker_1 = require("../../framework/foundation/eventbridge-broker");
11
+ const adapter_1 = require("../adapter");
12
+ const base_document_processing_1 = require("../base-document-processing");
13
+ // Concrete test implementation of BaseDocumentProcessing for CDK Nag testing
14
+ class TestDocumentProcessing extends base_document_processing_1.BaseDocumentProcessing {
15
+ constructor(scope, id, props) {
16
+ super(scope, id, props);
17
+ this.classificationFn = new aws_lambda_1.Function(this, 'ClassificationFn', {
18
+ runtime: aws_lambda_1.Runtime.NODEJS_20_X,
19
+ handler: 'index.handler',
20
+ code: aws_lambda_1.Code.fromInline('exports.handler = async () => ({ documentClassification: "TEST" });'),
21
+ });
22
+ this.processingFn = new aws_lambda_1.Function(this, 'ProcessingFn', {
23
+ runtime: aws_lambda_1.Runtime.NODEJS_20_X,
24
+ handler: 'index.handler',
25
+ code: aws_lambda_1.Code.fromInline('exports.handler = async () => ({ result: {} });'),
26
+ });
27
+ }
28
+ classificationStep() {
29
+ return new aws_stepfunctions_tasks_1.LambdaInvoke(this, 'MockClassification', {
30
+ lambdaFunction: this.classificationFn,
31
+ resultPath: '$.classificationResult',
32
+ });
33
+ }
34
+ processingStep() {
35
+ return new aws_stepfunctions_tasks_1.LambdaInvoke(this, 'MockProcessing', {
36
+ lambdaFunction: this.processingFn,
37
+ resultPath: '$.processingResult',
38
+ });
39
+ }
40
+ enrichmentStep() {
41
+ return undefined;
42
+ }
43
+ postProcessingStep() {
44
+ return undefined;
45
+ }
46
+ createStateMachine() {
47
+ return this.handleStateMachineCreation('test-state-machine');
48
+ }
49
+ }
50
+ // Create app and stack
51
+ const app = new aws_cdk_lib_1.App();
52
+ const stack = new aws_cdk_lib_1.Stack(app, 'TestStack', {
53
+ env: {
54
+ account: '123456789012',
55
+ region: 'us-east-1',
56
+ },
57
+ });
58
+ // Create access log bucket
59
+ const accessLog = new framework_1.AccessLog(stack, 'AccessLog');
60
+ // Create S3 bucket with proper configuration
61
+ const bucket = new aws_s3_1.Bucket(stack, 'BaseDocumentProcessingBucket', {
62
+ serverAccessLogsBucket: accessLog.bucket,
63
+ serverAccessLogsPrefix: accessLog.bucketPrefix,
64
+ enforceSSL: true,
65
+ });
66
+ // Create EventBridge broker
67
+ const broker = new eventbridge_broker_1.EventbridgeBroker(stack, 'TestBroker', {
68
+ name: 'test-broker',
69
+ eventSource: 'test-source',
70
+ });
71
+ // Create adapter with custom bucket
72
+ const adapter = new adapter_1.QueuedS3Adapter({
73
+ bucket,
74
+ });
75
+ // Create the BaseDocumentProcessing construct
76
+ const construct = new TestDocumentProcessing(stack, 'BaseDocumentProcessing', {
77
+ ingressAdapter: adapter,
78
+ eventbridgeBroker: broker,
79
+ enableObservability: true,
80
+ });
81
+ // Create the state machine
82
+ construct.createStateMachine();
83
+ // Suppress CDK-managed BucketNotificationsHandler AWS managed policy
84
+ cdk_nag_1.NagSuppressions.addResourceSuppressionsByPath(stack, '/TestStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role', [
85
+ {
86
+ id: 'AwsSolutions-IAM4',
87
+ reason: 'CDK-managed BucketNotificationsHandler requires AWSLambdaBasicExecutionRole for S3 event processing',
88
+ appliesTo: ['Policy::arn:<AWS::Partition>:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'],
89
+ },
90
+ ]);
91
+ // Suppress S3 bucket wildcard permissions for Lambda roles
92
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(stack, [
93
+ {
94
+ id: 'AwsSolutions-IAM5',
95
+ reason: 'Lambda functions require wildcard access to S3 bucket objects for document processing',
96
+ appliesTo: ['Resource::<BaseDocumentProcessingBucketE8E0F6F5.Arn>/*'],
97
+ },
98
+ ], true);
99
+ // Suppress SQS consumer Lambda wildcard permissions for log streams
100
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(stack, [
101
+ {
102
+ id: 'AwsSolutions-IAM5',
103
+ reason: 'Lambda log stream ARN is only known at runtime, wildcard required for CloudWatch Logs access',
104
+ },
105
+ ], true);
106
+ // Suppress StateMachineRole wildcard permissions for Lambda invocation
107
+ cdk_nag_1.NagSuppressions.addResourceSuppressionsByPath(stack, '/TestStack/BaseDocumentProcessing/StateMachineRole/DefaultPolicy', [
108
+ {
109
+ id: 'AwsSolutions-IAM5',
110
+ reason: 'Step Functions requires wildcard permissions to invoke Lambda functions with version-specific ARNs',
111
+ },
112
+ ]);
113
+ // Suppress Lambda log group wildcard permissions
114
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(stack, [
115
+ {
116
+ id: 'AwsSolutions-IAM5',
117
+ reason: 'Lambda log stream names are generated at runtime, wildcard required for CloudWatch Logs access',
118
+ },
119
+ ], true);
120
+ // Suppress Lambda basic execution role
121
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(stack, [
122
+ {
123
+ id: 'AwsSolutions-IAM4',
124
+ reason: 'Test Lambda functions use AWS managed policies for basic execution',
125
+ appliesTo: ['Policy::arn:<AWS::Partition>:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'],
126
+ },
127
+ ], true);
128
+ // Suppress Lambda runtime version for test functions
129
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(stack, [
130
+ {
131
+ id: 'AwsSolutions-L1',
132
+ reason: 'Test Lambda functions use Node.js 20 which is a supported runtime',
133
+ },
134
+ ], true);
135
+ // Suppress KMS key rotation for test encryption key
136
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(stack, [
137
+ {
138
+ id: 'AwsSolutions-KMS5',
139
+ reason: 'KMS key rotation is enabled by default in BaseDocumentProcessing construct',
140
+ },
141
+ ], true);
142
+ // Apply CDK Nag checks
143
+ aws_cdk_lib_1.Aspects.of(app).add(new cdk_nag_1.AwsSolutionsChecks({ verbose: true }));
144
+ // Synthesize the stack and check for unsuppressed warnings and errors
145
+ const warnings = assertions_1.Annotations.fromStack(stack).findWarning('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
146
+ const errors = assertions_1.Annotations.fromStack(stack).findError('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
147
+ // Test: No unsuppressed warnings
148
+ test('No unsuppressed warnings', () => {
149
+ if (warnings.length > 0) {
150
+ console.log('CDK Nag Warnings:', JSON.stringify(warnings, null, 2));
151
+ }
152
+ expect(warnings).toHaveLength(0);
153
+ });
154
+ // Test: No unsuppressed errors
155
+ test('No unsuppressed errors', () => {
156
+ if (errors.length > 0) {
157
+ console.log('CDK Nag Errors:', JSON.stringify(errors, null, 2));
158
+ }
159
+ expect(errors).toHaveLength(0);
160
+ });
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQWtEO0FBQ2xELHVEQUE0RDtBQUM1RCx1REFBaUU7QUFDakUsK0NBQTRDO0FBQzVDLGlGQUFtRTtBQUNuRSxxQ0FBOEQ7QUFDOUQsK0NBQTRDO0FBQzVDLHNGQUFrRjtBQUNsRix3Q0FBNkM7QUFDN0MsMEVBQWlHO0FBRWpHLDZFQUE2RTtBQUM3RSxNQUFNLHNCQUF1QixTQUFRLGlEQUFzQjtJQUl6RCxZQUFZLEtBQVUsRUFBRSxFQUFVLEVBQUUsS0FBVTtRQUM1QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUM3RCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyxxRUFBcUUsQ0FBQztTQUM3RixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQ3JELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLGlEQUFpRCxDQUFDO1NBQ3pFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxrQkFBa0I7UUFDMUIsT0FBTyxJQUFJLHNDQUFZLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQ2xELGNBQWMs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UyxDQUFDLEdBQUcsRUFBRSxrQkFBSyxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztBQUV0RyxpQ0FBaUM7QUFDakMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtJQUNwQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDLENBQUMsQ0FBQztBQUVILCtCQUErQjtBQUMvQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwLCBTdGFjaywgQXNwZWN0cyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEFubm90YXRpb25zLCBNYXRjaCB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xuaW1wb3J0IHsgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBMYW1iZGFJbnZva2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucy10YXNrcyc7XG5pbXBvcnQgeyBBd3NTb2x1dGlvbnNDaGVja3MsIE5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ2Nkay1uYWcnO1xuaW1wb3J0IHsgQWNjZXNzTG9nIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrJztcbmltcG9ydCB7IEV2ZW50YnJpZGdlQnJva2VyIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2ZvdW5kYXRpb24vZXZlbnRicmlkZ2UtYnJva2VyJztcbmltcG9ydCB7IFF1ZXVlZFMzQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXInO1xuaW1wb3J0IHsgQmFzZURvY3VtZW50UHJvY2Vzc2luZywgRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfSBmcm9tICcuLi9iYXNlLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG4vLyBDb25jcmV0ZSB0ZXN0IGltcGxlbWVudGF0aW9uIG9mIEJhc2VEb2N1bWVudFByb2Nlc3NpbmcgZm9yIENESyBOYWcgdGVzdGluZ1xuY2xhc3MgVGVzdERvY3VtZW50UHJvY2Vzc2luZyBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3Npbmcge1xuICBwcml2YXRlIGNsYXNzaWZpY2F0aW9uRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NpbmdGbjogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGFueSwgaWQ6IHN0cmluZywgcHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGFzc2lmaWNhdGlvblN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdNb2NrQ2xhc3NpZmljYXRpb24nLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jbGFzc2lmaWNhdGlvbkZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQuY2xhc3NpZmljYXRpb25SZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja1Byb2Nlc3NpbmcnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5wcm9jZXNzaW5nRm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wcm9jZXNzaW5nUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbnJpY2htZW50U3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0UHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlU3RhdGVNYWNoaW5lKCkge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZVN0YXRlTWFjaGluZUNyZWF0aW9uKCd0ZXN0LXN0YXRlLW1hY2hpbmUnKTtcbiAgfVxufVxuXG4vLyBDcmVhdGUgYXBwIGFuZCBzdGFja1xuY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJywge1xuICBlbnY6IHtcbiAgICBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJyxcbiAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICB9LFxufSk7XG5cbi8vIENyZWF0ZSBhY2Nlc3MgbG9nIGJ1Y2tldFxuY29uc3QgYWNjZXNzTG9nID0gbmV3IEFjY2Vzc0xvZyhzdGFjaywgJ0FjY2Vzc0xvZycpO1xuXG4vLyBDcmVhdGUgUzMgYnVja2V0IHdpdGggcHJvcGVyIGNvbmZpZ3VyYXRpb25cbmNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQoc3RhY2ssICdCYXNlRG9jdW1lbnRQcm9jZXNzaW5nQnVja2V0Jywge1xuICBzZXJ2ZXJBY2Nlc3NMb2dzQnVja2V0OiBhY2Nlc3NMb2cuYnVja2V0LFxuICBzZXJ2ZXJBY2Nlc3NMb2dzUHJlZml4OiBhY2Nlc3NMb2cuYnVja2V0UHJlZml4LFxuICBlbmZvcmNlU1NMOiB0cnVlLFxufSk7XG5cbi8vIENyZWF0ZSBFdmVudEJyaWRnZSBicm9rZXJcbmNvbnN0IGJyb2tlciA9IG5ldyBFdmVudGJyaWRnZUJyb2tlcihzdGFjaywgJ1Rlc3RCcm9rZXInLCB7XG4gIG5hbWU6ICd0ZXN0LWJyb2tlcicsXG4gIGV2ZW50U291cmNlOiAndGVzdC1zb3VyY2UnLFxufSk7XG5cbi8vIENyZWF0ZSBhZGFwdGVyIHdpdGggY3VzdG9tIGJ1Y2tldFxuY29uc3QgYWRhcHRlciA9IG5ldyBRdWV1ZWRTM0FkYXB0ZXIoe1xuICBidWNrZXQsXG59KTtcblxuLy8gQ3JlYXRlIHRoZSBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIGNvbnN0cnVjdFxuY29uc3QgY29uc3RydWN0ID0gbmV3IFRlc3REb2N1bWVudFByb2Nlc3Npbmcoc3RhY2ssICdCYXNlRG9jdW1lbnRQcm9jZXNzaW5nJywge1xuICBpbmdyZXNzQWRhcHRlcjogYWRhcHRlcixcbiAgZXZlbnRicmlkZ2VCcm9rZXI6IGJyb2tlcixcbiAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogdHJ1ZSxcbn0pO1xuXG4vLyBDcmVhdGUgdGhlIHN0YXRlIG1hY2hpbmVcbmNvbnN0cnVjdC5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcblxuLy8gU3VwcHJlc3MgQ0RLLW1hbmFnZWQgQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIgQVdTIG1hbmFnZWQgcG9saWN5XG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnNCeVBhdGgoXG4gIHN0YWNrLFxuICAnL1Rlc3RTdGFjay9CdWNrZXROb3RpZmljYXRpb25zSGFuZGxlcjA1MGEwNTg3Yjc1NDQ1NDdiZjMyNWYwOTRhM2RiODM0L1JvbGUnLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICByZWFzb246ICdDREstbWFuYWdlZCBCdWNrZXROb3RpZmljYXRpb25zSGFuZGxlciByZXF1aXJlcyBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUgZm9yIFMzIGV2ZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1BvbGljeTo6YXJuOjxBV1M6OlBhcnRpdGlvbj46aWFtOjphd3M6cG9saWN5L3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUnXSxcbiAgICB9LFxuICBdLFxuKTtcblxuLy8gU3VwcHJlc3MgUzMgYnVja2V0IHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgcm9sZXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBmdW5jdGlvbnMgcmVxdWlyZSB3aWxkY2FyZCBhY2Nlc3MgdG8gUzMgYnVja2V0IG9iamVjdHMgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1Jlc291cmNlOjo8QmFzZURvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldEU4RTBGNkY1LkFybj4vKiddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBTUVMgY29uc3VtZXIgTGFtYmRhIHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBsb2cgc3RyZWFtc1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnTGFtYmRhIGxvZyBzdHJlYW0gQVJOIGlzIG9ubHkga25vd24gYXQgcnVudGltZSwgd2lsZGNhcmQgcmVxdWlyZWQgZm9yIENsb3VkV2F0Y2ggTG9ncyBhY2Nlc3MnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBTdGF0ZU1hY2hpbmVSb2xlIHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgaW52b2NhdGlvblxuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zQnlQYXRoKFxuICBzdGFjayxcbiAgJy9UZXN0U3RhY2svQmFzZURvY3VtZW50UHJvY2Vzc2luZy9TdGF0ZU1hY2hpbmVSb2xlL0RlZmF1bHRQb2xpY3knLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdTdGVwIEZ1bmN0aW9ucyByZXF1aXJlcyB3aWxkY2FyZCBwZXJtaXNzaW9ucyB0byBpbnZva2UgTGFtYmRhIGZ1bmN0aW9ucyB3aXRoIHZlcnNpb24tc3BlY2lmaWMgQVJOcycsXG4gICAgfSxcbiAgXSxcbik7XG5cbi8vIFN1cHByZXNzIExhbWJkYSBsb2cgZ3JvdXAgd2lsZGNhcmQgcGVybWlzc2lvbnNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBsb2cgc3RyZWFtIG5hbWVzIGFyZSBnZW5lcmF0ZWQgYXQgcnVudGltZSwgd2lsZGNhcmQgcmVxdWlyZWQgZm9yIENsb3VkV2F0Y2ggTG9ncyBhY2Nlc3MnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBMYW1iZGEgYmFzaWMgZXhlY3V0aW9uIHJvbGVcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JyxcbiAgICAgIHJlYXNvbjogJ1Rlc3QgTGFtYmRhIGZ1bmN0aW9ucyB1c2UgQVdTIG1hbmFnZWQgcG9saWNpZXMgZm9yIGJhc2ljIGV4ZWN1dGlvbicsXG4gICAgICBhcHBsaWVzVG86IFsnUG9saWN5Ojphcm46PEFXUzo6UGFydGl0aW9uPjppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZSddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBMYW1iZGEgcnVudGltZSB2ZXJzaW9uIGZvciB0ZXN0IGZ1bmN0aW9uc1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUwxJyxcbiAgICAgIHJlYXNvbjogJ1Rlc3QgTGFtYmRhIGZ1bmN0aW9ucyB1c2UgTm9kZS5qcyAyMCB3aGljaCBpcyBhIHN1cHBvcnRlZCBydW50aW1lJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgS01TIGtleSByb3RhdGlvbiBmb3IgdGVzdCBlbmNyeXB0aW9uIGtleVxuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUtNUzUnLFxuICAgICAgcmVhc29uOiAnS01TIGtleSByb3RhdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gQmFzZURvY3VtZW50UHJvY2Vzc2luZyBjb25zdHJ1Y3QnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBBcHBseSBDREsgTmFnIGNoZWNrc1xuQXNwZWN0cy5vZihhcHApLmFkZChuZXcgQXdzU29sdXRpb25zQ2hlY2tzKHsgdmVyYm9zZTogdHJ1ZSB9KSk7XG5cbi8vIFN5bnRoZXNpemUgdGhlIHN0YWNrIGFuZCBjaGVjayBmb3IgdW5zdXBwcmVzc2VkIHdhcm5pbmdzIGFuZCBlcnJvcnNcbmNvbnN0IHdhcm5pbmdzID0gQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5maW5kV2FybmluZygnKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbmNvbnN0IGVycm9ycyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZEVycm9yKCcqJywgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cCgnQXdzU29sdXRpb25zLS4qJykpO1xuXG4vLyBUZXN0OiBObyB1bnN1cHByZXNzZWQgd2FybmluZ3NcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCB3YXJuaW5ncycsICgpID0+IHtcbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZygnQ0RLIE5hZyBXYXJuaW5nczonLCBKU09OLnN0cmluZ2lmeSh3YXJuaW5ncywgbnVsbCwgMikpO1xuICB9XG4gIGV4cGVjdCh3YXJuaW5ncykudG9IYXZlTGVuZ3RoKDApO1xufSk7XG5cbi8vIFRlc3Q6IE5vIHVuc3VwcHJlc3NlZCBlcnJvcnNcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCBlcnJvcnMnLCAoKSA9PiB7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKCdDREsgTmFnIEVycm9yczonLCBKU09OLnN0cmluZ2lmeShlcnJvcnMsIG51bGwsIDIpKTtcbiAgfVxuICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG59KTtcbiJdfQ==