Skip to content

Commit bf575fe

Browse files
authored
feat(credentials): saved credentials and credential-only block versions, with keyless AWS/Databricks OIDC (#9763)
* feat(credentials): saved AWS and Databricks credentials with keyless OIDC Adds an optional saved credential to every AWS block and the Databricks block, alongside the existing inline key fields, plus Sim's own workload-identity (OIDC) issuer so a credential can assume a customer's AWS role or federate into a Databricks service principal without any stored secret. Existing workflows are unchanged: the inline fields stay, show, and validate exactly as before until someone selects a saved credential. - Issuer at /oidc/workload (discovery + JWKS), signing key from WORKLOAD_IDENTITY_SIGNING_KEY; 404 and keyless option off when unset - Credential-scoped subjects, HMAC-bound to the preparing user and workspace, so a member cannot reuse another credential's subject - aws-service-account: access keys, keys + AssumeRole (external ID), or keyless AssumeRoleWithWebIdentity; resolved server-side per call - databricks-service-account: PAT, service principal M2M secret, or keyless RFC 8693 token federation - AWS families accept the executor-authorized credential through trusted operation context; clients add the session token only for that pair - S3 get_object signs x-amz-security-token for temporary credentials; inline signatures are byte-identical to before - Tool credential binding honors optional (required: false) policies * fix(credentials): close review findings on saved AWS/Databricks credentials - Models can no longer inject a credential selector (or the token, session token, or host derived from one) into a hybrid tool call, which would have swapped an agent tool's inline keys for another workspace credential - Databricks connections own the workspace host (authoritative `domain`) - Drop the advanced credential-ID input: with a single picker, "is a credential selected" can no longer disagree with the active canonical mode - OIDC subject proofs are bound to their provider - Databricks token and identity fetches refuse redirects - Correct the AWS module doc on presigned URLs carrying a session token * chore(credentials): satisfy test-pattern, unused-export, and test-type audits * fix(credentials): keyless reconnect, availability, and shared credential plumbing - Reconnecting a keyless AWS role or Databricks principal keeps its trusted subject by default instead of issuing a new one that breaks the customer's trust policy - The connect dialogs offer the keyless mode only where the deployment can sign tokens; the prepare endpoint reports availability instead of failing - Register AWS (all 19 block types) and Databricks as stored-credential integrations, so org settings, the v2 credentials API, and Copilot can create and see them - Optional STS region for GovCloud and China access keys - One subject binder and config parser shared by both providers (neutral copy), one modal core for submit/errors/trust display - Generic `authorizedServiceAccountCredential` operation context instead of an AWS-specific field; Databricks resolver checks credential type and honors cancellation - Model-blocked params derive from each tool's authoritative params * test(credentials): type the handler mock in the AWS credential seam test * feat(credentials): credential-only block versions instead of hybrid inline keys Existing AWS and Databricks blocks are left exactly as on staging, only marked legacy and hidden from the toolbar; placed instances keep running and show an upgrade badge. Each gets a credential-only successor (s3_v2 ... databricks_v2, textract_v3) built by spreading the legacy block and swapping its secret fields for a required saved-credential picker. - withSavedCredential derives the successor's fields, inputs, and params builder; S3 and Textract split their builders so legacy key checks stay - tools declare credentialSuppliedParams so serializer validation and the canonical-id check stop asking credential-only blocks for inline keys - CloudWatch gets saved-credential log group/stream selectors that sign inside the credential's STS session - docs generator resolves multi-level spreads and same-file param builders - the AWS/Databricks providers are derived from the catalog again, so the hand-maintained token-credential mapping is reverted * docs(credentials): document credential-only blocks by their credential, not inline keys The generator omits a tool's credential-supplied params on pages for blocks that sign in with a saved credential, as it already omits accessToken. Intros now point at the AWS/Databricks credential guides. Regenerates OpenAPI, CLI API, and CLI docs for the new selector keys. * fix(blocks): never replace trigger fields that share a secret's id A webhook trigger can register with a field named like the block's secret (PagerDuty, Fathom, EmailBison, GitLab). withSavedCredential now leaves trigger-mode fields, and their dependencies, exactly as they are. * feat(credentials): generic saved-token plumbing for credential-only blocks Wave 0 of moving inline-secret blocks onto saved credentials. - tokenCredentialOAuth(provider, credentialParams) declares which tool params a saved token fills; credentialSuppliedParams is derived from it - the executor fills those params after authorization, overriding any caller value, and fails closed when the credential lacks a field - hosted keys are never injected when a saved credential supplies the key - v2 tool execute no longer demands credential-supplied params when a credentialId is passed (fixes AWS/Databricks direct calls) - withSavedCredential accepts an optional/conditional requirement - check-block-registry verifies every credential-only successor's tools authorize the picker's provider and actually fill what they declare - redact secretAccessKey/awsSecretAccessKey keys in logs - serializer contract test covers every operation of each successor * feat(credentials): Tavily saved credential and credential-only tavily_v2 Reference migration for wave 1. A generic tokenCheckValidator verifies a token with one documented authenticated request (no redirects); Tavily uses GET /usage. Legacy tavily is unchanged apart from its legacy marker. * fix(credentials): close wave-0 audit findings - agent tool-input no longer synthesizes inline secret fields a block's saved-credential picker supplies; one shared rule (credentialSuppliedParamsFor) now drives tool-input, serializer validation, and the canonical-id check - the picker inherits the replaced secret's condition and requirement, so sts_v2's unsigned calls (web identity, SAML) need no credential - withSavedCredential replaces both halves of a canonical secret pair and refuses options that would silently do nothing - Databricks fills its inline apiKey/host through credentialParams, so its tools are byte-identical to staging apart from the policy line - AWS operation families record their tool ids; a test and an executor guard ensure every AWS-credential tool resolves the credential - the registry contract check fails on unpinned host params, optional credentials over required params, malformed pickers, and kind mismatch - hosted-key admission (v2) and pre-resolution validation honor a selected saved credential; credential errors name fields in plain words * feat(credentials): wave 1 — saved token credentials for 48 single-token blocks Each block keeps its legacy definition (only hideFromToolbar + sunset) and gains a credential-only <type>_v2. Every service gets a token-paste provider with a one-request validator against a documented, read-only, credit-free endpoint, and its tools fill the inline key from the saved credential via tokenCredentialOAuth. Blocks: affinity, agentmail, agentphone, ahrefs, apify, apollo, brex, brightdata, browser_use, buffer, circleback, clerk, cloudflare, crunchbase, daytona, elevenlabs, enrich, gamma, hex, huggingface, incidentio, instantly, langsmith, launchdarkly, linq, loops, luma, mailchimp, otter, persona, pinecone, profound, quartr, rb2b, rippling, rocketlane, semrush, sendgrid, similarweb, sixtyfour, smartlead, sportmonks, square, tailscale, trigger_dev, uptimerobot, youcom, youtube. The registry contract check now probes each request tool's real URL builder to find params that steer the host, and requires the saved credential to fill them. * fix(credentials): close wave-1 audit findings - Pinecone and Semrush leave wave 1: Pinecone's per-call indexHost would let a shared key reach any host, and Semrush has no credit-free check that rejects a wrong key. Both are back to staging exactly. - tokenCheckValidator: forbiddenMeansScoped accepts a valid key that lacks the check endpoint's scope (Apollo, Brex, Bright Data, Apify, Rippling, Persona); acceptsBody proves keys whose rejection arrives in a 200 body (Buffer GraphQL) - the host-steering probe lives in scripts/saved-credential-contract.ts: typed placeholders for required params only, id/host shapes, bare and scheme probes, and a broad destination-name fallback where the URL cannot be built; covered by a fixture test - S3 refuses a bucket or region that would move the signed request's host - spread-inheriting docs keep their base block's outputs (restores the Smartlead, Trigger.dev, and Instantly output tables) - incident.io's credential is optional for alert events, which use their own alert source token - withSavedCredential refuses replaced secrets that show or require differently; copy, intro, and hint fixes from the audit * fix(credentials): close wave-1 re-audit findings - host probe also defeats unparsed suffix checks and finds hosts behind optional switches, probing every placeholder shape; broader destination names where a URL cannot be built; the contract check fails when a successor's tool is missing from the executable registry - the optional-credential rule evaluates a conditional picker per operation; incident.io hides its picker on alert events instead - withSavedCredential takes an explicit picker condition and refuses one that depends on a replaced secret at any nesting depth - a scoped 403 counts only when it is the vendor's JSON response, never a firewall or CDN page - S3 names a bad bucket or region in its error - pinecone/semrush catalog dates restored to staging * feat(credentials): wave 1b — Mem0, Zep, and Discord saved credentials Their legacy params builders throw without an inline secret, so each is extracted into a module function with a requireKey flag: the legacy block keeps identical validation and messages, the credential-only v2 skips only the key check. discord_v2 hides its picker for webhook posts, which never use the bot token. BlockToolParams is now a shared type for extracted builders (S3, Textract, Discord). * feat(credentials): wave 1b — v3 credential-only versions and Flint Blocks that already had a v2 get a credential-only v3 that spreads it: cursor, dub, extend, fireflies, intercom, pulse, quiver, reducto. The v2 becomes legacy and every older version's replacedBy points at v3. Extend, Pulse, and Reducto's v2 builders trimmed the key inline, so each is extracted into a builder that takes the key as an argument; the legacy v2 passes the trimmed key exactly as before. Flint gets flint_v2 with a dedicated validator: its API has no read endpoint, so an unknown task id answering 404 proves the key. tokenCheckValidator gains rejectsKey for vendors that answer a bad key with a server error (Fireflies returns 500 auth_failed), so the user is told the key is wrong rather than the vendor down. * fix(credentials): close wave-1b audit findings and CI boundary failures - token checks for the 59 new providers live in one module (validators/token-checks.ts) and their tool policies in tools/shared/saved-credentials.ts, so the tool-registry boundary stays within its baselines instead of adding ~60 modules to every graph - the host-steering probe builds URLs through the shared transport (new prepareToolRequestUrl) and also flags a host validated against a vendor allowlist when two accepted values reach different tenants - the AWS routing test reads typed metadata through getToolMetadata - Flint accepts only its documented JSON 'Task not found' 404; Intercom no longer treats a 403 (suspended workspace, plan without API) as valid; Fireflies keeps its error text in logs when a 5xx isn't auth_failed - Cursor help text, placeholder wording, Pulse intro, sorted secret fields * fix(credentials): address pre-ship verification findings - Refuse a keyless AWS role whose trust policy doesn't pin the credential's subject, so no other workspace can assume it - Treat a malformed workload-identity signing key as not configured - Brex: reject an unknown token's scope-style 403; the token-check factory now runs rejectsKey before accepting a scoped 403 - Flint: probe with a docs-shaped task id and a size-capped body read - Drop the versioned BlockMeta entries that doubled templates; alias bare block types in the app icon map so template icon clusters resolve - Widen the host-probe fallback names and rotate digits in alternates - Copy: picker placeholder casing, Databricks v2 description, Pulse and Tailscale skills, AWS/Persona/Rippling intros, AWS credential docs - Tests: AWS executor signing, AWS/Databricks credential setup, legacy params builders, serializer coverage for blocks without operations * refactor(credentials): one saved-credential table and shared helpers - withSavedCredential reads the replaced fields from SAVED_CREDENTIAL_OAUTH, so blocks and tools share one table instead of two hand-kept copies - Reuse isTriggerModeSubBlock, getDependsOnFields, and a shared isSavedCredentialPicker; build the replacedBy map once in the registry check - newWorkloadIdentitySubject owns the subject format; the AWS trust-pin probe runs alongside verification - The issuer parses a bad signing key once instead of per request - Token checks share the accepted result and the capped JSON reader * chore(credentials): cleanup pass - Keyless setup query gets its own key root, so broad credential invalidations can't refetch an open setup and mint a new subject - Named staleTime constant for the setup query - Correct stale comments (relying parties, Databricks param names) - Tighten tests: assert the refusal reason, make the BYOK guard reachable, drop a duplicate and a test that could not fail * fix(credentials): address review round 1 - A scoped 403 whose body can't be read is provider_unavailable, never accepted - Provider error snippets read through the bounded reader - Props interfaces for KeylessTrustFields and useWorkloadIdentitySetup; TSDoc on issuer responses * fix(credentials): never cache the issuer's not-configured 404
1 parent 61843fe commit bf575fe

2,165 files changed

Lines changed: 16517 additions & 3926 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎apps/docs/components/ui/icon-mapping.ts‎

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,23 +332,31 @@ type IconComponent = ComponentType<SVGProps<SVGSVGElement>>
332332
export const blockTypeToIconMap: Record<string, IconComponent> = {
333333
a2a: A2AIcon,
334334
affinity: AffinityIcon,
335+
affinity_v2: AffinityIcon,
335336
agent: AgentIcon,
336337
agentmail: AgentMailIcon,
338+
agentmail_v2: AgentMailIcon,
337339
agentphone: AgentPhoneIcon,
340+
agentphone_v2: AgentPhoneIcon,
338341
agiloft: AgiloftIcon,
339342
ahrefs: AhrefsIcon,
343+
ahrefs_v2: AhrefsIcon,
340344
airtable: AirtableIcon,
341345
algolia: AlgoliaIcon,
342346
amplitude: AmplitudeIcon,
343347
api: ApiIcon,
344348
api_trigger: ApiIcon,
345349
apify: ApifyIcon,
350+
apify_v2: ApifyIcon,
346351
apollo: ApolloIcon,
352+
apollo_v2: ApolloIcon,
347353
appconfig: AppConfigIcon,
354+
appconfig_v2: AppConfigIcon,
348355
arxiv: ArxivIcon,
349356
asana: AsanaIcon,
350357
ashby: AshbyIcon,
351358
athena: AthenaIcon,
359+
athena_v2: AthenaIcon,
352360
attio: AttioIcon,
353361
azure_data_explorer: AzureDataExplorerIcon,
354362
azure_devops: AzureIcon,
@@ -357,25 +365,36 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
357365
box_v2: BoxCompanyIcon,
358366
brandfetch: BrandfetchIcon,
359367
brex: BrexIcon,
368+
brex_v2: BrexIcon,
360369
brightdata: BrightDataIcon,
370+
brightdata_v2: BrightDataIcon,
361371
browser_use: BrowserUseIcon,
372+
browser_use_v2: BrowserUseIcon,
362373
buffer: BufferIcon,
374+
buffer_v2: BufferIcon,
363375
calcom: CalComIcon,
364376
calendly: CalendlyIcon,
365377
cbinsights: CbInsightsIcon,
366378
chat_trigger: Task,
367379
checkr: CheckrIcon,
368380
circleback: CirclebackIcon,
381+
circleback_v2: CirclebackIcon,
369382
clay: ClayIcon,
370383
clerk: ClerkIcon,
384+
clerk_v2: ClerkIcon,
371385
clickhouse: ClickHouseIcon,
372386
clickup: ClickUpIcon,
373387
cloudflare: CloudflareIcon,
388+
cloudflare_v2: CloudflareIcon,
374389
cloudformation: CloudFormationIcon,
390+
cloudformation_v2: CloudFormationIcon,
375391
cloudtrail: CloudTrailIcon,
392+
cloudtrail_v2: CloudTrailIcon,
376393
cloudwatch: CloudWatchIcon,
394+
cloudwatch_v2: CloudWatchIcon,
377395
coda: CodaIcon,
378396
codepipeline: CodePipelineIcon,
397+
codepipeline_v2: CodePipelineIcon,
379398
condition: ConditionalIcon,
380399
confluence: ConfluenceIcon,
381400
confluence_v2: ConfluenceIcon,
@@ -385,16 +404,21 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
385404
credential_group: GridOffset,
386405
crowdstrike: CrowdStrikeIcon,
387406
crunchbase: CrunchbaseIcon,
407+
crunchbase_v2: CrunchbaseIcon,
388408
cursor: CursorIcon,
389409
cursor_v2: CursorIcon,
410+
cursor_v3: CursorIcon,
390411
dagster: DagsterIcon,
391412
databricks: DatabricksIcon,
413+
databricks_v2: DatabricksIcon,
392414
datadog: DatadogIcon,
393415
datagma: DatagmaIcon,
394416
daytona: DaytonaIcon,
417+
daytona_v2: DaytonaIcon,
395418
deployments: Rocket,
396419
devin: DevinIcon,
397420
discord: DiscordIcon,
421+
discord_v2: DiscordIcon,
398422
docusign: DocuSignIcon,
399423
downdetector: DowndetectorIcon,
400424
dropbox: DropboxIcon,
@@ -403,21 +427,27 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
403427
dspy: DsPyIcon,
404428
dub: DubIcon,
405429
dub_v2: DubIcon,
430+
dub_v3: DubIcon,
406431
duckduckgo: DuckDuckGoIcon,
407432
dynamodb: DynamoDBIcon,
433+
dynamodb_v2: DynamoDBIcon,
408434
dynatrace: DynatraceIcon,
409435
ec2: EC2Icon,
436+
ec2_v2: EC2Icon,
410437
elasticsearch: ElasticsearchIcon,
411438
elevenlabs: ElevenLabsIcon,
439+
elevenlabs_v2: ElevenLabsIcon,
412440
emailbison: EmailBisonIcon,
413441
embeddings: EmbeddingsIcon,
414442
enrich: EnrichSoIcon,
443+
enrich_v2: EnrichSoIcon,
415444
enrichment: EnrichmentIcon,
416445
enrow: EnrowIcon,
417446
evaluator: ChartBarIcon,
418447
exa: ExaAIIcon,
419448
extend: ExtendIcon,
420449
extend_v2: ExtendIcon,
450+
extend_v3: ExtendIcon,
421451
fathom: FathomIcon,
422452
file: DocumentIcon,
423453
file_v2: DocumentIcon,
@@ -428,11 +458,14 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
428458
firecrawl: FirecrawlIcon,
429459
fireflies: FirefliesIcon,
430460
fireflies_v2: FirefliesIcon,
461+
fireflies_v3: FirefliesIcon,
431462
fivetran: FivetranIcon,
432463
flint: FlintIcon,
464+
flint_v2: FlintIcon,
433465
flow: FlowIcon,
434466
function: CodeIcon,
435467
gamma: GammaIcon,
468+
gamma_v2: GammaIcon,
436469
gauge: GaugeIcon,
437470
generic: WebhookIcon,
438471
generic_webhook: Webhook,
@@ -478,24 +511,31 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
478511
harmonic: HarmonicIcon,
479512
helpscout: HelpScoutIcon,
480513
hex: HexIcon,
514+
hex_v2: HexIcon,
481515
higgsfield: HiggsfieldIcon,
482516
hubspot: HubspotIcon,
483517
huggingface: HuggingFaceIcon,
518+
huggingface_v2: HuggingFaceIcon,
484519
human_in_the_loop: HumanInTheLoopIcon,
485520
human_in_the_loop_v2: HumanInTheLoopIcon,
486521
hunter: HunterIOIcon,
487522
iam: IAMIcon,
523+
iam_v2: IAMIcon,
488524
icypeas: IcypeasIcon,
489525
identity_center: IdentityCenterIcon,
526+
identity_center_v2: IdentityCenterIcon,
490527
image_generator: ImageIcon,
491528
image_generator_v2: ImageIcon,
492529
imap: MailServerIcon,
493530
incidentio: IncidentioIcon,
531+
incidentio_v2: IncidentioIcon,
494532
infisical: InfisicalIcon,
495533
input_trigger: FormInput,
496534
instantly: InstantlyIcon,
535+
instantly_v2: InstantlyIcon,
497536
intercom: IntercomIcon,
498537
intercom_v2: IntercomIcon,
538+
intercom_v3: IntercomIcon,
499539
intune: IntuneIcon,
500540
jama: JamaIcon,
501541
jina: JinaAIIcon,
@@ -510,29 +550,37 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
510550
ketch: KetchIcon,
511551
knowledge: PackageSearchIcon,
512552
lambda: LambdaIcon,
553+
lambda_v2: LambdaIcon,
513554
langsmith: LangsmithIcon,
555+
langsmith_v2: LangsmithIcon,
514556
latex: LatexIcon,
515557
launchdarkly: LaunchDarklyIcon,
558+
launchdarkly_v2: LaunchDarklyIcon,
516559
leadmagic: LeadMagicIcon,
517560
lemlist: LemlistIcon,
518561
linear: LinearIcon,
519562
linear_v2: LinearIcon,
520563
linkedin: LinkedInIcon,
521564
linkup: LinkupIcon,
522565
linq: LinqIcon,
566+
linq_v2: LinqIcon,
523567
logfire: LogfireIcon,
524568
logrocket: LogRocketIcon,
525569
logs: Library,
526570
logs_v2: Library,
527571
loops: LoopsIcon,
572+
loops_v2: LoopsIcon,
528573
luma: LumaIcon,
574+
luma_v2: LumaIcon,
529575
mailchimp: MailchimpIcon,
576+
mailchimp_v2: MailchimpIcon,
530577
mailgun: MailgunIcon,
531578
managed_agent: ClaudeIcon,
532579
manageengine_sdp: ManageEngineIcon,
533580
manual_trigger: Play,
534581
mcp: McpIcon,
535582
mem0: Mem0Icon,
583+
mem0_v2: Mem0Icon,
536584
memory: BrainIcon,
537585
microsoft_ad: AzureIcon,
538586
microsoft_dataverse: MicrosoftDataverseIcon,
@@ -571,12 +619,14 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
571619
oracle_fusion_financials: OracleIcon,
572620
oracledb: OracleIcon,
573621
otter: OtterIcon,
622+
otter_v2: OtterIcon,
574623
outlook: OutlookIcon,
575624
pagerduty: PagerDutyIcon,
576625
parallel_ai: ParallelIcon,
577626
peopledatalabs: PeopleDataLabsIcon,
578627
perplexity: PerplexityIcon,
579628
persona: PersonaIcon,
629+
persona_v2: PersonaIcon,
580630
pi: PiIcon,
581631
pinecone: PineconeIcon,
582632
pipedrive: PipedriveIcon,
@@ -588,85 +638,109 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
588638
posthog: PosthogIcon,
589639
powerbi: PowerBIIcon,
590640
profound: ProfoundIcon,
641+
profound_v2: ProfoundIcon,
591642
prospeo: ProspeoIcon,
592643
pulse: PulseIcon,
593644
pulse_v2: PulseIcon,
645+
pulse_v3: PulseIcon,
594646
qdrant: QdrantIcon,
595647
quartr: QuartrIcon,
648+
quartr_v2: QuartrIcon,
596649
quickbooks: QuickBooksIcon,
597650
quiver: QuiverIcon,
598651
quiver_v2: QuiverIcon,
652+
quiver_v3: QuiverIcon,
599653
rabbitmq: RabbitmqIcon,
600654
railway: RailwayIcon,
601655
ramp: RampIcon,
602656
rb2b: RB2BIcon,
657+
rb2b_v2: RB2BIcon,
603658
rds: RDSIcon,
659+
rds_v2: RDSIcon,
604660
reddit: RedditIcon,
605661
redis: RedisIcon,
606662
reducto: ReductoIcon,
607663
reducto_v2: ReductoIcon,
664+
reducto_v3: ReductoIcon,
608665
resend: ResendIcon,
609666
response: ResponseIcon,
610667
revenuecat: RevenueCatIcon,
611668
rippling: RipplingIcon,
669+
rippling_v2: RipplingIcon,
612670
rocketlane: RocketlaneIcon,
671+
rocketlane_v2: RocketlaneIcon,
613672
rootly: RootlyIcon,
614673
router: ConnectIcon,
615674
router_v2: ConnectIcon,
616675
rss: RssIcon,
617676
s3: S3Icon,
677+
s3_v2: S3Icon,
618678
sailpoint: SailPointIcon,
619679
salesforce: SalesforceIcon,
620680
sap_concur: SapConcurIcon,
621681
sap_s4hana: SapS4HanaIcon,
622682
schedule: Clock,
623683
search: SearchIcon,
624684
secrets_manager: SecretsManagerIcon,
685+
secrets_manager_v2: SecretsManagerIcon,
625686
semrush: SemrushIcon,
626687
sendblue: SendblueIcon,
627688
sendgrid: SendgridIcon,
689+
sendgrid_v2: SendgridIcon,
628690
sentry: SentryIcon,
629691
serper: SerperIcon,
630692
servicenow: ServiceNowIcon,
631693
servicenow_v2: ServiceNowIcon,
632694
ses: SESIcon,
695+
ses_v2: SESIcon,
633696
sftp: SftpIcon,
634697
sftp_v2: SftpIcon,
635698
sharepoint: MicrosoftSharepointIcon,
636699
sharepoint_v2: MicrosoftSharepointIcon,
637700
shopify: ShopifyIcon,
638701
sim_workspace_event: SimTriggerIcon,
639702
similarweb: SimilarwebIcon,
703+
similarweb_v2: SimilarwebIcon,
640704
sixtyfour: SixtyfourIcon,
705+
sixtyfour_v2: SixtyfourIcon,
641706
slack: SlackIcon,
642707
slack_app: SlackIcon,
643708
slack_v2: SlackIcon,
644709
smartlead: SmartleadIcon,
710+
smartlead_v2: SmartleadIcon,
645711
smtp: SmtpIcon,
646712
snowflake: SnowflakeIcon,
647713
splunk: SplunkIcon,
648714
sportmonks: SportmonksIcon,
715+
sportmonks_v2: SportmonksIcon,
649716
sqs: SQSIcon,
717+
sqs_v2: SQSIcon,
650718
square: SquareIcon,
719+
square_v2: SquareIcon,
651720
ssh: SshIcon,
652721
ssh_v2: SshIcon,
653722
ssm: SSMIcon,
723+
ssm_v2: SSMIcon,
654724
stagehand: StagehandIcon,
655725
start_trigger: StartIcon,
656726
starter: StartIcon,
657727
stripe: StripeIcon,
658728
sts: STSIcon,
729+
sts_v2: STSIcon,
659730
stt: STTIcon,
660731
stt_v2: STTIcon,
661732
supabase: SupabaseIcon,
662733
table: Table,
663734
table_v2: Table,
664735
tailscale: TailscaleIcon,
736+
tailscale_v2: TailscaleIcon,
665737
tavily: TavilyIcon,
738+
tavily_v2: TavilyIcon,
666739
telegram: TelegramIcon,
667740
temporal: TemporalIcon,
668741
textract: TextractIcon,
669742
textract_v2: TextractIcon,
743+
textract_v3: TextractIcon,
670744
thinking: BrainIcon,
671745
thrive: ThriveIcon,
672746
tiktok: TikTokIcon,
@@ -675,13 +749,15 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
675749
translate: TranslateIcon,
676750
trello: TrelloIcon,
677751
trigger_dev: TriggerDevIcon,
752+
trigger_dev_v2: TriggerDevIcon,
678753
tts: TTSIcon,
679754
twilio: TwilioIcon,
680755
twilio_sms: TwilioIcon,
681756
twilio_voice: TwilioIcon,
682757
typeform: TypeformIcon,
683758
upstash: UpstashIcon,
684759
uptimerobot: UptimeRobotIcon,
760+
uptimerobot_v2: UptimeRobotIcon,
685761
vanta: VantaIcon,
686762
variables: VariableIcon,
687763
vercel: VercelIcon,
@@ -704,9 +780,12 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
704780
workflow_input: WorkflowIcon,
705781
x: xIcon,
706782
youcom: YouComIcon,
783+
youcom_v2: YouComIcon,
707784
youtube: YouTubeIcon,
785+
youtube_v2: YouTubeIcon,
708786
zendesk: ZendeskIcon,
709787
zep: ZepIcon,
788+
zep_v2: ZepIcon,
710789
zerobounce: ZeroBounceIcon,
711790
zoho_desk: ZohoDeskIcon,
712791
zoom: ZoomIcon,

0 commit comments

Comments
 (0)