Skip to content

Commit 106310e

Browse files
authored
feat(credentials): saved credentials for 17 more blocks, GitLab tokens, and keyless hardening (#9840)
* fix(credentials): accept scoped keys on save, isolate the retiring signing key, surface Databricks token errors * improvement(credentials): report Databricks token failures in the shared service-account codes * feat(credentials): saved credentials and credential-only versions for 17 more token blocks Ashby, Calendly, Checkr, Fathom, Grain (v3), Granola, Lemlist, PagerDuty, Resend, Rootly, Semrush, Sentry, Stripe, Telegram, Typeform, Vercel and WhatsApp get a token credential with a vendor check on save and a credential-only successor. Legacy blocks only gain hideFromToolbar and a sunset; Telegram's params builder is extracted so the legacy block keeps its bot-token check. * fix(credentials): close batch-2 audit findings Restricted keys that name their missing permission (Ashby, Resend, ElevenLabs) are accepted through a provesKey check; Typeform rejects every 403; WhatsApp keeps the phone number ID in its own path segment; Semrush is held back because its free balance check accepts unknown keys. * improvement(credentials): put the credential picker under the operation picker and share the provider-failure split Credential-only blocks now show their saved-credential picker right under the operation picker. Validators reuse the tools' header builders, one providerFailureCode decides caller vs provider errors (a Databricks token reply without a token is the provider misbehaving), and new providers sit in alphabetical order. * fix(credentials): harden keyless sign-in for AWS and Databricks Saving a keyless Databricks connection now refuses a federation policy that trusts every Sim subject, as AWS roles already were. Keyless stays off when the issuer isn't https on the default port, and an unpinned issuer is logged. Docs cover a zero-downtime key rotation, the issuer requirements, finding the service principal ID, and troubleshooting. * feat(credentials): saved GitLab token credential and credential-only gitlab_v2 A GitLab credential holds a personal, project, or group access token and the instance host (gitlab.com or self-managed). Saving verifies the token's self-lookup at that exact host over the SSRF-guarded fetch with no redirects and requires an active token with an API scope; runs only reach the verified host. Successors may now state the picker's required rule when the replaced fields differ (GitLab's host was optional). * fix(credentials): close final-audit findings on keyless wording, issuer logs, and WhatsApp IDs The Databricks refusal names the real cause (a subject_claim other than sub), the issuer failure log points at the key or issuer, the AWS troubleshooting leads with the message users see, rotation steps cover background workers, and a WhatsApp phone number ID can no longer leave its path segment. * fix(credentials): keep GitLab personal tokens available after GitLab moves to gitlab_v2 Personal-token visibility resolved the GitLab integration by the legacy block type, so hiding that block and renaming its catalog entry hid every existing personal token and refused new ones. It now resolves the current GitLab version, and the integration page lists personal tokens beside saved GitLab credentials. * chore(credentials): cleanup pass on the batch-2 changes * chore(credentials): shrink the unused-exports baseline * fix(credentials): type the GitLab check's secure-fetch response * fix(credentials): address review round 1 GitLab's integration page offers personal tokens and saved access tokens side by side, a malformed GitLab token lookup reports the provider as unavailable, and the keyless issuer refuses a query string or fragment. * fix(credentials): close the PR-wide audit findings Docs describe credential-only Telegram and Typeform actions and the issuer's query/fragment refusal, PagerDuty and Grain copy name every token type that works, Granola accepts a key whose note scope an admin turned off, a GitLab reply that isn't a token lookup reports the provider, and Semrush's catalog entry matches staging exactly. * improvement(credentials): simplify and clean up the review-round changes * fix(credentials): address review round 2 Ashby's restricted-key check reads the missing permission from object-shaped error entries too, and a GitLab host that doesn't resolve is reported as not found instead of the provider being unavailable.
1 parent b68b2d9 commit 106310e

499 files changed

Lines changed: 3575 additions & 891 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: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
355355
arxiv: ArxivIcon,
356356
asana: AsanaIcon,
357357
ashby: AshbyIcon,
358+
ashby_v2: AshbyIcon,
358359
athena: AthenaIcon,
359360
athena_v2: AthenaIcon,
360361
attio: AttioIcon,
@@ -374,9 +375,11 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
374375
buffer_v2: BufferIcon,
375376
calcom: CalComIcon,
376377
calendly: CalendlyIcon,
378+
calendly_v2: CalendlyIcon,
377379
cbinsights: CbInsightsIcon,
378380
chat_trigger: Task,
379381
checkr: CheckrIcon,
382+
checkr_v2: CheckrIcon,
380383
circleback: CirclebackIcon,
381384
circleback_v2: CirclebackIcon,
382385
clay: ClayIcon,
@@ -449,6 +452,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
449452
extend_v2: ExtendIcon,
450453
extend_v3: ExtendIcon,
451454
fathom: FathomIcon,
455+
fathom_v2: FathomIcon,
452456
file: DocumentIcon,
453457
file_v2: DocumentIcon,
454458
file_v3: DocumentIcon,
@@ -472,6 +476,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
472476
github: GithubIcon,
473477
github_v2: GithubIcon,
474478
gitlab: GitLabIcon,
479+
gitlab_v2: GitLabIcon,
475480
gmail: GmailIcon,
476481
gmail_v2: GmailIcon,
477482
gong: GongIcon,
@@ -503,7 +508,9 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
503508
grafana: GrafanaIcon,
504509
grain: GrainIcon,
505510
grain_v2: GrainIcon,
511+
grain_v3: GrainIcon,
506512
granola: GranolaIcon,
513+
granola_v2: GranolaIcon,
507514
greenhouse: GreenhouseIcon,
508515
greenhouse_v2: GreenhouseIcon,
509516
greptile: GreptileIcon,
@@ -558,6 +565,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
558565
launchdarkly_v2: LaunchDarklyIcon,
559566
leadmagic: LeadMagicIcon,
560567
lemlist: LemlistIcon,
568+
lemlist_v2: LemlistIcon,
561569
linear: LinearIcon,
562570
linear_v2: LinearIcon,
563571
linkedin: LinkedInIcon,
@@ -622,6 +630,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
622630
otter_v2: OtterIcon,
623631
outlook: OutlookIcon,
624632
pagerduty: PagerDutyIcon,
633+
pagerduty_v2: PagerDutyIcon,
625634
parallel_ai: ParallelIcon,
626635
peopledatalabs: PeopleDataLabsIcon,
627636
perplexity: PerplexityIcon,
@@ -663,13 +672,15 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
663672
reducto_v2: ReductoIcon,
664673
reducto_v3: ReductoIcon,
665674
resend: ResendIcon,
675+
resend_v2: ResendIcon,
666676
response: ResponseIcon,
667677
revenuecat: RevenueCatIcon,
668678
rippling: RipplingIcon,
669679
rippling_v2: RipplingIcon,
670680
rocketlane: RocketlaneIcon,
671681
rocketlane_v2: RocketlaneIcon,
672682
rootly: RootlyIcon,
683+
rootly_v2: RootlyIcon,
673684
router: ConnectIcon,
674685
router_v2: ConnectIcon,
675686
rss: RssIcon,
@@ -688,6 +699,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
688699
sendgrid: SendgridIcon,
689700
sendgrid_v2: SendgridIcon,
690701
sentry: SentryIcon,
702+
sentry_v2: SentryIcon,
691703
serper: SerperIcon,
692704
servicenow: ServiceNowIcon,
693705
servicenow_v2: ServiceNowIcon,
@@ -725,6 +737,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
725737
start_trigger: StartIcon,
726738
starter: StartIcon,
727739
stripe: StripeIcon,
740+
stripe_v2: StripeIcon,
728741
sts: STSIcon,
729742
sts_v2: STSIcon,
730743
stt: STTIcon,
@@ -737,6 +750,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
737750
tavily: TavilyIcon,
738751
tavily_v2: TavilyIcon,
739752
telegram: TelegramIcon,
753+
telegram_v2: TelegramIcon,
740754
temporal: TemporalIcon,
741755
textract: TextractIcon,
742756
textract_v2: TextractIcon,
@@ -755,12 +769,14 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
755769
twilio_sms: TwilioIcon,
756770
twilio_voice: TwilioIcon,
757771
typeform: TypeformIcon,
772+
typeform_v2: TypeformIcon,
758773
upstash: UpstashIcon,
759774
uptimerobot: UptimeRobotIcon,
760775
uptimerobot_v2: UptimeRobotIcon,
761776
vanta: VantaIcon,
762777
variables: VariableIcon,
763778
vercel: VercelIcon,
779+
vercel_v2: VercelIcon,
764780
video_generator: VideoIcon,
765781
video_generator_v2: VideoIcon,
766782
video_generator_v3: VideoIcon,
@@ -771,6 +787,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
771787
webflow: WebflowIcon,
772788
webhook_request: WebhookIcon,
773789
whatsapp: WhatsAppIcon,
790+
whatsapp_v2: WhatsAppIcon,
774791
wikipedia: WikipediaIcon,
775792
windchill: WindchillIcon,
776793
wiza: WizaIcon,

0 commit comments

Comments
 (0)