import { IconChartBar, IconDatabase, IconActivity, IconCreditCard, IconShoppingCart, IconPhone, IconUserSearch, IconBrandGithub, IconTicket, IconBug, IconChartLine, IconMessage, IconFileText, IconBrandX, IconHeadset, IconUsers, IconSearch, IconCloud, IconGauge, } from "@tabler/icons-react"; import type { ComponentType } from "react"; export type DataSourceCategory = | "analytics" | "database" | "payments" | "crm" | "engineering" | "communication" | "support" | "seo"; export interface WalkthroughStep { title: string; description: string; url?: string; linkText?: string; inputKey?: string; inputLabel?: string; inputPlaceholder?: string; inputType?: "text" | "password" | "textarea"; optional?: boolean; /** Allow file upload for this input (e.g. ".json") */ inputAcceptFile?: string; } export interface DataSource { id: string; name: string; description: string; category: DataSourceCategory; icon: ComponentType>; envKeys: string[]; credentialRequirementMode?: "all" | "any"; walkthroughSteps: WalkthroughStep[]; docsUrl: string; } export const categoryLabels: Record = { analytics: "Analytics & Product", database: "Database", payments: "Payments", crm: "CRM & Sales", engineering: "Engineering", communication: "Communication", support: "Support", seo: "SEO", }; export const categoryOrder: DataSourceCategory[] = [ "analytics", "database", "payments", "crm", "engineering", "communication", "support", "seo", ]; export const dataSources: DataSource[] = [ // --- Analytics & Product --- { id: "google-analytics", name: "Google Analytics", description: "GA4 website and app analytics via the Data API", category: "analytics", icon: IconChartBar, envKeys: ["GOOGLE_APPLICATION_CREDENTIALS_JSON", "GA4_PROPERTY_ID"], docsUrl: "https://developers.google.com/analytics/devguides/reporting/data/v1", walkthroughSteps: [ { title: "Create a Google Cloud project", description: "If you don't already have one, create a project in the Google Cloud Console.", url: "https://console.cloud.google.com/projectcreate", linkText: "Create project", }, { title: "Enable the Google Analytics Data API", description: 'Search for "Google Analytics Data API" and click Enable.', url: "https://console.cloud.google.com/apis/library/analyticsdata.googleapis.com", linkText: "Enable API", }, { title: "Create a service account", description: "Go to IAM & Admin > Service Accounts, create a new service account (no IAM roles needed on the project), then click the account → Keys → Add Key → Create new key → JSON. This downloads a .json file.", url: "https://console.cloud.google.com/iam-admin/serviceaccounts", linkText: "Service Accounts", }, { title: "Add the service account to GA4", description: 'In Google Analytics, go to Admin > Property Access Management and add the service account email (from the JSON file\'s "client_email" field) with the Viewer role. This is what grants access — not IAM roles.', url: "https://analytics.google.com/analytics/web/#/a-p/admin", linkText: "GA4 Admin", }, { title: "Upload your service account credentials", description: "Upload the JSON key file you downloaded, or paste its contents.", inputKey: "GOOGLE_APPLICATION_CREDENTIALS_JSON", inputLabel: "Service Account JSON", inputPlaceholder: '{"type": "service_account", ...}', inputType: "textarea", inputAcceptFile: ".json", }, { title: "Enter your GA4 Property ID", description: 'Find this in GA4 under Admin > Property Settings. It\'s a numeric ID like "123456789".', inputKey: "GA4_PROPERTY_ID", inputLabel: "GA4 Property ID", inputPlaceholder: "123456789", inputType: "text", }, ], }, { id: "bigquery", name: "BigQuery", description: "Query your data warehouse datasets directly with SQL", category: "analytics", icon: IconDatabase, envKeys: [ "GOOGLE_APPLICATION_CREDENTIALS_JSON", "BIGQUERY_PROJECT_ID", "ANALYTICS_BIGQUERY_EVENTS_TABLE", ], docsUrl: "https://cloud.google.com/bigquery/docs", walkthroughSteps: [ { title: "Create a Google Cloud project", description: "If you don't already have one, create a project in the Google Cloud Console.", url: "https://console.cloud.google.com/projectcreate", linkText: "Create project", }, { title: "Enable the BigQuery API", description: "Enable the BigQuery API for your project.", url: "https://console.cloud.google.com/apis/library/bigquery.googleapis.com", linkText: "Enable API", }, { title: "Create a service account", description: 'Create a service account with "BigQuery Data Viewer" and "BigQuery Job User" IAM roles, then go to Keys → Add Key → Create new key → JSON to download the credentials file.', url: "https://console.cloud.google.com/iam-admin/serviceaccounts", linkText: "Service Accounts", }, { title: "Upload your service account credentials", description: "Upload the JSON key file you downloaded, or paste its contents.", inputKey: "GOOGLE_APPLICATION_CREDENTIALS_JSON", inputLabel: "Service Account JSON", inputPlaceholder: '{"type": "service_account", ...}', inputType: "textarea", inputAcceptFile: ".json", }, { title: "Enter your BigQuery Project ID", description: "The Google Cloud project ID where your BigQuery data lives.", inputKey: "BIGQUERY_PROJECT_ID", inputLabel: "Project ID", inputPlaceholder: "my-project-123", inputType: "text", }, { title: "Optional: set the default app events table alias", description: "Used only for the @app_events shortcut in examples and Explorer event discovery. Leave blank to use analytics.events_partitioned in the project above.", inputKey: "ANALYTICS_BIGQUERY_EVENTS_TABLE", inputLabel: "Default App Events Table", inputPlaceholder: "analytics.events_partitioned", inputType: "text", optional: true, }, ], }, { id: "amplitude", name: "Amplitude", description: "Product analytics — events, funnels, retention", category: "analytics", icon: IconActivity, envKeys: ["AMPLITUDE_API_KEY", "AMPLITUDE_SECRET_KEY"], docsUrl: "https://www.docs.developers.amplitude.com/analytics/apis/", walkthroughSteps: [ { title: "Go to Amplitude Settings", description: 'In Amplitude, go to Settings > Projects, select your project, and find the API keys under "General".', url: "https://app.amplitude.com/analytics/settings/projects", linkText: "Amplitude Settings", }, { title: "Enter your API Key", description: "Copy the API Key from your project settings.", inputKey: "AMPLITUDE_API_KEY", inputLabel: "API Key", inputPlaceholder: "your-amplitude-api-key", inputType: "password", }, { title: "Enter your Secret Key", description: "Copy the Secret Key from your project settings.", inputKey: "AMPLITUDE_SECRET_KEY", inputLabel: "Secret Key", inputPlaceholder: "your-amplitude-secret-key", inputType: "password", }, ], }, { id: "mixpanel", name: "Mixpanel", description: "Product analytics — events, funnels, user flows", category: "analytics", icon: IconChartLine, envKeys: ["MIXPANEL_PROJECT_ID", "MIXPANEL_SERVICE_ACCOUNT"], docsUrl: "https://developer.mixpanel.com/reference/overview", walkthroughSteps: [ { title: "Find your Project ID", description: "In Mixpanel, go to Settings > Project Settings. Your Project ID is listed at the top.", url: "https://mixpanel.com/settings/project", linkText: "Mixpanel Settings", }, { title: "Create a Service Account", description: 'Go to Settings > Service Accounts and create one with "Analyst" role. Copy the username and secret.', url: "https://mixpanel.com/settings/project#serviceaccounts", linkText: "Service Accounts", }, { title: "Enter your Project ID", description: "The numeric project ID from your Mixpanel project settings.", inputKey: "MIXPANEL_PROJECT_ID", inputLabel: "Project ID", inputPlaceholder: "123456", inputType: "text", }, { title: "Enter your Service Account credentials", description: 'Enter in "username:secret" format (e.g., "my-sa.abc123.mp-service-account:mySecretKey").', inputKey: "MIXPANEL_SERVICE_ACCOUNT", inputLabel: "Service Account (username:secret)", inputPlaceholder: "username:secret", inputType: "password", }, ], }, { id: "posthog", name: "PostHog", description: "Open-source product analytics and feature flags", category: "analytics", icon: IconGauge, envKeys: ["POSTHOG_API_KEY", "POSTHOG_PROJECT_ID"], docsUrl: "https://posthog.com/docs/api", walkthroughSteps: [ { title: "Get your API key", description: "In PostHog, go to Settings > Project > Personal API Keys and create a new key.", url: "https://app.posthog.com/settings/project#personal-api-keys", linkText: "PostHog Settings", }, { title: "Enter your API Key", description: "Paste the personal API key you just created.", inputKey: "POSTHOG_API_KEY", inputLabel: "Personal API Key", inputPlaceholder: "phx_...", inputType: "password", }, { title: "Enter your Project ID", description: "Find this in Settings > Project. It's the numeric ID shown at the top.", inputKey: "POSTHOG_PROJECT_ID", inputLabel: "Project ID", inputPlaceholder: "12345", inputType: "text", }, ], }, // --- IconDatabase --- { id: "postgresql", name: "PostgreSQL", description: "Query any PostgreSQL database directly", category: "database", icon: IconDatabase, envKeys: ["POSTGRES_URL"], docsUrl: "https://www.postgresql.org/docs/", walkthroughSteps: [ { title: "Get your connection string", description: "Get the connection URL from your database provider (Supabase, Neon, Railway, RDS, etc.). It should look like: postgresql://user:password@host:5432/dbname", url: "https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING", linkText: "Connection string docs", }, { title: "Enter your connection URL", description: "Paste the full PostgreSQL connection string. Make sure it includes the password.", inputKey: "POSTGRES_URL", inputLabel: "Connection URL", inputPlaceholder: "postgresql://user:password@host:5432/dbname", inputType: "password", }, ], }, // --- Payments --- { id: "stripe", name: "Stripe", description: "Revenue, subscriptions, and payment analytics", category: "payments", icon: IconCreditCard, envKeys: ["STRIPE_SECRET_KEY"], docsUrl: "https://stripe.com/docs/api", walkthroughSteps: [ { title: "Go to the Stripe Dashboard", description: "Navigate to Developers > API keys. Create a restricted key with read-only access, or use your secret key.", url: "https://dashboard.stripe.com/apikeys", linkText: "Stripe API Keys", }, { title: "Enter your Secret Key", description: 'Paste your secret key (starts with "sk_live_" or "sk_test_").', inputKey: "STRIPE_SECRET_KEY", inputLabel: "Secret Key", inputPlaceholder: "sk_live_...", inputType: "password", }, ], }, // --- CRM & Sales --- { id: "hubspot", name: "HubSpot", description: "CRM deals, contacts, companies, tickets, and pipelines", category: "crm", icon: IconShoppingCart, envKeys: ["HUBSPOT_PRIVATE_APP_TOKEN", "HUBSPOT_ACCESS_TOKEN"], credentialRequirementMode: "any", docsUrl: "https://developers.hubspot.com/docs/api/overview", walkthroughSteps: [ { title: "Create a Private App", description: "In HubSpot, go to Settings > Integrations > Private Apps. Create a new private app with scopes: crm.objects.contacts.read, crm.objects.deals.read, crm.objects.companies.read, and crm.objects.tickets.read.", url: "https://app.hubspot.com/private-apps/", linkText: "Private Apps", }, { title: "Enter your Private App Token", description: "Copy the access token from your private app.", inputKey: "HUBSPOT_PRIVATE_APP_TOKEN", inputLabel: "Private App Token", inputPlaceholder: "pat-na1-...", inputType: "password", }, { title: "Legacy access token", description: "Only use this if you already have an older HubSpot access token saved under the legacy key.", inputKey: "HUBSPOT_ACCESS_TOKEN", inputLabel: "Legacy Access Token", inputPlaceholder: "pat-na1-...", inputType: "password", }, ], }, { id: "gong", name: "Gong", description: "Sales call recordings, transcripts, and analytics", category: "crm", icon: IconPhone, envKeys: ["GONG_ACCESS_KEY", "GONG_ACCESS_SECRET", "GONG_API_BASE"], docsUrl: "https://gong.app.gong.io/settings/api/documentation", walkthroughSteps: [ { title: "Generate API credentials", description: "In Gong, go to Settings > API. Generate a new API key and secret.", url: "https://app.gong.io/company/api", linkText: "Gong API Settings", }, { title: "Enter your Access Key", description: "Paste the Access Key from your Gong API settings.", inputKey: "GONG_ACCESS_KEY", inputLabel: "Access Key", inputPlaceholder: "your-gong-access-key", inputType: "password", }, { title: "Enter your Access Key Secret", description: "Paste the Access Key Secret from your Gong API settings.", inputKey: "GONG_ACCESS_SECRET", inputLabel: "Access Key Secret", inputPlaceholder: "your-gong-access-key-secret", inputType: "password", }, { title: "Confirm your API Base URL", description: "Use your region-specific Gong API base URL if your account does not use the global endpoint.", inputKey: "GONG_API_BASE", inputLabel: "API Base URL", inputPlaceholder: "https://api.gong.io/v2", inputType: "text", optional: true, }, ], }, { id: "apollo", name: "Apollo", description: "Contact and company enrichment for prospecting", category: "crm", icon: IconUserSearch, envKeys: ["APOLLO_API_KEY"], docsUrl: "https://apolloio.github.io/apollo-api-docs/", walkthroughSteps: [ { title: "Get your API Key", description: "In Apollo, go to Settings > Integrations > API Keys and create a new key.", url: "https://app.apollo.io/#/settings/integrations/api-keys", linkText: "Apollo API Keys", }, { title: "Enter your API Key", description: "Paste the API key you just created.", inputKey: "APOLLO_API_KEY", inputLabel: "API Key", inputPlaceholder: "your-apollo-api-key", inputType: "password", }, ], }, { id: "clay", name: "Clay", description: "GTM search, enrichment routines, and read-only table queries through Clay's Public API", category: "crm", icon: IconUserSearch, envKeys: ["CLAY_PUBLIC_API_KEY"], docsUrl: "https://developers.clay.com/", walkthroughSteps: [ { title: "Create a Clay Public API key", description: "In Clay, go to Settings > Account > API keys (beta) and create a key for the user and workspace this connection should access.", url: "https://developers.clay.com/public-api/authentication", linkText: "Clay API authentication", }, { title: "Enter your Public API key", description: "This hosted API credential is separate from the optional local clay CLI/MCP browser-login session.", inputKey: "CLAY_PUBLIC_API_KEY", inputLabel: "Public API key", inputPlaceholder: "your-clay-public-api-key", inputType: "password", }, ], }, // --- Engineering --- { id: "github", name: "GitHub", description: "Repositories, code search, pull requests, and issues", category: "engineering", icon: IconBrandGithub, envKeys: ["GITHUB_TOKEN"], docsUrl: "https://docs.github.com/en/apps/oauth-apps/building-oauth-apps", walkthroughSteps: [ { title: "Connect with OAuth", description: "Use the Connect with GitHub button in this card to grant repository access. If OAuth is unavailable on this deployment, use a fine-grained personal access token instead.", }, { title: "Fallback: create a personal access token", description: 'Go to GitHub Settings > Developer settings > Personal access tokens > Fine-grained tokens. Create a token with "Contents", "Metadata", "Issues", and "Pull requests" read access for the repos the agent should inspect.', url: "https://github.com/settings/tokens?type=beta", linkText: "GitHub Tokens", }, { title: "Enter your Token", description: "Paste the personal access token you just created.", inputKey: "GITHUB_TOKEN", inputLabel: "Personal Access Token", inputPlaceholder: "github_pat_...", inputType: "password", }, ], }, { id: "jira", name: "Jira", description: "Tickets, sprints, and project tracking", category: "engineering", icon: IconTicket, envKeys: ["JIRA_BASE_URL", "JIRA_USER_EMAIL", "JIRA_API_TOKEN"], docsUrl: "https://developer.atlassian.com/cloud/jira/platform/rest/v3/", walkthroughSteps: [ { title: "Create an API Token", description: "Go to Atlassian account settings and create an API token.", url: "https://id.atlassian.com/manage-profile/security/api-tokens", linkText: "Atlassian API Tokens", }, { title: "Enter your Jira Base URL", description: "The base URL of your Jira instance (e.g., https://your-org.atlassian.net).", inputKey: "JIRA_BASE_URL", inputLabel: "Base URL", inputPlaceholder: "https://your-org.atlassian.net", inputType: "text", }, { title: "Enter your Jira email", description: "The email address associated with your Atlassian account.", inputKey: "JIRA_USER_EMAIL", inputLabel: "Email", inputPlaceholder: "you@company.com", inputType: "text", }, { title: "Enter your API Token", description: "Paste the API token you just created.", inputKey: "JIRA_API_TOKEN", inputLabel: "API Token", inputPlaceholder: "your-jira-api-token", inputType: "password", }, ], }, { id: "sentry", name: "Sentry", description: "Error tracking and performance monitoring", category: "engineering", icon: IconBug, envKeys: ["SENTRY_AUTH_TOKEN"], docsUrl: "https://docs.sentry.io/api/", walkthroughSteps: [ { title: "Create an Auth Token", description: 'Go to Sentry Settings > Auth Tokens. Create a token with "project:read", "org:read", and "event:read" scopes.', url: "https://sentry.io/settings/account/api/auth-tokens/", linkText: "Sentry Auth Tokens", }, { title: "Enter your Auth Token", description: "Paste the auth token you just created.", inputKey: "SENTRY_AUTH_TOKEN", inputLabel: "Auth Token", inputPlaceholder: "sntrys_...", inputType: "password", }, ], }, { id: "grafana", name: "Grafana", description: "Prometheus metrics, dashboards, and alerts", category: "engineering", icon: IconActivity, envKeys: ["GRAFANA_URL", "GRAFANA_API_TOKEN"], docsUrl: "https://grafana.com/docs/grafana/latest/developers/http_api/", walkthroughSteps: [ { title: "Get your Grafana URL", description: "The base URL of your Grafana instance (e.g., https://your-org.grafana.net).", }, { title: "Create a Service Account Token", description: "In Grafana, go to Administration > Service accounts. Create an account with Viewer role and generate a token.", url: "https://grafana.com/docs/grafana/latest/administration/service-accounts/", linkText: "Service Accounts docs", }, { title: "Enter your Grafana URL", description: "The base URL of your Grafana instance.", inputKey: "GRAFANA_URL", inputLabel: "Grafana URL", inputPlaceholder: "https://your-org.grafana.net", inputType: "text", }, { title: "Enter your API Token", description: "Paste the service account token.", inputKey: "GRAFANA_API_TOKEN", inputLabel: "API Token", inputPlaceholder: "glsa_...", inputType: "password", }, ], }, { id: "prometheus", name: "Prometheus", description: "Query PromQL directly against any Prometheus-compatible endpoint", category: "engineering", icon: IconActivity, envKeys: [ "PROMETHEUS_URL", "PROMETHEUS_USERNAME", "PROMETHEUS_PASSWORD", "PROMETHEUS_BEARER_TOKEN", ], docsUrl: "https://prometheus.io/docs/prometheus/latest/querying/api/", walkthroughSteps: [ { title: "Find your Prometheus URL", description: "The base URL of a Prometheus-compatible endpoint (e.g. https://prometheus.yourcompany.com, or Grafana Cloud's Prometheus query URL).", }, { title: "Pick an auth mode", description: "Self-hosted Prometheus often has no auth — leave the credential fields blank. Managed services usually use basic auth (username + password) or a bearer token. Set whichever pair matches your provider; basic auth wins if both are configured.", }, { title: "Enter your Prometheus URL", description: "The base URL of your Prometheus endpoint.", inputKey: "PROMETHEUS_URL", inputLabel: "Prometheus URL", inputPlaceholder: "https://prometheus.example.com", inputType: "text", }, { title: "Basic auth username (optional)", description: "For Grafana Cloud Prometheus this is your stack's instance ID. Leave blank for self-hosted.", inputKey: "PROMETHEUS_USERNAME", inputLabel: "Username", inputPlaceholder: "123456", inputType: "text", optional: true, }, { title: "Basic auth password (optional)", description: "API token or password to pair with the username.", inputKey: "PROMETHEUS_PASSWORD", inputLabel: "Password", inputPlaceholder: "glc_...", inputType: "password", optional: true, }, { title: "Bearer token (optional)", description: "Used only if you did NOT set a basic-auth username. For services that issue a bearer token instead.", inputKey: "PROMETHEUS_BEARER_TOKEN", inputLabel: "Bearer Token", inputPlaceholder: "eyJ...", inputType: "password", optional: true, }, ], }, { id: "gcloud", name: "Google Cloud", description: "Cloud Run, Functions, and infrastructure metrics", category: "engineering", icon: IconCloud, envKeys: ["GOOGLE_APPLICATION_CREDENTIALS_JSON"], docsUrl: "https://cloud.google.com/monitoring/api/v3", walkthroughSteps: [ { title: "Create a service account", description: 'Create a service account with "Monitoring Viewer" role and download the JSON key.', url: "https://console.cloud.google.com/iam-admin/serviceaccounts", linkText: "Service Accounts", }, { title: "Upload your service account credentials", description: "Upload the JSON key file you downloaded, or paste its contents.", inputKey: "GOOGLE_APPLICATION_CREDENTIALS_JSON", inputLabel: "Service Account JSON", inputPlaceholder: '{"type": "service_account", ...}', inputType: "textarea", inputAcceptFile: ".json", }, ], }, // --- Communication --- { id: "slack", name: "Slack", description: "Channel history and workspace search. Prefer a Slack workspace integration from Settings > Connections; a local bot token remains available as a legacy fallback.", category: "communication", icon: IconMessage, envKeys: ["SLACK_BOT_TOKEN"], docsUrl: "https://api.slack.com/methods", walkthroughSteps: [ { title: "Create a Slack App for local fallback access", description: "Go to api.slack.com/apps, create a new app, and add OAuth scopes: channels:read, channels:history, search:read.", url: "https://api.slack.com/apps", linkText: "Slack Apps", }, { title: "Install the app to your workspace", description: 'Under "OAuth & Permissions", install the app and copy the Bot User OAuth Token.', }, { title: "Enter your local fallback Bot Token", description: 'Paste the Bot User OAuth Token (starts with "xoxb-").', inputKey: "SLACK_BOT_TOKEN", inputLabel: "Bot Token (legacy local fallback)", inputPlaceholder: "xoxb-...", inputType: "password", }, ], }, { id: "notion", name: "Notion", description: "Content calendar and editorial planning", category: "communication", icon: IconFileText, envKeys: ["NOTION_API_KEY"], docsUrl: "https://developers.notion.com/", walkthroughSteps: [ { title: "Create a Notion Integration", description: "Go to notion.so/my-integrations, create a new integration, and select the workspace.", url: "https://www.notion.so/my-integrations", linkText: "Notion Integrations", }, { title: "Share databases with the integration", description: 'In Notion, open the databases you want to query and click "..." > "Connect to" > select your integration.', }, { title: "Enter your API Key", description: 'Copy the "Internal Integration Secret" from your integration settings.', inputKey: "NOTION_API_KEY", inputLabel: "Integration Secret", inputPlaceholder: "ntn_...", inputType: "password", }, ], }, { id: "twitter", name: "X / Twitter", description: "Tweet engagement and social metrics", category: "communication", icon: IconBrandX, envKeys: ["TWITTER_BEARER_TOKEN"], docsUrl: "https://developer.x.com/en/docs", walkthroughSteps: [ { title: "Apply for a Developer Account", description: "Go to the X Developer Portal and apply for access (or sign in if you already have it).", url: "https://developer.x.com/en/portal/dashboard", linkText: "X Developer Portal", }, { title: "Create a project and app", description: "Create a new project and app in the developer portal. Generate a Bearer Token under Keys and Tokens.", }, { title: "Enter your Bearer Token", description: "Paste the Bearer Token from your app settings.", inputKey: "TWITTER_BEARER_TOKEN", inputLabel: "Bearer Token", inputPlaceholder: "AAAA...", inputType: "password", }, ], }, // --- Support --- { id: "pylon", name: "Pylon", description: "Support tickets and customer account lookup", category: "support", icon: IconHeadset, envKeys: ["PYLON_API_KEY"], docsUrl: "https://docs.usepylon.com/", walkthroughSteps: [ { title: "Get your API Key", description: "In Pylon, go to Settings > API and generate an API key.", }, { title: "Enter your API Key", description: "Paste the API key.", inputKey: "PYLON_API_KEY", inputLabel: "API Key", inputPlaceholder: "your-pylon-api-key", inputType: "password", }, ], }, { id: "commonroom", name: "Common Room", description: "Community member engagement and activity", category: "support", icon: IconUsers, envKeys: ["COMMONROOM_API_TOKEN"], docsUrl: "https://docs.commonroom.io/", walkthroughSteps: [ { title: "Get your API Key", description: "In Common Room, go to Settings > API Keys and create a new key.", }, { title: "Enter your API Key", description: "Paste the API key.", inputKey: "COMMONROOM_API_TOKEN", inputLabel: "API Key", inputPlaceholder: "your-commonroom-api-key", inputType: "password", }, ], }, // --- SEO --- { id: "dataforseo", name: "DataForSEO", description: "Keyword rankings, search volume, and SEO metrics", category: "seo", icon: IconSearch, envKeys: ["DATAFORSEO_LOGIN", "DATAFORSEO_PASSWORD"], docsUrl: "https://docs.dataforseo.com/", walkthroughSteps: [ { title: "Create a DataForSEO account", description: "Sign up at DataForSEO and find your API credentials on the dashboard.", url: "https://app.dataforseo.com/api-dashboard", linkText: "DataForSEO Dashboard", }, { title: "Enter your Login", description: "Your DataForSEO login email.", inputKey: "DATAFORSEO_LOGIN", inputLabel: "Login", inputPlaceholder: "you@company.com", inputType: "text", }, { title: "Enter your Password", description: "Your DataForSEO API password.", inputKey: "DATAFORSEO_PASSWORD", inputLabel: "Password", inputPlaceholder: "your-dataforseo-password", inputType: "password", }, ], }, ]; export function getDataSourceById(id: string): DataSource | undefined { return dataSources.find((ds) => ds.id === id); } export function getDataSourcesByCategory( category: DataSourceCategory, ): DataSource[] { return dataSources.filter((ds) => ds.category === category); }