@aws-cdk/aws-bedrock-agentcore-alpha 2.221.0-alpha.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 (43) hide show
  1. package/.eslintrc.js +4 -0
  2. package/.jsii +12000 -0
  3. package/.jsii.tabl.json.gz +0 -0
  4. package/.warnings.jsii.js +183 -0
  5. package/LICENSE +201 -0
  6. package/NOTICE +2 -0
  7. package/README.md +796 -0
  8. package/agentcore/index.d.ts +11 -0
  9. package/agentcore/index.js +36 -0
  10. package/agentcore/network/network-configuration.d.ts +152 -0
  11. package/agentcore/network/network-configuration.js +234 -0
  12. package/agentcore/runtime/perms.d.ts +67 -0
  13. package/agentcore/runtime/perms.js +101 -0
  14. package/agentcore/runtime/runtime-artifact.d.ts +42 -0
  15. package/agentcore/runtime/runtime-artifact.js +90 -0
  16. package/agentcore/runtime/runtime-authorizer-configuration.d.ts +62 -0
  17. package/agentcore/runtime/runtime-authorizer-configuration.js +165 -0
  18. package/agentcore/runtime/runtime-base.d.ts +309 -0
  19. package/agentcore/runtime/runtime-base.js +207 -0
  20. package/agentcore/runtime/runtime-endpoint-base.d.ts +130 -0
  21. package/agentcore/runtime/runtime-endpoint-base.js +31 -0
  22. package/agentcore/runtime/runtime-endpoint.d.ts +182 -0
  23. package/agentcore/runtime/runtime-endpoint.js +372 -0
  24. package/agentcore/runtime/runtime.d.ts +230 -0
  25. package/agentcore/runtime/runtime.js +590 -0
  26. package/agentcore/runtime/types.d.ts +16 -0
  27. package/agentcore/runtime/types.js +21 -0
  28. package/agentcore/runtime/validation-helpers.d.ts +37 -0
  29. package/agentcore/runtime/validation-helpers.js +85 -0
  30. package/agentcore/tools/browser.d.ts +519 -0
  31. package/agentcore/tools/browser.js +641 -0
  32. package/agentcore/tools/code-interpreter.d.ts +447 -0
  33. package/agentcore/tools/code-interpreter.js +553 -0
  34. package/agentcore/tools/perms.d.ts +74 -0
  35. package/agentcore/tools/perms.js +122 -0
  36. package/agentcore/tools/validation-helpers.d.ts +37 -0
  37. package/agentcore/tools/validation-helpers.js +85 -0
  38. package/jest.config.js +2 -0
  39. package/lib/index.d.ts +1 -0
  40. package/lib/index.js +22 -0
  41. package/package.json +122 -0
  42. package/rosetta/_generated.ts-fixture +6 -0
  43. package/rosetta/default.ts-fixture +19 -0
@@ -0,0 +1,372 @@
1
+ "use strict";
2
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
4
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
5
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
6
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
7
+ var _, done = false;
8
+ for (var i = decorators.length - 1; i >= 0; i--) {
9
+ var context = {};
10
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
11
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
12
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
13
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
14
+ if (kind === "accessor") {
15
+ if (result === void 0) continue;
16
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
17
+ if (_ = accept(result.get)) descriptor.get = _;
18
+ if (_ = accept(result.set)) descriptor.set = _;
19
+ if (_ = accept(result.init)) initializers.unshift(_);
20
+ }
21
+ else if (_ = accept(result)) {
22
+ if (kind === "field") initializers.unshift(_);
23
+ else descriptor[key] = _;
24
+ }
25
+ }
26
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
27
+ done = true;
28
+ };
29
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
30
+ var useValue = arguments.length > 2;
31
+ for (var i = 0; i < initializers.length; i++) {
32
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
33
+ }
34
+ return useValue ? value : void 0;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.RuntimeEndpoint = void 0;
38
+ const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
41
+ const bedrockagentcore = require("aws-cdk-lib/aws-bedrockagentcore");
42
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
43
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
44
+ const runtime_endpoint_base_1 = require("./runtime-endpoint-base");
45
+ const validation_helpers_1 = require("./validation-helpers");
46
+ /******************************************************************************
47
+ * Class
48
+ *****************************************************************************/
49
+ /**
50
+ * Bedrock Agent Core Runtime Endpoint
51
+ * Provides a stable endpoint for invoking agent runtimes with versioning support
52
+ *
53
+ * @resource AWS::BedrockAgentCore::RuntimeEndpoint
54
+ * @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-endpoint.html
55
+ */
56
+ let RuntimeEndpoint = (() => {
57
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
58
+ let _classDescriptor;
59
+ let _classExtraInitializers = [];
60
+ let _classThis;
61
+ let _classSuper = runtime_endpoint_base_1.RuntimeEndpointBase;
62
+ var RuntimeEndpoint = class extends _classSuper {
63
+ static { _classThis = this; }
64
+ static {
65
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
66
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
67
+ RuntimeEndpoint = _classThis = _classDescriptor.value;
68
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
69
+ }
70
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.RuntimeEndpoint", version: "2.221.0-alpha.0" };
71
+ /** Uniquely identifies this class. */
72
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.RuntimeEndpoint';
73
+ /**
74
+ * Import an existing Agent Runtime Endpoint using attributes
75
+ * This allows you to reference an Agent Runtime Endpoint that was created outside of CDK
76
+ *
77
+ * @param scope The construct scope
78
+ * @param id The construct id
79
+ * @param attrs The attributes of the existing Agent Runtime Endpoint
80
+ * @returns An IRuntimeEndpoint instance representing the imported endpoint
81
+ */
82
+ static fromRuntimeEndpointAttributes(scope, id, attrs) {
83
+ try {
84
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_RuntimeEndpointAttributes(attrs);
85
+ }
86
+ catch (error) {
87
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
88
+ Error.captureStackTrace(error, this.fromRuntimeEndpointAttributes);
89
+ }
90
+ throw error;
91
+ }
92
+ class ImportedBedrockAgentRuntimeEndpoint extends runtime_endpoint_base_1.RuntimeEndpointBase {
93
+ agentRuntimeEndpointArn = attrs.agentRuntimeEndpointArn;
94
+ endpointName = attrs.endpointName;
95
+ agentRuntimeArn = attrs.agentRuntimeArn;
96
+ description = attrs.description;
97
+ status = attrs.status;
98
+ liveVersion = attrs.liveVersion;
99
+ targetVersion = attrs.targetVersion;
100
+ createdAt = attrs.createdAt;
101
+ endpointId = attrs.endpointId;
102
+ lastUpdatedAt = attrs.lastUpdatedAt;
103
+ }
104
+ return new ImportedBedrockAgentRuntimeEndpoint(scope, id);
105
+ }
106
+ // Properties from base interface
107
+ /**
108
+ * The ARN of the agent runtime endpoint
109
+ * @attribute
110
+ * @returns a token representing the ARN of this agent runtime endpoint
111
+ */
112
+ agentRuntimeEndpointArn;
113
+ /**
114
+ * The name of the endpoint
115
+ * @attribute
116
+ * @returns a token representing the name of this endpoint
117
+ */
118
+ endpointName;
119
+ /**
120
+ * The ARN of the agent runtime associated with this endpoint
121
+ * @attribute
122
+ * @returns a token representing the ARN of the agent runtime
123
+ */
124
+ agentRuntimeArn;
125
+ /**
126
+ * The status of the endpoint
127
+ * @attribute
128
+ * @returns a token representing the status of this endpoint
129
+ */
130
+ status;
131
+ /**
132
+ * The live version of the endpoint
133
+ * @attribute
134
+ * @returns a token representing the live version of this endpoint
135
+ */
136
+ liveVersion;
137
+ /**
138
+ * The target version of the endpoint
139
+ * @attribute
140
+ * @returns a token representing the target version of this endpoint
141
+ */
142
+ targetVersion;
143
+ /**
144
+ * The timestamp when the endpoint was created
145
+ * @attribute
146
+ * @returns a token representing the creation timestamp of this endpoint
147
+ */
148
+ createdAt;
149
+ /**
150
+ * Optional description for the endpoint
151
+ */
152
+ description;
153
+ /**
154
+ * The unique identifier of the runtime endpoint
155
+ * @attribute
156
+ * @returns a token representing the ID of this endpoint
157
+ */
158
+ endpointId;
159
+ /**
160
+ * The ID of the agent runtime associated with this endpoint
161
+ */
162
+ agentRuntimeId;
163
+ /**
164
+ * The version of the agent runtime used by this endpoint
165
+ */
166
+ agentRuntimeVersion;
167
+ /**
168
+ * When this endpoint was last updated
169
+ * @attribute
170
+ * @returns a token representing the last update timestamp of this endpoint
171
+ */
172
+ lastUpdatedAt;
173
+ endpointResource;
174
+ constructor(scope, id, props) {
175
+ super(scope, id);
176
+ try {
177
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_RuntimeEndpointProps(props);
178
+ }
179
+ catch (error) {
180
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
181
+ Error.captureStackTrace(error, RuntimeEndpoint);
182
+ }
183
+ throw error;
184
+ }
185
+ // CDK Analytics Telemetry
186
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
187
+ // Set and validate properties immediately
188
+ this.endpointName = props.endpointName;
189
+ this.validateEndpointName();
190
+ this.agentRuntimeId = props.agentRuntimeId;
191
+ this.validateAgentRuntimeId();
192
+ this.agentRuntimeVersion = props.agentRuntimeVersion ?? '1';
193
+ this.validateAgentRuntimeVersion();
194
+ this.description = props.description;
195
+ if (this.description) {
196
+ this.validateDescription();
197
+ }
198
+ if (props.tags) {
199
+ this.validateTags(props.tags);
200
+ }
201
+ const cfnProps = {
202
+ name: this.endpointName,
203
+ agentRuntimeId: aws_cdk_lib_1.Lazy.string({
204
+ produce: () => this.renderAgentRuntimeId(),
205
+ }),
206
+ agentRuntimeVersion: aws_cdk_lib_1.Lazy.string({
207
+ produce: () => this.renderAgentRuntimeVersion(),
208
+ }),
209
+ description: aws_cdk_lib_1.Lazy.string({
210
+ produce: () => this.renderDescription(),
211
+ }),
212
+ tags: props.tags ?? {},
213
+ };
214
+ this.endpointResource = new bedrockagentcore.CfnRuntimeEndpoint(this, 'Resource', cfnProps);
215
+ this.endpointId = this.endpointResource.attrId;
216
+ this.agentRuntimeEndpointArn = this.endpointResource.attrAgentRuntimeEndpointArn;
217
+ this.agentRuntimeArn = this.endpointResource.attrAgentRuntimeArn;
218
+ this.status = this.endpointResource.attrStatus;
219
+ this.liveVersion = this.endpointResource.attrLiveVersion;
220
+ this.targetVersion = this.endpointResource.attrTargetVersion;
221
+ this.createdAt = this.endpointResource.attrCreatedAt;
222
+ this.lastUpdatedAt = this.endpointResource.attrLastUpdatedAt;
223
+ }
224
+ /**
225
+ * Renders the agent runtime ID for CloudFormation
226
+ * @internal
227
+ */
228
+ renderAgentRuntimeId() {
229
+ return this.agentRuntimeId;
230
+ }
231
+ /**
232
+ * Renders the agent runtime version for CloudFormation
233
+ * @internal
234
+ */
235
+ renderAgentRuntimeVersion() {
236
+ return this.agentRuntimeVersion;
237
+ }
238
+ /**
239
+ * Renders the description for CloudFormation
240
+ * @internal
241
+ */
242
+ renderDescription() {
243
+ return this.description;
244
+ }
245
+ /**
246
+ * Validates the endpoint name format
247
+ * Pattern: ^[a-zA-Z][a-zA-Z0-9_]{0,47}$
248
+ * @throws Error if validation fails
249
+ */
250
+ validateEndpointName() {
251
+ // Skip validation if the name contains CDK tokens (unresolved values)
252
+ if (aws_cdk_lib_1.Token.isUnresolved(this.endpointName)) {
253
+ return;
254
+ }
255
+ // Validate length
256
+ const lengthErrors = (0, validation_helpers_1.validateStringField)({
257
+ value: this.endpointName,
258
+ fieldName: 'Endpoint name',
259
+ minLength: 1,
260
+ maxLength: 48,
261
+ });
262
+ // Validate pattern
263
+ const patternErrors = (0, validation_helpers_1.validateFieldPattern)(this.endpointName, 'Endpoint name', /^[a-zA-Z][a-zA-Z0-9_]{0,47}$/, 'Endpoint name must start with a letter and contain only letters, numbers, and underscores');
264
+ // Combine and throw if any errors
265
+ const allErrors = [...lengthErrors, ...patternErrors];
266
+ if (allErrors.length > 0) {
267
+ throw new validation_helpers_1.ValidationError(allErrors.join('\n'));
268
+ }
269
+ }
270
+ /**
271
+ * Validates the description format
272
+ * Must be between 1 and 256 characters (per CloudFormation specification)
273
+ * @throws Error if validation fails
274
+ */
275
+ validateDescription() {
276
+ if (aws_cdk_lib_1.Token.isUnresolved(this.description)) {
277
+ return;
278
+ }
279
+ if (this.description) {
280
+ const errors = (0, validation_helpers_1.validateStringField)({
281
+ value: this.description,
282
+ fieldName: 'Description',
283
+ minLength: 1,
284
+ maxLength: 256,
285
+ });
286
+ if (errors.length > 0) {
287
+ throw new validation_helpers_1.ValidationError(errors.join('\n'));
288
+ }
289
+ }
290
+ }
291
+ /**
292
+ * Validates the agent runtime ID format
293
+ * Pattern: ^[a-zA-Z][a-zA-Z0-9_]{0,99}-[a-zA-Z0-9]{10}$
294
+ * @throws Error if validation fails
295
+ */
296
+ validateAgentRuntimeId() {
297
+ // Skip validation if the ID contains CDK tokens (unresolved values)
298
+ if (aws_cdk_lib_1.Token.isUnresolved(this.agentRuntimeId)) {
299
+ return;
300
+ }
301
+ // Validate pattern only (no length validation per AWS specs)
302
+ const patternErrors = (0, validation_helpers_1.validateFieldPattern)(this.agentRuntimeId, 'Agent runtime ID', /^[a-zA-Z][a-zA-Z0-9_]{0,99}-[a-zA-Z0-9]{10}$/, 'Agent runtime ID must start with a letter, followed by up to 99 alphanumeric or underscore characters, then a hyphen, and exactly 10 alphanumeric characters');
303
+ if (patternErrors.length > 0) {
304
+ throw new validation_helpers_1.ValidationError(patternErrors.join('\n'));
305
+ }
306
+ }
307
+ /**
308
+ * Validates the agent runtime version format
309
+ * Pattern: ^([1-9][0-9]{0,4})$
310
+ * @throws Error if validation fails
311
+ */
312
+ validateAgentRuntimeVersion() {
313
+ if (aws_cdk_lib_1.Token.isUnresolved(this.agentRuntimeVersion)) {
314
+ return;
315
+ }
316
+ // Validate pattern only (no length validation per AWS specs)
317
+ const patternErrors = (0, validation_helpers_1.validateFieldPattern)(this.agentRuntimeVersion, 'Agent runtime version', /^[1-9]\d{0,4}$/, 'Agent runtime version must be a number between 1 and 99999');
318
+ if (patternErrors.length > 0) {
319
+ throw new validation_helpers_1.ValidationError(patternErrors.join('\n'));
320
+ }
321
+ }
322
+ /**
323
+ * Validates the tags format
324
+ * @param tags The tags object to validate
325
+ * @throws Error if validation fails
326
+ */
327
+ validateTags(tags) {
328
+ for (const [key, value] of Object.entries(tags)) {
329
+ if (aws_cdk_lib_1.Token.isUnresolved(key) || aws_cdk_lib_1.Token.isUnresolved(value)) {
330
+ continue;
331
+ }
332
+ // Validate tag key length
333
+ const keyLengthErrors = (0, validation_helpers_1.validateStringField)({
334
+ value: key,
335
+ fieldName: `Tag key "${key}"`,
336
+ minLength: 1,
337
+ maxLength: 256,
338
+ });
339
+ // Validate tag key pattern
340
+ const keyPatternErrors = (0, validation_helpers_1.validateFieldPattern)(key, `Tag key "${key}"`, /^[a-zA-Z0-9\s._:/=+@-]*$/, `Tag key "${key}" can only contain letters (a-z, A-Z), numbers (0-9), spaces, and special characters (._:/=+@-)`);
341
+ // Combine key errors and throw if any
342
+ const keyErrors = [...keyLengthErrors, ...keyPatternErrors];
343
+ if (keyErrors.length > 0) {
344
+ throw new validation_helpers_1.ValidationError(keyErrors.join('\n'));
345
+ }
346
+ if (value === undefined || value === null) {
347
+ throw new validation_helpers_1.ValidationError(`Tag value for key "${key}" cannot be null or undefined`);
348
+ }
349
+ // Validate tag value length
350
+ const valueLengthErrors = (0, validation_helpers_1.validateStringField)({
351
+ value: value,
352
+ fieldName: `Tag value for key "${key}"`,
353
+ minLength: 0,
354
+ maxLength: 256,
355
+ });
356
+ // Validate tag value pattern
357
+ const valuePatternErrors = (0, validation_helpers_1.validateFieldPattern)(value, `Tag value for key "${key}"`, /^[a-zA-Z0-9\s._:/=+@-]*$/, `Tag value for key "${key}" can only contain letters (a-z, A-Z), numbers (0-9), spaces, and special characters (._:/=+@-)`);
358
+ // Combine value errors and throw if any
359
+ const valueErrors = [...valueLengthErrors, ...valuePatternErrors];
360
+ if (valueErrors.length > 0) {
361
+ throw new validation_helpers_1.ValidationError(valueErrors.join('\n'));
362
+ }
363
+ }
364
+ }
365
+ static {
366
+ __runInitializers(_classThis, _classExtraInitializers);
367
+ }
368
+ };
369
+ return RuntimeEndpoint = _classThis;
370
+ })();
371
+ exports.RuntimeEndpoint = RuntimeEndpoint;
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1lbmRwb2ludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJ1bnRpbWUtZW5kcG9pbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQTBDO0FBQzFDLHFFQUFxRTtBQUNyRSw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBRTFFLG1FQUEyRztBQUMzRyw2REFBa0c7QUFpRGxHOzsrRUFFK0U7QUFFL0U7Ozs7OztHQU1HO0lBRVUsZUFBZTs0QkFEM0Isb0NBQWtCOzs7O3NCQUNrQiwyQ0FBbUI7K0JBQTNCLFNBQVEsV0FBbUI7Ozs7WUFBeEQsNktBd1ZDOzs7OztRQXZWQyxzQ0FBc0M7UUFDL0IsTUFBTSxDQUFVLHFCQUFxQixHQUFXLHNEQUFzRCxDQUFDO1FBRTlHOzs7Ozs7OztXQVFHO1FBQ0ksTUFBTSxDQUFDLDZCQUE2QixDQUN6QyxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBZ0M7Ozs7Ozs7Ozs7WUFFaEMsTUFBTSxtQ0FBb0MsU0FBUSwyQ0FBbUI7Z0JBQ25ELHVCQUF1QixHQUFHLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQztnQkFDeEQsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7Z0JBQ2xDLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO2dCQUN4QyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztnQkFDaEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO2dCQUNoQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztnQkFDcEMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7Z0JBQzVCLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO2dCQUM5QixhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQzthQUNyRDtZQUVELE9BQU8sSUFB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MENBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUb2tlbiwgTGF6eSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGJlZHJvY2thZ2VudGNvcmUgZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2thZ2VudGNvcmUnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBSdW50aW1lRW5kcG9pbnRCYXNlLCBJUnVudGltZUVuZHBvaW50LCBSdW50aW1lRW5kcG9pbnRBdHRyaWJ1dGVzIH0gZnJvbSAnLi9ydW50aW1lLWVuZHBvaW50LWJhc2UnO1xuaW1wb3J0IHsgdmFsaWRhdGVTdHJpbmdGaWVsZCwgdmFsaWRhdGVGaWVsZFBhdHRlcm4sIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4vdmFsaWRhdGlvbi1oZWxwZXJzJztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBCZWRyb2NrIEFnZW50IENvcmUgUnVudGltZSBFbmRwb2ludCByZXNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVFbmRwb2ludFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhZ2VudCBydW50aW1lIGVuZHBvaW50XG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpXG4gICAqIE11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY2FuIGJlIHVwIHRvIDQ4IGNoYXJhY3RlcnMgbG9uZ1xuICAgKiBQYXR0ZXJuOiBeW2EtekEtWl1bYS16QS1aMC05X117MCw0N30kXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBhZ2VudCBydW50aW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgZW5kcG9pbnRcbiAgICogVGhpcyBpcyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJ1bnRpbWUgcmVzb3VyY2VcbiAgICogUGF0dGVybjogXlthLXpBLVpdW2EtekEtWjAtOV9dezAsOTl9LVthLXpBLVowLTldezEwfSRcbiAgICovXG4gIHJlYWRvbmx5IGFnZW50UnVudGltZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBhZ2VudCBydW50aW1lIHRvIHVzZSBmb3IgdGhpcyBlbmRwb2ludFxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZW5kcG9pbnQgd2lsbCBwb2ludCB0byB2ZXJzaW9uIFwiMVwiIG9mIHRoZSBydW50aW1lLlxuICAgKiBQYXR0ZXJuOiBeKFsxLTldWzAtOV17MCw0fSkkXG4gICAqIEBkZWZhdWx0IFwiMVwiXG4gICAqL1xuICByZWFkb25seSBhZ2VudFJ1bnRpbWVWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWUgZW5kcG9pbnRcbiAgICogTGVuZ3RoIE1pbmltdW06IDEgLCAgTWF4aW11bTogMjU2XG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYWdzIGZvciB0aGUgYWdlbnQgcnVudGltZSBlbmRwb2ludFxuICAgKiBBIGxpc3Qgb2Yga2V5OnZhbHVlIHBhaXJzIG9mIHRhZ3MgdG8gYXBwbHkgdG8gdGhpcyBSdW50aW1lRW5kcG9pbnQgcmVzb3VyY2VcbiAgICogUGF0dGVybjogXlthLXpBLVowLTlcXHMuXzovPStALV0qJFxuICAgKiBAZGVmYXVsdCB7fSAtIG5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBCZWRyb2NrIEFnZW50IENvcmUgUnVudGltZSBFbmRwb2ludFxuICogUHJvdmlkZXMgYSBzdGFibGUgZW5kcG9pbnQgZm9yIGludm9raW5nIGFnZW50IHJ1bnRpbWVzIHdpdGggdmVyc2lvbmluZyBzdXBwb3J0XG4gKlxuICogQHJlc291cmNlIEFXUzo6QmVkcm9ja0FnZW50Q29yZTo6UnVudGltZUVuZHBvaW50XG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvcnVudGltZS1lbmRwb2ludC5odG1sXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBSdW50aW1lRW5kcG9pbnQgZXh0ZW5kcyBSdW50aW1lRW5kcG9pbnRCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtYmVkcm9jay1hZ2VudGNvcmUtYWxwaGEuUnVudGltZUVuZHBvaW50JztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIEFnZW50IFJ1bnRpbWUgRW5kcG9pbnQgdXNpbmcgYXR0cmlidXRlc1xuICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gcmVmZXJlbmNlIGFuIEFnZW50IFJ1bnRpbWUgRW5kcG9pbnQgdGhhdCB3YXMgY3JlYXRlZCBvdXRzaWRlIG9mIENES1xuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCBpZFxuICAgKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGV4aXN0aW5nIEFnZW50IFJ1bnRpbWUgRW5kcG9pbnRcbiAgICogQHJldHVybnMgQW4gSVJ1bnRpbWVFbmRwb2ludCBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIGltcG9ydGVkIGVuZHBvaW50XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21SdW50aW1lRW5kcG9pbnRBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogUnVudGltZUVuZHBvaW50QXR0cmlidXRlcyxcbiAgKTogSVJ1bnRpbWVFbmRwb2ludCB7XG4gICAgY2xhc3MgSW1wb3J0ZWRCZWRyb2NrQWdlbnRSdW50aW1lRW5kcG9pbnQgZXh0ZW5kcyBSdW50aW1lRW5kcG9pbnRCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVFbmRwb2ludEFybiA9IGF0dHJzLmFnZW50UnVudGltZUVuZHBvaW50QXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50TmFtZSA9IGF0dHJzLmVuZHBvaW50TmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVBcm4gPSBhdHRycy5hZ2VudFJ1bnRpbWVBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb24gPSBhdHRycy5kZXNjcmlwdGlvbjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXMgPSBhdHRycy5zdGF0dXM7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbGl2ZVZlcnNpb24gPSBhdHRycy5saXZlVmVyc2lvbjtcbiAgICAgIHB1YmxpYyByZWFkb25seSB0YXJnZXRWZXJzaW9uID0gYXR0cnMudGFyZ2V0VmVyc2lvbjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQgPSBhdHRycy5jcmVhdGVkQXQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnRJZCA9IGF0dHJzLmVuZHBvaW50SWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdCA9IGF0dHJzLmxhc3RVcGRhdGVkQXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZEJlZHJvY2tBZ2VudFJ1bnRpbWVFbmRwb2ludChzY29wZSwgaWQpO1xuICB9XG5cbiAgLy8gUHJvcGVydGllcyBmcm9tIGJhc2UgaW50ZXJmYWNlXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBhZ2VudCBydW50aW1lIGVuZHBvaW50XG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIEFSTiBvZiB0aGlzIGFnZW50IHJ1bnRpbWUgZW5kcG9pbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVFbmRwb2ludEFybjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGVuZHBvaW50XG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBlbmRwb2ludFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50TmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYWdlbnQgcnVudGltZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbmRwb2ludFxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBBUk4gb2YgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIGVuZHBvaW50XG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyBvZiB0aGlzIGVuZHBvaW50XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGxpdmUgdmVyc2lvbiBvZiB0aGUgZW5kcG9pbnRcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgbGl2ZSB2ZXJzaW9uIG9mIHRoaXMgZW5kcG9pbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsaXZlVmVyc2lvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgdmVyc2lvbiBvZiB0aGUgZW5kcG9pbnRcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgdGFyZ2V0IHZlcnNpb24gb2YgdGhpcyBlbmRwb2ludFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldFZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGVuZHBvaW50IHdhcyBjcmVhdGVkXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGNyZWF0aW9uIHRpbWVzdGFtcCBvZiB0aGlzIGVuZHBvaW50XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBlbmRwb2ludFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBydW50aW1lIGVuZHBvaW50XG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIElEIG9mIHRoaXMgZW5kcG9pbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIGFnZW50IHJ1bnRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW5kcG9pbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGFnZW50IHJ1bnRpbWUgdXNlZCBieSB0aGlzIGVuZHBvaW50XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lVmVyc2lvbjogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGlzIGVuZHBvaW50IHdhcyBsYXN0IHVwZGF0ZWRcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgbGFzdCB1cGRhdGUgdGltZXN0YW1wIG9mIHRoaXMgZW5kcG9pbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsYXN0VXBkYXRlZEF0Pzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnRSZXNvdXJjZTogYmVkcm9ja2FnZW50Y29yZS5DZm5SdW50aW1lRW5kcG9pbnQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJ1bnRpbWVFbmRwb2ludFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgLy8gU2V0IGFuZCB2YWxpZGF0ZSBwcm9wZXJ0aWVzIGltbWVkaWF0ZWx5XG4gICAgdGhpcy5lbmRwb2ludE5hbWUgPSBwcm9wcy5lbmRwb2ludE5hbWU7XG4gICAgdGhpcy52YWxpZGF0ZUVuZHBvaW50TmFtZSgpO1xuXG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVJZCA9IHByb3BzLmFnZW50UnVudGltZUlkO1xuICAgIHRoaXMudmFsaWRhdGVBZ2VudFJ1bnRpbWVJZCgpO1xuXG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVWZXJzaW9uID0gcHJvcHMuYWdlbnRSdW50aW1lVmVyc2lvbiA/PyAnMSc7XG4gICAgdGhpcy52YWxpZGF0ZUFnZW50UnVudGltZVZlcnNpb24oKTtcblxuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBwcm9wcy5kZXNjcmlwdGlvbjtcbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy52YWxpZGF0ZURlc2NyaXB0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnRhZ3MpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVUYWdzKHByb3BzLnRhZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0IGNmblByb3BzOiBiZWRyb2NrYWdlbnRjb3JlLkNmblJ1bnRpbWVFbmRwb2ludFByb3BzID0ge1xuICAgICAgbmFtZTogdGhpcy5lbmRwb2ludE5hbWUsXG4gICAgICBhZ2VudFJ1bnRpbWVJZDogTGF6eS5zdHJpbmcoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLnJlbmRlckFnZW50UnVudGltZUlkKCksXG4gICAgICB9KSxcbiAgICAgIGFnZW50UnVudGltZVZlcnNpb246IExhenkuc3RyaW5nKHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gdGhpcy5yZW5kZXJBZ2VudFJ1bnRpbWVWZXJzaW9uKCksXG4gICAgICB9KSxcbiAgICAgIGRlc2NyaXB0aW9uOiBMYXp5LnN0cmluZyh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMucmVuZGVyRGVzY3JpcHRpb24oKSxcbiAgICAgIH0pLFxuICAgICAgdGFnczogcHJvcHMudGFncyA/PyB7fSxcbiAgICB9O1xuXG4gICAgdGhpcy5lbmRwb2ludFJlc291cmNlID0gbmV3IGJlZHJvY2thZ2VudGNvcmUuQ2ZuUnVudGltZUVuZHBvaW50KHRoaXMsICdSZXNvdXJjZScsIGNmblByb3BzKTtcblxuICAgIHRoaXMuZW5kcG9pbnRJZCA9IHRoaXMuZW5kcG9pbnRSZXNvdXJjZS5hdHRySWQ7XG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVFbmRwb2ludEFybiA9IHRoaXMuZW5kcG9pbnRSZXNvdXJjZS5hdHRyQWdlbnRSdW50aW1lRW5kcG9pbnRBcm47XG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVBcm4gPSB0aGlzLmVuZHBvaW50UmVzb3VyY2UuYXR0ckFnZW50UnVudGltZUFybjtcbiAgICB0aGlzLnN0YXR1cyA9IHRoaXMuZW5kcG9pbnRSZXNvdXJjZS5hdHRyU3RhdHVzO1xuICAgIHRoaXMubGl2ZVZlcnNpb24gPSB0aGlzLmVuZHBvaW50UmVzb3VyY2UuYXR0ckxpdmVWZXJzaW9uO1xuICAgIHRoaXMudGFyZ2V0VmVyc2lvbiA9IHRoaXMuZW5kcG9pbnRSZXNvdXJjZS5hdHRyVGFyZ2V0VmVyc2lvbjtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IHRoaXMuZW5kcG9pbnRSZXNvdXJjZS5hdHRyQ3JlYXRlZEF0O1xuICAgIHRoaXMubGFzdFVwZGF0ZWRBdCA9IHRoaXMuZW5kcG9pbnRSZXNvdXJjZS5hdHRyTGFzdFVwZGF0ZWRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBhZ2VudCBydW50aW1lIElEIGZvciBDbG91ZEZvcm1hdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQWdlbnRSdW50aW1lSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hZ2VudFJ1bnRpbWVJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBhZ2VudCBydW50aW1lIHZlcnNpb24gZm9yIENsb3VkRm9ybWF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJBZ2VudFJ1bnRpbWVWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYWdlbnRSdW50aW1lVmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBkZXNjcmlwdGlvbiBmb3IgQ2xvdWRGb3JtYXRpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBlbmRwb2ludCBuYW1lIGZvcm1hdFxuICAgKiBQYXR0ZXJuOiBeW2EtekEtWl1bYS16QS1aMC05X117MCw0N30kXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVuZHBvaW50TmFtZSgpOiB2b2lkIHtcbiAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgdGhlIG5hbWUgY29udGFpbnMgQ0RLIHRva2VucyAodW5yZXNvbHZlZCB2YWx1ZXMpXG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLmVuZHBvaW50TmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsZW5ndGhcbiAgICBjb25zdCBsZW5ndGhFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgIHZhbHVlOiB0aGlzLmVuZHBvaW50TmFtZSxcbiAgICAgIGZpZWxkTmFtZTogJ0VuZHBvaW50IG5hbWUnLFxuICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgbWF4TGVuZ3RoOiA0OCxcbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRlIHBhdHRlcm5cbiAgICBjb25zdCBwYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICB0aGlzLmVuZHBvaW50TmFtZSxcbiAgICAgICdFbmRwb2ludCBuYW1lJyxcbiAgICAgIC9eW2EtekEtWl1bYS16QS1aMC05X117MCw0N30kLyxcbiAgICAgICdFbmRwb2ludCBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY29udGFpbiBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGFuZCB1bmRlcnNjb3JlcycsXG4gICAgKTtcblxuICAgIC8vIENvbWJpbmUgYW5kIHRocm93IGlmIGFueSBlcnJvcnNcbiAgICBjb25zdCBhbGxFcnJvcnMgPSBbLi4ubGVuZ3RoRXJyb3JzLCAuLi5wYXR0ZXJuRXJyb3JzXTtcbiAgICBpZiAoYWxsRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYWxsRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBkZXNjcmlwdGlvbiBmb3JtYXRcbiAgICogTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NiBjaGFyYWN0ZXJzIChwZXIgQ2xvdWRGb3JtYXRpb24gc3BlY2lmaWNhdGlvbilcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRGVzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLmRlc2NyaXB0aW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgIGZpZWxkTmFtZTogJ0Rlc2NyaXB0aW9uJyxcbiAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICBtYXhMZW5ndGg6IDI1NixcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGFnZW50IHJ1bnRpbWUgSUQgZm9ybWF0XG4gICAqIFBhdHRlcm46IF5bYS16QS1aXVthLXpBLVowLTlfXXswLDk5fS1bYS16QS1aMC05XXsxMH0kXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFnZW50UnVudGltZUlkKCk6IHZvaWQge1xuICAgIC8vIFNraXAgdmFsaWRhdGlvbiBpZiB0aGUgSUQgY29udGFpbnMgQ0RLIHRva2VucyAodW5yZXNvbHZlZCB2YWx1ZXMpXG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLmFnZW50UnVudGltZUlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHBhdHRlcm4gb25seSAobm8gbGVuZ3RoIHZhbGlkYXRpb24gcGVyIEFXUyBzcGVjcylcbiAgICBjb25zdCBwYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICB0aGlzLmFnZW50UnVudGltZUlkLFxuICAgICAgJ0FnZW50IHJ1bnRpbWUgSUQnLFxuICAgICAgL15bYS16QS1aXVthLXpBLVowLTlfXXswLDk5fS1bYS16QS1aMC05XXsxMH0kLyxcbiAgICAgICdBZ2VudCBydW50aW1lIElEIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciwgZm9sbG93ZWQgYnkgdXAgdG8gOTkgYWxwaGFudW1lcmljIG9yIHVuZGVyc2NvcmUgY2hhcmFjdGVycywgdGhlbiBhIGh5cGhlbiwgYW5kIGV4YWN0bHkgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMnLFxuICAgICk7XG5cbiAgICBpZiAocGF0dGVybkVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHBhdHRlcm5FcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGFnZW50IHJ1bnRpbWUgdmVyc2lvbiBmb3JtYXRcbiAgICogUGF0dGVybjogXihbMS05XVswLTldezAsNH0pJFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVBZ2VudFJ1bnRpbWVWZXJzaW9uKCk6IHZvaWQge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5hZ2VudFJ1bnRpbWVWZXJzaW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHBhdHRlcm4gb25seSAobm8gbGVuZ3RoIHZhbGlkYXRpb24gcGVyIEFXUyBzcGVjcylcbiAgICBjb25zdCBwYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICB0aGlzLmFnZW50UnVudGltZVZlcnNpb24sXG4gICAgICAnQWdlbnQgcnVudGltZSB2ZXJzaW9uJyxcbiAgICAgIC9eWzEtOV1cXGR7MCw0fSQvLFxuICAgICAgJ0FnZW50IHJ1bnRpbWUgdmVyc2lvbiBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMSBhbmQgOTk5OTknLFxuICAgICk7XG5cbiAgICBpZiAocGF0dGVybkVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHBhdHRlcm5FcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHRhZ3MgZm9ybWF0XG4gICAqIEBwYXJhbSB0YWdzIFRoZSB0YWdzIG9iamVjdCB0byB2YWxpZGF0ZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVUYWdzKHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YWdzKSkge1xuICAgICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChrZXkpIHx8IFRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRhZyBrZXkgbGVuZ3RoXG4gICAgICBjb25zdCBrZXlMZW5ndGhFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgZmllbGROYW1lOiBgVGFnIGtleSBcIiR7a2V5fVwiYCxcbiAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICBtYXhMZW5ndGg6IDI1NixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcga2V5IHBhdHRlcm5cbiAgICAgIGNvbnN0IGtleVBhdHRlcm5FcnJvcnMgPSB2YWxpZGF0ZUZpZWxkUGF0dGVybihcbiAgICAgICAga2V5LFxuICAgICAgICBgVGFnIGtleSBcIiR7a2V5fVwiYCxcbiAgICAgICAgL15bYS16QS1aMC05XFxzLl86Lz0rQC1dKiQvLFxuICAgICAgICBgVGFnIGtleSBcIiR7a2V5fVwiIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycyAoYS16LCBBLVopLCBudW1iZXJzICgwLTkpLCBzcGFjZXMsIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMgKC5fOi89K0AtKWAsXG4gICAgICApO1xuXG4gICAgICAvLyBDb21iaW5lIGtleSBlcnJvcnMgYW5kIHRocm93IGlmIGFueVxuICAgICAgY29uc3Qga2V5RXJyb3JzID0gWy4uLmtleUxlbmd0aEVycm9ycywgLi4ua2V5UGF0dGVybkVycm9yc107XG4gICAgICBpZiAoa2V5RXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihrZXlFcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBUYWcgdmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZGApO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcgdmFsdWUgbGVuZ3RoXG4gICAgICBjb25zdCB2YWx1ZUxlbmd0aEVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZTogYFRhZyB2YWx1ZSBmb3Iga2V5IFwiJHtrZXl9XCJgLFxuICAgICAgICBtaW5MZW5ndGg6IDAsXG4gICAgICAgIG1heExlbmd0aDogMjU2LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRhZyB2YWx1ZSBwYXR0ZXJuXG4gICAgICBjb25zdCB2YWx1ZVBhdHRlcm5FcnJvcnMgPSB2YWxpZGF0ZUZpZWxkUGF0dGVybihcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGBUYWcgdmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiYCxcbiAgICAgICAgL15bYS16QS1aMC05XFxzLl86Lz0rQC1dKiQvLFxuICAgICAgICBgVGFnIHZhbHVlIGZvciBrZXkgXCIke2tleX1cIiBjYW4gb25seSBjb250YWluIGxldHRlcnMgKGEteiwgQS1aKSwgbnVtYmVycyAoMC05KSwgc3BhY2VzLCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzICguXzovPStALSlgLFxuICAgICAgKTtcblxuICAgICAgLy8gQ29tYmluZSB2YWx1ZSBlcnJvcnMgYW5kIHRocm93IGlmIGFueVxuICAgICAgY29uc3QgdmFsdWVFcnJvcnMgPSBbLi4udmFsdWVMZW5ndGhFcnJvcnMsIC4uLnZhbHVlUGF0dGVybkVycm9yc107XG4gICAgICBpZiAodmFsdWVFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHZhbHVlRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,230 @@
1
+ import * as iam from 'aws-cdk-lib/aws-iam';
2
+ import { Construct } from 'constructs';
3
+ import { AgentRuntimeArtifact } from './runtime-artifact';
4
+ import { RuntimeAuthorizerConfiguration } from './runtime-authorizer-configuration';
5
+ import { RuntimeBase, IBedrockAgentRuntime, AgentRuntimeAttributes } from './runtime-base';
6
+ import { RuntimeEndpoint } from './runtime-endpoint';
7
+ import { RuntimeNetworkConfiguration } from '../network/network-configuration';
8
+ import { ProtocolType } from './types';
9
+ /******************************************************************************
10
+ * Props
11
+ *****************************************************************************/
12
+ /**
13
+ * Properties for creating a Bedrock Agent Core Runtime resource
14
+ */
15
+ export interface RuntimeProps {
16
+ /**
17
+ * The name of the agent runtime
18
+ * Valid characters are a-z, A-Z, 0-9, _ (underscore)
19
+ * Must start with a letter and can be up to 48 characters long
20
+ * Pattern: ^[a-zA-Z][a-zA-Z0-9_]{0,47}$
21
+ */
22
+ readonly runtimeName: string;
23
+ /**
24
+ * The artifact configuration for the agent runtime
25
+ * Contains the container configuration with ECR URI
26
+ */
27
+ readonly agentRuntimeArtifact: AgentRuntimeArtifact;
28
+ /**
29
+ * The IAM role that provides permissions for the agent runtime
30
+ * If not provided, a role will be created automatically
31
+ * @default - A new role will be created
32
+ */
33
+ readonly executionRole?: iam.IRole;
34
+ /**
35
+ * Network configuration for the agent runtime
36
+ * @default - RuntimeNetworkConfiguration.usingPublicNetwork()
37
+ */
38
+ readonly networkConfiguration?: RuntimeNetworkConfiguration;
39
+ /**
40
+ * Optional description for the agent runtime
41
+ * @default - No description
42
+ * Length Minimum: 1 , Maximum: 1200
43
+ */
44
+ readonly description?: string;
45
+ /**
46
+ * Protocol configuration for the agent runtime
47
+ * @default - ProtocolType.HTTP
48
+ */
49
+ readonly protocolConfiguration?: ProtocolType;
50
+ /**
51
+ * Environment variables for the agent runtime
52
+ * - Maximum 50 environment variables
53
+ * - Key: Must be 1-100 characters, start with letter or underscore, contain only letters, numbers, and underscores
54
+ * - Value: Must be 0-2048 characters (per CloudFormation specification)
55
+ * @default - No environment variables
56
+ */
57
+ readonly environmentVariables?: {
58
+ [key: string]: string;
59
+ };
60
+ /**
61
+ * Authorizer configuration for the agent runtime
62
+ * Use RuntimeAuthorizerConfiguration static methods to create the configuration
63
+ * @default - RuntimeAuthorizerConfiguration.iam() (IAM authentication)
64
+ */
65
+ readonly authorizerConfiguration?: RuntimeAuthorizerConfiguration;
66
+ /**
67
+ * Tags for the agent runtime
68
+ * A list of key:value pairs of tags to apply to this Runtime resource
69
+ * @default {} - no tags
70
+ */
71
+ readonly tags?: {
72
+ [key: string]: string;
73
+ };
74
+ }
75
+ /**
76
+ * Options for adding an endpoint to the runtime
77
+ */
78
+ export interface AddEndpointOptions {
79
+ /**
80
+ * Description for the endpoint, Must be between 1 and 1200 characters
81
+ * @default - No description
82
+ */
83
+ readonly description?: string;
84
+ /**
85
+ * Override the runtime version for this endpoint
86
+ * @default 1
87
+ */
88
+ readonly version?: string;
89
+ }
90
+ /******************************************************************************
91
+ * Class
92
+ *****************************************************************************/
93
+ /**
94
+ * Bedrock Agent Core Runtime
95
+ * Enables running containerized agents with specific network configurations,
96
+ * security settings, and runtime artifacts.
97
+ *
98
+ * @resource AWS::BedrockAgentCore::Runtime
99
+ * @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime.html
100
+ */
101
+ export declare class Runtime extends RuntimeBase {
102
+ /** Uniquely identifies this class. */
103
+ static readonly PROPERTY_INJECTION_ID: string;
104
+ /**
105
+ * Import an existing Agent Runtime using attributes
106
+ * This allows you to reference an Agent Runtime that was created outside of CDK
107
+ *
108
+ * @param scope The construct scope
109
+ * @param id The construct id
110
+ * @param attrs The attributes of the existing Agent Runtime
111
+ * @returns An IBedrockAgentRuntime instance representing the imported runtime
112
+ */
113
+ static fromAgentRuntimeAttributes(scope: Construct, id: string, attrs: AgentRuntimeAttributes): IBedrockAgentRuntime;
114
+ /**
115
+ * The ARN of the agent runtime
116
+ * @attribute
117
+ * @returns a token representing the ARN of this agent runtime
118
+ */
119
+ readonly agentRuntimeArn: string;
120
+ /**
121
+ * The unique identifier of the agent runtime
122
+ * @attribute
123
+ * @returns a token representing the ID of this agent runtime
124
+ */
125
+ readonly agentRuntimeId: string;
126
+ /**
127
+ * The name of the agent runtime
128
+ * @attribute
129
+ * @returns a token representing the name of this agent runtime
130
+ */
131
+ readonly agentRuntimeName: string;
132
+ readonly role: iam.IRole;
133
+ /**
134
+ * The version of the agent runtime
135
+ * @attribute
136
+ * @returns a token representing the version of this agent runtime
137
+ */
138
+ readonly agentRuntimeVersion?: string;
139
+ /**
140
+ * The status of the agent runtime
141
+ * @attribute
142
+ * @returns a token representing the status of this agent runtime
143
+ */
144
+ readonly agentStatus?: string;
145
+ /**
146
+ * Optional description for the agent runtime
147
+ */
148
+ readonly description?: string;
149
+ /**
150
+ * The timestamp when the agent runtime was created
151
+ * @attribute
152
+ * @returns a token representing the creation timestamp of this agent runtime
153
+ */
154
+ readonly createdAt?: string;
155
+ /**
156
+ * The timestamp when the agent runtime was last updated
157
+ * @attribute
158
+ * @returns a token representing the last update timestamp of this agent runtime
159
+ */
160
+ readonly lastUpdatedAt?: string;
161
+ readonly grantPrincipal: iam.IPrincipal;
162
+ private readonly runtimeResource;
163
+ /**
164
+ * The artifact configuration for the agent runtime
165
+ */
166
+ readonly agentRuntimeArtifact: AgentRuntimeArtifact;
167
+ private readonly networkConfiguration;
168
+ private readonly protocolConfiguration;
169
+ private readonly authorizerConfiguration?;
170
+ constructor(scope: Construct, id: string, props: RuntimeProps);
171
+ /**
172
+ * Renders the environment variables for CloudFormation
173
+ * @internal
174
+ */
175
+ private renderEnvironmentVariables;
176
+ /**
177
+ * Creates an execution role for the agent runtime with proper permissions
178
+ * Based on: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-permissions.html
179
+ */
180
+ private createExecutionRole;
181
+ /**
182
+ * Renders the artifact configuration for CloudFormation
183
+ * @internal
184
+ */
185
+ private renderAgentRuntimeArtifact;
186
+ /**
187
+ * Validates the runtime name format
188
+ * Pattern: ^[a-zA-Z][a-zA-Z0-9_]{0,47}$
189
+ * @throws Error if validation fails
190
+ */
191
+ private validateRuntimeName;
192
+ /**
193
+ * Validates the description format
194
+ * Must be between 1 and 1200 characters (per CloudFormation specification)
195
+ * @throws Error if validation fails
196
+ */
197
+ private validateDescription;
198
+ /**
199
+ * Validates environment variables
200
+ * - Maximum 50 entries
201
+ * - Key: 1-100 characters
202
+ * - Value: 0-2048 characters (per CloudFormation specification)
203
+ * @throws Error if validation fails
204
+ */
205
+ private validateEnvironmentVariables;
206
+ /**
207
+ * Validates the tags format
208
+ * @param tags The tags object to validate
209
+ * @throws Error if validation fails
210
+ */
211
+ private validateTags;
212
+ /**
213
+ * Validates the container URI format
214
+ */
215
+ private validateContainerUri;
216
+ /**
217
+ * Validates the IAM role ARN format and structure
218
+ * @throws Error if validation fails
219
+ */
220
+ private validateRoleArn;
221
+ /**
222
+ * Add an endpoint to this runtime
223
+ * This is a convenience method that creates a RuntimeEndpoint associated with this runtime
224
+ *
225
+ * @param endpointName The name of the endpoint
226
+ * @param options Optional configuration for the endpoint
227
+ * @returns The created RuntimeEndpoint
228
+ */
229
+ addEndpoint(endpointName: string, options?: AddEndpointOptions): RuntimeEndpoint;
230
+ }