@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/gmail.md ADDED
@@ -0,0 +1,133 @@
1
+ # Gmail setup and runtime
2
+
3
+ Documentation checked: 8 September 2026. Automated tests use simulated provider
4
+ responses and real private JSON state; live provider use is outside this delivery.
5
+
6
+ ## Registration and manual setup
7
+
8
+ Follow all numbered steps in [Google registration setup](google-oauth.md).
9
+ For this connector, choose **Gmail API** in APIs & Services → Library and enable
10
+ `gmail.googleapis.com` in the selected Cloud project. Create a Web application client
11
+ with the exact backend callback URI. Set the client ID, secret reference and
12
+ callback URL reference in the same registration fields used by the CLI.
13
+
14
+ In Google Auth Platform → Data Access, select
15
+ `https://www.googleapis.com/auth/gmail.readonly` (required by this connector).
16
+ The captured defaults also select `gmail.send`, `gmail.compose` and `gmail.modify`.
17
+ Remove optional permissions your application does not need; verification only reads the profile; writes require explicit app operations.
18
+ The UI exposes additional documented scopes for applications that need them;
19
+ those scopes do not add operations to this fragment. Use External plus explicit
20
+ test users while testing outside an eligible internal Workspace audience.
21
+
22
+ ## Fields and useful fragment
23
+
24
+ Provider ID: `gmail`. Import its provider from
25
+ `@jskit-ai/connectors-catalog/server/gmail`. Display name, scopes, account mode,
26
+ Client ID/secret and callback references follow the shared field mapping.
27
+ Membership and project access are enforced by the host/application policy,
28
+ not by storing untrusted people IDs in application source.
29
+
30
+ Operations include profile, message/search/attachment reads, drafts, explicit send, labels and reversible mailbox actions listed below.
31
+ Verification input: `{}`.
32
+
33
+ The profile read returns the authenticated mailbox address and message count. Message listing accepts maxResults (1–500), pageToken and repeated labelIds; pass nextPageToken to continue. Message get reads headers using format=metadata and requires a message id. Use messages.read for full/raw content, attachments.get for external MIME parts and messages.search for q. These operations exclude gmail.metadata, which cannot authorize bodies or search.
34
+
35
+ The first read must succeed before Connected is returned. Invalid resource
36
+ identifiers fail before opening consent. Denied scopes, wrong account context,
37
+ replayed callbacks and provider rate limits are covered by the automated tests.
38
+ See the [official operation reference](https://developers.google.com/workspace/gmail/api/reference/rest/v1/users/getProfile) for the response and resource
39
+ permission requirements; the implementation also checks Google's public API
40
+ discovery document for request paths and supported scope strings.
41
+
42
+ ## Automation and application setup
43
+
44
+ Classification: **assisted**, as detailed in the common Google guide. An
45
+ operator-authorized AI can check/create the Cloud project and enable
46
+ `gmail.googleapis.com` with Service Usage or gcloud. It can prepare this connector's
47
+ JSON and callback/scope values. Web-client creation, branding, audience,
48
+ provider review and account consent remain the documented console/operator
49
+ steps; this adapter does not invent an API for them.
50
+
51
+ The application owns the Cloud project selection, registration, callback and
52
+ private secret bindings. It uses the same setup from a CLI or either editor.
53
+ Follow the common guide for rotation, revocation, domain changes and recovery.
54
+ Provider quotas belong to the selected Cloud project and resources; editor
55
+ subscription level does not allocate a shared registration.
56
+
57
+ ## AI/CLI wiring
58
+
59
+ Use the file-store composition from the [connection pattern](../patterns/api-key-connection/PATTERN.md),
60
+ replace the API-key authentication with `oauth2` plus a registrationRef, and
61
+ register this provider. Use beginAuthorization / completeAuthorization instead
62
+ of connectApiKey, with the verification input above. The existing application
63
+ owns authenticated callback routes and its permission policy. Configuration,
64
+ OAuth, refresh, provider requests and storage remain library imports.
65
+
66
+ ## Mailbox workflows and permission boundaries
67
+
68
+ | Operations | Inputs and required permission alternatives |
69
+ |---|---|
70
+ | `messages.read` | `id`, optional full/raw `format`; readonly, modify or full-mail |
71
+ | `messages.search` | `q`, maxResults/pageToken/labelIds/includeSpamTrash; same body-read permissions |
72
+ | `attachments.get` | `messageId`, attachment `id` from a MIME part; same body-read permissions |
73
+ | `messages.send` | base64url MIME `raw`, optional `threadId`; send, compose, modify or full-mail |
74
+ | `messages.modify` | `id`, addLabelIds/removeLabelIds (up to 100 each); modify or full-mail |
75
+ | `messages.trash`, `messages.untrash` | `id`; modify or full-mail |
76
+ | `drafts.list`, `drafts.get` | Pagination or draft `id`; readonly, compose, modify or full-mail |
77
+ | `drafts.create`, `drafts.update` | `raw`, optional threadId; update also draft `id`; compose, modify or full-mail |
78
+ | `drafts.send`, `drafts.delete` | draft `id`; compose, modify or full-mail |
79
+ | `labels.list` | No input; readonly, metadata, labels, modify or full-mail |
80
+ | `labels.create`, `labels.update`, `labels.delete` | `name`, id+name, or id; labels, modify or full-mail |
81
+
82
+ The runtime checks both configured and actually granted OAuth scopes before
83
+ sending an operation. Adding a scope in configuration requires a new consent.
84
+ An app user's connection uses `users/me`: the app cannot select another mailbox
85
+ by passing an email address. Shared connections still require app authorization
86
+ before exposing mail to visitors.
87
+
88
+ Read the returned MIME tree recursively. Inline body parts and attachment
89
+ responses carry base64url data; attachments may be separate parts. The app's
90
+ framework should parse MIME, sanitize HTML, control remote images and supply
91
+ safe download filenames. The connector does not render email or write files.
92
+ `messages.get` remains the explicitly metadata-only operation; `messages.read`
93
+ returns full/raw content. Listing and search return IDs, followed by reads as
94
+ needed; follow nextPageToken, not resultSizeEstimate, for pagination.
95
+
96
+ ```js
97
+ const page = await connections.invoke({ context, integrationId: "gmail",
98
+ operation: "messages.search", input: { q: "in:inbox is:unread", maxResults: 20 } });
99
+ const message = await connections.invoke({ context, integrationId: "gmail",
100
+ operation: "messages.read", input: { id: page.messages[0].id } });
101
+ // After explicit app authorization, mark read and archive:
102
+ await connections.invoke({ context, integrationId: "gmail",
103
+ operation: "messages.modify", input: { id: message.id,
104
+ removeLabelIds: ["UNREAD", "INBOX"] } });
105
+ ```
106
+
107
+ Handle an empty messages array before choosing an item. Build outgoing MIME
108
+ using your framework's mail library, then encode it as base64url in `raw`.
109
+ This adapter bounds raw input to 14 million characters; use a framework-native
110
+ upload flow for larger messages. The From address must be authorized for the
111
+ connected mailbox. Replies need valid In-Reply-To/References headers, matching
112
+ subject and threadId; setting threadId alone does not guarantee threading.
113
+ Draft updates replace the draft's message. Deleting a draft or label is explicit;
114
+ label deletion removes that label, not its messages. Trash is reversible here;
115
+ permanent message deletion is not implemented.
116
+
117
+ A send response identifies an accepted message, not final delivery. Do not
118
+ blindly retry an uncertain send: inspect Sent and reconcile using your app's
119
+ record first. The app owns duplicate prevention and any delivery/bounce handling.
120
+
121
+ CLI users use the same JSON and private Env with optional JSKIT libraries.
122
+ Other frameworks use their native OAuth and MIME tools with the same settings
123
+ and [Gmail REST methods](https://developers.google.com/workspace/gmail/api/reference/rest).
124
+ An AI can wire those operations using the provider schema and this guide without
125
+ Vibe64 running. There is no shared Vibe64 mailbox or Google registration.
126
+
127
+ **LIMITATIONS:** no background/history sync, push watch service, mail-client UI,
128
+ permanent message deletion or mailbox-settings administration. MIME composition
129
+ and rendering belong to the framework; editor assistant attachment is deferred.
130
+ Example: a booking app can read a customer's message, draft a reply, explicitly
131
+ send it and archive the thread's selected message; installing the connector does
132
+ not build the inbox UI or keep a local mailbox synchronized. Google approval,
133
+ real delivery and live mailbox permissions remain untested.
package/docs/gong.md ADDED
@@ -0,0 +1,205 @@
1
+ # Gong
2
+
3
+ Import `gongProvider` from `@jskit-ai/connectors-catalog/server/gong`.
4
+ This provider verifies a company API key and reads users, calls, transcripts and statistics. It
5
+ implements the access-key form, including the optional company API URL.
6
+ OAuth, MCP and write operations remain outside this provider.
7
+
8
+ ## Create credentials manually
9
+
10
+ 1. Sign into Gong as a technical administrator. Open **Admin center → Settings**,
11
+ then **API** in the **Ecosystem** area.
12
+ 2. Choose **+ Get API key**, name it, and optionally set its lifetime and allowed
13
+ IP addresses. Use the backend's outbound IPs when restricting network access.
14
+ 3. Choose **Get API key**. Copy the access-key identifier into the editor and
15
+ store its one-time secret as `GONG_ACCESS_SECRET` in the application
16
+ environment. Enter `env:GONG_ACCESS_SECRET` in the secret-reference field.
17
+ In the editor, **Save configuration**, then **Set credential in Env**;
18
+ paste the secret as `GONG_ACCESS_SECRET` and save there. Finish with **Done**
19
+ in Gong only after preserving the secret. Return and choose **Connect account**.
20
+ The secret cannot be retrieved after closing.
21
+ 4. For later changes, use the key row's actions menu and **Edit**, then save.
22
+ Revocation is available there through **Delete**, its acknowledgement and
23
+ **Delete API**. Local connector disconnect does not revoke Gong's key.
24
+ These controls were updated in August 2026, so older accounts may differ.
25
+ [Key management](https://help.gong.io/docs/receive-access-to-the-api).
26
+
27
+ The identifier and secret form an HTTP Basic credential. A secret alone, an
28
+ OAuth client secret or an OAuth bearer token is not this credential type.
29
+ [API authentication](https://help.gong.io/apidocs/introduction-2).
30
+
31
+ ## Portable file and UI fields
32
+
33
+ ```json
34
+ {
35
+ "schemaVersion": 1,
36
+ "registrations": {},
37
+ "integrations": {
38
+ "sales": {
39
+ "provider": "gong",
40
+ "displayName": "Sales team directory",
41
+ "accountMode": "shared",
42
+ "scopes": [],
43
+ "authentication": {
44
+ "method": "api-key",
45
+ "secretRef": "env:GONG_ACCESS_SECRET"
46
+ },
47
+ "settings": {
48
+ "accessKey": "YOUR_ACCESS_KEY_IDENTIFIER",
49
+ "apiBaseUrl": "https://api.gong.io"
50
+ }
51
+ }
52
+ }
53
+ }
54
+ ```
55
+
56
+ Replace the identifier with the value from Gong. The shared fields expose
57
+ **Access key**, **Access key secret reference** and **API base URL (optional)**.
58
+ CLI and editor use the same settings schema. The key identifier is required;
59
+ the secret remains outside source. Whitespace around pasted settings is trimmed.
60
+ Embedded whitespace, control characters and colons are rejected in the identifier.
61
+ The local identifier limit is 512 characters, not a claim about Gong's issued
62
+ key length.
63
+
64
+ Omit or clear the base-URL field to save the default `https://api.gong.io`.
65
+ This is the origin in Gong's Basic-authentication example.
66
+ [Directory example](https://help.gong.io/docs/uploading-calls-from-a-non-integrated-telephony-system).
67
+ When the API settings provide a company URL, use that value, for example
68
+ `https://company-17.api.gong.io`. Gong also documents customer-specific API
69
+ origins in its OAuth integration guide. The adapter accepts the default host or
70
+ one DNS label before `.api.gong.io`, using HTTPS, optionally ending with `/`.
71
+ Paths, queries, fragments, ports, embedded credentials and unrelated domains
72
+ are rejected. This is an explicit fragment boundary; it does not support
73
+ arbitrary proxies. Changing the key identifier or host requires verification
74
+ again. Requests never fall back to another customer or the default origin.
75
+
76
+ ## Library and AI wiring
77
+
78
+ Use the [API-key composition pattern](../patterns/api-key-connection/PATTERN.md)
79
+ with `providers: [gongProvider]`, the file connection store, an environment
80
+ reference resolver and the application's authorization policy. Both
81
+ configuration and runtime state can remain text files; the CLI needs no editor
82
+ or database process.
83
+
84
+ ```js
85
+ await connections.connectApiKey({ context, integrationId: "sales" });
86
+ const directory = await connections.invoke({
87
+ context, integrationId: "sales", operation: "users.list",
88
+ input: { includeAvatars: false }
89
+ });
90
+ ```
91
+
92
+ `users.list` performs `GET /v2/users`. Its optional `includeAvatars` flag defaults
93
+ to false, excluding Gong's synthetic employee/support users. It accepts an
94
+ opaque `cursor` of 1–8192 characters. Pass `records.cursor` from the previous
95
+ response to request another page. The runtime preserves users, record counts
96
+ and cursor metadata, returns one page at a time, and does not auto-page or
97
+ accept a destination URL in operation input. An empty user list is valid.
98
+ The endpoint documents `api:users:read` for OAuth; this fragment uses a company
99
+ API key and does not present OAuth scope controls.
100
+ [User API](https://help.gong.io/apidocs/list-all-users-v2users).
101
+
102
+ Default published API limits are company-wide: three requests per second and
103
+ 10,000 per day. A 429 response indicates throttling. The fragment surfaces a
104
+ rate-limit error and does not implement automatic retries or budget allocation.
105
+ [API limits](https://help.gong.io/apidocs/introduction-2).
106
+ The application's user-directory policy must decide who may invoke this shared
107
+ connection; a company API key is not an individual employee's login identity.
108
+
109
+ ## Provisioning feasibility and application registrations
110
+
111
+ An AI can prepare this JSON, its reference bindings, request code and validation
112
+ without accessing Gong. Initial API-key creation remains a technical-admin UI
113
+ step: the reviewed public documentation does not establish an API for creating
114
+ keys or customer companies. Do not invent such an endpoint. Browser-assisted
115
+ setup requires the operator's existing account and any required approvals.
116
+
117
+ For a future shared OAuth service, Gong's documented registration path is:
118
+
119
+ 1. Request a developer instance through the form linked in its app guide.
120
+ 2. Open **Admin center → Settings → Ecosystem → API → INTEGRATIONS** and choose
121
+ **Create Integration**.
122
+ 3. Supply the name, long/short descriptions, two logo sizes and required scopes.
123
+ Supply the callback, privacy, terms, help and authorization-start URLs, plus
124
+ contact emails and organization domains. For directory access choose
125
+ `api:users:read`; leave frontend embedding disabled unless needed.
126
+ 4. Save and retain the issued client ID and secret for this application. Keep
127
+ the secret in the application backend's private Env.
128
+
129
+ Gong's OAuth consent is company-wide and does not support user-level grants.
130
+ The token response identifies a customer API origin that a future OAuth adapter
131
+ must retain with that customer's connection. These registration steps do not
132
+ make the current API-key adapter OAuth-capable.
133
+ [App registration](https://help.gong.io/docs/create-an-app-for-gong).
134
+
135
+ Two keys or client registrations do not override company-wide request limits.
136
+ The application owns its credential selection and usage policy. Independent
137
+ provider capacity requires an
138
+ appropriate Gong account arrangement, rather than just a different app name.
139
+ Do not supply one operator's company key as a universal connection to other
140
+ customers' Gong data. Each company owns its grant and API destination.
141
+
142
+ This implemented key flow has no callback registration. A separate OAuth
143
+ implementation must use the application's actual registered callback and own
144
+ its grants. It is not implemented by this key adapter.
145
+
146
+ ## Focused evidence
147
+
148
+ Seven tests use simulated Gong responses and real temporary encrypted JSON state.
149
+ They cover default/customer origins, Basic credentials, file restart, rotation,
150
+ ownership, disconnect, host/key changes, unsafe URL rejection, cursor encoding,
151
+ avatar selection and failures. The public editor check verifies required keys,
152
+ secret references, company URL validation, reload and default restoration.
153
+ No live Gong access, account creation or example application execution is used.
154
+
155
+ ## Call analysis and linked deal context
156
+
157
+ `calls.extensive` returns metadata, participants, available call summaries/topics,
158
+ interaction statistics and CRM context at call time and now. Supply `callIds`
159
+ (1–100 strings), or an ordered `fromDateTime`/`toDateTime` range with timezone;
160
+ optional `workspaceId` narrows the workspace. Preserve every digit of Gong IDs:
161
+ use strings, never JavaScript numbers. Pass `records.cursor` back as `cursor`
162
+ while retaining the same filters. No automatic paging or media fetch occurs.
163
+
164
+ `calls.transcripts` uses the same call/date/workspace selection. Join each
165
+ monologue's speakerId to parties in the extensive call data; retain sentence
166
+ start/end timing. Transcripts or analysis may be absent, processing, deleted or
167
+ restricted. An empty result does not prove the account has no calls.
168
+
169
+ `stats.interaction` takes `fromDate`, `toDate` in YYYY-MM-DD and optional `userIds`.
170
+ Dates use Gong's company timezone; the end is exclusive and cannot exceed the
171
+ provider's current day. Results apply to calls with Whisper enabled. Missing
172
+ metrics are unavailable, not zero. Cursor paging follows the same pattern.
173
+
174
+ ```js
175
+ const result = await connections.invoke({ context, integrationId: "sales",
176
+ operation: "calls.extensive", input: { callIds: ["7782342274025937895"] } });
177
+ const transcript = await connections.invoke({ context, integrationId: "sales",
178
+ operation: "calls.transcripts", input: { callIds: [result.calls[0].metaData.id] } });
179
+ ```
180
+
181
+ Check for empty results before selecting a call. Linked CRM objects/fields are
182
+ Gong's existing context; the app can associate a call with its opportunity and
183
+ show available deal changes. This does not establish a CRM connection or provide
184
+ a standalone all-deal timeline. The app owns joins, reporting and call/CRM access
185
+ rules. Company keys must never grant arbitrary visitors company-wide recordings.
186
+
187
+ `includeMedia: true` explicitly asks Gong for media URLs; default is false.
188
+ These URLs expire after eight hours and require corresponding provider access.
189
+ Treat them as private capabilities. Never attach the Gong Basic credential when
190
+ using a returned media URL. The adapter does not download or archive recordings.
191
+
192
+ The technical administrator supplies company API access; account verification
193
+ only checks users and does not prove call, transcript, media or statistics access.
194
+ CLI consumers use the same config and private Env. Other frameworks use native
195
+ HTTP Basic against the selected company host and the official
196
+ [call-data](https://help.gong.io/apidocs/retrieve-detailed-call-data-by-various-filters-v2callsextensive-2),
197
+ [transcript](https://help.gong.io/apidocs/retrieve-transcripts-of-calls-by-date-or-callids-v2callstranscript-2)
198
+ and [interaction-statistics](https://help.gong.io/apidocs/retrieve-interaction-stats-for-applicable-users-by-date-v2statsinteraction)
199
+ APIs. No Vibe64 runtime or AI service is involved.
200
+
201
+ **LIMITATIONS:** no CRM synchronization, standalone deal timeline, recording
202
+ uploads, media archive, OAuth or editor assistant attachment. Example: an app
203
+ can show renewal-call transcripts and the opportunity context already in Gong;
204
+ it cannot connect Salesforce for the customer or create missing CRM history.
205
+ Real company permissions, transcript availability and media downloads are untested.
@@ -0,0 +1,156 @@
1
+ # Google Ads
2
+
3
+ The fragment uses Google user OAuth and REST v25 to list accessible accounts,
4
+ read account hierarchies and run paged reports. Campaign changes, service-account
5
+ grants and application login are outside this fragment.
6
+
7
+ ## Set up Google Cloud access
8
+
9
+ Google retired developer tokens on September 9, 2026. API access now belongs to
10
+ the Cloud project owning the OAuth client. Remove `apiAccess` and
11
+ `developerTokenRef` from pre-release configuration; there is no compatibility
12
+ reader. The editor no longer asks for a token or pilot selection.
13
+ [Google migration notice](https://developers.google.com/google-ads/api/docs/api-policy/developer-token).
14
+
15
+ 1. Select or create the application's Google Cloud project. Enable **Google Ads
16
+ API** through **APIs & Services → Library**.
17
+ 2. Open its **Google Ads API Overview** page. Check the access level. If it is
18
+ Test, expand **Upgrade access level** and apply for Explorer to use production
19
+ accounts. Higher access has its own approval requirements.
20
+ [Current setup](https://developers.google.com/google-ads/api/docs/get-started/make-first-call).
21
+ 3. In **Google Auth Platform**, configure **Branding**, **Audience** and **Data
22
+ Access**. Add test users while testing and the
23
+ `https://www.googleapis.com/auth/adwords` scope. Complete applicable consent
24
+ publishing and verification before public use.
25
+ 4. In **Clients**, create a **Web application** client. Add this project's exact
26
+ **Suggested callback URL** under **Authorized redirect URIs**. Copy Client ID
27
+ into the connector form. Save configuration, then use the Env links to store
28
+ the client secret and identical callback URL under their referenced names.
29
+ [Web OAuth setup](https://developers.google.com/identity/protocols/oauth2/web-server).
30
+ 5. When accessing customers through a manager, enter its ten-digit customer ID
31
+ without hyphens. Direct account access can leave this blank. The consenting
32
+ person must have the intended Ads account access. Target customer IDs remain
33
+ operation inputs, separately authorized by the application.
34
+ 6. The application's backend implements the callback and connection lifecycle.
35
+ Use **Connect account** for a shared account; individual app users connect in
36
+ the application's own account screen. Initial verification lists directly
37
+ accessible accounts, not every inherited child account. Disconnect removes
38
+ local state; revoke Google consent separately when intended.
39
+
40
+ ## Portable configuration
41
+
42
+ ```json
43
+ {
44
+ "schemaVersion": 1,
45
+ "integrations": {
46
+ "ads": {
47
+ "provider": "google-ads",
48
+ "displayName": "Advertising reports",
49
+ "accountMode": "per-user",
50
+ "scopes": ["https://www.googleapis.com/auth/adwords"],
51
+ "settings": { "loginCustomerId": "1234567890" },
52
+ "authentication": { "method": "oauth2", "registrationRef": "ads-client" }
53
+ }
54
+ },
55
+ "registrations": {
56
+ "ads-client": {
57
+ "source": "own",
58
+ "clientId": "replace-with-web-client.apps.googleusercontent.com",
59
+ "clientSecretRef": "env:GOOGLE_ADS_CLIENT_SECRET",
60
+ "callbackUrlRef": "env:GOOGLE_ADS_CALLBACK_URL"
61
+ }
62
+ }
63
+ }
64
+ ```
65
+
66
+ Replace the placeholders with project-owned resources. Secrets and grants stay
67
+ with the application. CLI, public Vibe64 and Online use the same configuration;
68
+ Laravel implements it with its own framework. Host/domain changes require the
69
+ provider registration and callback Env value to match the application's new
70
+ callback. Keep persistent grants and application identity when moving hosts.
71
+
72
+ An authorized AI can prepare configuration and enable APIs using Google Cloud's
73
+ normal tooling. OAuth client creation, consent verification and access approval
74
+ require the actual owner's permissions and provider processes. There is no
75
+ universal Vibe64 credential or automatic approval. API quotas follow the Cloud
76
+ project and account limits; a second OAuth client does not imply independent
77
+ capacity. The adwords permission can authorize writes even though this fragment
78
+ only implements reads.
79
+
80
+ ## Runtime composition and limits
81
+
82
+ Import `googleAdsProvider` from
83
+ `@jskit-ai/connectors-catalog/server/google-ads`. Register it with the existing
84
+ `createConnectionService`, configuration reader, reference resolver, owner policy
85
+ and encrypted file store. The OAuth source pattern provides composition without
86
+ an editor or database. The app owns its login and each reporting action's policy.
87
+
88
+ | Operation | Input and result |
89
+ |---|---|
90
+ | `customers.listAccessible` | No input; returns Google's `resourceNames`. Missing repeated fields can mean an empty result. This is the connection check. |
91
+ | `customers.listClients` | `customerId`, optional `pageToken`; a fixed `customer_client` query returns hierarchy metadata and levels. It does not recurse automatically. |
92
+ | `reports.search` | `customerId`, `query`, optional `pageToken`; one GAQL Search page, with original result field names and metadata. |
93
+
94
+ The runtime sends only fixed Google token/API destinations. Search uses POST
95
+ JSON but is a read operation. Its page size is Google's fixed 10,000 rows; the
96
+ caller cannot send `pageSize`, arbitrary headers, destinations or a different
97
+ manager ID. Queries are single-line SELECT text, at most 16,000 characters and
98
+ 32,000 UTF-8 bytes. Use GAQL `LIMIT` and approved date ranges to bound reports.
99
+ Keep page tokens with the original query, customer and owner; request each page
100
+ explicitly. 64-bit values stay strings, including money in micros. Preserve that
101
+ precision when displaying or aggregating them. No SQL/GAQL parser or query-cost
102
+ estimator is implied. [REST Search and pagination](https://developers.google.com/google-ads/api/rest/common/search).
103
+
104
+ The application must authorize account IDs, fields, filters and query inputs
105
+ before invoking the library. Configuration ownership and the manager header do
106
+ not make an arbitrary report endpoint safe for every app user. The host policy
107
+ receives an input snapshot; its mutation cannot change the request. The API scope
108
+ does not replace your application's authorization.
109
+
110
+ OAuth grants refresh through the shared locked file implementation. Changed
111
+ client identity/settings require reconnecting. Missing OAuth bindings produce `connector_binding_missing`; project approval failures use
112
+ `connector_api_access_invalid` without discarding the user's valid OAuth grant.
113
+ Quota, permission, scope, query and reconnect failures remain distinct. Raw
114
+ provider error bodies and query echoes are not exposed. Requests respect abort
115
+ signals/timeouts and are not replayed automatically. Disconnect removes local
116
+ access; Google account revocation is a separate owner action.
117
+
118
+ ## Verification boundary
119
+
120
+ Focused tests use controlled OAuth and Ads HTTP responses with the real shared
121
+ validator and encrypted file store. They cover Cloud-project configuration, OAuth/header
122
+ separation, query/page bounds, int64 preservation, empty/malformed results,
123
+ restart, concurrent refresh/rotation, ownership, policy, denied consent, errors
124
+ and interruption. No live accounts, Cloud-project approvals, reports,
125
+ campaign actions or generated applications are used. Provider approval and live
126
+ consent remain separate acceptance work.
127
+
128
+ ## Existing-account Search campaign service
129
+
130
+ `@jskit-ai/connectors-catalog/server/google-ads-search` exports
131
+ `createGoogleAdsSearchService({ connections, configuration, context, integrationId })`.
132
+ Its reusable operations discover accounts/website conversion goals and targeting,
133
+ validate a saved plan with Google, atomically create a paused Search campaign,
134
+ inspect a current campaign, separately launch/pause it and report last-30-days
135
+ metrics. The application owns the authenticated administrator and connection
136
+ service; CLI apps use this without Vibe64.
137
+
138
+ Store plans at `extensions.googleAdsSearch[integrationId]`, outside OAuth settings.
139
+ Use `validateGoogleAdsSearchPlan` from the shared `google-ads-search` export. Read
140
+ `patterns/google-ads-search/PATTERN.md` for command composition and boundaries.
141
+ The public editor has preparation/review controls; another framework uses the same
142
+ JSON/Env contract with native Google APIs, not a JSKIT sidecar.
143
+
144
+ In Google Ads, select an existing active client account, then Goals → Conversions
145
+ → Summary to select or create a website lead goal. Tag setup gives the global tag
146
+ and successful-lead event; integrate with existing consent/tag management, avoid
147
+ duplicate tags and verify using Tag Assistant. This service can create a website
148
+ lead goal and return snippets; it does not install them automatically. Confirm
149
+ billing/advertiser readiness separately before launching. Creation stays paused;
150
+ a lost write response must be investigated in Google Ads before retrying.
151
+
152
+ LIMITATIONS: no advertiser account provisioning, Performance Max, Demand Gen or
153
+ live coding-assistant tool attachment. For example, asking chat to create a new
154
+ Ads account and autonomously optimize a PMax campaign remains unsupported. The
155
+ current editor command uses development Env and may affect a real Ads account.
156
+ Fixtures prove composition and request/approval behavior, not Google live approval.