stack-scribe-mcp 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2978 +1,286 @@
1
- // src/index.ts
2
- import { randomUUID } from "crypto";
3
- import { writeFileSync } from "fs";
1
+ #! /usr/bin/env node
2
+ import { randomUUID } from "node:crypto";
3
+ import { writeFileSync } from "node:fs";
4
4
  import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
6
  import { toJsonSchemaCompat } from "@modelcontextprotocol/sdk/server/zod-json-schema-compat.js";
7
- import { z as z3 } from "zod";
8
-
9
- // src/layout.ts
10
- import ELK from "elkjs/lib/elk.bundled.js";
11
- var DEFAULT_NODE_WIDTH = 120;
12
- var DEFAULT_NODE_HEIGHT = 98;
13
- var DEFAULT_NODE_SPACING = 120;
14
- var DEFAULT_LAYER_SPACING = 180;
15
- var DEFAULT_DIRECTION = "RIGHT";
16
- var ICON_SIZE = 64;
17
- var ICON_X_OFFSET = Math.round((DEFAULT_NODE_WIDTH - ICON_SIZE) / 2);
18
- var ElkConstructor = ELK;
19
- var elk = new ElkConstructor();
20
- function compareStrings(left, right) {
21
- return left.localeCompare(right);
22
- }
23
- function getLayoutMode(diagram) {
24
- return diagram.layout?.mode ?? "hybrid";
25
- }
26
- function clonePosition(position) {
27
- return { x: position.x, y: position.y };
28
- }
29
- function fallbackPosition(index, direction, layerSpacing) {
30
- const distance = index * layerSpacing;
31
- switch (direction) {
32
- case "LEFT":
33
- return { x: -distance, y: 0 };
34
- case "UP":
35
- return { x: 0, y: -distance };
36
- case "DOWN":
37
- return { x: 0, y: distance };
38
- case "RIGHT":
39
- default:
40
- return { x: distance, y: 0 };
41
- }
42
- }
43
- function inferLayoutDirection(diagram) {
44
- if (diagram.layout?.direction) {
45
- return diagram.layout.direction;
46
- }
47
- const nodeById = new Map(diagram.nodes.map((node) => [node.id, node]));
48
- let horizontalWeight = 0;
49
- let verticalWeight = 0;
50
- for (const edge of diagram.edges) {
51
- const source = nodeById.get(edge.from);
52
- const target = nodeById.get(edge.to);
53
- if (!source?.position || !target?.position) {
54
- continue;
55
- }
56
- horizontalWeight += Math.abs(target.position.x - source.position.x);
57
- verticalWeight += Math.abs(target.position.y - source.position.y);
58
- }
59
- if (verticalWeight > horizontalWeight) {
60
- return "DOWN";
61
- }
62
- return DEFAULT_DIRECTION;
63
- }
64
- function buildGraphStats(diagram) {
65
- const nodeIds = diagram.nodes.map((node) => node.id).sort(compareStrings);
66
- const indegree = /* @__PURE__ */ new Map();
67
- const outdegree = /* @__PURE__ */ new Map();
68
- const adjacency = /* @__PURE__ */ new Map();
69
- const depth = /* @__PURE__ */ new Map();
70
- for (const nodeId of nodeIds) {
71
- indegree.set(nodeId, 0);
72
- outdegree.set(nodeId, 0);
73
- adjacency.set(nodeId, []);
74
- depth.set(nodeId, 0);
75
- }
76
- for (const edge of diagram.edges) {
77
- if (!adjacency.has(edge.from) || !indegree.has(edge.to)) {
78
- continue;
79
- }
80
- adjacency.get(edge.from)?.push(edge.to);
81
- outdegree.set(edge.from, (outdegree.get(edge.from) ?? 0) + 1);
82
- indegree.set(edge.to, (indegree.get(edge.to) ?? 0) + 1);
83
- }
84
- for (const neighbours of adjacency.values()) {
85
- neighbours.sort(compareStrings);
86
- }
87
- const indegreeCopy = new Map(indegree);
88
- const queue = nodeIds.filter((nodeId) => (indegreeCopy.get(nodeId) ?? 0) === 0);
89
- queue.sort(compareStrings);
90
- while (queue.length > 0) {
91
- const current = queue.shift();
92
- if (!current) {
93
- break;
94
- }
95
- const currentDepth = depth.get(current) ?? 0;
96
- for (const next of adjacency.get(current) ?? []) {
97
- depth.set(next, Math.max(depth.get(next) ?? 0, currentDepth + 1));
98
- const remaining = (indegreeCopy.get(next) ?? 0) - 1;
99
- indegreeCopy.set(next, remaining);
100
- if (remaining === 0) {
101
- queue.push(next);
102
- queue.sort(compareStrings);
103
- }
104
- }
105
- }
106
- let maxDepth = 0;
107
- for (const value of depth.values()) {
108
- maxDepth = Math.max(maxDepth, value);
109
- }
110
- return { indegree, outdegree, adjacency, depth, maxDepth };
111
- }
112
- function axisValue(position, direction) {
113
- switch (direction) {
114
- case "LEFT":
115
- return -position.x;
116
- case "UP":
117
- return -position.y;
118
- case "DOWN":
119
- return position.y;
120
- case "RIGHT":
121
- default:
122
- return position.x;
123
- }
124
- }
125
- function crossAxisValue(position, direction) {
126
- switch (direction) {
127
- case "LEFT":
128
- case "RIGHT":
129
- return position.y;
130
- case "UP":
131
- case "DOWN":
132
- default:
133
- return position.x;
134
- }
135
- }
136
- function buildLayerAssignments(diagram, direction, mode, layerSpacing, stats) {
137
- const assignments = /* @__PURE__ */ new Map();
138
- const nodeById = new Map(diagram.nodes.map((node) => [node.id, node]));
139
- const rawValues = [];
140
- for (const node of diagram.nodes) {
141
- const indegree = stats.indegree.get(node.id) ?? 0;
142
- const outdegree = stats.outdegree.get(node.id) ?? 0;
143
- let partition = stats.depth.get(node.id) ?? 0;
144
- if (indegree === 0 && outdegree === 0) {
145
- partition = stats.maxDepth + 2;
146
- } else if (outdegree === 0 && indegree > 0) {
147
- partition = stats.maxDepth + 1;
148
- }
149
- if (mode === "hybrid" && node.position) {
150
- partition = Math.round(axisValue(node.position, direction) / layerSpacing);
151
- }
152
- assignments.set(node.id, partition);
153
- rawValues.push(partition);
154
- }
155
- const minPartition = rawValues.length > 0 ? Math.min(...rawValues) : 0;
156
- if (minPartition < 0) {
157
- for (const nodeId of nodeById.keys()) {
158
- assignments.set(nodeId, (assignments.get(nodeId) ?? 0) - minPartition);
159
- }
160
- }
161
- return assignments;
162
- }
163
- function createParentMap(groups) {
164
- const parentByChild = /* @__PURE__ */ new Map();
165
- for (const group of [...groups].sort((left, right) => compareStrings(left.id, right.id))) {
166
- for (const childId of group.children) {
167
- if (!parentByChild.has(childId)) {
168
- parentByChild.set(childId, group.id);
169
- }
170
- }
171
- }
172
- return parentByChild;
173
- }
174
- function collectGroupNodeIds(groupId, groupById, nodeById) {
175
- const group = groupById.get(groupId);
176
- if (!group) {
177
- return [];
178
- }
179
- const nodeIds = [];
180
- for (const childId of group.children) {
181
- if (nodeById.has(childId)) {
182
- nodeIds.push(childId);
183
- continue;
184
- }
185
- nodeIds.push(...collectGroupNodeIds(childId, groupById, nodeById));
186
- }
187
- return nodeIds;
188
- }
189
- function buildNodeSortData(diagram, direction, layerAssignments) {
190
- const sortData = /* @__PURE__ */ new Map();
191
- for (const node of diagram.nodes) {
192
- sortData.set(node.id, {
193
- layer: layerAssignments.get(node.id) ?? 0,
194
- cross: node.position ? crossAxisValue(node.position, direction) : 0,
195
- id: node.id
196
- });
197
- }
198
- return sortData;
199
- }
200
- function buildGroupSortData(groups, groupById, nodeById, nodeSortData) {
201
- const groupSortData = /* @__PURE__ */ new Map();
202
- for (const group of groups) {
203
- const descendantNodeIds = collectGroupNodeIds(group.id, groupById, nodeById);
204
- if (descendantNodeIds.length === 0) {
205
- groupSortData.set(group.id, { layer: Number.MAX_SAFE_INTEGER, cross: 0, id: group.id });
206
- continue;
207
- }
208
- const descendantData = descendantNodeIds.map((nodeId) => nodeSortData.get(nodeId)).filter((entry) => Boolean(entry));
209
- descendantData.sort((left, right) => {
210
- if (left.layer !== right.layer) {
211
- return left.layer - right.layer;
212
- }
213
- if (left.cross !== right.cross) {
214
- return left.cross - right.cross;
215
- }
216
- return compareStrings(left.id, right.id);
217
- });
218
- const first = descendantData[0] ?? { layer: Number.MAX_SAFE_INTEGER, cross: 0, id: group.id };
219
- groupSortData.set(group.id, { layer: first.layer, cross: first.cross, id: group.id });
220
- }
221
- return groupSortData;
222
- }
223
- function sortElementIds(ids, nodeSortData, groupSortData) {
224
- return [...ids].sort((leftId, rightId) => {
225
- const left = nodeSortData.get(leftId) ?? groupSortData.get(leftId);
226
- const right = nodeSortData.get(rightId) ?? groupSortData.get(rightId);
227
- if (!left || !right) {
228
- return compareStrings(leftId, rightId);
229
- }
230
- if (left.layer !== right.layer) {
231
- return left.layer - right.layer;
232
- }
233
- if (left.cross !== right.cross) {
234
- return left.cross - right.cross;
235
- }
236
- return compareStrings(left.id, right.id);
237
- });
238
- }
239
- function collectAbsolutePositions(elkNode, nodeIds, positions, offsetX = 0, offsetY = 0) {
240
- const absoluteX = offsetX + (elkNode.x ?? 0);
241
- const absoluteY = offsetY + (elkNode.y ?? 0);
242
- if (nodeIds.has(elkNode.id)) {
243
- positions.set(elkNode.id, { x: absoluteX + ICON_X_OFFSET, y: absoluteY });
244
- }
245
- for (const child of elkNode.children ?? []) {
246
- collectAbsolutePositions(child, nodeIds, positions, absoluteX, absoluteY);
247
- }
248
- }
249
- function cloneDiagramWithPositions(diagram, positions, direction, layerSpacing) {
250
- return {
251
- ...diagram,
252
- nodes: diagram.nodes.map((node, index) => ({
253
- ...node,
254
- position: positions.get(node.id) ?? (node.position ? clonePosition(node.position) : fallbackPosition(index, direction, layerSpacing))
255
- }))
256
- };
257
- }
258
- async function layoutDiagram(diagram) {
259
- const mode = getLayoutMode(diagram);
260
- const direction = inferLayoutDirection(diagram);
261
- const nodeSpacing = diagram.layout?.nodeSpacing ?? DEFAULT_NODE_SPACING;
262
- const layerSpacing = diagram.layout?.layerSpacing ?? DEFAULT_LAYER_SPACING;
263
- if (mode === "manual") {
264
- const positions2 = /* @__PURE__ */ new Map();
265
- for (const [index, node] of diagram.nodes.entries()) {
266
- if (!node.position) {
267
- throw new Error(`Manual layout mode requires node "${node.id}" to define position`);
268
- }
269
- positions2.set(node.id, node.position ? clonePosition(node.position) : fallbackPosition(index, direction, layerSpacing));
270
- }
271
- return cloneDiagramWithPositions(diagram, positions2, direction, layerSpacing);
272
- }
273
- const nodeById = new Map(diagram.nodes.map((node) => [node.id, node]));
274
- const groups = diagram.groups ?? [];
275
- const groupById = new Map(groups.map((group) => [group.id, group]));
276
- const stats = buildGraphStats(diagram);
277
- const layerAssignments = buildLayerAssignments(diagram, direction, mode, layerSpacing, stats);
278
- const parentByChild = createParentMap(groups);
279
- const nodeSortData = buildNodeSortData(diagram, direction, layerAssignments);
280
- const groupSortData = buildGroupSortData(groups, groupById, nodeById, nodeSortData);
281
- const buildLeafNode = (nodeId) => {
282
- const layoutOptions = {
283
- "elk.partitioning.partition": String(layerAssignments.get(nodeId) ?? 0)
284
- };
285
- return {
286
- id: nodeId,
287
- width: DEFAULT_NODE_WIDTH,
288
- height: DEFAULT_NODE_HEIGHT,
289
- layoutOptions
290
- };
291
- };
292
- const buildGroupNode = (groupId) => {
293
- const group = groupById.get(groupId);
294
- if (!group) {
295
- throw new Error(`Unknown group "${groupId}"`);
296
- }
297
- const sortedChildren = sortElementIds(group.children, nodeSortData, groupSortData);
298
- return {
299
- id: group.id,
300
- layoutOptions: {
301
- "elk.padding": "[top=40,left=20,bottom=20,right=20]"
302
- },
303
- children: sortedChildren.map((childId) => {
304
- if (nodeById.has(childId)) {
305
- return buildLeafNode(childId);
306
- }
307
- return buildGroupNode(childId);
308
- })
309
- };
310
- };
311
- const topLevelIds = sortElementIds(
312
- [
313
- ...diagram.nodes.map((node) => node.id).filter((nodeId) => !parentByChild.has(nodeId)),
314
- ...groups.map((group) => group.id).filter((groupId) => !parentByChild.has(groupId))
315
- ],
316
- nodeSortData,
317
- groupSortData
318
- );
319
- const elkGraph = {
320
- id: "root",
321
- layoutOptions: {
322
- "elk.algorithm": "layered",
323
- "elk.direction": direction,
324
- "elk.spacing.nodeNode": String(nodeSpacing),
325
- "elk.layered.spacing.nodeNodeBetweenLayers": String(layerSpacing),
326
- "elk.partitioning.activate": "true",
327
- "elk.layered.considerModelOrder.strategy": "NODES_AND_EDGES",
328
- "elk.layered.crossingMinimization.forceNodeModelOrder": "true",
329
- "elk.hierarchyHandling": "INCLUDE_CHILDREN"
330
- },
331
- children: topLevelIds.map((id) => nodeById.has(id) ? buildLeafNode(id) : buildGroupNode(id)),
332
- edges: diagram.edges.map((edge, index) => ({
333
- id: `edge-${index}`,
334
- sources: [edge.from],
335
- targets: [edge.to]
336
- }))
337
- };
338
- const laidOut = await elk.layout(elkGraph);
339
- const positions = /* @__PURE__ */ new Map();
340
- collectAbsolutePositions(laidOut, new Set(nodeById.keys()), positions);
341
- return cloneDiagramWithPositions(diagram, positions, direction, layerSpacing);
342
- }
343
-
344
- // src/icons.ts
345
- import { existsSync, readFileSync } from "fs";
346
- import { resolve } from "path";
347
- import { fileURLToPath } from "url";
348
-
349
- // src/node-types.ts
350
7
  import { z } from "zod";
351
- var NodeTypeSchema = z.enum([
352
- "aws.analytics.athena",
353
- "aws.analytics.clean-rooms",
354
- "aws.analytics.cloudsearch",
355
- "aws.analytics.data-exchange",
356
- "aws.analytics.data-firehose",
357
- "aws.analytics.datazone",
358
- "aws.analytics.emr",
359
- "aws.analytics.entity-resolution",
360
- "aws.analytics.finspace",
361
- "aws.analytics.glue-databrew",
362
- "aws.analytics.glue",
363
- "aws.analytics.kinesis-data-streams",
364
- "aws.analytics.kinesis-video-streams",
365
- "aws.analytics.kinesis",
366
- "aws.analytics.lake-formation",
367
- "aws.analytics.managed-service-for-apache-flink",
368
- "aws.analytics.managed-streaming-for-apache-kafka",
369
- "aws.analytics.opensearch-service",
370
- "aws.analytics.redshift",
371
- "aws.analytics.sagemaker",
372
- "aws.application-integration.appflow",
373
- "aws.application-integration.appsync",
374
- "aws.application-integration.b2b-data-interchange",
375
- "aws.application-integration.eventbridge",
376
- "aws.application-integration.express-workflows",
377
- "aws.application-integration.managed-workflows-for-apache-airflow",
378
- "aws.application-integration.mq",
379
- "aws.application-integration.simple-notification-service",
380
- "aws.application-integration.simple-queue-service",
381
- "aws.application-integration.step-functions",
382
- "aws.artificial-intelligence.apache-mxnet-on-aws",
383
- "aws.artificial-intelligence.app-studio",
384
- "aws.artificial-intelligence.augmented-ai-a2i",
385
- "aws.artificial-intelligence.bedrock-agentcore",
386
- "aws.artificial-intelligence.bedrock",
387
- "aws.artificial-intelligence.codeguru",
388
- "aws.artificial-intelligence.codewhisperer",
389
- "aws.artificial-intelligence.comprehend-medical",
390
- "aws.artificial-intelligence.comprehend",
391
- "aws.artificial-intelligence.deep-learning-amis",
392
- "aws.artificial-intelligence.deep-learning-containers",
393
- "aws.artificial-intelligence.deepracer",
394
- "aws.artificial-intelligence.devops-guru",
395
- "aws.artificial-intelligence.elastic-inference",
396
- "aws.artificial-intelligence.forecast",
397
- "aws.artificial-intelligence.fraud-detector",
398
- "aws.artificial-intelligence.healthimaging",
399
- "aws.artificial-intelligence.healthlake",
400
- "aws.artificial-intelligence.healthomics",
401
- "aws.artificial-intelligence.healthscribe",
402
- "aws.artificial-intelligence.kendra",
403
- "aws.artificial-intelligence.lex",
404
- "aws.artificial-intelligence.lookout-for-equipment",
405
- "aws.artificial-intelligence.lookout-for-vision",
406
- "aws.artificial-intelligence.monitron",
407
- "aws.artificial-intelligence.neuron",
408
- "aws.artificial-intelligence.nova",
409
- "aws.artificial-intelligence.panorama",
410
- "aws.artificial-intelligence.personalize",
411
- "aws.artificial-intelligence.polly",
412
- "aws.artificial-intelligence.pytorch-on-aws",
413
- "aws.artificial-intelligence.q",
414
- "aws.artificial-intelligence.rekognition",
415
- "aws.artificial-intelligence.sagemaker-ai",
416
- "aws.artificial-intelligence.sagemaker-ground-truth",
417
- "aws.artificial-intelligence.sagemaker-studio-lab",
418
- "aws.artificial-intelligence.tensorflow-on-aws",
419
- "aws.artificial-intelligence.textract",
420
- "aws.artificial-intelligence.transcribe",
421
- "aws.artificial-intelligence.translate",
422
- "aws.blockchain.managed-blockchain",
423
- "aws.business-applications.appfabric",
424
- "aws.business-applications.chime-sdk",
425
- "aws.business-applications.chime",
426
- "aws.business-applications.connect",
427
- "aws.business-applications.end-user-messaging",
428
- "aws.business-applications.pinpoint-apis",
429
- "aws.business-applications.pinpoint",
430
- "aws.business-applications.quick-suite",
431
- "aws.business-applications.simple-email-service",
432
- "aws.business-applications.supply-chain",
433
- "aws.business-applications.wickr",
434
- "aws.business-applications.workdocs-sdk",
435
- "aws.business-applications.workdocs",
436
- "aws.business-applications.workmail",
437
- "aws.cloud-financial-management.billing-conductor",
438
- "aws.cloud-financial-management.budgets",
439
- "aws.cloud-financial-management.cost-and-usage-report",
440
- "aws.cloud-financial-management.cost-explorer",
441
- "aws.cloud-financial-management.reserved-instance-reporting",
442
- "aws.cloud-financial-management.savings-plans",
443
- "aws.compute.app-runner",
444
- "aws.compute.batch",
445
- "aws.compute.bottlerocket",
446
- "aws.compute.compute-optimizer",
447
- "aws.compute.dcv",
448
- "aws.compute.ec2-auto-scaling",
449
- "aws.compute.ec2-image-builder",
450
- "aws.compute.ec2",
451
- "aws.compute.elastic-beanstalk",
452
- "aws.compute.elastic-fabric-adapter",
453
- "aws.compute.elastic-vmware-service",
454
- "aws.compute.lambda",
455
- "aws.compute.lightsail-for-research",
456
- "aws.compute.lightsail",
457
- "aws.compute.local-zones",
458
- "aws.compute.nitro-enclaves",
459
- "aws.compute.outposts-family",
460
- "aws.compute.outposts-rack",
461
- "aws.compute.outposts-servers",
462
- "aws.compute.parallel-cluster",
463
- "aws.compute.parallel-computing-service",
464
- "aws.compute.serverless-application-repository",
465
- "aws.compute.simspace-weaver",
466
- "aws.compute.wavelength",
467
- "aws.containers.ecs-anywhere",
468
- "aws.containers.eks-anywhere",
469
- "aws.containers.eks-distro",
470
- "aws.containers.elastic-container-registry",
471
- "aws.containers.elastic-container-service",
472
- "aws.containers.elastic-kubernetes-service",
473
- "aws.containers.fargate",
474
- "aws.containers.red-hat-openshift-service-on-aws",
475
- "aws.customer-enablement.activate",
476
- "aws.customer-enablement.iq",
477
- "aws.customer-enablement.managed-services",
478
- "aws.customer-enablement.professional-services",
479
- "aws.customer-enablement.repost-private",
480
- "aws.customer-enablement.repost",
481
- "aws.customer-enablement.support",
482
- "aws.customer-enablement.training-certification",
483
- "aws.databases.aurora",
484
- "aws.databases.database-migration-service",
485
- "aws.databases.documentdb",
486
- "aws.databases.dynamodb",
487
- "aws.databases.elasticache",
488
- "aws.databases.keyspaces",
489
- "aws.databases.memorydb",
490
- "aws.databases.neptune",
491
- "aws.databases.oracle-database-at-aws",
492
- "aws.databases.rds",
493
- "aws.databases.timestream",
494
- "aws.developer-tools.cloud-control-api",
495
- "aws.developer-tools.cloud-development-kit",
496
- "aws.developer-tools.cloud9",
497
- "aws.developer-tools.cloudshell",
498
- "aws.developer-tools.codeartifact",
499
- "aws.developer-tools.codebuild",
500
- "aws.developer-tools.codecatalyst",
501
- "aws.developer-tools.codecommit",
502
- "aws.developer-tools.codedeploy",
503
- "aws.developer-tools.codepipeline",
504
- "aws.developer-tools.command-line-interface",
505
- "aws.developer-tools.corretto",
506
- "aws.developer-tools.fault-injection-service",
507
- "aws.developer-tools.infrastructure-composer",
508
- "aws.developer-tools.tools-and-sdks",
509
- "aws.developer-tools.x-ray",
510
- "aws.end-user-computing.workspaces",
511
- "aws.front-end-web-mobile.amplify",
512
- "aws.front-end-web-mobile.device-farm",
513
- "aws.front-end-web-mobile.location-service",
514
- "aws.games.gamelift-servers",
515
- "aws.games.gamelift-streams",
516
- "aws.games.open-3d-engine",
517
- "aws.general-icons.marketplace_dark",
518
- "aws.general-icons.marketplace_light",
519
- "aws.internet-of-things.freertos",
520
- "aws.internet-of-things.iot-core",
521
- "aws.internet-of-things.iot-device-defender",
522
- "aws.internet-of-things.iot-device-management",
523
- "aws.internet-of-things.iot-events",
524
- "aws.internet-of-things.iot-expresslink",
525
- "aws.internet-of-things.iot-fleetwise",
526
- "aws.internet-of-things.iot-greengrass",
527
- "aws.internet-of-things.iot-sitewise",
528
- "aws.internet-of-things.iot-twinmaker",
529
- "aws.management-tools.appconfig",
530
- "aws.management-tools.application-auto-scaling",
531
- "aws.management-tools.auto-scaling",
532
- "aws.management-tools.backint-agent",
533
- "aws.management-tools.chatbot",
534
- "aws.management-tools.cloudformation",
535
- "aws.management-tools.cloudtrail",
536
- "aws.management-tools.cloudwatch",
537
- "aws.management-tools.compute-optimizer",
538
- "aws.management-tools.config",
539
- "aws.management-tools.console-mobile-application",
540
- "aws.management-tools.control-tower",
541
- "aws.management-tools.devops-agent",
542
- "aws.management-tools.distro-for-opentelemetry",
543
- "aws.management-tools.health-dashboard",
544
- "aws.management-tools.launch-wizard",
545
- "aws.management-tools.license-manager",
546
- "aws.management-tools.managed-grafana",
547
- "aws.management-tools.managed-service-for-prometheus",
548
- "aws.management-tools.management-console",
549
- "aws.management-tools.organizations",
550
- "aws.management-tools.partner-central",
551
- "aws.management-tools.proton",
552
- "aws.management-tools.resilience-hub",
553
- "aws.management-tools.resource-explorer",
554
- "aws.management-tools.service-catalog",
555
- "aws.management-tools.service-management-connector",
556
- "aws.management-tools.systems-manager",
557
- "aws.management-tools.telco-network-builder",
558
- "aws.management-tools.trusted-advisor",
559
- "aws.management-tools.user-notifications",
560
- "aws.management-tools.well-architected-tool",
561
- "aws.media-services.deadline-cloud",
562
- "aws.media-services.elemental-appliances-&-software",
563
- "aws.media-services.elemental-conductor",
564
- "aws.media-services.elemental-delta",
565
- "aws.media-services.elemental-link",
566
- "aws.media-services.elemental-live",
567
- "aws.media-services.elemental-mediaconnect",
568
- "aws.media-services.elemental-mediaconvert",
569
- "aws.media-services.elemental-medialive",
570
- "aws.media-services.elemental-mediapackage",
571
- "aws.media-services.elemental-mediastore",
572
- "aws.media-services.elemental-mediatailor",
573
- "aws.media-services.elemental-server",
574
- "aws.media-services.interactive-video-service",
575
- "aws.media-services.kinesis-video-streams",
576
- "aws.media-services.thinkbox-deadline",
577
- "aws.media-services.thinkbox-frost",
578
- "aws.media-services.thinkbox-krakatoa",
579
- "aws.media-services.thinkbox-stoke",
580
- "aws.media-services.thinkbox-xmesh",
581
- "aws.migration-modernization.application-discovery-service",
582
- "aws.migration-modernization.application-migration-service",
583
- "aws.migration-modernization.data-transfer-terminal",
584
- "aws.migration-modernization.datasync",
585
- "aws.migration-modernization.mainframe-modernization",
586
- "aws.migration-modernization.migration-evaluator",
587
- "aws.migration-modernization.migration-hub",
588
- "aws.migration-modernization.transfer-family",
589
- "aws.migration-modernization.transform",
590
- "aws.networking-content-delivery.api-gateway",
591
- "aws.networking-content-delivery.app-mesh",
592
- "aws.networking-content-delivery.application-recovery-controller",
593
- "aws.networking-content-delivery.client-vpn",
594
- "aws.networking-content-delivery.cloud-map",
595
- "aws.networking-content-delivery.cloud-wan",
596
- "aws.networking-content-delivery.cloudfront",
597
- "aws.networking-content-delivery.direct-connect",
598
- "aws.networking-content-delivery.elastic-load-balancing",
599
- "aws.networking-content-delivery.global-accelerator",
600
- "aws.networking-content-delivery.privatelink",
601
- "aws.networking-content-delivery.route-53",
602
- "aws.networking-content-delivery.rtb-fabric",
603
- "aws.networking-content-delivery.site-to-site-vpn",
604
- "aws.networking-content-delivery.transit-gateway",
605
- "aws.networking-content-delivery.verified-access",
606
- "aws.networking-content-delivery.virtual-private-cloud",
607
- "aws.networking-content-delivery.vpc-lattice",
608
- "aws.quantum-technologies.braket",
609
- "aws.satellite.ground-station",
610
- "aws.security-identity.artifact",
611
- "aws.security-identity.audit-manager",
612
- "aws.security-identity.certificate-manager",
613
- "aws.security-identity.cloud-directory",
614
- "aws.security-identity.cloudhsm",
615
- "aws.security-identity.cognito",
616
- "aws.security-identity.detective",
617
- "aws.security-identity.directory-service",
618
- "aws.security-identity.firewall-manager",
619
- "aws.security-identity.guardduty",
620
- "aws.security-identity.iam-identity-center",
621
- "aws.security-identity.identity-and-access-management",
622
- "aws.security-identity.inspector",
623
- "aws.security-identity.key-management-service",
624
- "aws.security-identity.macie",
625
- "aws.security-identity.network-firewall",
626
- "aws.security-identity.payment-cryptography",
627
- "aws.security-identity.private-certificate-authority",
628
- "aws.security-identity.resource-access-manager",
629
- "aws.security-identity.secrets-manager",
630
- "aws.security-identity.security-agent",
631
- "aws.security-identity.security-hub",
632
- "aws.security-identity.security-incident-response",
633
- "aws.security-identity.security-lake",
634
- "aws.security-identity.shield",
635
- "aws.security-identity.signer",
636
- "aws.security-identity.verified-permissions",
637
- "aws.security-identity.waf",
638
- "aws.storage.backup",
639
- "aws.storage.efs",
640
- "aws.storage.elastic-block-store",
641
- "aws.storage.elastic-disaster-recovery",
642
- "aws.storage.file-cache",
643
- "aws.storage.fsx-for-lustre",
644
- "aws.storage.fsx-for-netapp-ontap",
645
- "aws.storage.fsx-for-openzfs",
646
- "aws.storage.fsx-for-wfs",
647
- "aws.storage.fsx",
648
- "aws.storage.s3-on-outposts",
649
- "aws.storage.simple-storage-service-glacier",
650
- "aws.storage.simple-storage-service",
651
- "aws.storage.snowball-edge",
652
- "aws.storage.snowball",
653
- "aws.storage.storage-gateway",
654
- "aws.analytics.athena.data-source-connectors",
655
- "aws.analytics.cloudsearch.search-documents",
656
- "aws.analytics.data-exchange-for-apis.data-exchange-for-apis",
657
- "aws.analytics.datazone.business-data-catalog",
658
- "aws.analytics.datazone.data-portal",
659
- "aws.analytics.datazone.data-projects",
660
- "aws.analytics.emr.cluster",
661
- "aws.analytics.emr.emr-engine",
662
- "aws.analytics.emr.hdfs-cluster",
663
- "aws.analytics.glue.aws-glue-for-ray",
664
- "aws.analytics.glue.crawler",
665
- "aws.analytics.glue.data-catalog",
666
- "aws.analytics.glue.data-quality",
667
- "aws.analytics.lake-formation.data-lake",
668
- "aws.analytics.msk.amazon-msk-connect",
669
- "aws.analytics.opensearch-service.cluster-administrator-node",
670
- "aws.analytics.opensearch-service.data-node",
671
- "aws.analytics.opensearch-service.index",
672
- "aws.analytics.opensearch-service.observability",
673
- "aws.analytics.opensearch-service.opensearch-dashboards",
674
- "aws.analytics.opensearch-service.opensearch-ingestion",
675
- "aws.analytics.opensearch-service.traces",
676
- "aws.analytics.opensearch-service.ultrawarm-node",
677
- "aws.analytics.redshift.auto-copy",
678
- "aws.analytics.redshift.data-sharing-governance",
679
- "aws.analytics.redshift.dense-compute-node",
680
- "aws.analytics.redshift.dense-storage-node",
681
- "aws.analytics.redshift.ml",
682
- "aws.analytics.redshift.query-editor-v2.0",
683
- "aws.analytics.redshift.ra3",
684
- "aws.analytics.redshift.streaming-ingestion",
685
- "aws.application-integration.eventbridge-event.eventbridge-event",
686
- "aws.application-integration.eventbridge.custom-event-bus",
687
- "aws.application-integration.eventbridge.default-event-bus",
688
- "aws.application-integration.eventbridge.pipes",
689
- "aws.application-integration.eventbridge.rule",
690
- "aws.application-integration.eventbridge.saas-partner-event",
691
- "aws.application-integration.eventbridge.scheduler",
692
- "aws.application-integration.eventbridge.schema-registry",
693
- "aws.application-integration.eventbridge.schema",
694
- "aws.application-integration.mq.broker",
695
- "aws.application-integration.simple-notification-service.email-notification",
696
- "aws.application-integration.simple-notification-service.http-notification",
697
- "aws.application-integration.simple-notification-service.topic",
698
- "aws.application-integration.simple-queue-service.message",
699
- "aws.application-integration.simple-queue-service.queue",
700
- "aws.artificial-intelligence.devops-guru.insights",
701
- "aws.artificial-intelligence.rekognition.image",
702
- "aws.artificial-intelligence.rekognition.video",
703
- "aws.artificial-intelligence.sagemaker-ai.canvas",
704
- "aws.artificial-intelligence.sagemaker-ai.geospatial-ml",
705
- "aws.artificial-intelligence.sagemaker-ai.model",
706
- "aws.artificial-intelligence.sagemaker-ai.notebook",
707
- "aws.artificial-intelligence.sagemaker-ai.shadow-testing",
708
- "aws.artificial-intelligence.sagemaker-ai.train",
709
- "aws.artificial-intelligence.textract.analyze-lending",
710
- "aws.blockchain.managed-blockchain.blockchain",
711
- "aws.business-applications.pinpoint.journey",
712
- "aws.business-applications.simple-email-service.email",
713
- "aws.compute.ec2.ami",
714
- "aws.compute.ec2.auto-scaling",
715
- "aws.compute.ec2.aws-microservice-extractor-for-.net",
716
- "aws.compute.ec2.db-instance",
717
- "aws.compute.ec2.elastic-ip-address",
718
- "aws.compute.ec2.instance-with-cloudwatch",
719
- "aws.compute.ec2.instance",
720
- "aws.compute.ec2.instances",
721
- "aws.compute.ec2.rescue",
722
- "aws.compute.ec2.spot-instance",
723
- "aws.compute.elastic-beanstalk.application",
724
- "aws.compute.elastic-beanstalk.deployment",
725
- "aws.compute.lambda.lambda-function",
726
- "aws.containers.elastic-container-registry.image",
727
- "aws.containers.elastic-container-registry.registry",
728
- "aws.containers.elastic-container-service.container-1",
729
- "aws.containers.elastic-container-service.container-2",
730
- "aws.containers.elastic-container-service.container-3",
731
- "aws.containers.elastic-container-service.copiiot-cli",
732
- "aws.containers.elastic-container-service.ecs-service-connect",
733
- "aws.containers.elastic-container-service.service",
734
- "aws.containers.elastic-container-service.task",
735
- "aws.containers.elastic-kubernetes-service.eks-on-outposts",
736
- "aws.databases.aurora-instance.aurora-instance",
737
- "aws.databases.aurora-mariadb-instance-alternate.aurora-mariadb-instance-alternate",
738
- "aws.databases.aurora-mariadb-instance.aurora-mariadb-instance",
739
- "aws.databases.aurora-mysql-instance-alternate.aurora-mysql-instance-alternate",
740
- "aws.databases.aurora-mysql-instance.aurora-mysql-instance",
741
- "aws.databases.aurora-oracle-instance-alternate.aurora-oracle-instance-alternate",
742
- "aws.databases.aurora-oracle-instance.aurora-oracle-instance",
743
- "aws.databases.aurora-piops-instance.aurora-piops-instance",
744
- "aws.databases.aurora-postgresql-instance-alternate.aurora-postgresql-instance-alternate",
745
- "aws.databases.aurora-postgresql-instance.aurora-postgresql-instance",
746
- "aws.databases.aurora-sql-server-instance-alternate.aurora-sql-server-instance-alternate",
747
- "aws.databases.aurora-sql-server-instance.aurora-sql-server-instance",
748
- "aws.databases.aurora.amazon-aurora-instance-alternate",
749
- "aws.databases.aurora.amazon-rds-instance-aternate",
750
- "aws.databases.aurora.amazon-rds-instance",
751
- "aws.databases.aurora.trusted-language-extensions-for-postgresql",
752
- "aws.databases.database-migration-service.database-migration-workflow-or-job",
753
- "aws.databases.documentdb.elastic-clusters",
754
- "aws.databases.dynamodb.amazon-dynamodb-accelerator",
755
- "aws.databases.dynamodb.attribute",
756
- "aws.databases.dynamodb.attributes",
757
- "aws.databases.dynamodb.global-secondary-index",
758
- "aws.databases.dynamodb.item",
759
- "aws.databases.dynamodb.items",
760
- "aws.databases.dynamodb.standard-access-table-class",
761
- "aws.databases.dynamodb.standard-infrequent-access-table-class",
762
- "aws.databases.dynamodb.stream",
763
- "aws.databases.dynamodb.table",
764
- "aws.databases.elasticache.cache-node",
765
- "aws.databases.elasticache.elasticache-for-memcached",
766
- "aws.databases.elasticache.elasticache-for-redis",
767
- "aws.databases.elasticache.elasticache-for-valkey",
768
- "aws.databases.rds-proxy-instance-alternate.rds-proxy-instance-alternate",
769
- "aws.databases.rds-proxy-instance.rds-proxy-instance",
770
- "aws.databases.rds.blue-green-deployments",
771
- "aws.databases.rds.multi-az-db-cluster",
772
- "aws.databases.rds.multi-az",
773
- "aws.databases.rds.optimized-writes",
774
- "aws.databases.rds.trusted-language-extensions-for-postgresql",
775
- "aws.developer-tools.cloud9.cloud9",
776
- "aws.front-end-web-mobile.amplify.aws-amplify-studio",
777
- "aws.front-end-web-mobile.location-service.geofence",
778
- "aws.front-end-web-mobile.location-service.map ",
779
- "aws.front-end-web-mobile.location-service.place",
780
- "aws.front-end-web-mobile.location-service.routes",
781
- "aws.front-end-web-mobile.location-service.track ",
782
- "aws.general.alert.alert",
783
- "aws.general.authenticated-user.authenticated-user",
784
- "aws.general.camera.camera",
785
- "aws.general.chat.chat",
786
- "aws.general.client.client",
787
- "aws.general.cold-storage.cold-storage",
788
- "aws.general.credentials.credentials",
789
- "aws.general.data-stream.data-stream",
790
- "aws.general.data-table.data-table",
791
- "aws.general.database.database",
792
- "aws.general.disk.disk",
793
- "aws.general.document.document",
794
- "aws.general.documents.documents",
795
- "aws.general.email.email",
796
- "aws.general.firewall.firewall",
797
- "aws.general.folder.folder",
798
- "aws.general.folders.folders",
799
- "aws.general.forums.forums",
800
- "aws.general.gear.gear",
801
- "aws.general.generic-application.generic-application",
802
- "aws.general.git-repository.git-repository",
803
- "aws.general.globe.globe",
804
- "aws.general.internet-alt1.internet-alt1",
805
- "aws.general.internet-alt2.internet-alt2",
806
- "aws.general.internet.internet",
807
- "aws.general.json-script.json-script",
808
- "aws.general.logs.logs",
809
- "aws.general.magnifying-glass.magnifying-glass",
810
- "aws.general.management-console.management-console",
811
- "aws.general.metrics.metrics",
812
- "aws.general.mobile-client.mobile-client",
813
- "aws.general.multimedia.multimedia",
814
- "aws.general.office-building.office-building",
815
- "aws.general.programming-language.programming-language",
816
- "aws.general.question.question",
817
- "aws.general.recover.recover",
818
- "aws.general.saml-token.saml-token",
819
- "aws.general.sdk.sdk",
820
- "aws.general.server.server",
821
- "aws.general.servers.servers",
822
- "aws.general.shield.shield",
823
- "aws.general.source-code.source-code",
824
- "aws.general.ssl-padlock.ssl-padlock",
825
- "aws.general.tape-storage.tape-storage",
826
- "aws.general.toolkit.toolkit",
827
- "aws.general.user.user",
828
- "aws.general.users.users",
829
- "aws.iot.iot-core.device-advisor",
830
- "aws.iot.iot-core.device-location",
831
- "aws.iot.iot-device-defender.iot-device-jobs",
832
- "aws.iot.iot-device-management.fleet-hub",
833
- "aws.iot.iot-device-tester.iot-device-tester",
834
- "aws.iot.iot-greengrass.artifact",
835
- "aws.iot.iot-greengrass.component-machine-learning",
836
- "aws.iot.iot-greengrass.component-nucleus",
837
- "aws.iot.iot-greengrass.component-private",
838
- "aws.iot.iot-greengrass.component-public",
839
- "aws.iot.iot-greengrass.component",
840
- "aws.iot.iot-greengrass.connector",
841
- "aws.iot.iot-greengrass.interprocess-communication",
842
- "aws.iot.iot-greengrass.protocol",
843
- "aws.iot.iot-greengrass.recipe",
844
- "aws.iot.iot-greengrass.stream-manager",
845
- "aws.iot.iot-hardware-board.iot-hardware-board",
846
- "aws.iot.iot-rule.iot-rule",
847
- "aws.iot.iot-sitewise.asset-hierarchy",
848
- "aws.iot.iot-sitewise.asset-model",
849
- "aws.iot.iot-sitewise.asset-properties",
850
- "aws.iot.iot-sitewise.asset",
851
- "aws.iot.iot-sitewise.data-streams",
852
- "aws.iot.iot.action",
853
- "aws.iot.iot.actuator",
854
- "aws.iot.iot.alexa_enabled-device",
855
- "aws.iot.iot.alexa_skill",
856
- "aws.iot.iot.alexa_voice-service",
857
- "aws.iot.iot.certificate",
858
- "aws.iot.iot.desired-state",
859
- "aws.iot.iot.device-gateway",
860
- "aws.iot.iot.echo",
861
- "aws.iot.iot.fire-tv_stick",
862
- "aws.iot.iot.fire_tv",
863
- "aws.iot.iot.http2-protocol",
864
- "aws.iot.iot.http_protocol",
865
- "aws.iot.iot.lambda_function",
866
- "aws.iot.iot.lorawan-protocol",
867
- "aws.iot.iot.mqtt_protocol",
868
- "aws.iot.iot.over-air-update",
869
- "aws.iot.iot.policy",
870
- "aws.iot.iot.reported-state",
871
- "aws.iot.iot.sailboat",
872
- "aws.iot.iot.sensor",
873
- "aws.iot.iot.servo",
874
- "aws.iot.iot.shadow",
875
- "aws.iot.iot.simulator",
876
- "aws.iot.iot.thing_bank",
877
- "aws.iot.iot.thing_bicycle",
878
- "aws.iot.iot.thing_camera",
879
- "aws.iot.iot.thing_car",
880
- "aws.iot.iot.thing_cart",
881
- "aws.iot.iot.thing_coffee-pot",
882
- "aws.iot.iot.thing_door-lock",
883
- "aws.iot.iot.thing_factory",
884
- "aws.iot.iot.thing_freertos-device",
885
- "aws.iot.iot.thing_generic",
886
- "aws.iot.iot.thing_house",
887
- "aws.iot.iot.thing_humidity-sensor",
888
- "aws.iot.iot.thing_industrial-pc",
889
- "aws.iot.iot.thing_lightbulb",
890
- "aws.iot.iot.thing_medical-emergency",
891
- "aws.iot.iot.thing_plc",
892
- "aws.iot.iot.thing_police-emergency",
893
- "aws.iot.iot.thing_relay",
894
- "aws.iot.iot.thing_stacklight",
895
- "aws.iot.iot.thing_temperature-humidity-sensor",
896
- "aws.iot.iot.thing_temperature-sensor",
897
- "aws.iot.iot.thing_temperature-vibration-sensor",
898
- "aws.iot.iot.thing_thermostat",
899
- "aws.iot.iot.thing_travel",
900
- "aws.iot.iot.thing_utility",
901
- "aws.iot.iot.thing_vibration-sensor",
902
- "aws.iot.iot.thing_windfarm",
903
- "aws.iot.iot.topic",
904
- "aws.management-governance.cloudformation.change-set",
905
- "aws.management-governance.cloudformation.stack",
906
- "aws.management-governance.cloudformation.template",
907
- "aws.management-governance.cloudtrail.cloudtrail-lake",
908
- "aws.management-governance.cloudwatch.alarm",
909
- "aws.management-governance.cloudwatch.cross-account-observability",
910
- "aws.management-governance.cloudwatch.data-protection",
911
- "aws.management-governance.cloudwatch.event-event-based",
912
- "aws.management-governance.cloudwatch.event-time-based",
913
- "aws.management-governance.cloudwatch.evidently",
914
- "aws.management-governance.cloudwatch.logs",
915
- "aws.management-governance.cloudwatch.metrics-insights",
916
- "aws.management-governance.cloudwatch.rule",
917
- "aws.management-governance.cloudwatch.rum",
918
- "aws.management-governance.cloudwatch.synthetics",
919
- "aws.management-governance.license-manager.application-discovery",
920
- "aws.management-governance.license-manager.license-blending",
921
- "aws.management-governance.organizations.account",
922
- "aws.management-governance.organizations.management-account",
923
- "aws.management-governance.organizations.organizational-unit",
924
- "aws.management-governance.systems-manager.application-manager",
925
- "aws.management-governance.systems-manager.automation",
926
- "aws.management-governance.systems-manager.change-calendar",
927
- "aws.management-governance.systems-manager.change-manager",
928
- "aws.management-governance.systems-manager.compliance",
929
- "aws.management-governance.systems-manager.distributor",
930
- "aws.management-governance.systems-manager.documents",
931
- "aws.management-governance.systems-manager.incident-manager",
932
- "aws.management-governance.systems-manager.inventory",
933
- "aws.management-governance.systems-manager.maintenance-windows",
934
- "aws.management-governance.systems-manager.opscenter",
935
- "aws.management-governance.systems-manager.parameter-store",
936
- "aws.management-governance.systems-manager.patch-manager",
937
- "aws.management-governance.systems-manager.run-command",
938
- "aws.management-governance.systems-manager.session-manager",
939
- "aws.management-governance.systems-manager.state-manager",
940
- "aws.management-governance.trusted-advisor.checklist-cost",
941
- "aws.management-governance.trusted-advisor.checklist-fault-tolerant",
942
- "aws.management-governance.trusted-advisor.checklist-performance",
943
- "aws.management-governance.trusted-advisor.checklist-security",
944
- "aws.management-governance.trusted-advisor.checklist",
945
- "aws.media-services.cloud-digital-interface.cloud-digital-interface",
946
- "aws.media-services.elemental-mediaconnect.mediaconnect-gateway",
947
- "aws.migration-modernization.application-discovery-service.aws-agentless-collector",
948
- "aws.migration-modernization.application-discovery-service.aws-discovery-agent",
949
- "aws.migration-modernization.application-discovery-service.migration-evaluator-collector",
950
- "aws.migration-modernization.datasync.agent",
951
- "aws.migration-modernization.datasync.discovery",
952
- "aws.migration-modernization.mainframe-modernization.analyzer",
953
- "aws.migration-modernization.mainframe-modernization.compiler",
954
- "aws.migration-modernization.mainframe-modernization.converter",
955
- "aws.migration-modernization.mainframe-modernization.developer",
956
- "aws.migration-modernization.mainframe-modernization.runtime",
957
- "aws.migration-modernization.migration-hub.refactor-spaces-applications",
958
- "aws.migration-modernization.migration-hub.refactor-spaces-environments",
959
- "aws.migration-modernization.migration-hub.refactor-spaces-services",
960
- "aws.migration-modernization.transfer-family.aws-as2",
961
- "aws.migration-modernization.transfer-family.aws-ftp",
962
- "aws.migration-modernization.transfer-family.aws-ftps",
963
- "aws.migration-modernization.transfer-family.aws-sftp",
964
- "aws.networking-content-delivery.api-gateway.endpoint",
965
- "aws.networking-content-delivery.app-mesh.mesh",
966
- "aws.networking-content-delivery.app-mesh.virtual-gateway",
967
- "aws.networking-content-delivery.app-mesh.virtual-node",
968
- "aws.networking-content-delivery.app-mesh.virtual-router",
969
- "aws.networking-content-delivery.app-mesh.virtual-service",
970
- "aws.networking-content-delivery.cloud-map.namespace",
971
- "aws.networking-content-delivery.cloud-map.resource",
972
- "aws.networking-content-delivery.cloud-map.service",
973
- "aws.networking-content-delivery.cloud-wan.core-network-edge",
974
- "aws.networking-content-delivery.cloud-wan.segment-network",
975
- "aws.networking-content-delivery.cloud-wan.transit-gateway-route-table-attachment",
976
- "aws.networking-content-delivery.cloudfront.download-distribution",
977
- "aws.networking-content-delivery.cloudfront.edge-location",
978
- "aws.networking-content-delivery.cloudfront.functions",
979
- "aws.networking-content-delivery.cloudfront.streaming-distribution",
980
- "aws.networking-content-delivery.direct-connect.gateway",
981
- "aws.networking-content-delivery.elastic-load-balancing.application-load-balancer",
982
- "aws.networking-content-delivery.elastic-load-balancing.classic-load-balancer",
983
- "aws.networking-content-delivery.elastic-load-balancing.gateway-load-balancer",
984
- "aws.networking-content-delivery.elastic-load-balancing.network-load-balancer",
985
- "aws.networking-content-delivery.route-53-hosted-zone.route-53-hosted-zone",
986
- "aws.networking-content-delivery.route-53.readiness-checks",
987
- "aws.networking-content-delivery.route-53.resolver-dns-firewall",
988
- "aws.networking-content-delivery.route-53.resolver-query-logging",
989
- "aws.networking-content-delivery.route-53.resolver",
990
- "aws.networking-content-delivery.route-53.route-table",
991
- "aws.networking-content-delivery.route-53.routing-controls",
992
- "aws.networking-content-delivery.transit-gateway.attachment",
993
- "aws.networking-content-delivery.vpc.carrier-gateway",
994
- "aws.networking-content-delivery.vpc.customer-gateway",
995
- "aws.networking-content-delivery.vpc.elastic-network-adapter",
996
- "aws.networking-content-delivery.vpc.elastic-network-interface",
997
- "aws.networking-content-delivery.vpc.endpoints",
998
- "aws.networking-content-delivery.vpc.flow-logs",
999
- "aws.networking-content-delivery.vpc.internet-gateway",
1000
- "aws.networking-content-delivery.vpc.nat-gateway",
1001
- "aws.networking-content-delivery.vpc.network-access-analyzer",
1002
- "aws.networking-content-delivery.vpc.network-access-control-list",
1003
- "aws.networking-content-delivery.vpc.peering-connection",
1004
- "aws.networking-content-delivery.vpc.reachability-analyzer",
1005
- "aws.networking-content-delivery.vpc.router",
1006
- "aws.networking-content-delivery.vpc.traffic-mirroring",
1007
- "aws.networking-content-delivery.vpc.virtual-private-cloud-vpc",
1008
- "aws.networking-content-delivery.vpc.vpn-connection",
1009
- "aws.networking-content-delivery.vpc.vpn-gateway",
1010
- "aws.quantum-technologies.braket.chandelier",
1011
- "aws.quantum-technologies.braket.chip",
1012
- "aws.quantum-technologies.braket.embedded-simulator",
1013
- "aws.quantum-technologies.braket.managed-simulator",
1014
- "aws.quantum-technologies.braket.noise-simulator",
1015
- "aws.quantum-technologies.braket.qpu",
1016
- "aws.quantum-technologies.braket.simulator-1",
1017
- "aws.quantum-technologies.braket.simulator-2",
1018
- "aws.quantum-technologies.braket.simulator-3",
1019
- "aws.quantum-technologies.braket.simulator-4",
1020
- "aws.quantum-technologies.braket.simulator",
1021
- "aws.quantum-technologies.braket.state-vector",
1022
- "aws.quantum-technologies.braket.tensor-network",
1023
- "aws.security-identity.certificate-manager.certificate-authority",
1024
- "aws.security-identity.directory-service.ad-connector",
1025
- "aws.security-identity.directory-service.aws-managed-microsoft-ad",
1026
- "aws.security-identity.directory-service.simple-ad",
1027
- "aws.security-identity.identity-access-management.add-on",
1028
- "aws.security-identity.identity-access-management.aws-sts-alternate",
1029
- "aws.security-identity.identity-access-management.aws-sts",
1030
- "aws.security-identity.identity-access-management.data-encryption-key",
1031
- "aws.security-identity.identity-access-management.encrypted-data",
1032
- "aws.security-identity.identity-access-management.iam-access-analyzer",
1033
- "aws.security-identity.identity-access-management.iam-roles-anywhere",
1034
- "aws.security-identity.identity-access-management.long-term-security-credential",
1035
- "aws.security-identity.identity-access-management.mfa-token",
1036
- "aws.security-identity.identity-access-management.permissions",
1037
- "aws.security-identity.identity-access-management.role",
1038
- "aws.security-identity.identity-access-management.temporary-security-credential",
1039
- "aws.security-identity.inspector.agent",
1040
- "aws.security-identity.key-management-service.external-key-store",
1041
- "aws.security-identity.network-firewall.endpoints",
1042
- "aws.security-identity.security-hub.finding",
1043
- "aws.security-identity.shield.aws-shield-advanced",
1044
- "aws.security-identity.waf.bad-bot",
1045
- "aws.security-identity.waf.bot-control",
1046
- "aws.security-identity.waf.bot",
1047
- "aws.security-identity.waf.filtering-rule",
1048
- "aws.security-identity.waf.labels",
1049
- "aws.security-identity.waf.managed-rule",
1050
- "aws.security-identity.waf.rule",
1051
- "aws.storage.backup.audit-manager",
1052
- "aws.storage.backup.aws-backup-for-aws-cloudformation",
1053
- "aws.storage.backup.aws-backup-support-for-amazon-fsx-for-netapp-ontap",
1054
- "aws.storage.backup.aws-backup-support-for-amazon-s3",
1055
- "aws.storage.backup.aws-backup-support-for-vmware-workloads",
1056
- "aws.storage.backup.backup-plan",
1057
- "aws.storage.backup.backup-restore",
1058
- "aws.storage.backup.backup-vault",
1059
- "aws.storage.backup.compliance-reporting",
1060
- "aws.storage.backup.compute",
1061
- "aws.storage.backup.database",
1062
- "aws.storage.backup.gateway",
1063
- "aws.storage.backup.legal-hold",
1064
- "aws.storage.backup.recovery-point-objective",
1065
- "aws.storage.backup.recovery-time-objective",
1066
- "aws.storage.backup.storage",
1067
- "aws.storage.backup.vault-lock",
1068
- "aws.storage.backup.virtual-machine-monitor",
1069
- "aws.storage.backup.virtual-machine",
1070
- "aws.storage.elastic-block-store.amazon-data-lifecycle-manager",
1071
- "aws.storage.elastic-block-store.multiple-volumes",
1072
- "aws.storage.elastic-block-store.snapshot",
1073
- "aws.storage.elastic-block-store.volume-gp3",
1074
- "aws.storage.elastic-block-store.volume",
1075
- "aws.storage.elastic-file-system.efs-intelligent-tiering",
1076
- "aws.storage.elastic-file-system.efs-one-zone-infrequent-access",
1077
- "aws.storage.elastic-file-system.efs-one-zone",
1078
- "aws.storage.elastic-file-system.efs-standard-infrequent-access",
1079
- "aws.storage.elastic-file-system.efs-standard",
1080
- "aws.storage.elastic-file-system.elastic-throughput",
1081
- "aws.storage.elastic-file-system.file-system",
1082
- "aws.storage.file-cache.hybrid-nfs-linked-datasets",
1083
- "aws.storage.file-cache.on-premises-nfs-linked-datasets",
1084
- "aws.storage.file-cache.s3-linked-datasets",
1085
- "aws.storage.simple-storage-service-glacier.archive",
1086
- "aws.storage.simple-storage-service-glacier.vault",
1087
- "aws.storage.simple-storage-service.bucket-with-objects",
1088
- "aws.storage.simple-storage-service.bucket",
1089
- "aws.storage.simple-storage-service.directory-bucket",
1090
- "aws.storage.simple-storage-service.general-access-points",
1091
- "aws.storage.simple-storage-service.object",
1092
- "aws.storage.simple-storage-service.s3-batch-operations",
1093
- "aws.storage.simple-storage-service.s3-express-one-zone",
1094
- "aws.storage.simple-storage-service.s3-glacier-deep-archive",
1095
- "aws.storage.simple-storage-service.s3-glacier-flexible-retrieval",
1096
- "aws.storage.simple-storage-service.s3-glacier-instant-retrieval",
1097
- "aws.storage.simple-storage-service.s3-intelligent-tiering",
1098
- "aws.storage.simple-storage-service.s3-multi-region-access-points",
1099
- "aws.storage.simple-storage-service.s3-object-lambda-access-points",
1100
- "aws.storage.simple-storage-service.s3-object-lambda",
1101
- "aws.storage.simple-storage-service.s3-object-lock",
1102
- "aws.storage.simple-storage-service.s3-on-outposts",
1103
- "aws.storage.simple-storage-service.s3-one-zone-ia",
1104
- "aws.storage.simple-storage-service.s3-replication-time-control",
1105
- "aws.storage.simple-storage-service.s3-replication",
1106
- "aws.storage.simple-storage-service.s3-select",
1107
- "aws.storage.simple-storage-service.s3-standard-ia",
1108
- "aws.storage.simple-storage-service.s3-standard",
1109
- "aws.storage.simple-storage-service.s3-storage-lens",
1110
- "aws.storage.simple-storage-service.s3-tables",
1111
- "aws.storage.simple-storage-service.s3-vectors",
1112
- "aws.storage.simple-storage-service.vpc-access-points",
1113
- "aws.storage.snowball.snowball-import-export",
1114
- "aws.storage.storage-gateway.amazon-fsx-file-gateway",
1115
- "aws.storage.storage-gateway.amazon-s3-file-gateway",
1116
- "aws.storage.storage-gateway.cached-volume",
1117
- "aws.storage.storage-gateway.file-gateway",
1118
- "aws.storage.storage-gateway.noncached-volume",
1119
- "aws.storage.storage-gateway.tape-gateway",
1120
- "aws.storage.storage-gateway.virtual-tape-library",
1121
- "aws.storage.storage-gateway.volume-gateway",
1122
- "aws.category.analytics",
1123
- "aws.category.application-integration",
1124
- "aws.category.artificial-intelligence",
1125
- "aws.category.blockchain",
1126
- "aws.category.business-applications",
1127
- "aws.category.cloud-financial-management",
1128
- "aws.category.compute",
1129
- "aws.category.containers",
1130
- "aws.category.customer-enablement",
1131
- "aws.category.customer-experience",
1132
- "aws.category.databases",
1133
- "aws.category.developer-tools",
1134
- "aws.category.end-user-computing",
1135
- "aws.category.front-end-web-mobile",
1136
- "aws.category.games",
1137
- "aws.category.internet-of-things",
1138
- "aws.category.management-tools",
1139
- "aws.category.media-services",
1140
- "aws.category.migration-modernization",
1141
- "aws.category.multicloud-and-hybrid",
1142
- "aws.category.networking-content-delivery",
1143
- "aws.category.quantum-technologies",
1144
- "aws.category.satellite",
1145
- "aws.category.security-identity",
1146
- "aws.category.serverless",
1147
- "aws.category.storage",
1148
- "aws.group.account",
1149
- "aws.group.auto-scaling-group",
1150
- "aws.group.cloud-logo",
1151
- "aws.group.cloud",
1152
- "aws.group.corporate-data-center",
1153
- "aws.group.ec2-instance-contents",
1154
- "aws.group.iot-greengrass-deployment",
1155
- "aws.group.private-subnet",
1156
- "aws.group.public-subnet",
1157
- "aws.group.region",
1158
- "aws.group.server-contents",
1159
- "aws.group.spot-fleet",
1160
- "aws.group.virtual-private-cloud-vpc"
1161
- ]);
1162
- var nodeTypeToIcon = {
1163
- "aws.analytics.athena": "architecture/analytics/athena_64.svg",
1164
- "aws.analytics.clean-rooms": "architecture/analytics/clean-rooms_64.svg",
1165
- "aws.analytics.cloudsearch": "architecture/analytics/cloudsearch_64.svg",
1166
- "aws.analytics.data-exchange": "architecture/analytics/data-exchange_64.svg",
1167
- "aws.analytics.data-firehose": "architecture/analytics/data-firehose_64.svg",
1168
- "aws.analytics.datazone": "architecture/analytics/datazone_64.svg",
1169
- "aws.analytics.emr": "architecture/analytics/emr_64.svg",
1170
- "aws.analytics.entity-resolution": "architecture/analytics/entity-resolution_64.svg",
1171
- "aws.analytics.finspace": "architecture/analytics/finspace_64.svg",
1172
- "aws.analytics.glue-databrew": "architecture/analytics/glue-databrew_64.svg",
1173
- "aws.analytics.glue": "architecture/analytics/glue_64.svg",
1174
- "aws.analytics.kinesis-data-streams": "architecture/analytics/kinesis-data-streams_64.svg",
1175
- "aws.analytics.kinesis-video-streams": "architecture/analytics/kinesis-video-streams_64.svg",
1176
- "aws.analytics.kinesis": "architecture/analytics/kinesis_64.svg",
1177
- "aws.analytics.lake-formation": "architecture/analytics/lake-formation_64.svg",
1178
- "aws.analytics.managed-service-for-apache-flink": "architecture/analytics/managed-service-for-apache-flink_64.svg",
1179
- "aws.analytics.managed-streaming-for-apache-kafka": "architecture/analytics/managed-streaming-for-apache-kafka_64.svg",
1180
- "aws.analytics.opensearch-service": "architecture/analytics/opensearch-service_64.svg",
1181
- "aws.analytics.redshift": "architecture/analytics/redshift_64.svg",
1182
- "aws.analytics.sagemaker": "architecture/analytics/sagemaker_64.svg",
1183
- "aws.application-integration.appflow": "architecture/application-integration/appflow_64.svg",
1184
- "aws.application-integration.appsync": "architecture/application-integration/appsync_64.svg",
1185
- "aws.application-integration.b2b-data-interchange": "architecture/application-integration/b2b-data-interchange_64.svg",
1186
- "aws.application-integration.eventbridge": "architecture/application-integration/eventbridge_64.svg",
1187
- "aws.application-integration.express-workflows": "architecture/application-integration/express-workflows_64.svg",
1188
- "aws.application-integration.managed-workflows-for-apache-airflow": "architecture/application-integration/managed-workflows-for-apache-airflow_64.svg",
1189
- "aws.application-integration.mq": "architecture/application-integration/mq_64.svg",
1190
- "aws.application-integration.simple-notification-service": "architecture/application-integration/simple-notification-service_64.svg",
1191
- "aws.application-integration.simple-queue-service": "architecture/application-integration/simple-queue-service_64.svg",
1192
- "aws.application-integration.step-functions": "architecture/application-integration/step-functions_64.svg",
1193
- "aws.artificial-intelligence.apache-mxnet-on-aws": "architecture/artificial-intelligence/apache-mxnet-on-aws_64.svg",
1194
- "aws.artificial-intelligence.app-studio": "architecture/artificial-intelligence/app-studio_64.svg",
1195
- "aws.artificial-intelligence.augmented-ai-a2i": "architecture/artificial-intelligence/augmented-ai-a2i_64.svg",
1196
- "aws.artificial-intelligence.bedrock-agentcore": "architecture/artificial-intelligence/bedrock-agentcore_64.svg",
1197
- "aws.artificial-intelligence.bedrock": "architecture/artificial-intelligence/bedrock_64.svg",
1198
- "aws.artificial-intelligence.codeguru": "architecture/artificial-intelligence/codeguru_64.svg",
1199
- "aws.artificial-intelligence.codewhisperer": "architecture/artificial-intelligence/codewhisperer_64.svg",
1200
- "aws.artificial-intelligence.comprehend-medical": "architecture/artificial-intelligence/comprehend-medical_64.svg",
1201
- "aws.artificial-intelligence.comprehend": "architecture/artificial-intelligence/comprehend_64.svg",
1202
- "aws.artificial-intelligence.deep-learning-amis": "architecture/artificial-intelligence/deep-learning-amis_64.svg",
1203
- "aws.artificial-intelligence.deep-learning-containers": "architecture/artificial-intelligence/deep-learning-containers_64.svg",
1204
- "aws.artificial-intelligence.deepracer": "architecture/artificial-intelligence/deepracer_64.svg",
1205
- "aws.artificial-intelligence.devops-guru": "architecture/artificial-intelligence/devops-guru_64.svg",
1206
- "aws.artificial-intelligence.elastic-inference": "architecture/artificial-intelligence/elastic-inference_64.svg",
1207
- "aws.artificial-intelligence.forecast": "architecture/artificial-intelligence/forecast_64.svg",
1208
- "aws.artificial-intelligence.fraud-detector": "architecture/artificial-intelligence/fraud-detector_64.svg",
1209
- "aws.artificial-intelligence.healthimaging": "architecture/artificial-intelligence/healthimaging_64.svg",
1210
- "aws.artificial-intelligence.healthlake": "architecture/artificial-intelligence/healthlake_64.svg",
1211
- "aws.artificial-intelligence.healthomics": "architecture/artificial-intelligence/healthomics_64.svg",
1212
- "aws.artificial-intelligence.healthscribe": "architecture/artificial-intelligence/healthscribe_64.svg",
1213
- "aws.artificial-intelligence.kendra": "architecture/artificial-intelligence/kendra_64.svg",
1214
- "aws.artificial-intelligence.lex": "architecture/artificial-intelligence/lex_64.svg",
1215
- "aws.artificial-intelligence.lookout-for-equipment": "architecture/artificial-intelligence/lookout-for-equipment_64.svg",
1216
- "aws.artificial-intelligence.lookout-for-vision": "architecture/artificial-intelligence/lookout-for-vision_64.svg",
1217
- "aws.artificial-intelligence.monitron": "architecture/artificial-intelligence/monitron_64.svg",
1218
- "aws.artificial-intelligence.neuron": "architecture/artificial-intelligence/neuron_64.svg",
1219
- "aws.artificial-intelligence.nova": "architecture/artificial-intelligence/nova_64.svg",
1220
- "aws.artificial-intelligence.panorama": "architecture/artificial-intelligence/panorama_64.svg",
1221
- "aws.artificial-intelligence.personalize": "architecture/artificial-intelligence/personalize_64.svg",
1222
- "aws.artificial-intelligence.polly": "architecture/artificial-intelligence/polly_64.svg",
1223
- "aws.artificial-intelligence.pytorch-on-aws": "architecture/artificial-intelligence/pytorch-on-aws_64.svg",
1224
- "aws.artificial-intelligence.q": "architecture/artificial-intelligence/q_64.svg",
1225
- "aws.artificial-intelligence.rekognition": "architecture/artificial-intelligence/rekognition_64.svg",
1226
- "aws.artificial-intelligence.sagemaker-ai": "architecture/artificial-intelligence/sagemaker-ai_64.svg",
1227
- "aws.artificial-intelligence.sagemaker-ground-truth": "architecture/artificial-intelligence/sagemaker-ground-truth_64.svg",
1228
- "aws.artificial-intelligence.sagemaker-studio-lab": "architecture/artificial-intelligence/sagemaker-studio-lab_64.svg",
1229
- "aws.artificial-intelligence.tensorflow-on-aws": "architecture/artificial-intelligence/tensorflow-on-aws_64.svg",
1230
- "aws.artificial-intelligence.textract": "architecture/artificial-intelligence/textract_64.svg",
1231
- "aws.artificial-intelligence.transcribe": "architecture/artificial-intelligence/transcribe_64.svg",
1232
- "aws.artificial-intelligence.translate": "architecture/artificial-intelligence/translate_64.svg",
1233
- "aws.blockchain.managed-blockchain": "architecture/blockchain/managed-blockchain_64.svg",
1234
- "aws.business-applications.appfabric": "architecture/business-applications/appfabric_64.svg",
1235
- "aws.business-applications.chime-sdk": "architecture/business-applications/chime-sdk_64.svg",
1236
- "aws.business-applications.chime": "architecture/business-applications/chime_64.svg",
1237
- "aws.business-applications.connect": "architecture/business-applications/connect_64.svg",
1238
- "aws.business-applications.end-user-messaging": "architecture/business-applications/end-user-messaging_64.svg",
1239
- "aws.business-applications.pinpoint-apis": "architecture/business-applications/pinpoint-apis_64.svg",
1240
- "aws.business-applications.pinpoint": "architecture/business-applications/pinpoint_64.svg",
1241
- "aws.business-applications.quick-suite": "architecture/business-applications/quick-suite_64.svg",
1242
- "aws.business-applications.simple-email-service": "architecture/business-applications/simple-email-service_64.svg",
1243
- "aws.business-applications.supply-chain": "architecture/business-applications/supply-chain_64.svg",
1244
- "aws.business-applications.wickr": "architecture/business-applications/wickr_64.svg",
1245
- "aws.business-applications.workdocs-sdk": "architecture/business-applications/workdocs-sdk_64.svg",
1246
- "aws.business-applications.workdocs": "architecture/business-applications/workdocs_64.svg",
1247
- "aws.business-applications.workmail": "architecture/business-applications/workmail_64.svg",
1248
- "aws.cloud-financial-management.billing-conductor": "architecture/cloud-financial-management/billing-conductor_64.svg",
1249
- "aws.cloud-financial-management.budgets": "architecture/cloud-financial-management/budgets_64.svg",
1250
- "aws.cloud-financial-management.cost-and-usage-report": "architecture/cloud-financial-management/cost-and-usage-report_64.svg",
1251
- "aws.cloud-financial-management.cost-explorer": "architecture/cloud-financial-management/cost-explorer_64.svg",
1252
- "aws.cloud-financial-management.reserved-instance-reporting": "architecture/cloud-financial-management/reserved-instance-reporting_64.svg",
1253
- "aws.cloud-financial-management.savings-plans": "architecture/cloud-financial-management/savings-plans_64.svg",
1254
- "aws.compute.app-runner": "architecture/compute/app-runner_64.svg",
1255
- "aws.compute.batch": "architecture/compute/batch_64.svg",
1256
- "aws.compute.bottlerocket": "architecture/compute/bottlerocket_64.svg",
1257
- "aws.compute.compute-optimizer": "architecture/compute/compute-optimizer_64.svg",
1258
- "aws.compute.dcv": "architecture/compute/dcv_64.svg",
1259
- "aws.compute.ec2-auto-scaling": "architecture/compute/ec2-auto-scaling_64.svg",
1260
- "aws.compute.ec2-image-builder": "architecture/compute/ec2-image-builder_64.svg",
1261
- "aws.compute.ec2": "architecture/compute/ec2_64.svg",
1262
- "aws.compute.elastic-beanstalk": "architecture/compute/elastic-beanstalk_64.svg",
1263
- "aws.compute.elastic-fabric-adapter": "architecture/compute/elastic-fabric-adapter_64.svg",
1264
- "aws.compute.elastic-vmware-service": "architecture/compute/elastic-vmware-service_64.svg",
1265
- "aws.compute.lambda": "architecture/compute/lambda_64.svg",
1266
- "aws.compute.lightsail-for-research": "architecture/compute/lightsail-for-research_64.svg",
1267
- "aws.compute.lightsail": "architecture/compute/lightsail_64.svg",
1268
- "aws.compute.local-zones": "architecture/compute/local-zones_64.svg",
1269
- "aws.compute.nitro-enclaves": "architecture/compute/nitro-enclaves_64.svg",
1270
- "aws.compute.outposts-family": "architecture/compute/outposts-family_64.svg",
1271
- "aws.compute.outposts-rack": "architecture/compute/outposts-rack_64.svg",
1272
- "aws.compute.outposts-servers": "architecture/compute/outposts-servers_64.svg",
1273
- "aws.compute.parallel-cluster": "architecture/compute/parallel-cluster_64.svg",
1274
- "aws.compute.parallel-computing-service": "architecture/compute/parallel-computing-service_64.svg",
1275
- "aws.compute.serverless-application-repository": "architecture/compute/serverless-application-repository_64.svg",
1276
- "aws.compute.simspace-weaver": "architecture/compute/simspace-weaver_64.svg",
1277
- "aws.compute.wavelength": "architecture/compute/wavelength_64.svg",
1278
- "aws.containers.ecs-anywhere": "architecture/containers/ecs-anywhere_64.svg",
1279
- "aws.containers.eks-anywhere": "architecture/containers/eks-anywhere_64.svg",
1280
- "aws.containers.eks-distro": "architecture/containers/eks-distro_64.svg",
1281
- "aws.containers.elastic-container-registry": "architecture/containers/elastic-container-registry_64.svg",
1282
- "aws.containers.elastic-container-service": "architecture/containers/elastic-container-service_64.svg",
1283
- "aws.containers.elastic-kubernetes-service": "architecture/containers/elastic-kubernetes-service_64.svg",
1284
- "aws.containers.fargate": "architecture/containers/fargate_64.svg",
1285
- "aws.containers.red-hat-openshift-service-on-aws": "architecture/containers/red-hat-openshift-service-on-aws_64.svg",
1286
- "aws.customer-enablement.activate": "architecture/customer-enablement/activate_64.svg",
1287
- "aws.customer-enablement.iq": "architecture/customer-enablement/iq_64.svg",
1288
- "aws.customer-enablement.managed-services": "architecture/customer-enablement/managed-services_64.svg",
1289
- "aws.customer-enablement.professional-services": "architecture/customer-enablement/professional-services_64.svg",
1290
- "aws.customer-enablement.repost-private": "architecture/customer-enablement/repost-private_64.svg",
1291
- "aws.customer-enablement.repost": "architecture/customer-enablement/repost_64.svg",
1292
- "aws.customer-enablement.support": "architecture/customer-enablement/support_64.svg",
1293
- "aws.customer-enablement.training-certification": "architecture/customer-enablement/training-certification_64.svg",
1294
- "aws.databases.aurora": "architecture/databases/aurora_64.svg",
1295
- "aws.databases.database-migration-service": "architecture/databases/database-migration-service_64.svg",
1296
- "aws.databases.documentdb": "architecture/databases/documentdb_64.svg",
1297
- "aws.databases.dynamodb": "architecture/databases/dynamodb_64.svg",
1298
- "aws.databases.elasticache": "architecture/databases/elasticache_64.svg",
1299
- "aws.databases.keyspaces": "architecture/databases/keyspaces_64.svg",
1300
- "aws.databases.memorydb": "architecture/databases/memorydb_64.svg",
1301
- "aws.databases.neptune": "architecture/databases/neptune_64.svg",
1302
- "aws.databases.oracle-database-at-aws": "architecture/databases/oracle-database-at-aws_64.svg",
1303
- "aws.databases.rds": "architecture/databases/rds_64.svg",
1304
- "aws.databases.timestream": "architecture/databases/timestream_64.svg",
1305
- "aws.developer-tools.cloud-control-api": "architecture/developer-tools/cloud-control-api_64.svg",
1306
- "aws.developer-tools.cloud-development-kit": "architecture/developer-tools/cloud-development-kit_64.svg",
1307
- "aws.developer-tools.cloud9": "architecture/developer-tools/cloud9_64.svg",
1308
- "aws.developer-tools.cloudshell": "architecture/developer-tools/cloudshell_64.svg",
1309
- "aws.developer-tools.codeartifact": "architecture/developer-tools/codeartifact_64.svg",
1310
- "aws.developer-tools.codebuild": "architecture/developer-tools/codebuild_64.svg",
1311
- "aws.developer-tools.codecatalyst": "architecture/developer-tools/codecatalyst_64.svg",
1312
- "aws.developer-tools.codecommit": "architecture/developer-tools/codecommit_64.svg",
1313
- "aws.developer-tools.codedeploy": "architecture/developer-tools/codedeploy_64.svg",
1314
- "aws.developer-tools.codepipeline": "architecture/developer-tools/codepipeline_64.svg",
1315
- "aws.developer-tools.command-line-interface": "architecture/developer-tools/command-line-interface_64.svg",
1316
- "aws.developer-tools.corretto": "architecture/developer-tools/corretto_64.svg",
1317
- "aws.developer-tools.fault-injection-service": "architecture/developer-tools/fault-injection-service_64.svg",
1318
- "aws.developer-tools.infrastructure-composer": "architecture/developer-tools/infrastructure-composer_64.svg",
1319
- "aws.developer-tools.tools-and-sdks": "architecture/developer-tools/tools-and-sdks_64.svg",
1320
- "aws.developer-tools.x-ray": "architecture/developer-tools/x-ray_64.svg",
1321
- "aws.end-user-computing.workspaces": "architecture/end-user-computing/workspaces_64.svg",
1322
- "aws.front-end-web-mobile.amplify": "architecture/front-end-web-mobile/amplify_64.svg",
1323
- "aws.front-end-web-mobile.device-farm": "architecture/front-end-web-mobile/device-farm_64.svg",
1324
- "aws.front-end-web-mobile.location-service": "architecture/front-end-web-mobile/location-service_64.svg",
1325
- "aws.games.gamelift-servers": "architecture/games/gamelift-servers_64.svg",
1326
- "aws.games.gamelift-streams": "architecture/games/gamelift-streams_64.svg",
1327
- "aws.games.open-3d-engine": "architecture/games/open-3d-engine_64.svg",
1328
- "aws.general-icons.marketplace_dark": "architecture/general-icons/marketplace_dark_64.svg",
1329
- "aws.general-icons.marketplace_light": "architecture/general-icons/marketplace_light_64.svg",
1330
- "aws.internet-of-things.freertos": "architecture/internet-of-things/freertos_64.svg",
1331
- "aws.internet-of-things.iot-core": "architecture/internet-of-things/iot-core_64.svg",
1332
- "aws.internet-of-things.iot-device-defender": "architecture/internet-of-things/iot-device-defender_64.svg",
1333
- "aws.internet-of-things.iot-device-management": "architecture/internet-of-things/iot-device-management_64.svg",
1334
- "aws.internet-of-things.iot-events": "architecture/internet-of-things/iot-events_64.svg",
1335
- "aws.internet-of-things.iot-expresslink": "architecture/internet-of-things/iot-expresslink_64.svg",
1336
- "aws.internet-of-things.iot-fleetwise": "architecture/internet-of-things/iot-fleetwise_64.svg",
1337
- "aws.internet-of-things.iot-greengrass": "architecture/internet-of-things/iot-greengrass_64.svg",
1338
- "aws.internet-of-things.iot-sitewise": "architecture/internet-of-things/iot-sitewise_64.svg",
1339
- "aws.internet-of-things.iot-twinmaker": "architecture/internet-of-things/iot-twinmaker_64.svg",
1340
- "aws.management-tools.appconfig": "architecture/management-tools/appconfig_64.svg",
1341
- "aws.management-tools.application-auto-scaling": "architecture/management-tools/application-auto-scaling_64.svg",
1342
- "aws.management-tools.auto-scaling": "architecture/management-tools/auto-scaling_64.svg",
1343
- "aws.management-tools.backint-agent": "architecture/management-tools/backint-agent_64.svg",
1344
- "aws.management-tools.chatbot": "architecture/management-tools/chatbot_64.svg",
1345
- "aws.management-tools.cloudformation": "architecture/management-tools/cloudformation_64.svg",
1346
- "aws.management-tools.cloudtrail": "architecture/management-tools/cloudtrail_64.svg",
1347
- "aws.management-tools.cloudwatch": "architecture/management-tools/cloudwatch_64.svg",
1348
- "aws.management-tools.compute-optimizer": "architecture/management-tools/compute-optimizer_64.svg",
1349
- "aws.management-tools.config": "architecture/management-tools/config_64.svg",
1350
- "aws.management-tools.console-mobile-application": "architecture/management-tools/console-mobile-application_64.svg",
1351
- "aws.management-tools.control-tower": "architecture/management-tools/control-tower_64.svg",
1352
- "aws.management-tools.devops-agent": "architecture/management-tools/devops-agent_64.svg",
1353
- "aws.management-tools.distro-for-opentelemetry": "architecture/management-tools/distro-for-opentelemetry_64.svg",
1354
- "aws.management-tools.health-dashboard": "architecture/management-tools/health-dashboard_64.svg",
1355
- "aws.management-tools.launch-wizard": "architecture/management-tools/launch-wizard_64.svg",
1356
- "aws.management-tools.license-manager": "architecture/management-tools/license-manager_64.svg",
1357
- "aws.management-tools.managed-grafana": "architecture/management-tools/managed-grafana_64.svg",
1358
- "aws.management-tools.managed-service-for-prometheus": "architecture/management-tools/managed-service-for-prometheus_64.svg",
1359
- "aws.management-tools.management-console": "architecture/management-tools/management-console_64.svg",
1360
- "aws.management-tools.organizations": "architecture/management-tools/organizations_64.svg",
1361
- "aws.management-tools.partner-central": "architecture/management-tools/partner-central_64.svg",
1362
- "aws.management-tools.proton": "architecture/management-tools/proton_64.svg",
1363
- "aws.management-tools.resilience-hub": "architecture/management-tools/resilience-hub_64.svg",
1364
- "aws.management-tools.resource-explorer": "architecture/management-tools/resource-explorer_64.svg",
1365
- "aws.management-tools.service-catalog": "architecture/management-tools/service-catalog_64.svg",
1366
- "aws.management-tools.service-management-connector": "architecture/management-tools/service-management-connector_64.svg",
1367
- "aws.management-tools.systems-manager": "architecture/management-tools/systems-manager_64.svg",
1368
- "aws.management-tools.telco-network-builder": "architecture/management-tools/telco-network-builder_64.svg",
1369
- "aws.management-tools.trusted-advisor": "architecture/management-tools/trusted-advisor_64.svg",
1370
- "aws.management-tools.user-notifications": "architecture/management-tools/user-notifications_64.svg",
1371
- "aws.management-tools.well-architected-tool": "architecture/management-tools/well-architected-tool_64.svg",
1372
- "aws.media-services.deadline-cloud": "architecture/media-services/deadline-cloud_64.svg",
1373
- "aws.media-services.elemental-appliances-&-software": "architecture/media-services/elemental-appliances-&-software_64.svg",
1374
- "aws.media-services.elemental-conductor": "architecture/media-services/elemental-conductor_64.svg",
1375
- "aws.media-services.elemental-delta": "architecture/media-services/elemental-delta_64.svg",
1376
- "aws.media-services.elemental-link": "architecture/media-services/elemental-link_64.svg",
1377
- "aws.media-services.elemental-live": "architecture/media-services/elemental-live_64.svg",
1378
- "aws.media-services.elemental-mediaconnect": "architecture/media-services/elemental-mediaconnect_64.svg",
1379
- "aws.media-services.elemental-mediaconvert": "architecture/media-services/elemental-mediaconvert_64.svg",
1380
- "aws.media-services.elemental-medialive": "architecture/media-services/elemental-medialive_64.svg",
1381
- "aws.media-services.elemental-mediapackage": "architecture/media-services/elemental-mediapackage_64.svg",
1382
- "aws.media-services.elemental-mediastore": "architecture/media-services/elemental-mediastore_64.svg",
1383
- "aws.media-services.elemental-mediatailor": "architecture/media-services/elemental-mediatailor_64.svg",
1384
- "aws.media-services.elemental-server": "architecture/media-services/elemental-server_64.svg",
1385
- "aws.media-services.interactive-video-service": "architecture/media-services/interactive-video-service_64.svg",
1386
- "aws.media-services.kinesis-video-streams": "architecture/media-services/kinesis-video-streams_64.svg",
1387
- "aws.media-services.thinkbox-deadline": "architecture/media-services/thinkbox-deadline_64.svg",
1388
- "aws.media-services.thinkbox-frost": "architecture/media-services/thinkbox-frost_64.svg",
1389
- "aws.media-services.thinkbox-krakatoa": "architecture/media-services/thinkbox-krakatoa_64.svg",
1390
- "aws.media-services.thinkbox-stoke": "architecture/media-services/thinkbox-stoke_64.svg",
1391
- "aws.media-services.thinkbox-xmesh": "architecture/media-services/thinkbox-xmesh_64.svg",
1392
- "aws.migration-modernization.application-discovery-service": "architecture/migration-modernization/application-discovery-service_64.svg",
1393
- "aws.migration-modernization.application-migration-service": "architecture/migration-modernization/application-migration-service_64.svg",
1394
- "aws.migration-modernization.data-transfer-terminal": "architecture/migration-modernization/data-transfer-terminal_64.svg",
1395
- "aws.migration-modernization.datasync": "architecture/migration-modernization/datasync_64.svg",
1396
- "aws.migration-modernization.mainframe-modernization": "architecture/migration-modernization/mainframe-modernization_64.svg",
1397
- "aws.migration-modernization.migration-evaluator": "architecture/migration-modernization/migration-evaluator_64.svg",
1398
- "aws.migration-modernization.migration-hub": "architecture/migration-modernization/migration-hub_64.svg",
1399
- "aws.migration-modernization.transfer-family": "architecture/migration-modernization/transfer-family_64.svg",
1400
- "aws.migration-modernization.transform": "architecture/migration-modernization/transform_64.svg",
1401
- "aws.networking-content-delivery.api-gateway": "architecture/networking-content-delivery/api-gateway_64.svg",
1402
- "aws.networking-content-delivery.app-mesh": "architecture/networking-content-delivery/app-mesh_64.svg",
1403
- "aws.networking-content-delivery.application-recovery-controller": "architecture/networking-content-delivery/application-recovery-controller_64.svg",
1404
- "aws.networking-content-delivery.client-vpn": "architecture/networking-content-delivery/client-vpn_64.svg",
1405
- "aws.networking-content-delivery.cloud-map": "architecture/networking-content-delivery/cloud-map_64.svg",
1406
- "aws.networking-content-delivery.cloud-wan": "architecture/networking-content-delivery/cloud-wan_64.svg",
1407
- "aws.networking-content-delivery.cloudfront": "architecture/networking-content-delivery/cloudfront_64.svg",
1408
- "aws.networking-content-delivery.direct-connect": "architecture/networking-content-delivery/direct-connect_64.svg",
1409
- "aws.networking-content-delivery.elastic-load-balancing": "architecture/networking-content-delivery/elastic-load-balancing_64.svg",
1410
- "aws.networking-content-delivery.global-accelerator": "architecture/networking-content-delivery/global-accelerator_64.svg",
1411
- "aws.networking-content-delivery.privatelink": "architecture/networking-content-delivery/privatelink_64.svg",
1412
- "aws.networking-content-delivery.route-53": "architecture/networking-content-delivery/route-53_64.svg",
1413
- "aws.networking-content-delivery.rtb-fabric": "architecture/networking-content-delivery/rtb-fabric_64.svg",
1414
- "aws.networking-content-delivery.site-to-site-vpn": "architecture/networking-content-delivery/site-to-site-vpn_64.svg",
1415
- "aws.networking-content-delivery.transit-gateway": "architecture/networking-content-delivery/transit-gateway_64.svg",
1416
- "aws.networking-content-delivery.verified-access": "architecture/networking-content-delivery/verified-access_64.svg",
1417
- "aws.networking-content-delivery.virtual-private-cloud": "architecture/networking-content-delivery/virtual-private-cloud_64.svg",
1418
- "aws.networking-content-delivery.vpc-lattice": "architecture/networking-content-delivery/vpc-lattice_64.svg",
1419
- "aws.quantum-technologies.braket": "architecture/quantum-technologies/braket_64.svg",
1420
- "aws.satellite.ground-station": "architecture/satellite/ground-station_64.svg",
1421
- "aws.security-identity.artifact": "architecture/security-identity/artifact_64.svg",
1422
- "aws.security-identity.audit-manager": "architecture/security-identity/audit-manager_64.svg",
1423
- "aws.security-identity.certificate-manager": "architecture/security-identity/certificate-manager_64.svg",
1424
- "aws.security-identity.cloud-directory": "architecture/security-identity/cloud-directory_64.svg",
1425
- "aws.security-identity.cloudhsm": "architecture/security-identity/cloudhsm_64.svg",
1426
- "aws.security-identity.cognito": "architecture/security-identity/cognito_64.svg",
1427
- "aws.security-identity.detective": "architecture/security-identity/detective_64.svg",
1428
- "aws.security-identity.directory-service": "architecture/security-identity/directory-service_64.svg",
1429
- "aws.security-identity.firewall-manager": "architecture/security-identity/firewall-manager_64.svg",
1430
- "aws.security-identity.guardduty": "architecture/security-identity/guardduty_64.svg",
1431
- "aws.security-identity.iam-identity-center": "architecture/security-identity/iam-identity-center_64.svg",
1432
- "aws.security-identity.identity-and-access-management": "architecture/security-identity/identity-and-access-management_64.svg",
1433
- "aws.security-identity.inspector": "architecture/security-identity/inspector_64.svg",
1434
- "aws.security-identity.key-management-service": "architecture/security-identity/key-management-service_64.svg",
1435
- "aws.security-identity.macie": "architecture/security-identity/macie_64.svg",
1436
- "aws.security-identity.network-firewall": "architecture/security-identity/network-firewall_64.svg",
1437
- "aws.security-identity.payment-cryptography": "architecture/security-identity/payment-cryptography_64.svg",
1438
- "aws.security-identity.private-certificate-authority": "architecture/security-identity/private-certificate-authority_64.svg",
1439
- "aws.security-identity.resource-access-manager": "architecture/security-identity/resource-access-manager_64.svg",
1440
- "aws.security-identity.secrets-manager": "architecture/security-identity/secrets-manager_64.svg",
1441
- "aws.security-identity.security-agent": "architecture/security-identity/security-agent_64.svg",
1442
- "aws.security-identity.security-hub": "architecture/security-identity/security-hub_64.svg",
1443
- "aws.security-identity.security-incident-response": "architecture/security-identity/security-incident-response_64.svg",
1444
- "aws.security-identity.security-lake": "architecture/security-identity/security-lake_64.svg",
1445
- "aws.security-identity.shield": "architecture/security-identity/shield_64.svg",
1446
- "aws.security-identity.signer": "architecture/security-identity/signer_64.svg",
1447
- "aws.security-identity.verified-permissions": "architecture/security-identity/verified-permissions_64.svg",
1448
- "aws.security-identity.waf": "architecture/security-identity/waf_64.svg",
1449
- "aws.storage.backup": "architecture/storage/backup_64.svg",
1450
- "aws.storage.efs": "architecture/storage/efs_64.svg",
1451
- "aws.storage.elastic-block-store": "architecture/storage/elastic-block-store_64.svg",
1452
- "aws.storage.elastic-disaster-recovery": "architecture/storage/elastic-disaster-recovery_64.svg",
1453
- "aws.storage.file-cache": "architecture/storage/file-cache_64.svg",
1454
- "aws.storage.fsx-for-lustre": "architecture/storage/fsx-for-lustre_64.svg",
1455
- "aws.storage.fsx-for-netapp-ontap": "architecture/storage/fsx-for-netapp-ontap_64.svg",
1456
- "aws.storage.fsx-for-openzfs": "architecture/storage/fsx-for-openzfs_64.svg",
1457
- "aws.storage.fsx-for-wfs": "architecture/storage/fsx-for-wfs_64.svg",
1458
- "aws.storage.fsx": "architecture/storage/fsx_64.svg",
1459
- "aws.storage.s3-on-outposts": "architecture/storage/s3-on-outposts_64.svg",
1460
- "aws.storage.simple-storage-service-glacier": "architecture/storage/simple-storage-service-glacier_64.svg",
1461
- "aws.storage.simple-storage-service": "architecture/storage/simple-storage-service_64.svg",
1462
- "aws.storage.snowball-edge": "architecture/storage/snowball-edge_64.svg",
1463
- "aws.storage.snowball": "architecture/storage/snowball_64.svg",
1464
- "aws.storage.storage-gateway": "architecture/storage/storage-gateway_64.svg",
1465
- "aws.analytics.athena.data-source-connectors": "resource/analytics/athena_data-source-connectors_48.svg",
1466
- "aws.analytics.cloudsearch.search-documents": "resource/analytics/cloudsearch_search-documents_48.svg",
1467
- "aws.analytics.data-exchange-for-apis.data-exchange-for-apis": "resource/analytics/data-exchange-for-apis_48.svg",
1468
- "aws.analytics.datazone.business-data-catalog": "resource/analytics/datazone_business-data-catalog_48.svg",
1469
- "aws.analytics.datazone.data-portal": "resource/analytics/datazone_data-portal_48.svg",
1470
- "aws.analytics.datazone.data-projects": "resource/analytics/datazone_data-projects_48.svg",
1471
- "aws.analytics.emr.cluster": "resource/analytics/emr_cluster_48.svg",
1472
- "aws.analytics.emr.emr-engine": "resource/analytics/emr_emr-engine_48.svg",
1473
- "aws.analytics.emr.hdfs-cluster": "resource/analytics/emr_hdfs-cluster_48.svg",
1474
- "aws.analytics.glue.aws-glue-for-ray": "resource/analytics/glue_aws-glue-for-ray_48.svg",
1475
- "aws.analytics.glue.crawler": "resource/analytics/glue_crawler_48.svg",
1476
- "aws.analytics.glue.data-catalog": "resource/analytics/glue_data-catalog_48.svg",
1477
- "aws.analytics.glue.data-quality": "resource/analytics/glue_data-quality_48.svg",
1478
- "aws.analytics.lake-formation.data-lake": "resource/analytics/lake-formation_data-lake_48.svg",
1479
- "aws.analytics.msk.amazon-msk-connect": "resource/analytics/msk_amazon-msk-connect_48.svg",
1480
- "aws.analytics.opensearch-service.cluster-administrator-node": "resource/analytics/opensearch-service_cluster-administrator-node_48.svg",
1481
- "aws.analytics.opensearch-service.data-node": "resource/analytics/opensearch-service_data-node_48.svg",
1482
- "aws.analytics.opensearch-service.index": "resource/analytics/opensearch-service_index_48.svg",
1483
- "aws.analytics.opensearch-service.observability": "resource/analytics/opensearch-service_observability_48.svg",
1484
- "aws.analytics.opensearch-service.opensearch-dashboards": "resource/analytics/opensearch-service_opensearch-dashboards_48.svg",
1485
- "aws.analytics.opensearch-service.opensearch-ingestion": "resource/analytics/opensearch-service_opensearch-ingestion_48.svg",
1486
- "aws.analytics.opensearch-service.traces": "resource/analytics/opensearch-service_traces_48.svg",
1487
- "aws.analytics.opensearch-service.ultrawarm-node": "resource/analytics/opensearch-service_ultrawarm-node_48.svg",
1488
- "aws.analytics.redshift.auto-copy": "resource/analytics/redshift_auto-copy_48.svg",
1489
- "aws.analytics.redshift.data-sharing-governance": "resource/analytics/redshift_data-sharing-governance_48.svg",
1490
- "aws.analytics.redshift.dense-compute-node": "resource/analytics/redshift_dense-compute-node_48.svg",
1491
- "aws.analytics.redshift.dense-storage-node": "resource/analytics/redshift_dense-storage-node_48.svg",
1492
- "aws.analytics.redshift.ml": "resource/analytics/redshift_ml_48.svg",
1493
- "aws.analytics.redshift.query-editor-v2.0": "resource/analytics/redshift_query-editor-v2.0_48.svg",
1494
- "aws.analytics.redshift.ra3": "resource/analytics/redshift_ra3_48.svg",
1495
- "aws.analytics.redshift.streaming-ingestion": "resource/analytics/redshift_streaming-ingestion_48.svg",
1496
- "aws.application-integration.eventbridge-event.eventbridge-event": "resource/application-integration/eventbridge-event_48.svg",
1497
- "aws.application-integration.eventbridge.custom-event-bus": "resource/application-integration/eventbridge_custom-event-bus_48.svg",
1498
- "aws.application-integration.eventbridge.default-event-bus": "resource/application-integration/eventbridge_default-event-bus_48.svg",
1499
- "aws.application-integration.eventbridge.pipes": "resource/application-integration/eventbridge_pipes_48.svg",
1500
- "aws.application-integration.eventbridge.rule": "resource/application-integration/eventbridge_rule_48.svg",
1501
- "aws.application-integration.eventbridge.saas-partner-event": "resource/application-integration/eventbridge_saas-partner-event_48.svg",
1502
- "aws.application-integration.eventbridge.scheduler": "resource/application-integration/eventbridge_scheduler_48.svg",
1503
- "aws.application-integration.eventbridge.schema-registry": "resource/application-integration/eventbridge_schema-registry_48.svg",
1504
- "aws.application-integration.eventbridge.schema": "resource/application-integration/eventbridge_schema_48.svg",
1505
- "aws.application-integration.mq.broker": "resource/application-integration/mq_broker_48.svg",
1506
- "aws.application-integration.simple-notification-service.email-notification": "resource/application-integration/simple-notification-service_email-notification_48.svg",
1507
- "aws.application-integration.simple-notification-service.http-notification": "resource/application-integration/simple-notification-service_http-notification_48.svg",
1508
- "aws.application-integration.simple-notification-service.topic": "resource/application-integration/simple-notification-service_topic_48.svg",
1509
- "aws.application-integration.simple-queue-service.message": "resource/application-integration/simple-queue-service_message_48.svg",
1510
- "aws.application-integration.simple-queue-service.queue": "resource/application-integration/simple-queue-service_queue_48.svg",
1511
- "aws.artificial-intelligence.devops-guru.insights": "resource/artificial-intelligence/devops-guru_insights_48.svg",
1512
- "aws.artificial-intelligence.rekognition.image": "resource/artificial-intelligence/rekognition_image_48.svg",
1513
- "aws.artificial-intelligence.rekognition.video": "resource/artificial-intelligence/rekognition_video_48.svg",
1514
- "aws.artificial-intelligence.sagemaker-ai.canvas": "resource/artificial-intelligence/sagemaker-ai_canvas_48.svg",
1515
- "aws.artificial-intelligence.sagemaker-ai.geospatial-ml": "resource/artificial-intelligence/sagemaker-ai_geospatial-ml_48.svg",
1516
- "aws.artificial-intelligence.sagemaker-ai.model": "resource/artificial-intelligence/sagemaker-ai_model_48.svg",
1517
- "aws.artificial-intelligence.sagemaker-ai.notebook": "resource/artificial-intelligence/sagemaker-ai_notebook_48.svg",
1518
- "aws.artificial-intelligence.sagemaker-ai.shadow-testing": "resource/artificial-intelligence/sagemaker-ai_shadow-testing_48.svg",
1519
- "aws.artificial-intelligence.sagemaker-ai.train": "resource/artificial-intelligence/sagemaker-ai_train_48.svg",
1520
- "aws.artificial-intelligence.textract.analyze-lending": "resource/artificial-intelligence/textract_analyze-lending_48.svg",
1521
- "aws.blockchain.managed-blockchain.blockchain": "resource/blockchain/managed-blockchain_blockchain_48.svg",
1522
- "aws.business-applications.pinpoint.journey": "resource/business-applications/pinpoint_journey_48.svg",
1523
- "aws.business-applications.simple-email-service.email": "resource/business-applications/simple-email-service_email_48.svg",
1524
- "aws.compute.ec2.ami": "resource/compute/ec2_ami_48.svg",
1525
- "aws.compute.ec2.auto-scaling": "resource/compute/ec2_auto-scaling_48.svg",
1526
- "aws.compute.ec2.aws-microservice-extractor-for-.net": "resource/compute/ec2_aws-microservice-extractor-for-.net_48.svg",
1527
- "aws.compute.ec2.db-instance": "resource/compute/ec2_db-instance_48.svg",
1528
- "aws.compute.ec2.elastic-ip-address": "resource/compute/ec2_elastic-ip-address_48.svg",
1529
- "aws.compute.ec2.instance-with-cloudwatch": "resource/compute/ec2_instance-with-cloudwatch_48.svg",
1530
- "aws.compute.ec2.instance": "resource/compute/ec2_instance_48.svg",
1531
- "aws.compute.ec2.instances": "resource/compute/ec2_instances_48.svg",
1532
- "aws.compute.ec2.rescue": "resource/compute/ec2_rescue_48.svg",
1533
- "aws.compute.ec2.spot-instance": "resource/compute/ec2_spot-instance_48.svg",
1534
- "aws.compute.elastic-beanstalk.application": "resource/compute/elastic-beanstalk_application_48.svg",
1535
- "aws.compute.elastic-beanstalk.deployment": "resource/compute/elastic-beanstalk_deployment_48.svg",
1536
- "aws.compute.lambda.lambda-function": "resource/compute/lambda_lambda-function_48.svg",
1537
- "aws.containers.elastic-container-registry.image": "resource/containers/elastic-container-registry_image_48.svg",
1538
- "aws.containers.elastic-container-registry.registry": "resource/containers/elastic-container-registry_registry_48.svg",
1539
- "aws.containers.elastic-container-service.container-1": "resource/containers/elastic-container-service_container-1_48.svg",
1540
- "aws.containers.elastic-container-service.container-2": "resource/containers/elastic-container-service_container-2_48.svg",
1541
- "aws.containers.elastic-container-service.container-3": "resource/containers/elastic-container-service_container-3_48.svg",
1542
- "aws.containers.elastic-container-service.copiiot-cli": "resource/containers/elastic-container-service_copiiot-cli_48.svg",
1543
- "aws.containers.elastic-container-service.ecs-service-connect": "resource/containers/elastic-container-service_ecs-service-connect_48.svg",
1544
- "aws.containers.elastic-container-service.service": "resource/containers/elastic-container-service_service_48.svg",
1545
- "aws.containers.elastic-container-service.task": "resource/containers/elastic-container-service_task_48.svg",
1546
- "aws.containers.elastic-kubernetes-service.eks-on-outposts": "resource/containers/elastic-kubernetes-service_eks-on-outposts_48.svg",
1547
- "aws.databases.aurora-instance.aurora-instance": "resource/databases/aurora-instance_48.svg",
1548
- "aws.databases.aurora-mariadb-instance-alternate.aurora-mariadb-instance-alternate": "resource/databases/aurora-mariadb-instance-alternate_48.svg",
1549
- "aws.databases.aurora-mariadb-instance.aurora-mariadb-instance": "resource/databases/aurora-mariadb-instance_48.svg",
1550
- "aws.databases.aurora-mysql-instance-alternate.aurora-mysql-instance-alternate": "resource/databases/aurora-mysql-instance-alternate_48.svg",
1551
- "aws.databases.aurora-mysql-instance.aurora-mysql-instance": "resource/databases/aurora-mysql-instance_48.svg",
1552
- "aws.databases.aurora-oracle-instance-alternate.aurora-oracle-instance-alternate": "resource/databases/aurora-oracle-instance-alternate_48.svg",
1553
- "aws.databases.aurora-oracle-instance.aurora-oracle-instance": "resource/databases/aurora-oracle-instance_48.svg",
1554
- "aws.databases.aurora-piops-instance.aurora-piops-instance": "resource/databases/aurora-piops-instance_48.svg",
1555
- "aws.databases.aurora-postgresql-instance-alternate.aurora-postgresql-instance-alternate": "resource/databases/aurora-postgresql-instance-alternate_48.svg",
1556
- "aws.databases.aurora-postgresql-instance.aurora-postgresql-instance": "resource/databases/aurora-postgresql-instance_48.svg",
1557
- "aws.databases.aurora-sql-server-instance-alternate.aurora-sql-server-instance-alternate": "resource/databases/aurora-sql-server-instance-alternate_48.svg",
1558
- "aws.databases.aurora-sql-server-instance.aurora-sql-server-instance": "resource/databases/aurora-sql-server-instance_48.svg",
1559
- "aws.databases.aurora.amazon-aurora-instance-alternate": "resource/databases/aurora_amazon-aurora-instance-alternate_48.svg",
1560
- "aws.databases.aurora.amazon-rds-instance-aternate": "resource/databases/aurora_amazon-rds-instance-aternate_48.svg",
1561
- "aws.databases.aurora.amazon-rds-instance": "resource/databases/aurora_amazon-rds-instance_48.svg",
1562
- "aws.databases.aurora.trusted-language-extensions-for-postgresql": "resource/databases/aurora_trusted-language-extensions-for-postgresql_48.svg",
1563
- "aws.databases.database-migration-service.database-migration-workflow-or-job": "resource/databases/database-migration-service_database-migration-workflow-or-job_48.svg",
1564
- "aws.databases.documentdb.elastic-clusters": "resource/databases/documentdb_elastic-clusters_48.svg",
1565
- "aws.databases.dynamodb.amazon-dynamodb-accelerator": "resource/databases/dynamodb_amazon-dynamodb-accelerator_48.svg",
1566
- "aws.databases.dynamodb.attribute": "resource/databases/dynamodb_attribute_48.svg",
1567
- "aws.databases.dynamodb.attributes": "resource/databases/dynamodb_attributes_48.svg",
1568
- "aws.databases.dynamodb.global-secondary-index": "resource/databases/dynamodb_global-secondary-index_48.svg",
1569
- "aws.databases.dynamodb.item": "resource/databases/dynamodb_item_48.svg",
1570
- "aws.databases.dynamodb.items": "resource/databases/dynamodb_items_48.svg",
1571
- "aws.databases.dynamodb.standard-access-table-class": "resource/databases/dynamodb_standard-access-table-class_48.svg",
1572
- "aws.databases.dynamodb.standard-infrequent-access-table-class": "resource/databases/dynamodb_standard-infrequent-access-table-class_48.svg",
1573
- "aws.databases.dynamodb.stream": "resource/databases/dynamodb_stream_48.svg",
1574
- "aws.databases.dynamodb.table": "resource/databases/dynamodb_table_48.svg",
1575
- "aws.databases.elasticache.cache-node": "resource/databases/elasticache_cache-node_48.svg",
1576
- "aws.databases.elasticache.elasticache-for-memcached": "resource/databases/elasticache_elasticache-for-memcached_48.svg",
1577
- "aws.databases.elasticache.elasticache-for-redis": "resource/databases/elasticache_elasticache-for-redis_48.svg",
1578
- "aws.databases.elasticache.elasticache-for-valkey": "resource/databases/elasticache_elasticache-for-valkey_48.svg",
1579
- "aws.databases.rds-proxy-instance-alternate.rds-proxy-instance-alternate": "resource/databases/rds-proxy-instance-alternate_48.svg",
1580
- "aws.databases.rds-proxy-instance.rds-proxy-instance": "resource/databases/rds-proxy-instance_48.svg",
1581
- "aws.databases.rds.blue-green-deployments": "resource/databases/rds_blue-green-deployments_48.svg",
1582
- "aws.databases.rds.multi-az-db-cluster": "resource/databases/rds_multi-az-db-cluster_48.svg",
1583
- "aws.databases.rds.multi-az": "resource/databases/rds_multi-az_48.svg",
1584
- "aws.databases.rds.optimized-writes": "resource/databases/rds_optimized-writes_48.svg",
1585
- "aws.databases.rds.trusted-language-extensions-for-postgresql": "resource/databases/rds_trusted-language-extensions-for-postgresql_48.svg",
1586
- "aws.developer-tools.cloud9.cloud9": "resource/developer-tools/cloud9_cloud9_48.svg",
1587
- "aws.front-end-web-mobile.amplify.aws-amplify-studio": "resource/front-end-web-mobile/amplify_aws-amplify-studio_48.svg",
1588
- "aws.front-end-web-mobile.location-service.geofence": "resource/front-end-web-mobile/location-service_geofence_48.svg",
1589
- "aws.front-end-web-mobile.location-service.map ": "resource/front-end-web-mobile/location-service_map _48.svg",
1590
- "aws.front-end-web-mobile.location-service.place": "resource/front-end-web-mobile/location-service_place_48.svg",
1591
- "aws.front-end-web-mobile.location-service.routes": "resource/front-end-web-mobile/location-service_routes_48.svg",
1592
- "aws.front-end-web-mobile.location-service.track ": "resource/front-end-web-mobile/location-service_track _48.svg",
1593
- "aws.general.alert.alert": "resource/general/alert_48_light.svg",
1594
- "aws.general.authenticated-user.authenticated-user": "resource/general/authenticated-user_48_light.svg",
1595
- "aws.general.camera.camera": "resource/general/camera_48_light.svg",
1596
- "aws.general.chat.chat": "resource/general/chat_48_light.svg",
1597
- "aws.general.client.client": "resource/general/client_48_light.svg",
1598
- "aws.general.cold-storage.cold-storage": "resource/general/cold-storage_48_light.svg",
1599
- "aws.general.credentials.credentials": "resource/general/credentials_48_light.svg",
1600
- "aws.general.data-stream.data-stream": "resource/general/data-stream_48_light.svg",
1601
- "aws.general.data-table.data-table": "resource/general/data-table_48_light.svg",
1602
- "aws.general.database.database": "resource/general/database_48_light.svg",
1603
- "aws.general.disk.disk": "resource/general/disk_48_light.svg",
1604
- "aws.general.document.document": "resource/general/document_48_light.svg",
1605
- "aws.general.documents.documents": "resource/general/documents_48_light.svg",
1606
- "aws.general.email.email": "resource/general/email_48_light.svg",
1607
- "aws.general.firewall.firewall": "resource/general/firewall_48_light.svg",
1608
- "aws.general.folder.folder": "resource/general/folder_48_light.svg",
1609
- "aws.general.folders.folders": "resource/general/folders_48_light.svg",
1610
- "aws.general.forums.forums": "resource/general/forums_48_light.svg",
1611
- "aws.general.gear.gear": "resource/general/gear_48_light.svg",
1612
- "aws.general.generic-application.generic-application": "resource/general/generic-application_48_light.svg",
1613
- "aws.general.git-repository.git-repository": "resource/general/git-repository_48_light.svg",
1614
- "aws.general.globe.globe": "resource/general/globe_48_light.svg",
1615
- "aws.general.internet-alt1.internet-alt1": "resource/general/internet-alt1_48_light.svg",
1616
- "aws.general.internet-alt2.internet-alt2": "resource/general/internet-alt2_48_light.svg",
1617
- "aws.general.internet.internet": "resource/general/internet_48_light.svg",
1618
- "aws.general.json-script.json-script": "resource/general/json-script_48_light.svg",
1619
- "aws.general.logs.logs": "resource/general/logs_48_light.svg",
1620
- "aws.general.magnifying-glass.magnifying-glass": "resource/general/magnifying-glass_48_light.svg",
1621
- "aws.general.management-console.management-console": "resource/general/management-console_48_light.svg",
1622
- "aws.general.metrics.metrics": "resource/general/metrics_48_light.svg",
1623
- "aws.general.mobile-client.mobile-client": "resource/general/mobile-client_48_light.svg",
1624
- "aws.general.multimedia.multimedia": "resource/general/multimedia_48_light.svg",
1625
- "aws.general.office-building.office-building": "resource/general/office-building_48_light.svg",
1626
- "aws.general.programming-language.programming-language": "resource/general/programming-language_48_light.svg",
1627
- "aws.general.question.question": "resource/general/question_48_light.svg",
1628
- "aws.general.recover.recover": "resource/general/recover_48_light.svg",
1629
- "aws.general.saml-token.saml-token": "resource/general/saml-token_48_light.svg",
1630
- "aws.general.sdk.sdk": "resource/general/sdk_48_light.svg",
1631
- "aws.general.server.server": "resource/general/server_48_light.svg",
1632
- "aws.general.servers.servers": "resource/general/servers_48_light.svg",
1633
- "aws.general.shield.shield": "resource/general/shield_48_light.svg",
1634
- "aws.general.source-code.source-code": "resource/general/source-code_48_light.svg",
1635
- "aws.general.ssl-padlock.ssl-padlock": "resource/general/ssl-padlock_48_light.svg",
1636
- "aws.general.tape-storage.tape-storage": "resource/general/tape-storage_48_light.svg",
1637
- "aws.general.toolkit.toolkit": "resource/general/toolkit_48_light.svg",
1638
- "aws.general.user.user": "resource/general/user_48_light.svg",
1639
- "aws.general.users.users": "resource/general/users_48_light.svg",
1640
- "aws.iot.iot-core.device-advisor": "resource/iot/iot-core_device-advisor_48.svg",
1641
- "aws.iot.iot-core.device-location": "resource/iot/iot-core_device-location_48.svg",
1642
- "aws.iot.iot-device-defender.iot-device-jobs": "resource/iot/iot-device-defender_iot-device-jobs_48.svg",
1643
- "aws.iot.iot-device-management.fleet-hub": "resource/iot/iot-device-management_fleet-hub_48.svg",
1644
- "aws.iot.iot-device-tester.iot-device-tester": "resource/iot/iot-device-tester_48.svg",
1645
- "aws.iot.iot-greengrass.artifact": "resource/iot/iot-greengrass_artifact_48.svg",
1646
- "aws.iot.iot-greengrass.component-machine-learning": "resource/iot/iot-greengrass_component-machine-learning_48.svg",
1647
- "aws.iot.iot-greengrass.component-nucleus": "resource/iot/iot-greengrass_component-nucleus_48.svg",
1648
- "aws.iot.iot-greengrass.component-private": "resource/iot/iot-greengrass_component-private_48.svg",
1649
- "aws.iot.iot-greengrass.component-public": "resource/iot/iot-greengrass_component-public_48.svg",
1650
- "aws.iot.iot-greengrass.component": "resource/iot/iot-greengrass_component_48.svg",
1651
- "aws.iot.iot-greengrass.connector": "resource/iot/iot-greengrass_connector_48.svg",
1652
- "aws.iot.iot-greengrass.interprocess-communication": "resource/iot/iot-greengrass_interprocess-communication_48.svg",
1653
- "aws.iot.iot-greengrass.protocol": "resource/iot/iot-greengrass_protocol_48.svg",
1654
- "aws.iot.iot-greengrass.recipe": "resource/iot/iot-greengrass_recipe_48.svg",
1655
- "aws.iot.iot-greengrass.stream-manager": "resource/iot/iot-greengrass_stream-manager_48.svg",
1656
- "aws.iot.iot-hardware-board.iot-hardware-board": "resource/iot/iot-hardware-board_48.svg",
1657
- "aws.iot.iot-rule.iot-rule": "resource/iot/iot-rule_48.svg",
1658
- "aws.iot.iot-sitewise.asset-hierarchy": "resource/iot/iot-sitewise_asset-hierarchy_48.svg",
1659
- "aws.iot.iot-sitewise.asset-model": "resource/iot/iot-sitewise_asset-model_48.svg",
1660
- "aws.iot.iot-sitewise.asset-properties": "resource/iot/iot-sitewise_asset-properties_48.svg",
1661
- "aws.iot.iot-sitewise.asset": "resource/iot/iot-sitewise_asset_48.svg",
1662
- "aws.iot.iot-sitewise.data-streams": "resource/iot/iot-sitewise_data-streams_48.svg",
1663
- "aws.iot.iot.action": "resource/iot/iot_action_48.svg",
1664
- "aws.iot.iot.actuator": "resource/iot/iot_actuator_48.svg",
1665
- "aws.iot.iot.alexa_enabled-device": "resource/iot/iot_alexa_enabled-device_48.svg",
1666
- "aws.iot.iot.alexa_skill": "resource/iot/iot_alexa_skill_48.svg",
1667
- "aws.iot.iot.alexa_voice-service": "resource/iot/iot_alexa_voice-service_48.svg",
1668
- "aws.iot.iot.certificate": "resource/iot/iot_certificate_48.svg",
1669
- "aws.iot.iot.desired-state": "resource/iot/iot_desired-state_48.svg",
1670
- "aws.iot.iot.device-gateway": "resource/iot/iot_device-gateway_48.svg",
1671
- "aws.iot.iot.echo": "resource/iot/iot_echo_48.svg",
1672
- "aws.iot.iot.fire-tv_stick": "resource/iot/iot_fire-tv_stick_48.svg",
1673
- "aws.iot.iot.fire_tv": "resource/iot/iot_fire_tv_48.svg",
1674
- "aws.iot.iot.http2-protocol": "resource/iot/iot_http2-protocol_48.svg",
1675
- "aws.iot.iot.http_protocol": "resource/iot/iot_http_protocol_48.svg",
1676
- "aws.iot.iot.lambda_function": "resource/iot/iot_lambda_function_48.svg",
1677
- "aws.iot.iot.lorawan-protocol": "resource/iot/iot_lorawan-protocol_48.svg",
1678
- "aws.iot.iot.mqtt_protocol": "resource/iot/iot_mqtt_protocol_48.svg",
1679
- "aws.iot.iot.over-air-update": "resource/iot/iot_over-air-update_48.svg",
1680
- "aws.iot.iot.policy": "resource/iot/iot_policy_48.svg",
1681
- "aws.iot.iot.reported-state": "resource/iot/iot_reported-state_48.svg",
1682
- "aws.iot.iot.sailboat": "resource/iot/iot_sailboat_48.svg",
1683
- "aws.iot.iot.sensor": "resource/iot/iot_sensor_48.svg",
1684
- "aws.iot.iot.servo": "resource/iot/iot_servo_48.svg",
1685
- "aws.iot.iot.shadow": "resource/iot/iot_shadow_48.svg",
1686
- "aws.iot.iot.simulator": "resource/iot/iot_simulator_48.svg",
1687
- "aws.iot.iot.thing_bank": "resource/iot/iot_thing_bank_48.svg",
1688
- "aws.iot.iot.thing_bicycle": "resource/iot/iot_thing_bicycle_48.svg",
1689
- "aws.iot.iot.thing_camera": "resource/iot/iot_thing_camera_48.svg",
1690
- "aws.iot.iot.thing_car": "resource/iot/iot_thing_car_48.svg",
1691
- "aws.iot.iot.thing_cart": "resource/iot/iot_thing_cart_48.svg",
1692
- "aws.iot.iot.thing_coffee-pot": "resource/iot/iot_thing_coffee-pot_48.svg",
1693
- "aws.iot.iot.thing_door-lock": "resource/iot/iot_thing_door-lock_48.svg",
1694
- "aws.iot.iot.thing_factory": "resource/iot/iot_thing_factory_48.svg",
1695
- "aws.iot.iot.thing_freertos-device": "resource/iot/iot_thing_freertos-device_48.svg",
1696
- "aws.iot.iot.thing_generic": "resource/iot/iot_thing_generic_48.svg",
1697
- "aws.iot.iot.thing_house": "resource/iot/iot_thing_house_48.svg",
1698
- "aws.iot.iot.thing_humidity-sensor": "resource/iot/iot_thing_humidity-sensor_48.svg",
1699
- "aws.iot.iot.thing_industrial-pc": "resource/iot/iot_thing_industrial-pc_48.svg",
1700
- "aws.iot.iot.thing_lightbulb": "resource/iot/iot_thing_lightbulb_48.svg",
1701
- "aws.iot.iot.thing_medical-emergency": "resource/iot/iot_thing_medical-emergency_48.svg",
1702
- "aws.iot.iot.thing_plc": "resource/iot/iot_thing_plc_48.svg",
1703
- "aws.iot.iot.thing_police-emergency": "resource/iot/iot_thing_police-emergency_48.svg",
1704
- "aws.iot.iot.thing_relay": "resource/iot/iot_thing_relay_48.svg",
1705
- "aws.iot.iot.thing_stacklight": "resource/iot/iot_thing_stacklight_48.svg",
1706
- "aws.iot.iot.thing_temperature-humidity-sensor": "resource/iot/iot_thing_temperature-humidity-sensor_48.svg",
1707
- "aws.iot.iot.thing_temperature-sensor": "resource/iot/iot_thing_temperature-sensor_48.svg",
1708
- "aws.iot.iot.thing_temperature-vibration-sensor": "resource/iot/iot_thing_temperature-vibration-sensor_48.svg",
1709
- "aws.iot.iot.thing_thermostat": "resource/iot/iot_thing_thermostat_48.svg",
1710
- "aws.iot.iot.thing_travel": "resource/iot/iot_thing_travel_48.svg",
1711
- "aws.iot.iot.thing_utility": "resource/iot/iot_thing_utility_48.svg",
1712
- "aws.iot.iot.thing_vibration-sensor": "resource/iot/iot_thing_vibration-sensor_48.svg",
1713
- "aws.iot.iot.thing_windfarm": "resource/iot/iot_thing_windfarm_48.svg",
1714
- "aws.iot.iot.topic": "resource/iot/iot_topic_48.svg",
1715
- "aws.management-governance.cloudformation.change-set": "resource/management-governance/cloudformation_change-set_48.svg",
1716
- "aws.management-governance.cloudformation.stack": "resource/management-governance/cloudformation_stack_48.svg",
1717
- "aws.management-governance.cloudformation.template": "resource/management-governance/cloudformation_template_48.svg",
1718
- "aws.management-governance.cloudtrail.cloudtrail-lake": "resource/management-governance/cloudtrail_cloudtrail-lake_48.svg",
1719
- "aws.management-governance.cloudwatch.alarm": "resource/management-governance/cloudwatch_alarm_48.svg",
1720
- "aws.management-governance.cloudwatch.cross-account-observability": "resource/management-governance/cloudwatch_cross-account-observability_48.svg",
1721
- "aws.management-governance.cloudwatch.data-protection": "resource/management-governance/cloudwatch_data-protection_48.svg",
1722
- "aws.management-governance.cloudwatch.event-event-based": "resource/management-governance/cloudwatch_event-event-based_48.svg",
1723
- "aws.management-governance.cloudwatch.event-time-based": "resource/management-governance/cloudwatch_event-time-based_48.svg",
1724
- "aws.management-governance.cloudwatch.evidently": "resource/management-governance/cloudwatch_evidently_48.svg",
1725
- "aws.management-governance.cloudwatch.logs": "resource/management-governance/cloudwatch_logs_48.svg",
1726
- "aws.management-governance.cloudwatch.metrics-insights": "resource/management-governance/cloudwatch_metrics-insights_48.svg",
1727
- "aws.management-governance.cloudwatch.rule": "resource/management-governance/cloudwatch_rule_48.svg",
1728
- "aws.management-governance.cloudwatch.rum": "resource/management-governance/cloudwatch_rum_48.svg",
1729
- "aws.management-governance.cloudwatch.synthetics": "resource/management-governance/cloudwatch_synthetics_48.svg",
1730
- "aws.management-governance.license-manager.application-discovery": "resource/management-governance/license-manager_application-discovery_48.svg",
1731
- "aws.management-governance.license-manager.license-blending": "resource/management-governance/license-manager_license-blending_48.svg",
1732
- "aws.management-governance.organizations.account": "resource/management-governance/organizations_account_48.svg",
1733
- "aws.management-governance.organizations.management-account": "resource/management-governance/organizations_management-account_48.svg",
1734
- "aws.management-governance.organizations.organizational-unit": "resource/management-governance/organizations_organizational-unit_48.svg",
1735
- "aws.management-governance.systems-manager.application-manager": "resource/management-governance/systems-manager_application-manager_48.svg",
1736
- "aws.management-governance.systems-manager.automation": "resource/management-governance/systems-manager_automation_48.svg",
1737
- "aws.management-governance.systems-manager.change-calendar": "resource/management-governance/systems-manager_change-calendar_48.svg",
1738
- "aws.management-governance.systems-manager.change-manager": "resource/management-governance/systems-manager_change-manager_48.svg",
1739
- "aws.management-governance.systems-manager.compliance": "resource/management-governance/systems-manager_compliance_48.svg",
1740
- "aws.management-governance.systems-manager.distributor": "resource/management-governance/systems-manager_distributor_48.svg",
1741
- "aws.management-governance.systems-manager.documents": "resource/management-governance/systems-manager_documents_48.svg",
1742
- "aws.management-governance.systems-manager.incident-manager": "resource/management-governance/systems-manager_incident-manager_48.svg",
1743
- "aws.management-governance.systems-manager.inventory": "resource/management-governance/systems-manager_inventory_48.svg",
1744
- "aws.management-governance.systems-manager.maintenance-windows": "resource/management-governance/systems-manager_maintenance-windows_48.svg",
1745
- "aws.management-governance.systems-manager.opscenter": "resource/management-governance/systems-manager_opscenter_48.svg",
1746
- "aws.management-governance.systems-manager.parameter-store": "resource/management-governance/systems-manager_parameter-store_48.svg",
1747
- "aws.management-governance.systems-manager.patch-manager": "resource/management-governance/systems-manager_patch-manager_48.svg",
1748
- "aws.management-governance.systems-manager.run-command": "resource/management-governance/systems-manager_run-command_48.svg",
1749
- "aws.management-governance.systems-manager.session-manager": "resource/management-governance/systems-manager_session-manager_48.svg",
1750
- "aws.management-governance.systems-manager.state-manager": "resource/management-governance/systems-manager_state-manager_48.svg",
1751
- "aws.management-governance.trusted-advisor.checklist-cost": "resource/management-governance/trusted-advisor_checklist-cost_48.svg",
1752
- "aws.management-governance.trusted-advisor.checklist-fault-tolerant": "resource/management-governance/trusted-advisor_checklist-fault-tolerant_48.svg",
1753
- "aws.management-governance.trusted-advisor.checklist-performance": "resource/management-governance/trusted-advisor_checklist-performance_48.svg",
1754
- "aws.management-governance.trusted-advisor.checklist-security": "resource/management-governance/trusted-advisor_checklist-security_48.svg",
1755
- "aws.management-governance.trusted-advisor.checklist": "resource/management-governance/trusted-advisor_checklist_48.svg",
1756
- "aws.media-services.cloud-digital-interface.cloud-digital-interface": "resource/media-services/cloud-digital-interface_48.svg",
1757
- "aws.media-services.elemental-mediaconnect.mediaconnect-gateway": "resource/media-services/elemental-mediaconnect_mediaconnect-gateway_48.svg",
1758
- "aws.migration-modernization.application-discovery-service.aws-agentless-collector": "resource/migration-modernization/application-discovery-service_aws-agentless-collector_48.svg",
1759
- "aws.migration-modernization.application-discovery-service.aws-discovery-agent": "resource/migration-modernization/application-discovery-service_aws-discovery-agent_48.svg",
1760
- "aws.migration-modernization.application-discovery-service.migration-evaluator-collector": "resource/migration-modernization/application-discovery-service_migration-evaluator-collector_48.svg",
1761
- "aws.migration-modernization.datasync.agent": "resource/migration-modernization/datasync_agent_48.svg",
1762
- "aws.migration-modernization.datasync.discovery": "resource/migration-modernization/datasync_discovery_48.svg",
1763
- "aws.migration-modernization.mainframe-modernization.analyzer": "resource/migration-modernization/mainframe-modernization_analyzer_48.svg",
1764
- "aws.migration-modernization.mainframe-modernization.compiler": "resource/migration-modernization/mainframe-modernization_compiler_48.svg",
1765
- "aws.migration-modernization.mainframe-modernization.converter": "resource/migration-modernization/mainframe-modernization_converter_48.svg",
1766
- "aws.migration-modernization.mainframe-modernization.developer": "resource/migration-modernization/mainframe-modernization_developer_48.svg",
1767
- "aws.migration-modernization.mainframe-modernization.runtime": "resource/migration-modernization/mainframe-modernization_runtime_48.svg",
1768
- "aws.migration-modernization.migration-hub.refactor-spaces-applications": "resource/migration-modernization/migration-hub_refactor-spaces-applications_48.svg",
1769
- "aws.migration-modernization.migration-hub.refactor-spaces-environments": "resource/migration-modernization/migration-hub_refactor-spaces-environments_48.svg",
1770
- "aws.migration-modernization.migration-hub.refactor-spaces-services": "resource/migration-modernization/migration-hub_refactor-spaces-services_48.svg",
1771
- "aws.migration-modernization.transfer-family.aws-as2": "resource/migration-modernization/transfer-family_aws-as2_48.svg",
1772
- "aws.migration-modernization.transfer-family.aws-ftp": "resource/migration-modernization/transfer-family_aws-ftp_48.svg",
1773
- "aws.migration-modernization.transfer-family.aws-ftps": "resource/migration-modernization/transfer-family_aws-ftps_48.svg",
1774
- "aws.migration-modernization.transfer-family.aws-sftp": "resource/migration-modernization/transfer-family_aws-sftp_48.svg",
1775
- "aws.networking-content-delivery.api-gateway.endpoint": "resource/networking-content-delivery/api-gateway_endpoint_48.svg",
1776
- "aws.networking-content-delivery.app-mesh.mesh": "resource/networking-content-delivery/app-mesh_mesh_48.svg",
1777
- "aws.networking-content-delivery.app-mesh.virtual-gateway": "resource/networking-content-delivery/app-mesh_virtual-gateway_48.svg",
1778
- "aws.networking-content-delivery.app-mesh.virtual-node": "resource/networking-content-delivery/app-mesh_virtual-node_48.svg",
1779
- "aws.networking-content-delivery.app-mesh.virtual-router": "resource/networking-content-delivery/app-mesh_virtual-router_48.svg",
1780
- "aws.networking-content-delivery.app-mesh.virtual-service": "resource/networking-content-delivery/app-mesh_virtual-service_48.svg",
1781
- "aws.networking-content-delivery.cloud-map.namespace": "resource/networking-content-delivery/cloud-map_namespace_48.svg",
1782
- "aws.networking-content-delivery.cloud-map.resource": "resource/networking-content-delivery/cloud-map_resource_48.svg",
1783
- "aws.networking-content-delivery.cloud-map.service": "resource/networking-content-delivery/cloud-map_service_48.svg",
1784
- "aws.networking-content-delivery.cloud-wan.core-network-edge": "resource/networking-content-delivery/cloud-wan_core-network-edge_48.svg",
1785
- "aws.networking-content-delivery.cloud-wan.segment-network": "resource/networking-content-delivery/cloud-wan_segment-network_48.svg",
1786
- "aws.networking-content-delivery.cloud-wan.transit-gateway-route-table-attachment": "resource/networking-content-delivery/cloud-wan_transit-gateway-route-table-attachment_48.svg",
1787
- "aws.networking-content-delivery.cloudfront.download-distribution": "resource/networking-content-delivery/cloudfront_download-distribution_48.svg",
1788
- "aws.networking-content-delivery.cloudfront.edge-location": "resource/networking-content-delivery/cloudfront_edge-location_48.svg",
1789
- "aws.networking-content-delivery.cloudfront.functions": "resource/networking-content-delivery/cloudfront_functions_48.svg",
1790
- "aws.networking-content-delivery.cloudfront.streaming-distribution": "resource/networking-content-delivery/cloudfront_streaming-distribution_48.svg",
1791
- "aws.networking-content-delivery.direct-connect.gateway": "resource/networking-content-delivery/direct-connect_gateway_48.svg",
1792
- "aws.networking-content-delivery.elastic-load-balancing.application-load-balancer": "resource/networking-content-delivery/elastic-load-balancing_application-load-balancer_48.svg",
1793
- "aws.networking-content-delivery.elastic-load-balancing.classic-load-balancer": "resource/networking-content-delivery/elastic-load-balancing_classic-load-balancer_48.svg",
1794
- "aws.networking-content-delivery.elastic-load-balancing.gateway-load-balancer": "resource/networking-content-delivery/elastic-load-balancing_gateway-load-balancer_48.svg",
1795
- "aws.networking-content-delivery.elastic-load-balancing.network-load-balancer": "resource/networking-content-delivery/elastic-load-balancing_network-load-balancer_48.svg",
1796
- "aws.networking-content-delivery.route-53-hosted-zone.route-53-hosted-zone": "resource/networking-content-delivery/route-53-hosted-zone_48.svg",
1797
- "aws.networking-content-delivery.route-53.readiness-checks": "resource/networking-content-delivery/route-53_readiness-checks_48.svg",
1798
- "aws.networking-content-delivery.route-53.resolver-dns-firewall": "resource/networking-content-delivery/route-53_resolver-dns-firewall_48.svg",
1799
- "aws.networking-content-delivery.route-53.resolver-query-logging": "resource/networking-content-delivery/route-53_resolver-query-logging_48.svg",
1800
- "aws.networking-content-delivery.route-53.resolver": "resource/networking-content-delivery/route-53_resolver_48.svg",
1801
- "aws.networking-content-delivery.route-53.route-table": "resource/networking-content-delivery/route-53_route-table_48.svg",
1802
- "aws.networking-content-delivery.route-53.routing-controls": "resource/networking-content-delivery/route-53_routing-controls_48.svg",
1803
- "aws.networking-content-delivery.transit-gateway.attachment": "resource/networking-content-delivery/transit-gateway_attachment_48.svg",
1804
- "aws.networking-content-delivery.vpc.carrier-gateway": "resource/networking-content-delivery/vpc_carrier-gateway_48.svg",
1805
- "aws.networking-content-delivery.vpc.customer-gateway": "resource/networking-content-delivery/vpc_customer-gateway_48.svg",
1806
- "aws.networking-content-delivery.vpc.elastic-network-adapter": "resource/networking-content-delivery/vpc_elastic-network-adapter_48.svg",
1807
- "aws.networking-content-delivery.vpc.elastic-network-interface": "resource/networking-content-delivery/vpc_elastic-network-interface_48.svg",
1808
- "aws.networking-content-delivery.vpc.endpoints": "resource/networking-content-delivery/vpc_endpoints_48.svg",
1809
- "aws.networking-content-delivery.vpc.flow-logs": "resource/networking-content-delivery/vpc_flow-logs_48.svg",
1810
- "aws.networking-content-delivery.vpc.internet-gateway": "resource/networking-content-delivery/vpc_internet-gateway_48.svg",
1811
- "aws.networking-content-delivery.vpc.nat-gateway": "resource/networking-content-delivery/vpc_nat-gateway_48.svg",
1812
- "aws.networking-content-delivery.vpc.network-access-analyzer": "resource/networking-content-delivery/vpc_network-access-analyzer_48.svg",
1813
- "aws.networking-content-delivery.vpc.network-access-control-list": "resource/networking-content-delivery/vpc_network-access-control-list_48.svg",
1814
- "aws.networking-content-delivery.vpc.peering-connection": "resource/networking-content-delivery/vpc_peering-connection_48.svg",
1815
- "aws.networking-content-delivery.vpc.reachability-analyzer": "resource/networking-content-delivery/vpc_reachability-analyzer_48.svg",
1816
- "aws.networking-content-delivery.vpc.router": "resource/networking-content-delivery/vpc_router_48.svg",
1817
- "aws.networking-content-delivery.vpc.traffic-mirroring": "resource/networking-content-delivery/vpc_traffic-mirroring_48.svg",
1818
- "aws.networking-content-delivery.vpc.virtual-private-cloud-vpc": "resource/networking-content-delivery/vpc_virtual-private-cloud-vpc_48.svg",
1819
- "aws.networking-content-delivery.vpc.vpn-connection": "resource/networking-content-delivery/vpc_vpn-connection_48.svg",
1820
- "aws.networking-content-delivery.vpc.vpn-gateway": "resource/networking-content-delivery/vpc_vpn-gateway_48.svg",
1821
- "aws.quantum-technologies.braket.chandelier": "resource/quantum-technologies/braket_chandelier_48.svg",
1822
- "aws.quantum-technologies.braket.chip": "resource/quantum-technologies/braket_chip_48.svg",
1823
- "aws.quantum-technologies.braket.embedded-simulator": "resource/quantum-technologies/braket_embedded-simulator_48.svg",
1824
- "aws.quantum-technologies.braket.managed-simulator": "resource/quantum-technologies/braket_managed-simulator_48.svg",
1825
- "aws.quantum-technologies.braket.noise-simulator": "resource/quantum-technologies/braket_noise-simulator_48.svg",
1826
- "aws.quantum-technologies.braket.qpu": "resource/quantum-technologies/braket_qpu_48.svg",
1827
- "aws.quantum-technologies.braket.simulator-1": "resource/quantum-technologies/braket_simulator-1_48.svg",
1828
- "aws.quantum-technologies.braket.simulator-2": "resource/quantum-technologies/braket_simulator-2_48.svg",
1829
- "aws.quantum-technologies.braket.simulator-3": "resource/quantum-technologies/braket_simulator-3_48.svg",
1830
- "aws.quantum-technologies.braket.simulator-4": "resource/quantum-technologies/braket_simulator-4_48.svg",
1831
- "aws.quantum-technologies.braket.simulator": "resource/quantum-technologies/braket_simulator_48.svg",
1832
- "aws.quantum-technologies.braket.state-vector": "resource/quantum-technologies/braket_state-vector_48.svg",
1833
- "aws.quantum-technologies.braket.tensor-network": "resource/quantum-technologies/braket_tensor-network_48.svg",
1834
- "aws.security-identity.certificate-manager.certificate-authority": "resource/security-identity/certificate-manager_certificate-authority_48.svg",
1835
- "aws.security-identity.directory-service.ad-connector": "resource/security-identity/directory-service_ad-connector_48.svg",
1836
- "aws.security-identity.directory-service.aws-managed-microsoft-ad": "resource/security-identity/directory-service_aws-managed-microsoft-ad_48.svg",
1837
- "aws.security-identity.directory-service.simple-ad": "resource/security-identity/directory-service_simple-ad_48.svg",
1838
- "aws.security-identity.identity-access-management.add-on": "resource/security-identity/identity-access-management_add-on_48.svg",
1839
- "aws.security-identity.identity-access-management.aws-sts-alternate": "resource/security-identity/identity-access-management_aws-sts-alternate_48.svg",
1840
- "aws.security-identity.identity-access-management.aws-sts": "resource/security-identity/identity-access-management_aws-sts_48.svg",
1841
- "aws.security-identity.identity-access-management.data-encryption-key": "resource/security-identity/identity-access-management_data-encryption-key_48.svg",
1842
- "aws.security-identity.identity-access-management.encrypted-data": "resource/security-identity/identity-access-management_encrypted-data_48.svg",
1843
- "aws.security-identity.identity-access-management.iam-access-analyzer": "resource/security-identity/identity-access-management_iam-access-analyzer_48.svg",
1844
- "aws.security-identity.identity-access-management.iam-roles-anywhere": "resource/security-identity/identity-access-management_iam-roles-anywhere_48.svg",
1845
- "aws.security-identity.identity-access-management.long-term-security-credential": "resource/security-identity/identity-access-management_long-term-security-credential_48.svg",
1846
- "aws.security-identity.identity-access-management.mfa-token": "resource/security-identity/identity-access-management_mfa-token_48.svg",
1847
- "aws.security-identity.identity-access-management.permissions": "resource/security-identity/identity-access-management_permissions_48.svg",
1848
- "aws.security-identity.identity-access-management.role": "resource/security-identity/identity-access-management_role_48.svg",
1849
- "aws.security-identity.identity-access-management.temporary-security-credential": "resource/security-identity/identity-access-management_temporary-security-credential_48.svg",
1850
- "aws.security-identity.inspector.agent": "resource/security-identity/inspector_agent_48.svg",
1851
- "aws.security-identity.key-management-service.external-key-store": "resource/security-identity/key-management-service_external-key-store_48.svg",
1852
- "aws.security-identity.network-firewall.endpoints": "resource/security-identity/network-firewall_endpoints_48.svg",
1853
- "aws.security-identity.security-hub.finding": "resource/security-identity/security-hub_finding_48.svg",
1854
- "aws.security-identity.shield.aws-shield-advanced": "resource/security-identity/shield_aws-shield-advanced_48.svg",
1855
- "aws.security-identity.waf.bad-bot": "resource/security-identity/waf_bad-bot_48.svg",
1856
- "aws.security-identity.waf.bot-control": "resource/security-identity/waf_bot-control_48.svg",
1857
- "aws.security-identity.waf.bot": "resource/security-identity/waf_bot_48.svg",
1858
- "aws.security-identity.waf.filtering-rule": "resource/security-identity/waf_filtering-rule_48.svg",
1859
- "aws.security-identity.waf.labels": "resource/security-identity/waf_labels_48.svg",
1860
- "aws.security-identity.waf.managed-rule": "resource/security-identity/waf_managed-rule_48.svg",
1861
- "aws.security-identity.waf.rule": "resource/security-identity/waf_rule_48.svg",
1862
- "aws.storage.backup.audit-manager": "resource/storage/backup_audit-manager_48.svg",
1863
- "aws.storage.backup.aws-backup-for-aws-cloudformation": "resource/storage/backup_aws-backup-for-aws-cloudformation_48.svg",
1864
- "aws.storage.backup.aws-backup-support-for-amazon-fsx-for-netapp-ontap": "resource/storage/backup_aws-backup-support-for-amazon-fsx-for-netapp-ontap_48.svg",
1865
- "aws.storage.backup.aws-backup-support-for-amazon-s3": "resource/storage/backup_aws-backup-support-for-amazon-s3_48.svg",
1866
- "aws.storage.backup.aws-backup-support-for-vmware-workloads": "resource/storage/backup_aws-backup-support-for-vmware-workloads_48.svg",
1867
- "aws.storage.backup.backup-plan": "resource/storage/backup_backup-plan_48.svg",
1868
- "aws.storage.backup.backup-restore": "resource/storage/backup_backup-restore_48.svg",
1869
- "aws.storage.backup.backup-vault": "resource/storage/backup_backup-vault_48.svg",
1870
- "aws.storage.backup.compliance-reporting": "resource/storage/backup_compliance-reporting_48.svg",
1871
- "aws.storage.backup.compute": "resource/storage/backup_compute_48.svg",
1872
- "aws.storage.backup.database": "resource/storage/backup_database_48.svg",
1873
- "aws.storage.backup.gateway": "resource/storage/backup_gateway_48.svg",
1874
- "aws.storage.backup.legal-hold": "resource/storage/backup_legal-hold_48.svg",
1875
- "aws.storage.backup.recovery-point-objective": "resource/storage/backup_recovery-point-objective_48.svg",
1876
- "aws.storage.backup.recovery-time-objective": "resource/storage/backup_recovery-time-objective_48.svg",
1877
- "aws.storage.backup.storage": "resource/storage/backup_storage_48.svg",
1878
- "aws.storage.backup.vault-lock": "resource/storage/backup_vault-lock_48.svg",
1879
- "aws.storage.backup.virtual-machine-monitor": "resource/storage/backup_virtual-machine-monitor_48.svg",
1880
- "aws.storage.backup.virtual-machine": "resource/storage/backup_virtual-machine_48.svg",
1881
- "aws.storage.elastic-block-store.amazon-data-lifecycle-manager": "resource/storage/elastic-block-store_amazon-data-lifecycle-manager_48.svg",
1882
- "aws.storage.elastic-block-store.multiple-volumes": "resource/storage/elastic-block-store_multiple-volumes_48.svg",
1883
- "aws.storage.elastic-block-store.snapshot": "resource/storage/elastic-block-store_snapshot_48.svg",
1884
- "aws.storage.elastic-block-store.volume-gp3": "resource/storage/elastic-block-store_volume-gp3_48.svg",
1885
- "aws.storage.elastic-block-store.volume": "resource/storage/elastic-block-store_volume_48.svg",
1886
- "aws.storage.elastic-file-system.efs-intelligent-tiering": "resource/storage/elastic-file-system_efs-intelligent-tiering_48.svg",
1887
- "aws.storage.elastic-file-system.efs-one-zone-infrequent-access": "resource/storage/elastic-file-system_efs-one-zone-infrequent-access_48.svg",
1888
- "aws.storage.elastic-file-system.efs-one-zone": "resource/storage/elastic-file-system_efs-one-zone_48.svg",
1889
- "aws.storage.elastic-file-system.efs-standard-infrequent-access": "resource/storage/elastic-file-system_efs-standard-infrequent-access_48.svg",
1890
- "aws.storage.elastic-file-system.efs-standard": "resource/storage/elastic-file-system_efs-standard_48.svg",
1891
- "aws.storage.elastic-file-system.elastic-throughput": "resource/storage/elastic-file-system_elastic-throughput_48.svg",
1892
- "aws.storage.elastic-file-system.file-system": "resource/storage/elastic-file-system_file-system_48.svg",
1893
- "aws.storage.file-cache.hybrid-nfs-linked-datasets": "resource/storage/file-cache_hybrid-nfs-linked-datasets_48.svg",
1894
- "aws.storage.file-cache.on-premises-nfs-linked-datasets": "resource/storage/file-cache_on-premises-nfs-linked-datasets_48.svg",
1895
- "aws.storage.file-cache.s3-linked-datasets": "resource/storage/file-cache_s3-linked-datasets_48.svg",
1896
- "aws.storage.simple-storage-service-glacier.archive": "resource/storage/simple-storage-service-glacier_archive_48.svg",
1897
- "aws.storage.simple-storage-service-glacier.vault": "resource/storage/simple-storage-service-glacier_vault_48.svg",
1898
- "aws.storage.simple-storage-service.bucket-with-objects": "resource/storage/simple-storage-service_bucket-with-objects_48.svg",
1899
- "aws.storage.simple-storage-service.bucket": "resource/storage/simple-storage-service_bucket_48.svg",
1900
- "aws.storage.simple-storage-service.directory-bucket": "resource/storage/simple-storage-service_directory-bucket_48.svg",
1901
- "aws.storage.simple-storage-service.general-access-points": "resource/storage/simple-storage-service_general-access-points_48.svg",
1902
- "aws.storage.simple-storage-service.object": "resource/storage/simple-storage-service_object_48.svg",
1903
- "aws.storage.simple-storage-service.s3-batch-operations": "resource/storage/simple-storage-service_s3-batch-operations_48.svg",
1904
- "aws.storage.simple-storage-service.s3-express-one-zone": "resource/storage/simple-storage-service_s3-express-one-zone_48.svg",
1905
- "aws.storage.simple-storage-service.s3-glacier-deep-archive": "resource/storage/simple-storage-service_s3-glacier-deep-archive_48.svg",
1906
- "aws.storage.simple-storage-service.s3-glacier-flexible-retrieval": "resource/storage/simple-storage-service_s3-glacier-flexible-retrieval_48.svg",
1907
- "aws.storage.simple-storage-service.s3-glacier-instant-retrieval": "resource/storage/simple-storage-service_s3-glacier-instant-retrieval_48.svg",
1908
- "aws.storage.simple-storage-service.s3-intelligent-tiering": "resource/storage/simple-storage-service_s3-intelligent-tiering_48.svg",
1909
- "aws.storage.simple-storage-service.s3-multi-region-access-points": "resource/storage/simple-storage-service_s3-multi-region-access-points_48.svg",
1910
- "aws.storage.simple-storage-service.s3-object-lambda-access-points": "resource/storage/simple-storage-service_s3-object-lambda-access-points_48.svg",
1911
- "aws.storage.simple-storage-service.s3-object-lambda": "resource/storage/simple-storage-service_s3-object-lambda_48.svg",
1912
- "aws.storage.simple-storage-service.s3-object-lock": "resource/storage/simple-storage-service_s3-object-lock_48.svg",
1913
- "aws.storage.simple-storage-service.s3-on-outposts": "resource/storage/simple-storage-service_s3-on-outposts_48.svg",
1914
- "aws.storage.simple-storage-service.s3-one-zone-ia": "resource/storage/simple-storage-service_s3-one-zone-ia_48.svg",
1915
- "aws.storage.simple-storage-service.s3-replication-time-control": "resource/storage/simple-storage-service_s3-replication-time-control_48.svg",
1916
- "aws.storage.simple-storage-service.s3-replication": "resource/storage/simple-storage-service_s3-replication_48.svg",
1917
- "aws.storage.simple-storage-service.s3-select": "resource/storage/simple-storage-service_s3-select_48.svg",
1918
- "aws.storage.simple-storage-service.s3-standard-ia": "resource/storage/simple-storage-service_s3-standard-ia_48.svg",
1919
- "aws.storage.simple-storage-service.s3-standard": "resource/storage/simple-storage-service_s3-standard_48.svg",
1920
- "aws.storage.simple-storage-service.s3-storage-lens": "resource/storage/simple-storage-service_s3-storage-lens_48.svg",
1921
- "aws.storage.simple-storage-service.s3-tables": "resource/storage/simple-storage-service_s3-tables_48.svg",
1922
- "aws.storage.simple-storage-service.s3-vectors": "resource/storage/simple-storage-service_s3-vectors_48.svg",
1923
- "aws.storage.simple-storage-service.vpc-access-points": "resource/storage/simple-storage-service_vpc-access-points_48.svg",
1924
- "aws.storage.snowball.snowball-import-export": "resource/storage/snowball_snowball-import-export_48.svg",
1925
- "aws.storage.storage-gateway.amazon-fsx-file-gateway": "resource/storage/storage-gateway_amazon-fsx-file-gateway_48.svg",
1926
- "aws.storage.storage-gateway.amazon-s3-file-gateway": "resource/storage/storage-gateway_amazon-s3-file-gateway_48.svg",
1927
- "aws.storage.storage-gateway.cached-volume": "resource/storage/storage-gateway_cached-volume_48.svg",
1928
- "aws.storage.storage-gateway.file-gateway": "resource/storage/storage-gateway_file-gateway_48.svg",
1929
- "aws.storage.storage-gateway.noncached-volume": "resource/storage/storage-gateway_noncached-volume_48.svg",
1930
- "aws.storage.storage-gateway.tape-gateway": "resource/storage/storage-gateway_tape-gateway_48.svg",
1931
- "aws.storage.storage-gateway.virtual-tape-library": "resource/storage/storage-gateway_virtual-tape-library_48.svg",
1932
- "aws.storage.storage-gateway.volume-gateway": "resource/storage/storage-gateway_volume-gateway_48.svg",
1933
- "aws.category.analytics": "category/analytics_64.svg",
1934
- "aws.category.application-integration": "category/application-integration_64.svg",
1935
- "aws.category.artificial-intelligence": "category/artificial-intelligence_64.svg",
1936
- "aws.category.blockchain": "category/blockchain_64.svg",
1937
- "aws.category.business-applications": "category/business-applications_64.svg",
1938
- "aws.category.cloud-financial-management": "category/cloud-financial-management_64.svg",
1939
- "aws.category.compute": "category/compute_64.svg",
1940
- "aws.category.containers": "category/containers_64.svg",
1941
- "aws.category.customer-enablement": "category/customer-enablement_64.svg",
1942
- "aws.category.customer-experience": "category/customer-experience_64.svg",
1943
- "aws.category.databases": "category/databases_64.svg",
1944
- "aws.category.developer-tools": "category/developer-tools_64.svg",
1945
- "aws.category.end-user-computing": "category/end-user-computing_64.svg",
1946
- "aws.category.front-end-web-mobile": "category/front-end-web-mobile_64.svg",
1947
- "aws.category.games": "category/games_64.svg",
1948
- "aws.category.internet-of-things": "category/internet-of-things_64.svg",
1949
- "aws.category.management-tools": "category/management-tools_64.svg",
1950
- "aws.category.media-services": "category/media-services_64.svg",
1951
- "aws.category.migration-modernization": "category/migration-modernization_64.svg",
1952
- "aws.category.multicloud-and-hybrid": "category/multicloud-and-hybrid_64.svg",
1953
- "aws.category.networking-content-delivery": "category/networking-content-delivery_64.svg",
1954
- "aws.category.quantum-technologies": "category/quantum-technologies_64.svg",
1955
- "aws.category.satellite": "category/satellite_64.svg",
1956
- "aws.category.security-identity": "category/security-identity_64.svg",
1957
- "aws.category.serverless": "category/serverless_64.svg",
1958
- "aws.category.storage": "category/storage_64.svg",
1959
- "aws.group.account": "group/account_32.svg",
1960
- "aws.group.auto-scaling-group": "group/auto-scaling-group_32.svg",
1961
- "aws.group.cloud-logo": "group/cloud-logo_32.svg",
1962
- "aws.group.cloud": "group/cloud_32.svg",
1963
- "aws.group.corporate-data-center": "group/corporate-data-center_32.svg",
1964
- "aws.group.ec2-instance-contents": "group/ec2-instance-contents_32.svg",
1965
- "aws.group.iot-greengrass-deployment": "group/iot-greengrass-deployment_32.svg",
1966
- "aws.group.private-subnet": "group/private-subnet_32.svg",
1967
- "aws.group.public-subnet": "group/public-subnet_32.svg",
1968
- "aws.group.region": "group/region_32.svg",
1969
- "aws.group.server-contents": "group/server-contents_32.svg",
1970
- "aws.group.spot-fleet": "group/spot-fleet_32.svg",
1971
- "aws.group.virtual-private-cloud-vpc": "group/virtual-private-cloud-vpc_32.svg"
1972
- };
1973
-
1974
- // src/node-type-resolution.ts
1975
- var nodeTypes = Object.keys(nodeTypeToIcon);
1976
- var nodeTypeSet = new Set(nodeTypes);
1977
- var nodeTypeAliases = /* @__PURE__ */ new Map();
1978
- var uniqueAliases = /* @__PURE__ */ new Map();
1979
- function normalizeLookupKey(value) {
1980
- return value.trim().toLowerCase().replace(/&/g, "and").replace(/[_\s/]+/g, "-").replace(/-?\.-?/g, ".").replace(/\.{2,}/g, ".").replace(/-{2,}/g, "-").replace(/^[-.]+|[-.]+$/g, "");
1981
- }
1982
- function isNodeType(value) {
1983
- return nodeTypeSet.has(value);
1984
- }
1985
- function registerAlias(alias, type) {
1986
- const normalizedAlias = normalizeLookupKey(alias);
1987
- if (!normalizedAlias || nodeTypeAliases.has(normalizedAlias)) {
1988
- return;
1989
- }
1990
- nodeTypeAliases.set(normalizedAlias, type);
1991
- }
1992
- function registerUniqueAlias(alias, type) {
1993
- const normalizedAlias = normalizeLookupKey(alias);
1994
- if (!normalizedAlias) {
1995
- return;
1996
- }
1997
- const existing = uniqueAliases.get(normalizedAlias);
1998
- if (existing === void 0) {
1999
- uniqueAliases.set(normalizedAlias, type);
2000
- return;
2001
- }
2002
- if (existing !== type) {
2003
- uniqueAliases.set(normalizedAlias, null);
2004
- }
2005
- }
2006
- for (const type of nodeTypes) {
2007
- const segments = type.split(".");
2008
- registerAlias(type, type);
2009
- registerAlias(type.replace(/^aws\./, ""), type);
2010
- const lastSegment = segments[segments.length - 1];
2011
- if (lastSegment) {
2012
- registerUniqueAlias(lastSegment, type);
2013
- }
2014
- if (segments.length >= 4) {
2015
- const parentAndChild = `${segments[segments.length - 2]}.${segments[segments.length - 1]}`;
2016
- registerUniqueAlias(parentAndChild, type);
2017
- }
2018
- const repeatedSegment = segments.length === 4 ? segments[2] : void 0;
2019
- if (repeatedSegment && repeatedSegment === segments[3]) {
2020
- registerAlias(segments.slice(0, 3).join("."), type);
2021
- registerUniqueAlias(repeatedSegment, type);
2022
- }
2023
- }
2024
- for (const [alias, type] of uniqueAliases) {
2025
- if (type) {
2026
- registerAlias(alias, type);
2027
- }
2028
- }
2029
- var manualAliases = {
2030
- "acm": "aws.security-identity.certificate-manager",
2031
- "api-gateway": "aws.networking-content-delivery.api-gateway",
2032
- "apigateway": "aws.networking-content-delivery.api-gateway",
2033
- "aws.general.user": "aws.general.user.user",
2034
- "aws.general.users": "aws.general.users.users",
2035
- "bucket": "aws.storage.simple-storage-service.bucket",
2036
- "cloudfront": "aws.networking-content-delivery.cloudfront",
2037
- "dynamodb": "aws.databases.dynamodb",
2038
- "iam": "aws.security-identity.identity-and-access-management",
2039
- "lambda": "aws.compute.lambda",
2040
- "oac": "aws.security-identity.identity-and-access-management",
2041
- "origin-access-control": "aws.security-identity.identity-and-access-management",
2042
- "origin-access-identity": "aws.security-identity.identity-and-access-management",
2043
- "route53": "aws.networking-content-delivery.route-53",
2044
- "route-53": "aws.networking-content-delivery.route-53",
2045
- "s3": "aws.storage.simple-storage-service",
2046
- "s3-bucket": "aws.storage.simple-storage-service.bucket",
2047
- "user": "aws.general.user.user",
2048
- "users": "aws.general.users.users",
2049
- "waf": "aws.security-identity.waf"
2050
- };
2051
- for (const [alias, type] of Object.entries(manualAliases)) {
2052
- registerAlias(alias, type);
2053
- }
2054
- function resolveRepeatedSuffix(normalizedValue) {
2055
- const segments = normalizedValue.split(".").filter(Boolean);
2056
- if (segments.length < 3) {
2057
- return void 0;
2058
- }
2059
- const repeated = `${segments.join(".")}.${segments[segments.length - 1]}`;
2060
- return isNodeType(repeated) ? repeated : void 0;
2061
- }
2062
- function resolveNodeType(value) {
2063
- if (isNodeType(value)) {
2064
- return value;
2065
- }
2066
- const normalizedValue = normalizeLookupKey(value);
2067
- if (!normalizedValue) {
2068
- return void 0;
2069
- }
2070
- if (isNodeType(normalizedValue)) {
2071
- return normalizedValue;
2072
- }
2073
- const directMatch = nodeTypeAliases.get(normalizedValue);
2074
- if (directMatch) {
2075
- return directMatch;
2076
- }
2077
- const repeatedMatch = resolveRepeatedSuffix(normalizedValue);
2078
- if (repeatedMatch) {
2079
- return repeatedMatch;
2080
- }
2081
- const awsPrefixedValue = normalizedValue.startsWith("aws.") ? normalizedValue : `aws.${normalizedValue}`;
2082
- if (isNodeType(awsPrefixedValue)) {
2083
- return awsPrefixedValue;
2084
- }
2085
- return nodeTypeAliases.get(awsPrefixedValue) ?? resolveRepeatedSuffix(awsPrefixedValue);
2086
- }
2087
- function normalizeNodeTypeInput(value) {
2088
- return resolveNodeType(value) ?? normalizeLookupKey(value);
2089
- }
2090
-
2091
- // src/icons.ts
2092
- var moduleDir = fileURLToPath(new URL(".", import.meta.url));
2093
- var iconDirectoryCandidates = [
2094
- resolve(moduleDir, "icons"),
2095
- resolve(moduleDir, "icons", "icons"),
2096
- resolve(moduleDir, "..", "icons")
2097
- ];
2098
- function resolveIconsDirectory() {
2099
- for (const candidate of iconDirectoryCandidates) {
2100
- if (existsSync(candidate)) {
2101
- return candidate;
2102
- }
2103
- }
2104
- return iconDirectoryCandidates[0];
2105
- }
2106
- var iconsDir = resolveIconsDirectory();
2107
- var iconCache = /* @__PURE__ */ new Map();
2108
- var fallbackIconSvg = [
2109
- '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64" role="img" aria-label="fallback icon">',
2110
- '<rect x="8" y="8" width="48" height="48" rx="10" fill="#f3f4f6" stroke="#6b7280" stroke-width="2"/>',
2111
- '<path d="M20 24h24M20 32h24M20 40h16" stroke="#6b7280" stroke-width="2.5" stroke-linecap="round"/>',
2112
- "</svg>"
2113
- ].join("");
2114
- function getIconPath(type) {
2115
- const resolvedType = resolveNodeType(type);
2116
- if (!resolvedType) {
2117
- return void 0;
2118
- }
2119
- return resolve(iconsDir, nodeTypeToIcon[resolvedType]);
2120
- }
2121
- function getIcon(type) {
2122
- const iconPath = getIconPath(type);
2123
- if (!iconPath) {
2124
- return fallbackIconSvg;
2125
- }
2126
- const cached = iconCache.get(iconPath);
2127
- if (cached) {
2128
- return cached;
2129
- }
2130
- try {
2131
- const svg = readFileSync(iconPath, "utf8");
2132
- iconCache.set(iconPath, svg);
2133
- return svg;
2134
- } catch {
2135
- return fallbackIconSvg;
2136
- }
2137
- }
2138
-
2139
- // src/renderer.ts
2140
- var ICON_SIZE2 = 64;
2141
- var LABEL_GAP = 16;
2142
- var LABEL_HEIGHT = 18;
2143
- var TITLE_HEIGHT = 30;
2144
- var TITLE_MARGIN = 16;
2145
- var GROUP_PADDING_X = 24;
2146
- var GROUP_PADDING_Y = 20;
2147
- var GROUP_TITLE_BAND = 32;
2148
- var EDGE_LABEL_FONT_SIZE = 11;
2149
- var EDGE_LABEL_OFFSET = 12;
2150
- var MARKER_WIDTH = 7;
2151
- var MARKER_HEIGHT = 5;
2152
- var MARKER_REF_END = 6.2;
2153
- var MARKER_REF_START = 0.8;
2154
- var defaultGroupStyle = {
2155
- fill: "#f8fafc",
2156
- stroke: "#94a3b8",
2157
- text: "#0f172a"
2158
- };
2159
- var groupStyleMap = {
2160
- account: { fill: "#f8fafc", stroke: "#64748b", text: "#0f172a" },
2161
- "auto-scaling-group": { fill: "#eef2ff", stroke: "#6366f1", text: "#312e81" },
2162
- cloud: { fill: "#eff6ff", stroke: "#3b82f6", text: "#1d4ed8" },
2163
- "cloud-logo": { fill: "#eff6ff", stroke: "#2563eb", text: "#1d4ed8" },
2164
- "corporate-data-center": { fill: "#f1f5f9", stroke: "#475569", text: "#1e293b" },
2165
- "ec2-instance-contents": { fill: "#f8fafc", stroke: "#7c3aed", text: "#4c1d95" },
2166
- "iot-greengrass-deployment": { fill: "#ecfdf5", stroke: "#059669", text: "#065f46" },
2167
- "private-subnet": { fill: "#ecfdf5", stroke: "#16a34a", text: "#166534" },
2168
- "public-subnet": { fill: "#fff7ed", stroke: "#ea580c", text: "#9a3412" },
2169
- region: { fill: "#eff6ff", stroke: "#0284c7", text: "#075985" },
2170
- "server-contents": { fill: "#f8fafc", stroke: "#334155", text: "#0f172a" },
2171
- "spot-fleet": { fill: "#fefce8", stroke: "#ca8a04", text: "#854d0e" },
2172
- vpc: { fill: "#eff6ff", stroke: "#2563eb", text: "#1d4ed8" },
2173
- custom: defaultGroupStyle
2174
- };
2175
- function escapeXml(value) {
2176
- return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
2177
- }
2178
- function nodeLabelBounds(x, y) {
2179
- return {
2180
- x,
2181
- y,
2182
- width: ICON_SIZE2,
2183
- height: ICON_SIZE2 + LABEL_GAP + LABEL_HEIGHT
2184
- };
2185
- }
2186
- function nodeIconBounds(x, y) {
2187
- return {
2188
- x,
2189
- y,
2190
- width: ICON_SIZE2,
2191
- height: ICON_SIZE2
2192
- };
2193
- }
2194
- function mergeBounds(boundsList) {
2195
- const minX = Math.min(...boundsList.map((bounds) => bounds.x));
2196
- const minY = Math.min(...boundsList.map((bounds) => bounds.y));
2197
- const maxX = Math.max(...boundsList.map((bounds) => bounds.x + bounds.width));
2198
- const maxY = Math.max(...boundsList.map((bounds) => bounds.y + bounds.height));
2199
- return {
2200
- x: minX,
2201
- y: minY,
2202
- width: maxX - minX,
2203
- height: maxY - minY
2204
- };
2205
- }
2206
- function expandBounds(bounds, left, top, right, bottom) {
2207
- return {
2208
- x: bounds.x - left,
2209
- y: bounds.y - top,
2210
- width: bounds.width + left + right,
2211
- height: bounds.height + top + bottom
2212
- };
2213
- }
2214
- function extractIconSvg(markup) {
2215
- const cleaned = markup.replace(/<\?xml[\s\S]*?\?>/gi, "").replace(/<!DOCTYPE[\s\S]*?>/gi, "").trim();
2216
- const match = cleaned.match(/<svg\b([^>]*)>([\s\S]*?)<\/svg>/i);
2217
- if (!match) {
2218
- return { viewBox: "0 0 64 64", body: cleaned };
2219
- }
2220
- const attrs = match[1] ?? "";
2221
- const body = match[2] ?? "";
2222
- const viewBox = attrs.match(/viewBox\s*=\s*['\"]([^'\"]+)['\"]/i)?.[1];
2223
- const width = attrs.match(/width\s*=\s*['\"]([^'\"]+)['\"]/i)?.[1];
2224
- const height = attrs.match(/height\s*=\s*['\"]([^'\"]+)['\"]/i)?.[1];
2225
- if (viewBox) {
2226
- return { viewBox, body };
2227
- }
2228
- const numericWidth = width ? Number.parseFloat(width) : Number.NaN;
2229
- const numericHeight = height ? Number.parseFloat(height) : Number.NaN;
2230
- if (Number.isFinite(numericWidth) && Number.isFinite(numericHeight)) {
2231
- return { viewBox: `0 0 ${numericWidth} ${numericHeight}`, body };
2232
- }
2233
- return { viewBox: "0 0 64 64", body };
2234
- }
2235
- function groupVisualStyle(group) {
2236
- if (group.style === "custom") {
2237
- return {
2238
- fill: group.color ?? defaultGroupStyle.fill,
2239
- stroke: group.borderColor ?? defaultGroupStyle.stroke,
2240
- text: defaultGroupStyle.text
2241
- };
2242
- }
2243
- return groupStyleMap[group.style ?? "custom"] ?? defaultGroupStyle;
2244
- }
2245
- function getNodeCenter(bounds) {
2246
- return {
2247
- x: bounds.x + bounds.width / 2,
2248
- y: bounds.y + ICON_SIZE2 / 2
2249
- };
2250
- }
2251
- function dedupePoints(points) {
2252
- const deduped = [];
2253
- for (const point of points) {
2254
- const previous = deduped[deduped.length - 1];
2255
- if (!previous || previous.x !== point.x || previous.y !== point.y) {
2256
- deduped.push(point);
2257
- }
2258
- }
2259
- return deduped;
2260
- }
2261
- function pathData(points) {
2262
- return points.map((point, index) => `${index === 0 ? "M" : "L"} ${point.x} ${point.y}`).join(" ");
2263
- }
2264
- function routeLabelPoint(points) {
2265
- let selectedMidpoint = points[0] ?? { x: 0, y: 0 };
2266
- let longestSegment = -1;
2267
- for (let index = 0; index < points.length - 1; index += 1) {
2268
- const current = points[index];
2269
- const next = points[index + 1];
2270
- if (!current || !next) {
2271
- continue;
2272
- }
2273
- const segmentLength = Math.abs(next.x - current.x) + Math.abs(next.y - current.y);
2274
- if (segmentLength > longestSegment) {
2275
- longestSegment = segmentLength;
2276
- selectedMidpoint = {
2277
- x: (current.x + next.x) / 2,
2278
- y: (current.y + next.y) / 2
2279
- };
2280
- }
2281
- }
2282
- return {
2283
- x: selectedMidpoint.x,
2284
- y: selectedMidpoint.y - EDGE_LABEL_OFFSET
2285
- };
2286
- }
2287
- function routeOrthogonalEdge(source, target, edgeIndex) {
2288
- const sourceCenter = getNodeCenter(source);
2289
- const targetCenter = getNodeCenter(target);
2290
- const dx = targetCenter.x - sourceCenter.x;
2291
- const dy = targetCenter.y - sourceCenter.y;
2292
- const laneOffset = (edgeIndex % 3 - 1) * 12;
2293
- const preferHorizontal = Math.abs(dx) >= Math.abs(dy);
2294
- if (preferHorizontal) {
2295
- const start2 = {
2296
- x: dx >= 0 ? source.x + source.width : source.x,
2297
- y: sourceCenter.y
2298
- };
2299
- const end2 = {
2300
- x: dx >= 0 ? target.x : target.x + target.width,
2301
- y: targetCenter.y
2302
- };
2303
- const midX = Math.round((start2.x + end2.x) / 2 + laneOffset);
2304
- const points2 = dedupePoints([
2305
- start2,
2306
- { x: midX, y: start2.y },
2307
- { x: midX, y: end2.y },
2308
- end2
2309
- ]);
2310
- return {
2311
- labelPoint: routeLabelPoint(points2),
2312
- points: points2
2313
- };
2314
- }
2315
- const start = {
2316
- x: sourceCenter.x,
2317
- y: dy >= 0 ? source.y + source.height : source.y
2318
- };
2319
- const end = {
2320
- x: targetCenter.x,
2321
- y: dy >= 0 ? target.y : target.y + target.height
2322
- };
2323
- const midY = Math.round((start.y + end.y) / 2 + laneOffset);
2324
- const points = dedupePoints([
2325
- start,
2326
- { x: start.x, y: midY },
2327
- { x: end.x, y: midY },
2328
- end
2329
- ]);
2330
- return {
2331
- labelPoint: routeLabelPoint(points),
2332
- points
2333
- };
2334
- }
2335
- function buildGroupBounds(diagram) {
2336
- const groups = diagram.groups ?? [];
2337
- const groupById = new Map(groups.map((group) => [group.id, group]));
2338
- const nodeBounds = new Map(diagram.nodes.map((node) => [node.id, nodeLabelBounds(node.position.x, node.position.y)]));
2339
- const cache = /* @__PURE__ */ new Map();
2340
- function compute(groupId, depth) {
2341
- const existing = cache.get(groupId);
2342
- if (existing) {
2343
- return existing;
2344
- }
2345
- const group = groupById.get(groupId);
2346
- if (!group) {
2347
- throw new Error(`Unknown group "${groupId}"`);
2348
- }
2349
- const childBounds = [];
2350
- for (const childId of group.children) {
2351
- const node = nodeBounds.get(childId);
2352
- if (node) {
2353
- childBounds.push(node);
2354
- continue;
2355
- }
2356
- if (groupById.has(childId)) {
2357
- childBounds.push(compute(childId, depth + 1));
2358
- }
2359
- }
2360
- const merged = childBounds.length > 0 ? mergeBounds(childBounds) : { x: 0, y: 0, width: ICON_SIZE2 + GROUP_PADDING_X * 2, height: ICON_SIZE2 + GROUP_PADDING_Y * 2 };
2361
- const expanded = expandBounds(merged, GROUP_PADDING_X, GROUP_TITLE_BAND, GROUP_PADDING_X, GROUP_PADDING_Y);
2362
- const result = { ...expanded, id: groupId, depth };
2363
- cache.set(groupId, result);
2364
- return result;
2365
- }
2366
- const roots = new Set(groups.map((group) => group.id));
2367
- for (const group of groups) {
2368
- for (const childId of group.children) {
2369
- if (groupById.has(childId)) {
2370
- roots.delete(childId);
2371
- }
2372
- }
2373
- }
2374
- for (const rootId of [...roots].sort()) {
2375
- compute(rootId, 0);
2376
- }
2377
- return [...cache.values()].sort((left, right) => left.depth - right.depth || left.id.localeCompare(right.id));
2378
- }
2379
- function diagramBounds(diagram, groups) {
2380
- const nodeBounds = diagram.nodes.map((node) => nodeLabelBounds(node.position.x, node.position.y));
2381
- const allBounds = [...nodeBounds, ...groups];
2382
- if (allBounds.length === 0) {
2383
- return { x: 0, y: 0, width: 320, height: 180 };
2384
- }
2385
- return mergeBounds(allBounds);
2386
- }
2387
- function renderGroup(group, bounds, offset) {
2388
- const style = groupVisualStyle(group);
2389
- const x = bounds.x + offset.x;
2390
- const y = bounds.y + offset.y;
2391
- return [
2392
- `<g class="group" data-group-id="${escapeXml(group.id)}">`,
2393
- `<rect x="${x}" y="${y}" width="${bounds.width}" height="${bounds.height}" rx="18" fill="${style.fill}" fill-opacity="0.42" stroke="${style.stroke}" stroke-width="2" stroke-dasharray="${group.style === "custom" ? "6 4" : "none"}"/>`,
2394
- `<text x="${x + GROUP_PADDING_X}" y="${y + 22}" font-family="ui-sans-serif, system-ui, sans-serif" font-size="14" font-weight="700" fill="${style.text}">${escapeXml(group.label)}</text>`,
2395
- `</g>`
2396
- ].join("");
2397
- }
2398
- function renderEdge(diagram, edgeIndex, offset) {
2399
- const edge = diagram.edges[edgeIndex];
2400
- if (!edge) {
2401
- return "";
2402
- }
2403
- const source = diagram.nodes.find((node) => node.id === edge.from);
2404
- const target = diagram.nodes.find((node) => node.id === edge.to);
2405
- if (!source || !target) {
2406
- return "";
2407
- }
2408
- const sourceBounds = nodeIconBounds(source.position.x, source.position.y);
2409
- const targetBounds = nodeIconBounds(target.position.x, target.position.y);
2410
- const route = routeOrthogonalEdge(sourceBounds, targetBounds, edgeIndex);
2411
- const shiftedPoints = route.points.map((point) => ({
2412
- x: point.x + offset.x,
2413
- y: point.y + offset.y
2414
- }));
2415
- const shiftedLabelPoint = {
2416
- x: route.labelPoint.x + offset.x,
2417
- y: route.labelPoint.y + offset.y
2418
- };
2419
- const markerEnd = edge.direction !== "two-way" ? ' marker-end="url(#arrowhead)"' : ' marker-end="url(#arrowhead)" marker-start="url(#arrowhead-reverse)"';
2420
- const label = edge.label ? `<text class="edge-label" x="${shiftedLabelPoint.x}" y="${shiftedLabelPoint.y}" text-anchor="middle" font-family="ui-sans-serif, system-ui, sans-serif" font-size="${EDGE_LABEL_FONT_SIZE}" fill="#334155">${escapeXml(edge.label)}</text>` : "";
2421
- return [
2422
- `<g class="edge" data-edge-index="${edgeIndex}">`,
2423
- `<path d="${pathData(shiftedPoints)}" fill="none" stroke="#475569" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"${markerEnd}/>`,
2424
- label,
2425
- `</g>`
2426
- ].join("");
2427
- }
2428
- function renderNode(nodeId, diagram, offset) {
2429
- const node = diagram.nodes.find((candidate) => candidate.id === nodeId);
2430
- if (!node) {
2431
- return "";
2432
- }
2433
- const icon = extractIconSvg(getIcon(node.type));
2434
- const x = node.position.x + offset.x;
2435
- const y = node.position.y + offset.y;
2436
- const label = node.label ?? node.id;
2437
- return [
2438
- `<g class="node" data-node-id="${escapeXml(node.id)}">`,
2439
- `<svg x="${x}" y="${y}" width="${ICON_SIZE2}" height="${ICON_SIZE2}" viewBox="${escapeXml(icon.viewBox)}" overflow="visible" preserveAspectRatio="xMidYMid meet">${icon.body}</svg>`,
2440
- `<text x="${x + ICON_SIZE2 / 2}" y="${y + ICON_SIZE2 + LABEL_GAP}" text-anchor="middle" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12" font-weight="600" fill="#0f172a">${escapeXml(label)}</text>`,
2441
- `</g>`
2442
- ].join("");
2443
- }
2444
- function renderDiagramDocument(diagram) {
2445
- const groups = buildGroupBounds(diagram);
2446
- const contentBounds = diagramBounds(diagram, groups);
2447
- const horizontalPadding = 32;
2448
- const verticalPadding = 28;
2449
- const titleOffset = diagram.title ? TITLE_HEIGHT + TITLE_MARGIN : 0;
2450
- const offset = {
2451
- x: horizontalPadding - contentBounds.x,
2452
- y: verticalPadding - contentBounds.y + titleOffset
2453
- };
2454
- const width = Math.max(320, Math.ceil(contentBounds.width + horizontalPadding * 2));
2455
- const height = Math.max(200, Math.ceil(contentBounds.height + verticalPadding * 2 + titleOffset));
2456
- const titleMarkup = diagram.title ? `<text x="${horizontalPadding}" y="32" font-family="ui-sans-serif, system-ui, sans-serif" font-size="22" font-weight="700" fill="#0f172a">${escapeXml(diagram.title)}</text>` : "";
2457
- const groupById = new Map((diagram.groups ?? []).map((group) => [group.id, group]));
2458
- const groupMarkup = groups.map((bounds) => {
2459
- const group = groupById.get(bounds.id);
2460
- return group ? renderGroup(group, bounds, offset) : "";
2461
- }).join("");
2462
- const edgeMarkup = diagram.edges.map((_, index) => renderEdge(diagram, index, offset)).join("");
2463
- const nodeMarkup = diagram.nodes.map((node) => renderNode(node.id, diagram, offset)).join("");
2464
- const svg = [
2465
- `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}" role="img">`,
2466
- `<defs>`,
2467
- `<marker id="arrowhead" markerWidth="${MARKER_WIDTH}" markerHeight="${MARKER_HEIGHT}" refX="${MARKER_REF_END}" refY="${MARKER_HEIGHT / 2}" orient="auto" markerUnits="strokeWidth">`,
2468
- `<polygon points="0 0, ${MARKER_WIDTH} ${MARKER_HEIGHT / 2}, 0 ${MARKER_HEIGHT}" fill="#475569"/>`,
2469
- `</marker>`,
2470
- `<marker id="arrowhead-reverse" markerWidth="${MARKER_WIDTH}" markerHeight="${MARKER_HEIGHT}" refX="${MARKER_REF_START}" refY="${MARKER_HEIGHT / 2}" orient="auto-start-reverse" markerUnits="strokeWidth">`,
2471
- `<polygon points="${MARKER_WIDTH} 0, 0 ${MARKER_HEIGHT / 2}, ${MARKER_WIDTH} ${MARKER_HEIGHT}" fill="#475569"/>`,
2472
- `</marker>`,
2473
- `</defs>`,
2474
- `<rect width="100%" height="100%" fill="#ffffff"/>`,
2475
- titleMarkup,
2476
- groupMarkup,
2477
- edgeMarkup,
2478
- nodeMarkup,
2479
- `</svg>`
2480
- ].join("");
2481
- return { svg, width, height };
2482
- }
2483
-
2484
- // src/schema.ts
2485
- import { z as z2 } from "zod";
2486
- var GroupStyleSchema = z2.enum([
2487
- "account",
2488
- "auto-scaling-group",
2489
- "cloud",
2490
- "cloud-logo",
2491
- "corporate-data-center",
2492
- "ec2-instance-contents",
2493
- "iot-greengrass-deployment",
2494
- "private-subnet",
2495
- "public-subnet",
2496
- "region",
2497
- "server-contents",
2498
- "spot-fleet",
2499
- "vpc",
2500
- "custom"
2501
- ]);
2502
- var PositionSchema = z2.object({
2503
- x: z2.number(),
2504
- y: z2.number()
2505
- });
2506
- var LayoutModeSchema = z2.enum(["auto", "manual", "hybrid"]);
2507
- var LayoutDirectionSchema = z2.enum(["LEFT", "RIGHT", "UP", "DOWN"]);
2508
- var LayoutSchema = z2.object({
2509
- mode: LayoutModeSchema.optional(),
2510
- direction: LayoutDirectionSchema.optional(),
2511
- nodeSpacing: z2.number().nonnegative().optional(),
2512
- layerSpacing: z2.number().nonnegative().optional()
2513
- });
2514
- var NodeSchema = z2.object({
2515
- id: z2.string().min(1),
2516
- type: z2.preprocess(
2517
- (value) => typeof value === "string" ? normalizeNodeTypeInput(value) : value,
2518
- NodeTypeSchema
2519
- ),
2520
- label: z2.string().optional(),
2521
- description: z2.string().optional(),
2522
- position: PositionSchema.optional()
2523
- });
2524
- var EdgeSchema = z2.object({
2525
- from: z2.string().min(1),
2526
- to: z2.string().min(1),
2527
- label: z2.string().optional(),
2528
- description: z2.string().optional(),
2529
- direction: z2.enum(["one-way", "two-way"]).optional()
2530
- });
2531
- var GroupSchema = z2.object({
2532
- id: z2.string().min(1),
2533
- label: z2.string(),
2534
- /** Node IDs and/or nested group IDs contained within this group. */
2535
- children: z2.array(z2.string().min(1)),
2536
- style: GroupStyleSchema.optional(),
2537
- /** Only applies when style is "custom". */
2538
- color: z2.string().optional(),
2539
- borderColor: z2.string().optional()
2540
- });
2541
- var DiagramSchema = z2.object({
2542
- title: z2.string().optional(),
2543
- nodes: z2.array(NodeSchema),
2544
- edges: z2.array(EdgeSchema),
2545
- groups: z2.array(GroupSchema).optional(),
2546
- layout: LayoutSchema.optional()
2547
- });
2548
-
2549
- // src/validator.ts
2550
- function zodToErrors(error) {
2551
- return error.issues.map((issue) => ({
2552
- path: issue.path.join(".") || "(root)",
2553
- message: issue.message
2554
- }));
2555
- }
2556
- function semanticErrors(diagram) {
2557
- const errors = [];
2558
- const nodeIds = new Set(diagram.nodes.map((n) => n.id));
2559
- const groupIds = new Set((diagram.groups ?? []).map((g) => g.id));
2560
- const allIds = /* @__PURE__ */ new Set([...nodeIds, ...groupIds]);
2561
- const seen = /* @__PURE__ */ new Set();
2562
- for (const node of diagram.nodes) {
2563
- if (seen.has(node.id)) {
2564
- errors.push({ path: `nodes`, message: `Duplicate id "${node.id}"` });
2565
- }
2566
- seen.add(node.id);
2567
- }
2568
- for (const group of diagram.groups ?? []) {
2569
- if (seen.has(group.id)) {
2570
- errors.push({
2571
- path: `groups`,
2572
- message: `Duplicate id "${group.id}" (conflicts with a node or group id)`
2573
- });
2574
- }
2575
- seen.add(group.id);
2576
- }
2577
- diagram.edges.forEach((edge, i) => {
2578
- if (!nodeIds.has(edge.from)) {
2579
- errors.push({
2580
- path: `edges[${i}].from`,
2581
- message: `Node "${edge.from}" does not exist`
2582
- });
2583
- }
2584
- if (!nodeIds.has(edge.to)) {
2585
- errors.push({
2586
- path: `edges[${i}].to`,
2587
- message: `Node "${edge.to}" does not exist`
2588
- });
2589
- }
2590
- });
2591
- for (const group of diagram.groups ?? []) {
2592
- group.children.forEach((childId, i) => {
2593
- if (!allIds.has(childId)) {
2594
- errors.push({
2595
- path: `groups[id=${group.id}].children[${i}]`,
2596
- message: `"${childId}" does not exist as a node or group id`
2597
- });
2598
- }
2599
- });
2600
- }
2601
- const childrenOf = /* @__PURE__ */ new Map();
2602
- for (const group of diagram.groups ?? []) {
2603
- childrenOf.set(group.id, group.children.filter((c) => groupIds.has(c)));
2604
- }
2605
- function hasCycle(groupId, visited) {
2606
- if (visited.has(groupId)) return true;
2607
- visited.add(groupId);
2608
- for (const child of childrenOf.get(groupId) ?? []) {
2609
- if (hasCycle(child, new Set(visited))) return true;
2610
- }
2611
- return false;
2612
- }
2613
- for (const group of diagram.groups ?? []) {
2614
- if (hasCycle(group.id, /* @__PURE__ */ new Set())) {
2615
- errors.push({
2616
- path: `groups[id=${group.id}]`,
2617
- message: `Circular group nesting detected`
2618
- });
2619
- }
2620
- }
2621
- if (diagram.layout?.mode === "manual") {
2622
- for (const node of diagram.nodes) {
2623
- if (!node.position) {
2624
- errors.push({
2625
- path: `nodes[id=${node.id}].position`,
2626
- message: `Manual layout mode requires all nodes to define position`
2627
- });
2628
- }
2629
- }
2630
- }
2631
- return errors;
2632
- }
2633
- function orphanWarnings(diagram) {
2634
- const warnings = [];
2635
- const referenced = /* @__PURE__ */ new Set();
2636
- for (const edge of diagram.edges) {
2637
- referenced.add(edge.from);
2638
- referenced.add(edge.to);
2639
- }
2640
- for (const group of diagram.groups ?? []) {
2641
- for (const child of group.children) referenced.add(child);
2642
- }
2643
- for (const node of diagram.nodes) {
2644
- if (!referenced.has(node.id)) {
2645
- warnings.push({
2646
- path: `nodes[id=${node.id}]`,
2647
- message: `Node "${node.id}" is not referenced by any edge or group (orphan)`
2648
- });
2649
- }
2650
- }
2651
- return warnings;
2652
- }
2653
- function validate(input, options = {}) {
2654
- const { warnOrphans = true } = options;
2655
- const parsed = DiagramSchema.safeParse(input);
2656
- if (!parsed.success) {
2657
- return { valid: false, errors: zodToErrors(parsed.error) };
2658
- }
2659
- const errors = semanticErrors(parsed.data);
2660
- if (errors.length > 0) {
2661
- return { valid: false, errors };
2662
- }
2663
- const warnings = warnOrphans ? orphanWarnings(parsed.data) : [];
2664
- return { valid: true, errors: warnings };
2665
- }
2666
-
2667
- // src/index.ts
2668
- var SERVER_NAME = "stack-scribe";
2669
- var SERVER_VERSION = "0.1.0";
2670
- var DIAGRAM_SCHEMA_URI = "stack-scribe://schema/diagram";
2671
- var RENDER_RESOURCE_TEMPLATE = "stack-scribe://render/{renderId}.svg";
2672
- var RENDER_RESOURCE_PREFIX = "stack-scribe://render/";
2673
- var RENDER_ARTIFACT_MIME_TYPE = "image/svg+xml";
2674
- var MAX_RENDER_ARTIFACTS = 100;
2675
- var RENDER_ARTIFACT_TTL_MS = 1e3 * 60 * 30;
2676
- var ToolInputSchema = z3.object({
2677
- diagram: DiagramSchema
8
+ import { layoutDiagram } from "./layout.js";
9
+ import { renderDiagramDocument } from "./renderer.js";
10
+ import { DiagramSchema } from "./schema.js";
11
+ import { validate } from "./validator.js";
12
+ const SERVER_NAME = "stack-scribe";
13
+ const SERVER_VERSION = "0.1.0";
14
+ const DIAGRAM_SCHEMA_URI = "stack-scribe://schema/diagram";
15
+ const RENDER_RESOURCE_TEMPLATE = "stack-scribe://render/{renderId}.svg";
16
+ const RENDER_RESOURCE_PREFIX = "stack-scribe://render/";
17
+ const RENDER_ARTIFACT_MIME_TYPE = "image/svg+xml";
18
+ const MAX_RENDER_ARTIFACTS = 100;
19
+ const RENDER_ARTIFACT_TTL_MS = 1000 * 60 * 30;
20
+ const ToolInputSchema = z.object({
21
+ diagram: DiagramSchema,
2678
22
  });
2679
- var ValidateToolOutputSchema = z3.object({
2680
- valid: z3.boolean(),
2681
- errors: z3.array(
2682
- z3.object({
2683
- path: z3.string(),
2684
- message: z3.string()
2685
- })
2686
- )
23
+ const ValidateToolOutputSchema = z.object({
24
+ valid: z.boolean(),
25
+ errors: z.array(z.object({
26
+ path: z.string(),
27
+ message: z.string(),
28
+ })),
2687
29
  });
2688
- var RenderToolOutputSchema = z3.object({
2689
- uri: z3.string(),
2690
- mimeType: z3.literal(RENDER_ARTIFACT_MIME_TYPE),
2691
- width: z3.number().int().positive(),
2692
- height: z3.number().int().positive(),
2693
- expiresAt: z3.string()
30
+ const RenderToolOutputSchema = z.object({
31
+ uri: z.string(),
32
+ mimeType: z.literal(RENDER_ARTIFACT_MIME_TYPE),
33
+ width: z.number().int().positive(),
34
+ height: z.number().int().positive(),
35
+ expiresAt: z.string(),
2694
36
  });
2695
- var JsonValueSchema = z3.lazy(
2696
- () => z3.union([
2697
- z3.string(),
2698
- z3.number(),
2699
- z3.boolean(),
2700
- z3.null(),
2701
- z3.array(JsonValueSchema),
2702
- z3.record(JsonValueSchema)
2703
- ])
2704
- );
2705
- var SchemaToolOutputSchema = z3.object({
2706
- schema: z3.record(JsonValueSchema)
37
+ const JsonValueSchema = z.lazy(() => z.union([
38
+ z.string(),
39
+ z.number(),
40
+ z.boolean(),
41
+ z.null(),
42
+ z.array(JsonValueSchema),
43
+ z.record(JsonValueSchema),
44
+ ]));
45
+ const SchemaToolOutputSchema = z.object({
46
+ schema: z.record(JsonValueSchema),
2707
47
  });
2708
- var renderArtifactCache = /* @__PURE__ */ new Map();
48
+ const renderArtifactCache = new Map();
2709
49
  function createRenderResourceUri(renderId) {
2710
- return `${RENDER_RESOURCE_PREFIX}${renderId}.svg`;
50
+ return `${RENDER_RESOURCE_PREFIX}${renderId}.svg`;
2711
51
  }
2712
52
  function purgeExpiredRenderArtifacts(now = Date.now()) {
2713
- for (const [renderId, artifact] of renderArtifactCache) {
2714
- if (artifact.createdAt + RENDER_ARTIFACT_TTL_MS <= now) {
2715
- renderArtifactCache.delete(renderId);
53
+ for (const [renderId, artifact] of renderArtifactCache) {
54
+ if (artifact.createdAt + RENDER_ARTIFACT_TTL_MS <= now) {
55
+ renderArtifactCache.delete(renderId);
56
+ }
2716
57
  }
2717
- }
2718
58
  }
2719
59
  function trimRenderArtifacts() {
2720
- if (renderArtifactCache.size <= MAX_RENDER_ARTIFACTS) {
2721
- return;
2722
- }
2723
- const artifacts = [...renderArtifactCache.entries()].sort((left, right) => left[1].createdAt - right[1].createdAt);
2724
- const excessCount = renderArtifactCache.size - MAX_RENDER_ARTIFACTS;
2725
- for (const [renderId] of artifacts.slice(0, excessCount)) {
2726
- renderArtifactCache.delete(renderId);
2727
- }
60
+ if (renderArtifactCache.size <= MAX_RENDER_ARTIFACTS) {
61
+ return;
62
+ }
63
+ const artifacts = [...renderArtifactCache.entries()].sort((left, right) => left[1].createdAt - right[1].createdAt);
64
+ const excessCount = renderArtifactCache.size - MAX_RENDER_ARTIFACTS;
65
+ for (const [renderId] of artifacts.slice(0, excessCount)) {
66
+ renderArtifactCache.delete(renderId);
67
+ }
2728
68
  }
2729
69
  function storeRenderArtifact(artifact) {
2730
- purgeExpiredRenderArtifacts();
2731
- const renderId = randomUUID();
2732
- const uri = createRenderResourceUri(renderId);
2733
- const cachedArtifact = {
2734
- ...artifact,
2735
- uri
2736
- };
2737
- renderArtifactCache.set(renderId, cachedArtifact);
2738
- trimRenderArtifacts();
2739
- return {
2740
- ...cachedArtifact,
2741
- expiresAt: new Date(cachedArtifact.createdAt + RENDER_ARTIFACT_TTL_MS).toISOString()
2742
- };
70
+ purgeExpiredRenderArtifacts();
71
+ const renderId = randomUUID();
72
+ const uri = createRenderResourceUri(renderId);
73
+ const cachedArtifact = {
74
+ ...artifact,
75
+ uri,
76
+ };
77
+ renderArtifactCache.set(renderId, cachedArtifact);
78
+ trimRenderArtifacts();
79
+ return {
80
+ ...cachedArtifact,
81
+ expiresAt: new Date(cachedArtifact.createdAt + RENDER_ARTIFACT_TTL_MS).toISOString(),
82
+ };
2743
83
  }
2744
84
  function getRenderArtifact(renderId) {
2745
- purgeExpiredRenderArtifacts();
2746
- return renderArtifactCache.get(renderId);
85
+ purgeExpiredRenderArtifacts();
86
+ return renderArtifactCache.get(renderId);
2747
87
  }
2748
88
  function parseRenderId(value) {
2749
- const cleanedValue = value.replace(/^\/+/, "");
2750
- if (!cleanedValue) {
2751
- return void 0;
2752
- }
2753
- if (cleanedValue.endsWith(".svg")) {
2754
- return cleanedValue.slice(0, -4);
2755
- }
2756
- return cleanedValue;
2757
- }
2758
- function getDiagramJsonSchema() {
2759
- return toJsonSchemaCompat(DiagramSchema, {
2760
- target: "draft-2020-12",
2761
- strictUnions: true
2762
- });
89
+ const cleanedValue = value.replace(/^\/+/, "");
90
+ if (!cleanedValue) {
91
+ return undefined;
92
+ }
93
+ if (cleanedValue.endsWith(".svg")) {
94
+ return cleanedValue.slice(0, -4);
95
+ }
96
+ return cleanedValue;
2763
97
  }
2764
- function validateDiagram(input) {
2765
- return validate(input);
98
+ export function getDiagramJsonSchema() {
99
+ return toJsonSchemaCompat(DiagramSchema, {
100
+ target: "draft-2020-12",
101
+ strictUnions: true,
102
+ });
2766
103
  }
2767
- async function renderDiagramFromInput(input) {
2768
- const validation = validateDiagram(input);
2769
- if (!validation.valid) {
2770
- const detail = validation.errors.map((error) => `${error.path}: ${error.message}`).join("\n");
2771
- throw new Error(`Diagram validation failed
2772
- ${detail}`);
2773
- }
2774
- const parsed = DiagramSchema.parse(input);
2775
- const positioned = await layoutDiagram(parsed);
2776
- return renderDiagramDocument(positioned);
104
+ export function validateDiagram(input) {
105
+ return validate(input);
2777
106
  }
2778
- function createServer() {
2779
- const server = new McpServer({
2780
- name: SERVER_NAME,
2781
- version: SERVER_VERSION
2782
- });
2783
- server.registerTool(
2784
- "validate_diagram",
2785
- {
2786
- title: "Validate Diagram",
2787
- description: "Validate a diagram against the stack-scribe schema and semantic rules.",
2788
- inputSchema: ToolInputSchema,
2789
- outputSchema: ValidateToolOutputSchema
2790
- },
2791
- async ({ diagram }) => {
2792
- const result = validateDiagram(diagram);
2793
- const structuredContent = {
2794
- valid: result.valid,
2795
- errors: result.errors.map((error) => ({
2796
- path: error.path,
2797
- message: error.message
2798
- }))
2799
- };
2800
- return {
2801
- content: [
2802
- {
2803
- type: "text",
2804
- text: JSON.stringify(structuredContent, null, 2)
2805
- }
2806
- ],
2807
- structuredContent
2808
- };
107
+ export async function renderDiagramFromInput(input) {
108
+ const validation = validateDiagram(input);
109
+ if (!validation.valid) {
110
+ const detail = validation.errors.map((error) => `${error.path}: ${error.message}`).join("\n");
111
+ throw new Error(`Diagram validation failed\n${detail}`);
2809
112
  }
2810
- );
2811
- server.registerTool(
2812
- "render_diagram",
2813
- {
2814
- title: "Render Diagram",
2815
- description: "Validate, lay out, and render a diagram to an SVG resource.",
2816
- inputSchema: ToolInputSchema,
2817
- outputSchema: RenderToolOutputSchema
2818
- },
2819
- async ({ diagram }) => {
2820
- const rendered = await renderDiagramFromInput(diagram);
2821
- const artifact = storeRenderArtifact({
2822
- createdAt: Date.now(),
2823
- height: rendered.height,
2824
- mimeType: RENDER_ARTIFACT_MIME_TYPE,
2825
- svg: rendered.svg,
2826
- width: rendered.width
2827
- });
2828
- return {
2829
- content: [
2830
- {
2831
- type: "text",
2832
- text: `Rendered diagram available at ${artifact.uri}`
2833
- },
2834
- {
2835
- type: "resource_link",
2836
- uri: artifact.uri,
2837
- name: diagram.title ?? "Rendered Diagram",
2838
- mimeType: artifact.mimeType,
2839
- description: "Rendered stack-scribe SVG artifact"
2840
- }
2841
- ],
2842
- structuredContent: {
2843
- uri: artifact.uri,
2844
- mimeType: artifact.mimeType,
2845
- width: artifact.width,
2846
- height: artifact.height,
2847
- expiresAt: artifact.expiresAt
113
+ const parsed = DiagramSchema.parse(input);
114
+ const positioned = await layoutDiagram(parsed);
115
+ return renderDiagramDocument(positioned);
116
+ }
117
+ export function createServer() {
118
+ const server = new McpServer({
119
+ name: SERVER_NAME,
120
+ version: SERVER_VERSION,
121
+ });
122
+ server.registerTool("validate_diagram", {
123
+ title: "Validate Diagram",
124
+ description: "Validate a diagram against the stack-scribe schema and semantic rules.",
125
+ inputSchema: ToolInputSchema,
126
+ outputSchema: ValidateToolOutputSchema,
127
+ }, async ({ diagram }) => {
128
+ const result = validateDiagram(diagram);
129
+ const structuredContent = {
130
+ valid: result.valid,
131
+ errors: result.errors.map((error) => ({
132
+ path: error.path,
133
+ message: error.message,
134
+ })),
135
+ };
136
+ return {
137
+ content: [
138
+ {
139
+ type: "text",
140
+ text: JSON.stringify(structuredContent, null, 2),
141
+ },
142
+ ],
143
+ structuredContent,
144
+ };
145
+ });
146
+ server.registerTool("render_diagram", {
147
+ title: "Render Diagram",
148
+ description: "Validate, lay out, and render a diagram to an SVG resource.",
149
+ inputSchema: ToolInputSchema,
150
+ outputSchema: RenderToolOutputSchema,
151
+ }, async ({ diagram }) => {
152
+ const rendered = await renderDiagramFromInput(diagram);
153
+ const artifact = storeRenderArtifact({
154
+ createdAt: Date.now(),
155
+ height: rendered.height,
156
+ mimeType: RENDER_ARTIFACT_MIME_TYPE,
157
+ svg: rendered.svg,
158
+ width: rendered.width,
159
+ });
160
+ return {
161
+ content: [
162
+ {
163
+ type: "text",
164
+ text: `Rendered diagram available at ${artifact.uri}`,
165
+ },
166
+ {
167
+ type: "resource_link",
168
+ uri: artifact.uri,
169
+ name: diagram.title ?? "Rendered Diagram",
170
+ mimeType: artifact.mimeType,
171
+ description: "Rendered stack-scribe SVG artifact",
172
+ },
173
+ ],
174
+ structuredContent: {
175
+ uri: artifact.uri,
176
+ mimeType: artifact.mimeType,
177
+ width: artifact.width,
178
+ height: artifact.height,
179
+ expiresAt: artifact.expiresAt,
180
+ },
181
+ };
182
+ });
183
+ server.registerTool("save_diagram", {
184
+ title: "Save Diagram",
185
+ description: "Write a previously rendered SVG diagram from the in-memory cache directly to disk without passing SVG content through the LLM context.",
186
+ inputSchema: z.object({
187
+ uri: z.string().min(1),
188
+ outputPath: z.string().min(1),
189
+ }),
190
+ }, async ({ uri, outputPath }) => {
191
+ const renderId = parseRenderId(uri.replace(RENDER_RESOURCE_PREFIX, ""));
192
+ if (!renderId) {
193
+ return {
194
+ content: [{ type: "text", text: `Render not found or expired: ${uri}` }],
195
+ isError: true,
196
+ };
2848
197
  }
2849
- };
2850
- }
2851
- );
2852
- server.registerTool(
2853
- "save_diagram",
2854
- {
2855
- title: "Save Diagram",
2856
- description: "Write a previously rendered SVG diagram from the in-memory cache directly to disk without passing SVG content through the LLM context.",
2857
- inputSchema: z3.object({
2858
- uri: z3.string().min(1),
2859
- outputPath: z3.string().min(1)
2860
- })
2861
- },
2862
- async ({ uri, outputPath }) => {
2863
- const renderId = parseRenderId(uri.replace(RENDER_RESOURCE_PREFIX, ""));
2864
- if (!renderId) {
198
+ const artifact = getRenderArtifact(renderId);
199
+ if (!artifact) {
200
+ return {
201
+ content: [{ type: "text", text: `Render not found or expired: ${uri}` }],
202
+ isError: true,
203
+ };
204
+ }
205
+ writeFileSync(outputPath, artifact.svg, "utf8");
2865
206
  return {
2866
- content: [{ type: "text", text: `Render not found or expired: ${uri}` }],
2867
- isError: true
207
+ content: [{ type: "text", text: `Saved SVG to ${outputPath} (${artifact.svg.length} bytes)` }],
2868
208
  };
2869
- }
2870
- const artifact = getRenderArtifact(renderId);
2871
- if (!artifact) {
209
+ });
210
+ server.registerTool("get_diagram_schema", {
211
+ title: "Get Diagram Schema",
212
+ description: "Return the JSON Schema that describes the stack-scribe Diagram format.",
213
+ outputSchema: SchemaToolOutputSchema,
214
+ }, async () => {
215
+ const schema = getDiagramJsonSchema();
2872
216
  return {
2873
- content: [{ type: "text", text: `Render not found or expired: ${uri}` }],
2874
- isError: true
217
+ content: [
218
+ {
219
+ type: "text",
220
+ text: JSON.stringify(schema, null, 2),
221
+ },
222
+ ],
223
+ structuredContent: { schema },
2875
224
  };
2876
- }
2877
- writeFileSync(outputPath, artifact.svg, "utf8");
2878
- return {
2879
- content: [{ type: "text", text: `Saved SVG to ${outputPath} (${artifact.svg.length} bytes)` }]
2880
- };
2881
- }
2882
- );
2883
- server.registerTool(
2884
- "get_diagram_schema",
2885
- {
2886
- title: "Get Diagram Schema",
2887
- description: "Return the JSON Schema that describes the stack-scribe Diagram format.",
2888
- outputSchema: SchemaToolOutputSchema
2889
- },
2890
- async () => {
2891
- const schema = getDiagramJsonSchema();
2892
- return {
2893
- content: [
2894
- {
2895
- type: "text",
2896
- text: JSON.stringify(schema, null, 2)
2897
- }
2898
- ],
2899
- structuredContent: { schema }
2900
- };
2901
- }
2902
- );
2903
- server.registerResource(
2904
- "diagram-schema",
2905
- DIAGRAM_SCHEMA_URI,
2906
- {
2907
- title: "Diagram Schema",
2908
- description: "JSON Schema for the stack-scribe Diagram format.",
2909
- mimeType: "application/schema+json"
2910
- },
2911
- async () => {
2912
- const schema = getDiagramJsonSchema();
2913
- return {
2914
- contents: [
2915
- {
2916
- uri: DIAGRAM_SCHEMA_URI,
2917
- mimeType: "application/schema+json",
2918
- text: JSON.stringify(schema, null, 2)
2919
- }
2920
- ]
2921
- };
2922
- }
2923
- );
2924
- server.registerResource(
2925
- "rendered-diagram",
2926
- new ResourceTemplate(RENDER_RESOURCE_TEMPLATE, { list: void 0 }),
2927
- {
2928
- title: "Rendered Diagram",
2929
- description: "Session-scoped SVG render artifact produced by stack-scribe.",
2930
- mimeType: RENDER_ARTIFACT_MIME_TYPE
2931
- },
2932
- async (uri, variables) => {
2933
- const renderIdValue = variables.renderId;
2934
- const renderId = Array.isArray(renderIdValue) ? parseRenderId(renderIdValue[0] ?? "") : parseRenderId(String(renderIdValue ?? "")) ?? parseRenderId(uri.pathname);
2935
- if (!renderId) {
2936
- throw new Error(`Invalid render artifact URI: ${uri.href}`);
2937
- }
2938
- const artifact = getRenderArtifact(renderId);
2939
- if (!artifact) {
2940
- throw new Error(`Render artifact not found or expired: ${uri.href}`);
2941
- }
2942
- return {
2943
- contents: [
2944
- {
2945
- uri: artifact.uri,
2946
- mimeType: artifact.mimeType,
2947
- text: artifact.svg
2948
- }
2949
- ]
2950
- };
2951
- }
2952
- );
2953
- return server;
225
+ });
226
+ server.registerResource("diagram-schema", DIAGRAM_SCHEMA_URI, {
227
+ title: "Diagram Schema",
228
+ description: "JSON Schema for the stack-scribe Diagram format.",
229
+ mimeType: "application/schema+json",
230
+ }, async () => {
231
+ const schema = getDiagramJsonSchema();
232
+ return {
233
+ contents: [
234
+ {
235
+ uri: DIAGRAM_SCHEMA_URI,
236
+ mimeType: "application/schema+json",
237
+ text: JSON.stringify(schema, null, 2),
238
+ },
239
+ ],
240
+ };
241
+ });
242
+ server.registerResource("rendered-diagram", new ResourceTemplate(RENDER_RESOURCE_TEMPLATE, { list: undefined }), {
243
+ title: "Rendered Diagram",
244
+ description: "Session-scoped SVG render artifact produced by stack-scribe.",
245
+ mimeType: RENDER_ARTIFACT_MIME_TYPE,
246
+ }, async (uri, variables) => {
247
+ const renderIdValue = variables.renderId;
248
+ const renderId = Array.isArray(renderIdValue)
249
+ ? parseRenderId(renderIdValue[0] ?? "")
250
+ : parseRenderId(String(renderIdValue ?? "")) ?? parseRenderId(uri.pathname);
251
+ if (!renderId) {
252
+ throw new Error(`Invalid render artifact URI: ${uri.href}`);
253
+ }
254
+ const artifact = getRenderArtifact(renderId);
255
+ if (!artifact) {
256
+ throw new Error(`Render artifact not found or expired: ${uri.href}`);
257
+ }
258
+ return {
259
+ contents: [
260
+ {
261
+ uri: artifact.uri,
262
+ mimeType: artifact.mimeType,
263
+ text: artifact.svg,
264
+ },
265
+ ],
266
+ };
267
+ });
268
+ return server;
2954
269
  }
2955
- async function startServer() {
2956
- const server = createServer();
2957
- const transport = new StdioServerTransport();
2958
- await server.connect(transport);
2959
- return server;
270
+ export async function startServer() {
271
+ const server = createServer();
272
+ const transport = new StdioServerTransport();
273
+ await server.connect(transport);
274
+ return server;
2960
275
  }
2961
276
  async function main() {
2962
- await startServer();
277
+ await startServer();
2963
278
  }
2964
- var isEntrypoint = process.argv[1] && import.meta.url === new URL(process.argv[1], "file:").href;
279
+ const isEntrypoint = process.argv[1] && import.meta.url === new URL(process.argv[1], "file:").href;
2965
280
  if (isEntrypoint) {
2966
- main().catch((error) => {
2967
- console.error("Server error:", error);
2968
- process.exit(1);
2969
- });
281
+ main().catch((error) => {
282
+ console.error("Server error:", error);
283
+ process.exit(1);
284
+ });
2970
285
  }
2971
- export {
2972
- createServer,
2973
- getDiagramJsonSchema,
2974
- renderDiagramFromInput,
2975
- startServer,
2976
- validateDiagram
2977
- };
2978
286
  //# sourceMappingURL=index.js.map