Skip to content

Commit b567fc4

Browse files
committed
feat(ec2): add network ACL, endpoint, peering, AMI, key pair, ingress rule, and EBS delete operations
- Add describe_network_acls, describe_vpc_endpoints, describe_vpc_peering_connections, describe_images, describe_key_pairs, authorize/revoke_security_group_ingress, delete_volume, and delete_snapshot - Regenerate block successor names (fixes the lint job's repo audit) - Merge the two tag tables into one tags field so fixed tags work in the Agent editor - Keep a __proto__ tag key by building records with Object.fromEntries - Pass [{Key, Value}] tag arrays through the block instead of dropping them - Use a filter example each describe operation actually accepts - Report revoked: false when a revoke matched no rule; mark the ingress target clauses core
1 parent fd84f75 commit b567fc4

39 files changed

Lines changed: 2822 additions & 86 deletions

‎apps/docs/content/docs/integrations/ec2.mdx‎

Lines changed: 351 additions & 19 deletions
Large diffs are not rendered by default.

‎apps/sim/blocks/blocks/ec2.ts‎

Lines changed: 279 additions & 35 deletions
Large diffs are not rendered by default.

‎apps/sim/lib/block-metadata/names.generated.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ export const BLOCK_NAMES: Readonly<Record<string, string>> = {
7272
duckduckgo: 'DuckDuckGo',
7373
dynamodb: 'Amazon DynamoDB',
7474
dynatrace: 'Dynatrace',
75+
ec2: 'Amazon EC2',
7576
elasticsearch: 'Elasticsearch',
7677
elevenlabs: 'ElevenLabs',
7778
emailbison: 'Email Bison',

‎apps/sim/lib/internal/ec2/client.ts‎

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,9 @@ export function toIsoString(value?: Date): string | null {
2727

2828
/** Flattens EC2's `[{ Key, Value }]` tag list into a plain `{ key: value }` record. */
2929
export function tagsToRecord(tags?: Tag[]): Record<string, string> {
30-
const record: Record<string, string> = {}
31-
for (const tag of tags ?? []) {
32-
if (tag.Key) record[tag.Key] = tag.Value ?? ''
33-
}
34-
return record
30+
return Object.fromEntries(
31+
(tags ?? []).flatMap((tag) => (tag.Key ? [[tag.Key, tag.Value ?? '']] : []))
32+
)
3533
}
3634

3735
export function recordToTags(tags: Record<string, string>): Tag[] {

‎apps/sim/lib/internal/ec2/execute-tool.ts‎

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,53 +3,71 @@ import type { z } from 'zod'
33
import {
44
executeEc2AllocateAddress,
55
executeEc2AssociateAddress,
6+
executeEc2AuthorizeSecurityGroupIngress,
67
executeEc2CreateSnapshot,
78
executeEc2CreateTags,
9+
executeEc2DeleteSnapshot,
810
executeEc2DeleteTags,
11+
executeEc2DeleteVolume,
912
executeEc2DescribeAddresses,
1013
executeEc2DescribeAvailabilityZones,
14+
executeEc2DescribeImages,
1115
executeEc2DescribeInstanceStatus,
1216
executeEc2DescribeInstances,
1317
executeEc2DescribeInternetGateways,
18+
executeEc2DescribeKeyPairs,
1419
executeEc2DescribeNatGateways,
20+
executeEc2DescribeNetworkAcls,
1521
executeEc2DescribeNetworkInterfaces,
1622
executeEc2DescribeRegions,
1723
executeEc2DescribeRouteTables,
1824
executeEc2DescribeSecurityGroups,
1925
executeEc2DescribeSnapshots,
2026
executeEc2DescribeSubnets,
2127
executeEc2DescribeVolumes,
28+
executeEc2DescribeVpcEndpoints,
29+
executeEc2DescribeVpcPeeringConnections,
2230
executeEc2DescribeVpcs,
2331
executeEc2DisassociateAddress,
2432
executeEc2RebootInstances,
2533
executeEc2ReleaseAddress,
34+
executeEc2RevokeSecurityGroupIngress,
2635
executeEc2StartInstances,
2736
executeEc2StopInstances,
2837
executeEc2TerminateInstances,
2938
} from '@/lib/internal/ec2/operations'
3039
import {
3140
ec2AllocateAddressInputSchema,
3241
ec2AssociateAddressInputSchema,
42+
ec2AuthorizeSecurityGroupIngressInputSchema,
3343
ec2CreateSnapshotInputSchema,
3444
ec2CreateTagsInputSchema,
45+
ec2DeleteSnapshotInputSchema,
3546
ec2DeleteTagsInputSchema,
47+
ec2DeleteVolumeInputSchema,
3648
ec2DescribeAddressesInputSchema,
3749
ec2DescribeAvailabilityZonesInputSchema,
50+
ec2DescribeImagesInputSchema,
3851
ec2DescribeInstanceStatusInputSchema,
3952
ec2DescribeInstancesInputSchema,
4053
ec2DescribeInternetGatewaysInputSchema,
54+
ec2DescribeKeyPairsInputSchema,
4155
ec2DescribeNatGatewaysInputSchema,
56+
ec2DescribeNetworkAclsInputSchema,
4257
ec2DescribeNetworkInterfacesInputSchema,
4358
ec2DescribeRegionsInputSchema,
4459
ec2DescribeRouteTablesInputSchema,
4560
ec2DescribeSecurityGroupsInputSchema,
4661
ec2DescribeSnapshotsInputSchema,
4762
ec2DescribeSubnetsInputSchema,
4863
ec2DescribeVolumesInputSchema,
64+
ec2DescribeVpcEndpointsInputSchema,
65+
ec2DescribeVpcPeeringConnectionsInputSchema,
4966
ec2DescribeVpcsInputSchema,
5067
ec2DisassociateAddressInputSchema,
5168
ec2InstanceIdsInputSchema,
5269
ec2ReleaseAddressInputSchema,
70+
ec2RevokeSecurityGroupIngressInputSchema,
5371
ec2StopInstancesInputSchema,
5472
} from '@/lib/internal/ec2/schema'
5573
import type { InternalToolOperationHandler } from '@/lib/internal/tool-operations/types'
@@ -285,6 +303,78 @@ export const executeEc2Tool: InternalToolOperationHandler = async ({ toolId, inp
285303
'Failed to describe availability zones',
286304
signal
287305
)
306+
case 'ec2_describe_network_acls':
307+
return executeOperation(
308+
ec2DescribeNetworkAclsInputSchema,
309+
input,
310+
executeEc2DescribeNetworkAcls,
311+
'Failed to describe network ACLs',
312+
signal
313+
)
314+
case 'ec2_describe_vpc_endpoints':
315+
return executeOperation(
316+
ec2DescribeVpcEndpointsInputSchema,
317+
input,
318+
executeEc2DescribeVpcEndpoints,
319+
'Failed to describe VPC endpoints',
320+
signal
321+
)
322+
case 'ec2_describe_vpc_peering_connections':
323+
return executeOperation(
324+
ec2DescribeVpcPeeringConnectionsInputSchema,
325+
input,
326+
executeEc2DescribeVpcPeeringConnections,
327+
'Failed to describe VPC peering connections',
328+
signal
329+
)
330+
case 'ec2_describe_images':
331+
return executeOperation(
332+
ec2DescribeImagesInputSchema,
333+
input,
334+
executeEc2DescribeImages,
335+
'Failed to describe AMIs',
336+
signal
337+
)
338+
case 'ec2_describe_key_pairs':
339+
return executeOperation(
340+
ec2DescribeKeyPairsInputSchema,
341+
input,
342+
executeEc2DescribeKeyPairs,
343+
'Failed to describe key pairs',
344+
signal
345+
)
346+
case 'ec2_authorize_security_group_ingress':
347+
return executeOperation(
348+
ec2AuthorizeSecurityGroupIngressInputSchema,
349+
input,
350+
executeEc2AuthorizeSecurityGroupIngress,
351+
'Failed to authorize security group ingress',
352+
signal
353+
)
354+
case 'ec2_revoke_security_group_ingress':
355+
return executeOperation(
356+
ec2RevokeSecurityGroupIngressInputSchema,
357+
input,
358+
executeEc2RevokeSecurityGroupIngress,
359+
'Failed to revoke security group ingress',
360+
signal
361+
)
362+
case 'ec2_delete_volume':
363+
return executeOperation(
364+
ec2DeleteVolumeInputSchema,
365+
input,
366+
executeEc2DeleteVolume,
367+
'Failed to delete EBS volume',
368+
signal
369+
)
370+
case 'ec2_delete_snapshot':
371+
return executeOperation(
372+
ec2DeleteSnapshotInputSchema,
373+
input,
374+
executeEc2DeleteSnapshot,
375+
'Failed to delete EBS snapshot',
376+
signal
377+
)
288378
default:
289379
return Response.json({ error: `Unsupported EC2 tool: ${toolId}` }, { status: 500 })
290380
}

0 commit comments

Comments
 (0)