@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,227 @@
1
+ # PostHog
2
+
3
+ Import `posthogProvider` from `@jskit-ai/connectors-catalog/server/posthog`.
4
+ This fragment implements the public project-token form, flag evaluation and
5
+ explicit event capture. Private analytics, OAuth, MCP, browser autocapture,
6
+ session replay and automatic event batching are not implemented here.
7
+
8
+ ## Create and configure a project manually
9
+
10
+ 1. Sign into the intended PostHog Cloud region. Open the project switcher in
11
+ the top bar and select the analytics project, or use its create control.
12
+ An organization's first project is created during setup; additional projects
13
+ may depend on its plan. Choose an appropriate project name and complete the
14
+ creation controls shown for your organization.
15
+ 2. Open that project's settings from the switcher or sidebar. Copy its numeric
16
+ **Project ID** and public **Project token** beginning with `phc_`.
17
+ 3. In Vibe64, add PostHog. Set the display name, select **Region**, and paste the
18
+ ID into **Project ID**. The form defaults to Europe; choose United States
19
+ for a US project.
20
+ 4. Store the token under `POSTHOG_PROJECT_TOKEN` in the application environment.
21
+ Put `env:POSTHOG_PROJECT_TOKEN` in **Project token reference**, then save.
22
+ CLI users write the same configuration below and resolve the same reference.
23
+ 5. For rotation, regenerate the project token in PostHog settings, then update
24
+ the environment binding. Regeneration invalidates the old token. Check all
25
+ applications using it before rotating. Local connector disconnect only
26
+ removes local connection state.
27
+
28
+ Projects own their data and token; they are distinct from organizations.
29
+ [Project settings](https://posthog.com/docs/settings/projects).
30
+
31
+ ## Portable configuration
32
+
33
+ ```json
34
+ {
35
+ "schemaVersion": 1,
36
+ "registrations": {},
37
+ "integrations": {
38
+ "analytics": {
39
+ "provider": "posthog",
40
+ "displayName": "Product analytics",
41
+ "accountMode": "shared",
42
+ "scopes": [],
43
+ "authentication": {
44
+ "method": "api-key",
45
+ "secretRef": "env:POSTHOG_PROJECT_TOKEN"
46
+ },
47
+ "settings": {
48
+ "region": "eu",
49
+ "projectId": "12345"
50
+ }
51
+ }
52
+ }
53
+ }
54
+ ```
55
+
56
+ Replace the example ID. The local schema accepts a positive decimal ID of up
57
+ to 20 characters and regions `eu` or `us`. This is a fragment validation limit,
58
+ not a claim about the maximum ID PostHog can issue. The token selects the
59
+ project for these operations. Saving the ID preserves the UI configuration,
60
+ but verification cannot establish that the separately saved ID matches the
61
+ token. The form explicitly explains this limit. Changing either setting
62
+ requires verification again.
63
+
64
+ This token is public and may deliberately be used by a frontend analytics
65
+ client. Keeping its reference in configuration is an ownership convention,
66
+ not a claim that it is secret. The adapter rejects personal (`phx_`), project
67
+ secret (`phs_`), and OAuth (`pha_`/`phr_`) credentials in this field. They belong
68
+ to different APIs. A public token cannot authenticate an application user or
69
+ read private analytics.
70
+ [API authentication](https://posthog.com/docs/api).
71
+
72
+ ## JSKIT library and AI wiring
73
+
74
+ Use the [API-key composition pattern](../patterns/api-key-connection/PATTERN.md)
75
+ with this provider, a file connection store, environment-reference resolution,
76
+ and the application's authorization policy. Both configuration and runtime
77
+ state remain text files. The editor is not required by a CLI-built application.
78
+
79
+ ```js
80
+ await connections.connectApiKey({
81
+ context, integrationId: "analytics",
82
+ verificationInput: { distinct_id: selectedUserId }
83
+ });
84
+ const result = await connections.invoke({
85
+ context, integrationId: "analytics", operation: "flags.evaluate",
86
+ input: {
87
+ distinct_id: selectedUserId,
88
+ groups: { company: selectedCompanyId },
89
+ person_properties: { plan: "paid" }
90
+ }
91
+ });
92
+ const checkoutVariant = result.flags.checkout?.variant;
93
+ ```
94
+
95
+ The caller supplies `selectedUserId` and optional group identity from its own
96
+ authorized context. Verification requires a nonempty `distinct_id`; it never
97
+ creates a fake subject or sends an analytics event. The same input is accepted
98
+ by the JSKIT `verifyApiKey` action. It is not stored in connection state.
99
+ IDs have a local 200-character limit. `groups` and `person_properties` are
100
+ optional objects; the latter overrides properties for this evaluation.
101
+
102
+ `flags.evaluate` posts JSON to `/flags?v=2` on the chosen regional ingestor.
103
+ It preserves structured flag values, variants, reasons and metadata. Empty
104
+ flags are valid. HTTP-200 responses with a feature-flag quota limit or partial
105
+ evaluation error fail explicitly in this fragment. Applications must handle
106
+ those failures rather than assuming every missing flag is disabled.
107
+ [Flag evaluation](https://posthog.com/docs/api/flags).
108
+
109
+ The server request identifies itself as `jskit-connectors` and includes the
110
+ documented `posthog-node/` server-runtime marker. It does not load PostHog's SDK.
111
+ This avoids treating backend calls as an unidentified runtime when flags have
112
+ server-only targeting. The adapter supplies no browser origin or forwarding-IP
113
+ headers. It does not create flag-exposure events or implement a fallback cache;
114
+ the application owns those choices.
115
+
116
+ Event capture is a separate, explicit call:
117
+
118
+ ```js
119
+ const accepted = await connections.invoke({
120
+ context, integrationId: "analytics", operation: "events.capture",
121
+ input: {
122
+ event: "checkout_completed",
123
+ distinct_id: selectedUserId,
124
+ properties: { value: 19, currency: "EUR" }
125
+ }
126
+ });
127
+ ```
128
+
129
+ `events.capture` sends JSON to `/i/v0/e/`. It requires `event` and `distinct_id`,
130
+ with optional `properties`. The library supplies the configured `api_key` in
131
+ the body, after checking the exact origin. Callers cannot override the token,
132
+ destination or identity through reserved property fields. The fragment uses
133
+ one request per call and performs no retries, timestamp backfill or batching.
134
+ [Capture API](https://posthog.com/docs/api/capture).
135
+
136
+ A successful `status: "Ok"` indicates request acceptance, not final ingestion.
137
+ The returned `quota_limited` field is preserved for the caller to inspect.
138
+ An HTTP success must not be presented as proof that the event reached analytics.
139
+ The application also owns event consent, identity selection and location
140
+ attribution. This fragment does not forward a visitor IP; provider defaults
141
+ apply to requests made from the backend.
142
+ [API response semantics](https://posthog.com/docs/api).
143
+
144
+ ## Automation feasibility and application ownership
145
+
146
+ An AI can write the configuration, environment names, file-store composition
147
+ and operation calls without accessing an account. Initial organization signup,
148
+ billing and authority to create projects still belong to the operator.
149
+
150
+ After an authorized private API credential exists, project creation can be
151
+ automated using `POST /api/organizations/{organization_id}/projects/` on the
152
+ regional private API host. Its documented scope is `project:write`; the request
153
+ accepts `name` and project settings, and the response includes the new ID and
154
+ `api_token`. Use distinct project names when separate analytics destinations
155
+ are intended. This provisioning API needs a private credential and is not
156
+ implemented by this public-token runtime.
157
+ [Project management API](https://posthog.com/docs/api/projects).
158
+
159
+ The application owner supplies its PostHog project and token. Separate
160
+ PostHog projects can provide different tokens and datasets. Two tokens
161
+ inside one organization do not establish independent budgets: flag quota limits
162
+ are organization-level. The application owns its usage accounting
163
+ and credential selection. Provider account/billing
164
+ arrangements determine actual capacity isolation.
165
+
166
+ An assistant that needs private analytics access requires a separate credential
167
+ flow. A future OAuth implementation can use PostHog's Client ID Metadata
168
+ Document registration model:
169
+
170
+ 1. Prepare separate HTTPS metadata URLs under the operator's domain for public
171
+ and online, if separate client identities are desired.
172
+ 2. At each URL, serve JSON containing that URL as `client_id`, a `client_name`
173
+ and an exact `redirect_uris` list; optionally add a logo. Publishing those
174
+ documents requires control of the domain.
175
+ 3. Use PostHog's authorization-server metadata and the metadata URL as client
176
+ ID. PostHog retrieves the document; there is no mandatory dashboard
177
+ preregistration. Scope selection and account consent are separate steps.
178
+ 4. If organization verification is needed, open organization settings and
179
+ **CIMD verification tokens**, then place the issued value under
180
+ `com.posthog.verification_token` in the metadata. App verification is
181
+ optional; its support path is documented separately by PostHog.
182
+
183
+ [OAuth and metadata registration](https://posthog.com/docs/api/oauth).
184
+ AI can prepare these documents and callback configuration, but these steps do
185
+ not enable OAuth in the implemented fragment. A separate OAuth implementation
186
+ must register the application's actual callback, bind consent to its authenticated
187
+ user and own its grants. That consent journey remains unfinished.
188
+
189
+ ## Focused evidence
190
+
191
+ Nine tests exercise simulated PostHog responses with actual temporary encrypted
192
+ JSON files: both regions, restart, rotation, ownership, disconnect, settings,
193
+ explicit verification input, public-token validation, request boundaries,
194
+ flag results, capture acceptance, quota and HTTP errors. No live provider
195
+ account, consent, event submission or generated application is used.
196
+
197
+
198
+ ## Existing-scope closeout — 13 September 2026
199
+
200
+ Supported: public Cloud project-token verification through explicit-subject flag
201
+ evaluation, `flags.evaluate` and `events.capture`, EU/US region configuration,
202
+ Env references, encrypted local connection state, token rotation and disconnect.
203
+ Nine controlled source tests and nine installed-package tests pass. Existing
204
+ phone/desktop configuration evidence is retained; no new browser run was made
205
+ for this closeout and no runtime/form behavior changed.
206
+
207
+ Limitations and deferred work:
208
+
209
+ - No private analytics querying, dashboards, project provisioning, personal API
210
+ credentials, OAuth, MCP or self-hosted/custom ingestion domains.
211
+ - No browser SDK initialization, SPA navigation hooks/cleanup, autocapture,
212
+ session replay, automatic identify/alias calls, automatic exposure events,
213
+ batching, retries, timestamp backfill or offline cache.
214
+ - The application owns consent, subject/group identity, browser/server wiring,
215
+ event deduplication and handling unavailable flags. A public project token
216
+ neither authenticates users nor authorizes private data access.
217
+ - The token selects the destination project. The separately saved numeric
218
+ project ID is not verified against it. A successful capture response means
219
+ acceptance, not final ingestion; callers must inspect preserved quota fields.
220
+ - Flag quota or partial-evaluation failures are errors, with no automatic
221
+ fallback value. The backend supplies no visitor IP forwarding.
222
+ - Disconnect removes local state only; rotate the token in PostHog when needed.
223
+ Editor coding-agent tool attachment is deferred. No live token, tracking,
224
+ ingestion, provider quota behavior or generated application was exercised.
225
+
226
+ The broader browser lifecycle/analytics backlog stays deferred under the user's
227
+ existing-capability milestone; this closeout does not claim full Lovable parity.
@@ -0,0 +1,151 @@
1
+ # PrestaShop
2
+
3
+ Import `prestashopProvider` from `@jskit-ai/connectors-catalog/server/prestashop`.
4
+ This fragment reads products and orders through the store's Webservice API.
5
+ The application's authenticated policy controls access to this shared store;
6
+ it is not shopper login or a connection to each shopper's store account.
7
+
8
+ ## Manual setup
9
+
10
+ 1. Sign into the store's back office. Open **Advanced Parameters → Webservice**,
11
+ enable **PrestaShop Webservice**, and save.
12
+ 2. Choose **Add new webservice key → Generate**. Add a recognizable description
13
+ and enable the key.
14
+ 3. Grant **GET** for **products**. Add **GET** for **orders** if needed. In
15
+ multistore mode, select the intended shop association. Save.
16
+ 4. Store the generated key in your backend environment as
17
+ `PRESTASHOP_WEBSERVICE_KEY`. Keep it out of application source.
18
+ 5. In the integration form enter **Store URL** and **Webservice API key
19
+ reference** (`env:PRESTASHOP_WEBSERVICE_KEY`), then save configuration.
20
+
21
+ Disable or replace keys through the same Webservice screen.
22
+ [Webservice setup](https://devdocs.prestashop-project.org/9/webservice/tutorials/creating-access/).
23
+
24
+ Use the final HTTPS store address before `/api`, including any installation
25
+ subdirectory. The webserver must route that API path correctly and forward
26
+ Authorization. The adapter sends the key as a Basic-auth username with an empty
27
+ password, requests `output_format=JSON`, and rejects redirects. It has no
28
+ URL-credential fallback. JSON is an output format for this API; this fragment
29
+ implements no XML writes.
30
+ [Webservice protocol](https://devdocs.prestashop-project.org/9/webservice/getting-started/).
31
+
32
+ ## Portable configuration and CLI wiring
33
+
34
+ ```json
35
+ {
36
+ "schemaVersion": 1,
37
+ "registrations": {},
38
+ "integrations": {
39
+ "store": {
40
+ "provider": "prestashop",
41
+ "displayName": "Store catalogue",
42
+ "accountMode": "shared",
43
+ "scopes": [],
44
+ "authentication": {
45
+ "method": "api-key",
46
+ "secretRef": "env:PRESTASHOP_WEBSERVICE_KEY"
47
+ },
48
+ "settings": { "siteUrl": "https://merchant.example/store/" }
49
+ }
50
+ }
51
+ }
52
+ ```
53
+
54
+ Compose the [API-key source pattern](../patterns/api-key-connection/PATTERN.md)
55
+ with `providers: [prestashopProvider]`. CLI and editor use the same configuration
56
+ parser and provider definition. `createFileConnectionStore` keeps runtime state
57
+ in encrypted JSON outside application source; no editor or database is needed.
58
+ Supply the application's authorization policy and environment reference resolver.
59
+
60
+ ```js
61
+ await connections.connectApiKey({ context, integrationId: "store" });
62
+ const products = await connections.invoke({
63
+ context, integrationId: "store", operation: "products.list",
64
+ input: { offset: 0, limit: 25, language: 1 }
65
+ });
66
+ const orders = await connections.invoke({
67
+ context, integrationId: "store", operation: "orders.list",
68
+ input: { offset: 0, limit: 10 }
69
+ });
70
+ ```
71
+
72
+ Verification performs `products.list`. It proves that request succeeded, not
73
+ order access. Both operations request full records sorted by ascending ID.
74
+ Inputs are `offset` (0–1000000, default 0), `limit` (1–100, default 20), and
75
+ optional positive integer `language`. These are fragment bounds. Offset and
76
+ limit become the provider's `limit=offset,limit` parameter. Each call fetches
77
+ one page; the caller decides whether to request another.
78
+ [List parameters](https://devdocs.prestashop-project.org/9/webservice/tutorials/advanced-use/additional-list-parameters/).
79
+
80
+ Responses remain unchanged: usually `{ products: [...] }` or `{ orders: [...] }`.
81
+ An empty `[]` is also valid. PrestaShop's JSON writer can emit that shape when
82
+ there are no resource nodes. Multilingual fields may be strings or language
83
+ arrays, and IDs/decimal values can be strings. Preserve them when displaying
84
+ or processing the result; associated resources are not fetched automatically.
85
+ [Provider JSON writer](https://github.com/PrestaShop/PrestaShop/blob/9.0.0/classes/webservice/WebserviceOutputJSON.php).
86
+
87
+ Changing the store URL or credential reference requires verification again.
88
+ Environment key rotation takes effect on the next request. Disconnect removes
89
+ the local grant; it does not revoke the store key. HTTP permission, credential,
90
+ quota and transport failures remain errors; no request is replayed automatically.
91
+
92
+ The store URL may contain a private host, port or installation path. The shared
93
+ validator rejects embedded credentials, query, fragment and parent-path
94
+ segments. It does not perform DNS filtering. The application controls who can
95
+ edit this credential destination and what networks its backend can reach.
96
+ Operation input cannot substitute a different URL.
97
+
98
+ ## Automation and Online ownership
99
+
100
+ An AI can prepare the JSON and runtime wiring. With authorized access to the
101
+ store's PHP runtime, provider APIs can enable `PS_WEBSERVICE`, create a
102
+ `WebserviceKey`, and assign resource methods using
103
+ `WebserviceKey::setPermissionForAccount`. This is local store administration,
104
+ not an unauthenticated remote registration endpoint. This fragment does not
105
+ execute provisioning PHP or alter shop permissions.
106
+ [Programmatic setup](https://devdocs.prestashop-project.org/9/webservice/tutorials/creating-access/).
107
+
108
+ There is no universal OAuth callback for this mode. Each merchant owns its
109
+ store key. Separate application keys can separate access and revocation, but do not create
110
+ separate store capacity. Two keys on one server are not evidence of separate
111
+ provider quotas.
112
+
113
+ The editor VM and application custom domain need no provider redirect
114
+ registration. If the store itself changes address, update `siteUrl` and
115
+ re-verify it. The application retains its credential in private Env and enforces
116
+ access through its own authorization policy. See the
117
+ [application setup contract](../../connectors-core/docs/online-setup.md).
118
+
119
+ ## Focused proof and remaining work
120
+
121
+ Automated tests use controlled HTTP and real encrypted temporary files. They
122
+ cover Basic headers, subdirectories, restart, rotation, isolation, policy,
123
+ changed destinations, bounded pages, empty/malformed replies, permission errors
124
+ and interruption without replay. Editor checks cover required URL validation,
125
+ raw-secret rejection, references, setup guidance and save/reload.
126
+
127
+ Live stores and sample application generation are outside this proof. Product
128
+ writes, order processing, stock changes, additional filters, explicit multistore
129
+ selection per request, webhooks and complete account-connection UI
130
+ remain outside this fragment. The newer Admin API is a separate protocol.
131
+
132
+
133
+ ## Existing-scope closeout — 13 September 2026
134
+
135
+ The supported surface is `products.list` and `orders.list` with explicit
136
+ pagination/language, a merchant-owned Webservice key and the configured HTTPS
137
+ store path. Source and offline installed-package tests each pass 7/7. Historical
138
+ editor form checks are retained; no fresh browser run or runtime/form change was
139
+ made for this closeout. This is not full commerce or Lovable parity.
140
+
141
+ Full deferred work: product/order writes and XML write composition, customer and
142
+ inventory resource operations, stock updates, checkout/payments, fulfilment,
143
+ refunds, carts, additional search/filter/detail operations, automatic traversal
144
+ of associations, webhooks, automatic pagination, retries and newer Admin API
145
+ support. Multistore association belongs to the key configuration; there is no
146
+ per-request shop selector. No OAuth, shopper authentication or per-shopper grants.
147
+ The application owns business UI, routes, access policy and native framework
148
+ composition. Verification reads products only and cannot establish order access.
149
+ Disconnect removes local state; disable/revoke the key in the merchant back office.
150
+ Editor coding-agent attachment remains deferred. Live store compatibility,
151
+ actual permissions/data and generated-app execution have not been verified.
@@ -0,0 +1,60 @@
1
+ # Replicate
2
+
3
+ Import `replicateProvider` from `@jskit-ai/connectors-catalog/server/replicate`.
4
+ This adapter verifies the account and supports asynchronous model predictions.
5
+
6
+ ## Configure access
7
+
8
+ 1. Sign into Replicate and select the user or organization intended to own usage.
9
+ 2. Open [API tokens](https://replicate.com/account/api-tokens). Create a token
10
+ with a descriptive application name and copy it into backend Env as
11
+ `REPLICATE_API_TOKEN`. The default account token also exists, but named tokens
12
+ make subsequent replacement easier to track.
13
+ 3. Save provider `replicate`, account mode `shared` or `assistant`, `scopes: []`,
14
+ authentication
15
+ `{ "method": "api-key", "secretRef": "env:REPLICATE_API_TOKEN" }`.
16
+ 4. Run `connectApiKey`; inspect the returned account through `account.read` to
17
+ check that it is the intended owner. To revoke a token, return to the token
18
+ page and use its disable control. Local disconnect does not disable it at
19
+ Replicate. [Token guide](https://replicate.com/docs/topics/security/api-tokens).
20
+
21
+ ## Runtime and AI composition
22
+
23
+ `account.read` calls `GET https://api.replicate.com/v1/account`. It returns
24
+ the user/organization type and username, plus any optional profile fields.
25
+ `hardware.list` calls `GET https://api.replicate.com/v1/hardware`, returning
26
+ hardware names and SKU identifiers. Both use Bearer authorization and accept
27
+ no inputs. Listing hardware does not reserve it. Prediction operations are explicit; connecting does not generate output. Model/deployment creation is outside this adapter.
28
+ [HTTP reference](https://replicate.com/docs/reference/http/),
29
+ [provider schema](https://api.replicate.com/openapi.json).
30
+
31
+ Compose the [API-key pattern](../patterns/api-key-connection/PATTERN.md) with
32
+ this provider and the private JSON file store. The same configuration can be
33
+ written by hand, by an AI or through the editor. The application owns model-specific input validation, job lifecycle and spending.
34
+
35
+ ## Automation and application ownership
36
+
37
+ The initial token creation path verified here is the web account page. An AI
38
+ can prepare the portable configuration and library wiring after that bootstrap;
39
+ no token-creation API was established in this pass. Replicate's API supports
40
+ additional model and prediction operations, but those are not verification steps.
41
+
42
+ The application owner supplies the Replicate account and token. Differently
43
+ named tokens in one account are not evidence of independent rate limits or
44
+ billing. The editor does not provision or allocate inference capacity.
45
+
46
+ Fixtures cover both requests, empty hardware lists, invalid responses, private
47
+ file-store restart, rotation, isolation and HTTP failures. No model was run.
48
+
49
+ ## Prediction workflow
50
+
51
+ 1. Open the model's API tab. Copy its owner/name and input fields. Call `models.get({owner,name})` to inspect `latest_version.openapi_schema` or use the pinned version's documented schema.
52
+ 2. Invoke `models.predict({owner,name,input})` for an official model, or `predictions.create({version,input})` with its 64-character version ID (optionally `owner/name:version`). Inputs remain provider-shaped JSON, bounded to 256 KiB; use HTTP/data URLs for files. Never put the token into a file URL.
53
+ 3. Save the returned ID under the authorized app user. Poll `predictions.get({id})` on your application's schedule. Starting/processing are pending; succeeded exposes output; failed exposes error; canceled is terminal. `predictions.cancel({id})` explicitly requests cancellation. Do not resubmit a timed-out creation automatically: its outcome may be unknown.
54
+ 4. Output is preserved, including strings, arrays, structured JSON and image/audio/video URLs. The app renders the result and, when needed, saves files before the provider's retention window expires (normally one hour for API predictions). The adapter never fetches arbitrary result URLs.
55
+
56
+ For CLI or another framework, use the same project slot and Env reference with these documented HTTP endpoints and ownership checks. JSKIT invokes them through the existing connection service; no Vibe64 execution service is required.
57
+
58
+ **LIMITATIONS:** No media studio, background polling/history service, training, deployment administration, file uploader or editor-tool attachment. Example: an app can request a generated image and poll its ID, but must show progress and save/display the resulting image itself. Backend authorization must restrict prediction IDs to their initiating users; a shared provider token alone does not provide app-user isolation.
59
+
60
+ Sources: [HTTP operations](https://replicate.com/docs/reference/http), [prediction lifecycle](https://replicate.com/docs/topics/predictions/lifecycle), [retention](https://replicate.com/docs/reference/how-does-replicate-work). Fixtures exercise requests and result handling; no paid prediction or generated app was run.
package/docs/resend.md ADDED
@@ -0,0 +1,153 @@
1
+ # Resend setup and implementation
2
+
3
+ Documentation checked: 8 September 2026. Console navigation is documented from
4
+ public guidance, not tested in a signed-in account. Tests use simulated API
5
+ responses; no email is sent.
6
+
7
+ ## Initial capability and input ownership
8
+
9
+ `resendProvider` verifies an API key by listing sending domains. `domains.list`
10
+ returns domain status and cursor pagination (`limit`, `after`, `has_more`,
11
+ `data`). Use the last returned domain ID as `after` for the next page. The limit
12
+ is 1–100. The separate `emails.send` operation sends transactional plain-text
13
+ messages. Contacts, segments and draft broadcasts are supported below. Incoming mail, attachments and a hosted-template catalogue are not implemented.
14
+
15
+ | Input | Destination | Rule |
16
+ |---|---|---|
17
+ | Display name | integration `displayName` | Optional, 1–200 characters when present |
18
+ | API key | Server environment/secret store | Never include the raw value in application source |
19
+ | API key reference | `authentication.secretRef` | For example `env:RESEND_API_KEY` |
20
+ | Shared account / assistant | `accountMode` | Existing application policy authorizes the caller |
21
+ | People with access | Host's membership/grant policy | Checked by `authorize`; a source field cannot grant workspace membership |
22
+ | Billing and quota | Application administrator’s Resend account | Editor edition does not supply account capacity |
23
+
24
+ ## Manual setup
25
+
26
+ 1. Sign in at [Resend](https://resend.com/) and select the account/team that should
27
+ own the application's usage. Account creation, payment and domain ownership
28
+ remain operator decisions.
29
+ 2. Open **API Keys** in the dashboard, then **Create API key**. The official
30
+ [key guide](https://resend.com/docs/dashboard/api-keys/introduction) describes
31
+ the permission choices and one-time key display.
32
+ 3. Give the key a recognizable environment/application name. Choose **Full
33
+ access** for domain verification and marketing operations. **Sending access** cannot
34
+ perform the verification read. Domain-limited sending keys belong to a later
35
+ sending-only fragment; do not silently broaden a supplied key.
36
+ 4. Create the key and immediately store its value in the application's secret
37
+ store or private environment as `RESEND_API_KEY`. If the value is lost,
38
+ create a replacement rather than placing it in chat or source.
39
+ 5. In the integration form, set the display name and account use, and enter
40
+ `env:RESEND_API_KEY` as the key reference. Save the configuration. A CLI user
41
+ writes the same `authentication: { method: "api-key", secretRef: "env:RESEND_API_KEY" }`.
42
+ 6. Authorize the application caller and invoke `connectApiKey`. A successful
43
+ [domain-list response](https://resend.com/docs/api-reference/domains/list-domains)
44
+ has `object: "list"`, `data` and `has_more`; an empty list is valid. This read
45
+ needs no recipient, callback URL, OAuth app, client secret or verified domain.
46
+ 7. If denied, check the selected account, key value and Full access permission.
47
+ A 401 requires reconnecting; a 403 is permission denied; a 429 is rate
48
+ limited. Fix the cause and retry explicitly. The runtime does not resend or
49
+ retry writes automatically.
50
+ 8. Rotate by creating a replacement key, updating the same secret binding and
51
+ verifying it before revoking the previous key in **API Keys**. Disconnect
52
+ removes the application's local connection; revoking a provider key affects
53
+ every caller that shares it. Treat the provider's expiration rules as
54
+ authoritative; the runtime does not invent an expiration time.
55
+
56
+ ## Automation and application ownership
57
+
58
+ Classification: **assisted API automation**. An authorized operator supplies an
59
+ existing administrative key. The official [create-key API](https://resend.com/docs/api-reference/api-keys/create-api-key)
60
+ accepts a name and permission and returns the new key. Use `GET /api-keys` to
61
+ find a previously provisioned named key before considering `POST /api-keys`;
62
+ the secret cannot be reconstructed from the list. Save returned secrets once
63
+ and do not print response bodies. If a named key exists without its stored
64
+ secret, report it for rotation rather than silently creating duplicates.
65
+
66
+ The API recipe is: resolve the administrative key privately, list keys, find the
67
+ application's stored key ID/name, create only when absent, and persist the new ID
68
+ and secret through the operator's secret store. Key creation does not automate
69
+ account signup, billing or domain verification. DNS records must be installed at your DNS host and verified by Resend; the editor does not change DNS.
70
+
71
+ Each application administrator supplies its own Resend key through the app's
72
+ private Env. Hosted and installed editors use the same configuration and runtime;
73
+ neither supplies shared sending capacity. Independent keys in one Resend account
74
+ do not prove independent quotas. Check the provider's [usage limits](https://resend.com/docs/api-reference/rate-limit)
75
+ before promising isolation. Moving the app to another host requires preserving
76
+ its Env and runtime connection state, not an editor gateway.
77
+
78
+ For CLI or editor setup, compose the existing connection service with the
79
+ [application-owned setup command](../../connectors-core/docs/setup-command.md).
80
+ The app owns operator authorization; JSKIT supplies JavaScript libraries. Other
81
+ frameworks implement their own command and runtime through native tooling.
82
+
83
+ ## Transactional email and recovery wiring
84
+
85
+ Sending contract checked against the official
86
+ [send API](https://resend.com/docs/api-reference/emails/send-email) and
87
+ [idempotency guide](https://resend.com/docs/dashboard/emails/idempotency-keys)
88
+ on 11 September 2026. `emails.send` requires `from`, `to` (an array of 1–50 email
89
+ addresses), `subject`, `text` and `idempotencyKey`. This adapter bounds text at
90
+ 1,000,000 characters and requires an ASCII key of 1–256 characters using letters,
91
+ numbers, underscores, dots, slashes, colons or hyphens. These are adapter limits,
92
+ not a claim to implement every Resend sending option.
93
+
94
+ The request goes to `POST /emails`; the key goes in `Idempotency-Key`, not the
95
+ message body. The application owns verified sender/domain setup, recipients,
96
+ content and authorization. Connection verification remains a domain read and
97
+ never sends a test message. This connection mode still requires a Full access
98
+ key for that read; sending-only keys need a separately designed verification
99
+ mode and are not silently accepted as fully verified here.
100
+
101
+ Resend retains idempotency keys for 24 hours. Reuse the same key and identical
102
+ body when deliberately retrying an uncertain result within that window. Do not
103
+ reuse the key for a changed message. The library makes one request and does not
104
+ automatically retry; a successful API response is acceptance, not proof of inbox
105
+ delivery. The application owns any durable delivery workflow.
106
+
107
+ An application can provide local auth's recovery sender using its existing
108
+ connection service and a fixed, trusted administrator context:
109
+
110
+ ```js
111
+ import { createHash } from "node:crypto";
112
+
113
+ function createRecoverySender({ connections, context, integrationId, from }) {
114
+ return async ({ email, recoveryUrl }) => {
115
+ // Stable for this exact recovery message; do not put the token in a header.
116
+ const idempotencyKey = `recovery/${createHash("sha256")
117
+ .update(JSON.stringify([from, email, recoveryUrl])).digest("hex")}`;
118
+ await connections.invoke({
119
+ context, integrationId, operation: "emails.send",
120
+ input: {
121
+ from, to: [email], subject: "Reset your password",
122
+ text: `Open this link to reset your password:\n\n${recoveryUrl}\n`,
123
+ idempotencyKey
124
+ }
125
+ });
126
+ };
127
+ }
128
+ ```
129
+
130
+ Supply the returned function as `auth.local.recovery-sender` or the direct
131
+ `createLocalAuthService({ recoverySender, ... })` argument. This snippet belongs
132
+ in the application; auth does not import Resend or connectors. The context must
133
+ come from trusted backend composition, never from the public password-reset
134
+ request. Do not log recovery content or provider request bodies.
135
+
136
+ `test/resend.test.js` uses controlled HTTP to verify the read-only connection
137
+ check, explicit POST/body/header, input rejection, application isolation and
138
+ absence of automatic retries on uncertain delivery. No email is sent.
139
+
140
+ ## Marketing workflow (current segments API)
141
+
142
+ 1. In **Domains → Add domain**, enter your sender domain. Copy the displayed SPF/DKIM records exactly into your DNS host, then return to Resend and verify. Use a From address on that verified domain. `domains.get({id})` retrieves status and records; a saved key does not establish domain readiness.
143
+ 2. In **Contacts**, create a **Segment** for recipients who opted into this communication. Older instructions call these Audiences; this adapter uses current segments. Use `segments.list({limit,after})` or `segments.create({name})`. Lists use the last item's ID as the next `after`; preserve `has_more` when supplied.
144
+ 3. `contacts.create({email,first_name,last_name,unsubscribed,segments:[{id}]})` requires an explicit subscription decision. `contacts.list({limit,after,segment_id})`, `contacts.get({id})`, `contacts.update({id,unsubscribed,...names})`, `contacts.addSegment({id,segmentId})` and `contacts.removeSegment({id,segmentId})` manage ordinary recipients. Never reset an existing opt-out merely because somebody signs in again. The app owns consent and tenant-to-contact authorization.
145
+ 4. Render your template to HTML using your framework or write it in Resend's **Broadcasts** editor. Include an actual unsubscribe link, e.g. `<a href="{{{RESEND_UNSUBSCRIBE_URL}}}">Unsubscribe</a>`. Provider variables such as `{{{contact.first_name|there}}}` are resolved by Resend. No hosted template ID is required for this HTML path.
146
+ 5. Call `broadcasts.create({segment_id,from,subject,html,name?,text?,preview_text?})`. It always saves `send:false`; it cannot silently send. Read back with `broadcasts.get({id})`, list with `broadcasts.list({limit,after})`, or replace the editable content with `broadcasts.update({id,segment_id,from,subject,html,...})`. Review sender, recipient segment and rendered content in the app or Resend dashboard. For preview, use your framework's renderer; use a separate segment containing only your test addresses for an explicit test send.
147
+ 6. After the operator approves the selected recipients/content, invoke `broadcasts.send({id})`. This affects the whole selected segment. The application must authorize this operation separately from draft editing and restrict IDs to its tenant. API acceptance is not delivery proof. Creation/sending each make one request, with no automatic retries; inspect provider status after an uncertain outcome rather than creating duplicate campaigns.
148
+
149
+ JSKIT uses the same connection slot and backend Env for these operations through `connections.invoke`. CLI apps compose that service directly; other frameworks use their own Resend client/HTTP implementation with the same project-owned configuration. Vibe64 edits setup; it does not run a shared sending service or own recipient lists.
150
+
151
+ **LIMITATIONS:** No visual campaign builder, hosted-template catalogue, topic/custom-property administration, automation engine, scheduling UI, inbound mail, attachments, delivery-webhook processor, analytics dashboard or automatic coding-assistant attachment. Example: the app can create a newsletter draft and explicitly send it to a reviewed segment, but its own UI or Resend dashboard supplies preview and reporting. Transactional `emails.send` remains plain text with the existing idempotency-key contract. The unsubscribe marker check cannot verify the quality/visibility of rendered HTML; review the actual content.
152
+
153
+ Sources checked 13 September 2026: [segments](https://resend.com/docs/api-reference/segments/create-segment), [contacts](https://resend.com/docs/api-reference/contacts/create-contact), [broadcast creation](https://resend.com/docs/api-reference/broadcasts/create-broadcast), [explicit send](https://resend.com/docs/api-reference/broadcasts/send-broadcast), [provider OpenAPI](https://github.com/resend/resend-openapi/blob/main/resend.yaml). Controlled tests exercise this journey; no real emails or generated applications were run.