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.
Files changed (536) hide show
  1. package/dist/ai/components.js +260 -56
  2. package/dist/ai/components.js.map +4 -4
  3. package/dist/ai/index.d.ts +1 -0
  4. package/dist/ai/index.js +12 -4
  5. package/dist/ai/index.js.map +2 -2
  6. package/dist/ai/primitives.js +55 -10
  7. package/dist/ai/primitives.js.map +3 -3
  8. package/dist/ai/react.js +140 -1
  9. package/dist/ai/react.js.map +3 -3
  10. package/dist/ai/workflow-react.js +458 -0
  11. package/dist/ai/workflow-react.js.map +7 -0
  12. package/dist/ai/workflow.js +5422 -0
  13. package/dist/ai/workflow.js.map +7 -0
  14. package/dist/cli.js +976 -234
  15. package/dist/components.js +12 -4
  16. package/dist/components.js.map +2 -2
  17. package/dist/config.js +12 -4
  18. package/dist/config.js.map +2 -2
  19. package/dist/data.js +12 -4
  20. package/dist/data.js.map +2 -2
  21. package/dist/index.js +12 -8
  22. package/dist/index.js.map +2 -2
  23. package/dist/integrations/_base/files/SETUP.md +667 -98
  24. package/dist/integrations/_base/files/app/api/integrations/token-storage/route.ts +14 -0
  25. package/dist/integrations/_base/files/app/components/ServiceConnections.tsx +2 -1
  26. package/dist/integrations/_base/files/app/setup/page.tsx +858 -54
  27. package/dist/integrations/_base/files/lib/token-store-examples.ts +435 -0
  28. package/dist/integrations/_base/files/lib/token-store.ts +273 -23
  29. package/dist/integrations/airtable/connector.json +99 -0
  30. package/dist/integrations/airtable/files/ai/tools/create-record.ts +25 -0
  31. package/dist/integrations/airtable/files/ai/tools/get-base.ts +34 -0
  32. package/dist/integrations/airtable/files/ai/tools/get-record.ts +23 -0
  33. package/dist/integrations/airtable/files/ai/tools/list-bases.ts +19 -0
  34. package/dist/integrations/airtable/files/ai/tools/list-records.ts +47 -0
  35. package/dist/integrations/airtable/files/app/api/auth/airtable/callback/route.ts +11 -0
  36. package/dist/integrations/airtable/files/app/api/auth/airtable/route.ts +9 -0
  37. package/dist/integrations/airtable/files/lib/airtable-client.ts +244 -0
  38. package/dist/integrations/airtable/files/lib/token-store.ts +5 -0
  39. package/dist/integrations/anthropic/README.md +181 -0
  40. package/dist/integrations/anthropic/connector.json +88 -0
  41. package/dist/integrations/anthropic/files/_env.example +4 -0
  42. package/dist/integrations/anthropic/files/ai/tools/get-organization.ts +36 -0
  43. package/dist/integrations/anthropic/files/ai/tools/get-usage.ts +100 -0
  44. package/dist/integrations/anthropic/files/ai/tools/list-api-keys.ts +64 -0
  45. package/dist/integrations/anthropic/files/ai/tools/list-members.ts +65 -0
  46. package/dist/integrations/anthropic/files/ai/tools/list-workspaces.ts +35 -0
  47. package/dist/integrations/anthropic/files/lib/anthropic-admin-client.ts +264 -0
  48. package/dist/integrations/asana/connector.json +85 -0
  49. package/dist/integrations/asana/files/_env.example +4 -0
  50. package/dist/integrations/asana/files/ai/tools/create-task.ts +34 -0
  51. package/dist/integrations/asana/files/ai/tools/get-task.ts +26 -0
  52. package/dist/integrations/asana/files/ai/tools/list-projects.ts +26 -0
  53. package/dist/integrations/asana/files/ai/tools/list-tasks.ts +50 -0
  54. package/dist/integrations/asana/files/ai/tools/update-task.ts +36 -0
  55. package/dist/integrations/asana/files/app/api/auth/asana/callback/route.ts +11 -0
  56. package/dist/integrations/asana/files/app/api/auth/asana/route.ts +7 -0
  57. package/dist/integrations/asana/files/lib/asana-client.ts +162 -0
  58. package/dist/integrations/asana/files/lib/token-store.ts +11 -0
  59. package/dist/integrations/aws/connector.json +72 -0
  60. package/dist/integrations/aws/files/_env.example +10 -0
  61. package/dist/integrations/aws/files/ai/tools/get-s3-object.ts +62 -0
  62. package/dist/integrations/aws/files/ai/tools/list-ec2-instances.ts +56 -0
  63. package/dist/integrations/aws/files/ai/tools/list-lambda-functions.ts +57 -0
  64. package/dist/integrations/aws/files/ai/tools/list-s3-buckets.ts +44 -0
  65. package/dist/integrations/aws/files/ai/tools/list-s3-objects.ts +58 -0
  66. package/dist/integrations/aws/files/lib/aws-client.ts +255 -0
  67. package/dist/integrations/bitbucket/connector.json +85 -0
  68. package/dist/integrations/bitbucket/files/_env.example +9 -0
  69. package/dist/integrations/bitbucket/files/ai/tools/create-pull-request.ts +83 -0
  70. package/dist/integrations/bitbucket/files/ai/tools/list-issues.ts +112 -0
  71. package/dist/integrations/bitbucket/files/ai/tools/list-pull-requests.ts +91 -0
  72. package/dist/integrations/bitbucket/files/ai/tools/list-repositories.ts +78 -0
  73. package/dist/integrations/bitbucket/files/app/api/auth/bitbucket/callback/route.ts +11 -0
  74. package/dist/integrations/bitbucket/files/app/api/auth/bitbucket/route.ts +9 -0
  75. package/dist/integrations/bitbucket/files/lib/bitbucket-client.ts +316 -0
  76. package/dist/integrations/bitbucket/files/lib/token-store.ts +5 -0
  77. package/dist/integrations/box/connector.json +85 -0
  78. package/dist/integrations/box/files/_env.example +4 -0
  79. package/dist/integrations/box/files/ai/tools/create-folder.ts +28 -0
  80. package/dist/integrations/box/files/ai/tools/get-file.ts +29 -0
  81. package/dist/integrations/box/files/ai/tools/list-files.ts +33 -0
  82. package/dist/integrations/box/files/ai/tools/search-files.ts +35 -0
  83. package/dist/integrations/box/files/ai/tools/upload-file.ts +32 -0
  84. package/dist/integrations/box/files/app/api/auth/box/callback/route.ts +11 -0
  85. package/dist/integrations/box/files/app/api/auth/box/route.ts +7 -0
  86. package/dist/integrations/box/files/lib/box-client.ts +280 -0
  87. package/dist/integrations/box/files/lib/token-store.ts +11 -0
  88. package/dist/integrations/calendar/files/app/api/auth/calendar/callback/route.ts +7 -110
  89. package/dist/integrations/calendar/files/app/api/auth/calendar/route.ts +5 -25
  90. package/dist/integrations/calendar/files/lib/token-store.ts +2 -110
  91. package/dist/integrations/clickup/connector.json +85 -0
  92. package/dist/integrations/clickup/files/_env.example +4 -0
  93. package/dist/integrations/clickup/files/ai/tools/create-task.ts +64 -0
  94. package/dist/integrations/clickup/files/ai/tools/get-task.ts +59 -0
  95. package/dist/integrations/clickup/files/ai/tools/list-lists.ts +109 -0
  96. package/dist/integrations/clickup/files/ai/tools/list-tasks.ts +95 -0
  97. package/dist/integrations/clickup/files/ai/tools/update-task.ts +85 -0
  98. package/dist/integrations/clickup/files/app/api/auth/clickup/callback/route.ts +11 -0
  99. package/dist/integrations/clickup/files/app/api/auth/clickup/route.ts +7 -0
  100. package/dist/integrations/clickup/files/lib/clickup-client.ts +439 -0
  101. package/dist/integrations/clickup/files/lib/token-store.ts +11 -0
  102. package/dist/integrations/confluence/README.md +246 -0
  103. package/dist/integrations/confluence/connector.json +104 -0
  104. package/dist/integrations/confluence/files/_env.example +4 -0
  105. package/dist/integrations/confluence/files/ai/tools/create-page.ts +43 -0
  106. package/dist/integrations/confluence/files/ai/tools/get-page.ts +30 -0
  107. package/dist/integrations/confluence/files/ai/tools/list-spaces.ts +31 -0
  108. package/dist/integrations/confluence/files/ai/tools/search-content.ts +38 -0
  109. package/dist/integrations/confluence/files/ai/tools/update-page.ts +45 -0
  110. package/dist/integrations/confluence/files/app/api/auth/confluence/callback/route.ts +11 -0
  111. package/dist/integrations/confluence/files/app/api/auth/confluence/route.ts +9 -0
  112. package/dist/integrations/confluence/files/lib/confluence-client.ts +281 -0
  113. package/dist/integrations/confluence/files/lib/token-store.ts +5 -0
  114. package/dist/integrations/discord/connector.json +100 -0
  115. package/dist/integrations/discord/files/_env.example +12 -0
  116. package/dist/integrations/discord/files/ai/tools/get-messages.ts +55 -0
  117. package/dist/integrations/discord/files/ai/tools/get-user.ts +32 -0
  118. package/dist/integrations/discord/files/ai/tools/list-channels.ts +32 -0
  119. package/dist/integrations/discord/files/ai/tools/list-guilds.ts +24 -0
  120. package/dist/integrations/discord/files/ai/tools/send-message.ts +33 -0
  121. package/dist/integrations/discord/files/app/api/auth/discord/callback/route.ts +11 -0
  122. package/dist/integrations/discord/files/app/api/auth/discord/route.ts +9 -0
  123. package/dist/integrations/discord/files/lib/discord-client.ts +273 -0
  124. package/dist/integrations/discord/files/lib/token-store.ts +5 -0
  125. package/dist/integrations/docs-google/connector.json +101 -0
  126. package/dist/integrations/docs-google/files/_env.example +8 -0
  127. package/dist/integrations/docs-google/files/ai/tools/create-document.ts +46 -0
  128. package/dist/integrations/docs-google/files/ai/tools/get-document.ts +46 -0
  129. package/dist/integrations/docs-google/files/ai/tools/list-documents.ts +42 -0
  130. package/dist/integrations/docs-google/files/ai/tools/search-documents.ts +38 -0
  131. package/dist/integrations/docs-google/files/ai/tools/update-document.ts +131 -0
  132. package/dist/integrations/docs-google/files/app/api/auth/docs-google/callback/route.ts +11 -0
  133. package/dist/integrations/docs-google/files/app/api/auth/docs-google/route.ts +9 -0
  134. package/dist/integrations/docs-google/files/lib/docs-client.ts +582 -0
  135. package/dist/integrations/docs-google/files/lib/token-store.ts +5 -0
  136. package/dist/integrations/drive/connector.json +134 -0
  137. package/dist/integrations/drive/files/_env.example +9 -0
  138. package/dist/integrations/drive/files/ai/tools/create-folder.ts +47 -0
  139. package/dist/integrations/drive/files/ai/tools/get-file.ts +55 -0
  140. package/dist/integrations/drive/files/ai/tools/list-files.ts +78 -0
  141. package/dist/integrations/drive/files/ai/tools/search-files.ts +79 -0
  142. package/dist/integrations/drive/files/ai/tools/upload-file.ts +59 -0
  143. package/dist/integrations/drive/files/app/api/auth/drive/callback/route.ts +11 -0
  144. package/dist/integrations/drive/files/app/api/auth/drive/route.ts +9 -0
  145. package/dist/integrations/drive/files/lib/drive-client.ts +359 -0
  146. package/dist/integrations/drive/files/lib/token-store.ts +113 -0
  147. package/dist/integrations/dropbox/connector.json +107 -0
  148. package/dist/integrations/dropbox/files/_env.example +24 -0
  149. package/dist/integrations/dropbox/files/ai/tools/get-account.ts +58 -0
  150. package/dist/integrations/dropbox/files/ai/tools/get-file.ts +61 -0
  151. package/dist/integrations/dropbox/files/ai/tools/list-files.ts +56 -0
  152. package/dist/integrations/dropbox/files/ai/tools/search-files.ts +70 -0
  153. package/dist/integrations/dropbox/files/ai/tools/upload-file.ts +48 -0
  154. package/dist/integrations/dropbox/files/app/api/auth/dropbox/callback/route.ts +11 -0
  155. package/dist/integrations/dropbox/files/app/api/auth/dropbox/route.ts +9 -0
  156. package/dist/integrations/dropbox/files/lib/dropbox-client.ts +397 -0
  157. package/dist/integrations/dropbox/files/lib/token-store.ts +5 -0
  158. package/dist/integrations/figma/INTEGRATION_SUMMARY.md +436 -0
  159. package/dist/integrations/figma/README.md +287 -0
  160. package/dist/integrations/figma/connector.json +100 -0
  161. package/dist/integrations/figma/files/_env.example +5 -0
  162. package/dist/integrations/figma/files/ai/tools/get-comments.ts +72 -0
  163. package/dist/integrations/figma/files/ai/tools/get-file.ts +54 -0
  164. package/dist/integrations/figma/files/ai/tools/list-files.ts +39 -0
  165. package/dist/integrations/figma/files/ai/tools/list-projects.ts +69 -0
  166. package/dist/integrations/figma/files/ai/tools/post-comment.ts +54 -0
  167. package/dist/integrations/figma/files/app/api/auth/figma/callback/route.ts +11 -0
  168. package/dist/integrations/figma/files/app/api/auth/figma/route.ts +9 -0
  169. package/dist/integrations/figma/files/lib/figma-client.ts +355 -0
  170. package/dist/integrations/figma/files/lib/token-store.ts +5 -0
  171. package/dist/integrations/figma/files/lib/types.ts +503 -0
  172. package/dist/integrations/freshdesk/connector.json +85 -0
  173. package/dist/integrations/freshdesk/files/_env.example +4 -0
  174. package/dist/integrations/freshdesk/files/ai/tools/create-ticket.ts +60 -0
  175. package/dist/integrations/freshdesk/files/ai/tools/get-ticket.ts +46 -0
  176. package/dist/integrations/freshdesk/files/ai/tools/list-contacts.ts +37 -0
  177. package/dist/integrations/freshdesk/files/ai/tools/list-tickets.ts +59 -0
  178. package/dist/integrations/freshdesk/files/ai/tools/update-ticket.ts +61 -0
  179. package/dist/integrations/freshdesk/files/app/api/auth/freshdesk/callback/route.ts +11 -0
  180. package/dist/integrations/freshdesk/files/app/api/auth/freshdesk/route.ts +7 -0
  181. package/dist/integrations/freshdesk/files/lib/freshdesk-client.ts +178 -0
  182. package/dist/integrations/freshdesk/files/lib/token-store.ts +11 -0
  183. package/dist/integrations/github/files/app/api/auth/github/callback/route.ts +6 -127
  184. package/dist/integrations/github/files/app/api/auth/github/route.ts +4 -24
  185. package/dist/integrations/github/files/lib/token-store.ts +2 -110
  186. package/dist/integrations/gitlab/connector.json +100 -0
  187. package/dist/integrations/gitlab/files/_env.example +7 -0
  188. package/dist/integrations/gitlab/files/ai/tools/create-issue.ts +49 -0
  189. package/dist/integrations/gitlab/files/ai/tools/get-issue.ts +56 -0
  190. package/dist/integrations/gitlab/files/ai/tools/list-merge-requests.ts +75 -0
  191. package/dist/integrations/gitlab/files/ai/tools/list-projects.ts +51 -0
  192. package/dist/integrations/gitlab/files/ai/tools/search-issues.ts +67 -0
  193. package/dist/integrations/gitlab/files/app/api/auth/gitlab/callback/route.ts +11 -0
  194. package/dist/integrations/gitlab/files/app/api/auth/gitlab/route.ts +9 -0
  195. package/dist/integrations/gitlab/files/lib/gitlab-client.ts +366 -0
  196. package/dist/integrations/gitlab/files/lib/token-store.ts +5 -0
  197. package/dist/integrations/gmail/files/app/api/auth/gmail/callback/route.ts +7 -108
  198. package/dist/integrations/gmail/files/app/api/auth/gmail/route.ts +5 -23
  199. package/dist/integrations/gmail/files/lib/gmail-client.ts +16 -55
  200. package/dist/integrations/gmail/files/lib/token-store.ts +4 -109
  201. package/dist/integrations/hubspot/connector.json +98 -0
  202. package/dist/integrations/hubspot/files/_env.example +5 -0
  203. package/dist/integrations/hubspot/files/ai/tools/create-contact.ts +41 -0
  204. package/dist/integrations/hubspot/files/ai/tools/create-deal.ts +41 -0
  205. package/dist/integrations/hubspot/files/ai/tools/get-contact.ts +39 -0
  206. package/dist/integrations/hubspot/files/ai/tools/list-contacts.ts +43 -0
  207. package/dist/integrations/hubspot/files/ai/tools/list-deals.ts +41 -0
  208. package/dist/integrations/hubspot/files/app/api/auth/hubspot/callback/route.ts +11 -0
  209. package/dist/integrations/hubspot/files/app/api/auth/hubspot/route.ts +9 -0
  210. package/dist/integrations/hubspot/files/lib/hubspot-client.ts +393 -0
  211. package/dist/integrations/hubspot/files/lib/token-store.ts +5 -0
  212. package/dist/integrations/intercom/connector.json +85 -0
  213. package/dist/integrations/intercom/files/_env.example +4 -0
  214. package/dist/integrations/intercom/files/ai/tools/get-contact.ts +35 -0
  215. package/dist/integrations/intercom/files/ai/tools/get-conversation.ts +55 -0
  216. package/dist/integrations/intercom/files/ai/tools/list-contacts.ts +35 -0
  217. package/dist/integrations/intercom/files/ai/tools/list-conversations.ts +49 -0
  218. package/dist/integrations/intercom/files/ai/tools/send-message.ts +34 -0
  219. package/dist/integrations/intercom/files/app/api/auth/intercom/callback/route.ts +11 -0
  220. package/dist/integrations/intercom/files/app/api/auth/intercom/route.ts +7 -0
  221. package/dist/integrations/intercom/files/lib/intercom-client.ts +308 -0
  222. package/dist/integrations/intercom/files/lib/token-store.ts +11 -0
  223. package/dist/integrations/jira/connector.json +109 -0
  224. package/dist/integrations/jira/files/ai/tools/create-issue.ts +47 -0
  225. package/dist/integrations/jira/files/ai/tools/get-issue.ts +57 -0
  226. package/dist/integrations/jira/files/ai/tools/list-projects.ts +30 -0
  227. package/dist/integrations/jira/files/ai/tools/search-issues.ts +49 -0
  228. package/dist/integrations/jira/files/ai/tools/update-issue.ts +81 -0
  229. package/dist/integrations/jira/files/app/api/auth/jira/callback/route.ts +11 -0
  230. package/dist/integrations/jira/files/app/api/auth/jira/route.ts +9 -0
  231. package/dist/integrations/jira/files/lib/jira-client.ts +338 -0
  232. package/dist/integrations/jira/files/lib/token-store.ts +5 -0
  233. package/dist/integrations/linear/connector.json +100 -0
  234. package/dist/integrations/linear/files/_env.example +6 -0
  235. package/dist/integrations/linear/files/ai/tools/create-issue.ts +71 -0
  236. package/dist/integrations/linear/files/ai/tools/get-issue.ts +55 -0
  237. package/dist/integrations/linear/files/ai/tools/list-projects.ts +43 -0
  238. package/dist/integrations/linear/files/ai/tools/search-issues.ts +54 -0
  239. package/dist/integrations/linear/files/ai/tools/update-issue.ts +71 -0
  240. package/dist/integrations/linear/files/app/api/auth/linear/callback/route.ts +11 -0
  241. package/dist/integrations/linear/files/app/api/auth/linear/route.ts +9 -0
  242. package/dist/integrations/linear/files/lib/linear-client.ts +464 -0
  243. package/dist/integrations/linear/files/lib/token-store.ts +5 -0
  244. package/dist/integrations/mailchimp/connector.json +85 -0
  245. package/dist/integrations/mailchimp/files/_env.example +4 -0
  246. package/dist/integrations/mailchimp/files/ai/tools/get-campaign.ts +45 -0
  247. package/dist/integrations/mailchimp/files/ai/tools/get-list.ts +51 -0
  248. package/dist/integrations/mailchimp/files/ai/tools/list-campaigns.ts +46 -0
  249. package/dist/integrations/mailchimp/files/ai/tools/list-lists.ts +46 -0
  250. package/dist/integrations/mailchimp/files/ai/tools/list-members.ts +58 -0
  251. package/dist/integrations/mailchimp/files/app/api/auth/mailchimp/callback/route.ts +11 -0
  252. package/dist/integrations/mailchimp/files/app/api/auth/mailchimp/route.ts +7 -0
  253. package/dist/integrations/mailchimp/files/lib/mailchimp-client.ts +267 -0
  254. package/dist/integrations/mailchimp/files/lib/token-store.ts +11 -0
  255. package/dist/integrations/mixpanel/connector.json +96 -0
  256. package/dist/integrations/mixpanel/files/_env.example +11 -0
  257. package/dist/integrations/mixpanel/files/ai/tools/get-funnel.ts +46 -0
  258. package/dist/integrations/mixpanel/files/ai/tools/get-retention.ts +64 -0
  259. package/dist/integrations/mixpanel/files/ai/tools/list-cohorts.ts +46 -0
  260. package/dist/integrations/mixpanel/files/ai/tools/query-events.ts +43 -0
  261. package/dist/integrations/mixpanel/files/ai/tools/track-event.ts +41 -0
  262. package/dist/integrations/mixpanel/files/lib/mixpanel-client.ts +319 -0
  263. package/dist/integrations/mixpanel/files/lib/token-store.ts +43 -0
  264. package/dist/integrations/monday/connector.json +85 -0
  265. package/dist/integrations/monday/files/_env.example +4 -0
  266. package/dist/integrations/monday/files/ai/tools/create-item.ts +36 -0
  267. package/dist/integrations/monday/files/ai/tools/get-item.ts +31 -0
  268. package/dist/integrations/monday/files/ai/tools/list-boards.ts +29 -0
  269. package/dist/integrations/monday/files/ai/tools/list-items.ts +36 -0
  270. package/dist/integrations/monday/files/ai/tools/update-item.ts +36 -0
  271. package/dist/integrations/monday/files/app/api/auth/monday/callback/route.ts +11 -0
  272. package/dist/integrations/monday/files/app/api/auth/monday/route.ts +7 -0
  273. package/dist/integrations/monday/files/lib/monday-client.ts +329 -0
  274. package/dist/integrations/monday/files/lib/token-store.ts +11 -0
  275. package/dist/integrations/neon/connector.json +89 -0
  276. package/dist/integrations/neon/files/_env.example +6 -0
  277. package/dist/integrations/neon/files/ai/tools/describe-table.ts +38 -0
  278. package/dist/integrations/neon/files/ai/tools/list-branches.ts +35 -0
  279. package/dist/integrations/neon/files/ai/tools/list-projects.ts +31 -0
  280. package/dist/integrations/neon/files/ai/tools/list-tables.ts +49 -0
  281. package/dist/integrations/neon/files/ai/tools/query-database.ts +33 -0
  282. package/dist/integrations/neon/files/app/api/auth/neon/route.ts +51 -0
  283. package/dist/integrations/neon/files/lib/neon-client.ts +294 -0
  284. package/dist/integrations/neon/files/lib/token-store.ts +29 -0
  285. package/dist/integrations/notion/connector.json +87 -0
  286. package/dist/integrations/notion/files/_env.example +6 -0
  287. package/dist/integrations/notion/files/ai/tools/create-page.ts +32 -0
  288. package/dist/integrations/notion/files/ai/tools/query-database.ts +44 -0
  289. package/dist/integrations/notion/files/ai/tools/read-page.ts +34 -0
  290. package/dist/integrations/notion/files/ai/tools/search-notion.ts +51 -0
  291. package/dist/integrations/notion/files/app/api/auth/notion/callback/route.ts +11 -0
  292. package/dist/integrations/notion/files/app/api/auth/notion/route.ts +9 -0
  293. package/dist/integrations/notion/files/lib/notion-client.ts +218 -0
  294. package/dist/integrations/notion/files/lib/token-store.ts +5 -0
  295. package/dist/integrations/onedrive/connector.json +100 -0
  296. package/dist/integrations/onedrive/files/_env.example +23 -0
  297. package/dist/integrations/onedrive/files/ai/tools/download-file.ts +38 -0
  298. package/dist/integrations/onedrive/files/ai/tools/list-files.ts +63 -0
  299. package/dist/integrations/onedrive/files/ai/tools/search-files.ts +59 -0
  300. package/dist/integrations/onedrive/files/ai/tools/upload-file.ts +43 -0
  301. package/dist/integrations/onedrive/files/app/api/auth/onedrive/callback/route.ts +11 -0
  302. package/dist/integrations/onedrive/files/app/api/auth/onedrive/route.ts +9 -0
  303. package/dist/integrations/onedrive/files/lib/onedrive-client.ts +314 -0
  304. package/dist/integrations/onedrive/files/lib/token-store.ts +5 -0
  305. package/dist/integrations/outlook/README.md +308 -0
  306. package/dist/integrations/outlook/connector.json +98 -0
  307. package/dist/integrations/outlook/files/_env.example +8 -0
  308. package/dist/integrations/outlook/files/ai/tools/get-email.ts +47 -0
  309. package/dist/integrations/outlook/files/ai/tools/list-emails.ts +46 -0
  310. package/dist/integrations/outlook/files/ai/tools/list-folders.ts +22 -0
  311. package/dist/integrations/outlook/files/ai/tools/search-emails.ts +41 -0
  312. package/dist/integrations/outlook/files/ai/tools/send-email.ts +41 -0
  313. package/dist/integrations/outlook/files/app/api/auth/outlook/callback/route.ts +11 -0
  314. package/dist/integrations/outlook/files/app/api/auth/outlook/route.ts +9 -0
  315. package/dist/integrations/outlook/files/lib/outlook-client.ts +204 -0
  316. package/dist/integrations/outlook/files/lib/token-store.ts +5 -0
  317. package/dist/integrations/pipedrive/connector.json +85 -0
  318. package/dist/integrations/pipedrive/files/_env.example +4 -0
  319. package/dist/integrations/pipedrive/files/ai/tools/create-deal.ts +44 -0
  320. package/dist/integrations/pipedrive/files/ai/tools/get-deal.ts +34 -0
  321. package/dist/integrations/pipedrive/files/ai/tools/list-deals.ts +40 -0
  322. package/dist/integrations/pipedrive/files/ai/tools/list-persons.ts +33 -0
  323. package/dist/integrations/pipedrive/files/ai/tools/update-deal.ts +46 -0
  324. package/dist/integrations/pipedrive/files/app/api/auth/pipedrive/callback/route.ts +11 -0
  325. package/dist/integrations/pipedrive/files/app/api/auth/pipedrive/route.ts +7 -0
  326. package/dist/integrations/pipedrive/files/lib/pipedrive-client.ts +259 -0
  327. package/dist/integrations/pipedrive/files/lib/token-store.ts +11 -0
  328. package/dist/integrations/posthog/connector.json +84 -0
  329. package/dist/integrations/posthog/files/_env.example +6 -0
  330. package/dist/integrations/posthog/files/ai/tools/capture-event.ts +37 -0
  331. package/dist/integrations/posthog/files/ai/tools/get-trends.ts +44 -0
  332. package/dist/integrations/posthog/files/ai/tools/list-feature-flags.ts +38 -0
  333. package/dist/integrations/posthog/files/ai/tools/list-persons.ts +32 -0
  334. package/dist/integrations/posthog/files/lib/posthog-client.ts +286 -0
  335. package/dist/integrations/posthog/files/lib/token-store.ts +21 -0
  336. package/dist/integrations/quickbooks/connector.json +85 -0
  337. package/dist/integrations/quickbooks/files/_env.example +4 -0
  338. package/dist/integrations/quickbooks/files/ai/tools/create-invoice.ts +48 -0
  339. package/dist/integrations/quickbooks/files/ai/tools/get-customer.ts +36 -0
  340. package/dist/integrations/quickbooks/files/ai/tools/get-invoice.ts +46 -0
  341. package/dist/integrations/quickbooks/files/ai/tools/list-customers.ts +37 -0
  342. package/dist/integrations/quickbooks/files/ai/tools/list-invoices.ts +40 -0
  343. package/dist/integrations/quickbooks/files/app/api/auth/quickbooks/callback/route.ts +11 -0
  344. package/dist/integrations/quickbooks/files/app/api/auth/quickbooks/route.ts +7 -0
  345. package/dist/integrations/quickbooks/files/lib/quickbooks-client.ts +252 -0
  346. package/dist/integrations/quickbooks/files/lib/token-store.ts +11 -0
  347. package/dist/integrations/salesforce/connector.json +104 -0
  348. package/dist/integrations/salesforce/files/ai/tools/create-lead.ts +101 -0
  349. package/dist/integrations/salesforce/files/ai/tools/get-account.ts +53 -0
  350. package/dist/integrations/salesforce/files/ai/tools/list-accounts.ts +50 -0
  351. package/dist/integrations/salesforce/files/ai/tools/list-contacts.ts +54 -0
  352. package/dist/integrations/salesforce/files/ai/tools/list-opportunities.ts +55 -0
  353. package/dist/integrations/salesforce/files/app/api/auth/salesforce/callback/route.ts +11 -0
  354. package/dist/integrations/salesforce/files/app/api/auth/salesforce/route.ts +9 -0
  355. package/dist/integrations/salesforce/files/lib/salesforce-client.ts +539 -0
  356. package/dist/integrations/salesforce/files/lib/token-store.ts +5 -0
  357. package/dist/integrations/sentry/connector.json +84 -0
  358. package/dist/integrations/sentry/files/_env.example +6 -0
  359. package/dist/integrations/sentry/files/ai/tools/get-issue.ts +66 -0
  360. package/dist/integrations/sentry/files/ai/tools/list-issues.ts +57 -0
  361. package/dist/integrations/sentry/files/ai/tools/list-projects.ts +32 -0
  362. package/dist/integrations/sentry/files/ai/tools/resolve-issue.ts +28 -0
  363. package/dist/integrations/sentry/files/lib/sentry-client.ts +268 -0
  364. package/dist/integrations/sentry/files/lib/token-store.ts +29 -0
  365. package/dist/integrations/servicenow/connector.json +66 -0
  366. package/dist/integrations/servicenow/files/_env.example +5 -0
  367. package/dist/integrations/servicenow/files/ai/tools/create-incident.ts +58 -0
  368. package/dist/integrations/servicenow/files/ai/tools/get-incident.ts +59 -0
  369. package/dist/integrations/servicenow/files/ai/tools/list-incidents.ts +72 -0
  370. package/dist/integrations/servicenow/files/ai/tools/search-knowledge.ts +48 -0
  371. package/dist/integrations/servicenow/files/ai/tools/update-incident.ts +60 -0
  372. package/dist/integrations/servicenow/files/app/api/auth/servicenow/callback/route.ts +89 -0
  373. package/dist/integrations/servicenow/files/app/api/auth/servicenow/route.ts +42 -0
  374. package/dist/integrations/servicenow/files/lib/servicenow-client.ts +239 -0
  375. package/dist/integrations/servicenow/files/lib/token-store.ts +42 -0
  376. package/dist/integrations/sharepoint/connector.json +99 -0
  377. package/dist/integrations/sharepoint/files/ai/tools/get-file.ts +93 -0
  378. package/dist/integrations/sharepoint/files/ai/tools/get-site.ts +51 -0
  379. package/dist/integrations/sharepoint/files/ai/tools/list-files.ts +63 -0
  380. package/dist/integrations/sharepoint/files/ai/tools/list-sites.ts +28 -0
  381. package/dist/integrations/sharepoint/files/ai/tools/upload-file.ts +72 -0
  382. package/dist/integrations/sharepoint/files/app/api/auth/sharepoint/callback/route.ts +11 -0
  383. package/dist/integrations/sharepoint/files/app/api/auth/sharepoint/route.ts +9 -0
  384. package/dist/integrations/sharepoint/files/lib/sharepoint-client.ts +420 -0
  385. package/dist/integrations/sharepoint/files/lib/token-store.ts +5 -0
  386. package/dist/integrations/sheets/README.md +331 -0
  387. package/dist/integrations/sheets/connector.json +99 -0
  388. package/dist/integrations/sheets/files/_env.example +8 -0
  389. package/dist/integrations/sheets/files/ai/tools/create-spreadsheet.ts +85 -0
  390. package/dist/integrations/sheets/files/ai/tools/get-spreadsheet.ts +39 -0
  391. package/dist/integrations/sheets/files/ai/tools/list-spreadsheets.ts +41 -0
  392. package/dist/integrations/sheets/files/ai/tools/read-range.ts +35 -0
  393. package/dist/integrations/sheets/files/ai/tools/write-range.ts +51 -0
  394. package/dist/integrations/sheets/files/app/api/auth/sheets/callback/route.ts +11 -0
  395. package/dist/integrations/sheets/files/app/api/auth/sheets/route.ts +9 -0
  396. package/dist/integrations/sheets/files/lib/sheets-client.ts +425 -0
  397. package/dist/integrations/sheets/files/lib/token-store.ts +5 -0
  398. package/dist/integrations/shopify/connector.json +99 -0
  399. package/dist/integrations/shopify/files/_env.example +5 -0
  400. package/dist/integrations/shopify/files/ai/tools/get-order.ts +49 -0
  401. package/dist/integrations/shopify/files/ai/tools/get-product.ts +39 -0
  402. package/dist/integrations/shopify/files/ai/tools/list-customers.ts +40 -0
  403. package/dist/integrations/shopify/files/ai/tools/list-orders.ts +52 -0
  404. package/dist/integrations/shopify/files/ai/tools/list-products.ts +39 -0
  405. package/dist/integrations/shopify/files/app/api/auth/shopify/callback/route.ts +11 -0
  406. package/dist/integrations/shopify/files/app/api/auth/shopify/route.ts +7 -0
  407. package/dist/integrations/shopify/files/lib/shopify-client.ts +198 -0
  408. package/dist/integrations/shopify/files/lib/token-store.ts +11 -0
  409. package/dist/integrations/slack/files/app/api/auth/slack/callback/route.ts +6 -127
  410. package/dist/integrations/slack/files/app/api/auth/slack/route.ts +4 -24
  411. package/dist/integrations/slack/files/lib/token-store.ts +2 -110
  412. package/dist/integrations/snowflake/connector.json +151 -0
  413. package/dist/integrations/snowflake/files/_env.example +16 -0
  414. package/dist/integrations/snowflake/files/ai/tools/describe-table.ts +57 -0
  415. package/dist/integrations/snowflake/files/ai/tools/list-databases.ts +34 -0
  416. package/dist/integrations/snowflake/files/ai/tools/list-schemas.ts +40 -0
  417. package/dist/integrations/snowflake/files/ai/tools/list-tables.ts +49 -0
  418. package/dist/integrations/snowflake/files/ai/tools/run-query.ts +119 -0
  419. package/dist/integrations/snowflake/files/lib/snowflake-client.ts +389 -0
  420. package/dist/integrations/snowflake/files/lib/token-store.ts +77 -0
  421. package/dist/integrations/stripe/connector.json +97 -0
  422. package/dist/integrations/stripe/files/_env.example +6 -0
  423. package/dist/integrations/stripe/files/ai/tools/get-balance.ts +28 -0
  424. package/dist/integrations/stripe/files/ai/tools/get-customer.ts +26 -0
  425. package/dist/integrations/stripe/files/ai/tools/list-customers.ts +42 -0
  426. package/dist/integrations/stripe/files/ai/tools/list-payments.ts +45 -0
  427. package/dist/integrations/stripe/files/ai/tools/list-subscriptions.ts +67 -0
  428. package/dist/integrations/stripe/files/app/api/auth/stripe/route.ts +71 -0
  429. package/dist/integrations/stripe/files/lib/stripe-client.ts +376 -0
  430. package/dist/integrations/stripe/files/lib/token-store.ts +21 -0
  431. package/dist/integrations/supabase/connector.json +101 -0
  432. package/dist/integrations/supabase/files/_env.example +6 -0
  433. package/dist/integrations/supabase/files/ai/tools/delete-row.ts +77 -0
  434. package/dist/integrations/supabase/files/ai/tools/insert-row.ts +35 -0
  435. package/dist/integrations/supabase/files/ai/tools/list-tables.ts +60 -0
  436. package/dist/integrations/supabase/files/ai/tools/query-table.ts +48 -0
  437. package/dist/integrations/supabase/files/ai/tools/update-row.ts +64 -0
  438. package/dist/integrations/supabase/files/app/api/auth/supabase/route.ts +91 -0
  439. package/dist/integrations/supabase/files/lib/supabase-client.ts +296 -0
  440. package/dist/integrations/supabase/files/lib/token-store.ts +47 -0
  441. package/dist/integrations/teams/README.md +256 -0
  442. package/dist/integrations/teams/connector.json +99 -0
  443. package/dist/integrations/teams/files/ai/tools/get-messages.ts +55 -0
  444. package/dist/integrations/teams/files/ai/tools/list-channels.ts +28 -0
  445. package/dist/integrations/teams/files/ai/tools/list-chats.ts +41 -0
  446. package/dist/integrations/teams/files/ai/tools/list-teams.ts +27 -0
  447. package/dist/integrations/teams/files/ai/tools/send-message.ts +61 -0
  448. package/dist/integrations/teams/files/app/api/auth/teams/callback/route.ts +11 -0
  449. package/dist/integrations/teams/files/app/api/auth/teams/route.ts +9 -0
  450. package/dist/integrations/teams/files/lib/teams-client.ts +345 -0
  451. package/dist/integrations/teams/files/lib/token-store.ts +5 -0
  452. package/dist/integrations/trello/connector.json +85 -0
  453. package/dist/integrations/trello/files/_env.example +4 -0
  454. package/dist/integrations/trello/files/ai/tools/create-card.ts +54 -0
  455. package/dist/integrations/trello/files/ai/tools/get-card.ts +33 -0
  456. package/dist/integrations/trello/files/ai/tools/list-boards.ts +29 -0
  457. package/dist/integrations/trello/files/ai/tools/list-cards.ts +52 -0
  458. package/dist/integrations/trello/files/ai/tools/update-card.ts +65 -0
  459. package/dist/integrations/trello/files/app/api/auth/trello/callback/route.ts +11 -0
  460. package/dist/integrations/trello/files/app/api/auth/trello/route.ts +7 -0
  461. package/dist/integrations/trello/files/lib/token-store.ts +11 -0
  462. package/dist/integrations/trello/files/lib/trello-client.ts +202 -0
  463. package/dist/integrations/twilio/connector.json +146 -0
  464. package/dist/integrations/twilio/files/_env.example +14 -0
  465. package/dist/integrations/twilio/files/ai/tools/get-message.ts +58 -0
  466. package/dist/integrations/twilio/files/ai/tools/list-calls.ts +129 -0
  467. package/dist/integrations/twilio/files/ai/tools/list-messages.ts +97 -0
  468. package/dist/integrations/twilio/files/ai/tools/send-sms.ts +75 -0
  469. package/dist/integrations/twilio/files/ai/tools/send-whatsapp.ts +81 -0
  470. package/dist/integrations/twilio/files/lib/token-store.ts +60 -0
  471. package/dist/integrations/twilio/files/lib/twilio-client.ts +375 -0
  472. package/dist/integrations/twitter/connector.json +87 -0
  473. package/dist/integrations/twitter/files/_env.example +6 -0
  474. package/dist/integrations/twitter/files/ai/tools/get-timeline.ts +59 -0
  475. package/dist/integrations/twitter/files/ai/tools/post-tweet.ts +49 -0
  476. package/dist/integrations/twitter/files/ai/tools/search-tweets.ts +71 -0
  477. package/dist/integrations/twitter/files/app/api/auth/twitter/callback/route.ts +11 -0
  478. package/dist/integrations/twitter/files/app/api/auth/twitter/route.ts +9 -0
  479. package/dist/integrations/twitter/files/lib/token-store.ts +5 -0
  480. package/dist/integrations/twitter/files/lib/twitter-client.ts +236 -0
  481. package/dist/integrations/webex/connector.json +85 -0
  482. package/dist/integrations/webex/files/_env.example +4 -0
  483. package/dist/integrations/webex/files/ai/tools/create-meeting.ts +69 -0
  484. package/dist/integrations/webex/files/ai/tools/get-meeting.ts +31 -0
  485. package/dist/integrations/webex/files/ai/tools/list-meetings.ts +44 -0
  486. package/dist/integrations/webex/files/ai/tools/list-rooms.ts +35 -0
  487. package/dist/integrations/webex/files/ai/tools/send-message.ts +51 -0
  488. package/dist/integrations/webex/files/app/api/auth/webex/callback/route.ts +11 -0
  489. package/dist/integrations/webex/files/app/api/auth/webex/route.ts +7 -0
  490. package/dist/integrations/webex/files/lib/token-store.ts +11 -0
  491. package/dist/integrations/webex/files/lib/webex-client.ts +279 -0
  492. package/dist/integrations/xero/connector.json +85 -0
  493. package/dist/integrations/xero/files/_env.example +4 -0
  494. package/dist/integrations/xero/files/ai/tools/create-invoice.ts +65 -0
  495. package/dist/integrations/xero/files/ai/tools/get-contact.ts +40 -0
  496. package/dist/integrations/xero/files/ai/tools/get-invoice.ts +44 -0
  497. package/dist/integrations/xero/files/ai/tools/list-contacts.ts +54 -0
  498. package/dist/integrations/xero/files/ai/tools/list-invoices.ts +54 -0
  499. package/dist/integrations/xero/files/app/api/auth/xero/callback/route.ts +11 -0
  500. package/dist/integrations/xero/files/app/api/auth/xero/route.ts +7 -0
  501. package/dist/integrations/xero/files/lib/token-store.ts +11 -0
  502. package/dist/integrations/xero/files/lib/xero-client.ts +292 -0
  503. package/dist/integrations/zendesk/connector.json +61 -0
  504. package/dist/integrations/zendesk/files/_env.example +5 -0
  505. package/dist/integrations/zendesk/files/ai/tools/create-ticket.ts +82 -0
  506. package/dist/integrations/zendesk/files/ai/tools/get-ticket.ts +53 -0
  507. package/dist/integrations/zendesk/files/ai/tools/list-tickets.ts +60 -0
  508. package/dist/integrations/zendesk/files/ai/tools/search-tickets.ts +56 -0
  509. package/dist/integrations/zendesk/files/app/api/auth/zendesk/callback/route.ts +91 -0
  510. package/dist/integrations/zendesk/files/app/api/auth/zendesk/route.ts +41 -0
  511. package/dist/integrations/zendesk/files/lib/token-store.ts +47 -0
  512. package/dist/integrations/zendesk/files/lib/zendesk-client.ts +265 -0
  513. package/dist/integrations/zoom/connector.json +85 -0
  514. package/dist/integrations/zoom/files/_env.example +4 -0
  515. package/dist/integrations/zoom/files/ai/tools/create-meeting.ts +106 -0
  516. package/dist/integrations/zoom/files/ai/tools/delete-meeting.ts +32 -0
  517. package/dist/integrations/zoom/files/ai/tools/get-meeting.ts +44 -0
  518. package/dist/integrations/zoom/files/ai/tools/list-meetings.ts +47 -0
  519. package/dist/integrations/zoom/files/ai/tools/update-meeting.ts +111 -0
  520. package/dist/integrations/zoom/files/app/api/auth/zoom/callback/route.ts +11 -0
  521. package/dist/integrations/zoom/files/app/api/auth/zoom/route.ts +7 -0
  522. package/dist/integrations/zoom/files/lib/token-store.ts +11 -0
  523. package/dist/integrations/zoom/files/lib/zoom-client.ts +228 -0
  524. package/dist/oauth/handlers.js +554 -0
  525. package/dist/oauth/handlers.js.map +7 -0
  526. package/dist/oauth/index.js +1157 -0
  527. package/dist/oauth/index.js.map +7 -0
  528. package/dist/oauth/providers.js +927 -0
  529. package/dist/oauth/providers.js.map +7 -0
  530. package/dist/oauth/token-store.js +82 -0
  531. package/dist/oauth/token-store.js.map +7 -0
  532. package/package.json +25 -1
  533. package/dist/integrations/gmail/files/lib/oauth.ts +0 -145
  534. package/dist/integrations/slack/files/lib/oauth.ts +0 -145
  535. /package/dist/integrations/{calendar → docs-google}/files/lib/oauth.ts +0 -0
  536. /package/dist/integrations/{github → drive}/files/lib/oauth.ts +0 -0
@@ -0,0 +1,75 @@
1
+ import { tool } from "veryfront/ai";
2
+ import { z } from "zod";
3
+ import { sendSMS, formatPhoneNumber } from "../../lib/twilio-client.ts";
4
+
5
+ export default tool({
6
+ id: "send-sms",
7
+ description: "Send an SMS text message to a phone number using Twilio",
8
+ inputSchema: z.object({
9
+ to: z
10
+ .string()
11
+ .describe("Recipient phone number in E.164 format (e.g., +14155552671) or 10-digit US format"),
12
+ body: z
13
+ .string()
14
+ .min(1)
15
+ .max(1600)
16
+ .describe("Message text to send (max 1600 characters)"),
17
+ mediaUrl: z
18
+ .array(z.string().url())
19
+ .optional()
20
+ .describe("Optional array of media URLs to send as MMS (images, videos, etc.)"),
21
+ }),
22
+ execute: async ({ to, body, mediaUrl }) => {
23
+ try {
24
+ // Format phone number to E.164 if needed
25
+ const formattedPhone = formatPhoneNumber(to);
26
+
27
+ const message = await sendSMS(formattedPhone, body, {
28
+ mediaUrl,
29
+ });
30
+
31
+ return {
32
+ success: true,
33
+ messageSid: message.sid,
34
+ status: message.status,
35
+ to: message.to,
36
+ from: message.from,
37
+ body: message.body,
38
+ numSegments: message.num_segments,
39
+ price: message.price,
40
+ priceUnit: message.price_unit,
41
+ message: `SMS sent successfully to ${message.to}. Status: ${message.status}`,
42
+ };
43
+ } catch (error) {
44
+ if (error instanceof Error) {
45
+ // Check for common errors
46
+ if (error.message.includes("not configured")) {
47
+ return {
48
+ error: "Twilio not configured. Please set TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, and TWILIO_PHONE_NUMBER.",
49
+ setupUrl: "https://console.twilio.com/",
50
+ };
51
+ }
52
+
53
+ // Twilio API errors
54
+ if (error.message.includes("21211")) {
55
+ return {
56
+ error: `Invalid phone number: ${to}. Please use E.164 format (e.g., +14155552671).`,
57
+ };
58
+ }
59
+
60
+ if (error.message.includes("21608")) {
61
+ return {
62
+ error: `Unverified number. Trial accounts can only send to verified numbers. Verify at: https://console.twilio.com/us1/develop/phone-numbers/manage/verified`,
63
+ };
64
+ }
65
+
66
+ if (error.message.includes("21610")) {
67
+ return {
68
+ error: `Unverified 'To' number. This number must be verified before you can send messages to it during trial.`,
69
+ };
70
+ }
71
+ }
72
+ throw error;
73
+ }
74
+ },
75
+ });
@@ -0,0 +1,81 @@
1
+ import { tool } from "veryfront/ai";
2
+ import { z } from "zod";
3
+ import { sendWhatsApp, formatPhoneNumber } from "../../lib/twilio-client.ts";
4
+
5
+ export default tool({
6
+ id: "send-whatsapp",
7
+ description: "Send a WhatsApp message to a phone number using Twilio. Note: Recipients must have opted in to receive messages.",
8
+ inputSchema: z.object({
9
+ to: z
10
+ .string()
11
+ .describe("Recipient phone number in E.164 format (e.g., +14155552671). The 'whatsapp:' prefix is optional."),
12
+ body: z
13
+ .string()
14
+ .min(1)
15
+ .describe("Message text to send"),
16
+ mediaUrl: z
17
+ .array(z.string().url())
18
+ .optional()
19
+ .describe("Optional array of media URLs to send (images, videos, PDFs, etc.)"),
20
+ }),
21
+ execute: async ({ to, body, mediaUrl }) => {
22
+ try {
23
+ // Format phone number to E.164 if needed
24
+ const formattedPhone = formatPhoneNumber(to);
25
+
26
+ const message = await sendWhatsApp(formattedPhone, body, {
27
+ mediaUrl,
28
+ });
29
+
30
+ return {
31
+ success: true,
32
+ messageSid: message.sid,
33
+ status: message.status,
34
+ to: message.to,
35
+ from: message.from,
36
+ body: message.body,
37
+ numSegments: message.num_segments,
38
+ price: message.price,
39
+ priceUnit: message.price_unit,
40
+ message: `WhatsApp message sent successfully to ${message.to}. Status: ${message.status}`,
41
+ };
42
+ } catch (error) {
43
+ if (error instanceof Error) {
44
+ // Check for common errors
45
+ if (error.message.includes("not configured")) {
46
+ return {
47
+ error: "Twilio not configured. Please set TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, and TWILIO_PHONE_NUMBER.",
48
+ setupUrl: "https://console.twilio.com/",
49
+ };
50
+ }
51
+
52
+ // Twilio WhatsApp-specific errors
53
+ if (error.message.includes("63007")) {
54
+ return {
55
+ error: "Recipient has not opted in to receive WhatsApp messages. They must send a message to your WhatsApp sandbox first.",
56
+ sandboxUrl: "https://console.twilio.com/us1/develop/sms/try-it-out/whatsapp-learn",
57
+ };
58
+ }
59
+
60
+ if (error.message.includes("63016")) {
61
+ return {
62
+ error: "WhatsApp message failed: Recipient phone number is not a WhatsApp user.",
63
+ };
64
+ }
65
+
66
+ if (error.message.includes("63030")) {
67
+ return {
68
+ error: "Message body is required for WhatsApp messages unless media is included.",
69
+ };
70
+ }
71
+
72
+ if (error.message.includes("63003")) {
73
+ return {
74
+ error: "Message exceeds maximum allowed length for WhatsApp.",
75
+ };
76
+ }
77
+ }
78
+ throw error;
79
+ }
80
+ },
81
+ });
@@ -0,0 +1,60 @@
1
+ // Helper for Cross-Platform environment access
2
+ function getEnv(key: string): string | undefined {
3
+ // @ts-ignore - Deno global
4
+ if (typeof Deno !== "undefined") {
5
+ // @ts-ignore - Deno global
6
+ return Deno.env.get(key);
7
+ } // @ts-ignore - process global
8
+ else if (typeof process !== "undefined" && process.env) {
9
+ // @ts-ignore - process global
10
+ return process.env[key];
11
+ }
12
+ return undefined;
13
+ }
14
+
15
+ /**
16
+ * Get Twilio credentials from environment variables
17
+ */
18
+ export function getTwilioCredentials(): {
19
+ accountSid: string;
20
+ authToken: string;
21
+ phoneNumber: string;
22
+ } | null {
23
+ const accountSid = getEnv("TWILIO_ACCOUNT_SID");
24
+ const authToken = getEnv("TWILIO_AUTH_TOKEN");
25
+ const phoneNumber = getEnv("TWILIO_PHONE_NUMBER");
26
+
27
+ if (!accountSid || !authToken || !phoneNumber) {
28
+ return null;
29
+ }
30
+
31
+ return { accountSid, authToken, phoneNumber };
32
+ }
33
+
34
+ /**
35
+ * Check if Twilio is authenticated
36
+ */
37
+ export function isAuthenticated(): boolean {
38
+ return getTwilioCredentials() !== null;
39
+ }
40
+
41
+ /**
42
+ * Get Twilio Account SID
43
+ */
44
+ export function getAccountSid(): string | null {
45
+ return getEnv("TWILIO_ACCOUNT_SID") || null;
46
+ }
47
+
48
+ /**
49
+ * Get Twilio Auth Token
50
+ */
51
+ export function getAuthToken(): string | null {
52
+ return getEnv("TWILIO_AUTH_TOKEN") || null;
53
+ }
54
+
55
+ /**
56
+ * Get Twilio Phone Number
57
+ */
58
+ export function getPhoneNumber(): string | null {
59
+ return getEnv("TWILIO_PHONE_NUMBER") || null;
60
+ }
@@ -0,0 +1,375 @@
1
+ /**
2
+ * Twilio API Client
3
+ *
4
+ * Provides a type-safe interface to Twilio API operations for SMS, WhatsApp, and voice calls.
5
+ * Documentation: https://www.twilio.com/docs/api
6
+ */
7
+
8
+ import { getTwilioCredentials } from "./token-store.ts";
9
+
10
+ const TWILIO_API_VERSION = "2010-04-01";
11
+
12
+ // Types
13
+ export interface TwilioMessage {
14
+ sid: string;
15
+ account_sid: string;
16
+ from: string;
17
+ to: string;
18
+ body: string;
19
+ status: "queued" | "sending" | "sent" | "failed" | "delivered" | "undelivered" | "receiving" | "received";
20
+ direction: "inbound" | "outbound-api" | "outbound-call" | "outbound-reply";
21
+ date_created: string;
22
+ date_updated: string;
23
+ date_sent: string | null;
24
+ price: string | null;
25
+ price_unit: string | null;
26
+ error_code: number | null;
27
+ error_message: string | null;
28
+ uri: string;
29
+ num_segments: string;
30
+ num_media: string;
31
+ messaging_service_sid: string | null;
32
+ }
33
+
34
+ export interface TwilioCall {
35
+ sid: string;
36
+ account_sid: string;
37
+ from: string;
38
+ to: string;
39
+ status: "queued" | "ringing" | "in-progress" | "completed" | "busy" | "failed" | "no-answer" | "canceled";
40
+ direction: "inbound" | "outbound-api" | "outbound-dial";
41
+ date_created: string;
42
+ date_updated: string;
43
+ start_time: string | null;
44
+ end_time: string | null;
45
+ duration: string | null;
46
+ price: string | null;
47
+ price_unit: string | null;
48
+ uri: string;
49
+ answered_by: string | null;
50
+ }
51
+
52
+ export interface TwilioListResponse<T> {
53
+ messages?: T[];
54
+ calls?: T[];
55
+ first_page_uri: string;
56
+ next_page_uri: string | null;
57
+ previous_page_uri: string | null;
58
+ uri: string;
59
+ page: number;
60
+ page_size: number;
61
+ }
62
+
63
+ interface TwilioErrorResponse {
64
+ code: number;
65
+ message: string;
66
+ more_info: string;
67
+ status: number;
68
+ }
69
+
70
+ /**
71
+ * Helper function for Twilio API calls
72
+ */
73
+ async function twilioFetch<T>(
74
+ endpoint: string,
75
+ options: RequestInit & { params?: Record<string, string | number> } = {},
76
+ ): Promise<T> {
77
+ const credentials = getTwilioCredentials();
78
+ if (!credentials) {
79
+ throw new Error(
80
+ "Twilio not configured. Please set TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, and TWILIO_PHONE_NUMBER environment variables.",
81
+ );
82
+ }
83
+
84
+ const { accountSid, authToken } = credentials;
85
+
86
+ // Build base URL
87
+ const baseUrl = `https://api.twilio.com/${TWILIO_API_VERSION}/Accounts/${accountSid}`;
88
+ let url = `${baseUrl}${endpoint}`;
89
+
90
+ // Build authorization header (Basic Auth)
91
+ const authString = btoa(`${accountSid}:${authToken}`);
92
+
93
+ // For POST requests, use form-urlencoded body
94
+ let body: string | undefined;
95
+ const headers: Record<string, string> = {
96
+ "Authorization": `Basic ${authString}`,
97
+ };
98
+
99
+ if (options.method === "POST" && options.params) {
100
+ const formData = new URLSearchParams();
101
+ Object.entries(options.params).forEach(([key, value]) => {
102
+ formData.append(key, String(value));
103
+ });
104
+ body = formData.toString();
105
+ headers["Content-Type"] = "application/x-www-form-urlencoded";
106
+ } else if (options.params) {
107
+ // For GET requests, add query parameters
108
+ const queryParams = new URLSearchParams();
109
+ Object.entries(options.params).forEach(([key, value]) => {
110
+ queryParams.append(key, String(value));
111
+ });
112
+ url += `?${queryParams.toString()}`;
113
+ }
114
+
115
+ const response = await fetch(url, {
116
+ ...options,
117
+ headers,
118
+ body,
119
+ });
120
+
121
+ const data = await response.json();
122
+
123
+ if (!response.ok) {
124
+ const error = data as TwilioErrorResponse;
125
+ throw new Error(
126
+ `Twilio API error (${error.code}): ${error.message}\nMore info: ${error.more_info}`,
127
+ );
128
+ }
129
+
130
+ return data as T;
131
+ }
132
+
133
+ /**
134
+ * Send an SMS message
135
+ * @param to - Recipient phone number in E.164 format (e.g., +14155552671)
136
+ * @param body - Message text (max 1600 characters)
137
+ * @param options - Optional parameters like MediaUrl for MMS
138
+ */
139
+ export async function sendSMS(
140
+ to: string,
141
+ body: string,
142
+ options?: {
143
+ mediaUrl?: string[];
144
+ statusCallback?: string;
145
+ },
146
+ ): Promise<TwilioMessage> {
147
+ const credentials = getTwilioCredentials();
148
+ if (!credentials) {
149
+ throw new Error("Twilio credentials not configured");
150
+ }
151
+
152
+ const params: Record<string, string> = {
153
+ To: to,
154
+ From: credentials.phoneNumber,
155
+ Body: body,
156
+ };
157
+
158
+ if (options?.mediaUrl && options.mediaUrl.length > 0) {
159
+ options.mediaUrl.forEach((url, index) => {
160
+ params[`MediaUrl[${index}]`] = url;
161
+ });
162
+ }
163
+
164
+ if (options?.statusCallback) {
165
+ params.StatusCallback = options.statusCallback;
166
+ }
167
+
168
+ return twilioFetch<TwilioMessage>("/Messages.json", {
169
+ method: "POST",
170
+ params,
171
+ });
172
+ }
173
+
174
+ /**
175
+ * Send a WhatsApp message
176
+ * @param to - Recipient phone number in E.164 format with 'whatsapp:' prefix (e.g., whatsapp:+14155552671)
177
+ * @param body - Message text
178
+ */
179
+ export async function sendWhatsApp(
180
+ to: string,
181
+ body: string,
182
+ options?: {
183
+ mediaUrl?: string[];
184
+ statusCallback?: string;
185
+ },
186
+ ): Promise<TwilioMessage> {
187
+ const credentials = getTwilioCredentials();
188
+ if (!credentials) {
189
+ throw new Error("Twilio credentials not configured");
190
+ }
191
+
192
+ // Ensure 'whatsapp:' prefix
193
+ const whatsappTo = to.startsWith("whatsapp:") ? to : `whatsapp:${to}`;
194
+ const whatsappFrom = credentials.phoneNumber.startsWith("whatsapp:")
195
+ ? credentials.phoneNumber
196
+ : `whatsapp:${credentials.phoneNumber}`;
197
+
198
+ const params: Record<string, string> = {
199
+ To: whatsappTo,
200
+ From: whatsappFrom,
201
+ Body: body,
202
+ };
203
+
204
+ if (options?.mediaUrl && options.mediaUrl.length > 0) {
205
+ options.mediaUrl.forEach((url, index) => {
206
+ params[`MediaUrl[${index}]`] = url;
207
+ });
208
+ }
209
+
210
+ if (options?.statusCallback) {
211
+ params.StatusCallback = options.statusCallback;
212
+ }
213
+
214
+ return twilioFetch<TwilioMessage>("/Messages.json", {
215
+ method: "POST",
216
+ params,
217
+ });
218
+ }
219
+
220
+ /**
221
+ * List messages
222
+ * @param options - Filter options for listing messages
223
+ */
224
+ export async function listMessages(options?: {
225
+ to?: string;
226
+ from?: string;
227
+ dateSent?: string;
228
+ limit?: number;
229
+ }): Promise<TwilioMessage[]> {
230
+ const params: Record<string, string | number> = {};
231
+
232
+ if (options?.to) params.To = options.to;
233
+ if (options?.from) params.From = options.from;
234
+ if (options?.dateSent) params.DateSent = options.dateSent;
235
+ if (options?.limit) params.PageSize = options.limit;
236
+
237
+ const response = await twilioFetch<TwilioListResponse<TwilioMessage>>(
238
+ "/Messages.json",
239
+ { params },
240
+ );
241
+
242
+ return response.messages || [];
243
+ }
244
+
245
+ /**
246
+ * Get a specific message by SID
247
+ * @param messageSid - The unique identifier for the message
248
+ */
249
+ export function getMessage(messageSid: string): Promise<TwilioMessage> {
250
+ return twilioFetch<TwilioMessage>(`/Messages/${messageSid}.json`);
251
+ }
252
+
253
+ /**
254
+ * List calls
255
+ * @param options - Filter options for listing calls
256
+ */
257
+ export async function listCalls(options?: {
258
+ to?: string;
259
+ from?: string;
260
+ status?: "queued" | "ringing" | "in-progress" | "completed" | "busy" | "failed" | "no-answer" | "canceled";
261
+ startTime?: string;
262
+ limit?: number;
263
+ }): Promise<TwilioCall[]> {
264
+ const params: Record<string, string | number> = {};
265
+
266
+ if (options?.to) params.To = options.to;
267
+ if (options?.from) params.From = options.from;
268
+ if (options?.status) params.Status = options.status;
269
+ if (options?.startTime) params.StartTime = options.startTime;
270
+ if (options?.limit) params.PageSize = options.limit;
271
+
272
+ const response = await twilioFetch<TwilioListResponse<TwilioCall>>(
273
+ "/Calls.json",
274
+ { params },
275
+ );
276
+
277
+ return response.calls || [];
278
+ }
279
+
280
+ /**
281
+ * Get a specific call by SID
282
+ * @param callSid - The unique identifier for the call
283
+ */
284
+ export function getCall(callSid: string): Promise<TwilioCall> {
285
+ return twilioFetch<TwilioCall>(`/Calls/${callSid}.json`);
286
+ }
287
+
288
+ /**
289
+ * Make an outbound call
290
+ * @param to - Recipient phone number in E.164 format
291
+ * @param twiml - TwiML instructions for the call (or URL to TwiML)
292
+ */
293
+ export async function makeCall(
294
+ to: string,
295
+ twiml: string,
296
+ options?: {
297
+ twimlUrl?: string;
298
+ statusCallback?: string;
299
+ statusCallbackMethod?: "GET" | "POST";
300
+ timeout?: number;
301
+ },
302
+ ): Promise<TwilioCall> {
303
+ const credentials = getTwilioCredentials();
304
+ if (!credentials) {
305
+ throw new Error("Twilio credentials not configured");
306
+ }
307
+
308
+ const params: Record<string, string | number> = {
309
+ To: to,
310
+ From: credentials.phoneNumber,
311
+ };
312
+
313
+ // Use either Twiml or Url
314
+ if (options?.twimlUrl) {
315
+ params.Url = options.twimlUrl;
316
+ } else {
317
+ params.Twiml = twiml;
318
+ }
319
+
320
+ if (options?.statusCallback) {
321
+ params.StatusCallback = options.statusCallback;
322
+ }
323
+
324
+ if (options?.statusCallbackMethod) {
325
+ params.StatusCallbackMethod = options.statusCallbackMethod;
326
+ }
327
+
328
+ if (options?.timeout) {
329
+ params.Timeout = options.timeout;
330
+ }
331
+
332
+ return twilioFetch<TwilioCall>("/Calls.json", {
333
+ method: "POST",
334
+ params,
335
+ });
336
+ }
337
+
338
+ /**
339
+ * Format phone number to E.164 format
340
+ * Note: This is a simple helper. For production, use libphonenumber-js
341
+ */
342
+ export function formatPhoneNumber(phone: string, defaultCountryCode = "+1"): string {
343
+ // Remove all non-digit characters
344
+ const digits = phone.replace(/\D/g, "");
345
+
346
+ // If it doesn't start with +, add country code
347
+ if (!phone.startsWith("+")) {
348
+ // If it's 10 digits (US), add +1
349
+ if (digits.length === 10) {
350
+ return `${defaultCountryCode}${digits}`;
351
+ }
352
+ // If it's 11 digits starting with 1, add +
353
+ if (digits.length === 11 && digits.startsWith("1")) {
354
+ return `+${digits}`;
355
+ }
356
+ // Otherwise, just add +
357
+ return `+${digits}`;
358
+ }
359
+
360
+ return phone;
361
+ }
362
+
363
+ /**
364
+ * Format date for Twilio API queries (YYYY-MM-DD)
365
+ */
366
+ export function formatDate(date: Date): string {
367
+ return date.toISOString().split("T")[0];
368
+ }
369
+
370
+ /**
371
+ * Parse Twilio date strings to Date objects
372
+ */
373
+ export function parseDate(dateString: string): Date {
374
+ return new Date(dateString);
375
+ }
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "twitter",
3
+ "displayName": "Twitter / X",
4
+ "icon": "twitter.svg",
5
+ "description": "Post tweets, read timeline, search tweets, and manage Twitter account",
6
+ "auth": {
7
+ "type": "oauth2",
8
+ "provider": "twitter",
9
+ "authorizationUrl": "https://twitter.com/i/oauth2/authorize",
10
+ "tokenUrl": "https://api.twitter.com/2/oauth2/token",
11
+ "scopes": [
12
+ "tweet.read",
13
+ "tweet.write",
14
+ "users.read",
15
+ "follows.read",
16
+ "offline.access"
17
+ ],
18
+ "callbackPath": "/api/auth/twitter/callback",
19
+ "usePKCE": true,
20
+ "requiredApis": [
21
+ {
22
+ "name": "Twitter API v2",
23
+ "enableUrl": "https://developer.twitter.com/en/portal/dashboard"
24
+ }
25
+ ]
26
+ },
27
+ "envVars": [
28
+ {
29
+ "name": "TWITTER_CLIENT_ID",
30
+ "description": "Twitter OAuth 2.0 Client ID",
31
+ "required": true,
32
+ "sensitive": false,
33
+ "docsUrl": "https://developer.twitter.com/en/portal/dashboard"
34
+ },
35
+ {
36
+ "name": "TWITTER_CLIENT_SECRET",
37
+ "description": "Twitter OAuth 2.0 Client Secret",
38
+ "required": true,
39
+ "sensitive": true,
40
+ "docsUrl": "https://developer.twitter.com/en/portal/dashboard"
41
+ }
42
+ ],
43
+ "tools": [
44
+ {
45
+ "id": "search-tweets",
46
+ "name": "Search Tweets",
47
+ "description": "Search recent tweets on Twitter/X",
48
+ "requiresWrite": false
49
+ },
50
+ {
51
+ "id": "post-tweet",
52
+ "name": "Post Tweet",
53
+ "description": "Create a new tweet on Twitter/X",
54
+ "requiresWrite": true
55
+ },
56
+ {
57
+ "id": "get-timeline",
58
+ "name": "Get Timeline",
59
+ "description": "Get the authenticated user's home timeline",
60
+ "requiresWrite": false
61
+ }
62
+ ],
63
+ "prompts": [
64
+ {
65
+ "id": "catch-up-twitter",
66
+ "title": "Catch up on Twitter",
67
+ "prompt": "Summarize the important tweets from my Twitter timeline today. Highlight trending topics and mentions.",
68
+ "category": "productivity",
69
+ "icon": "twitter"
70
+ },
71
+ {
72
+ "id": "compose-tweet",
73
+ "title": "Compose a tweet",
74
+ "prompt": "Help me compose and post an engaging tweet about my current work or thoughts.",
75
+ "category": "productivity",
76
+ "icon": "message"
77
+ },
78
+ {
79
+ "id": "search-topic",
80
+ "title": "Search Twitter topic",
81
+ "prompt": "Search Twitter for recent tweets about a specific topic and summarize the key discussions.",
82
+ "category": "research",
83
+ "icon": "search"
84
+ }
85
+ ],
86
+ "suggestedWith": ["slack", "linkedin", "notion"]
87
+ }
@@ -0,0 +1,6 @@
1
+ # Twitter / X Integration
2
+ # Create an app at https://developer.twitter.com/en/portal/dashboard
3
+ # Enable OAuth 2.0 and add callback URL: http://localhost:3000/api/auth/twitter/callback
4
+
5
+ TWITTER_CLIENT_ID=your_client_id_here
6
+ TWITTER_CLIENT_SECRET=your_client_secret_here