mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-05-27 19:25:15 +02:00
lib/posthog/events.ts was importing from components/assistant-ui/..., creating an inverted dependency layer (lib → components). Move ConnectorTelemetryMeta type, CONNECTOR_TELEMETRY_REGISTRY, getConnectorTelemetryMeta, and getReauthEndpoint into the new lib/connector-telemetry.ts module so that lib/ no longer depends upward into the UI tree. connector-constants.ts now re-exports from the new module for backward compatibility. Fixes #1375
149 lines
4.6 KiB
TypeScript
149 lines
4.6 KiB
TypeScript
import { EnumConnectorName } from "@/contracts/enums/connector";
|
|
import type { SearchSourceConnector } from "@/contracts/types/connector.types";
|
|
import {
|
|
OAUTH_CONNECTORS,
|
|
COMPOSIO_CONNECTORS,
|
|
CRAWLERS,
|
|
OTHER_CONNECTORS,
|
|
} from "@/components/assistant-ui/connector-popup/constants/connector-constants";
|
|
|
|
// =============================================================================
|
|
// Connector Telemetry Types & Registry
|
|
// =============================================================================
|
|
|
|
export type ConnectorTelemetryGroup =
|
|
| "oauth"
|
|
| "composio"
|
|
| "crawler"
|
|
| "other"
|
|
| "unknown";
|
|
|
|
export interface ConnectorTelemetryMeta {
|
|
connector_type: string;
|
|
connector_title: string;
|
|
connector_group: ConnectorTelemetryGroup;
|
|
is_oauth: boolean;
|
|
}
|
|
|
|
/**
|
|
* Single source of truth for "what does this connector_type look like in
|
|
* analytics?". Any connector added to the lists above is automatically
|
|
* picked up here, so adding a new integration does NOT require touching
|
|
* `lib/posthog/events.ts` or per-connector tracking code.
|
|
*/
|
|
const CONNECTOR_TELEMETRY_REGISTRY: ReadonlyMap<
|
|
string,
|
|
ConnectorTelemetryMeta
|
|
> = (() => {
|
|
const map = new Map<string, ConnectorTelemetryMeta>();
|
|
|
|
for (const c of OAUTH_CONNECTORS) {
|
|
map.set(c.connectorType, {
|
|
connector_type: c.connectorType,
|
|
connector_title: c.title,
|
|
connector_group: "oauth",
|
|
is_oauth: true,
|
|
});
|
|
}
|
|
for (const c of COMPOSIO_CONNECTORS) {
|
|
map.set(c.connectorType, {
|
|
connector_type: c.connectorType,
|
|
connector_title: c.title,
|
|
connector_group: "composio",
|
|
is_oauth: true,
|
|
});
|
|
}
|
|
for (const c of CRAWLERS) {
|
|
map.set(c.connectorType, {
|
|
connector_type: c.connectorType,
|
|
connector_title: c.title,
|
|
connector_group: "crawler",
|
|
is_oauth: false,
|
|
});
|
|
}
|
|
for (const c of OTHER_CONNECTORS) {
|
|
map.set(c.connectorType, {
|
|
connector_type: c.connectorType,
|
|
connector_title: c.title,
|
|
connector_group: "other",
|
|
is_oauth: false,
|
|
});
|
|
}
|
|
|
|
return map;
|
|
})();
|
|
|
|
/**
|
|
* Returns telemetry metadata for a connector_type, or a minimal "unknown"
|
|
* record so tracking never no-ops for connectors that exist in the backend
|
|
* but were forgotten in the UI registry.
|
|
*/
|
|
export function getConnectorTelemetryMeta(
|
|
connectorType: string,
|
|
): ConnectorTelemetryMeta {
|
|
const hit = CONNECTOR_TELEMETRY_REGISTRY.get(connectorType);
|
|
if (hit) return hit;
|
|
|
|
return {
|
|
connector_type: connectorType,
|
|
connector_title: connectorType,
|
|
connector_group: "unknown",
|
|
is_oauth: false,
|
|
};
|
|
}
|
|
|
|
// =============================================================================
|
|
// Reauth Endpoint Resolution
|
|
// =============================================================================
|
|
|
|
/**
|
|
* Legacy (non-MCP) OAuth reauth endpoints, keyed by connector type.
|
|
* These are used for connectors that were NOT created via MCP OAuth.
|
|
*/
|
|
const LEGACY_REAUTH_ENDPOINTS: Partial<Record<string, string>> = {
|
|
[EnumConnectorName.LINEAR_CONNECTOR]:
|
|
"/api/v1/auth/linear/connector/reauth",
|
|
[EnumConnectorName.JIRA_CONNECTOR]:
|
|
"/api/v1/auth/jira/connector/reauth",
|
|
[EnumConnectorName.NOTION_CONNECTOR]:
|
|
"/api/v1/auth/notion/connector/reauth",
|
|
[EnumConnectorName.GOOGLE_DRIVE_CONNECTOR]:
|
|
"/api/v1/auth/google/drive/connector/reauth",
|
|
[EnumConnectorName.GOOGLE_GMAIL_CONNECTOR]:
|
|
"/api/v1/auth/google/gmail/connector/reauth",
|
|
[EnumConnectorName.GOOGLE_CALENDAR_CONNECTOR]:
|
|
"/api/v1/auth/google/calendar/connector/reauth",
|
|
[EnumConnectorName.COMPOSIO_GOOGLE_DRIVE_CONNECTOR]:
|
|
"/api/v1/auth/composio/connector/reauth",
|
|
[EnumConnectorName.COMPOSIO_GMAIL_CONNECTOR]:
|
|
"/api/v1/auth/composio/connector/reauth",
|
|
[EnumConnectorName.COMPOSIO_GOOGLE_CALENDAR_CONNECTOR]:
|
|
"/api/v1/auth/composio/connector/reauth",
|
|
[EnumConnectorName.ONEDRIVE_CONNECTOR]:
|
|
"/api/v1/auth/onedrive/connector/reauth",
|
|
[EnumConnectorName.DROPBOX_CONNECTOR]:
|
|
"/api/v1/auth/dropbox/connector/reauth",
|
|
[EnumConnectorName.CONFLUENCE_CONNECTOR]:
|
|
"/api/v1/auth/confluence/connector/reauth",
|
|
[EnumConnectorName.TEAMS_CONNECTOR]:
|
|
"/api/v1/auth/teams/connector/reauth",
|
|
[EnumConnectorName.DISCORD_CONNECTOR]:
|
|
"/api/v1/auth/discord/connector/reauth",
|
|
};
|
|
|
|
/**
|
|
* Resolve the reauth endpoint for a connector.
|
|
*
|
|
* MCP OAuth connectors (those with ``config.mcp_service``) dynamically build
|
|
* the URL from the service key. Legacy OAuth connectors fall back to the
|
|
* static ``LEGACY_REAUTH_ENDPOINTS`` map.
|
|
*/
|
|
export function getReauthEndpoint(
|
|
connector: SearchSourceConnector,
|
|
): string | undefined {
|
|
const mcpService = connector.config?.mcp_service as string | undefined;
|
|
if (mcpService) {
|
|
return `/api/v1/auth/mcp/${mcpService}/connector/reauth`;
|
|
}
|
|
return LEGACY_REAUTH_ENDPOINTS[connector.connector_type];
|
|
}
|