veryfront 0.0.49 → 0.0.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/components.js +260 -56
- package/dist/ai/components.js.map +4 -4
- package/dist/ai/index.d.ts +1 -0
- package/dist/ai/index.js +12 -4
- package/dist/ai/index.js.map +2 -2
- package/dist/ai/primitives.js +55 -10
- package/dist/ai/primitives.js.map +3 -3
- package/dist/ai/react.js +140 -1
- package/dist/ai/react.js.map +3 -3
- package/dist/ai/workflow-react.js +458 -0
- package/dist/ai/workflow-react.js.map +7 -0
- package/dist/ai/workflow.js +5422 -0
- package/dist/ai/workflow.js.map +7 -0
- package/dist/cli.js +957 -215
- package/dist/components.js +12 -4
- package/dist/components.js.map +2 -2
- package/dist/config.js +12 -4
- package/dist/config.js.map +2 -2
- package/dist/data.js +12 -4
- package/dist/data.js.map +2 -2
- package/dist/index.js +12 -4
- package/dist/index.js.map +2 -2
- package/dist/integrations/_base/files/SETUP.md +667 -98
- package/dist/integrations/_base/files/app/api/integrations/status/route.ts +3 -3
- package/dist/integrations/_base/files/app/api/integrations/token-storage/route.ts +26 -0
- package/dist/integrations/_base/files/app/components/ServiceConnections.tsx +2 -1
- package/dist/integrations/_base/files/app/setup/page.tsx +869 -55
- package/dist/integrations/_base/files/lib/token-store-examples.ts +435 -0
- package/dist/integrations/_base/files/lib/token-store.ts +273 -23
- package/dist/integrations/airtable/connector.json +99 -0
- package/dist/integrations/airtable/files/ai/tools/create-record.ts +25 -0
- package/dist/integrations/airtable/files/ai/tools/get-base.ts +34 -0
- package/dist/integrations/airtable/files/ai/tools/get-record.ts +23 -0
- package/dist/integrations/airtable/files/ai/tools/list-bases.ts +19 -0
- package/dist/integrations/airtable/files/ai/tools/list-records.ts +47 -0
- package/dist/integrations/airtable/files/app/api/auth/airtable/callback/route.ts +11 -0
- package/dist/integrations/airtable/files/app/api/auth/airtable/route.ts +9 -0
- package/dist/integrations/airtable/files/lib/airtable-client.ts +244 -0
- package/dist/integrations/anthropic/README.md +181 -0
- package/dist/integrations/anthropic/connector.json +88 -0
- package/dist/integrations/anthropic/files/_env.example +4 -0
- package/dist/integrations/anthropic/files/ai/tools/get-organization.ts +36 -0
- package/dist/integrations/anthropic/files/ai/tools/get-usage.ts +100 -0
- package/dist/integrations/anthropic/files/ai/tools/list-api-keys.ts +64 -0
- package/dist/integrations/anthropic/files/ai/tools/list-members.ts +65 -0
- package/dist/integrations/anthropic/files/ai/tools/list-workspaces.ts +35 -0
- package/dist/integrations/anthropic/files/lib/anthropic-admin-client.ts +264 -0
- package/dist/integrations/asana/connector.json +85 -0
- package/dist/integrations/asana/files/_env.example +4 -0
- package/dist/integrations/asana/files/ai/tools/create-task.ts +34 -0
- package/dist/integrations/asana/files/ai/tools/get-task.ts +26 -0
- package/dist/integrations/asana/files/ai/tools/list-projects.ts +26 -0
- package/dist/integrations/asana/files/ai/tools/list-tasks.ts +50 -0
- package/dist/integrations/asana/files/ai/tools/update-task.ts +36 -0
- package/dist/integrations/asana/files/app/api/auth/asana/callback/route.ts +11 -0
- package/dist/integrations/asana/files/app/api/auth/asana/route.ts +7 -0
- package/dist/integrations/asana/files/lib/asana-client.ts +162 -0
- package/dist/integrations/aws/connector.json +72 -0
- package/dist/integrations/aws/files/_env.example +10 -0
- package/dist/integrations/aws/files/ai/tools/get-s3-object.ts +62 -0
- package/dist/integrations/aws/files/ai/tools/list-ec2-instances.ts +56 -0
- package/dist/integrations/aws/files/ai/tools/list-lambda-functions.ts +57 -0
- package/dist/integrations/aws/files/ai/tools/list-s3-buckets.ts +44 -0
- package/dist/integrations/aws/files/ai/tools/list-s3-objects.ts +58 -0
- package/dist/integrations/aws/files/lib/aws-client.ts +255 -0
- package/dist/integrations/bitbucket/connector.json +85 -0
- package/dist/integrations/bitbucket/files/_env.example +9 -0
- package/dist/integrations/bitbucket/files/ai/tools/create-pull-request.ts +83 -0
- package/dist/integrations/bitbucket/files/ai/tools/list-issues.ts +112 -0
- package/dist/integrations/bitbucket/files/ai/tools/list-pull-requests.ts +91 -0
- package/dist/integrations/bitbucket/files/ai/tools/list-repositories.ts +78 -0
- package/dist/integrations/bitbucket/files/app/api/auth/bitbucket/callback/route.ts +11 -0
- package/dist/integrations/bitbucket/files/app/api/auth/bitbucket/route.ts +9 -0
- package/dist/integrations/bitbucket/files/lib/bitbucket-client.ts +316 -0
- package/dist/integrations/box/connector.json +85 -0
- package/dist/integrations/box/files/_env.example +4 -0
- package/dist/integrations/box/files/ai/tools/create-folder.ts +28 -0
- package/dist/integrations/box/files/ai/tools/get-file.ts +29 -0
- package/dist/integrations/box/files/ai/tools/list-files.ts +33 -0
- package/dist/integrations/box/files/ai/tools/search-files.ts +35 -0
- package/dist/integrations/box/files/ai/tools/upload-file.ts +32 -0
- package/dist/integrations/box/files/app/api/auth/box/callback/route.ts +11 -0
- package/dist/integrations/box/files/app/api/auth/box/route.ts +7 -0
- package/dist/integrations/box/files/lib/box-client.ts +280 -0
- package/dist/integrations/calendar/files/app/api/auth/calendar/callback/route.ts +7 -110
- package/dist/integrations/calendar/files/app/api/auth/calendar/route.ts +5 -25
- package/dist/integrations/clickup/connector.json +85 -0
- package/dist/integrations/clickup/files/_env.example +4 -0
- package/dist/integrations/clickup/files/ai/tools/create-task.ts +64 -0
- package/dist/integrations/clickup/files/ai/tools/get-task.ts +59 -0
- package/dist/integrations/clickup/files/ai/tools/list-lists.ts +109 -0
- package/dist/integrations/clickup/files/ai/tools/list-tasks.ts +95 -0
- package/dist/integrations/clickup/files/ai/tools/update-task.ts +85 -0
- package/dist/integrations/clickup/files/app/api/auth/clickup/callback/route.ts +11 -0
- package/dist/integrations/clickup/files/app/api/auth/clickup/route.ts +7 -0
- package/dist/integrations/clickup/files/lib/clickup-client.ts +439 -0
- package/dist/integrations/confluence/README.md +246 -0
- package/dist/integrations/confluence/connector.json +104 -0
- package/dist/integrations/confluence/files/_env.example +4 -0
- package/dist/integrations/confluence/files/ai/tools/create-page.ts +43 -0
- package/dist/integrations/confluence/files/ai/tools/get-page.ts +30 -0
- package/dist/integrations/confluence/files/ai/tools/list-spaces.ts +31 -0
- package/dist/integrations/confluence/files/ai/tools/search-content.ts +38 -0
- package/dist/integrations/confluence/files/ai/tools/update-page.ts +45 -0
- package/dist/integrations/confluence/files/app/api/auth/confluence/callback/route.ts +11 -0
- package/dist/integrations/confluence/files/app/api/auth/confluence/route.ts +9 -0
- package/dist/integrations/confluence/files/lib/confluence-client.ts +281 -0
- package/dist/integrations/discord/connector.json +100 -0
- package/dist/integrations/discord/files/_env.example +12 -0
- package/dist/integrations/discord/files/ai/tools/get-messages.ts +55 -0
- package/dist/integrations/discord/files/ai/tools/get-user.ts +32 -0
- package/dist/integrations/discord/files/ai/tools/list-channels.ts +32 -0
- package/dist/integrations/discord/files/ai/tools/list-guilds.ts +24 -0
- package/dist/integrations/discord/files/ai/tools/send-message.ts +33 -0
- package/dist/integrations/discord/files/app/api/auth/discord/callback/route.ts +11 -0
- package/dist/integrations/discord/files/app/api/auth/discord/route.ts +9 -0
- package/dist/integrations/discord/files/lib/discord-client.ts +273 -0
- package/dist/integrations/docs-google/connector.json +101 -0
- package/dist/integrations/docs-google/files/_env.example +8 -0
- package/dist/integrations/docs-google/files/ai/tools/create-document.ts +46 -0
- package/dist/integrations/docs-google/files/ai/tools/get-document.ts +46 -0
- package/dist/integrations/docs-google/files/ai/tools/list-documents.ts +42 -0
- package/dist/integrations/docs-google/files/ai/tools/search-documents.ts +38 -0
- package/dist/integrations/docs-google/files/ai/tools/update-document.ts +131 -0
- package/dist/integrations/docs-google/files/app/api/auth/docs-google/callback/route.ts +11 -0
- package/dist/integrations/docs-google/files/app/api/auth/docs-google/route.ts +9 -0
- package/dist/integrations/docs-google/files/lib/docs-client.ts +582 -0
- package/dist/integrations/drive/connector.json +134 -0
- package/dist/integrations/drive/files/_env.example +9 -0
- package/dist/integrations/drive/files/ai/tools/create-folder.ts +47 -0
- package/dist/integrations/drive/files/ai/tools/get-file.ts +55 -0
- package/dist/integrations/drive/files/ai/tools/list-files.ts +78 -0
- package/dist/integrations/drive/files/ai/tools/search-files.ts +79 -0
- package/dist/integrations/drive/files/ai/tools/upload-file.ts +59 -0
- package/dist/integrations/drive/files/app/api/auth/drive/callback/route.ts +11 -0
- package/dist/integrations/drive/files/app/api/auth/drive/route.ts +9 -0
- package/dist/integrations/drive/files/lib/drive-client.ts +359 -0
- package/dist/integrations/dropbox/connector.json +107 -0
- package/dist/integrations/dropbox/files/_env.example +24 -0
- package/dist/integrations/dropbox/files/ai/tools/get-account.ts +58 -0
- package/dist/integrations/dropbox/files/ai/tools/get-file.ts +61 -0
- package/dist/integrations/dropbox/files/ai/tools/list-files.ts +56 -0
- package/dist/integrations/dropbox/files/ai/tools/search-files.ts +70 -0
- package/dist/integrations/dropbox/files/ai/tools/upload-file.ts +48 -0
- package/dist/integrations/dropbox/files/app/api/auth/dropbox/callback/route.ts +11 -0
- package/dist/integrations/dropbox/files/app/api/auth/dropbox/route.ts +9 -0
- package/dist/integrations/dropbox/files/lib/dropbox-client.ts +397 -0
- package/dist/integrations/figma/INTEGRATION_SUMMARY.md +436 -0
- package/dist/integrations/figma/README.md +287 -0
- package/dist/integrations/figma/connector.json +100 -0
- package/dist/integrations/figma/files/_env.example +5 -0
- package/dist/integrations/figma/files/ai/tools/get-comments.ts +72 -0
- package/dist/integrations/figma/files/ai/tools/get-file.ts +54 -0
- package/dist/integrations/figma/files/ai/tools/list-files.ts +39 -0
- package/dist/integrations/figma/files/ai/tools/list-projects.ts +69 -0
- package/dist/integrations/figma/files/ai/tools/post-comment.ts +54 -0
- package/dist/integrations/figma/files/app/api/auth/figma/callback/route.ts +11 -0
- package/dist/integrations/figma/files/app/api/auth/figma/route.ts +9 -0
- package/dist/integrations/figma/files/lib/figma-client.ts +355 -0
- package/dist/integrations/figma/files/lib/types.ts +503 -0
- package/dist/integrations/freshdesk/connector.json +85 -0
- package/dist/integrations/freshdesk/files/_env.example +4 -0
- package/dist/integrations/freshdesk/files/ai/tools/create-ticket.ts +60 -0
- package/dist/integrations/freshdesk/files/ai/tools/get-ticket.ts +46 -0
- package/dist/integrations/freshdesk/files/ai/tools/list-contacts.ts +37 -0
- package/dist/integrations/freshdesk/files/ai/tools/list-tickets.ts +59 -0
- package/dist/integrations/freshdesk/files/ai/tools/update-ticket.ts +61 -0
- package/dist/integrations/freshdesk/files/app/api/auth/freshdesk/callback/route.ts +11 -0
- package/dist/integrations/freshdesk/files/app/api/auth/freshdesk/route.ts +7 -0
- package/dist/integrations/freshdesk/files/lib/freshdesk-client.ts +178 -0
- package/dist/integrations/github/files/app/api/auth/github/callback/route.ts +6 -127
- package/dist/integrations/github/files/app/api/auth/github/route.ts +4 -24
- package/dist/integrations/gitlab/connector.json +100 -0
- package/dist/integrations/gitlab/files/_env.example +7 -0
- package/dist/integrations/gitlab/files/ai/tools/create-issue.ts +49 -0
- package/dist/integrations/gitlab/files/ai/tools/get-issue.ts +56 -0
- package/dist/integrations/gitlab/files/ai/tools/list-merge-requests.ts +75 -0
- package/dist/integrations/gitlab/files/ai/tools/list-projects.ts +51 -0
- package/dist/integrations/gitlab/files/ai/tools/search-issues.ts +67 -0
- package/dist/integrations/gitlab/files/app/api/auth/gitlab/callback/route.ts +11 -0
- package/dist/integrations/gitlab/files/app/api/auth/gitlab/route.ts +9 -0
- package/dist/integrations/gitlab/files/lib/gitlab-client.ts +366 -0
- package/dist/integrations/gmail/files/app/api/auth/gmail/callback/route.ts +7 -108
- package/dist/integrations/gmail/files/app/api/auth/gmail/route.ts +5 -23
- package/dist/integrations/gmail/files/lib/gmail-client.ts +16 -55
- package/dist/integrations/hubspot/connector.json +98 -0
- package/dist/integrations/hubspot/files/_env.example +5 -0
- package/dist/integrations/hubspot/files/ai/tools/create-contact.ts +41 -0
- package/dist/integrations/hubspot/files/ai/tools/create-deal.ts +41 -0
- package/dist/integrations/hubspot/files/ai/tools/get-contact.ts +39 -0
- package/dist/integrations/hubspot/files/ai/tools/list-contacts.ts +43 -0
- package/dist/integrations/hubspot/files/ai/tools/list-deals.ts +41 -0
- package/dist/integrations/hubspot/files/app/api/auth/hubspot/callback/route.ts +11 -0
- package/dist/integrations/hubspot/files/app/api/auth/hubspot/route.ts +9 -0
- package/dist/integrations/hubspot/files/lib/hubspot-client.ts +393 -0
- package/dist/integrations/intercom/connector.json +85 -0
- package/dist/integrations/intercom/files/_env.example +4 -0
- package/dist/integrations/intercom/files/ai/tools/get-contact.ts +35 -0
- package/dist/integrations/intercom/files/ai/tools/get-conversation.ts +55 -0
- package/dist/integrations/intercom/files/ai/tools/list-contacts.ts +35 -0
- package/dist/integrations/intercom/files/ai/tools/list-conversations.ts +49 -0
- package/dist/integrations/intercom/files/ai/tools/send-message.ts +34 -0
- package/dist/integrations/intercom/files/app/api/auth/intercom/callback/route.ts +11 -0
- package/dist/integrations/intercom/files/app/api/auth/intercom/route.ts +7 -0
- package/dist/integrations/intercom/files/lib/intercom-client.ts +308 -0
- package/dist/integrations/jira/connector.json +109 -0
- package/dist/integrations/jira/files/ai/tools/create-issue.ts +47 -0
- package/dist/integrations/jira/files/ai/tools/get-issue.ts +57 -0
- package/dist/integrations/jira/files/ai/tools/list-projects.ts +30 -0
- package/dist/integrations/jira/files/ai/tools/search-issues.ts +49 -0
- package/dist/integrations/jira/files/ai/tools/update-issue.ts +81 -0
- package/dist/integrations/jira/files/app/api/auth/jira/callback/route.ts +11 -0
- package/dist/integrations/jira/files/app/api/auth/jira/route.ts +9 -0
- package/dist/integrations/jira/files/lib/jira-client.ts +338 -0
- package/dist/integrations/linear/connector.json +100 -0
- package/dist/integrations/linear/files/_env.example +6 -0
- package/dist/integrations/linear/files/ai/tools/create-issue.ts +71 -0
- package/dist/integrations/linear/files/ai/tools/get-issue.ts +55 -0
- package/dist/integrations/linear/files/ai/tools/list-projects.ts +43 -0
- package/dist/integrations/linear/files/ai/tools/search-issues.ts +54 -0
- package/dist/integrations/linear/files/ai/tools/update-issue.ts +71 -0
- package/dist/integrations/linear/files/app/api/auth/linear/callback/route.ts +11 -0
- package/dist/integrations/linear/files/app/api/auth/linear/route.ts +9 -0
- package/dist/integrations/linear/files/lib/linear-client.ts +464 -0
- package/dist/integrations/mailchimp/connector.json +85 -0
- package/dist/integrations/mailchimp/files/_env.example +4 -0
- package/dist/integrations/mailchimp/files/ai/tools/get-campaign.ts +45 -0
- package/dist/integrations/mailchimp/files/ai/tools/get-list.ts +51 -0
- package/dist/integrations/mailchimp/files/ai/tools/list-campaigns.ts +46 -0
- package/dist/integrations/mailchimp/files/ai/tools/list-lists.ts +46 -0
- package/dist/integrations/mailchimp/files/ai/tools/list-members.ts +58 -0
- package/dist/integrations/mailchimp/files/app/api/auth/mailchimp/callback/route.ts +11 -0
- package/dist/integrations/mailchimp/files/app/api/auth/mailchimp/route.ts +7 -0
- package/dist/integrations/mailchimp/files/lib/mailchimp-client.ts +267 -0
- package/dist/integrations/mixpanel/connector.json +96 -0
- package/dist/integrations/mixpanel/files/_env.example +11 -0
- package/dist/integrations/mixpanel/files/ai/tools/get-funnel.ts +46 -0
- package/dist/integrations/mixpanel/files/ai/tools/get-retention.ts +64 -0
- package/dist/integrations/mixpanel/files/ai/tools/list-cohorts.ts +46 -0
- package/dist/integrations/mixpanel/files/ai/tools/query-events.ts +43 -0
- package/dist/integrations/mixpanel/files/ai/tools/track-event.ts +41 -0
- package/dist/integrations/mixpanel/files/lib/mixpanel-client.ts +319 -0
- package/dist/integrations/monday/connector.json +85 -0
- package/dist/integrations/monday/files/_env.example +4 -0
- package/dist/integrations/monday/files/ai/tools/create-item.ts +36 -0
- package/dist/integrations/monday/files/ai/tools/get-item.ts +31 -0
- package/dist/integrations/monday/files/ai/tools/list-boards.ts +29 -0
- package/dist/integrations/monday/files/ai/tools/list-items.ts +36 -0
- package/dist/integrations/monday/files/ai/tools/update-item.ts +36 -0
- package/dist/integrations/monday/files/app/api/auth/monday/callback/route.ts +11 -0
- package/dist/integrations/monday/files/app/api/auth/monday/route.ts +7 -0
- package/dist/integrations/monday/files/lib/monday-client.ts +329 -0
- package/dist/integrations/neon/connector.json +89 -0
- package/dist/integrations/neon/files/_env.example +6 -0
- package/dist/integrations/neon/files/ai/tools/describe-table.ts +38 -0
- package/dist/integrations/neon/files/ai/tools/list-branches.ts +35 -0
- package/dist/integrations/neon/files/ai/tools/list-projects.ts +31 -0
- package/dist/integrations/neon/files/ai/tools/list-tables.ts +49 -0
- package/dist/integrations/neon/files/ai/tools/query-database.ts +33 -0
- package/dist/integrations/neon/files/app/api/auth/neon/route.ts +51 -0
- package/dist/integrations/neon/files/lib/neon-client.ts +294 -0
- package/dist/integrations/notion/connector.json +87 -0
- package/dist/integrations/notion/files/_env.example +6 -0
- package/dist/integrations/notion/files/ai/tools/create-page.ts +32 -0
- package/dist/integrations/notion/files/ai/tools/query-database.ts +44 -0
- package/dist/integrations/notion/files/ai/tools/read-page.ts +34 -0
- package/dist/integrations/notion/files/ai/tools/search-notion.ts +51 -0
- package/dist/integrations/notion/files/app/api/auth/notion/callback/route.ts +11 -0
- package/dist/integrations/notion/files/app/api/auth/notion/route.ts +9 -0
- package/dist/integrations/notion/files/lib/notion-client.ts +218 -0
- package/dist/integrations/onedrive/connector.json +100 -0
- package/dist/integrations/onedrive/files/_env.example +23 -0
- package/dist/integrations/onedrive/files/ai/tools/download-file.ts +38 -0
- package/dist/integrations/onedrive/files/ai/tools/list-files.ts +63 -0
- package/dist/integrations/onedrive/files/ai/tools/search-files.ts +59 -0
- package/dist/integrations/onedrive/files/ai/tools/upload-file.ts +43 -0
- package/dist/integrations/onedrive/files/app/api/auth/onedrive/callback/route.ts +11 -0
- package/dist/integrations/onedrive/files/app/api/auth/onedrive/route.ts +9 -0
- package/dist/integrations/onedrive/files/lib/onedrive-client.ts +314 -0
- package/dist/integrations/outlook/README.md +308 -0
- package/dist/integrations/outlook/connector.json +98 -0
- package/dist/integrations/outlook/files/_env.example +8 -0
- package/dist/integrations/outlook/files/ai/tools/get-email.ts +47 -0
- package/dist/integrations/outlook/files/ai/tools/list-emails.ts +46 -0
- package/dist/integrations/outlook/files/ai/tools/list-folders.ts +22 -0
- package/dist/integrations/outlook/files/ai/tools/search-emails.ts +41 -0
- package/dist/integrations/outlook/files/ai/tools/send-email.ts +41 -0
- package/dist/integrations/outlook/files/app/api/auth/outlook/callback/route.ts +11 -0
- package/dist/integrations/outlook/files/app/api/auth/outlook/route.ts +9 -0
- package/dist/integrations/outlook/files/lib/outlook-client.ts +204 -0
- package/dist/integrations/pipedrive/connector.json +85 -0
- package/dist/integrations/pipedrive/files/_env.example +4 -0
- package/dist/integrations/pipedrive/files/ai/tools/create-deal.ts +44 -0
- package/dist/integrations/pipedrive/files/ai/tools/get-deal.ts +34 -0
- package/dist/integrations/pipedrive/files/ai/tools/list-deals.ts +40 -0
- package/dist/integrations/pipedrive/files/ai/tools/list-persons.ts +33 -0
- package/dist/integrations/pipedrive/files/ai/tools/update-deal.ts +46 -0
- package/dist/integrations/pipedrive/files/app/api/auth/pipedrive/callback/route.ts +11 -0
- package/dist/integrations/pipedrive/files/app/api/auth/pipedrive/route.ts +7 -0
- package/dist/integrations/pipedrive/files/lib/pipedrive-client.ts +259 -0
- package/dist/integrations/posthog/connector.json +84 -0
- package/dist/integrations/posthog/files/_env.example +6 -0
- package/dist/integrations/posthog/files/ai/tools/capture-event.ts +37 -0
- package/dist/integrations/posthog/files/ai/tools/get-trends.ts +44 -0
- package/dist/integrations/posthog/files/ai/tools/list-feature-flags.ts +38 -0
- package/dist/integrations/posthog/files/ai/tools/list-persons.ts +32 -0
- package/dist/integrations/posthog/files/lib/posthog-client.ts +286 -0
- package/dist/integrations/quickbooks/connector.json +85 -0
- package/dist/integrations/quickbooks/files/_env.example +4 -0
- package/dist/integrations/quickbooks/files/ai/tools/create-invoice.ts +48 -0
- package/dist/integrations/quickbooks/files/ai/tools/get-customer.ts +36 -0
- package/dist/integrations/quickbooks/files/ai/tools/get-invoice.ts +46 -0
- package/dist/integrations/quickbooks/files/ai/tools/list-customers.ts +37 -0
- package/dist/integrations/quickbooks/files/ai/tools/list-invoices.ts +40 -0
- package/dist/integrations/quickbooks/files/app/api/auth/quickbooks/callback/route.ts +11 -0
- package/dist/integrations/quickbooks/files/app/api/auth/quickbooks/route.ts +7 -0
- package/dist/integrations/quickbooks/files/lib/quickbooks-client.ts +252 -0
- package/dist/integrations/salesforce/connector.json +104 -0
- package/dist/integrations/salesforce/files/ai/tools/create-lead.ts +101 -0
- package/dist/integrations/salesforce/files/ai/tools/get-account.ts +53 -0
- package/dist/integrations/salesforce/files/ai/tools/list-accounts.ts +50 -0
- package/dist/integrations/salesforce/files/ai/tools/list-contacts.ts +54 -0
- package/dist/integrations/salesforce/files/ai/tools/list-opportunities.ts +55 -0
- package/dist/integrations/salesforce/files/app/api/auth/salesforce/callback/route.ts +11 -0
- package/dist/integrations/salesforce/files/app/api/auth/salesforce/route.ts +9 -0
- package/dist/integrations/salesforce/files/lib/salesforce-client.ts +539 -0
- package/dist/integrations/sentry/connector.json +84 -0
- package/dist/integrations/sentry/files/_env.example +6 -0
- package/dist/integrations/sentry/files/ai/tools/get-issue.ts +66 -0
- package/dist/integrations/sentry/files/ai/tools/list-issues.ts +57 -0
- package/dist/integrations/sentry/files/ai/tools/list-projects.ts +32 -0
- package/dist/integrations/sentry/files/ai/tools/resolve-issue.ts +28 -0
- package/dist/integrations/sentry/files/lib/sentry-client.ts +268 -0
- package/dist/integrations/servicenow/connector.json +66 -0
- package/dist/integrations/servicenow/files/_env.example +5 -0
- package/dist/integrations/servicenow/files/ai/tools/create-incident.ts +58 -0
- package/dist/integrations/servicenow/files/ai/tools/get-incident.ts +59 -0
- package/dist/integrations/servicenow/files/ai/tools/list-incidents.ts +72 -0
- package/dist/integrations/servicenow/files/ai/tools/search-knowledge.ts +48 -0
- package/dist/integrations/servicenow/files/ai/tools/update-incident.ts +60 -0
- package/dist/integrations/servicenow/files/app/api/auth/servicenow/callback/route.ts +89 -0
- package/dist/integrations/servicenow/files/app/api/auth/servicenow/route.ts +42 -0
- package/dist/integrations/servicenow/files/lib/servicenow-client.ts +239 -0
- package/dist/integrations/sharepoint/connector.json +99 -0
- package/dist/integrations/sharepoint/files/ai/tools/get-file.ts +93 -0
- package/dist/integrations/sharepoint/files/ai/tools/get-site.ts +51 -0
- package/dist/integrations/sharepoint/files/ai/tools/list-files.ts +63 -0
- package/dist/integrations/sharepoint/files/ai/tools/list-sites.ts +28 -0
- package/dist/integrations/sharepoint/files/ai/tools/upload-file.ts +72 -0
- package/dist/integrations/sharepoint/files/app/api/auth/sharepoint/callback/route.ts +11 -0
- package/dist/integrations/sharepoint/files/app/api/auth/sharepoint/route.ts +9 -0
- package/dist/integrations/sharepoint/files/lib/sharepoint-client.ts +420 -0
- package/dist/integrations/sheets/README.md +331 -0
- package/dist/integrations/sheets/connector.json +99 -0
- package/dist/integrations/sheets/files/_env.example +8 -0
- package/dist/integrations/sheets/files/ai/tools/create-spreadsheet.ts +85 -0
- package/dist/integrations/sheets/files/ai/tools/get-spreadsheet.ts +39 -0
- package/dist/integrations/sheets/files/ai/tools/list-spreadsheets.ts +41 -0
- package/dist/integrations/sheets/files/ai/tools/read-range.ts +35 -0
- package/dist/integrations/sheets/files/ai/tools/write-range.ts +51 -0
- package/dist/integrations/sheets/files/app/api/auth/sheets/callback/route.ts +11 -0
- package/dist/integrations/sheets/files/app/api/auth/sheets/route.ts +9 -0
- package/dist/integrations/sheets/files/lib/sheets-client.ts +425 -0
- package/dist/integrations/shopify/connector.json +99 -0
- package/dist/integrations/shopify/files/_env.example +5 -0
- package/dist/integrations/shopify/files/ai/tools/get-order.ts +49 -0
- package/dist/integrations/shopify/files/ai/tools/get-product.ts +39 -0
- package/dist/integrations/shopify/files/ai/tools/list-customers.ts +40 -0
- package/dist/integrations/shopify/files/ai/tools/list-orders.ts +52 -0
- package/dist/integrations/shopify/files/ai/tools/list-products.ts +39 -0
- package/dist/integrations/shopify/files/app/api/auth/shopify/callback/route.ts +11 -0
- package/dist/integrations/shopify/files/app/api/auth/shopify/route.ts +7 -0
- package/dist/integrations/shopify/files/lib/shopify-client.ts +198 -0
- package/dist/integrations/slack/files/app/api/auth/slack/callback/route.ts +6 -127
- package/dist/integrations/slack/files/app/api/auth/slack/route.ts +4 -24
- package/dist/integrations/snowflake/connector.json +151 -0
- package/dist/integrations/snowflake/files/_env.example +16 -0
- package/dist/integrations/snowflake/files/ai/tools/describe-table.ts +57 -0
- package/dist/integrations/snowflake/files/ai/tools/list-databases.ts +34 -0
- package/dist/integrations/snowflake/files/ai/tools/list-schemas.ts +40 -0
- package/dist/integrations/snowflake/files/ai/tools/list-tables.ts +49 -0
- package/dist/integrations/snowflake/files/ai/tools/run-query.ts +119 -0
- package/dist/integrations/snowflake/files/lib/snowflake-client.ts +389 -0
- package/dist/integrations/stripe/connector.json +97 -0
- package/dist/integrations/stripe/files/_env.example +6 -0
- package/dist/integrations/stripe/files/ai/tools/get-balance.ts +28 -0
- package/dist/integrations/stripe/files/ai/tools/get-customer.ts +26 -0
- package/dist/integrations/stripe/files/ai/tools/list-customers.ts +42 -0
- package/dist/integrations/stripe/files/ai/tools/list-payments.ts +45 -0
- package/dist/integrations/stripe/files/ai/tools/list-subscriptions.ts +67 -0
- package/dist/integrations/stripe/files/app/api/auth/stripe/route.ts +71 -0
- package/dist/integrations/stripe/files/lib/stripe-client.ts +376 -0
- package/dist/integrations/supabase/connector.json +101 -0
- package/dist/integrations/supabase/files/_env.example +6 -0
- package/dist/integrations/supabase/files/ai/tools/delete-row.ts +77 -0
- package/dist/integrations/supabase/files/ai/tools/insert-row.ts +35 -0
- package/dist/integrations/supabase/files/ai/tools/list-tables.ts +60 -0
- package/dist/integrations/supabase/files/ai/tools/query-table.ts +48 -0
- package/dist/integrations/supabase/files/ai/tools/update-row.ts +64 -0
- package/dist/integrations/supabase/files/app/api/auth/supabase/route.ts +91 -0
- package/dist/integrations/supabase/files/lib/supabase-client.ts +296 -0
- package/dist/integrations/teams/README.md +256 -0
- package/dist/integrations/teams/connector.json +99 -0
- package/dist/integrations/teams/files/ai/tools/get-messages.ts +55 -0
- package/dist/integrations/teams/files/ai/tools/list-channels.ts +28 -0
- package/dist/integrations/teams/files/ai/tools/list-chats.ts +41 -0
- package/dist/integrations/teams/files/ai/tools/list-teams.ts +27 -0
- package/dist/integrations/teams/files/ai/tools/send-message.ts +61 -0
- package/dist/integrations/teams/files/app/api/auth/teams/callback/route.ts +11 -0
- package/dist/integrations/teams/files/app/api/auth/teams/route.ts +9 -0
- package/dist/integrations/teams/files/lib/teams-client.ts +345 -0
- package/dist/integrations/trello/connector.json +85 -0
- package/dist/integrations/trello/files/_env.example +4 -0
- package/dist/integrations/trello/files/ai/tools/create-card.ts +54 -0
- package/dist/integrations/trello/files/ai/tools/get-card.ts +33 -0
- package/dist/integrations/trello/files/ai/tools/list-boards.ts +29 -0
- package/dist/integrations/trello/files/ai/tools/list-cards.ts +52 -0
- package/dist/integrations/trello/files/ai/tools/update-card.ts +65 -0
- package/dist/integrations/trello/files/app/api/auth/trello/callback/route.ts +11 -0
- package/dist/integrations/trello/files/app/api/auth/trello/route.ts +7 -0
- package/dist/integrations/trello/files/lib/trello-client.ts +202 -0
- package/dist/integrations/twilio/connector.json +146 -0
- package/dist/integrations/twilio/files/_env.example +14 -0
- package/dist/integrations/twilio/files/ai/tools/get-message.ts +58 -0
- package/dist/integrations/twilio/files/ai/tools/list-calls.ts +129 -0
- package/dist/integrations/twilio/files/ai/tools/list-messages.ts +97 -0
- package/dist/integrations/twilio/files/ai/tools/send-sms.ts +75 -0
- package/dist/integrations/twilio/files/ai/tools/send-whatsapp.ts +81 -0
- package/dist/integrations/twilio/files/lib/twilio-client.ts +375 -0
- package/dist/integrations/twitter/connector.json +87 -0
- package/dist/integrations/twitter/files/_env.example +6 -0
- package/dist/integrations/twitter/files/ai/tools/get-timeline.ts +59 -0
- package/dist/integrations/twitter/files/ai/tools/post-tweet.ts +49 -0
- package/dist/integrations/twitter/files/ai/tools/search-tweets.ts +71 -0
- package/dist/integrations/twitter/files/app/api/auth/twitter/callback/route.ts +11 -0
- package/dist/integrations/twitter/files/app/api/auth/twitter/route.ts +9 -0
- package/dist/integrations/twitter/files/lib/twitter-client.ts +236 -0
- package/dist/integrations/webex/connector.json +85 -0
- package/dist/integrations/webex/files/_env.example +4 -0
- package/dist/integrations/webex/files/ai/tools/create-meeting.ts +69 -0
- package/dist/integrations/webex/files/ai/tools/get-meeting.ts +31 -0
- package/dist/integrations/webex/files/ai/tools/list-meetings.ts +44 -0
- package/dist/integrations/webex/files/ai/tools/list-rooms.ts +35 -0
- package/dist/integrations/webex/files/ai/tools/send-message.ts +51 -0
- package/dist/integrations/webex/files/app/api/auth/webex/callback/route.ts +11 -0
- package/dist/integrations/webex/files/app/api/auth/webex/route.ts +7 -0
- package/dist/integrations/webex/files/lib/webex-client.ts +279 -0
- package/dist/integrations/xero/connector.json +85 -0
- package/dist/integrations/xero/files/_env.example +4 -0
- package/dist/integrations/xero/files/ai/tools/create-invoice.ts +65 -0
- package/dist/integrations/xero/files/ai/tools/get-contact.ts +40 -0
- package/dist/integrations/xero/files/ai/tools/get-invoice.ts +44 -0
- package/dist/integrations/xero/files/ai/tools/list-contacts.ts +54 -0
- package/dist/integrations/xero/files/ai/tools/list-invoices.ts +54 -0
- package/dist/integrations/xero/files/app/api/auth/xero/callback/route.ts +11 -0
- package/dist/integrations/xero/files/app/api/auth/xero/route.ts +7 -0
- package/dist/integrations/xero/files/lib/xero-client.ts +292 -0
- package/dist/integrations/zendesk/connector.json +61 -0
- package/dist/integrations/zendesk/files/_env.example +5 -0
- package/dist/integrations/zendesk/files/ai/tools/create-ticket.ts +82 -0
- package/dist/integrations/zendesk/files/ai/tools/get-ticket.ts +53 -0
- package/dist/integrations/zendesk/files/ai/tools/list-tickets.ts +60 -0
- package/dist/integrations/zendesk/files/ai/tools/search-tickets.ts +56 -0
- package/dist/integrations/zendesk/files/app/api/auth/zendesk/callback/route.ts +91 -0
- package/dist/integrations/zendesk/files/app/api/auth/zendesk/route.ts +41 -0
- package/dist/integrations/zendesk/files/lib/zendesk-client.ts +265 -0
- package/dist/integrations/zoom/connector.json +85 -0
- package/dist/integrations/zoom/files/_env.example +4 -0
- package/dist/integrations/zoom/files/ai/tools/create-meeting.ts +106 -0
- package/dist/integrations/zoom/files/ai/tools/delete-meeting.ts +32 -0
- package/dist/integrations/zoom/files/ai/tools/get-meeting.ts +44 -0
- package/dist/integrations/zoom/files/ai/tools/list-meetings.ts +47 -0
- package/dist/integrations/zoom/files/ai/tools/update-meeting.ts +111 -0
- package/dist/integrations/zoom/files/app/api/auth/zoom/callback/route.ts +11 -0
- package/dist/integrations/zoom/files/app/api/auth/zoom/route.ts +7 -0
- package/dist/integrations/zoom/files/lib/zoom-client.ts +228 -0
- package/dist/oauth/handlers.js +554 -0
- package/dist/oauth/handlers.js.map +7 -0
- package/dist/oauth/index.js +1157 -0
- package/dist/oauth/index.js.map +7 -0
- package/dist/oauth/providers.js +927 -0
- package/dist/oauth/providers.js.map +7 -0
- package/dist/oauth/token-store.js +82 -0
- package/dist/oauth/token-store.js.map +7 -0
- package/package.json +25 -1
- package/dist/integrations/calendar/files/lib/token-store.ts +0 -113
- package/dist/integrations/github/files/lib/token-store.ts +0 -113
- package/dist/integrations/gmail/files/lib/oauth.ts +0 -145
- package/dist/integrations/gmail/files/lib/token-store.ts +0 -113
- package/dist/integrations/slack/files/lib/oauth.ts +0 -145
- package/dist/integrations/slack/files/lib/token-store.ts +0 -113
- /package/dist/integrations/{calendar → docs-google}/files/lib/oauth.ts +0 -0
- /package/dist/integrations/{github → drive}/files/lib/oauth.ts +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { useEffect, useState } from "react";
|
|
3
|
+
import { useEffect, useMemo, useState } from "react";
|
|
4
4
|
|
|
5
5
|
interface Integration {
|
|
6
6
|
id: string;
|
|
@@ -19,72 +19,686 @@ interface SetupStep {
|
|
|
19
19
|
link?: string;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
interface SetupGuide {
|
|
23
|
+
title: string;
|
|
24
|
+
steps: string[];
|
|
25
|
+
link: string;
|
|
26
|
+
envVars: string[];
|
|
27
|
+
category: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
interface TokenStorageStatus {
|
|
31
|
+
mode: "memory" | "database" | "kv" | "redis" | "custom";
|
|
32
|
+
encrypted: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Categories for organizing integrations
|
|
36
|
+
const CATEGORIES = [
|
|
37
|
+
{ id: "google", name: "Google Services", icon: "google" },
|
|
38
|
+
{ id: "microsoft", name: "Microsoft Services", icon: "microsoft" },
|
|
39
|
+
{ id: "atlassian", name: "Atlassian", icon: "atlassian" },
|
|
40
|
+
{ id: "communication", name: "Communication", icon: "chat" },
|
|
41
|
+
{ id: "development", name: "Development", icon: "code" },
|
|
42
|
+
{ id: "productivity", name: "Productivity", icon: "tasks" },
|
|
43
|
+
{ id: "storage", name: "Storage", icon: "folder" },
|
|
44
|
+
{ id: "infrastructure", name: "Infrastructure", icon: "server" },
|
|
45
|
+
{ id: "sales", name: "Sales & CRM", icon: "users" },
|
|
46
|
+
{ id: "support", name: "Support", icon: "headset" },
|
|
47
|
+
{ id: "finance", name: "Finance", icon: "dollar" },
|
|
48
|
+
{ id: "marketing", name: "Marketing", icon: "megaphone" },
|
|
49
|
+
{ id: "design", name: "Design", icon: "palette" },
|
|
50
|
+
{ id: "ai", name: "AI Providers", icon: "brain" },
|
|
51
|
+
] as const;
|
|
52
|
+
|
|
53
|
+
const OAUTH_SETUP_GUIDES: Record<string, SetupGuide> = {
|
|
54
|
+
// Google Services
|
|
23
55
|
gmail: {
|
|
24
|
-
title: "Google OAuth Setup (Gmail
|
|
56
|
+
title: "Google OAuth Setup (Gmail)",
|
|
57
|
+
category: "google",
|
|
25
58
|
steps: [
|
|
26
59
|
"Go to Google Cloud Console",
|
|
27
60
|
"Create a new project or select existing one",
|
|
28
|
-
"Enable Gmail API
|
|
61
|
+
"Enable Gmail API in APIs & Services > Library",
|
|
62
|
+
"Go to APIs & Services > Credentials",
|
|
29
63
|
"Create OAuth 2.0 credentials (Web application)",
|
|
30
64
|
"Add redirect URI: http://localhost:3000/api/auth/gmail/callback",
|
|
31
65
|
"Copy Client ID and Secret to your .env file",
|
|
32
66
|
],
|
|
33
67
|
link: "https://console.cloud.google.com/apis/credentials",
|
|
68
|
+
envVars: ["GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET"],
|
|
34
69
|
},
|
|
35
70
|
calendar: {
|
|
36
71
|
title: "Google Calendar Setup",
|
|
72
|
+
category: "google",
|
|
37
73
|
steps: [
|
|
38
|
-
"Uses same credentials as Gmail",
|
|
39
|
-
"
|
|
74
|
+
"Uses same Google OAuth credentials as Gmail",
|
|
75
|
+
"Enable Calendar API in Google Cloud Console",
|
|
40
76
|
"Add redirect URI: http://localhost:3000/api/auth/calendar/callback",
|
|
41
77
|
],
|
|
42
|
-
link: "https://console.cloud.google.com/apis/
|
|
78
|
+
link: "https://console.cloud.google.com/apis/library/calendar-json.googleapis.com",
|
|
79
|
+
envVars: ["GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET"],
|
|
80
|
+
},
|
|
81
|
+
drive: {
|
|
82
|
+
title: "Google Drive Setup",
|
|
83
|
+
category: "google",
|
|
84
|
+
steps: [
|
|
85
|
+
"Uses same Google OAuth credentials",
|
|
86
|
+
"Enable Drive API in Google Cloud Console",
|
|
87
|
+
"Add redirect URI: http://localhost:3000/api/auth/drive/callback",
|
|
88
|
+
],
|
|
89
|
+
link: "https://console.cloud.google.com/apis/library/drive.googleapis.com",
|
|
90
|
+
envVars: ["GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET"],
|
|
91
|
+
},
|
|
92
|
+
sheets: {
|
|
93
|
+
title: "Google Sheets Setup",
|
|
94
|
+
category: "google",
|
|
95
|
+
steps: [
|
|
96
|
+
"Uses same Google OAuth credentials",
|
|
97
|
+
"Enable Sheets API in Google Cloud Console",
|
|
98
|
+
"Add redirect URI: http://localhost:3000/api/auth/sheets/callback",
|
|
99
|
+
],
|
|
100
|
+
link: "https://console.cloud.google.com/apis/library/sheets.googleapis.com",
|
|
101
|
+
envVars: ["GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET"],
|
|
102
|
+
},
|
|
103
|
+
"docs-google": {
|
|
104
|
+
title: "Google Docs Setup",
|
|
105
|
+
category: "google",
|
|
106
|
+
steps: [
|
|
107
|
+
"Uses same Google OAuth credentials",
|
|
108
|
+
"Enable Docs API in Google Cloud Console",
|
|
109
|
+
"Add redirect URI: http://localhost:3000/api/auth/docs-google/callback",
|
|
110
|
+
],
|
|
111
|
+
link: "https://console.cloud.google.com/apis/library/docs.googleapis.com",
|
|
112
|
+
envVars: ["GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET"],
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
// Microsoft Services
|
|
116
|
+
outlook: {
|
|
117
|
+
title: "Microsoft Outlook Setup",
|
|
118
|
+
category: "microsoft",
|
|
119
|
+
steps: [
|
|
120
|
+
"Go to Azure Portal > Azure Active Directory",
|
|
121
|
+
"Click App registrations > New registration",
|
|
122
|
+
"Set redirect URI: http://localhost:3000/api/auth/outlook/callback",
|
|
123
|
+
"Go to API permissions > Add Microsoft Graph permissions",
|
|
124
|
+
"Add: Mail.Read, Mail.Send, Mail.ReadWrite",
|
|
125
|
+
"Go to Certificates & secrets > New client secret",
|
|
126
|
+
"Copy Application ID and Secret to .env",
|
|
127
|
+
],
|
|
128
|
+
link: "https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade",
|
|
129
|
+
envVars: ["MICROSOFT_CLIENT_ID", "MICROSOFT_CLIENT_SECRET"],
|
|
130
|
+
},
|
|
131
|
+
teams: {
|
|
132
|
+
title: "Microsoft Teams Setup",
|
|
133
|
+
category: "microsoft",
|
|
134
|
+
steps: [
|
|
135
|
+
"Uses same Microsoft OAuth credentials as Outlook",
|
|
136
|
+
"Add Teams permissions: Chat.Read, Chat.ReadWrite, Channel.ReadBasic.All",
|
|
137
|
+
"Add redirect URI: http://localhost:3000/api/auth/teams/callback",
|
|
138
|
+
],
|
|
139
|
+
link: "https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade",
|
|
140
|
+
envVars: ["MICROSOFT_CLIENT_ID", "MICROSOFT_CLIENT_SECRET"],
|
|
141
|
+
},
|
|
142
|
+
onedrive: {
|
|
143
|
+
title: "Microsoft OneDrive Setup",
|
|
144
|
+
category: "microsoft",
|
|
145
|
+
steps: [
|
|
146
|
+
"Uses same Microsoft OAuth credentials",
|
|
147
|
+
"Add permissions: Files.Read, Files.ReadWrite",
|
|
148
|
+
"Add redirect URI: http://localhost:3000/api/auth/onedrive/callback",
|
|
149
|
+
],
|
|
150
|
+
link: "https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade",
|
|
151
|
+
envVars: ["MICROSOFT_CLIENT_ID", "MICROSOFT_CLIENT_SECRET"],
|
|
43
152
|
},
|
|
153
|
+
sharepoint: {
|
|
154
|
+
title: "Microsoft SharePoint Setup",
|
|
155
|
+
category: "microsoft",
|
|
156
|
+
steps: [
|
|
157
|
+
"Uses same Microsoft OAuth credentials",
|
|
158
|
+
"Add permissions: Sites.Read.All, Sites.ReadWrite.All",
|
|
159
|
+
"Add redirect URI: http://localhost:3000/api/auth/sharepoint/callback",
|
|
160
|
+
],
|
|
161
|
+
link: "https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade",
|
|
162
|
+
envVars: ["MICROSOFT_CLIENT_ID", "MICROSOFT_CLIENT_SECRET"],
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
// Atlassian Services
|
|
166
|
+
jira: {
|
|
167
|
+
title: "Atlassian Jira Setup",
|
|
168
|
+
category: "atlassian",
|
|
169
|
+
steps: [
|
|
170
|
+
"Go to Atlassian Developer Console",
|
|
171
|
+
"Click Create > OAuth 2.0 integration",
|
|
172
|
+
"Add Jira API scopes: read:jira-work, write:jira-work",
|
|
173
|
+
"Set callback URL: http://localhost:3000/api/auth/jira/callback",
|
|
174
|
+
"Copy Client ID and Secret to .env",
|
|
175
|
+
],
|
|
176
|
+
link: "https://developer.atlassian.com/console/myapps/",
|
|
177
|
+
envVars: ["ATLASSIAN_CLIENT_ID", "ATLASSIAN_CLIENT_SECRET"],
|
|
178
|
+
},
|
|
179
|
+
confluence: {
|
|
180
|
+
title: "Atlassian Confluence Setup",
|
|
181
|
+
category: "atlassian",
|
|
182
|
+
steps: [
|
|
183
|
+
"Uses same Atlassian OAuth credentials as Jira",
|
|
184
|
+
"Add Confluence scopes: read:confluence-content.all, write:confluence-content",
|
|
185
|
+
"Add callback URL: http://localhost:3000/api/auth/confluence/callback",
|
|
186
|
+
],
|
|
187
|
+
link: "https://developer.atlassian.com/console/myapps/",
|
|
188
|
+
envVars: ["ATLASSIAN_CLIENT_ID", "ATLASSIAN_CLIENT_SECRET"],
|
|
189
|
+
},
|
|
190
|
+
bitbucket: {
|
|
191
|
+
title: "Atlassian Bitbucket Setup",
|
|
192
|
+
category: "atlassian",
|
|
193
|
+
steps: [
|
|
194
|
+
"Go to Bitbucket Settings > OAuth consumers",
|
|
195
|
+
"Click Add consumer",
|
|
196
|
+
"Set callback URL: http://localhost:3000/api/auth/bitbucket/callback",
|
|
197
|
+
"Add permissions: repository:read, repository:write",
|
|
198
|
+
"Copy Key and Secret to .env",
|
|
199
|
+
],
|
|
200
|
+
link: "https://bitbucket.org/account/settings/app-passwords/",
|
|
201
|
+
envVars: ["BITBUCKET_CLIENT_ID", "BITBUCKET_CLIENT_SECRET"],
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
// Communication
|
|
44
205
|
slack: {
|
|
45
206
|
title: "Slack App Setup",
|
|
207
|
+
category: "communication",
|
|
46
208
|
steps: [
|
|
47
209
|
"Go to Slack API Apps page",
|
|
48
|
-
"Create New App > From scratch",
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"Copy Client ID and Secret to your .env file",
|
|
210
|
+
"Click Create New App > From scratch",
|
|
211
|
+
"Go to OAuth & Permissions",
|
|
212
|
+
"Add scopes: channels:read, chat:write, users:read, channels:history",
|
|
52
213
|
"Add redirect URL: http://localhost:3000/api/auth/slack/callback",
|
|
214
|
+
"Install to Workspace",
|
|
215
|
+
"Copy Client ID and Secret to .env",
|
|
53
216
|
],
|
|
54
217
|
link: "https://api.slack.com/apps",
|
|
218
|
+
envVars: ["SLACK_CLIENT_ID", "SLACK_CLIENT_SECRET"],
|
|
219
|
+
},
|
|
220
|
+
discord: {
|
|
221
|
+
title: "Discord App Setup",
|
|
222
|
+
category: "communication",
|
|
223
|
+
steps: [
|
|
224
|
+
"Go to Discord Developer Portal",
|
|
225
|
+
"Click New Application",
|
|
226
|
+
"Go to OAuth2 section",
|
|
227
|
+
"Add redirect: http://localhost:3000/api/auth/discord/callback",
|
|
228
|
+
"Copy Client ID and Secret to .env",
|
|
229
|
+
"Add bot permissions as needed",
|
|
230
|
+
],
|
|
231
|
+
link: "https://discord.com/developers/applications",
|
|
232
|
+
envVars: ["DISCORD_CLIENT_ID", "DISCORD_CLIENT_SECRET"],
|
|
55
233
|
},
|
|
234
|
+
zoom: {
|
|
235
|
+
title: "Zoom App Setup",
|
|
236
|
+
category: "communication",
|
|
237
|
+
steps: [
|
|
238
|
+
"Go to Zoom App Marketplace",
|
|
239
|
+
"Click Develop > Build App",
|
|
240
|
+
"Choose OAuth app type",
|
|
241
|
+
"Add redirect URL: http://localhost:3000/api/auth/zoom/callback",
|
|
242
|
+
"Add scopes: meeting:read, meeting:write, user:read",
|
|
243
|
+
"Copy Client ID and Secret to .env",
|
|
244
|
+
],
|
|
245
|
+
link: "https://marketplace.zoom.us/develop/create",
|
|
246
|
+
envVars: ["ZOOM_CLIENT_ID", "ZOOM_CLIENT_SECRET"],
|
|
247
|
+
},
|
|
248
|
+
webex: {
|
|
249
|
+
title: "Webex Integration Setup",
|
|
250
|
+
category: "communication",
|
|
251
|
+
steps: [
|
|
252
|
+
"Go to Webex Developer Portal",
|
|
253
|
+
"Create a new integration",
|
|
254
|
+
"Add redirect URI: http://localhost:3000/api/auth/webex/callback",
|
|
255
|
+
"Select required scopes",
|
|
256
|
+
"Copy Client ID and Secret to .env",
|
|
257
|
+
],
|
|
258
|
+
link: "https://developer.webex.com/my-apps",
|
|
259
|
+
envVars: ["WEBEX_CLIENT_ID", "WEBEX_CLIENT_SECRET"],
|
|
260
|
+
},
|
|
261
|
+
twilio: {
|
|
262
|
+
title: "Twilio Setup",
|
|
263
|
+
category: "communication",
|
|
264
|
+
steps: [
|
|
265
|
+
"Go to Twilio Console",
|
|
266
|
+
"Copy Account SID and Auth Token",
|
|
267
|
+
"Get a phone number for SMS",
|
|
268
|
+
"Add credentials to .env",
|
|
269
|
+
],
|
|
270
|
+
link: "https://console.twilio.com/",
|
|
271
|
+
envVars: ["TWILIO_ACCOUNT_SID", "TWILIO_AUTH_TOKEN", "TWILIO_PHONE_NUMBER"],
|
|
272
|
+
},
|
|
273
|
+
|
|
274
|
+
// Development
|
|
56
275
|
github: {
|
|
57
276
|
title: "GitHub OAuth App Setup",
|
|
277
|
+
category: "development",
|
|
58
278
|
steps: [
|
|
59
279
|
"Go to GitHub Developer Settings",
|
|
60
|
-
"Click
|
|
61
|
-
"Set Homepage URL
|
|
62
|
-
"Set callback URL
|
|
63
|
-
"Copy Client ID and Secret to
|
|
280
|
+
"Click OAuth Apps > New OAuth App",
|
|
281
|
+
"Set Homepage URL: http://localhost:3000",
|
|
282
|
+
"Set callback URL: http://localhost:3000/api/auth/github/callback",
|
|
283
|
+
"Copy Client ID and Secret to .env",
|
|
64
284
|
],
|
|
65
285
|
link: "https://github.com/settings/developers",
|
|
286
|
+
envVars: ["GITHUB_CLIENT_ID", "GITHUB_CLIENT_SECRET"],
|
|
66
287
|
},
|
|
67
|
-
|
|
68
|
-
title: "
|
|
288
|
+
gitlab: {
|
|
289
|
+
title: "GitLab OAuth Setup",
|
|
290
|
+
category: "development",
|
|
69
291
|
steps: [
|
|
70
|
-
"Go to
|
|
71
|
-
"Create
|
|
72
|
-
"Add
|
|
73
|
-
"
|
|
74
|
-
"Copy
|
|
292
|
+
"Go to GitLab User Settings > Applications",
|
|
293
|
+
"Create new application",
|
|
294
|
+
"Add redirect URI: http://localhost:3000/api/auth/gitlab/callback",
|
|
295
|
+
"Select scopes: api, read_user, read_repository",
|
|
296
|
+
"Copy Application ID and Secret to .env",
|
|
75
297
|
],
|
|
76
|
-
link: "https://
|
|
298
|
+
link: "https://gitlab.com/-/profile/applications",
|
|
299
|
+
envVars: ["GITLAB_CLIENT_ID", "GITLAB_CLIENT_SECRET"],
|
|
77
300
|
},
|
|
301
|
+
sentry: {
|
|
302
|
+
title: "Sentry Setup",
|
|
303
|
+
category: "development",
|
|
304
|
+
steps: [
|
|
305
|
+
"Go to Sentry Settings > Developer Settings",
|
|
306
|
+
"Create new integration",
|
|
307
|
+
"Add redirect URL: http://localhost:3000/api/auth/sentry/callback",
|
|
308
|
+
"Copy Client ID and Secret to .env",
|
|
309
|
+
],
|
|
310
|
+
link: "https://sentry.io/settings/developer-settings/",
|
|
311
|
+
envVars: ["SENTRY_CLIENT_ID", "SENTRY_CLIENT_SECRET"],
|
|
312
|
+
},
|
|
313
|
+
posthog: {
|
|
314
|
+
title: "PostHog Setup",
|
|
315
|
+
category: "development",
|
|
316
|
+
steps: [
|
|
317
|
+
"Go to PostHog Project Settings",
|
|
318
|
+
"Copy your Project API Key",
|
|
319
|
+
"Add to .env file",
|
|
320
|
+
],
|
|
321
|
+
link: "https://app.posthog.com/project/settings",
|
|
322
|
+
envVars: ["POSTHOG_API_KEY", "POSTHOG_HOST"],
|
|
323
|
+
},
|
|
324
|
+
mixpanel: {
|
|
325
|
+
title: "Mixpanel Setup",
|
|
326
|
+
category: "development",
|
|
327
|
+
steps: [
|
|
328
|
+
"Go to Mixpanel Project Settings",
|
|
329
|
+
"Copy your Project Token",
|
|
330
|
+
"For API access, create a Service Account",
|
|
331
|
+
"Add credentials to .env",
|
|
332
|
+
],
|
|
333
|
+
link: "https://mixpanel.com/settings/project",
|
|
334
|
+
envVars: ["MIXPANEL_TOKEN", "MIXPANEL_API_SECRET"],
|
|
335
|
+
},
|
|
336
|
+
|
|
337
|
+
// Productivity
|
|
78
338
|
notion: {
|
|
79
339
|
title: "Notion Integration Setup",
|
|
340
|
+
category: "productivity",
|
|
80
341
|
steps: [
|
|
81
342
|
"Go to Notion Integrations page",
|
|
82
|
-
"
|
|
343
|
+
"Click New integration",
|
|
344
|
+
"Name your integration and select workspace",
|
|
83
345
|
"Copy the Internal Integration Token",
|
|
84
|
-
"
|
|
85
|
-
"
|
|
346
|
+
"Share desired pages/databases with your integration",
|
|
347
|
+
"Add token to .env",
|
|
86
348
|
],
|
|
87
349
|
link: "https://www.notion.so/my-integrations",
|
|
350
|
+
envVars: ["NOTION_API_KEY"],
|
|
351
|
+
},
|
|
352
|
+
linear: {
|
|
353
|
+
title: "Linear OAuth Setup",
|
|
354
|
+
category: "productivity",
|
|
355
|
+
steps: [
|
|
356
|
+
"Go to Linear Settings > API",
|
|
357
|
+
"Create new OAuth application",
|
|
358
|
+
"Add redirect URI: http://localhost:3000/api/auth/linear/callback",
|
|
359
|
+
"Copy Client ID and Secret to .env",
|
|
360
|
+
],
|
|
361
|
+
link: "https://linear.app/settings/api",
|
|
362
|
+
envVars: ["LINEAR_CLIENT_ID", "LINEAR_CLIENT_SECRET"],
|
|
363
|
+
},
|
|
364
|
+
asana: {
|
|
365
|
+
title: "Asana OAuth Setup",
|
|
366
|
+
category: "productivity",
|
|
367
|
+
steps: [
|
|
368
|
+
"Go to Asana Developer Console",
|
|
369
|
+
"Create new app",
|
|
370
|
+
"Add redirect URI: http://localhost:3000/api/auth/asana/callback",
|
|
371
|
+
"Copy Client ID and Secret to .env",
|
|
372
|
+
],
|
|
373
|
+
link: "https://app.asana.com/0/developer-console",
|
|
374
|
+
envVars: ["ASANA_CLIENT_ID", "ASANA_CLIENT_SECRET"],
|
|
375
|
+
},
|
|
376
|
+
trello: {
|
|
377
|
+
title: "Trello Power-Up Setup",
|
|
378
|
+
category: "productivity",
|
|
379
|
+
steps: [
|
|
380
|
+
"Go to Trello Power-Ups Admin",
|
|
381
|
+
"Create new Power-Up",
|
|
382
|
+
"Add redirect URI: http://localhost:3000/api/auth/trello/callback",
|
|
383
|
+
"Copy API Key and Secret to .env",
|
|
384
|
+
],
|
|
385
|
+
link: "https://trello.com/power-ups/admin",
|
|
386
|
+
envVars: ["TRELLO_API_KEY", "TRELLO_API_SECRET"],
|
|
387
|
+
},
|
|
388
|
+
monday: {
|
|
389
|
+
title: "Monday.com App Setup",
|
|
390
|
+
category: "productivity",
|
|
391
|
+
steps: [
|
|
392
|
+
"Go to monday.com Developers",
|
|
393
|
+
"Create new app",
|
|
394
|
+
"Add OAuth redirect: http://localhost:3000/api/auth/monday/callback",
|
|
395
|
+
"Copy Client ID and Secret to .env",
|
|
396
|
+
],
|
|
397
|
+
link: "https://monday.com/developers/apps",
|
|
398
|
+
envVars: ["MONDAY_CLIENT_ID", "MONDAY_CLIENT_SECRET"],
|
|
399
|
+
},
|
|
400
|
+
clickup: {
|
|
401
|
+
title: "ClickUp OAuth Setup",
|
|
402
|
+
category: "productivity",
|
|
403
|
+
steps: [
|
|
404
|
+
"Go to ClickUp Settings > Apps",
|
|
405
|
+
"Create new app",
|
|
406
|
+
"Add redirect URI: http://localhost:3000/api/auth/clickup/callback",
|
|
407
|
+
"Copy Client ID and Secret to .env",
|
|
408
|
+
],
|
|
409
|
+
link: "https://app.clickup.com/settings/apps",
|
|
410
|
+
envVars: ["CLICKUP_CLIENT_ID", "CLICKUP_CLIENT_SECRET"],
|
|
411
|
+
},
|
|
412
|
+
|
|
413
|
+
// Storage
|
|
414
|
+
dropbox: {
|
|
415
|
+
title: "Dropbox App Setup",
|
|
416
|
+
category: "storage",
|
|
417
|
+
steps: [
|
|
418
|
+
"Go to Dropbox App Console",
|
|
419
|
+
"Create new app",
|
|
420
|
+
"Choose Scoped access and Full Dropbox",
|
|
421
|
+
"Add redirect URI: http://localhost:3000/api/auth/dropbox/callback",
|
|
422
|
+
"Copy App Key and Secret to .env",
|
|
423
|
+
],
|
|
424
|
+
link: "https://www.dropbox.com/developers/apps",
|
|
425
|
+
envVars: ["DROPBOX_CLIENT_ID", "DROPBOX_CLIENT_SECRET"],
|
|
426
|
+
},
|
|
427
|
+
box: {
|
|
428
|
+
title: "Box App Setup",
|
|
429
|
+
category: "storage",
|
|
430
|
+
steps: [
|
|
431
|
+
"Go to Box Developer Console",
|
|
432
|
+
"Create new app with OAuth 2.0",
|
|
433
|
+
"Add redirect URI: http://localhost:3000/api/auth/box/callback",
|
|
434
|
+
"Copy Client ID and Secret to .env",
|
|
435
|
+
],
|
|
436
|
+
link: "https://app.box.com/developers/console",
|
|
437
|
+
envVars: ["BOX_CLIENT_ID", "BOX_CLIENT_SECRET"],
|
|
438
|
+
},
|
|
439
|
+
airtable: {
|
|
440
|
+
title: "Airtable OAuth Setup",
|
|
441
|
+
category: "storage",
|
|
442
|
+
steps: [
|
|
443
|
+
"Go to Airtable Developer Hub",
|
|
444
|
+
"Create new OAuth integration",
|
|
445
|
+
"Add redirect URI: http://localhost:3000/api/auth/airtable/callback",
|
|
446
|
+
"Select required scopes",
|
|
447
|
+
"Copy Client ID and Secret to .env",
|
|
448
|
+
],
|
|
449
|
+
link: "https://airtable.com/create/oauth",
|
|
450
|
+
envVars: ["AIRTABLE_CLIENT_ID", "AIRTABLE_CLIENT_SECRET"],
|
|
451
|
+
},
|
|
452
|
+
|
|
453
|
+
// Infrastructure
|
|
454
|
+
supabase: {
|
|
455
|
+
title: "Supabase Setup",
|
|
456
|
+
category: "infrastructure",
|
|
457
|
+
steps: [
|
|
458
|
+
"Go to Supabase Dashboard",
|
|
459
|
+
"Create new project or select existing",
|
|
460
|
+
"Go to Settings > API",
|
|
461
|
+
"Copy Project URL and anon/service_role keys",
|
|
462
|
+
"Add to .env file",
|
|
463
|
+
],
|
|
464
|
+
link: "https://supabase.com/dashboard",
|
|
465
|
+
envVars: ["SUPABASE_URL", "SUPABASE_ANON_KEY", "SUPABASE_SERVICE_ROLE_KEY"],
|
|
466
|
+
},
|
|
467
|
+
neon: {
|
|
468
|
+
title: "Neon Database Setup",
|
|
469
|
+
category: "infrastructure",
|
|
470
|
+
steps: [
|
|
471
|
+
"Go to Neon Console",
|
|
472
|
+
"Create new project",
|
|
473
|
+
"Copy connection string from Dashboard",
|
|
474
|
+
"Add to .env file",
|
|
475
|
+
],
|
|
476
|
+
link: "https://console.neon.tech/",
|
|
477
|
+
envVars: ["DATABASE_URL"],
|
|
478
|
+
},
|
|
479
|
+
snowflake: {
|
|
480
|
+
title: "Snowflake Setup",
|
|
481
|
+
category: "infrastructure",
|
|
482
|
+
steps: [
|
|
483
|
+
"Go to Snowflake Console",
|
|
484
|
+
"Create a service account or use existing credentials",
|
|
485
|
+
"Note your account identifier, warehouse, database",
|
|
486
|
+
"Add credentials to .env",
|
|
487
|
+
],
|
|
488
|
+
link: "https://app.snowflake.com/",
|
|
489
|
+
envVars: ["SNOWFLAKE_ACCOUNT", "SNOWFLAKE_USER", "SNOWFLAKE_PASSWORD", "SNOWFLAKE_WAREHOUSE"],
|
|
490
|
+
},
|
|
491
|
+
aws: {
|
|
492
|
+
title: "AWS Setup",
|
|
493
|
+
category: "infrastructure",
|
|
494
|
+
steps: [
|
|
495
|
+
"Go to AWS IAM Console",
|
|
496
|
+
"Create new IAM user with programmatic access",
|
|
497
|
+
"Attach required policies (S3, Lambda, DynamoDB)",
|
|
498
|
+
"Copy Access Key ID and Secret",
|
|
499
|
+
"Add to .env file",
|
|
500
|
+
],
|
|
501
|
+
link: "https://console.aws.amazon.com/iam/",
|
|
502
|
+
envVars: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_REGION"],
|
|
503
|
+
},
|
|
504
|
+
|
|
505
|
+
// Sales & CRM
|
|
506
|
+
salesforce: {
|
|
507
|
+
title: "Salesforce Connected App Setup",
|
|
508
|
+
category: "sales",
|
|
509
|
+
steps: [
|
|
510
|
+
"Go to Salesforce Setup > App Manager",
|
|
511
|
+
"Create new Connected App",
|
|
512
|
+
"Enable OAuth Settings",
|
|
513
|
+
"Add callback URL: http://localhost:3000/api/auth/salesforce/callback",
|
|
514
|
+
"Select OAuth scopes: api, refresh_token",
|
|
515
|
+
"Copy Consumer Key and Secret to .env",
|
|
516
|
+
],
|
|
517
|
+
link: "https://login.salesforce.com/",
|
|
518
|
+
envVars: ["SALESFORCE_CLIENT_ID", "SALESFORCE_CLIENT_SECRET"],
|
|
519
|
+
},
|
|
520
|
+
hubspot: {
|
|
521
|
+
title: "HubSpot App Setup",
|
|
522
|
+
category: "sales",
|
|
523
|
+
steps: [
|
|
524
|
+
"Go to HubSpot Developer Portal",
|
|
525
|
+
"Create new app",
|
|
526
|
+
"Add redirect URI: http://localhost:3000/api/auth/hubspot/callback",
|
|
527
|
+
"Select required scopes",
|
|
528
|
+
"Copy Client ID and Secret to .env",
|
|
529
|
+
],
|
|
530
|
+
link: "https://developers.hubspot.com/",
|
|
531
|
+
envVars: ["HUBSPOT_CLIENT_ID", "HUBSPOT_CLIENT_SECRET"],
|
|
532
|
+
},
|
|
533
|
+
pipedrive: {
|
|
534
|
+
title: "Pipedrive OAuth Setup",
|
|
535
|
+
category: "sales",
|
|
536
|
+
steps: [
|
|
537
|
+
"Go to Pipedrive Developer Hub",
|
|
538
|
+
"Create new app",
|
|
539
|
+
"Add redirect URI: http://localhost:3000/api/auth/pipedrive/callback",
|
|
540
|
+
"Copy Client ID and Secret to .env",
|
|
541
|
+
],
|
|
542
|
+
link: "https://developers.pipedrive.com/",
|
|
543
|
+
envVars: ["PIPEDRIVE_CLIENT_ID", "PIPEDRIVE_CLIENT_SECRET"],
|
|
544
|
+
},
|
|
545
|
+
|
|
546
|
+
// Support
|
|
547
|
+
zendesk: {
|
|
548
|
+
title: "Zendesk OAuth Setup",
|
|
549
|
+
category: "support",
|
|
550
|
+
steps: [
|
|
551
|
+
"Go to Zendesk Admin > API > OAuth Clients",
|
|
552
|
+
"Add new OAuth client",
|
|
553
|
+
"Set redirect URI: http://localhost:3000/api/auth/zendesk/callback",
|
|
554
|
+
"Copy Client ID and Secret to .env",
|
|
555
|
+
"Add your Zendesk subdomain",
|
|
556
|
+
],
|
|
557
|
+
link: "https://support.zendesk.com/hc/en-us/articles/4408845965210",
|
|
558
|
+
envVars: ["ZENDESK_CLIENT_ID", "ZENDESK_CLIENT_SECRET", "ZENDESK_SUBDOMAIN"],
|
|
559
|
+
},
|
|
560
|
+
intercom: {
|
|
561
|
+
title: "Intercom OAuth Setup",
|
|
562
|
+
category: "support",
|
|
563
|
+
steps: [
|
|
564
|
+
"Go to Intercom Developer Hub",
|
|
565
|
+
"Create new app",
|
|
566
|
+
"Add redirect URI: http://localhost:3000/api/auth/intercom/callback",
|
|
567
|
+
"Copy Client ID and Secret to .env",
|
|
568
|
+
],
|
|
569
|
+
link: "https://developers.intercom.com/",
|
|
570
|
+
envVars: ["INTERCOM_CLIENT_ID", "INTERCOM_CLIENT_SECRET"],
|
|
571
|
+
},
|
|
572
|
+
freshdesk: {
|
|
573
|
+
title: "Freshdesk OAuth Setup",
|
|
574
|
+
category: "support",
|
|
575
|
+
steps: [
|
|
576
|
+
"Go to Freshdesk Admin > Apps > Custom Apps",
|
|
577
|
+
"Create new OAuth application",
|
|
578
|
+
"Add redirect URI: http://localhost:3000/api/auth/freshdesk/callback",
|
|
579
|
+
"Copy Client ID and Secret to .env",
|
|
580
|
+
],
|
|
581
|
+
link: "https://developers.freshdesk.com/",
|
|
582
|
+
envVars: ["FRESHDESK_CLIENT_ID", "FRESHDESK_CLIENT_SECRET", "FRESHDESK_DOMAIN"],
|
|
583
|
+
},
|
|
584
|
+
servicenow: {
|
|
585
|
+
title: "ServiceNow OAuth Setup",
|
|
586
|
+
category: "support",
|
|
587
|
+
steps: [
|
|
588
|
+
"Go to ServiceNow System OAuth > Application Registry",
|
|
589
|
+
"Create OAuth API endpoint for external clients",
|
|
590
|
+
"Add redirect URL: http://localhost:3000/api/auth/servicenow/callback",
|
|
591
|
+
"Copy Client ID and Secret to .env",
|
|
592
|
+
],
|
|
593
|
+
link: "https://docs.servicenow.com/",
|
|
594
|
+
envVars: ["SERVICENOW_CLIENT_ID", "SERVICENOW_CLIENT_SECRET", "SERVICENOW_INSTANCE"],
|
|
595
|
+
},
|
|
596
|
+
|
|
597
|
+
// Finance
|
|
598
|
+
stripe: {
|
|
599
|
+
title: "Stripe Setup",
|
|
600
|
+
category: "finance",
|
|
601
|
+
steps: [
|
|
602
|
+
"Go to Stripe Dashboard",
|
|
603
|
+
"Go to Developers > API keys",
|
|
604
|
+
"Copy Publishable and Secret keys",
|
|
605
|
+
"For Connect, set up OAuth in Connect settings",
|
|
606
|
+
"Add to .env file",
|
|
607
|
+
],
|
|
608
|
+
link: "https://dashboard.stripe.com/apikeys",
|
|
609
|
+
envVars: ["STRIPE_SECRET_KEY", "STRIPE_PUBLISHABLE_KEY"],
|
|
610
|
+
},
|
|
611
|
+
quickbooks: {
|
|
612
|
+
title: "QuickBooks OAuth Setup",
|
|
613
|
+
category: "finance",
|
|
614
|
+
steps: [
|
|
615
|
+
"Go to Intuit Developer Portal",
|
|
616
|
+
"Create new app",
|
|
617
|
+
"Add redirect URI: http://localhost:3000/api/auth/quickbooks/callback",
|
|
618
|
+
"Select Accounting scope",
|
|
619
|
+
"Copy Client ID and Secret to .env",
|
|
620
|
+
],
|
|
621
|
+
link: "https://developer.intuit.com/app/developer/dashboard",
|
|
622
|
+
envVars: ["QUICKBOOKS_CLIENT_ID", "QUICKBOOKS_CLIENT_SECRET"],
|
|
623
|
+
},
|
|
624
|
+
xero: {
|
|
625
|
+
title: "Xero OAuth Setup",
|
|
626
|
+
category: "finance",
|
|
627
|
+
steps: [
|
|
628
|
+
"Go to Xero Developer Portal",
|
|
629
|
+
"Create new app",
|
|
630
|
+
"Add redirect URI: http://localhost:3000/api/auth/xero/callback",
|
|
631
|
+
"Select required scopes",
|
|
632
|
+
"Copy Client ID and Secret to .env",
|
|
633
|
+
],
|
|
634
|
+
link: "https://developer.xero.com/app/manage",
|
|
635
|
+
envVars: ["XERO_CLIENT_ID", "XERO_CLIENT_SECRET"],
|
|
636
|
+
},
|
|
637
|
+
|
|
638
|
+
// Marketing
|
|
639
|
+
mailchimp: {
|
|
640
|
+
title: "Mailchimp OAuth Setup",
|
|
641
|
+
category: "marketing",
|
|
642
|
+
steps: [
|
|
643
|
+
"Go to Mailchimp Developer Portal",
|
|
644
|
+
"Register new app",
|
|
645
|
+
"Add redirect URI: http://localhost:3000/api/auth/mailchimp/callback",
|
|
646
|
+
"Copy Client ID and Secret to .env",
|
|
647
|
+
],
|
|
648
|
+
link: "https://admin.mailchimp.com/account/oauth2/",
|
|
649
|
+
envVars: ["MAILCHIMP_CLIENT_ID", "MAILCHIMP_CLIENT_SECRET"],
|
|
650
|
+
},
|
|
651
|
+
shopify: {
|
|
652
|
+
title: "Shopify App Setup",
|
|
653
|
+
category: "marketing",
|
|
654
|
+
steps: [
|
|
655
|
+
"Go to Shopify Partners Dashboard",
|
|
656
|
+
"Create new app",
|
|
657
|
+
"Add redirect URI: http://localhost:3000/api/auth/shopify/callback",
|
|
658
|
+
"Copy API Key and Secret to .env",
|
|
659
|
+
],
|
|
660
|
+
link: "https://partners.shopify.com/",
|
|
661
|
+
envVars: ["SHOPIFY_API_KEY", "SHOPIFY_API_SECRET"],
|
|
662
|
+
},
|
|
663
|
+
twitter: {
|
|
664
|
+
title: "Twitter/X OAuth Setup",
|
|
665
|
+
category: "marketing",
|
|
666
|
+
steps: [
|
|
667
|
+
"Go to Twitter Developer Portal",
|
|
668
|
+
"Create new project and app",
|
|
669
|
+
"Enable OAuth 2.0",
|
|
670
|
+
"Add redirect URI: http://localhost:3000/api/auth/twitter/callback",
|
|
671
|
+
"Copy Client ID and Secret to .env",
|
|
672
|
+
],
|
|
673
|
+
link: "https://developer.twitter.com/en/portal/dashboard",
|
|
674
|
+
envVars: ["TWITTER_CLIENT_ID", "TWITTER_CLIENT_SECRET"],
|
|
675
|
+
},
|
|
676
|
+
|
|
677
|
+
// Design
|
|
678
|
+
figma: {
|
|
679
|
+
title: "Figma OAuth Setup",
|
|
680
|
+
category: "design",
|
|
681
|
+
steps: [
|
|
682
|
+
"Go to Figma Developer Settings",
|
|
683
|
+
"Create new app",
|
|
684
|
+
"Add redirect URI: http://localhost:3000/api/auth/figma/callback",
|
|
685
|
+
"Copy Client ID and Secret to .env",
|
|
686
|
+
],
|
|
687
|
+
link: "https://www.figma.com/developers/apps",
|
|
688
|
+
envVars: ["FIGMA_CLIENT_ID", "FIGMA_CLIENT_SECRET"],
|
|
689
|
+
},
|
|
690
|
+
|
|
691
|
+
// AI
|
|
692
|
+
anthropic: {
|
|
693
|
+
title: "Anthropic API Setup",
|
|
694
|
+
category: "ai",
|
|
695
|
+
steps: [
|
|
696
|
+
"Go to Anthropic Console",
|
|
697
|
+
"Create new API key",
|
|
698
|
+
"Copy API key to .env",
|
|
699
|
+
],
|
|
700
|
+
link: "https://console.anthropic.com/",
|
|
701
|
+
envVars: ["ANTHROPIC_API_KEY"],
|
|
88
702
|
},
|
|
89
703
|
};
|
|
90
704
|
|
|
@@ -93,23 +707,76 @@ export default function SetupPage() {
|
|
|
93
707
|
const [loading, setLoading] = useState(true);
|
|
94
708
|
const [expandedGuide, setExpandedGuide] = useState<string | null>(null);
|
|
95
709
|
const [envChecked, setEnvChecked] = useState(false);
|
|
710
|
+
const [searchQuery, setSearchQuery] = useState("");
|
|
711
|
+
const [selectedCategory, setSelectedCategory] = useState<string | null>(null);
|
|
712
|
+
const [tokenStorage, setTokenStorage] = useState<TokenStorageStatus | null>(null);
|
|
96
713
|
|
|
97
714
|
useEffect(() => {
|
|
98
715
|
fetchStatus();
|
|
716
|
+
fetchTokenStorage();
|
|
99
717
|
}, []);
|
|
100
718
|
|
|
101
719
|
async function fetchStatus() {
|
|
102
720
|
try {
|
|
103
721
|
const res = await fetch("/api/integrations/status");
|
|
722
|
+
if (!res.ok) {
|
|
723
|
+
console.error("Failed to fetch integration status:", res.status);
|
|
724
|
+
setIntegrations([]);
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
104
727
|
const data = await res.json();
|
|
105
|
-
setIntegrations(data.integrations);
|
|
728
|
+
setIntegrations(data.integrations || []);
|
|
106
729
|
} catch (error) {
|
|
107
730
|
console.error("Failed to fetch integration status:", error);
|
|
731
|
+
setIntegrations([]);
|
|
108
732
|
} finally {
|
|
109
733
|
setLoading(false);
|
|
110
734
|
}
|
|
111
735
|
}
|
|
112
736
|
|
|
737
|
+
async function fetchTokenStorage() {
|
|
738
|
+
try {
|
|
739
|
+
const res = await fetch("/api/integrations/token-storage");
|
|
740
|
+
if (!res.ok) {
|
|
741
|
+
setTokenStorage({ mode: "memory", encrypted: false });
|
|
742
|
+
return;
|
|
743
|
+
}
|
|
744
|
+
const data = await res.json();
|
|
745
|
+
setTokenStorage(data);
|
|
746
|
+
} catch {
|
|
747
|
+
// Token storage endpoint may not exist yet
|
|
748
|
+
setTokenStorage({ mode: "memory", encrypted: false });
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
// Filter integrations based on search and category
|
|
753
|
+
const filteredIntegrations = useMemo(() => {
|
|
754
|
+
return integrations.filter((integration) => {
|
|
755
|
+
const guide = OAUTH_SETUP_GUIDES[integration.id];
|
|
756
|
+
const matchesSearch =
|
|
757
|
+
searchQuery === "" ||
|
|
758
|
+
integration.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
|
759
|
+
integration.id.toLowerCase().includes(searchQuery.toLowerCase());
|
|
760
|
+
const matchesCategory =
|
|
761
|
+
selectedCategory === null || (guide && guide.category === selectedCategory);
|
|
762
|
+
return matchesSearch && matchesCategory;
|
|
763
|
+
});
|
|
764
|
+
}, [integrations, searchQuery, selectedCategory]);
|
|
765
|
+
|
|
766
|
+
// Group integrations by category for display
|
|
767
|
+
const groupedIntegrations = useMemo(() => {
|
|
768
|
+
const groups: Record<string, Integration[]> = {};
|
|
769
|
+
for (const integration of filteredIntegrations) {
|
|
770
|
+
const guide = OAUTH_SETUP_GUIDES[integration.id];
|
|
771
|
+
const category = guide?.category || "other";
|
|
772
|
+
if (!groups[category]) {
|
|
773
|
+
groups[category] = [];
|
|
774
|
+
}
|
|
775
|
+
groups[category].push(integration);
|
|
776
|
+
}
|
|
777
|
+
return groups;
|
|
778
|
+
}, [filteredIntegrations]);
|
|
779
|
+
|
|
113
780
|
const connectedCount = integrations.filter((i) => i.connected).length;
|
|
114
781
|
const totalCount = integrations.length;
|
|
115
782
|
const progress = totalCount > 0 ? (connectedCount / totalCount) * 100 : 0;
|
|
@@ -167,6 +834,76 @@ export default function SetupPage() {
|
|
|
167
834
|
</div>
|
|
168
835
|
</div>
|
|
169
836
|
|
|
837
|
+
{/* Token Storage Status */}
|
|
838
|
+
{tokenStorage && (
|
|
839
|
+
<div className={`rounded-2xl p-6 shadow-sm border mb-8 ${
|
|
840
|
+
tokenStorage.mode === "memory"
|
|
841
|
+
? "bg-amber-50 dark:bg-amber-900/20 border-amber-200 dark:border-amber-800"
|
|
842
|
+
: "bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800"
|
|
843
|
+
}`}>
|
|
844
|
+
<div className="flex items-start gap-4">
|
|
845
|
+
<div className={`w-10 h-10 rounded-full flex items-center justify-center ${
|
|
846
|
+
tokenStorage.mode === "memory"
|
|
847
|
+
? "bg-amber-100 dark:bg-amber-900"
|
|
848
|
+
: "bg-green-100 dark:bg-green-900"
|
|
849
|
+
}`}>
|
|
850
|
+
{tokenStorage.mode === "memory" ? (
|
|
851
|
+
<svg className="w-5 h-5 text-amber-600 dark:text-amber-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
852
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
|
|
853
|
+
</svg>
|
|
854
|
+
) : (
|
|
855
|
+
<svg className="w-5 h-5 text-green-600 dark:text-green-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
856
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" />
|
|
857
|
+
</svg>
|
|
858
|
+
)}
|
|
859
|
+
</div>
|
|
860
|
+
<div className="flex-1">
|
|
861
|
+
<h3 className={`font-semibold ${
|
|
862
|
+
tokenStorage.mode === "memory"
|
|
863
|
+
? "text-amber-800 dark:text-amber-200"
|
|
864
|
+
: "text-green-800 dark:text-green-200"
|
|
865
|
+
}`}>
|
|
866
|
+
Token Storage: {tokenStorage.mode === "memory" ? "Development Mode" : `${tokenStorage.mode.charAt(0).toUpperCase() + tokenStorage.mode.slice(1)} Storage`}
|
|
867
|
+
</h3>
|
|
868
|
+
<p className={`text-sm mt-1 ${
|
|
869
|
+
tokenStorage.mode === "memory"
|
|
870
|
+
? "text-amber-700 dark:text-amber-300"
|
|
871
|
+
: "text-green-700 dark:text-green-300"
|
|
872
|
+
}`}>
|
|
873
|
+
{tokenStorage.mode === "memory" ? (
|
|
874
|
+
<>Tokens are stored in memory and will be lost on restart. Set <code className="px-1 py-0.5 bg-amber-100 dark:bg-amber-900 rounded text-xs">DATABASE_URL</code>, <code className="px-1 py-0.5 bg-amber-100 dark:bg-amber-900 rounded text-xs">KV_REST_API_URL</code>, or <code className="px-1 py-0.5 bg-amber-100 dark:bg-amber-900 rounded text-xs">REDIS_URL</code> for production.</>
|
|
875
|
+
) : (
|
|
876
|
+
<>Tokens are persisted to {tokenStorage.mode} storage.</>
|
|
877
|
+
)}
|
|
878
|
+
</p>
|
|
879
|
+
<div className="mt-2 flex items-center gap-4 text-sm">
|
|
880
|
+
<span className={`inline-flex items-center gap-1.5 ${
|
|
881
|
+
tokenStorage.encrypted
|
|
882
|
+
? "text-green-600 dark:text-green-400"
|
|
883
|
+
: "text-amber-600 dark:text-amber-400"
|
|
884
|
+
}`}>
|
|
885
|
+
{tokenStorage.encrypted ? (
|
|
886
|
+
<>
|
|
887
|
+
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
888
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />
|
|
889
|
+
</svg>
|
|
890
|
+
Encryption enabled
|
|
891
|
+
</>
|
|
892
|
+
) : (
|
|
893
|
+
<>
|
|
894
|
+
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
895
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z" />
|
|
896
|
+
</svg>
|
|
897
|
+
Set <code className="px-1 py-0.5 bg-amber-100 dark:bg-amber-900 rounded text-xs">TOKEN_ENCRYPTION_KEY</code> for encryption
|
|
898
|
+
</>
|
|
899
|
+
)}
|
|
900
|
+
</span>
|
|
901
|
+
</div>
|
|
902
|
+
</div>
|
|
903
|
+
</div>
|
|
904
|
+
</div>
|
|
905
|
+
)}
|
|
906
|
+
|
|
170
907
|
{/* Setup Steps */}
|
|
171
908
|
<div className="bg-white dark:bg-neutral-800 rounded-2xl shadow-sm border border-neutral-200 dark:border-neutral-700 mb-8 overflow-hidden">
|
|
172
909
|
<div className="p-6 border-b border-neutral-200 dark:border-neutral-700">
|
|
@@ -227,13 +964,71 @@ export default function SetupPage() {
|
|
|
227
964
|
<p className="text-sm text-neutral-600 dark:text-neutral-400 mt-1">
|
|
228
965
|
Click on a service to see setup instructions or connect
|
|
229
966
|
</p>
|
|
967
|
+
|
|
968
|
+
{/* Search Input */}
|
|
969
|
+
<div className="mt-4">
|
|
970
|
+
<input
|
|
971
|
+
type="text"
|
|
972
|
+
placeholder="Search services..."
|
|
973
|
+
value={searchQuery}
|
|
974
|
+
onChange={(e) => setSearchQuery(e.target.value)}
|
|
975
|
+
className="w-full px-4 py-2 bg-neutral-100 dark:bg-neutral-900 border border-neutral-200 dark:border-neutral-700 rounded-xl text-neutral-900 dark:text-white placeholder-neutral-500 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
976
|
+
/>
|
|
977
|
+
</div>
|
|
978
|
+
|
|
979
|
+
{/* Category Filter Pills */}
|
|
980
|
+
<div className="mt-4 flex flex-wrap gap-2">
|
|
981
|
+
<button
|
|
982
|
+
type="button"
|
|
983
|
+
onClick={() => setSelectedCategory(null)}
|
|
984
|
+
className={`px-3 py-1.5 text-sm font-medium rounded-lg transition-colors ${
|
|
985
|
+
selectedCategory === null
|
|
986
|
+
? "bg-neutral-900 dark:bg-white text-white dark:text-neutral-900"
|
|
987
|
+
: "bg-neutral-100 dark:bg-neutral-700 text-neutral-600 dark:text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-600"
|
|
988
|
+
}`}
|
|
989
|
+
>
|
|
990
|
+
All
|
|
991
|
+
</button>
|
|
992
|
+
{CATEGORIES.map((category) => (
|
|
993
|
+
<button
|
|
994
|
+
key={category.id}
|
|
995
|
+
type="button"
|
|
996
|
+
onClick={() =>
|
|
997
|
+
setSelectedCategory(selectedCategory === category.id ? null : category.id)}
|
|
998
|
+
className={`px-3 py-1.5 text-sm font-medium rounded-lg transition-colors ${
|
|
999
|
+
selectedCategory === category.id
|
|
1000
|
+
? "bg-neutral-900 dark:bg-white text-white dark:text-neutral-900"
|
|
1001
|
+
: "bg-neutral-100 dark:bg-neutral-700 text-neutral-600 dark:text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-600"
|
|
1002
|
+
}`}
|
|
1003
|
+
>
|
|
1004
|
+
{category.name}
|
|
1005
|
+
</button>
|
|
1006
|
+
))}
|
|
1007
|
+
</div>
|
|
230
1008
|
</div>
|
|
231
1009
|
|
|
232
1010
|
{loading
|
|
233
1011
|
? <div className="p-12 text-center text-neutral-500">Loading...</div>
|
|
234
|
-
:
|
|
235
|
-
|
|
236
|
-
|
|
1012
|
+
: filteredIntegrations.length === 0
|
|
1013
|
+
? (
|
|
1014
|
+
<div className="p-12 text-center text-neutral-500">
|
|
1015
|
+
No services found matching your search
|
|
1016
|
+
</div>
|
|
1017
|
+
)
|
|
1018
|
+
: (
|
|
1019
|
+
<div>
|
|
1020
|
+
{CATEGORIES.filter((cat) => groupedIntegrations[cat.id]?.length > 0).map(
|
|
1021
|
+
(category) => (
|
|
1022
|
+
<div key={category.id}>
|
|
1023
|
+
{/* Category Header */}
|
|
1024
|
+
<div className="px-6 py-3 bg-neutral-50 dark:bg-neutral-900 border-b border-neutral-200 dark:border-neutral-700">
|
|
1025
|
+
<h3 className="text-sm font-semibold text-neutral-500 dark:text-neutral-400 uppercase tracking-wider">
|
|
1026
|
+
{category.name}
|
|
1027
|
+
</h3>
|
|
1028
|
+
</div>
|
|
1029
|
+
{/* Services in this category */}
|
|
1030
|
+
<div className="divide-y divide-neutral-200 dark:divide-neutral-700">
|
|
1031
|
+
{groupedIntegrations[category.id]?.map((integration) => (
|
|
237
1032
|
<div key={integration.id}>
|
|
238
1033
|
<div className="p-6 flex items-center justify-between">
|
|
239
1034
|
<div className="flex items-center gap-4">
|
|
@@ -256,16 +1051,18 @@ export default function SetupPage() {
|
|
|
256
1051
|
</div>
|
|
257
1052
|
</div>
|
|
258
1053
|
<div className="flex items-center gap-3">
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
1054
|
+
{OAUTH_SETUP_GUIDES[integration.id] && (
|
|
1055
|
+
<button
|
|
1056
|
+
type="button"
|
|
1057
|
+
onClick={() =>
|
|
1058
|
+
setExpandedGuide(
|
|
1059
|
+
expandedGuide === integration.id ? null : integration.id,
|
|
1060
|
+
)}
|
|
1061
|
+
className="px-4 py-2 text-sm font-medium text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-white"
|
|
1062
|
+
>
|
|
1063
|
+
{expandedGuide === integration.id ? "Hide Guide" : "Setup Guide"}
|
|
1064
|
+
</button>
|
|
1065
|
+
)}
|
|
269
1066
|
{integration.connected
|
|
270
1067
|
? (
|
|
271
1068
|
<span className="inline-flex items-center gap-1.5 px-4 py-2 bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-400 rounded-xl text-sm font-medium">
|
|
@@ -294,7 +1091,7 @@ export default function SetupPage() {
|
|
|
294
1091
|
<h4 className="font-semibold text-neutral-900 dark:text-white mb-4">
|
|
295
1092
|
{guide.title}
|
|
296
1093
|
</h4>
|
|
297
|
-
<ol className="space-y-3">
|
|
1094
|
+
<ol className="space-y-3 mb-6">
|
|
298
1095
|
{guide.steps.map((step, i) => (
|
|
299
1096
|
<li key={i} className="flex items-start gap-3">
|
|
300
1097
|
<span className="w-6 h-6 bg-neutral-200 dark:bg-neutral-700 rounded-full flex items-center justify-center text-sm font-medium text-neutral-600 dark:text-neutral-400 flex-shrink-0">
|
|
@@ -306,11 +1103,22 @@ export default function SetupPage() {
|
|
|
306
1103
|
</li>
|
|
307
1104
|
))}
|
|
308
1105
|
</ol>
|
|
1106
|
+
|
|
1107
|
+
{/* Environment Variables */}
|
|
1108
|
+
<div className="mb-4 p-4 bg-neutral-100 dark:bg-neutral-800 rounded-lg">
|
|
1109
|
+
<h5 className="text-sm font-semibold text-neutral-700 dark:text-neutral-300 mb-2">
|
|
1110
|
+
Required Environment Variables:
|
|
1111
|
+
</h5>
|
|
1112
|
+
<pre className="text-sm text-neutral-600 dark:text-neutral-400 font-mono whitespace-pre-wrap">
|
|
1113
|
+
{guide.envVars.map((v) => `${v}=your_value`).join("\n")}
|
|
1114
|
+
</pre>
|
|
1115
|
+
</div>
|
|
1116
|
+
|
|
309
1117
|
<a
|
|
310
1118
|
href={guide.link}
|
|
311
1119
|
target="_blank"
|
|
312
1120
|
rel="noopener noreferrer"
|
|
313
|
-
className="
|
|
1121
|
+
className="inline-flex items-center gap-2 text-blue-600 dark:text-blue-400 text-sm font-medium hover:underline"
|
|
314
1122
|
>
|
|
315
1123
|
Open Developer Console
|
|
316
1124
|
<svg
|
|
@@ -332,9 +1140,13 @@ export default function SetupPage() {
|
|
|
332
1140
|
);
|
|
333
1141
|
})()}
|
|
334
1142
|
</div>
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
1143
|
+
))}
|
|
1144
|
+
</div>
|
|
1145
|
+
</div>
|
|
1146
|
+
),
|
|
1147
|
+
)}
|
|
1148
|
+
</div>
|
|
1149
|
+
)}
|
|
338
1150
|
</div>
|
|
339
1151
|
|
|
340
1152
|
{/* All Connected Message */}
|
|
@@ -446,16 +1258,18 @@ function ServiceIcon({ name }: { name: string }) {
|
|
|
446
1258
|
<path d="M4.459 4.208c.746.606 1.026.56 2.428.466l13.215-.793c.28 0 .047-.28-.046-.326L17.86 1.968c-.42-.326-.98-.7-2.055-.607L3.01 2.295c-.466.046-.56.28-.374.466l1.823 1.447zm.793 3.08v13.904c0 .747.373 1.027 1.214.98l14.523-.84c.84-.046.933-.56.933-1.167V6.354c0-.606-.233-.933-.746-.886l-15.177.887c-.56.046-.747.326-.747.933zm14.337.745c.093.42 0 .84-.42.888l-.7.14v10.264c-.608.327-1.168.514-1.635.514-.746 0-.933-.234-1.495-.933l-4.577-7.186v6.952L12.21 19s0 .84-1.168.84l-3.222.186c-.093-.186 0-.653.327-.746l.84-.233V9.854L7.822 9.76c-.094-.42.14-1.026.793-1.073l3.456-.233 4.764 7.279v-6.44l-1.215-.14c-.093-.514.28-.886.747-.933l3.222-.186zM1.936 1.035l13.31-.98c1.634-.14 2.055-.047 3.082.7l4.249 2.986c.7.513.933.653.933 1.213v16.378c0 1.026-.373 1.634-1.68 1.726l-15.458.934c-.98.047-1.448-.093-1.962-.747l-3.129-4.06c-.56-.747-.793-1.306-.793-1.96V2.667c0-.839.374-1.54 1.448-1.632z" />
|
|
447
1259
|
</svg>
|
|
448
1260
|
),
|
|
1261
|
+
// Default icon for services without specific icons
|
|
1262
|
+
default: (
|
|
1263
|
+
<svg className="w-6 h-6 text-neutral-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
1264
|
+
<path
|
|
1265
|
+
strokeLinecap="round"
|
|
1266
|
+
strokeLinejoin="round"
|
|
1267
|
+
strokeWidth={2}
|
|
1268
|
+
d="M13 10V3L4 14h7v7l9-11h-7z"
|
|
1269
|
+
/>
|
|
1270
|
+
</svg>
|
|
1271
|
+
),
|
|
449
1272
|
};
|
|
450
1273
|
|
|
451
|
-
return iconMap[name] ||
|
|
452
|
-
<svg className="w-6 h-6 text-neutral-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
453
|
-
<path
|
|
454
|
-
strokeLinecap="round"
|
|
455
|
-
strokeLinejoin="round"
|
|
456
|
-
strokeWidth={2}
|
|
457
|
-
d="M13 10V3L4 14h7v7l9-11h-7z"
|
|
458
|
-
/>
|
|
459
|
-
</svg>
|
|
460
|
-
);
|
|
1274
|
+
return iconMap[name] || iconMap.default;
|
|
461
1275
|
}
|