feat(credentials): saved credentials for 17 more blocks, GitLab tokens, and keyless hardening
Merged
WA
1d ago+3575+3575+0123456789012345678901234567890123456789-891-891-012345678901234567890123456789
Summary
- 17 more blocks get a saved credential and a credential-only version, the same way as #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
apiorread_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_claimother thansub), as AWS roles already were. - Keyless stays off unless the issuer is
httpson the default port. - The docs now cover zero-downtime key rotation, issuer requirements, finding the service principal ID, and troubleshooting.
- Saving a keyless Databricks connection refuses a federation policy that also trusts other Sim credentials (a
- Carries the two fixes that missed #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: trueandsunset. 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.tscovers 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
provesKeyoption: 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
providerFailureCodenow decides caller error vs provider outage, shared by the validators,throwForProviderResponseand 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. Fullcheck:auditsand 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-auditauthoring gate) - No new warnings introduced
- I confirm that I have read and agree to the terms outlined in the Contributor License Agreement (CLA)