Skip to content

feat(credentials): saved credentials for 17 more blocks, GitLab tokens, and keyless hardening - #9840

Merged
waleedlatif1 merged 16 commits into
stagingfrom
feat/saved-credentials-batch-2
Nov 10, 2026
Merged

waleedlatif1 merged 16 commits into
stagingfrom
feat/saved-credentials-batch-2

Conversation

@waleedlatif1

@waleedlatif1 waleedlatif1 commented Nov 10, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • 17 more blocks get a saved credential and a credential-only version, the same way as feat(credentials): saved credentials and credential-only block versions, with keyless AWS/Databricks OIDC #9763: Ashby, Calendly, Checkr, Fathom, Grain (grain_v3), Granola, Lemlist, PagerDuty, Resend, Rootly, Sentry, Stripe, Telegram, Typeform, Vercel, WhatsApp, and GitLab.
  • GitLab: a GitLab credential holds a personal, project, or group access token plus the instance host (gitlab.com or self-managed). Saving checks the token's self-lookup at that exact host (SSRF-guarded, no redirects) and requires an active token with api or read_api; runs only reach the verified host. Copilot's GitLab personal tokens keep working (visibility now resolves the current GitLab version), and the GitLab integration page offers personal tokens and saved access tokens side by side.
  • Credential picker sits right under the Operation picker in every credential-only block (all 96), instead of wherever the old key field was. Nothing else moves; saved values are keyed by id.
  • Keyless hardening:
    • Saving a keyless Databricks connection refuses a federation policy that also trusts other Sim credentials (a subject_claim other than sub), as AWS roles already were.
    • Keyless stays off unless the issuer is https on the default port.
    • The docs now cover zero-downtime key rotation, issuer requirements, finding the service principal ID, and troubleshooting.
  • Carries the two fixes that missed feat(credentials): saved credentials and credential-only block versions, with keyless AWS/Databricks OIDC #9763's merge:
    • Scoped-but-valid keys are accepted on save for ElevenLabs, Instantly, Square, Tailscale and YouTube.
    • A malformed retiring signing key no longer disables keyless.
    • Databricks token failures use the shared credential codes.

Existing workflows don't change

  • Legacy blocks only gain hideFromToolbar: true and sunset. Telegram's params builder is extracted and the legacy block still calls it with its original bot-token check (blocks/legacy-builders.test.ts).
  • serializer/saved-credentials.test.ts covers every legacy block (still requires its inline secret) and every successor (runs on a credential alone, per operation).

Validators

  • Each vendor check is one cheap documented read on the tools' own host and auth. A fake key was sent to every endpoint to confirm it's rejected.
  • New provesKey option: an error body that names a missing permission still proves the key. It's used for Ashby (missing_endpoint_permission), Resend (restricted_api_key) and ElevenLabs (missing_permissions).
  • Typeform rejects every 403, because it answers unknown tokens with 403.
  • One providerFailureCode now decides caller error vs provider outage, shared by the validators, throwForProviderResponse and Databricks.
  • WhatsApp's phone number ID can no longer leave its URL path segment.

Held back

  • Semrush: its free balance check returns 200 "0" for unknown keys.
  • Not single-key blocks:
    • LogRocket, Pinecone, Tinybird, Clay, Devin and EmailBison need a user host or account ID.
    • Railway's header depends on the token type.
    • Mintlify uses two key types in one field.
    • RevenueCat has no side-effect-free check.
    • Greenhouse already uses OAuth.
  • Hosted-key, database, and multi-secret blocks are out of scope for this pattern.
  • Keyless for Microsoft Entra and Google Cloud: follow-up PRs. Keyless into GitLab isn't possible, since GitLab's API doesn't accept outside OIDC tokens.

Type of Change

  • New feature

Testing

  • New and updated tests:
    • Validators: Ashby, Resend, ElevenLabs, Typeform, Vercel and GitLab.
    • Databricks keyless save: exchange body, any-subject refusal, and a probe that can't complete.
    • Issuer https/port guard.
    • Picker placement and the stated-required rule.
    • Telegram legacy builder.
    • WhatsApp path segment.
    • GitLab personal-token visibility after the version bump.
    • Each guard was reverted to watch its test go red.
  • Targeted Vitest runs over the touched areas, bun run lint, type-check (pre-push), check-block-registry.ts origin/staging, and the docs, docs-manifest, deployment-config, block-successors, tool-metadata, integration-catalog, canvas-sentences, boundaries, client-boundary, application-graph, integration-access, tool-registry-boundary, react-query, test-pattern, comment, utils, explicit-any, file-names and source-conventions audits. Full check:audits and the full suite run in CI.
  • Three rounds of parallel audits: per block (all 17), cross-cutting, keyless, picker placement across all 96 successors, GitLab end to end, and a backwards-compatibility run that dumped every block, all tools and all 80 existing validators at HEAD and staging and diffed them (only the intended changes differ; Telegram's extracted builder gives identical output and errors for every operation).

Checklist

  • Code follows project style guidelines
  • Self-reviewed my changes
  • Tests added/updated and passing (new tests pass the test-audit authoring gate)
  • No new warnings introduced
  • I confirm that I have read and agree to the terms outlined in the Contributor License Agreement (CLA)

@vercel

vercel Bot commented Nov 10, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
docs Ready Ready Preview Nov 10, 2026 7:20pm UTC

Request Review

@greptile-apps

greptile-apps Bot commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[High impact] The PR appears safe to merge; no new actionable issues were established.

Summary

Adds saved credentials and credential-only versions for 17 integrations, including host-bound GitLab access tokens.

  • People can use saved credentials with 17 more integration blocks.
  • Saved-credential pickers appear just below each block’s operation picker.
  • GitLab credentials can store access tokens tied to a GitLab host.
  • Databricks keyless credentials are limited to policies that trust their own subject.
  • Credential checks accept scoped keys and keep WhatsApp IDs inside one URL segment.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[Choose saved credential] --> B[Authorize credential use]
  B --> C[Resolve token and saved host]
  C --> D[Overwrite credential-supplied fields]
  D --> E[Run integration tool]
  E --> F[Check request destination]
Loading

Reviews (3) · Last reviewed commit: "fix(credentials): address review round 2" · Reviewed by Greptile

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 499 files

Confidence score: 4/5

  • icon-mapping.ts drops the icon for the still-registered grain_v2 block, so legacy integration surfaces can show an undefined icon. Retain both grain_v2 and grain_v3 entries.
Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="apps/sim/lib/integrations/icon-mapping.ts">

<violation number="1" location="apps/sim/lib/integrations/icon-mapping.ts:459">
P3: This replacement drops the icon mapping for the still-registered `grain_v2` legacy block. Retain both `grain_v2` and `grain_v3` entries so legacy integration surfaces do not receive an undefined icon.</violation>
</file>

Note: This PR contains a large number of files. cubic selects up to 200 of the highest-priority eligible files for this review, so some files may not have been reviewed.

Turn on auto-fix | Re-trigger cubic

@waleedlatif1
waleedlatif1 force-pushed the feat/saved-credentials-batch-2 branch from 7bfa423 to a11573a Compare November 10, 2026 19:04
@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@greptile

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@cubic-dev-ai review this PR

@cubic-dev-ai

cubic-dev-ai Bot commented Nov 10, 2026

Copy link
Copy Markdown
Contributor

@cubic-dev-ai review this PR

@waleedlatif1 I have started the AI code review. It will take a few minutes to complete.

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 499 files

Note: This PR contains a large number of files. cubic selects up to 200 of the highest-priority eligible files for this review, so some files may not have been reviewed.

Turn on auto-fix | Re-trigger cubic

… 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.
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.
…on 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.
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.
…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).
…er 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.
…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.
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.
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.
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.
@waleedlatif1
waleedlatif1 force-pushed the feat/saved-credentials-batch-2 branch from a11573a to 841091c Compare November 10, 2026 19:15
@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@greptile

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@cubic-dev-ai review this PR

@cubic-dev-ai

cubic-dev-ai Bot commented Nov 10, 2026

Copy link
Copy Markdown
Contributor

@cubic-dev-ai review this PR

@waleedlatif1 I have started the AI code review. It will take a few minutes to complete.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 499 files

Confidence score: 5/5

  • Automated review surfaced no issues in the provided summaries.
  • No files require special attention.

Note: This PR contains a large number of files. cubic selects up to 200 of the highest-priority eligible files for this review, so some files may not have been reviewed.

Turn on auto-fix | Re-trigger cubic

This branch was successfully deployed

1 active deployment
Preview — 841091cc Deployed Nov 10, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant