veryfront 0.0.48 → 0.0.50
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 +976 -234
- 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 -8
- package/dist/index.js.map +2 -2
- package/dist/integrations/_base/files/SETUP.md +667 -98
- package/dist/integrations/_base/files/app/api/integrations/token-storage/route.ts +14 -0
- package/dist/integrations/_base/files/app/components/ServiceConnections.tsx +2 -1
- package/dist/integrations/_base/files/app/setup/page.tsx +858 -54
- 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/airtable/files/lib/token-store.ts +5 -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/asana/files/lib/token-store.ts +11 -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/bitbucket/files/lib/token-store.ts +5 -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/box/files/lib/token-store.ts +11 -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/calendar/files/lib/token-store.ts +2 -110
- 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/clickup/files/lib/token-store.ts +11 -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/confluence/files/lib/token-store.ts +5 -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/discord/files/lib/token-store.ts +5 -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/docs-google/files/lib/token-store.ts +5 -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/drive/files/lib/token-store.ts +113 -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/dropbox/files/lib/token-store.ts +5 -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/token-store.ts +5 -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/freshdesk/files/lib/token-store.ts +11 -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/github/files/lib/token-store.ts +2 -110
- 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/gitlab/files/lib/token-store.ts +5 -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/gmail/files/lib/token-store.ts +4 -109
- 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/hubspot/files/lib/token-store.ts +5 -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/intercom/files/lib/token-store.ts +11 -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/jira/files/lib/token-store.ts +5 -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/linear/files/lib/token-store.ts +5 -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/mailchimp/files/lib/token-store.ts +11 -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/mixpanel/files/lib/token-store.ts +43 -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/monday/files/lib/token-store.ts +11 -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/neon/files/lib/token-store.ts +29 -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/notion/files/lib/token-store.ts +5 -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/onedrive/files/lib/token-store.ts +5 -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/outlook/files/lib/token-store.ts +5 -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/pipedrive/files/lib/token-store.ts +11 -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/posthog/files/lib/token-store.ts +21 -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/quickbooks/files/lib/token-store.ts +11 -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/salesforce/files/lib/token-store.ts +5 -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/sentry/files/lib/token-store.ts +29 -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/servicenow/files/lib/token-store.ts +42 -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/sharepoint/files/lib/token-store.ts +5 -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/sheets/files/lib/token-store.ts +5 -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/shopify/files/lib/token-store.ts +11 -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/slack/files/lib/token-store.ts +2 -110
- 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/snowflake/files/lib/token-store.ts +77 -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/stripe/files/lib/token-store.ts +21 -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/supabase/files/lib/token-store.ts +47 -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/teams/files/lib/token-store.ts +5 -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/token-store.ts +11 -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/token-store.ts +60 -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/token-store.ts +5 -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/token-store.ts +11 -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/token-store.ts +11 -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/token-store.ts +47 -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/token-store.ts +11 -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/gmail/files/lib/oauth.ts +0 -145
- package/dist/integrations/slack/files/lib/oauth.ts +0 -145
- /package/dist/integrations/{calendar → docs-google}/files/lib/oauth.ts +0 -0
- /package/dist/integrations/{github → drive}/files/lib/oauth.ts +0 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mixpanel",
|
|
3
|
+
"displayName": "Mixpanel",
|
|
4
|
+
"icon": "mixpanel.svg",
|
|
5
|
+
"description": "Track events, analyze funnels, and understand user behavior with Mixpanel analytics",
|
|
6
|
+
"auth": {
|
|
7
|
+
"type": "api-key",
|
|
8
|
+
"keyName": "MIXPANEL_PROJECT_TOKEN",
|
|
9
|
+
"requiredApis": [
|
|
10
|
+
{
|
|
11
|
+
"name": "Mixpanel API",
|
|
12
|
+
"enableUrl": "https://mixpanel.com/settings/project"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"envVars": [
|
|
17
|
+
{
|
|
18
|
+
"name": "MIXPANEL_PROJECT_TOKEN",
|
|
19
|
+
"description": "Mixpanel Project Token for event tracking",
|
|
20
|
+
"required": true,
|
|
21
|
+
"sensitive": true,
|
|
22
|
+
"docsUrl": "https://docs.mixpanel.com/docs/tracking-methods/id-management/authentication"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "MIXPANEL_API_SECRET",
|
|
26
|
+
"description": "Mixpanel API Secret for data export and query operations",
|
|
27
|
+
"required": true,
|
|
28
|
+
"sensitive": true,
|
|
29
|
+
"docsUrl": "https://developer.mixpanel.com/reference/authentication"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "MIXPANEL_PROJECT_ID",
|
|
33
|
+
"description": "Mixpanel Project ID (found in project settings)",
|
|
34
|
+
"required": true,
|
|
35
|
+
"sensitive": false,
|
|
36
|
+
"docsUrl": "https://docs.mixpanel.com/docs/admin/organizations-projects/manage-projects"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"tools": [
|
|
40
|
+
{
|
|
41
|
+
"id": "track-event",
|
|
42
|
+
"name": "Track Event",
|
|
43
|
+
"description": "Track a custom event in Mixpanel with properties",
|
|
44
|
+
"requiresWrite": true
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "query-events",
|
|
48
|
+
"name": "Query Events",
|
|
49
|
+
"description": "Query and export event data from Mixpanel",
|
|
50
|
+
"requiresWrite": false
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "get-funnel",
|
|
54
|
+
"name": "Get Funnel",
|
|
55
|
+
"description": "Retrieve funnel analysis data to understand conversion rates",
|
|
56
|
+
"requiresWrite": false
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "get-retention",
|
|
60
|
+
"name": "Get Retention",
|
|
61
|
+
"description": "Analyze user retention cohorts over time",
|
|
62
|
+
"requiresWrite": false
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "list-cohorts",
|
|
66
|
+
"name": "List Cohorts",
|
|
67
|
+
"description": "List all user cohorts defined in your Mixpanel project",
|
|
68
|
+
"requiresWrite": false
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"prompts": [
|
|
72
|
+
{
|
|
73
|
+
"id": "event-analysis",
|
|
74
|
+
"title": "Event analysis",
|
|
75
|
+
"prompt": "Show me the most important events tracked in my Mixpanel project over the last 7 days and their trends.",
|
|
76
|
+
"category": "analytics",
|
|
77
|
+
"icon": "chart"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "funnel-performance",
|
|
81
|
+
"title": "Funnel performance",
|
|
82
|
+
"prompt": "Analyze my key conversion funnels and identify where users are dropping off.",
|
|
83
|
+
"category": "analytics",
|
|
84
|
+
"icon": "funnel"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "retention-insights",
|
|
88
|
+
"title": "Retention insights",
|
|
89
|
+
"prompt": "Give me insights about user retention and cohort behavior over the past month.",
|
|
90
|
+
"category": "analytics",
|
|
91
|
+
"icon": "users"
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
"suggestedWith": ["slack", "analytics", "monitoring"],
|
|
95
|
+
"SETUP_GUIDE": "# Mixpanel Integration Setup\n\n## Step 1: Get Your Project Token\n1. Log in to your Mixpanel account at https://mixpanel.com\n2. Navigate to your project settings\n3. Under 'Project Settings', find your **Project Token**\n4. Copy the token and add it as `MIXPANEL_PROJECT_TOKEN` in your .env file\n\n## Step 2: Get Your API Secret\n1. In Mixpanel, go to Settings > Project Settings\n2. Scroll to 'Service Accounts' section\n3. Create a new Service Account or use an existing one\n4. Copy the **API Secret** and add it as `MIXPANEL_API_SECRET` in your .env file\n\n## Step 3: Get Your Project ID\n1. In Mixpanel project settings URL, your Project ID is the number in the URL\n2. Format: https://mixpanel.com/project/YOUR_PROJECT_ID/settings\n3. Copy this ID and add it as `MIXPANEL_PROJECT_ID` in your .env file\n\n## Step 4: Set Up Environment Variables\nAdd these to your `.env` file:\n```\nMIXPANEL_PROJECT_TOKEN=your_project_token_here\nMIXPANEL_API_SECRET=your_api_secret_here\nMIXPANEL_PROJECT_ID=your_project_id_here\n```\n\n## Step 5: Test the Integration\nRun your application and try tracking a test event to verify the setup is working correctly.\n\n## Important Notes\n- **Project Token** is used for tracking events (ingestion)\n- **API Secret** is used for querying and exporting data\n- Keep both credentials secure and never commit them to version control\n- For production deployments, use environment variables or secure secret management\n\n## Useful Resources\n- [Mixpanel API Documentation](https://developer.mixpanel.com/reference/overview)\n- [Event Tracking Guide](https://docs.mixpanel.com/docs/tracking-methods/sdks)\n- [Query API Guide](https://developer.mixpanel.com/reference/query-api)"
|
|
96
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Mixpanel Integration
|
|
2
|
+
# Get your credentials at https://mixpanel.com/settings/project
|
|
3
|
+
|
|
4
|
+
# Project Token - used for tracking events (ingestion)
|
|
5
|
+
MIXPANEL_PROJECT_TOKEN=your_project_token_here
|
|
6
|
+
|
|
7
|
+
# API Secret - used for querying and exporting data
|
|
8
|
+
MIXPANEL_API_SECRET=your_api_secret_here
|
|
9
|
+
|
|
10
|
+
# Project ID - found in your project settings URL
|
|
11
|
+
MIXPANEL_PROJECT_ID=your_project_id_here
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { tool } from "veryfront/ai";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { getFunnel, calculateFunnelConversionRate } from "../../lib/mixpanel-client.ts";
|
|
4
|
+
|
|
5
|
+
export default tool({
|
|
6
|
+
id: "get-funnel",
|
|
7
|
+
description:
|
|
8
|
+
"Retrieve funnel analysis data from Mixpanel. Analyze conversion rates and user drop-off at each step of a funnel.",
|
|
9
|
+
inputSchema: z.object({
|
|
10
|
+
funnelId: z.number().describe(
|
|
11
|
+
"The numeric ID of the funnel (found in Mixpanel funnel URL or settings)",
|
|
12
|
+
),
|
|
13
|
+
from: z.string().describe(
|
|
14
|
+
"Start date in YYYY-MM-DD format (e.g., '2024-01-01')",
|
|
15
|
+
),
|
|
16
|
+
to: z.string().describe(
|
|
17
|
+
"End date in YYYY-MM-DD format (e.g., '2024-01-31')",
|
|
18
|
+
),
|
|
19
|
+
}),
|
|
20
|
+
async execute({ funnelId, from, to }) {
|
|
21
|
+
const funnel = await getFunnel(funnelId, from, to);
|
|
22
|
+
|
|
23
|
+
const overallConversionRate = calculateFunnelConversionRate(funnel);
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
funnelId: funnel.funnel_id,
|
|
27
|
+
name: funnel.name,
|
|
28
|
+
dateRange: {
|
|
29
|
+
from,
|
|
30
|
+
to,
|
|
31
|
+
},
|
|
32
|
+
overallConversionRate: `${overallConversionRate.toFixed(2)}%`,
|
|
33
|
+
steps: funnel.steps.map((step, index) => ({
|
|
34
|
+
stepNumber: index + 1,
|
|
35
|
+
event: step.event,
|
|
36
|
+
count: step.count,
|
|
37
|
+
overallConversionRate: `${(step.overall_conv_ratio * 100).toFixed(2)}%`,
|
|
38
|
+
stepConversionRate: `${(step.step_conv_ratio * 100).toFixed(2)}%`,
|
|
39
|
+
averageTime: step.avg_time
|
|
40
|
+
? `${(step.avg_time / 60).toFixed(1)} minutes`
|
|
41
|
+
: "N/A",
|
|
42
|
+
})),
|
|
43
|
+
data: funnel.data,
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { tool } from "veryfront/ai";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { getRetention } from "../../lib/mixpanel-client.ts";
|
|
4
|
+
|
|
5
|
+
export default tool({
|
|
6
|
+
id: "get-retention",
|
|
7
|
+
description:
|
|
8
|
+
"Analyze user retention cohorts in Mixpanel. Understand how many users return after performing an initial event.",
|
|
9
|
+
inputSchema: z.object({
|
|
10
|
+
from: z.string().describe(
|
|
11
|
+
"Start date in YYYY-MM-DD format (e.g., '2024-01-01')",
|
|
12
|
+
),
|
|
13
|
+
to: z.string().describe(
|
|
14
|
+
"End date in YYYY-MM-DD format (e.g., '2024-01-31')",
|
|
15
|
+
),
|
|
16
|
+
event: z.string().describe(
|
|
17
|
+
"The event to analyze retention for (e.g., 'App Opened', 'Sign Up')",
|
|
18
|
+
),
|
|
19
|
+
retentionType: z.enum(["birth", "compounded"]).optional().default("birth")
|
|
20
|
+
.describe(
|
|
21
|
+
"Retention type: 'birth' (first time users) or 'compounded' (all users who did the event)",
|
|
22
|
+
),
|
|
23
|
+
}),
|
|
24
|
+
async execute({ from, to, event, retentionType }) {
|
|
25
|
+
const retention = await getRetention(from, to, event, retentionType);
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
event,
|
|
29
|
+
retentionType,
|
|
30
|
+
dateRange: {
|
|
31
|
+
from,
|
|
32
|
+
to,
|
|
33
|
+
},
|
|
34
|
+
cohorts: retention.map((cohort) => ({
|
|
35
|
+
date: cohort.date,
|
|
36
|
+
initialCount: cohort.count,
|
|
37
|
+
retention: cohort.retention.map((r) => ({
|
|
38
|
+
day: r.day,
|
|
39
|
+
count: r.count,
|
|
40
|
+
rate: `${(r.rate * 100).toFixed(2)}%`,
|
|
41
|
+
})),
|
|
42
|
+
})),
|
|
43
|
+
summary: {
|
|
44
|
+
totalCohorts: retention.length,
|
|
45
|
+
averageDay1Retention: retention.length > 0
|
|
46
|
+
? `${(
|
|
47
|
+
retention.reduce((sum, c) => {
|
|
48
|
+
const day1 = c.retention.find((r) => r.day === 1);
|
|
49
|
+
return sum + (day1 ? day1.rate : 0);
|
|
50
|
+
}, 0) / retention.length * 100
|
|
51
|
+
).toFixed(2)}%`
|
|
52
|
+
: "N/A",
|
|
53
|
+
averageDay7Retention: retention.length > 0
|
|
54
|
+
? `${(
|
|
55
|
+
retention.reduce((sum, c) => {
|
|
56
|
+
const day7 = c.retention.find((r) => r.day === 7);
|
|
57
|
+
return sum + (day7 ? day7.rate : 0);
|
|
58
|
+
}, 0) / retention.length * 100
|
|
59
|
+
).toFixed(2)}%`
|
|
60
|
+
: "N/A",
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { tool } from "veryfront/ai";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { listCohorts } from "../../lib/mixpanel-client.ts";
|
|
4
|
+
|
|
5
|
+
export default tool({
|
|
6
|
+
id: "list-cohorts",
|
|
7
|
+
description:
|
|
8
|
+
"List all user cohorts defined in your Mixpanel project. Cohorts are saved user segments based on properties or behaviors.",
|
|
9
|
+
inputSchema: z.object({
|
|
10
|
+
includeHidden: z.boolean().optional().default(false).describe(
|
|
11
|
+
"Include hidden cohorts in the results (defaults to false)",
|
|
12
|
+
),
|
|
13
|
+
}),
|
|
14
|
+
async execute({ includeHidden }) {
|
|
15
|
+
const allCohorts = await listCohorts();
|
|
16
|
+
|
|
17
|
+
// Filter by visibility if needed
|
|
18
|
+
const cohorts = includeHidden
|
|
19
|
+
? allCohorts
|
|
20
|
+
: allCohorts.filter((c) => c.is_visible);
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
total: cohorts.length,
|
|
24
|
+
cohorts: cohorts.map((cohort) => ({
|
|
25
|
+
id: cohort.id,
|
|
26
|
+
name: cohort.name,
|
|
27
|
+
description: cohort.description,
|
|
28
|
+
count: cohort.count,
|
|
29
|
+
created: cohort.created,
|
|
30
|
+
isVisible: cohort.is_visible,
|
|
31
|
+
projectId: cohort.project_id,
|
|
32
|
+
})),
|
|
33
|
+
summary: {
|
|
34
|
+
totalUsers: cohorts.reduce((sum, c) => sum + c.count, 0),
|
|
35
|
+
largestCohort: cohorts.length > 0
|
|
36
|
+
? cohorts.reduce((max, c) => (c.count > max.count ? c : max))
|
|
37
|
+
.name
|
|
38
|
+
: "N/A",
|
|
39
|
+
smallestCohort: cohorts.length > 0
|
|
40
|
+
? cohorts.reduce((min, c) => (c.count < min.count ? c : min))
|
|
41
|
+
.name
|
|
42
|
+
: "N/A",
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { tool } from "veryfront/ai";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { queryEvents, getDateRange } from "../../lib/mixpanel-client.ts";
|
|
4
|
+
|
|
5
|
+
export default tool({
|
|
6
|
+
id: "query-events",
|
|
7
|
+
description:
|
|
8
|
+
"Query and export event data from Mixpanel. Retrieve events within a date range, optionally filtered by event name.",
|
|
9
|
+
inputSchema: z.object({
|
|
10
|
+
from: z.string().describe(
|
|
11
|
+
"Start date in YYYY-MM-DD format (e.g., '2024-01-01')",
|
|
12
|
+
),
|
|
13
|
+
to: z.string().describe(
|
|
14
|
+
"End date in YYYY-MM-DD format (e.g., '2024-01-31')",
|
|
15
|
+
),
|
|
16
|
+
event: z.string().optional().describe(
|
|
17
|
+
"Optional: Filter by specific event name (e.g., 'Page Viewed'). If not provided, returns all events.",
|
|
18
|
+
),
|
|
19
|
+
limit: z.number().optional().default(100).describe(
|
|
20
|
+
"Maximum number of events to return (defaults to 100)",
|
|
21
|
+
),
|
|
22
|
+
}),
|
|
23
|
+
async execute({ from, to, event, limit }) {
|
|
24
|
+
const events = await queryEvents(from, to, event);
|
|
25
|
+
|
|
26
|
+
// Limit results
|
|
27
|
+
const limitedEvents = events.slice(0, limit);
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
total: events.length,
|
|
31
|
+
returned: limitedEvents.length,
|
|
32
|
+
dateRange: {
|
|
33
|
+
from,
|
|
34
|
+
to,
|
|
35
|
+
},
|
|
36
|
+
eventFilter: event || "all",
|
|
37
|
+
events: limitedEvents.map((e) => ({
|
|
38
|
+
event: e.event,
|
|
39
|
+
properties: e.properties,
|
|
40
|
+
})),
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { tool } from "veryfront/ai";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { trackEvent } from "../../lib/mixpanel-client.ts";
|
|
4
|
+
|
|
5
|
+
export default tool({
|
|
6
|
+
id: "track-event",
|
|
7
|
+
description:
|
|
8
|
+
"Track a custom event in Mixpanel. Capture user actions, page views, or any custom analytics event with properties.",
|
|
9
|
+
inputSchema: z.object({
|
|
10
|
+
event: z.string().describe(
|
|
11
|
+
"Event name (e.g., 'Button Clicked', 'Page Viewed', 'Purchase Completed')",
|
|
12
|
+
),
|
|
13
|
+
distinctId: z.string().describe(
|
|
14
|
+
"Unique identifier for the user or session (e.g., user ID, email, or anonymous ID)",
|
|
15
|
+
),
|
|
16
|
+
properties: z.record(z.unknown()).optional().describe(
|
|
17
|
+
"Additional properties to attach to the event (e.g., {product_id: '123', price: 29.99, category: 'electronics'})",
|
|
18
|
+
),
|
|
19
|
+
}),
|
|
20
|
+
async execute({ event, distinctId, properties }) {
|
|
21
|
+
const result = await trackEvent(event, properties || {}, distinctId);
|
|
22
|
+
|
|
23
|
+
if (result.status === 1) {
|
|
24
|
+
return {
|
|
25
|
+
success: true,
|
|
26
|
+
event: {
|
|
27
|
+
name: event,
|
|
28
|
+
distinctId,
|
|
29
|
+
properties: properties || {},
|
|
30
|
+
timestamp: new Date().toISOString(),
|
|
31
|
+
},
|
|
32
|
+
message: "Event tracked successfully",
|
|
33
|
+
};
|
|
34
|
+
} else {
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
error: result.error || "Failed to track event",
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
});
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { getProjectToken, getApiSecret, getProjectId } from "./token-store.ts";
|
|
2
|
+
|
|
3
|
+
const MIXPANEL_API_BASE = "https://mixpanel.com/api";
|
|
4
|
+
const MIXPANEL_TRACK_BASE = "https://api.mixpanel.com";
|
|
5
|
+
const MIXPANEL_DATA_BASE = "https://data.mixpanel.com/api/2.0";
|
|
6
|
+
|
|
7
|
+
// Types
|
|
8
|
+
export interface MixpanelEvent {
|
|
9
|
+
event: string;
|
|
10
|
+
properties: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface MixpanelEventQuery {
|
|
14
|
+
event?: string;
|
|
15
|
+
from_date: string;
|
|
16
|
+
to_date: string;
|
|
17
|
+
where?: string;
|
|
18
|
+
limit?: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface MixpanelEventResult {
|
|
22
|
+
event: string;
|
|
23
|
+
properties: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface MixpanelFunnel {
|
|
27
|
+
funnel_id: number;
|
|
28
|
+
name: string;
|
|
29
|
+
steps: Array<{
|
|
30
|
+
event: string;
|
|
31
|
+
count: number;
|
|
32
|
+
avg_time: number | null;
|
|
33
|
+
overall_conv_ratio: number;
|
|
34
|
+
step_conv_ratio: number;
|
|
35
|
+
}>;
|
|
36
|
+
data: {
|
|
37
|
+
series: string[];
|
|
38
|
+
values: Record<string, number[]>;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface MixpanelRetention {
|
|
43
|
+
date: string;
|
|
44
|
+
count: number;
|
|
45
|
+
retention: Array<{
|
|
46
|
+
day: number;
|
|
47
|
+
count: number;
|
|
48
|
+
rate: number;
|
|
49
|
+
}>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface MixpanelCohort {
|
|
53
|
+
id: number;
|
|
54
|
+
name: string;
|
|
55
|
+
description: string;
|
|
56
|
+
count: number;
|
|
57
|
+
created: string;
|
|
58
|
+
is_visible: boolean;
|
|
59
|
+
project_id: number;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface MixpanelError {
|
|
63
|
+
error: string;
|
|
64
|
+
request: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Helper function to create basic auth header
|
|
68
|
+
function getAuthHeader(): string {
|
|
69
|
+
const apiSecret = getApiSecret();
|
|
70
|
+
if (!apiSecret) {
|
|
71
|
+
throw new Error(
|
|
72
|
+
"Not authenticated with Mixpanel. Please set MIXPANEL_API_SECRET.",
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
// Mixpanel uses Basic auth with API secret as username and empty password
|
|
76
|
+
const credentials = btoa(`${apiSecret}:`);
|
|
77
|
+
return `Basic ${credentials}`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Helper function for Mixpanel API calls with auth
|
|
81
|
+
async function mixpanelFetch<T>(
|
|
82
|
+
baseUrl: string,
|
|
83
|
+
endpoint: string,
|
|
84
|
+
options: RequestInit & { params?: Record<string, string | number | boolean> } = {},
|
|
85
|
+
): Promise<T> {
|
|
86
|
+
// Build URL with query parameters
|
|
87
|
+
let url = `${baseUrl}${endpoint}`;
|
|
88
|
+
if (options.params) {
|
|
89
|
+
const params = new URLSearchParams();
|
|
90
|
+
Object.entries(options.params).forEach(([key, value]) => {
|
|
91
|
+
params.append(key, String(value));
|
|
92
|
+
});
|
|
93
|
+
url += `?${params.toString()}`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const headers: Record<string, string> = {
|
|
97
|
+
"Content-Type": "application/json",
|
|
98
|
+
...options.headers as Record<string, string>,
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// Add auth header for data API calls
|
|
102
|
+
if (baseUrl === MIXPANEL_DATA_BASE || baseUrl === MIXPANEL_API_BASE) {
|
|
103
|
+
headers["Authorization"] = getAuthHeader();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const response = await fetch(url, {
|
|
107
|
+
...options,
|
|
108
|
+
headers,
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
if (!response.ok) {
|
|
112
|
+
let errorMessage = `Mixpanel API error: ${response.status} ${response.statusText}`;
|
|
113
|
+
try {
|
|
114
|
+
const errorData = await response.json() as MixpanelError;
|
|
115
|
+
if (errorData.error) {
|
|
116
|
+
errorMessage = `Mixpanel API error: ${errorData.error}`;
|
|
117
|
+
}
|
|
118
|
+
} catch {
|
|
119
|
+
// If parsing JSON fails, use default error message
|
|
120
|
+
}
|
|
121
|
+
throw new Error(errorMessage);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const data = await response.json();
|
|
125
|
+
return data as T;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Track event - uses ingestion API with project token
|
|
129
|
+
export async function trackEvent(
|
|
130
|
+
event: string,
|
|
131
|
+
properties: Record<string, unknown>,
|
|
132
|
+
distinctId: string,
|
|
133
|
+
): Promise<{ status: number; error?: string }> {
|
|
134
|
+
const projectToken = getProjectToken();
|
|
135
|
+
if (!projectToken) {
|
|
136
|
+
throw new Error(
|
|
137
|
+
"Not authenticated with Mixpanel. Please set MIXPANEL_PROJECT_TOKEN.",
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const payload = {
|
|
142
|
+
event,
|
|
143
|
+
properties: {
|
|
144
|
+
...properties,
|
|
145
|
+
token: projectToken,
|
|
146
|
+
distinct_id: distinctId,
|
|
147
|
+
time: Date.now(),
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const response = await fetch(`${MIXPANEL_TRACK_BASE}/track`, {
|
|
152
|
+
method: "POST",
|
|
153
|
+
headers: {
|
|
154
|
+
"Content-Type": "application/json",
|
|
155
|
+
},
|
|
156
|
+
body: JSON.stringify([payload]),
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
if (!response.ok) {
|
|
160
|
+
const text = await response.text();
|
|
161
|
+
return {
|
|
162
|
+
status: 0,
|
|
163
|
+
error: `Failed to track event: ${response.status} ${text}`,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const result = await response.json() as { status: number; error?: string };
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Query events - uses export API
|
|
172
|
+
export async function queryEvents(
|
|
173
|
+
from: string,
|
|
174
|
+
to: string,
|
|
175
|
+
event?: string,
|
|
176
|
+
): Promise<MixpanelEventResult[]> {
|
|
177
|
+
const projectId = getProjectId();
|
|
178
|
+
if (!projectId) {
|
|
179
|
+
throw new Error("Project ID not set. Please set MIXPANEL_PROJECT_ID.");
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const params: Record<string, string> = {
|
|
183
|
+
from_date: from,
|
|
184
|
+
to_date: to,
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
if (event) {
|
|
188
|
+
params.event = JSON.stringify([event]);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const response = await mixpanelFetch<string[]>(
|
|
192
|
+
MIXPANEL_DATA_BASE,
|
|
193
|
+
"/export",
|
|
194
|
+
{ params },
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
// Parse JSONL response (each line is a JSON object)
|
|
198
|
+
const events: MixpanelEventResult[] = [];
|
|
199
|
+
if (Array.isArray(response)) {
|
|
200
|
+
for (const line of response) {
|
|
201
|
+
if (typeof line === "string" && line.trim()) {
|
|
202
|
+
try {
|
|
203
|
+
const parsed = JSON.parse(line);
|
|
204
|
+
events.push({
|
|
205
|
+
event: parsed.event,
|
|
206
|
+
properties: parsed.properties,
|
|
207
|
+
});
|
|
208
|
+
} catch {
|
|
209
|
+
// Skip malformed lines
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return events;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Get funnel data
|
|
219
|
+
export async function getFunnel(
|
|
220
|
+
funnelId: number,
|
|
221
|
+
from: string,
|
|
222
|
+
to: string,
|
|
223
|
+
): Promise<MixpanelFunnel> {
|
|
224
|
+
const params: Record<string, string | number> = {
|
|
225
|
+
funnel_id: funnelId,
|
|
226
|
+
from_date: from,
|
|
227
|
+
to_date: to,
|
|
228
|
+
unit: "day",
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
return mixpanelFetch<MixpanelFunnel>(
|
|
232
|
+
MIXPANEL_DATA_BASE,
|
|
233
|
+
"/funnels",
|
|
234
|
+
{ params },
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Get retention data
|
|
239
|
+
export async function getRetention(
|
|
240
|
+
from: string,
|
|
241
|
+
to: string,
|
|
242
|
+
event: string,
|
|
243
|
+
retentionType: "birth" | "compounded" = "birth",
|
|
244
|
+
): Promise<MixpanelRetention[]> {
|
|
245
|
+
const params: Record<string, string> = {
|
|
246
|
+
from_date: from,
|
|
247
|
+
to_date: to,
|
|
248
|
+
retention_type: retentionType,
|
|
249
|
+
born_event: event,
|
|
250
|
+
event,
|
|
251
|
+
unit: "day",
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
const response = await mixpanelFetch<Record<string, MixpanelRetention>>(
|
|
255
|
+
MIXPANEL_DATA_BASE,
|
|
256
|
+
"/retention",
|
|
257
|
+
{ params },
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
// Convert object to array
|
|
261
|
+
return Object.entries(response).map(([date, data]) => ({
|
|
262
|
+
date,
|
|
263
|
+
...data,
|
|
264
|
+
}));
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// List cohorts
|
|
268
|
+
export async function listCohorts(): Promise<MixpanelCohort[]> {
|
|
269
|
+
const projectId = getProjectId();
|
|
270
|
+
if (!projectId) {
|
|
271
|
+
throw new Error("Project ID not set. Please set MIXPANEL_PROJECT_ID.");
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const response = await mixpanelFetch<MixpanelCohort[]>(
|
|
275
|
+
MIXPANEL_API_BASE,
|
|
276
|
+
`/2.0/cohorts/list`,
|
|
277
|
+
{
|
|
278
|
+
params: {
|
|
279
|
+
project_id: projectId,
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
return response;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Helper functions
|
|
288
|
+
export function formatDate(date: Date): string {
|
|
289
|
+
const year = date.getFullYear();
|
|
290
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
291
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
292
|
+
return `${year}-${month}-${day}`;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export function getDateRange(days: number): { from: string; to: string } {
|
|
296
|
+
const to = new Date();
|
|
297
|
+
const from = new Date();
|
|
298
|
+
from.setDate(from.getDate() - days);
|
|
299
|
+
|
|
300
|
+
return {
|
|
301
|
+
from: formatDate(from),
|
|
302
|
+
to: formatDate(to),
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
export function calculateFunnelConversionRate(funnel: MixpanelFunnel): number {
|
|
307
|
+
if (!funnel.steps || funnel.steps.length < 2) {
|
|
308
|
+
return 0;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const firstStep = funnel.steps[0];
|
|
312
|
+
const lastStep = funnel.steps[funnel.steps.length - 1];
|
|
313
|
+
|
|
314
|
+
if (!firstStep || !lastStep || firstStep.count === 0) {
|
|
315
|
+
return 0;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return (lastStep.count / firstStep.count) * 100;
|
|
319
|
+
}
|