@jskit-ai/connectors-catalog 0.1.1

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 (399) hide show
  1. package/README.md +192 -0
  2. package/docs/ai-upstream-notices.md +51 -0
  3. package/docs/ai.md +191 -0
  4. package/docs/airtable.md +130 -0
  5. package/docs/algolia.md +190 -0
  6. package/docs/amazon-redshift.md +229 -0
  7. package/docs/amplitude.md +210 -0
  8. package/docs/apify.md +162 -0
  9. package/docs/apollo-io.md +200 -0
  10. package/docs/asana.md +126 -0
  11. package/docs/ashby.md +188 -0
  12. package/docs/atlassian.md +224 -0
  13. package/docs/attention.md +162 -0
  14. package/docs/aws-athena.md +150 -0
  15. package/docs/aws-credentials.md +75 -0
  16. package/docs/aws-s3.md +193 -0
  17. package/docs/bigquery.md +146 -0
  18. package/docs/brevo.md +122 -0
  19. package/docs/calendly.md +158 -0
  20. package/docs/canva.md +191 -0
  21. package/docs/chargebee.md +192 -0
  22. package/docs/clay.md +194 -0
  23. package/docs/clickhouse.md +242 -0
  24. package/docs/confidence-exp.md +74 -0
  25. package/docs/confidence-flags.md +75 -0
  26. package/docs/confidence-oauth.md +137 -0
  27. package/docs/contentful.md +123 -0
  28. package/docs/databricks.md +180 -0
  29. package/docs/dbt-semantic-layer.md +175 -0
  30. package/docs/elevenlabs.md +102 -0
  31. package/docs/figma.md +132 -0
  32. package/docs/firebase-cloud-messaging.md +262 -0
  33. package/docs/firecrawl.md +137 -0
  34. package/docs/fireflies.md +95 -0
  35. package/docs/fireworks-ai.md +53 -0
  36. package/docs/gatewayapi.md +113 -0
  37. package/docs/gemini-enterprise.md +224 -0
  38. package/docs/github-api.md +133 -0
  39. package/docs/gitlab-api.md +138 -0
  40. package/docs/gmail.md +133 -0
  41. package/docs/gong.md +205 -0
  42. package/docs/google-ads.md +156 -0
  43. package/docs/google-analytics.md +202 -0
  44. package/docs/google-docs.md +105 -0
  45. package/docs/google-drive.md +108 -0
  46. package/docs/google-maps-platform.md +208 -0
  47. package/docs/google-oauth.md +123 -0
  48. package/docs/google-search-console.md +124 -0
  49. package/docs/google-sheets.md +94 -0
  50. package/docs/google-slides.md +95 -0
  51. package/docs/granola.md +178 -0
  52. package/docs/hex.md +161 -0
  53. package/docs/heygen.md +124 -0
  54. package/docs/hubspot.md +142 -0
  55. package/docs/incident-io.md +118 -0
  56. package/docs/inngest.md +178 -0
  57. package/docs/klipy.md +149 -0
  58. package/docs/lexware.md +144 -0
  59. package/docs/lightspeed.md +193 -0
  60. package/docs/linear.md +137 -0
  61. package/docs/linkedin.md +196 -0
  62. package/docs/logo-dev.md +152 -0
  63. package/docs/mailgun.md +153 -0
  64. package/docs/mapbox.md +174 -0
  65. package/docs/microsoft-excel.md +97 -0
  66. package/docs/microsoft-fabric.md +249 -0
  67. package/docs/microsoft-oauth.md +143 -0
  68. package/docs/microsoft-onedrive.md +76 -0
  69. package/docs/microsoft-onenote.md +75 -0
  70. package/docs/microsoft-outlook.md +90 -0
  71. package/docs/microsoft-powerpoint.md +119 -0
  72. package/docs/microsoft-sharepoint.md +75 -0
  73. package/docs/microsoft-teams.md +72 -0
  74. package/docs/microsoft-word.md +119 -0
  75. package/docs/miro.md +117 -0
  76. package/docs/n8n.md +169 -0
  77. package/docs/notion.md +137 -0
  78. package/docs/oura.md +161 -0
  79. package/docs/paddle.md +168 -0
  80. package/docs/perplexity.md +85 -0
  81. package/docs/pipedrive.md +120 -0
  82. package/docs/polar.md +63 -0
  83. package/docs/posthog.md +227 -0
  84. package/docs/prestashop.md +151 -0
  85. package/docs/replicate.md +60 -0
  86. package/docs/resend.md +153 -0
  87. package/docs/salesforce.md +234 -0
  88. package/docs/sanity.md +122 -0
  89. package/docs/semrush.md +276 -0
  90. package/docs/sentry.md +112 -0
  91. package/docs/sevdesk.md +107 -0
  92. package/docs/shopify.md +206 -0
  93. package/docs/slack.md +257 -0
  94. package/docs/snowflake.md +271 -0
  95. package/docs/storyblok.md +130 -0
  96. package/docs/stripe.md +77 -0
  97. package/docs/supabase.md +51 -0
  98. package/docs/tally.md +105 -0
  99. package/docs/telegram.md +165 -0
  100. package/docs/tiktok.md +201 -0
  101. package/docs/twilio.md +284 -0
  102. package/docs/twitch.md +428 -0
  103. package/docs/wave.md +440 -0
  104. package/docs/wix.md +1249 -0
  105. package/docs/wiz.md +177 -0
  106. package/docs/woocommerce.md +400 -0
  107. package/docs/wordpress-com.md +358 -0
  108. package/docs/wordpress-self-hosted.md +252 -0
  109. package/docs/workday.md +292 -0
  110. package/docs/x-twitter.md +188 -0
  111. package/docs/xero.md +429 -0
  112. package/docs/zoho-books.md +214 -0
  113. package/docs/zoho-crm.md +192 -0
  114. package/package.json +153 -0
  115. package/patterns/ai-connections/PATTERN.md +84 -0
  116. package/patterns/ai-connections/example/ai-model.js +11 -0
  117. package/patterns/ai-connections/example/perplexity-answer.js +29 -0
  118. package/patterns/api-key-connection/PATTERN.md +368 -0
  119. package/patterns/api-key-connection/example/connections.js +18 -0
  120. package/patterns/api-key-connection/example/integrations.json +19 -0
  121. package/patterns/assistant-mcp/PATTERN.md +110 -0
  122. package/patterns/assistant-mcp/example/integrations.json +13 -0
  123. package/patterns/assistant-mcp-oauth/PATTERN.md +235 -0
  124. package/patterns/assistant-mcp-oauth/example/integrations.json +102 -0
  125. package/patterns/aws-storage-queries/PATTERN.md +169 -0
  126. package/patterns/aws-storage-queries/example/formats/data-formats.js +35 -0
  127. package/patterns/aws-storage-queries/example/formats/package-lock.json +49 -0
  128. package/patterns/aws-storage-queries/example/formats/package.json +12 -0
  129. package/patterns/aws-storage-queries/example/formats/verify-formats.mjs +37 -0
  130. package/patterns/aws-storage-queries/example/integrations.json +38 -0
  131. package/patterns/aws-storage-queries/example/s3-transfer.js +34 -0
  132. package/patterns/event-delivery/PATTERN.md +151 -0
  133. package/patterns/event-delivery/example/integrations.json +17 -0
  134. package/patterns/firebase-messaging/PATTERN.md +156 -0
  135. package/patterns/firebase-messaging/example/server/notifications.js +23 -0
  136. package/patterns/google-ads-search/PATTERN.md +92 -0
  137. package/patterns/google-ads-search/example/ads-setup.js +25 -0
  138. package/patterns/oauth-connection/PATTERN.md +724 -0
  139. package/patterns/oauth-connection/example/integrations.json +20 -0
  140. package/patterns/paddle-catalogue/PATTERN.md +78 -0
  141. package/patterns/paddle-catalogue/example/create-products.js +38 -0
  142. package/patterns/public-image/PATTERN.md +84 -0
  143. package/patterns/public-image/example/integrations.json +13 -0
  144. package/patterns/public-image/example/logo-url.js +16 -0
  145. package/patterns/redshift-queries/PATTERN.md +150 -0
  146. package/patterns/redshift-queries/example/integrations.json +33 -0
  147. package/patterns/source-scanning/PATTERN.md +83 -0
  148. package/patterns/source-scanning/example/source-scanner.js +13 -0
  149. package/src/client/firebase-cloud-messaging.js +10 -0
  150. package/src/client/google-analytics.js +72 -0
  151. package/src/client/google-maps-platform.js +39 -0
  152. package/src/client/logo-dev.js +36 -0
  153. package/src/server/ai.js +46 -0
  154. package/src/server/airtable.js +67 -0
  155. package/src/server/algolia.js +63 -0
  156. package/src/server/amazon-redshift.js +96 -0
  157. package/src/server/amplitude.js +31 -0
  158. package/src/server/apify.js +68 -0
  159. package/src/server/apollo-io.js +85 -0
  160. package/src/server/asana.js +64 -0
  161. package/src/server/ashby.js +61 -0
  162. package/src/server/atlassian.js +32 -0
  163. package/src/server/attention.js +93 -0
  164. package/src/server/aws-athena.js +82 -0
  165. package/src/server/aws-s3.js +49 -0
  166. package/src/server/awsTransport.js +75 -0
  167. package/src/server/bigquery.js +97 -0
  168. package/src/server/brevo.js +97 -0
  169. package/src/server/calendly.js +77 -0
  170. package/src/server/canva.js +13 -0
  171. package/src/server/chargebee.js +88 -0
  172. package/src/server/clay.js +78 -0
  173. package/src/server/clickhouse.js +66 -0
  174. package/src/server/confidence.js +29 -0
  175. package/src/server/contentful.js +40 -0
  176. package/src/server/databricks.js +55 -0
  177. package/src/server/dbt-semantic-layer.js +95 -0
  178. package/src/server/elevenlabs.js +81 -0
  179. package/src/server/figma.js +24 -0
  180. package/src/server/firebase-cloud-messaging.js +111 -0
  181. package/src/server/firecrawl.js +70 -0
  182. package/src/server/fireflies.js +31 -0
  183. package/src/server/fireworks-ai.js +16 -0
  184. package/src/server/gatewayapi.js +48 -0
  185. package/src/server/gemini-enterprise.js +47 -0
  186. package/src/server/github-api.js +90 -0
  187. package/src/server/gitlab-api.js +67 -0
  188. package/src/server/gmail.js +60 -0
  189. package/src/server/gong.js +52 -0
  190. package/src/server/google-ads-search.js +134 -0
  191. package/src/server/google-ads.js +80 -0
  192. package/src/server/google-docs.js +36 -0
  193. package/src/server/google-drive.js +71 -0
  194. package/src/server/google-maps-platform.js +90 -0
  195. package/src/server/google-search-console.js +31 -0
  196. package/src/server/google-sheets.js +60 -0
  197. package/src/server/google-slides.js +36 -0
  198. package/src/server/google.js +61 -0
  199. package/src/server/granola.js +115 -0
  200. package/src/server/graphqlOperation.js +15 -0
  201. package/src/server/hex.js +29 -0
  202. package/src/server/heygen.js +54 -0
  203. package/src/server/hubspot.js +85 -0
  204. package/src/server/incident-io.js +68 -0
  205. package/src/server/inngest.js +86 -0
  206. package/src/server/jsonOperation.js +34 -0
  207. package/src/server/klipy.js +34 -0
  208. package/src/server/lexware.js +59 -0
  209. package/src/server/lightspeed.js +82 -0
  210. package/src/server/linear.js +52 -0
  211. package/src/server/linkedin.js +74 -0
  212. package/src/server/mailgun.js +76 -0
  213. package/src/server/mapbox.js +46 -0
  214. package/src/server/mcpRegistration.js +41 -0
  215. package/src/server/mcpTransport.js +60 -0
  216. package/src/server/microsoft-excel.js +67 -0
  217. package/src/server/microsoft-fabric.js +81 -0
  218. package/src/server/microsoft-onedrive.js +58 -0
  219. package/src/server/microsoft-onenote.js +52 -0
  220. package/src/server/microsoft-outlook.js +58 -0
  221. package/src/server/microsoft-powerpoint.js +5 -0
  222. package/src/server/microsoft-sharepoint.js +46 -0
  223. package/src/server/microsoft-teams.js +29 -0
  224. package/src/server/microsoft-word.js +5 -0
  225. package/src/server/microsoft.js +88 -0
  226. package/src/server/miro.js +29 -0
  227. package/src/server/n8n.js +78 -0
  228. package/src/server/notion.js +76 -0
  229. package/src/server/oura.js +48 -0
  230. package/src/server/paddle.js +83 -0
  231. package/src/server/perplexity.js +15 -0
  232. package/src/server/pipedrive.js +95 -0
  233. package/src/server/polar.js +20 -0
  234. package/src/server/posthog.js +44 -0
  235. package/src/server/prestashop.js +42 -0
  236. package/src/server/replicate.js +42 -0
  237. package/src/server/resend.js +93 -0
  238. package/src/server/salesforce.js +84 -0
  239. package/src/server/sanity.js +31 -0
  240. package/src/server/semrush.js +359 -0
  241. package/src/server/sentry.js +30 -0
  242. package/src/server/sevdesk.js +20 -0
  243. package/src/server/shopify.js +99 -0
  244. package/src/server/slack.js +143 -0
  245. package/src/server/snowflake.js +139 -0
  246. package/src/server/storyblok.js +49 -0
  247. package/src/server/stripe.js +13 -0
  248. package/src/server/supabase.js +13 -0
  249. package/src/server/tally.js +78 -0
  250. package/src/server/telegram.js +55 -0
  251. package/src/server/tiktok.js +86 -0
  252. package/src/server/twilio.js +90 -0
  253. package/src/server/twitch.js +409 -0
  254. package/src/server/wave.js +520 -0
  255. package/src/server/wix.js +1048 -0
  256. package/src/server/wiz.js +117 -0
  257. package/src/server/woocommerce.js +412 -0
  258. package/src/server/wordpress-com.js +236 -0
  259. package/src/server/wordpress-self-hosted.js +134 -0
  260. package/src/server/workday.js +136 -0
  261. package/src/server/x-twitter.js +110 -0
  262. package/src/server/xero.js +397 -0
  263. package/src/server/zoho-books.js +90 -0
  264. package/src/server/zoho-crm.js +89 -0
  265. package/src/server/zohoOAuth.js +21 -0
  266. package/src/shared/ai-models.json +8049 -0
  267. package/src/shared/ai.js +63 -0
  268. package/src/shared/algolia.js +29 -0
  269. package/src/shared/amazon-redshift.js +51 -0
  270. package/src/shared/amplitude.js +28 -0
  271. package/src/shared/atlassian.js +43 -0
  272. package/src/shared/aws.js +72 -0
  273. package/src/shared/canva.js +66 -0
  274. package/src/shared/chargebee.js +26 -0
  275. package/src/shared/clickhouse.js +38 -0
  276. package/src/shared/confidence.js +28 -0
  277. package/src/shared/databricks.js +33 -0
  278. package/src/shared/dbt-semantic-layer.js +32 -0
  279. package/src/shared/definitions.js +140 -0
  280. package/src/shared/figma.js +21 -0
  281. package/src/shared/firebase-cloud-messaging.js +45 -0
  282. package/src/shared/gemini-enterprise.js +33 -0
  283. package/src/shared/gong.js +33 -0
  284. package/src/shared/google-ads-search.js +31 -0
  285. package/src/shared/google-ads.js +28 -0
  286. package/src/shared/google-maps-platform.js +28 -0
  287. package/src/shared/google.js +133 -0
  288. package/src/shared/granola.js +25 -0
  289. package/src/shared/hex.js +28 -0
  290. package/src/shared/inngest.js +35 -0
  291. package/src/shared/lightspeed.js +75 -0
  292. package/src/shared/linkedin.js +27 -0
  293. package/src/shared/logo-dev.js +21 -0
  294. package/src/shared/mapbox.js +38 -0
  295. package/src/shared/mcp.js +92 -0
  296. package/src/shared/microsoft-fabric.js +47 -0
  297. package/src/shared/microsoft.js +231 -0
  298. package/src/shared/miro.js +27 -0
  299. package/src/shared/oura.js +23 -0
  300. package/src/shared/posthog.js +33 -0
  301. package/src/shared/prestashop.js +23 -0
  302. package/src/shared/salesforce.js +36 -0
  303. package/src/shared/semrush.js +24 -0
  304. package/src/shared/shopify.js +51 -0
  305. package/src/shared/siteUrl.js +12 -0
  306. package/src/shared/slack.js +88 -0
  307. package/src/shared/snowflake.js +55 -0
  308. package/src/shared/tiktok.js +22 -0
  309. package/src/shared/tokens.js +747 -0
  310. package/src/shared/twilio.js +41 -0
  311. package/src/shared/twitch.js +49 -0
  312. package/src/shared/wave.js +52 -0
  313. package/src/shared/wix.js +40 -0
  314. package/src/shared/wiz.js +41 -0
  315. package/src/shared/wordpress-com.js +30 -0
  316. package/src/shared/wordpress.js +69 -0
  317. package/src/shared/workday.js +50 -0
  318. package/src/shared/x-twitter.js +19 -0
  319. package/src/shared/xero.js +46 -0
  320. package/src/shared/zoho-books.js +39 -0
  321. package/src/shared/zoho-crm.js +43 -0
  322. package/src/shared/zoho-regions.js +12 -0
  323. package/test/ai.test.js +136 -0
  324. package/test/airtable.test.js +125 -0
  325. package/test/algolia.test.js +207 -0
  326. package/test/amazon-redshift.test.js +272 -0
  327. package/test/amplitude.test.js +239 -0
  328. package/test/apify.test.js +93 -0
  329. package/test/apollo-io.test.js +125 -0
  330. package/test/asana.test.js +99 -0
  331. package/test/ashby.test.js +97 -0
  332. package/test/atlassian.test.js +249 -0
  333. package/test/attention.test.js +79 -0
  334. package/test/aws.test.js +405 -0
  335. package/test/brevo.test.js +71 -0
  336. package/test/calendly.test.js +136 -0
  337. package/test/canva.test.js +258 -0
  338. package/test/chargebee.test.js +195 -0
  339. package/test/clickhouse.test.js +278 -0
  340. package/test/confidence.test.js +205 -0
  341. package/test/databricks.test.js +253 -0
  342. package/test/dbt-semantic-layer.test.js +221 -0
  343. package/test/designMcp.test.js +336 -0
  344. package/test/elevenlabs.test.js +52 -0
  345. package/test/firebase-cloud-messaging.test.js +242 -0
  346. package/test/firecrawl.test.js +66 -0
  347. package/test/gemini-enterprise.test.js +218 -0
  348. package/test/github-api.test.js +167 -0
  349. package/test/gitlab-api.test.js +160 -0
  350. package/test/gong.test.js +192 -0
  351. package/test/google-ads.test.js +350 -0
  352. package/test/google-maps-platform.test.js +191 -0
  353. package/test/google.test.js +710 -0
  354. package/test/granola.test.js +240 -0
  355. package/test/hex.test.js +253 -0
  356. package/test/heygen.test.js +121 -0
  357. package/test/hubspot.test.js +103 -0
  358. package/test/inngest.test.js +219 -0
  359. package/test/lightspeed.test.js +250 -0
  360. package/test/linear.test.js +146 -0
  361. package/test/linkedin.test.js +243 -0
  362. package/test/logo-dev.test.js +79 -0
  363. package/test/mailgun.test.js +107 -0
  364. package/test/mapbox.test.js +181 -0
  365. package/test/mcp.test.js +227 -0
  366. package/test/microsoft-fabric.test.js +258 -0
  367. package/test/microsoft.test.js +554 -0
  368. package/test/n8nOAuth.test.js +188 -0
  369. package/test/notionOAuth.test.js +183 -0
  370. package/test/oura.test.js +211 -0
  371. package/test/paddleCatalogue.test.js +51 -0
  372. package/test/paddlePermissions.test.js +101 -0
  373. package/test/perplexityComposition.test.js +39 -0
  374. package/test/pipedriveOAuth.test.js +140 -0
  375. package/test/posthog.test.js +200 -0
  376. package/test/prestashop.test.js +207 -0
  377. package/test/resend.test.js +163 -0
  378. package/test/salesforce.test.js +276 -0
  379. package/test/semrush.test.js +479 -0
  380. package/test/sentry.test.js +35 -0
  381. package/test/shopify.test.js +247 -0
  382. package/test/slack.test.js +320 -0
  383. package/test/snowflake.test.js +391 -0
  384. package/test/tally.test.js +75 -0
  385. package/test/telegram.test.js +58 -0
  386. package/test/tiktok.test.js +243 -0
  387. package/test/tokens.test.js +1079 -0
  388. package/test/twilio.test.js +221 -0
  389. package/test/twitch.test.js +573 -0
  390. package/test/wave.test.js +678 -0
  391. package/test/wix.test.js +1099 -0
  392. package/test/wiz.test.js +185 -0
  393. package/test/wordpress-com.test.js +469 -0
  394. package/test/wordpress.test.js +660 -0
  395. package/test/workday.test.js +314 -0
  396. package/test/x-twitter.test.js +256 -0
  397. package/test/xero.test.js +700 -0
  398. package/test/zoho-books.test.js +253 -0
  399. package/test/zoho-crm.test.js +223 -0
@@ -0,0 +1,41 @@
1
+ import { createSchema } from "json-rest-schema";
2
+ import { secretReference } from "@jskit-ai/connectors-core/shared/configuration";
3
+
4
+ const twilioDefinition = Object.freeze({
5
+ id: "twilio", name: "Twilio", description: "Send SMS, initiate calls and read delivery/call status for the selected account and region.",
6
+ accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
7
+ apiKeyReferenceLabel: "API key secret reference",
8
+ settingsSchema: createSchema({
9
+ authTokenRef: { ...secretReference, required: false },
10
+ region: { type: "string", enum: ["us1", "ie1", "au1"], defaultTo: "us1" },
11
+ accountSid: { type: "string", required: true, minLength: 34, maxLength: 34,
12
+ validator: (value) => /^AC[0-9a-fA-F]{32}$/u.test(value) || "Enter an Account SID starting with AC followed by 32 hexadecimal characters." },
13
+ apiKeySid: { type: "string", required: true, minLength: 34, maxLength: 34,
14
+ validator: (value) => /^SK[0-9a-fA-F]{32}$/u.test(value) || "Enter an API Key SID starting with SK followed by 32 hexadecimal characters." }
15
+ }),
16
+ settingsFields: [
17
+ { name: "authTokenRef", label: "Callback Auth Token reference (optional)", placeholder: "env:TWILIO_AUTH_TOKEN", hint: "For inbound messages, voice and delivery callbacks. Copy the account Auth Token from Twilio Console into private Env; this is NOT the API key secret." },
18
+ { name: "region", label: "Region", hint: "Choose the region where this API key was created.", items: [
19
+ { value: "us1", title: "United States (US1)" }, { value: "ie1", title: "Ireland (IE1)" }, { value: "au1", title: "Australia (AU1)" }
20
+ ] },
21
+ { name: "accountSid", label: "Account SID", placeholder: "AC followed by 32 hexadecimal characters", hint: "Copy the SID of the account or subaccount whose calls this app may read." },
22
+ { name: "apiKeySid", label: "Standard API Key SID", placeholder: "SK followed by 32 hexadecimal characters", hint: "Copy the API Key SID for this account and region. Store its secret separately." }
23
+ ],
24
+ setup: {
25
+ url: "https://www.twilio.com/docs/iam/api-keys/keys-in-console",
26
+ steps: [
27
+ "Select the intended account or subaccount in Twilio Console and copy its Account SID from the account dashboard.",
28
+ "Open Settings, Account settings, API keys & auth tokens. Choose the region, then Create API key.",
29
+ "Name the key, select Standard, and click Next. Copy its API Key SID into this form and store its secret in Env.",
30
+ "Enter the secret's reference, select Got it! in Twilio, and finish key creation. Regional keys must match the region selected here.",
31
+ "Save the configuration. The application runtime verifies access by reading call records without placing calls or sending messages.",
32
+ "For sending, open Phone Numbers, Manage, Active numbers and select a number with SMS or Voice capability for your account. Alternatively, under Messaging, Services select your Messaging Service and configure its Sender Pool. The application chooses the authorized sender when sending.",
33
+ "Trial accounts can contact only permitted verified recipients. Complete the sender registration and geographic permissions required for your destination, and check the product is available in your chosen region. Separate regional keys are not interchangeable.",
34
+ "For incoming messages or calls, open the selected phone number's configuration. Set A message comes in or A call comes in to Webhook, enter the application's public HTTPS handler URL, choose HTTP POST, then save. For a Messaging Service, configure incoming-message handling in its Integration section.",
35
+ "For callbacks, reveal the account Auth Token on the Console account dashboard and put it in private Env as TWILIO_AUTH_TOKEN. Enter env:TWILIO_AUTH_TOKEN above. It is different from the Standard API key secret. Your app must verify X-Twilio-Signature using the exact public callback URL before processing any incoming data.",
36
+ "The generated app supplies StatusCallback for delivery or call completion and serves TwiML XML for inbound messages and call control. Changing your app's public domain requires updating these Twilio URLs. Callback signatures do not expire: the app must deduplicate events and prevent stale status updates.",
37
+ "Disconnect removes only local connection state. To revoke the sending credential, delete the API key in Twilio. Remove or change webhook URLs separately; they remain configured at Twilio."
38
+ ]
39
+ }
40
+ });
41
+ export { twilioDefinition };
@@ -0,0 +1,49 @@
1
+ const twitchDefinition = Object.freeze({
2
+ id: "twitch", name: "Twitch", description: "Connect Twitch accounts for stream discovery, chat, channel management, rewards, schedules and analytics.",
3
+ accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
4
+ scopes: [
5
+ { value: "user:read:email", label: "Read your email address", recommended: true },
6
+ { value: "channel:read:subscriptions", label: "Read your channel subscriptions" },
7
+ { value: "moderator:read:followers", label: "Read followers for your channels" },
8
+ { value: "user:write:chat", label: "Send chat messages" },
9
+ { value: "user:read:follows", label: "Read the channels you follow", recommended: true },
10
+ { value: "user:read:subscriptions", label: "Check your subscription status" },
11
+ { value: "channel:read:vips", label: "Read VIPs for your channels" },
12
+ { value: "channel:read:editors", label: "Read channel editors" },
13
+ { value: "channel:read:polls", label: "Read channel polls" },
14
+ { value: "channel:read:predictions", label: "Read channel predictions" },
15
+ { value: "channel:read:redemptions", label: "Read channel point rewards and redemptions" },
16
+ { value: "channel:read:hype_train", label: "Read current hype train status" },
17
+ { value: "analytics:read:extensions", label: "Read extension analytics" },
18
+ { value: "analytics:read:games", label: "Read game analytics" },
19
+ { value: "bits:read", label: "Read Bits information" },
20
+ { value: "moderator:read:chatters", label: "Read chatters in a channel" },
21
+ { value: "moderation:read", label: "Read moderation data" },
22
+ { value: "clips:edit", label: "Create clips" },
23
+ { value: "channel:manage:broadcast", label: "Manage channel broadcast settings" },
24
+ { value: "channel:manage:schedule", label: "Manage channel schedule" },
25
+ { value: "channel:manage:polls", label: "Create and manage channel polls" },
26
+ { value: "channel:manage:predictions", label: "Create and manage channel predictions" },
27
+ { value: "channel:manage:redemptions", label: "Manage channel point rewards and redemptions" }
28
+ ],
29
+ setup: {
30
+ url: "https://dev.twitch.tv/docs/authentication/register-app/",
31
+ steps: [
32
+ "Sign in to dev.twitch.tv/console with the account that will own the registration. Verify its email and enable two-factor authentication in Twitch Settings → Security and Privacy, then open Applications.",
33
+ "Choose Register Your Application. Enter a unique name, add the exact callback URL shown for this project under OAuth Redirect URLs, choose the category and Confidential client type, complete any human verification, then choose Create.",
34
+ "Use a separate Twitch registration for each independent application. An editor's client ID cannot automatically serve every app it creates.",
35
+ "Open Manage for that application. Copy Client ID into this registration. Choose New Secret and save its value in the private Env variable referenced by Client Secret. A new secret invalidates the previous one; coordinate rotation before reconnecting.",
36
+ "Keep the full callback URL in project Env and register the identical URL with Twitch. The generated app must serve that callback. After a domain change, update both places before connecting again.",
37
+ "Select only the permissions your app needs. Profile email requires Read your email address; followed-channel reads require Read the channels you follow.",
38
+ "Enable Send chat messages for outgoing chat; select the relevant Manage permission for broadcast settings, schedules, polls, predictions or rewards. Read permissions alone do not permit changes. Reconnect the account after adding permissions so the person can approve them.",
39
+ "Twitch controls eligibility: some subscriptions, polls, predictions, rewards and non-recurring schedules require an eligible broadcaster. Analytics report only on games or extensions owned by the consenting account; an empty result can be valid.",
40
+ "Rewards and redemptions remain tied to the Twitch application that created them. Replacing the Client ID does not transfer their management rights. Review recurring schedule changes carefully: updates or deletion can affect the whole series.",
41
+ "Choose a shared connection for this project's common broadcaster, or individual connections so each app user consents to their own account. Saving the registration does not connect an account or sign users into your app.",
42
+ "For live notifications, the generated app must maintain a Twitch EventSub WebSocket and subscribe using its welcome session ID. The app handles reconnection and duplicate events. This connector does not provide an editor-hosted event service or webhook transport.",
43
+ "Wire token validation at application startup and at least hourly for maintained connections, including idle ones. The runtime also validates before every data call. Saving configuration does not start this task.",
44
+ "Disconnect removes this app's stored connection. To revoke provider access, open Twitch Settings → Connections and disconnect the application there. A revoked grant needs consent again; keep Client Secrets and report download links out of public source and logs."
45
+ ]
46
+ }
47
+ });
48
+
49
+ export { twitchDefinition };
@@ -0,0 +1,52 @@
1
+ const waveDefinition = Object.freeze({
2
+ id: "wave", name: "Wave", description: "Connect project-owned Wave accounts for customers, products, invoices, estimates and accounting workflows.",
3
+ accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
4
+ oauthClientAuthenticationMethods: ["client_secret_post"],
5
+ scopes: [
6
+ { value: "user:read", label: "Read the connected user's profile", recommended: true },
7
+ { value: "business:read", label: "Read businesses", recommended: true },
8
+ { value: "customer:read", label: "Read customers", recommended: true },
9
+ { value: "invoice:read", label: "Read invoices", recommended: true },
10
+ { value: "user:*", label: "Full user access" },
11
+ { value: "business:write", label: "Edit businesses" },
12
+ { value: "business:*", label: "Full business access" },
13
+ { value: "account:read", label: "Read accounting accounts" },
14
+ { value: "account:write", label: "Edit accounting accounts" },
15
+ { value: "account:*", label: "Full accounting account access" },
16
+ { value: "customer:write", label: "Edit customers" },
17
+ { value: "customer:*", label: "Full customer access" },
18
+ { value: "estimate:read", label: "Read estimates" },
19
+ { value: "estimate:write", label: "Edit estimates" },
20
+ { value: "estimate:send", label: "Send estimates" },
21
+ { value: "estimate:*", label: "Full estimate access" },
22
+ { value: "invoice:write", label: "Edit invoices" },
23
+ { value: "invoice:send", label: "Send invoices" },
24
+ { value: "invoice:*", label: "Full invoice access" },
25
+ { value: "product:read", label: "Read products and services" },
26
+ { value: "product:write", label: "Edit products and services" },
27
+ { value: "product:*", label: "Full product and service access" },
28
+ { value: "sales_tax:read", label: "Read sales taxes" },
29
+ { value: "sales_tax:write", label: "Edit sales taxes" },
30
+ { value: "sales_tax:*", label: "Full sales tax access" },
31
+ { value: "transaction:write", label: "Create money transactions" },
32
+ { value: "transaction:*", label: "Full transaction access" },
33
+ { value: "vendor:read", label: "Read vendors" },
34
+ { value: "vendor:write", label: "Edit vendors" },
35
+ { value: "vendor:*", label: "Full vendor access" },
36
+ { value: "checkout:read", label: "Read checkouts" },
37
+ { value: "checkout:*", label: "Full checkout access" }
38
+ ],
39
+ setup: { url: "https://developer.waveapps.com/hc/en-us/articles/50682251860884-2-Create-an-application", steps: [
40
+ "Sign in to Wave, open Manage applications in the developer portal, and choose Create New Application. Enter your application name and its backend Redirect URI, then save the application.",
41
+ "Use this project's deployed application URL as the callback origin, followed by the callback route implemented by its backend. Register that exact URL in Wave; do not use the Vibe64 editor address.",
42
+ "Copy the issued Client ID into Client ID. Put the issued Client Secret in the project's Env, then enter its env:VARIABLE reference in Client secret reference. A personal access token is not a Client Secret.",
43
+ "Put the same registered callback URL in the project's Env and enter its env:VARIABLE reference in Callback URL reference. The backend must serve that route and use the same callback during token refresh.",
44
+ "Wave OAuth access requires an active Pro or Wave Advisor business subscription. Integrations for other Wave users require Wave approval.",
45
+ "Keep profile and business read access for connection verification and business selection. Enable read permissions for records you use; add write permissions only for editing, and invoice/estimate send only when the app sends those documents. Write does not imply read.",
46
+ "Product writes that reference accounts or taxes need those read permissions too. Transaction creation needs transaction write and read access to its referenced accounts, customers and taxes. Wildcard permissions include the corresponding reads and writes.",
47
+ "Save the configuration, then use the project's Connect action to authorize the intended Wave account. Select and authorize a business from the returned list inside your app; connecting a profile does not sign someone into your app or select the first business automatically.",
48
+ "Reconnect after changing permissions, the Client ID or callback URL. When moving to a custom domain, update Wave's registered redirect and the project's callback Env value together. Keep the project's private token store when moving hosting.",
49
+ "Disconnect currently deletes the local connection. Remove the grant separately in Wave if you also want provider-side revocation. Vendor access is read-only in this runtime: the reviewed public API exposes no vendor create/update mutations. Extra scope choices do not add missing operations."
50
+ ] }
51
+ });
52
+ export { waveDefinition };
@@ -0,0 +1,40 @@
1
+ import { createSchema } from "json-rest-schema";
2
+
3
+ const wixDefinition = Object.freeze({
4
+ id: "wix", name: "Wix", description: "Use project-owned Wix account and site API access.",
5
+ accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
6
+ settingsSchema: createSchema({ accountId: { type: "string", required: true, minLength: 36, maxLength: 36,
7
+ validator: (value) => /^[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/iu.test(value) || "Enter the Account ID from Wix's API Keys Manager." },
8
+ selectableSiteIds: { type: "string", maxLength: 4000, validator: value => {
9
+ const ids = value.split(",").map(id => id.trim());
10
+ return ids.length <= 100 && ids.every(id => /^[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/iu.test(id)) && new Set(ids.map(id => id.toLowerCase())).size === ids.length || "Enter up to 100 distinct Site IDs separated by commas.";
11
+ } },
12
+ siteId: { type: "string", minLength: 36, maxLength: 36, validator: value => /^[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/iu.test(value) || "Copy the Site ID from the Wix site dashboard URL." } }),
13
+ settingsFields: [{ name: "accountId", label: "Account ID", placeholder: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
14
+ hint: "Copy your account's ID from the API Keys Manager. A site ID is a different setting." },
15
+ { name: "selectableSiteIds", label: "Selectable Site IDs", placeholder: "Site ID, Site ID", hint: "Optional. Comma-separated sites the app may explicitly select. The app must still authorize each user's site access. Leave empty for a fixed-site connection." },
16
+ { name: "siteId", label: "Site ID", placeholder: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", hint: "Required for site operations. Copy the ID after /dashboard/ in the intended Wix site dashboard URL." }],
17
+ setup: {
18
+ url: "https://dev.wix.com/docs/go-headless/authentication/admin/generate-an-api-key",
19
+ steps: [
20
+ "Sign into the intended Wix account as an owner or co-owner and open its API Keys Manager in account settings.",
21
+ "Generate an API key, give it a name and grant Read Site Data. Complete the requested account verification and copy the token into your backend Env.",
22
+ "Copy the Account ID from the same manager. Enter it here with the API key reference; never paste the token into source.",
23
+ "Save the configuration, supply the referenced key in the project backend Env, then choose Check connection and Connect account. Account verification queries sites; an empty list is valid and does not prove permissions for site operations. No OAuth app or callback URL is needed.",
24
+ "To rotate a key, create a replacement in Wix with the required permissions, update the referenced backend Env value, then Check connection and Reconnect. Verify the intended site operation before retiring the old key in Wix. Disconnect removes local application access; it does not revoke the Wix key.",
25
+ "For a multi-site app, list the account sites, then enter only approved IDs in Selectable Site IDs. The app may pass one of these as siteId on a site operation. Your backend must authorize the user's site choice before invoking it. Omitted siteId uses the fixed Site ID; requests cannot select an unlisted site. Changing the allowed sites requires verification again.",
26
+ "For CRM access, enter the intended Site ID from its dashboard URL (after /dashboard/) and grant Read Contacts, plus Manage Contacts for contact creation and updates. Restrict the key to the sites the project needs. Changing the site requires verification again.",
27
+ "For Wix-hosted checkout, edit the project’s API key in Wix Account Settings > API Keys: grant Write Carts V2 (PII) to create carts and Read Carts V2 (PII) to retrieve checkout URLs. Publish the Wix site and configure its payment methods. Your app owns customer/cart authorization and redirects to Wix; a checkout URL does not prove payment.",
28
+ "For booking services, enable Wix Bookings on the selected site and grant Read Bookings - Public Data; edits also need Manage Bookings. Fetch the current service revision before changing it. Service creation also needs explicit online-booking, capacity and payment settings. Your app can query categories and staff with Read Bookings - Public Data. Retrieve service variants before presenting price or duration choices; keep the option IDs and participant selections in your app. Retrieve add-on groups too, show their prompts and enforce their selection limits. Pass the selected duration/add-ons when checking appointment availability and the selected participant choices/add-ons when creating the booking. For appointments, select the returned staff resourceId (not staff id) and duration; select a service category to make it visible on the Wix site. Create class/course sessions separately.",
29
+ "For appointment and class availability, grant the Time Slots read permission (BOOKINGS.AVAILABILITY_READ_TIME_SLOTS). Your app must pass the intended time zone, let the customer choose a slot and recheck it before creating a booking; viewing a slot does not reserve it. For classes, filter by party size and recheck the selected eventInfo.eventId before booking. For appointments, recheck the selected resource and location; availability uses BUSINESS/CUSTOM where booking creation uses OWNER_BUSINESS/OWNER_CUSTOM.",
30
+ "For booking creation, grant Manage Bookings. Grant Get Form Summary (forms:v4:form:get_form_summary) for form discovery. Your app reads the service form ID, retrieves its fields, uses their exact targets, recheck capacity and handle the returned booking status. Creation is not payment or confirmation. Participant notifications and SMS reminders are opt-in in this connector.",
31
+ "Read bookings with the corresponding Read Bookings permission, or Manage Bookings for the administrative workflow. Query the exact booking to get its current revision and allowed actions before canceling. Cancellation requires Manage Bookings. Your app must authorize the action; choose participant notification explicitly. Waiving charges can cancel an eligible unpaid Wix order and is not a refund. For rescheduling, check the booking’s allowed actions and current revision, then select and recheck a new appointment slot or class event. Courses cannot be rescheduled. Booking policy overrides are not enabled. For a custom checkout, your app can explicitly confirm or decline with Manage Bookings; direct confirmation skips availability checks. With Wix eCommerce checkout, let Wix manage confirmation. Your app must verify payment status on its backend.",
32
+ "For CMS collection browsing, grant Manage Data Collections on the intended site. Your app lists collections and reads their field metadata; grant Read Data Items to browse collection content too. These browse operations do not change the schema or content. For content editing, add the permission identified as WIX_DATA.PATCH in Wix’s Patch Data Item documentation to the API key permissions. The app reads the item then explicitly patches selected fields; use a condition for conflicting edits and check the outcome before retrying. Collection IDs can include an app prefix such as AppName/CollectionName. Keep administrative collection metadata behind app authorization.",
33
+ "For business-location selection, grant Read Locations. Query locations for the configured Site ID to obtain booking location IDs, addresses and time zones. The app queries only authorized locations and excludes archived locations by default; selecting a location does not reserve a booking. To create or update locations, add Manage Locations to the key permissions. Updates replace the full writable location: read it first, retain every field you need and send its exact revision. Location business hours are not a Wix Bookings schedule.",
34
+ "For products, install Wix Stores on the intended site and grant Read v3 catalog (PII) for version discovery. The app must check whether the site uses V1_CATALOG or V3_CATALOG before selecting product APIs; these catalogues are not interchangeable. Grant Read Products for V1 or Read products in v3 catalog for V3. V1 name, visibility and base-price edits also require Manage Products; prices use the site currency, and this endpoint has no revision guard. V3 product lists omit variants; fetch the individual product for those details. To rename or change visibility in V3, also grant Product write in v3 catalog and pass the current product revision. A revision conflict requires re-reading and reviewing the change; do not automatically retry. Hiding a product without options also hides its default variant.",
35
+ "For commerce order reads, grant Read Orders on the selected site. Your app must authorize each customer's order access. Order search omits PENDING and REJECTED unless requested explicitly, and never lists INITIALIZED orders; retrieve those by known order ID. Use orderFulfillments.list with the authorized order ID to read shipped quantities and tracking details; an empty list means no recorded fulfillments. To create shipments or update tracking, grant Manage Orders. Select explicit order line-item quantities; creation requires an APPROVED order. Wix may send shipping emails according to site settings. Inspect existing fulfillments before repeating any uncertain write. Fulfillment handling status is distinct from order payment status. Reading an order does not collect payment.",
36
+ "This account credential is for backend administrative operations. It does not connect each app user's Wix account or implement application login."
37
+ ]
38
+ }
39
+ });
40
+ export { wixDefinition };
@@ -0,0 +1,41 @@
1
+ import { createSchema } from "json-rest-schema";
2
+
3
+ const wizDefinition = Object.freeze({
4
+ id: "wiz", name: "Wiz", description: "Scan project source with your Wiz security policies.",
5
+ accountModes: ["shared"], authenticationMethods: ["oauth2"], scopes: [],
6
+ oauthGrantTypes: ["client_credentials"], oauthClientAuthenticationMethods: ["client_secret_post"],
7
+ validateClientId: (value) => !/[\s\p{Cc}]/u.test(value) || "Use the Wiz service-account Client ID without whitespace or control characters.",
8
+ authenticationLabels: { oauth2: "Wiz service account" },
9
+ authenticationHint: "A source scanner uses your workspace's service account. It does not sign app users in. The installed Wiz CLI performs authentication when a scan runs.",
10
+ settingsSchema: createSchema({
11
+ tokenUrl: { type: "string", enum: ["https://auth.app.wiz.io/oauth/token", "https://auth.wiz.io/oauth/token"],
12
+ defaultTo: "https://auth.app.wiz.io/oauth/token" },
13
+ policies: { type: "string", maxLength: 4096, noTrim: true,
14
+ validator: (value) => (value.split(",").length <= 50 && value.split(",").every((item) => item.trim().length > 0 && item.trim().length <= 200) && !/\p{Cc}/u.test(value)) ||
15
+ "Use up to 50 comma-separated policy names, without empty names or control characters." },
16
+ byPolicyHits: { type: "string", enum: ["BLOCK", "AUDIT", "DISABLED"], defaultTo: "BLOCK" }
17
+ }),
18
+ settingsFields: [
19
+ { name: "tokenUrl", label: "Token URL", items: [
20
+ { value: "https://auth.app.wiz.io/oauth/token", title: "Cognito (auth.app.wiz.io)" },
21
+ { value: "https://auth.wiz.io/oauth/token", title: "Auth0 (auth.wiz.io)" }
22
+ ], hint: "The current Wiz v1 runner supports Cognito. Auth0 configuration can be saved, but requires a verified compatible runner before scanning." },
23
+ { name: "policies", label: "CI/CD scan policies", placeholder: "Default vulnerabilities policy, Default IaC policy",
24
+ hint: "Optional comma-separated policy names. Leave blank to use your Wiz tenant's defaults." },
25
+ { name: "byPolicyHits", label: "Filter findings by policy hits", items: [
26
+ { value: "BLOCK", title: "Blocking policy hits (BLOCK)" },
27
+ { value: "AUDIT", title: "Blocking or audit policy hits (AUDIT)" },
28
+ { value: "DISABLED", title: "All findings (DISABLED)" }
29
+ ], hint: "Filtering reported findings does not disable Wiz's policy verdict." }
30
+ ],
31
+ setup: { url: "https://marketplace.visualstudio.com/items?itemName=WizCloud.wiz-task", steps: [
32
+ "Ask your Wiz administrator for a service account or deployment scoped to the projects you intend to scan, with create:security_scans permission.",
33
+ "Copy its Client ID and store its Client Secret in Env. Enter the secret reference, not the secret itself.",
34
+ "Confirm the tenant's authentication endpoint. The current runtime supports the Cognito endpoint; Auth0 execution is not implemented.",
35
+ "Optionally enter existing CI/CD scan policy names and choose which policy hits to report. Missing policies are scan failures.",
36
+ "Install an approved Wiz v1 CLI on the scan runner. A host-authorised source directory is scanned only when the source.scan operation is invoked.",
37
+ "Workspace access, scan scheduling and security-result presentation are host responsibilities. Saving this configuration does not automatically scan all projects."
38
+ ] }
39
+ });
40
+
41
+ export { wizDefinition };
@@ -0,0 +1,30 @@
1
+ const wordpressComDefinition = Object.freeze({
2
+ id: "wordpress-com", name: "WordPress.com", description: "Connect a WordPress.com account to read its profile/sites and manage posts, pages and media.",
3
+ accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
4
+ scopes: [
5
+ { value: "users", label: "View user information (required for verification)", recommended: true },
6
+ { value: "sites", label: "View site information and options", recommended: true },
7
+ { value: "posts", label: "View and manage posts", recommended: true },
8
+ { value: "media", label: "Manage media assets" },
9
+ { value: "comments", label: "View and manage comments" },
10
+ { value: "stats", label: "View site statistics" },
11
+ { value: "taxonomy", label: "Manage taxonomy terms" },
12
+ { value: "batch", label: "Batch API requests" }
13
+ ],
14
+ setup: {
15
+ url: "https://developer.wordpress.com/docs/api/oauth2/",
16
+ steps: [
17
+ "Sign into WordPress.com Developer Resources, open My Apps and choose Create New Application.",
18
+ "Enter the application name, description and exact backend Redirect URL, then create it. Copy its Client ID here and store the Client Secret and callback URL in the referenced Env variables.",
19
+ "Keep users permission for authenticated verification. Sites enables site listing; posts enables reading, drafting and publishing posts or pages. Your application must authorize each write.",
20
+ "Save configuration, then start consent through the runtime. The provider's selected site and granted scopes control access; no global all-sites scope is requested.",
21
+ "Select media and grant consent to upload or manage library assets. The site still enforces file types, storage and account permissions. Uploads can return per-file errors; the app must inspect them. Media deletion is permanent.",
22
+ "Select comments for replies and moderation. Site rules may publish a new reply immediately. Editing requires an explicit moderation status; restoring a comment can make it public again. Your app must restrict moderator actions.",
23
+ "Select stats for site reports and taxonomy to manage categories/tags. Reconnect after adding permissions. Site roles still apply; deleting or renaming a term can affect existing content. Your application owns its report and taxonomy screens.",
24
+ "Batch combines selected reads from one site; select batch and each resource permission. A successful batch can contain individual permission errors. It does not group writes into a transaction.",
25
+ "New content defaults to draft with publicizing off. Publishing, deletion and restoration are explicit app actions; deleting an already-trashed post can permanently remove it, and restoring can publish it again.",
26
+ "This connects provider data. It does not create an application login or use self-hosted WordPress Application Passwords."
27
+ ]
28
+ }
29
+ });
30
+ export { wordpressComDefinition };
@@ -0,0 +1,69 @@
1
+ import { createSchema } from "json-rest-schema";
2
+ import { httpsSiteUrlField as siteUrl } from "./siteUrl.js";
3
+ const siteHint = "Use the site address before /wp-json, keeping any installation subdirectory. The runtime sends credentials only to this configured origin.";
4
+
5
+ const woocommerceDefinition = Object.freeze({
6
+ id: "woocommerce", name: "WooCommerce", description: "Manage your WooCommerce catalogue, orders, customers, discounts and refunds, and read store reports.",
7
+ accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
8
+ apiKeyReferenceLabel: "Consumer secret reference",
9
+ apiKeyReferenceHint: "Store the consumer secret in Env. Use Read for lookups or Read/Write for changes; the key's WordPress user must also have permission for the requested operation.",
10
+ settingsSchema: createSchema({
11
+ siteUrl,
12
+ consumerKey: { type: "string", required: true, minLength: 4, maxLength: 256,
13
+ validator: (value) => /^ck_[a-z0-9]+$/iu.test(value) || "Enter the WooCommerce consumer key beginning ck_." }
14
+ }),
15
+ settingsFields: [
16
+ { name: "siteUrl", label: "Store URL", placeholder: "https://shop.example.com", hint: siteHint },
17
+ { name: "consumerKey", label: "Consumer key", placeholder: "ck_...", hint: "The key identifier from WooCommerce. Store its matching consumer secret separately." }
18
+ ],
19
+ setup: {
20
+ url: "https://developer.woocommerce.com/docs/apis/rest-api/authentication/",
21
+ steps: [
22
+ "Open WooCommerce, Settings, Advanced, REST API in the store dashboard. Choose Add key.",
23
+ "Enter a description, choose the intended WordPress user and select Read for lookup only or Read/Write for product, inventory, customer, coupon or order changes. Choose Generate API key.",
24
+ "Copy the consumer key here. Store its one-time consumer secret in Env and enter the secret reference.",
25
+ "Use the store's final HTTPS address, including a subdirectory if present. WooCommerce REST v3 requires pretty permalinks.",
26
+ "Product prices and stock edits affect the store immediately. Choose draft when creating a product for review. Stock quantities replace the current value; they are not increments. Review concurrent stock changes in your app.",
27
+ "Creating an order creates a store record, not a payment or checkout. Your app must supply the intended customer, items and addresses, then inspect the returned order. Uncertain creation must be reconciled before retrying.",
28
+ "Order status changes can trigger store emails and stock actions. Marking completed does not collect payment; marking refunded does not issue a gateway refund. Your app must authorize and review the change.",
29
+ "Refund creation requires an explicit choice: return money through the payment gateway, or record a manual refund only. Choose whether to restock and select original order-line IDs and quantities. Review remaining refundable amounts; after an uncertain result, inspect refunds and gateway history before retrying.",
30
+ "Category changes affect store navigation immediately; category deletion is permanent but does not delete products. Reports require reporting permission on the selected WordPress user, even with a Read key. A successful product check does not prove report access.",
31
+ "Coupon creation and edits affect live checkout discounts. Your app must review amounts and restrictions before submitting; free shipping also requires a compatible store shipping method. Failed writes are not automatically retried.",
32
+ "Deletion requires an explicit trash/permanent choice. Customers and variations support only permanent deletion. Review customer content reassignment first; deleting an order does not refund payment.",
33
+ "For event notifications, open WooCommerce, Settings, Advanced, Webhooks, Add webhook. Choose the topic and your app receiver URL; store a separate signing secret in app Env. Activate only after the receiver verifies signatures. Pause/delete the store webhook to stop deliveries.",
34
+ "Save configuration. The application runtime verifies access by reading products; orders, customers and coupons still depend on the selected user's permissions. Your app must authorize each visitor's access; this administrator key does not sign customers in."
35
+ ]
36
+ }
37
+ });
38
+
39
+ const wordpressSelfHostedDefinition = Object.freeze({
40
+ id: "wordpress-self-hosted", name: "WordPress (self-hosted)", description: "Manage WordPress posts, pages, media and users with a site-owned account.",
41
+ accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
42
+ apiKeyReferenceLabel: "Application password reference",
43
+ apiKeyReferenceHint: "Use a WordPress Application Password for this user, stored in Env. The user's role controls access; this is separate from the user's login password.",
44
+ settingsSchema: createSchema({
45
+ siteUrl,
46
+ username: { type: "string", required: true, minLength: 1, maxLength: 60,
47
+ validator: (value) => !/[:\p{Cc}]/u.test(value) || "Enter a username without colons or control characters." }
48
+ }),
49
+ settingsFields: [
50
+ { name: "siteUrl", label: "Site URL", placeholder: "https://example.com", hint: siteHint },
51
+ { name: "username", label: "Username", placeholder: "editor", hint: "The WordPress login name that owns the Application Password." }
52
+ ],
53
+ setup: {
54
+ url: "https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/",
55
+ steps: [
56
+ "On the HTTPS WordPress site, open Users and edit the intended user's profile. Find Application Passwords.",
57
+ "Enter a distinct application name and choose Add New Application Password. Copy the password when it is shown.",
58
+ "Store the password in Env, then enter the site URL, username and password reference here.",
59
+ "Save configuration. The runtime verifies the authenticated user with users/me, then exposes post/page reads and explicit draft, publish, edit and trash operations. Public post access alone does not verify the account.",
60
+ "Choose a user whose site role permits the intended actions. Reading an account does not prove permission to edit pages, publish or delete content. Creation defaults to draft; publishing and editing already-published content are explicit app actions.",
61
+ "Media uploads need upload_files permission and follow the site's size/type limits. User creation, role changes and deletion require administrative capabilities; grant only what the application's intended features need. Shared app callers all act as this WordPress user.",
62
+ "Media and user deletion are permanent operations requiring explicit app-side authorization and confirmation. User deletion also requires a chosen replacement author. Saving this form performs none of those actions.",
63
+ "To rotate the password, create another named Application Password, replace its value in Env, then reconnect. Revoke the old password in the user's profile. Disconnecting here only removes this application's local connection.",
64
+ "If Application Passwords or REST routes are disabled by the host or a plugin, ask the site administrator to enable the intended access."
65
+ ]
66
+ }
67
+ });
68
+
69
+ export { woocommerceDefinition, wordpressSelfHostedDefinition };
@@ -0,0 +1,50 @@
1
+ import { createSchema } from "json-rest-schema";
2
+
3
+ const host = "(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.){1,3}myworkday\\.com";
4
+ const restPattern = new RegExp(`^https://(?<host>${host})(?<prefix>/ccx)?/api/(?:v1|staffing/v7)/(?<tenant>[A-Za-z0-9_-]{1,128})/?$`, "u");
5
+ const authorizationPattern = new RegExp(`^https://${host}/(?<tenant>[A-Za-z0-9_-]{1,128})/authorize$`, "u");
6
+ const workdayRestEndpoint = (value) => typeof value === "string" ? restPattern.exec(value)?.groups : undefined;
7
+ const endpointField = { type: "string", required: true, noTrim: true, maxLength: 512 };
8
+
9
+ const workdayDefinition = Object.freeze({
10
+ id: "workday", name: "Workday", description: "Read workers, organizations, time off and custom reports with each connected Workday user's permissions.",
11
+ accountModes: ["per-user"], authenticationMethods: ["oauth2"],
12
+ oauthClientAuthenticationMethods: ["client_secret_post", "client_secret_basic"],
13
+ settingsSchema: createSchema({
14
+ restApiEndpoint: { ...endpointField, validator: (value) => Boolean(workdayRestEndpoint(value)) ||
15
+ "Copy the HTTPS Workday REST API endpoint ending /api/v1/tenant or /api/staffing/v7/tenant, with its /ccx prefix if present." },
16
+ tokenEndpoint: { ...endpointField, validator: (value, settings) => {
17
+ const rest = workdayRestEndpoint(settings.restApiEndpoint);
18
+ return Boolean(rest && value === `https://${rest.host}/ccx/oauth2/${rest.tenant}/token`) ||
19
+ "Copy the token endpoint for the same REST API host and tenant, ending /ccx/oauth2/tenant/token.";
20
+ } },
21
+ authorizationEndpoint: { ...endpointField, validator: (value, settings) => {
22
+ const rest = workdayRestEndpoint(settings.restApiEndpoint);
23
+ return Boolean(rest && authorizationPattern.exec(value)?.groups.tenant === rest.tenant) ||
24
+ "Copy the HTTPS Workday authorization endpoint for the same tenant, ending /tenant/authorize. Its host may differ.";
25
+ } }
26
+ }),
27
+ settingsFields: [
28
+ { name: "restApiEndpoint", label: "Workday REST API Endpoint", placeholder: "https://wd5-services1.myworkday.com/ccx/api/v1/acme_corp",
29
+ hint: "Copy from View API Clients. Worker reads use Staffing v7 on this host and tenant." },
30
+ { name: "tokenEndpoint", label: "Token Endpoint", placeholder: "https://wd5-services1.myworkday.com/ccx/oauth2/acme_corp/token",
31
+ hint: "Copy the Token Endpoint from the same Workday tenant." },
32
+ { name: "authorizationEndpoint", label: "Authorization Endpoint", placeholder: "https://acme.wd5.myworkday.com/acme_corp/authorize",
33
+ hint: "Copy from View API Clients. The sign-in host usually differs from the API host." }
34
+ ],
35
+ scopes: [],
36
+ permissionsHint: "Select the required functional areas in Workday: Staffing, Organizations and Roles, or Time Off and Leave. Each user's domain and report permissions still apply. Connecting Workday does not create your app's login.",
37
+ setup: { url: "https://docs.lovable.dev/integrations/workday", steps: [
38
+ "In your Workday tenant, an administrator opens Register API Client and chooses Authorization Code Grant and Bearer access tokens.",
39
+ "Register this confidential client without PKCE so Workday issues a Client Secret. Enter your application's exact backend callback URL.",
40
+ "Select Staffing in Scope (Functional Areas). Grant intended users View access through the Report/Task permissions of the worker REST domains.",
41
+ "For organization browsing, also select Organizations and Roles. Your tenant administrator must grant the intended users View: Supervisory Organization; member and org-chart reads need Reports: Organization. A successful worker check does not prove these permissions.",
42
+ "For time-off balances and entries, select Time Off and Leave and grant the appropriate Self-Service or Worker Data: Time Off Report/Task permissions. Your app selects the worker and displays the returned units and status; this connection does not submit or approve leave.",
43
+ "For custom reports, select Tenant Non-Configurable and Include Workday Owned Scope on the API client, plus the functional areas needed by the report's data. The report owner enables the report as a web service and shares it with the intended users. In the report's related actions, open Web Services, View URLs, fill required prompts and copy the JSON URL. Your app uses its owner/name and prompt aliases on the same configured tenant; verify report access separately.",
44
+ "Save the Client ID and put the Client Secret in Env. Open View API Clients and copy the REST API, Token and Authorization endpoints into this form.",
45
+ "Keep the tenant's approved refresh-token lifetime. An expired or revoked grant requires the user to reconnect.",
46
+ "Each user connects their own Workday account inside your app. Every customer tenant needs its own registration and your app's callback. Disconnecting removes the app's saved grant; provider-side revocation is managed in Workday."
47
+ ] }
48
+ });
49
+
50
+ export { workdayDefinition, workdayRestEndpoint };
@@ -0,0 +1,19 @@
1
+ const xTwitterDefinition = Object.freeze({
2
+ id: "x-twitter", name: "X (Twitter)", description: "Read public X profiles, posts and recent search with an application's bearer token.",
3
+ accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
4
+ apiKeyReferenceLabel: "App-only bearer token reference",
5
+ verificationFields: [{ name: "username", required: true, label: "Verification username",
6
+ hint: "Enter a public X username without @. Connecting looks up this profile and can consume provider credits." }],
7
+ apiKeyReferenceHint: "Reference the app-only Bearer Token from X Developer Console. This token does not sign in an app user.",
8
+ setup: { url: "https://docs.x.com/x-api/getting-started/getting-access", steps: [
9
+ "Sign into console.x.com, complete developer onboarding and choose New App. Enter the application's name, description and use case.",
10
+ "Open the app's credentials and copy its app-only Bearer Token into backend Env. Save only that Env reference here, without the Bearer prefix.",
11
+ "Check API access, available credits and spending limits in Developer Console. Verification and public-data reads can consume provider credits.",
12
+ "Save configuration, then call connectApiKey with verificationInput containing a real public username, without @. Verification looks up that profile.",
13
+ "Recent search covers the last seven days. Use provider query operators for filters and request more pages explicitly; each read can consume credits. Your app owns attribution, display and query access.",
14
+ "Disconnect removes the local connection only. Replace the token in backend Env and verify again to rotate it; invalidating the provider token affects every app using that token.",
15
+ "This flow has no OAuth callback or per-user consent. It cannot post, read direct messages or provide application login."
16
+ ] }
17
+ });
18
+
19
+ export { xTwitterDefinition };
@@ -0,0 +1,46 @@
1
+ const xeroDefinition = Object.freeze({
2
+ id: "xero", name: "Xero", description: "Manage contacts and invoices, record payments and read financial reports in connected organisations.",
3
+ accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
4
+ oauthClientAuthenticationMethods: ["client_secret_basic"],
5
+ scopes: [
6
+ { value: "offline_access", label: "Keep access when the user is away", recommended: true },
7
+ { value: "accounting.settings.read", label: "Read organisation settings", recommended: true },
8
+ { value: "accounting.contacts.read", label: "Read contacts", recommended: true },
9
+ { value: "accounting.invoices.read", label: "Read invoices and bills", recommended: true },
10
+ { value: "accounting.settings", label: "Read and manage organisation settings" },
11
+ { value: "accounting.contacts", label: "Read and manage contacts" },
12
+ { value: "accounting.invoices", label: "Read and manage invoices and bills" },
13
+ { value: "accounting.payments", label: "Read and manage payments" },
14
+ { value: "accounting.payments.read", label: "Read payments" },
15
+ { value: "accounting.banktransactions", label: "Read and manage bank transactions" },
16
+ { value: "accounting.banktransactions.read", label: "Read bank transactions" },
17
+ { value: "accounting.manualjournals", label: "Read and manage manual journals" },
18
+ { value: "accounting.manualjournals.read", label: "Read manual journals" },
19
+ { value: "accounting.attachments", label: "Read and manage attachments" },
20
+ { value: "accounting.attachments.read", label: "Read attachments" },
21
+ { value: "accounting.reports.profitandloss.read", label: "Read profit and loss reports" },
22
+ { value: "accounting.reports.balancesheet.read", label: "Read balance sheet reports" },
23
+ { value: "accounting.reports.aged.read", label: "Read aged receivables and payables reports" },
24
+ { value: "accounting.reports.executivesummary.read", label: "Read executive summary reports" },
25
+ { value: "accounting.reports.banksummary.read", label: "Read bank summary reports" },
26
+ { value: "accounting.reports.trialbalance.read", label: "Read trial balance reports" },
27
+ { value: "accounting.reports.budgetsummary.read", label: "Read budget summary reports" },
28
+ { value: "accounting.reports.taxreports.read", label: "Read GST and BAS reports" },
29
+ { value: "accounting.budgets.read", label: "Read budgets" }
30
+ ],
31
+ setup: { url: "https://developer.xero.com/documentation/guides/oauth2/auth-flow/", steps: [
32
+ "Open My Apps in the Xero developer portal and create an app using the Auth Code grant type. Copy its Client ID and generate a Client Secret.",
33
+ "Register the exact backend callback URL. Xero requires HTTPS except http://localhost for local testing; http://127.0.0.1 is not accepted.",
34
+ "Store the secret and callback in Env. This provider uses HTTP Basic client authentication; the saved registration selects it automatically.",
35
+ "After consent, list connected organisations and let the application choose an authorised organisation. A connection is not application login.",
36
+ "Default permissions allow organisation, contact and invoice reads. Select Read and manage contacts for deliberate contact creation or changes. Select Read payments for payment pages. For financial reports, select the matching Read profit and loss, balance sheet, aged receivables and payables, executive summary, bank summary or trial balance permission, then reconnect to approve the added permissions. Aged reports require a contact ID; your app must supply reporting dates. Read settings supplies the organisation’s currencies, tax rates and tracking categories as well as accounts. Your Xero user also needs access to those reports. Other permission choices do not add operations.",
37
+ "To inspect bank transactions or manual journals, select Read bank transactions or Read manual journals and reconnect. Your app selects the connected organisation and requests numbered pages, then retrieves an individual record for its full lines. These read permissions do not authorize changes or bank reconciliation.",
38
+ "To create or change manual journals, select Read and manage manual journals and reconnect. Choose account codes from Accounts, supply balanced debit (positive) and credit (negative) lines, narration, date and tax basis. New journals default to DRAFT; posting must be an explicit app action. Xero validates balance, tax and allowed status changes. Keep a stable request key and inspect the journal after an uncertain result before retrying.",
39
+ "To create or edit ordinary SPEND/RECEIVE bank transactions, select Read and manage bank transactions and reconnect. Choose a bank account from Accounts and a contact, then supply date, tax basis and complete lines. Currency comes from the bank account. Keep the exact request and stable request key. Transfers, prepayments, overpayments and automatic reconciliation are not supported by these write operations.",
40
+ "For record attachments, select Read attachments to list/download, or Read and manage attachments to upload/replace, then reconnect. Choose a contact, invoice, bank transaction or manual journal in the connected organisation. Files are limited to 3 MiB by this adapter; replacement uses the existing filename. Keep the request key and inspect the attachment list after an uncertain upload before retrying. Saving configuration never uploads files.",
41
+ "For budget lists and account budget lines, select Read budgets. For the budget summary report, separately select Read budget summary reports. Reconnect after adding either permission. Choose a budget returned by the connected organisation; summary periods use 1 for months, 3 for quarters or 12 for years. These operations read existing budgets and do not create or edit them.",
42
+ "To record an invoice payment, select Read and manage payments and reconnect. Your app must choose the invoice, a suitable bank or payment-enabled account, date and amount, and retain the exact request with its idempotency key. This records a payment in Xero; it does not charge a customer. Inspect payment history after an uncertain result before retrying.",
43
+ "To create or update sales invoices and supplier bills, select Read and manage invoices and bills and reconnect. Your app supplies contact, dates, currency, tax basis and line items; creation defaults to Draft. Review authorisation, voiding or deletion explicitly. Keep the exact request and idempotency key, inspect uncertain results before retrying, and preserve existing line IDs when replacing lines. Saving this form writes no accounting records."
44
+ ] }
45
+ });
46
+ export { xeroDefinition };
@@ -0,0 +1,39 @@
1
+ import { createSchema } from "json-rest-schema";
2
+ import { zohoRegions } from "./zoho-regions.js";
3
+
4
+ const zohoBooksIdentifier = (value) => typeof value === "string" && /^[1-9][0-9]{0,29}$/u.test(value);
5
+ const zohoBooksOrganizationField = { type: "string", noTrim: true,
6
+ validator: (value) => zohoBooksIdentifier(value) || "Use an organisation ID containing digits only." };
7
+
8
+ const zohoBooksDefinition = Object.freeze({
9
+ id: "zoho-books", name: "Zoho Books", description: "Discover accessible organisations and read pages of contacts and invoices.",
10
+ accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
11
+ oauthClientAuthenticationMethods: ["client_secret_post"],
12
+ scopes: [
13
+ { value: "ZohoBooks.settings.READ", label: "Read organisations and settings", recommended: true },
14
+ { value: "ZohoBooks.contacts.READ", label: "Read contacts", recommended: true },
15
+ { value: "ZohoBooks.invoices.READ", label: "Read invoices", recommended: true },
16
+ ...[
17
+ ["contacts", "contacts"], ["invoices", "invoices"], ["customerpayments", "customer payments"],
18
+ ["creditnotes", "credit notes"], ["estimates", "estimates"], ["salesorders", "sales orders"],
19
+ ["purchaseorders", "purchase orders"], ["bills", "bills"], ["expenses", "expenses"], ["projects", "projects"]
20
+ ].map(([name, label]) => ({ value: `ZohoBooks.${name}.ALL`, label: `Full access to ${label}` }))
21
+ ],
22
+ settingsSchema: createSchema({
23
+ region: { type: "string", enum: zohoRegions.map(({ value }) => value), defaultTo: "eu" },
24
+ organizationId: zohoBooksOrganizationField
25
+ }),
26
+ settingsFields: [
27
+ { name: "region", label: "Data center", hint: "Choose the data center containing the Books account. Canada uses accounts.zohocloud.ca for OAuth.", items: zohoRegions.map(({ value, title }) => ({ value, title })) },
28
+ { name: "organizationId", label: "Organization ID (optional)", hint: "Set one organisation for this integration, or leave empty and let the app choose from the connected account's organisations." }
29
+ ],
30
+ setup: { url: "https://www.zoho.com/books/api/v3/oauth/", steps: [
31
+ "Open the Zoho API Console, add a Server-based Application, and enter its name, homepage and exact backend redirect URI.",
32
+ "Copy the Client ID. Store the selected data center's Client Secret and callback URL in the referenced Env variables. Enable additional regions in the client's Multi DC settings if needed.",
33
+ "Optionally copy an Organization ID from Zoho Books: open the organisation-name menu, then Manage Organizations. Leaving it empty allows discovery after consent; the runtime never chooses the first organisation automatically.",
34
+ "Save configuration and start consent through your application's runtime. Read organisations and settings is needed to verify the connection. Contacts and invoice reads are selected initially.",
35
+ "A shared connection shares its accounting access. Choose each app user's own account when every user must connect separately. Additional scope choices do not add write operations."
36
+ ] }
37
+ });
38
+
39
+ export { zohoBooksDefinition, zohoBooksIdentifier, zohoBooksOrganizationField };
@@ -0,0 +1,43 @@
1
+ import { createSchema } from "json-rest-schema";
2
+ import { zohoRegions } from "./zoho-regions.js";
3
+
4
+ const zohoCrmRegions = Object.freeze(zohoRegions.filter(({ value }) => value !== "sa"));
5
+
6
+ const zohoCrmDefinition = Object.freeze({
7
+ id: "zoho-crm", name: "Zoho CRM", description: "Read the connected CRM user and pages of leads, contacts, accounts and deals.",
8
+ accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
9
+ oauthClientAuthenticationMethods: ["client_secret_post"],
10
+ scopes: [
11
+ { value: "ZohoCRM.users.READ", label: "Read the connected CRM user", recommended: true },
12
+ { value: "ZohoCRM.modules.leads.READ", label: "Read leads", recommended: true },
13
+ { value: "ZohoCRM.modules.contacts.READ", label: "Read contacts", recommended: true },
14
+ { value: "ZohoCRM.modules.accounts.READ", label: "Read accounts", recommended: true },
15
+ { value: "ZohoCRM.modules.deals.READ", label: "Read deals", recommended: true },
16
+ { value: "ZohoCRM.modules.READ", label: "Read all CRM modules" },
17
+ { value: "ZohoCRM.users.ALL", label: "Full CRM user access" },
18
+ { value: "ZohoCRM.modules.leads.ALL", label: "Full lead access" },
19
+ { value: "ZohoCRM.modules.contacts.ALL", label: "Full contact access" },
20
+ { value: "ZohoCRM.modules.accounts.ALL", label: "Full account access" },
21
+ { value: "ZohoCRM.modules.deals.ALL", label: "Full deal access" },
22
+ { value: "ZohoCRM.modules.ALL", label: "Full access to all CRM modules" }
23
+ ],
24
+ settingsSchema: createSchema({
25
+ region: { type: "string", enum: zohoCrmRegions.map(({ value }) => value), defaultTo: "us" },
26
+ environment: { type: "string", enum: ["production", "sandbox", "developer"], defaultTo: "production" }
27
+ }),
28
+ settingsFields: [
29
+ { name: "region", label: "Data center", hint: "Choose the data center containing your CRM account. Canada uses accounts.zohocloud.ca for OAuth.", items: zohoCrmRegions.map(({ value, title }) => ({ value, title })) },
30
+ { name: "environment", label: "CRM environment", hint: "Choose the same environment and organisation during Zoho consent. Tokens cannot be moved between environments.", items: [
31
+ { value: "production", title: "Production" }, { value: "sandbox", title: "Sandbox" }, { value: "developer", title: "Developer" }
32
+ ] }
33
+ ],
34
+ setup: { url: "https://www.zoho.com/crm/developer/docs/api/v8/register-client.html", steps: [
35
+ "Open the Zoho API Console, choose Server-based Applications, then Create Now. Enter a client name, homepage and the exact backend redirect URI.",
36
+ "Copy the Client ID. Store the Client Secret and callback URL in the referenced Env variables. Use the secret assigned to the selected data center.",
37
+ "For users in other data centers, enable Multi DC in the client's Settings and configure each required region before connecting.",
38
+ "Save configuration, then start consent through your application's runtime. Choose the intended CRM organisation and environment; verification reads the current CRM user.",
39
+ "This adapter only reads the current user, leads, contacts, accounts and deals. Full-access scope choices do not add create, update or delete operations. Read permissions are selected initially. Sharing one connection shares its CRM access; each app user's own account requires a separate authorised connection."
40
+ ] }
41
+ });
42
+
43
+ export { zohoCrmDefinition, zohoCrmRegions };
@@ -0,0 +1,12 @@
1
+ const zohoRegions = Object.freeze([
2
+ { value: "us", title: "United States (.com)", accounts: "https://accounts.zoho.com", suffix: "com" },
3
+ { value: "eu", title: "Europe (.eu)", accounts: "https://accounts.zoho.eu", suffix: "eu" },
4
+ { value: "in", title: "India (.in)", accounts: "https://accounts.zoho.in", suffix: "in" },
5
+ { value: "au", title: "Australia (.com.au)", accounts: "https://accounts.zoho.com.au", suffix: "com.au" },
6
+ { value: "jp", title: "Japan (.jp)", accounts: "https://accounts.zoho.jp", suffix: "jp" },
7
+ { value: "ca", title: "Canada (.ca)", accounts: "https://accounts.zohocloud.ca", suffix: "ca" },
8
+ { value: "cn", title: "China (.com.cn)", accounts: "https://accounts.zoho.com.cn", suffix: "com.cn" },
9
+ { value: "sa", title: "Saudi Arabia (.sa)", accounts: "https://accounts.zoho.sa", suffix: "sa" }
10
+ ]);
11
+
12
+ export { zohoRegions };