Files
probo/pkg/server/api/console/v1/graphql/connector.graphql
Aurélien Sibiril a0d3806c21 Add four API-key access-review connectors
Add Pylon, OpenRouter, incident.io and Brevo as access-review connectors.
All are API-key, single-tenant providers (Pattern 3): the key identifies
one tenant, so there is no OAuth flow, picker UI, or bootstrap/helm
configuration.

- Pylon: Bearer token, GET /users; resolves each user's opaque role_id to
  a role name via GET /user-roles, with cursor pagination.
- OpenRouter: Bearer management key, GET /api/v1/organization/members. The
  endpoint requires an organization account -- a personal key authenticates
  but returns 404 -- so the connection probe rejects 404 on top of 401/403
  (doProbeRequest gained an opt-in extra-reject set) to surface a non-org
  key at connect time instead of mid-campaign.
- incident.io: Bearer token, GET /v2/users. Its OAuth is outbound-only, so
  the API key is the inbound path; live base_role/custom_roles take
  precedence over the deprecated role enum.
- Brevo: API key in the api-key header (Registration.APIKeyHeader), GET
  /v3/organization/invited/users. A live recording corrected the documented
  schema: is_owner is a JSON boolean (not a string) and an id field is
  present, so it is used as the stable ExternalID.

The OpenRouter and Brevo cassettes are anonymized live recordings; Pylon
and incident.io use hand-authored fixtures (no self-serve test tenant). The
shared three-valued active-status mapping is consolidated into
activeFromStatus in driver.go.

Each adds the enum value, migration, GraphQL binding, provider
Registration, a driver with a cassette-driven test, and a brand logo.

Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com>
2026-06-24 22:22:51 +02:00

213 lines
7.4 KiB
GraphQL

enum ConnectorProvider
@goModel(model: "go.probo.inc/probo/pkg/coredata.ConnectorProvider") {
SLACK @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderSlack")
GOOGLE_WORKSPACE
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderGoogleWorkspace"
)
LINEAR @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderLinear")
ONE_PASSWORD
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderOnePassword"
)
HUBSPOT
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderHubSpot")
DOCUSIGN
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderDocuSign")
GRAFANA
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderGrafana")
NOTION @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderNotion")
BREX @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderBrex")
TALLY @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderTally")
CLOUDFLARE
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderCloudflare")
OPENAI @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderOpenAI")
POSTHOG @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderPostHog")
SENTRY @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderSentry")
SIGNOZ
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderSigNoz")
SUPABASE
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderSupabase")
BETTER_STACK
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderBetterStack"
)
GITHUB @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderGitHub")
INTERCOM
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderIntercom")
RESEND @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderResend")
SENDGRID
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderSendGrid")
MICROSOFT_365
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderMicrosoft365"
)
GITLAB @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderGitLab")
BITBUCKET
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderBitbucket")
HEROKU @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderHeroku")
PAGERDUTY
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderPagerDuty")
ASANA @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderAsana")
NETLIFY
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderNetlify")
CLICKUP
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderClickUp")
CLERK @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderClerk")
VERCEL @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderVercel")
MONDAY @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderMonday")
METABASE
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderMetabase")
TAILSCALE
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderTailscale")
ANTHROPIC
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderAnthropic"
)
CURSOR @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderCursor")
DATADOG @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderDatadog")
OKTA @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderOkta")
ZENDESK @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderZendesk")
QOVERY @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderQovery")
RENDER @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderRender")
NEON @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderNeon")
MERCURY
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderMercury")
APOLLO @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderApollo")
DEEPGRAM
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderDeepgram")
CLICKHOUSE
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderClickHouse"
)
LANGFUSE
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderLangfuse")
PYLON @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderPylon")
OPENROUTER
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderOpenRouter"
)
INCIDENT_IO
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderIncidentIO"
)
BREVO @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderBrevo")
}
type ConnectorProviderInfo {
provider: ConnectorProvider!
displayName: String!
oauthConfigured: Boolean!
apiKeySupported: Boolean!
clientCredentialsSupported: Boolean!
oauth2Scopes: [String!]!
extraSettings: [ConnectorProviderSettingInfo!]!
}
type ConnectorProviderSettingInfo {
key: String!
label: String!
required: Boolean!
}
input ConnectorFilter {
providers: [ConnectorProvider!]
}
type Connector {
id: ID!
provider: ConnectorProvider!
oauth2Scopes: [String!]! @goField(forceResolver: true)
createdAt: Datetime!
}
type SlackConnection implements Node {
id: ID!
channel: String
channelId: String
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
}
type SlackConnectionConnection {
edges: [SlackConnectionEdge!]!
pageInfo: PageInfo!
}
type SlackConnectionEdge {
cursor: CursorKey!
node: SlackConnection!
}
extend type Mutation {
createAPIKeyConnector(
input: CreateAPIKeyConnectorInput!
): CreateAPIKeyConnectorPayload!
createClientCredentialsConnector(
input: CreateClientCredentialsConnectorInput!
): CreateClientCredentialsConnectorPayload!
deleteConnector(input: DeleteConnectorInput!): DeleteConnectorPayload!
deleteSlackConnection(
input: DeleteSlackConnectionInput!
): DeleteSlackConnectionPayload!
}
input CreateAPIKeyConnectorInput {
organizationId: ID!
provider: ConnectorProvider!
apiKey: String!
tallyOrganizationId: String
sentryOrganizationSlug: String
supabaseOrganizationSlug: String
githubOrganization: String
grafanaBaseUrl: String
signozBaseUrl: String
onePasswordScimBridgeUrl: String
metabaseInstanceUrl: String
posthogRegion: String
posthogInstanceUrl: String
oktaDomain: String
betterStackTeamName: String
qoveryOrganizationId: String
renderWorkspaceId: String
neonOrganizationId: String
langfuseBaseUrl: String
}
type CreateAPIKeyConnectorPayload {
connector: Connector!
}
input CreateClientCredentialsConnectorInput {
organizationId: ID!
provider: ConnectorProvider!
clientId: String!
clientSecret: String!
tokenUrl: String!
scope: String
onePasswordAccountId: String
onePasswordRegion: String
}
type CreateClientCredentialsConnectorPayload {
connector: Connector
}
input DeleteConnectorInput {
connectorId: ID!
}
type DeleteConnectorPayload {
deletedConnectorId: ID!
}
input DeleteSlackConnectionInput {
slackConnectionId: ID!
}
type DeleteSlackConnectionPayload {
deletedSlackConnectionId: ID!
}