@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
package/docs/wave.md ADDED
@@ -0,0 +1,440 @@
1
+ # Wave
2
+
3
+ `waveProvider` from `@jskit-ai/connectors-catalog/server/wave` provides OAuth
4
+ consent, profile verification, business/accounting reads, customer/product and
5
+ account/tax maintenance, invoice/estimate workflows and money-transaction creation. An ordinary CLI or backend composes the shared connection service
6
+ with encrypted file storage. Vibe64 edits the same portable JSON; saving it
7
+ does not connect an account.
8
+
9
+ ## Provider registration
10
+
11
+ 1. Sign in to Wave, open the [Create an application guide](https://developer.waveapps.com/hc/en-us/articles/50682251860884-2-Create-an-application),
12
+ and follow **Manage applications**. Applications belong to that Wave account;
13
+ separate applications can represent different environments.
14
+ 2. Choose **Create New Application**. Enter your application name and the
15
+ redirect URI your backend actually serves, then create it. These fields and
16
+ the issued Client ID/Secret are described in Wave's
17
+ [application setup instructions](https://developer.waveapps.com/hc/en-us/articles/51070420388628-Webhooks-Setup-Guide).
18
+ 3. Copy **Client ID** into the configuration below. Put **Client Secret** in
19
+ `WAVE_CLIENT_SECRET`; put the callback URL in `WAVE_CALLBACK_URL`. Keep both
20
+ environment values outside source. The form takes references to these values.
21
+ 4. Use an exact registered HTTPS callback for deployment. For a local operator
22
+ CLI, register and serve a fixed loopback callback such as
23
+ `http://localhost:8080/connections/wave/callback`. Wave's matching rules check
24
+ host/port and permit subpaths; this runtime deliberately requires its exact
25
+ configured callback. Changing the callback requires new consent.
26
+ 5. Start consent from your backend/CLI, sign in as the intended Wave user, and
27
+ review the requested permissions. Complete the callback in the same
28
+ authenticated application context. OAuth business access requires an active
29
+ **Pro or Wave Advisor** subscription. A later subscription loss can make
30
+ refresh return 403. See the [OAuth guide](https://developer.waveapps.com/hc/en-us/articles/360019493652-OAuth-Guide).
31
+
32
+ Wave's [authentication guide](https://developer.waveapps.com/hc/en-us/articles/50682277703188-3-Authentication)
33
+ also describes **Create token** under an application's full-access tokens.
34
+ Those tokens are for personal/development use and can reach all businesses in
35
+ the account. They are not a substitute for customer OAuth. This adapter
36
+ implements OAuth only; full-access-token configuration remains a separate flow.
37
+ Do not paste such a token into the Client Secret field.
38
+
39
+ ## Portable configuration
40
+
41
+ ```json
42
+ {
43
+ "schemaVersion": 1,
44
+ "integrations": {
45
+ "wave": {
46
+ "provider": "wave",
47
+ "displayName": "Business accounts",
48
+ "accountMode": "per-user",
49
+ "scopes": ["user:read", "business:read", "customer:read", "invoice:read"],
50
+ "authentication": { "method": "oauth2", "registrationRef": "wave" }
51
+ }
52
+ },
53
+ "registrations": {
54
+ "wave": {
55
+ "source": "own",
56
+ "clientId": "replace-with-issued-client-id",
57
+ "clientSecretRef": "env:WAVE_CLIENT_SECRET",
58
+ "callbackUrlRef": "env:WAVE_CALLBACK_URL",
59
+ "tokenEndpointAuthMethod": "client_secret_post"
60
+ }
61
+ }
62
+ }
63
+ ```
64
+
65
+ The editor exposes all ten captured permission choices and the documented
66
+ granular alternatives, 32 choices in total. Four read permissions are initially
67
+ selected. Wave's [scope contract](https://developer.waveapps.com/hc/en-us/articles/360032818132-OAuth-Scopes)
68
+ treats read/write independently: `customer:write` does not authorize a read;
69
+ `customer:*` does. Broad permissions also include future operations. Selecting
70
+ extra permissions does not implement additional library operations.
71
+
72
+ Use `shared` for an intentionally shared connection with application membership
73
+ checks. Use `per-user` for individual grants, or `assistant` for access governed
74
+ by the host's assistant/workspace policy. The host derives stable
75
+ `applicationId` and `subjectId`; it must not trust these identifiers from a
76
+ browser request. A connected profile is data, not an application login.
77
+
78
+ ## Runtime operations
79
+
80
+ | Operation | Inputs | Returned data |
81
+ |---|---|---|
82
+ | `user.read` | None | Connected user ID, first/last names and email; verifies new consent. |
83
+ | `businesses.list` | Optional `page`, `pageSize` | Business IDs, names, personal flags and paging. |
84
+ | `customers.list` | Required `businessId`; optional paging | One business's customers ordered by name, with ID/name/email. |
85
+ | `invoices.list` | Required `businessId`; optional paging | ID, number, date, status and currency for invoice summaries, newest creation first. |
86
+ | `accounts.list` | Required `businessId`; optional paging | Chart-of-accounts IDs, types/subtypes, currency, archived flag and decimal balance. |
87
+ | `products.list` | Required `businessId`; optional paging | Names, prices, sold/bought flags and income/expense account IDs, sorted by name. |
88
+ | `salesTaxes.list` | Required `businessId`; optional paging | Tax IDs, names, abbreviation, decimal rate and compound/recoverable/archived flags. |
89
+ | `vendors.list` | Required `businessId`; optional paging | Vendor IDs, names, email and phone. |
90
+
91
+ Results retain the GraphQL `{ data: ... }` envelope. Requests use fixed queries
92
+ and typed variables at Wave's [GraphQL endpoint](https://developer.waveapps.com/hc/en-us/articles/50682329964564-4-Making-API-calls).
93
+ The [business](https://developer.waveapps.com/hc/en-us/articles/360032908111-Query-List-businesses),
94
+ [customer](https://developer.waveapps.com/hc/en-us/articles/360032908311-Query-List-and-sort-customers)
95
+ and [invoice](https://developer.waveapps.com/hc/en-us/articles/360038426192-Query-List-invoices)
96
+ examples establish the selected query fields.
97
+
98
+ This fragment defaults to page 1 and 20 records, limits requested page size to
99
+ 1–100, and requires positive GraphQL Int page numbers. These are library input
100
+ bounds, not a promised provider capacity. Wave's [pagination](https://developer.waveapps.com/hc/en-us/articles/360018856791-Pagination)
101
+ uses `currentPage`, `totalPages` and `totalCount`; the caller advances explicitly.
102
+ Empty pages and nullable edge nodes remain visible. Decimal prices, rates and
103
+ balances remain exact strings; this library never converts them to JavaScript
104
+ floating-point numbers. Applications choose their own decimal arithmetic library. The adapter rejects wrong
105
+ business IDs, inconsistent returned page numbers, excessive result counts and
106
+ malformed records. It does not crawl, calculate money or follow URLs in returned data. Sending
107
+ invoices and estimates requires a separate explicit operation.
108
+
109
+ Choose a business explicitly from `businesses.list` and authorize that choice
110
+ in the host before requesting records. A provider grant can cover more than one
111
+ business; the provider enforces its grant, while the application must enforce
112
+ its own business/workspace membership. No business defaults to the first entry.
113
+
114
+ The shared runtime handles state, code exchange, rotation and file locking.
115
+ Wave requires the original callback in refresh requests, so the grant records
116
+ it. Token responses must state granted scopes; a reduced grant stays reduced.
117
+ OAuth PKCE parameters are sent, but provider enforcement is not proven by local
118
+ fixtures. GraphQL errors, including partial-data responses, are rejected;
119
+ `UNAUTHENTICATED` requires reconnecting and `NOT_FOUND` returns a resource error.
120
+ Provider messages are not exposed. See Wave's [error examples](https://developer.waveapps.com/hc/en-us/articles/360018571372-Errors).
121
+
122
+ `cancelAuthorization` abandons one pending attempt. Failed replacement consent
123
+ preserves the previous connection. `disconnect` deletes local access and
124
+ attempts; provider token revocation is not implemented. Provider-side access
125
+ must be removed separately when needed.
126
+
127
+ ## Create a customer
128
+
129
+ `customers.create` requires `customer:write` or `customer:*`. Supply an explicit
130
+ business ID chosen and authorized by your backend, plus the customer's name:
131
+
132
+ ```js
133
+ const result = await connections.invoke({ context, integrationId: "wave",
134
+ operation: "customers.create", input: { input: {
135
+ businessId: selectedBusinessId, name: "Customer name",
136
+ email: "customer@example.com"
137
+ } } });
138
+ const customer = result.data.customerCreate.customer;
139
+ ```
140
+
141
+ Optional contact fields are `firstName`, `lastName`, `email`, `phone`, `mobile`,
142
+ `displayId` and `internalNotes`. Address/shipping/currency fields are not yet
143
+ exposed. Input limits are library bounds; Wave still validates business rules.
144
+ The fixed `CustomerCreateInput` mutation returns the customer and owning business.
145
+ A business mismatch is rejected. `didSucceed: false` becomes a 422 error with a
146
+ safe message; provider error text is not exposed. On timeout, network failure or
147
+ an invalid success response, inspect Wave before retrying: the write may already
148
+ have happened. The runtime does not automatically replay it.
149
+
150
+ Another framework sends the same named mutation and variables to Wave using its
151
+ native HTTP client and the project-owned token. There is no editor dependency.
152
+ See the [official schema](https://developer.waveapps.com/hc/en-us/articles/360019968212-API-Reference).
153
+ `customers.update` takes `{ businessId, input: { id, name, ... } }` and the same
154
+ optional contact fields. At least one field must change. Before the mutation,
155
+ the adapter reads that customer under the selected business and checks both IDs;
156
+ an absent or mismatched customer prevents the write. This requires both customer
157
+ read and write permissions (or `customer:*`). The application still authorizes
158
+ the selected business in its connection-service policy. These checks do not
159
+ substitute for workspace membership checks.
160
+
161
+ ```js
162
+ await connections.invoke({ context, integrationId: "wave",
163
+ operation: "customers.update", input: {
164
+ businessId: selectedBusinessId,
165
+ input: { id: customerId, name: "Updated customer name" }
166
+ } });
167
+ ```
168
+
169
+ The native equivalent is the business/customer lookup followed by the fixed
170
+ `CustomerPatchInput` mutation; `businessId` is not a field of that patch input.
171
+ The returned customer ID/business are checked too. There is no automatic retry.
172
+ The accounting operations below use the same project-owned connection.
173
+
174
+ ## Invoice workflow
175
+
176
+ The app chooses a business, customer and products from authorized records. Use
177
+ `invoice:write` plus the relevant read permissions, and add `invoice:send` only
178
+ for sending. Wildcard `invoice:*` covers invoice reads/writes/sends. Creation
179
+ checks the customer under the business; update, approve and send first check the
180
+ existing invoice under that business. Customer changes also check the new customer.
181
+ The app's authorization policy must approve the business and requested operation.
182
+
183
+ ```js
184
+ const draft = await connections.invoke({ context, integrationId: "wave",
185
+ operation: "invoices.create", input: { businessId: selectedBusinessId, input: {
186
+ customerId,
187
+ items: [{ productId, quantity: "1.5", unitPrice: "75.00" }],
188
+ invoiceDate: "2026-09-13"
189
+ } } });
190
+ const invoiceId = draft.data.invoiceCreate.invoice.id;
191
+ await connections.invoke({ context, integrationId: "wave",
192
+ operation: "invoices.update", input: { businessId: selectedBusinessId,
193
+ input: { id: invoiceId, memo: "Appointment completed" } } });
194
+ await connections.invoke({ context, integrationId: "wave",
195
+ operation: "invoices.approve", input: { businessId: selectedBusinessId,
196
+ input: { invoiceId } } });
197
+ // Run only after the app user deliberately chooses to send this invoice.
198
+ await connections.invoke({ context, integrationId: "wave",
199
+ operation: "invoices.send", input: { businessId: selectedBusinessId,
200
+ input: { invoiceId, to: ["customer@example.com"], attachPDF: true } } });
201
+ ```
202
+
203
+ Creation defaults to `DRAFT`; an explicit `SAVED` status is also supported.
204
+ Create accepts `customerId`, `items` (1–100), status, currency, title, invoice/PO
205
+ number, invoice/due date, exchange rate, memo and footer. Patch accepts the same
206
+ fields but requires `id`; omitted fields stay unchanged and supplied items replace
207
+ all existing items. At least one patch field is required. Dates must be real
208
+ YYYY-MM-DD dates. Monetary values and quantities must be decimal **strings**, up
209
+ to eight fractional places, never JavaScript numbers. Wave performs calculations.
210
+ Each item requires `productId`; description, quantity, unit price and taxes are
211
+ optional. Omit taxes to use product defaults; `taxes: []` explicitly removes them,
212
+ or pass `[{ salesTaxId }]`. Deprecated manual tax amounts are not sent.
213
+
214
+ Send requires a nonempty explicit recipient list and `attachPDF`; subject,
215
+ message and `ccMyself` are optional. The operation checks that the invoice is
216
+ approved and `business.emailSendEnabled` is true. A successful result means Wave
217
+ queued the email, not that the recipient received it. Never retry an uncertain
218
+ send automatically. `invoices.get` takes `{ businessId, invoiceId }` and returns
219
+ status, customer, currency, exact total/amount due and provider PDF/view links.
220
+ The adapter never downloads those private links.
221
+
222
+ Other frameworks use the same configuration/Env and native GraphQL operations:
223
+ `InvoiceCreateInput`, `InvoicePatchInput`, `InvoiceApproveInput`, `InvoiceSendInput`.
224
+ Business selection is passed into create input; for the other mutations it is
225
+ used for the preceding ownership lookup, not as an unsupported input field.
226
+ See the [invoice creation example](https://developer.waveapps.com/hc/en-us/articles/360038817812-Mutation-Create-invoice),
227
+ [sending example](https://developer.waveapps.com/hc/en-us/articles/360041888312-Mutation-Send-invoice)
228
+ and [schema](https://developer.waveapps.com/hc/en-us/articles/360019968212-API-Reference).
229
+ Discounts, payment recording, cloning/deletion and advanced document formatting
230
+ are not covered by these invoice operations. The full Wave acceptance packet,
231
+ including final setup/lifecycle and distribution evidence, is still open.
232
+
233
+ ## Application registration and hosting
234
+
235
+ Each application owns its provider registration, callback route, credentials
236
+ and grants. Hosted and installed editors configure the same app-owned setup;
237
+ neither supplies a shared Vibe64 registration or token gateway. Use the app's
238
+ assigned public URL as the initial callback origin, append the route the backend
239
+ actually implements, and register the exact URL with the provider. Keep the
240
+ client secret and callback binding in the application's Env.
241
+
242
+ A custom-domain or hosting move that changes the callback requires updating both
243
+ the provider registration and the app's Env. Preserve the application's identity
244
+ and private connection store, validate callback state and initiator, and allow
245
+ only application-approved return destinations. The editor's address is not the
246
+ provider callback. See the [callback contract](../../connectors-core/docs/oauth-callbacks.md)
247
+ and [setup command](../../connectors-core/docs/setup-command.md).
248
+
249
+ Wave approval requirements still apply to the developer's actual integration;
250
+ customer integrations use OAuth. Follow
251
+ [Developers and Integrators](https://developer.waveapps.com/hc/en-us/articles/360020596771-Permitted-Use-Developers-and-Integrators).
252
+ Distinct registrations alone do not establish independent API quotas. The
253
+ application must follow its approved usage and account limits.
254
+
255
+ ## Automation feasibility
256
+
257
+ - **AI can prepare:** JSON, environment variable names, callback handler wiring,
258
+ explicit business selection/policy, named read/write invocations and local fixtures.
259
+ The protocol and storage implementation remain JSKIT library code.
260
+ - **Human/provider step:** account ownership, subscription choice, consent and
261
+ provider review. Portal actions can be assisted after authentication, but
262
+ issued secrets must enter protected fields directly.
263
+ - **Registration automation:** the reviewed public guides describe portal
264
+ creation; no supported public registration-creation API was established.
265
+ Do not invent a GraphQL mutation to create provider applications.
266
+ Read APIs and token refresh do not establish provisioning API availability.
267
+ - **Rotation:** create/update credentials in the portal and protected bindings.
268
+ Changed client IDs or callbacks require reconnecting; changing the secret
269
+ binding can support ordinary provider-side secret rotation.
270
+
271
+ ## Verification and remaining scope
272
+
273
+ `test/wave.test.js` exercises the real shared service with temporary encrypted
274
+ files and controlled HTTP responses. It covers code consent, restart, named
275
+ queries, input boundaries, scopes, owner policy, callback changes, serialized
276
+ refresh, permission/subscription failures, partial GraphQL errors, cancellation
277
+ and malformed success responses. The guide's JSON is parsed by the same schema.
278
+ The public editor cases passed at desktop and phone widths, checking all ten
279
+ setup steps, configuration/Env references and file persistence, owner-mode
280
+ changes, consent cancellation, reconnect and local disconnect.
281
+
282
+ These tests use no live Wave account, consent, invoices or registration. They do
283
+ not generate a sample application. Live success, provider PKCE enforcement,
284
+ partner approval and actual quota allocation remain unproven. Full-access
285
+ tokens, webhooks and provider-side revocation are not implemented. The implemented mutations are described below.
286
+
287
+ ## Estimates in the application
288
+
289
+ Use `estimates.list` with `{ businessId, page, pageSize }` and `estimates.get`
290
+ with `{ businessId, estimateId }` to populate the app's estimate screens. List
291
+ ordering is newest-created first. The app owns those screens and the business
292
+ access policy; Vibe64 does not approve or send estimates.
293
+
294
+ ```js
295
+ const draft = await connections.invoke({ context, integrationId: "wave",
296
+ operation: "estimates.create", input: { businessId, input: {
297
+ customerId, estimateDate: "2026-09-13", dueDate: "2026-10-13",
298
+ items: [{ productId, quantity: "1", unitPrice: "125.00", taxes: [] }]
299
+ } }
300
+ });
301
+ const estimateId = draft.data.estimateCreate.estimate.id;
302
+ // Each write follows a separate deliberate action authorized by your application.
303
+ await connections.invoke({ context, integrationId: "wave", operation: "estimates.approve",
304
+ input: { businessId, input: { estimateId } } });
305
+ await connections.invoke({ context, integrationId: "wave", operation: "estimates.send",
306
+ input: { businessId, input: { estimateId, to: [customerEmail], attachPDF: true } } });
307
+ ```
308
+
309
+ Create defaults to DRAFT. Every estimate item requires an explicit decimal-string
310
+ `unitPrice`; numeric JavaScript prices are rejected. To update, pass
311
+ `estimates.update` with `{ businessId, input: { id, customerId, status, title,
312
+ estimateDate, dueDate, currency, exchangeRate, ...changes } }`. These fields are
313
+ required by Wave's patch input; read the current estimate before constructing
314
+ an edit. Optional `items` replaces the list. Creation and edits support memo,
315
+ footer, purchase-order number, estimate number and subheading.
316
+
317
+ Enable `estimate:read`, `estimate:write` and, only for sending, `estimate:send`
318
+ (or the explicit wildcard), plus customer read access for ownership checks.
319
+ The runtime verifies the estimate/customer business before mutation and validates
320
+ returned ownership. Sending a draft or deleted/converted estimate is rejected.
321
+ Sending success acknowledges the provider request, not recipient delivery.
322
+ Returned PDF/view URLs are private application data; the runtime does not fetch them.
323
+
324
+ Other frameworks use the same project configuration, Env credentials and native
325
+ Wave GraphQL operations: `estimateCreate`, `estimatePatch`, `estimateApprove` and
326
+ `estimateSend`. Preserve their differing input requirements and the same business
327
+ checks. See the [Wave schema](https://developer.waveapps.com/hc/en-us/articles/360019968212-API-Reference).
328
+ Estimate conversion, deposits, attachments, discounts and advanced formatting are
329
+ not yet exposed by these operations; this estimate workflow alone does not close
330
+ the provider's full acceptance checklist.
331
+
332
+ ## Maintain products and services
333
+
334
+ `products.create` takes `{ businessId, input: { name, unitPrice, description?,
335
+ incomeAccountId?, expenseAccountId?, defaultSalesTaxIds? } }`.
336
+ `products.update` takes `{ businessId, input: { id, ...changes } }`.
337
+ Supply prices as strings with at most five decimal places. Empty
338
+ `defaultSalesTaxIds: []` clears defaults; omit it to leave them unchanged.
339
+ The generated app owns the product editor and the decision to save.
340
+
341
+ Grant product write access (and product read for updates). When selecting
342
+ account/tax references, also grant the corresponding account/sales-tax read
343
+ permissions. Before writing, the runtime verifies each referenced record belongs
344
+ to the selected business. Choose permitted income/expense account subtypes from
345
+ `accounts.list`; Wave enforces which account types can be associated. There is
346
+ no automatic retry after a mutation failure or uncertain result.
347
+
348
+ ```js
349
+ await connections.invoke({ context, integrationId: "wave", operation: "products.create",
350
+ input: { businessId, input: {
351
+ name: "Dog grooming", unitPrice: "125.00", incomeAccountId,
352
+ defaultSalesTaxIds: selectedTaxIds
353
+ } } });
354
+ ```
355
+
356
+ Native framework implementations use `ProductCreateInput` / `ProductPatchInput`
357
+ and the matching `productCreate` / `productPatch` mutations at the same Wave
358
+ GraphQL endpoint. Preserve the business authorization checks before writes.
359
+ Creating products does not create accounting accounts or tax definitions.
360
+
361
+ ## Accounting accounts and tax definitions
362
+
363
+ `accounts.create` accepts `{ businessId, input: { name, subtype, currency?,
364
+ description?, displayId? } }`. The app chooses a supported Wave account subtype;
365
+ JSKIT does not infer accounting treatment. `accounts.get` accepts
366
+ `{ businessId, accountId }` and returns `sequence`. Pass that revision to
367
+ `accounts.update` as `{ businessId, input: { id, sequence, ...changes } }`.
368
+ Edits support name, description and display ID. A changed revision produces
369
+ `connector_conflict`; reload and let the user review their edit. Wave still
370
+ performs its own revision check if the account changes after the preflight.
371
+
372
+ `salesTaxes.create` accepts `{ businessId, input: { name, abbreviation, rate,
373
+ description?, taxNumber?, showTaxNumberOnInvoices?, isCompound?, isRecoverable? } }`.
374
+ Use decimal strings for rates: `"0.15"` means 15%, with up to six decimal places.
375
+ `salesTaxes.get` accepts `{ businessId, salesTaxId }` and includes dated rates.
376
+ `salesTaxes.update` accepts `{ businessId, input: { id, ...changes } }` with name,
377
+ abbreviation, description, tax number, invoice display choice and optional
378
+ `rates: [{ effective: "2026-10-01", rate: "0.15" }]`. Review the full intended
379
+ rate history before submitting it; no automatic rate merging occurs.
380
+
381
+ Both update operations verify the record's business before writing. Read and
382
+ write scopes must be granted separately (or explicitly grant the corresponding
383
+ wildcard). Native frameworks use `accountCreate`, `accountPatch`, `salesTaxCreate`
384
+ and `salesTaxPatch`, preserving revision checks and explicit decimal/date inputs.
385
+ The app owns authorization, edit screens and accounting choices. These operations
386
+ do not yet expose tax archiving, account restrictions or null-to-clear account fields.
387
+
388
+ ## Record a money transaction
389
+
390
+ `transactions.create` takes `{ businessId, input: { externalId, date, description,
391
+ notes?, anchor, lineItems } }`. An anchor is `{ accountId, amount, direction }`,
392
+ where direction is `DEPOSIT` or `WITHDRAWAL`. Each line has `{ accountId, amount,
393
+ balance, customerId?, description?, taxes? }`; balance is `INCREASE`, `DECREASE`,
394
+ `DEBIT` or `CREDIT`. Taxes are `{ salesTaxId, amount }`. All amounts are positive
395
+ strings with at most two decimal places. There are at most 100 lines, 20 taxes
396
+ per line and 100 distinct referenced records per request.
397
+
398
+ The application must deliberately choose valid accounting categories and balance
399
+ the lines against the anchor. Wave validates the accounting result; the adapter
400
+ does not guess debit/credit treatment. It verifies that the referenced accounts,
401
+ customers and taxes belong to the selected business before submitting once.
402
+ Grant transaction write and the relevant record-read permissions.
403
+
404
+ Save `externalId` with the application's source event and submission outcome.
405
+ It is not a claimed provider idempotency guarantee: after a timeout, reconcile
406
+ in Wave before resubmitting. There is no automatic retry or background import.
407
+ Successful output contains `data.moneyTransactionCreate.transaction.id`.
408
+ Native frameworks use the same `MoneyTransactionCreateInput` and
409
+ `moneyTransactionCreate` operation. See [Wave's transaction example](https://developer.waveapps.com/hc/en-us/articles/360057230751-Mutation-Create-Money-Transaction).
410
+ This records accounting data; it does not move money or initiate bank transfers.
411
+
412
+ ## Captured scope reconciliation
413
+
414
+ The captured vendor permission advertises creation and updates. The reviewed
415
+ [public schema](https://developer.waveapps.com/hc/en-us/articles/360019968212-API-Reference)
416
+ has vendor queries but no vendor create/patch mutation. This adapter supplies
417
+ `vendors.list`; it does not invent undocumented vendor endpoints. Business-write
418
+ and checkout scope choices likewise do not imply corresponding operations here.
419
+ The transaction implementation creates records; it does not claim transaction
420
+ search/edit/delete capabilities absent from the reviewed public API. These
421
+ provider limits must remain visible in the final acceptance record.
422
+
423
+ The inline setup screen keeps credential values in project Env bindings, gives
424
+ the callback origin/route rule, separates read/write/send permissions and explains
425
+ related-record read permissions. Registration creation remains a portal action;
426
+ no supported API for provisioning developer applications was established.
427
+
428
+ ## Archive an accounting account
429
+
430
+ Call `accounts.archive` with `{ businessId, input: { id } }` after the application
431
+ user deliberately chooses to archive that account. The backend verifies the
432
+ account belongs to the selected business before submitting `accountArchive`.
433
+ Grant account read and write access (or `account:*`). The mutation carries only
434
+ the account ID; the business ID remains an application authorization input.
435
+ Wave decides whether this account can be archived. A rejected mutation produces
436
+ a safe input error; no automatic retry occurs. On success refresh the account
437
+ view. This hides an account from the default view, rather than deleting it.
438
+ Native frameworks use the same ownership lookup and `AccountArchiveInput`, whose
439
+ output provides `didSucceed` and `inputErrors`, without an account object. See
440
+ [Wave API reference](https://developer.waveapps.com/hc/en-us/articles/360019968212-API-Reference).