From bd83799fddf342e808d9cdce4bad9cd0c1e139be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Sibiril?= <81782+aureliensibiril@users.noreply.github.com> Date: Thu, 28 May 2026 23:44:43 +0200 Subject: [PATCH] Register Cursor access-review connector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wire Cursor into the connector-provider registry as an API-key, single-tenant connector using HTTP Basic auth, with no picker, settings, or name resolver. Add the CURSOR enum value, its migration, and the GraphQL enum binding so the provider is accepted across the API surface. Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com> --- pkg/connector/provider/builtin.go | 1 + pkg/connector/provider/cursor.go | 51 +++++++++++++++++++ pkg/coredata/connector_provider.go | 5 +- pkg/coredata/migrations/20260528T497204Z.sql | 15 ++++++ .../api/console/v1/graphql/connector.graphql | 1 + 5 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 pkg/connector/provider/cursor.go create mode 100644 pkg/coredata/migrations/20260528T497204Z.sql diff --git a/pkg/connector/provider/builtin.go b/pkg/connector/provider/builtin.go index 92f85bf53..45130eac0 100644 --- a/pkg/connector/provider/builtin.go +++ b/pkg/connector/provider/builtin.go @@ -28,6 +28,7 @@ func NewBuiltinRegistry() *Registry { brexRegistration(), clickupRegistration(), cloudflareRegistration(), + cursorRegistration(), docusignRegistration(), githubRegistration(), gitlabRegistration(), diff --git a/pkg/connector/provider/cursor.go b/pkg/connector/provider/cursor.go new file mode 100644 index 000000000..f154423f4 --- /dev/null +++ b/pkg/connector/provider/cursor.go @@ -0,0 +1,51 @@ +// Copyright (c) 2026 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package provider + +import ( + "context" + "net/http" + + "go.gearno.de/kit/log" + "go.probo.inc/probo/pkg/accessreview/drivers" + "go.probo.inc/probo/pkg/coredata" +) + +func cursorRegistration() *Registration { + return &Registration{ + Provider: coredata.ConnectorProviderCursor, + DisplayName: "Cursor", + SupportsAPIKey: true, + // Cursor's Admin API has no third-party OAuth2 flow; it + // authenticates with a team admin key (key_...) presented as the + // HTTP Basic auth username with an empty password ("-u :") + // and rejects Bearer tokens. APIKeyBasicAuth selects that scheme + // on the APIKeyConnection. The key is bound to a single team, so + // there is nothing to pick (Pattern 3): no settings struct, no + // picker, and no SetOrganizationSettings. + APIKeyBasicAuth: true, + // ProbeURL is intentionally empty. API-key connectors skip the + // connection probe entirely (it runs only for OAuth2), so a probe + // URL would be dead config; a dead key surfaces on the first + // ListAccounts instead. + // + // No NewNameResolver: the Admin API exposes no team/organization + // name endpoint, so the source keeps its generic name (the + // source-name worker degrades gracefully when no resolver is set). + NewDriver: func(_ context.Context, c *http.Client, _ *coredata.Connector, _ *log.Logger) (drivers.Driver, error) { + return drivers.NewCursorDriver(c), nil + }, + } +} diff --git a/pkg/coredata/connector_provider.go b/pkg/coredata/connector_provider.go index 0d7d85ad8..1d19f66a0 100644 --- a/pkg/coredata/connector_provider.go +++ b/pkg/coredata/connector_provider.go @@ -51,6 +51,7 @@ const ( ConnectorProviderMonday ConnectorProvider = "MONDAY" ConnectorProviderTailscale ConnectorProvider = "TAILSCALE" ConnectorProviderAnthropic ConnectorProvider = "ANTHROPIC" + ConnectorProviderCursor ConnectorProvider = "CURSOR" ) var ( @@ -89,6 +90,7 @@ func ConnectorProviders() []ConnectorProvider { ConnectorProviderMonday, ConnectorProviderTailscale, ConnectorProviderAnthropic, + ConnectorProviderCursor, } } @@ -122,7 +124,8 @@ func (v ConnectorProvider) IsValid() bool { ConnectorProviderVercel, ConnectorProviderMonday, ConnectorProviderTailscale, - ConnectorProviderAnthropic: + ConnectorProviderAnthropic, + ConnectorProviderCursor: return true } diff --git a/pkg/coredata/migrations/20260528T497204Z.sql b/pkg/coredata/migrations/20260528T497204Z.sql new file mode 100644 index 000000000..45288302f --- /dev/null +++ b/pkg/coredata/migrations/20260528T497204Z.sql @@ -0,0 +1,15 @@ +-- Copyright (c) 2026 Probo Inc . +-- +-- Permission to use, copy, modify, and/or distribute this software for any +-- purpose with or without fee is hereby granted, provided that the above +-- copyright notice and this permission notice appear in all copies. +-- +-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +-- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +-- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +-- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +-- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +-- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +-- PERFORMANCE OF THIS SOFTWARE. + +ALTER TYPE connector_provider ADD VALUE IF NOT EXISTS 'CURSOR'; diff --git a/pkg/server/api/console/v1/graphql/connector.graphql b/pkg/server/api/console/v1/graphql/connector.graphql index 4dfb5a2b3..3bae6abba 100644 --- a/pkg/server/api/console/v1/graphql/connector.graphql +++ b/pkg/server/api/console/v1/graphql/connector.graphql @@ -50,6 +50,7 @@ enum ConnectorProvider @goEnum( value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderAnthropic" ) + CURSOR @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderCursor") } type ConnectorProviderInfo {