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 {