@koda-sl/baker-cli 0.489.0-dev.63e618e80 → 0.490.0

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 (991) hide show
  1. package/README.md +170 -8
  2. package/dist/account-3H6BZO5H.js +80 -0
  3. package/dist/account-IKFDY52P.js +138 -0
  4. package/dist/account-IKFDY52P.js.map +1 -0
  5. package/dist/account-KNRDOUJP.js +79 -0
  6. package/dist/account-assets-LKZVWZAR.js +289 -0
  7. package/dist/account-assets-LKZVWZAR.js.map +1 -0
  8. package/dist/account-level-UJOZDVXY.js +608 -0
  9. package/dist/account-level-UJOZDVXY.js.map +1 -0
  10. package/dist/account-reads-GA6FVKLE.js +218 -0
  11. package/dist/account-writes-AE5IJGGW.js +66 -0
  12. package/dist/accounts-K4INATCW.js +75 -0
  13. package/dist/accounts-RTN5ZGTU.js +611 -0
  14. package/dist/accounts-RW6KXBOQ.js +77 -0
  15. package/dist/actions-HNLISA7T.js +55 -0
  16. package/dist/activecampaign-I5CILZPU.js +935 -0
  17. package/dist/activities-T253KK4Q.js +74 -0
  18. package/dist/ad-group-writes-VRSBI2Z2.js +170 -0
  19. package/dist/ad-groups-IEBVEAMS.js +68 -0
  20. package/dist/ad-writes-ALV4KFPZ.js +174 -0
  21. package/dist/add-6WKPFMLG.js +302 -0
  22. package/dist/add-XF5COUAS.js +104 -0
  23. package/dist/ads-CQZHD7FC.js +77 -0
  24. package/dist/ads-QIKZ6O2N.js +40 -0
  25. package/dist/ads-ZEY72UBN.js +114 -0
  26. package/dist/ads-ZEY72UBN.js.map +1 -0
  27. package/dist/adsets-5H3MOT3D.js +177 -0
  28. package/dist/adsets-5H3MOT3D.js.map +1 -0
  29. package/dist/advertisers-6NUM2Q3A.js +120 -0
  30. package/dist/analytics-ALOZ7ZZ4.js +1976 -0
  31. package/dist/analytics-VLHE5A2M.js +433 -0
  32. package/dist/animate-SVEPM267.js +480 -0
  33. package/dist/asset-writes-L5TMKIZC.js +47 -0
  34. package/dist/assign-6HI6TNLP.js +77 -0
  35. package/dist/audience-size-25LP2OBF.js +73 -0
  36. package/dist/audience-writes-X52VG35Y.js +324 -0
  37. package/dist/audience-writes-X52VG35Y.js.map +1 -0
  38. package/dist/audiences-AAZH56WD.js +268 -0
  39. package/dist/audiences-X3RLGOVM.js +84 -0
  40. package/dist/audiences-X3RLGOVM.js.map +1 -0
  41. package/dist/audit-YY6X2MPA.js +151 -0
  42. package/dist/autocomplete-SAWJK4NF.js +111 -0
  43. package/dist/avatars-YSFFRHDK.js +38 -0
  44. package/dist/bid-pricing-HZ74SLEB.js +100 -0
  45. package/dist/brand-T3OACVQX.js +22 -0
  46. package/dist/brief-7S6XCJIA.js +538 -0
  47. package/dist/businesses-H3HIDQX6.js +53 -0
  48. package/dist/campaign-groups-YJK767AP.js +95 -0
  49. package/dist/campaign-writes-7ZF57KLH.js +165 -0
  50. package/dist/campaign-writes-7ZF57KLH.js.map +1 -0
  51. package/dist/campaign-writes-U5PUVSMT.js +170 -0
  52. package/dist/campaigns-AV6G3AUU.js +127 -0
  53. package/dist/campaigns-AV6G3AUU.js.map +1 -0
  54. package/dist/campaigns-GALDR5KK.js +109 -0
  55. package/dist/campaigns-JEIKY2M4.js +76 -0
  56. package/dist/campaigns-VTRMKSAT.js +107 -0
  57. package/dist/canvas-SVJEQO4V.js +46 -0
  58. package/dist/capabilities-2KT6TCGZ.js +144 -0
  59. package/dist/catalog-S32MX453.js +65 -0
  60. package/dist/catalogs-OCVXZLIF.js +128 -0
  61. package/dist/catalogs-RXJTZTVX.js +778 -0
  62. package/dist/catalogs-RXJTZTVX.js.map +1 -0
  63. package/dist/changes-5TOYRKZR.js +135 -0
  64. package/dist/chatgpt-QVF2FD3E.js +47 -0
  65. package/dist/chats-QG72JB6Y.js +276 -0
  66. package/dist/chats-QG72JB6Y.js.map +1 -0
  67. package/dist/check-SLNHVYGS.js +104 -0
  68. package/dist/chunk-2C7AHPM4.js +191 -0
  69. package/dist/chunk-2C7AHPM4.js.map +1 -0
  70. package/dist/chunk-2LI6746F.js +103 -0
  71. package/dist/chunk-2PWNIEW4.js +197 -0
  72. package/dist/chunk-2WZI36D3.js +317 -0
  73. package/dist/chunk-3W6G6ARX.js +122 -0
  74. package/dist/chunk-45UK4KYJ.js +1606 -0
  75. package/dist/chunk-46GWHUKN.js +225 -0
  76. package/dist/chunk-4AMIHNNP.js +1919 -0
  77. package/dist/chunk-4KJMLYCD.js +224 -0
  78. package/dist/chunk-5C35OW7L.js +205 -0
  79. package/dist/chunk-5C35OW7L.js.map +1 -0
  80. package/dist/chunk-5GQCN2QZ.js +391 -0
  81. package/dist/chunk-5GQCN2QZ.js.map +1 -0
  82. package/dist/chunk-5HJRZFMW.js +207 -0
  83. package/dist/chunk-65Y3RCWP.js +68 -0
  84. package/dist/chunk-65Y3RCWP.js.map +1 -0
  85. package/dist/chunk-66QHX566.js +6306 -0
  86. package/dist/chunk-6NCJGU6I.js +191 -0
  87. package/dist/chunk-6WCAV27H.js +494 -0
  88. package/dist/chunk-A4MVVPJ2.js +4204 -0
  89. package/dist/chunk-A4MVVPJ2.js.map +1 -0
  90. package/dist/chunk-AO45BX6Q.js +66 -0
  91. package/dist/chunk-AQM4JH62.js +274 -0
  92. package/dist/chunk-AQM4JH62.js.map +1 -0
  93. package/dist/chunk-BDYLILMW.js +150 -0
  94. package/dist/chunk-BL2MX6CR.js +249 -0
  95. package/dist/chunk-BOPC3D6I.js +604 -0
  96. package/dist/chunk-BTY4LZBG.js +46 -0
  97. package/dist/chunk-C7NWUCLQ.js +64 -0
  98. package/dist/chunk-CP4P6YKM.js +287 -0
  99. package/dist/chunk-CP4P6YKM.js.map +1 -0
  100. package/dist/chunk-D4CKCNGW.js +547 -0
  101. package/dist/chunk-D5CUAOQX.js +297 -0
  102. package/dist/chunk-D5UXWKLQ.js +903 -0
  103. package/dist/chunk-DCBZ5CHZ.js +139 -0
  104. package/dist/chunk-E2RFM6R2.js +1518 -0
  105. package/dist/chunk-EOY6BK4C.js +148 -0
  106. package/dist/chunk-FA4YZFRV.js +392 -0
  107. package/dist/chunk-FVHJCERJ.js +942 -0
  108. package/dist/chunk-G2LGMWNG.js +627 -0
  109. package/dist/chunk-G4STCTY3.js +399 -0
  110. package/dist/chunk-G6XKD7QE.js +77 -0
  111. package/dist/chunk-GSZZLW5Q.js +831 -0
  112. package/dist/chunk-HLVRHBKL.js +1078 -0
  113. package/dist/chunk-HLVRHBKL.js.map +1 -0
  114. package/dist/chunk-HSPMBLKE.js +363 -0
  115. package/dist/chunk-IG627WWY.js +23992 -0
  116. package/dist/chunk-IG627WWY.js.map +1 -0
  117. package/dist/chunk-IJ22WP3G.js +275 -0
  118. package/dist/chunk-IKCP5NCE.js +843 -0
  119. package/dist/chunk-ILSKYRDR.js +169 -0
  120. package/dist/chunk-JAC6JVCI.js +26 -0
  121. package/dist/chunk-JKJQWRLO.js +91 -0
  122. package/dist/chunk-JQH5VG6F.js +5368 -0
  123. package/dist/chunk-JQU2LUZG.js +57 -0
  124. package/dist/chunk-JVH5A3XC.js +8914 -0
  125. package/dist/chunk-JYALBYN7.js +131 -0
  126. package/dist/chunk-KOXDXSKN.js +8939 -0
  127. package/dist/chunk-LOMH4TTC.js +1079 -0
  128. package/dist/chunk-LXQB4ZGE.js +142 -0
  129. package/dist/chunk-M6PN3VH6.js +19 -0
  130. package/dist/chunk-M7IJU77B.js +665 -0
  131. package/dist/chunk-MCJ5I5LR.js +3187 -0
  132. package/dist/chunk-MCJ5I5LR.js.map +1 -0
  133. package/dist/chunk-MVB32GPI.js +592 -0
  134. package/dist/chunk-MXH35PJ5.js +51 -0
  135. package/dist/chunk-MZPS46OR.js +76 -0
  136. package/dist/chunk-NEIUVSDK.js +206 -0
  137. package/dist/chunk-NEOUY3Q7.js +285 -0
  138. package/dist/chunk-NXZCCGES.js +159 -0
  139. package/dist/chunk-P3W6SRSQ.js +455 -0
  140. package/dist/chunk-P5FRWPG7.js +160 -0
  141. package/dist/chunk-PA4W7BCQ.js +23 -0
  142. package/dist/chunk-PQJXIY64.js +97 -0
  143. package/dist/chunk-PTGYM4J6.js +89 -0
  144. package/dist/chunk-QNLJ3GNZ.js +433 -0
  145. package/dist/chunk-QTOZ32SU.js +163 -0
  146. package/dist/chunk-QTOZ32SU.js.map +1 -0
  147. package/dist/chunk-SISA4HQR.js +61 -0
  148. package/dist/chunk-SVAB6KV5.js +219 -0
  149. package/dist/chunk-SVAB6KV5.js.map +1 -0
  150. package/dist/chunk-SVM3DGAQ.js +228 -0
  151. package/dist/chunk-TP7HKSBX.js +172 -0
  152. package/dist/chunk-TRPJJMCS.js +346 -0
  153. package/dist/chunk-UNX6BS4U.js +3868 -0
  154. package/dist/chunk-VD73V44J.js +344 -0
  155. package/dist/chunk-VL65H6YM.js +846 -0
  156. package/dist/chunk-WTJSMYY2.js +4249 -0
  157. package/dist/chunk-WTJSMYY2.js.map +1 -0
  158. package/dist/chunk-X7F4Z6UM.js +156 -0
  159. package/dist/chunk-YW7VMU5L.js +654 -0
  160. package/dist/chunk-YW7VMU5L.js.map +1 -0
  161. package/dist/chunk-ZCQVKDHV.js +98 -0
  162. package/dist/chunk-ZJSGGJ5R.js +167 -0
  163. package/dist/claim-SLGYOOWD.js +197 -0
  164. package/dist/cli.js +36 -36
  165. package/dist/companies-IVMH6YII.js +195 -0
  166. package/dist/complete-45L2FI2X.js +81 -0
  167. package/dist/connect-S54TJ6OV.js +42 -0
  168. package/dist/conversation-RIOL3OJ7.js +93 -0
  169. package/dist/conversion-report-REOHVLCI.js +125 -0
  170. package/dist/conversion-upload-command-W4GELHIQ.js +438 -0
  171. package/dist/conversion-writes-ECZBVY7D.js +120 -0
  172. package/dist/conversions-5QCSCRLI.js +76 -0
  173. package/dist/conversions-TKIXNSYR.js +135 -0
  174. package/dist/copy-writes-D2RTHAL6.js +167 -0
  175. package/dist/copy-writes-D2RTHAL6.js.map +1 -0
  176. package/dist/create-7JY2PTIZ.js +132 -0
  177. package/dist/create-ACLCRXQP.js +59 -0
  178. package/dist/create-KYBMFD32.js +207 -0
  179. package/dist/create-VAPJ52GJ.js +235 -0
  180. package/dist/creatives-5I3G5YP3.js +182 -0
  181. package/dist/creatives-MZ6ICNSY.js +88 -0
  182. package/dist/creatives-MZ6ICNSY.js.map +1 -0
  183. package/dist/creatives-PCAGWPW3.js +58 -0
  184. package/dist/credentials-YTQ6BHWV.js +287 -0
  185. package/dist/critique-BHYJYZDV.js +1458 -0
  186. package/dist/critique-NRHUPIWF.js +227 -0
  187. package/dist/crm-IKTWHWEB.js +318 -0
  188. package/dist/crm-N7K57LZJ.js +224 -0
  189. package/dist/currency-PW7HIBZ6.js +88 -0
  190. package/dist/custom-conversions-FIP6ZS34.js +127 -0
  191. package/dist/custom-conversions-FIP6ZS34.js.map +1 -0
  192. package/dist/customers-NLU7NYDC.js +56 -0
  193. package/dist/delete-26J3X3ZH.js +64 -0
  194. package/dist/delete-A4F5Z54J.js +66 -0
  195. package/dist/delete-EVXOFT2H.js +54 -0
  196. package/dist/demographics-VZKFMM4X.js +138 -0
  197. package/dist/discard-ULRVUJDV.js +66 -0
  198. package/dist/discover-PVXWX2WL.js +172 -0
  199. package/dist/domain-L4WCCX7R.js +98 -0
  200. package/dist/draft-34CGWUVA.js +281 -0
  201. package/dist/draft-4P3YO67N.js +332 -0
  202. package/dist/draft-4P3YO67N.js.map +1 -0
  203. package/dist/draft-57OQKHZI.js +306 -0
  204. package/dist/draft-L45PGCYZ.js +237 -0
  205. package/dist/draft-L45PGCYZ.js.map +1 -0
  206. package/dist/draft-O4S5RKWK.js +217 -0
  207. package/dist/draft-PAYD6GIM.js +307 -0
  208. package/dist/engine/index.js +9 -9
  209. package/dist/experiment-7N4QFRWV.js +1397 -0
  210. package/dist/facets-EHQKGGJ2.js +114 -0
  211. package/dist/feedback-O3H42V4I.js +106 -0
  212. package/dist/feedback-record-FAPN2GBS.js +260 -0
  213. package/dist/fetch-ETKT2RBC.js +176 -0
  214. package/dist/find-FSQAEGGF.js +134 -0
  215. package/dist/fit-UJQ47C4A.js +62 -0
  216. package/dist/flows-T22B77J3.js +247 -0
  217. package/dist/fonts-7VWBQPJF.js +36 -0
  218. package/dist/forecast-HB3RDBQN.js +168 -0
  219. package/dist/forecast-OI7YWZ6F.js +118 -0
  220. package/dist/funnel-7OA33VRP.js +394 -0
  221. package/dist/ga4-LPDIBNYP.js +55 -0
  222. package/dist/generate-OMXBFGGR.js +263 -0
  223. package/dist/get-2RSN4N3J.js +56 -0
  224. package/dist/get-6N7QJMIP.js +79 -0
  225. package/dist/google-5ESVO76E.js +136 -0
  226. package/dist/google-6JZBJ2ZQ.js +3265 -0
  227. package/dist/google-ads-G7REKD4A.js +195 -0
  228. package/dist/gsc-FIZTQX3N.js +30 -0
  229. package/dist/history-QKDYBSYM.js +67 -0
  230. package/dist/history-YMK2JNZU.js +133 -0
  231. package/dist/hubspot-BUFS7S33.js +779 -0
  232. package/dist/icon-CSVAZ7NE.js +137 -0
  233. package/dist/ideas-JQT422P7.js +40 -0
  234. package/dist/images-WBNWK2ZH.js +92 -0
  235. package/dist/ingest-RQUJGS7K.js +107 -0
  236. package/dist/ingest-XLTRLCDV.js +23 -0
  237. package/dist/insights-SQLE5NOJ.js +122 -0
  238. package/dist/insights-YWVJMATY.js +424 -0
  239. package/dist/insights-YWVJMATY.js.map +1 -0
  240. package/dist/inspect-KFVAMD4N.js +189 -0
  241. package/dist/inspiration-IX5N724J.js +53 -0
  242. package/dist/instant-experiences-NQ2GWIWL.js +257 -0
  243. package/dist/instant-experiences-NQ2GWIWL.js.map +1 -0
  244. package/dist/intent-4KJGYYHL.js +95 -0
  245. package/dist/keyword-gap-U64KXDR4.js +130 -0
  246. package/dist/keyword-metrics-WYF3QMCW.js +197 -0
  247. package/dist/keywords-for-site-G5L5EP3T.js +128 -0
  248. package/dist/landing-Y6QCTXCZ.js +28 -0
  249. package/dist/languages-7IPVGGW5.js +40 -0
  250. package/dist/leads-4SJ4NJOI.js +90 -0
  251. package/dist/leads-THI37ZMD.js +537 -0
  252. package/dist/leads-THI37ZMD.js.map +1 -0
  253. package/dist/learn-3BDZUWDT.js +204 -0
  254. package/dist/line-item-writes-YXKYR25W.js +208 -0
  255. package/dist/line-items-CKUD2UU4.js +103 -0
  256. package/dist/link-VBYFI7AM.js +64 -0
  257. package/dist/linkedin-UGMAFSGO.js +1057 -0
  258. package/dist/list-6ZNZGRRK.js +151 -0
  259. package/dist/list-ENYDGT3F.js +64 -0
  260. package/dist/list-VSUF2IWT.js +303 -0
  261. package/dist/locations-HM56X2MK.js +67 -0
  262. package/dist/locations-HM56X2MK.js.map +1 -0
  263. package/dist/locations-QJBYWRCN.js +40 -0
  264. package/dist/log-AACKGBDW.js +92 -0
  265. package/dist/logo-VHXH4J6A.js +18 -0
  266. package/dist/make-W2PYZXYF.js +1353 -0
  267. package/dist/map-63CQHWPI.js +433 -0
  268. package/dist/mcp-RKAXC6IP.js +714 -0
  269. package/dist/media-H6B7VDON.js +18 -0
  270. package/dist/media-H6B7VDON.js.map +1 -0
  271. package/dist/media-sources-EZKAJNVD.js +32 -0
  272. package/dist/members-SELIA674.js +44 -0
  273. package/dist/meta-YHDTGJQ6.js +122 -0
  274. package/dist/meta-YHDTGJQ6.js.map +1 -0
  275. package/dist/metrics-V6SKOVNH.js +152 -0
  276. package/dist/models-2XRYXSRA.js +155 -0
  277. package/dist/normalize-VAZPTBDX.js +141 -0
  278. package/dist/options-NSCZSQ5P.js +122 -0
  279. package/dist/organization-SHREKDST.js +881 -0
  280. package/dist/organization-SHREKDST.js.map +1 -0
  281. package/dist/page-photos-CXRG4AXV.js +115 -0
  282. package/dist/page-photos-CXRG4AXV.js.map +1 -0
  283. package/dist/pages-PTWRXAZT.js +66 -0
  284. package/dist/performance-K7E5KAZW.js +24 -0
  285. package/dist/pixels-MYT3TCHZ.js +60 -0
  286. package/dist/pixels-ZZCQUS3J.js +108 -0
  287. package/dist/preview-XOXAAPMQ.js +215 -0
  288. package/dist/preview-XOXAAPMQ.js.map +1 -0
  289. package/dist/promoted-tweet-writes-PKEO6WUK.js +180 -0
  290. package/dist/promoted-tweets-7MXVZRBI.js +119 -0
  291. package/dist/publish-MPMGRV72.js +341 -0
  292. package/dist/query-UD4OIZ3A.js +61 -0
  293. package/dist/reddit-XIHRI3CN.js +26 -0
  294. package/dist/refresh-A27N75NH.js +94 -0
  295. package/dist/release-UKRB5IUN.js +60 -0
  296. package/dist/relevant-pages-VXSHEOU2.js +99 -0
  297. package/dist/remove-AFNFVPZY.js +50 -0
  298. package/dist/reopen-M5HE6J3G.js +63 -0
  299. package/dist/rerun-5THJLQQJ.js +90 -0
  300. package/dist/research-JHDWWFL7.js +62 -0
  301. package/dist/research-U7RQXMYH.js +262 -0
  302. package/dist/reset-4CCWB2RT.js +54 -0
  303. package/dist/reset-J3KCWFMZ.js +54 -0
  304. package/dist/resolve-HEK27ANI.js +121 -0
  305. package/dist/retry-HPZIUG2S.js +62 -0
  306. package/dist/retry-VVI6N6UR.js +60 -0
  307. package/dist/rule-writes-6ZCAJDYZ.js +522 -0
  308. package/dist/rule-writes-6ZCAJDYZ.js.map +1 -0
  309. package/dist/rules-BMYOY2BM.js +216 -0
  310. package/dist/rules-BMYOY2BM.js.map +1 -0
  311. package/dist/rules-YLLFDZEM.js +96 -0
  312. package/dist/rules-add-U2GU4AGP.js +462 -0
  313. package/dist/run-M7ZDE6IA.js +66 -0
  314. package/dist/run-V5YQB6TH.js +65 -0
  315. package/dist/scaffold-ad-H4GJOKAW.js +1511 -0
  316. package/dist/scaffold-static-ad-2YIFHCTL.js +1005 -0
  317. package/dist/scaffold-video-3EJLKR2O.js +883 -0
  318. package/dist/schedule-QMOKWTJ3.js +61 -0
  319. package/dist/scheduled-agents-FCQHQ6KR.js +50 -0
  320. package/dist/schema-THFLCMBN.js +132 -0
  321. package/dist/schema-XKEEAUXP.js +69 -0
  322. package/dist/search-XIUYSWO6.js +174 -0
  323. package/dist/select-I22NPSIW.js +101 -0
  324. package/dist/set-prompt-S75OMQ7L.js +193 -0
  325. package/dist/setup-links-QVI6NAOK.js +141 -0
  326. package/dist/shared-3IBNDEFL.js +31 -0
  327. package/dist/site-PZPJY33N.js +177 -0
  328. package/dist/sources-ER7ANNG3.js +454 -0
  329. package/dist/sources-VA23PDND.js +30 -0
  330. package/dist/stale-MHTU2NQJ.js +71 -0
  331. package/dist/stats-ZAGJH4AD.js +34 -0
  332. package/dist/status-ABMJBCPJ.js +62 -0
  333. package/dist/stock-6SHHLSKG.js +179 -0
  334. package/dist/studies-4NIV4D5Y.js +249 -0
  335. package/dist/studies-4NIV4D5Y.js.map +1 -0
  336. package/dist/studio-ZLCGXFAN.js +49 -0
  337. package/dist/study-writes-L2AA2PGL.js +467 -0
  338. package/dist/study-writes-L2AA2PGL.js.map +1 -0
  339. package/dist/sync-QDD3MRJ6.js +54 -0
  340. package/dist/sync-definition-2EBSQA6A.js +64 -0
  341. package/dist/tag-manager-3CJ66GKJ.js +43 -0
  342. package/dist/tags-5JYOEYIT.js +20 -0
  343. package/dist/tags-B473RWAA.js +224 -0
  344. package/dist/tags-EWHPUM2V.js +20 -0
  345. package/dist/tags-KBCX6BDU.js +26 -0
  346. package/dist/tags-PEWN6GNZ.js +20 -0
  347. package/dist/targeting-LNDQV4EK.js +759 -0
  348. package/dist/targeting-LNDQV4EK.js.map +1 -0
  349. package/dist/targeting-criteria-EU65WUUF.js +113 -0
  350. package/dist/targets-KVXS5QKM.js +103 -0
  351. package/dist/testimonials-GR6TIS5S.js +32 -0
  352. package/dist/themes-JWWTOR3I.js +94 -0
  353. package/dist/top-companies-OOX3DITI.js +108 -0
  354. package/dist/translate-GEFUP6KQ.js +604 -0
  355. package/dist/triggers-OX2GKG4Y.js +142 -0
  356. package/dist/unlink-3USEPJSA.js +67 -0
  357. package/dist/unstage-VSCNPTAC.js +85 -0
  358. package/dist/update-6JKTH65B.js +152 -0
  359. package/dist/update-FG4ELXYJ.js +98 -0
  360. package/dist/update-GZFKHA3A.js +188 -0
  361. package/dist/update-HZHG67N6.js +63 -0
  362. package/dist/upload-BKCQ6FRW.js +126 -0
  363. package/dist/url-options-HCVRPZYU.js +130 -0
  364. package/dist/url-params-UN4DRN2H.js +98 -0
  365. package/dist/validate-NOWIOAHE.js +117 -0
  366. package/dist/videos-XMTDEHEJ.js +39 -0
  367. package/dist/viewer-check-U4XZMMS7.js +80 -0
  368. package/dist/viewer-check-U4XZMMS7.js.map +1 -0
  369. package/dist/web-UGU7YMII.js +140 -0
  370. package/dist/winning-ads-QOAYIR5U.js +84 -0
  371. package/dist/write-commands-6VR2UD3T.js +1024 -0
  372. package/dist/write-commands-PEJBTME6.js +1165 -0
  373. package/dist/write-commands-PEJBTME6.js.map +1 -0
  374. package/dist/x-VCSMV7T5.js +47 -0
  375. package/package.json +1 -1
  376. package/dist/account-7LUQWY6Q.js +0 -49
  377. package/dist/account-7LUQWY6Q.js.map +0 -1
  378. package/dist/account-ELL7ZZLM.js +0 -80
  379. package/dist/account-YVQGH2GB.js +0 -79
  380. package/dist/account-reads-5B4FFOZU.js +0 -218
  381. package/dist/account-writes-CEPERFD6.js +0 -66
  382. package/dist/accounts-6WNFCGUW.js +0 -611
  383. package/dist/accounts-UA2ZWRN4.js +0 -75
  384. package/dist/accounts-ZIE7J6RR.js +0 -77
  385. package/dist/actions-QZQTB3KR.js +0 -55
  386. package/dist/activecampaign-LIXWDX74.js +0 -935
  387. package/dist/activities-IQPJPP4B.js +0 -74
  388. package/dist/ad-group-writes-XGSCEQTW.js +0 -170
  389. package/dist/ad-groups-GKOLDGET.js +0 -68
  390. package/dist/ad-writes-VVD36JKH.js +0 -174
  391. package/dist/add-HQFI5UVS.js +0 -302
  392. package/dist/add-JWJP4CQY.js +0 -104
  393. package/dist/ads-EKZVHKPN.js +0 -77
  394. package/dist/ads-F365TPXO.js +0 -40
  395. package/dist/ads-HXX2IAFF.js +0 -113
  396. package/dist/ads-HXX2IAFF.js.map +0 -1
  397. package/dist/adsets-LPN6WFGF.js +0 -176
  398. package/dist/adsets-LPN6WFGF.js.map +0 -1
  399. package/dist/advertisers-TPIS4R73.js +0 -120
  400. package/dist/analytics-AFW7ESJW.js +0 -1976
  401. package/dist/analytics-QG7TBGMC.js +0 -433
  402. package/dist/animate-G4P3OEJE.js +0 -480
  403. package/dist/assign-VKINQVCJ.js +0 -77
  404. package/dist/audience-size-6ZEWCPX6.js +0 -73
  405. package/dist/audiences-BU4JZJT7.js +0 -268
  406. package/dist/audiences-XEZHACKH.js +0 -78
  407. package/dist/audiences-XEZHACKH.js.map +0 -1
  408. package/dist/audit-5US7TTUF.js +0 -151
  409. package/dist/autocomplete-XBVLHJ4R.js +0 -111
  410. package/dist/avatars-5IBVOF63.js +0 -38
  411. package/dist/bid-pricing-EFYUHTWP.js +0 -100
  412. package/dist/brand-Z5KRGJX4.js +0 -22
  413. package/dist/brief-DGAZ6NJG.js +0 -538
  414. package/dist/businesses-PRRYPR7H.js +0 -53
  415. package/dist/campaign-groups-AOMTKPUY.js +0 -95
  416. package/dist/campaign-writes-NSEJCINS.js +0 -170
  417. package/dist/campaign-writes-NXVLFVZ6.js +0 -165
  418. package/dist/campaign-writes-NXVLFVZ6.js.map +0 -1
  419. package/dist/campaigns-4SOLY7OR.js +0 -110
  420. package/dist/campaigns-4SOLY7OR.js.map +0 -1
  421. package/dist/campaigns-UELLCVI2.js +0 -109
  422. package/dist/campaigns-VWN2XPK2.js +0 -76
  423. package/dist/campaigns-WE42FQKM.js +0 -107
  424. package/dist/canvas-DG3CJ7FA.js +0 -46
  425. package/dist/capabilities-FDCILMJK.js +0 -144
  426. package/dist/catalog-KZNB2YJS.js +0 -65
  427. package/dist/catalogs-XH5NHH4C.js +0 -128
  428. package/dist/changes-DKP263OZ.js +0 -135
  429. package/dist/chatgpt-K6KNTME4.js +0 -47
  430. package/dist/chats-NFSZEF5L.js +0 -262
  431. package/dist/chats-NFSZEF5L.js.map +0 -1
  432. package/dist/check-6UVMPPNH.js +0 -104
  433. package/dist/chunk-2GT76KEX.js +0 -285
  434. package/dist/chunk-33XFNSBM.js +0 -433
  435. package/dist/chunk-36SU43V2.js +0 -6306
  436. package/dist/chunk-3BKNGXCL.js +0 -23992
  437. package/dist/chunk-3BKNGXCL.js.map +0 -1
  438. package/dist/chunk-3VCHJN2B.js +0 -627
  439. package/dist/chunk-5562QFVB.js +0 -275
  440. package/dist/chunk-5QW4OQM4.js +0 -831
  441. package/dist/chunk-5SRHACZW.js +0 -274
  442. package/dist/chunk-5SRHACZW.js.map +0 -1
  443. package/dist/chunk-6JWEGFM5.js +0 -174
  444. package/dist/chunk-6JWEGFM5.js.map +0 -1
  445. package/dist/chunk-6KULDLLR.js +0 -547
  446. package/dist/chunk-6OIKNJ7G.js +0 -26
  447. package/dist/chunk-6TG4CAYD.js +0 -19
  448. package/dist/chunk-6VZHOXP6.js +0 -172
  449. package/dist/chunk-7RBJ2Z7Z.js +0 -172
  450. package/dist/chunk-7RBJ2Z7Z.js.map +0 -1
  451. package/dist/chunk-7RKUHTS6.js +0 -224
  452. package/dist/chunk-AGVCQHQK.js +0 -344
  453. package/dist/chunk-AJ45PER5.js +0 -57
  454. package/dist/chunk-AL3VGEG5.js +0 -665
  455. package/dist/chunk-AQMMAB2N.js +0 -197
  456. package/dist/chunk-B6VCTXSD.js +0 -97
  457. package/dist/chunk-B7FVPHCW.js +0 -843
  458. package/dist/chunk-BITS62MF.js +0 -77
  459. package/dist/chunk-C4MJ3WPQ.js +0 -592
  460. package/dist/chunk-C6BFE4X2.js +0 -51
  461. package/dist/chunk-D2YHDDKW.js +0 -23
  462. package/dist/chunk-E4GWQFTL.js +0 -66
  463. package/dist/chunk-EIDTAHUC.js +0 -191
  464. package/dist/chunk-ERRMJ7AZ.js +0 -169
  465. package/dist/chunk-EZ5KY6I2.js +0 -1079
  466. package/dist/chunk-F3CZFUXZ.js +0 -3187
  467. package/dist/chunk-F3CZFUXZ.js.map +0 -1
  468. package/dist/chunk-F5IH7G2F.js +0 -1919
  469. package/dist/chunk-GFTDR3Z2.js +0 -604
  470. package/dist/chunk-GGY2KH3K.js +0 -249
  471. package/dist/chunk-GOJXKIFQ.js +0 -1605
  472. package/dist/chunk-GOJXKIFQ.js.map +0 -1
  473. package/dist/chunk-GYJQV3IX.js +0 -225
  474. package/dist/chunk-H5HDZ7IC.js +0 -139
  475. package/dist/chunk-HVI4DNZL.js +0 -103
  476. package/dist/chunk-HY4G44UC.js +0 -156
  477. package/dist/chunk-I2WRZJAC.js +0 -46
  478. package/dist/chunk-IHUIXQBP.js +0 -206
  479. package/dist/chunk-IMWXYSCP.js +0 -392
  480. package/dist/chunk-KIGGMKAE.js +0 -66
  481. package/dist/chunk-KIGGMKAE.js.map +0 -1
  482. package/dist/chunk-KPYDTIAI.js +0 -317
  483. package/dist/chunk-L63JZLCX.js +0 -647
  484. package/dist/chunk-L63JZLCX.js.map +0 -1
  485. package/dist/chunk-M2D7ZWEU.js +0 -150
  486. package/dist/chunk-MP5IMGKF.js +0 -148
  487. package/dist/chunk-NA2KOPW6.js +0 -363
  488. package/dist/chunk-NAA4CKZZ.js +0 -4249
  489. package/dist/chunk-NAA4CKZZ.js.map +0 -1
  490. package/dist/chunk-NDVAOHMY.js +0 -903
  491. package/dist/chunk-NLUFREI6.js +0 -160
  492. package/dist/chunk-OKLYOMQ3.js +0 -1606
  493. package/dist/chunk-ONVPV23E.js +0 -122
  494. package/dist/chunk-OP7DNHD2.js +0 -137
  495. package/dist/chunk-OP7DNHD2.js.map +0 -1
  496. package/dist/chunk-OWRFIAW2.js +0 -91
  497. package/dist/chunk-P5ENZXC2.js +0 -64
  498. package/dist/chunk-QK76OM22.js +0 -297
  499. package/dist/chunk-R5IZ6P3E.js +0 -3868
  500. package/dist/chunk-RBIWYPJQ.js +0 -159
  501. package/dist/chunk-RESDRJRP.js +0 -399
  502. package/dist/chunk-RGX7AQ2K.js +0 -131
  503. package/dist/chunk-RWLQYW2L.js +0 -8939
  504. package/dist/chunk-S7B2TOOU.js +0 -98
  505. package/dist/chunk-SIKCVWM3.js +0 -76
  506. package/dist/chunk-TBZPXGEW.js +0 -142
  507. package/dist/chunk-TFJW5CXD.js +0 -5368
  508. package/dist/chunk-TPS3X5DI.js +0 -89
  509. package/dist/chunk-UM7ESCIN.js +0 -846
  510. package/dist/chunk-UWDYGSJF.js +0 -61
  511. package/dist/chunk-V57TZQPI.js +0 -228
  512. package/dist/chunk-VLKYUZF7.js +0 -346
  513. package/dist/chunk-VYZ4KQ3C.js +0 -942
  514. package/dist/chunk-WRMMJUNJ.js +0 -494
  515. package/dist/chunk-WY5H3XYC.js +0 -167
  516. package/dist/chunk-XLJVJ5TK.js +0 -1518
  517. package/dist/chunk-Y2GH4YWA.js +0 -207
  518. package/dist/chunk-YSB26POP.js +0 -8914
  519. package/dist/chunk-YT2ZSPWF.js +0 -455
  520. package/dist/claim-7CB6TVEW.js +0 -197
  521. package/dist/companies-CACKHSY5.js +0 -195
  522. package/dist/complete-IHLTYFT2.js +0 -81
  523. package/dist/connect-J722BTO4.js +0 -42
  524. package/dist/conversation-HRNJJJW5.js +0 -93
  525. package/dist/conversion-report-KL4LIVY5.js +0 -125
  526. package/dist/conversion-upload-command-WT6C35QL.js +0 -438
  527. package/dist/conversion-writes-MPBCTVSP.js +0 -120
  528. package/dist/conversions-ACYT6K7H.js +0 -76
  529. package/dist/conversions-DE7W5T4Z.js +0 -135
  530. package/dist/create-6ZDLKC4F.js +0 -59
  531. package/dist/create-7YO6DAAT.js +0 -207
  532. package/dist/create-W7OTXLCZ.js +0 -132
  533. package/dist/create-ZU7AHBYM.js +0 -235
  534. package/dist/creatives-6UYAAC5E.js +0 -58
  535. package/dist/creatives-XUIY3MQI.js +0 -182
  536. package/dist/creatives-YJ3CXZQC.js +0 -87
  537. package/dist/creatives-YJ3CXZQC.js.map +0 -1
  538. package/dist/credentials-ADGJKYA7.js +0 -287
  539. package/dist/critique-BBHPASRE.js +0 -227
  540. package/dist/critique-T7QGPPEX.js +0 -1458
  541. package/dist/crm-EKDV2SET.js +0 -224
  542. package/dist/crm-MXT2HUKU.js +0 -318
  543. package/dist/currency-TBBXPWXU.js +0 -88
  544. package/dist/custom-conversions-YRYE65PU.js +0 -125
  545. package/dist/custom-conversions-YRYE65PU.js.map +0 -1
  546. package/dist/customers-EZEVYT4Z.js +0 -56
  547. package/dist/delete-3UDIH2ZD.js +0 -66
  548. package/dist/delete-4L3HO5B6.js +0 -54
  549. package/dist/delete-SRU4GRDT.js +0 -64
  550. package/dist/demographics-3OWQDW7B.js +0 -138
  551. package/dist/discard-UEMA5UHL.js +0 -66
  552. package/dist/discover-RTV5XWRI.js +0 -172
  553. package/dist/domain-6324IS6I.js +0 -98
  554. package/dist/draft-2KS56KCT.js +0 -307
  555. package/dist/draft-777O2UIX.js +0 -217
  556. package/dist/draft-EWDOIXSH.js +0 -233
  557. package/dist/draft-EWDOIXSH.js.map +0 -1
  558. package/dist/draft-GRL7577L.js +0 -306
  559. package/dist/draft-VOFJXUOC.js +0 -328
  560. package/dist/draft-VOFJXUOC.js.map +0 -1
  561. package/dist/draft-VXGZDBC7.js +0 -281
  562. package/dist/experiment-G3FQVAJU.js +0 -1397
  563. package/dist/facets-YV6NORA6.js +0 -114
  564. package/dist/feedback-YITFVOHX.js +0 -106
  565. package/dist/feedback-record-FW2QWFYQ.js +0 -260
  566. package/dist/fetch-EYXLTSKW.js +0 -176
  567. package/dist/find-EVY4XEIQ.js +0 -134
  568. package/dist/fit-KEFUU7QA.js +0 -62
  569. package/dist/flows-EJV7WMGD.js +0 -247
  570. package/dist/fonts-DMIBVZ6D.js +0 -36
  571. package/dist/forecast-5YKQZSE7.js +0 -118
  572. package/dist/forecast-G43FKEZE.js +0 -168
  573. package/dist/funnel-ND7OXIKT.js +0 -394
  574. package/dist/ga4-2BL5YAYN.js +0 -55
  575. package/dist/generate-D3LUXFJT.js +0 -263
  576. package/dist/get-GB6SPWCA.js +0 -79
  577. package/dist/get-PU3YHQWN.js +0 -56
  578. package/dist/google-7STODZQR.js +0 -136
  579. package/dist/google-MHB5TOFN.js +0 -3265
  580. package/dist/google-ads-XGEGKEL6.js +0 -195
  581. package/dist/gsc-UU3T2C6B.js +0 -30
  582. package/dist/history-NYWAMWAY.js +0 -133
  583. package/dist/history-OQAOTEO3.js +0 -67
  584. package/dist/hubspot-LMIVY7FR.js +0 -779
  585. package/dist/icon-GB7UH5RF.js +0 -137
  586. package/dist/ideas-W4IIVOZ4.js +0 -40
  587. package/dist/images-PPMIMPTS.js +0 -92
  588. package/dist/ingest-2YGWBWAB.js +0 -107
  589. package/dist/ingest-FRDTTPYD.js +0 -23
  590. package/dist/insights-4HT2NAYP.js +0 -423
  591. package/dist/insights-4HT2NAYP.js.map +0 -1
  592. package/dist/insights-PZXFCMX2.js +0 -122
  593. package/dist/inspect-QF2S3U2E.js +0 -189
  594. package/dist/inspiration-XQYHBJY2.js +0 -53
  595. package/dist/intent-JJTDJ732.js +0 -95
  596. package/dist/keyword-gap-4NQN56JP.js +0 -130
  597. package/dist/keyword-metrics-QCIOBMTW.js +0 -197
  598. package/dist/keywords-for-site-FS635JXM.js +0 -128
  599. package/dist/landing-6H5QEHOW.js +0 -28
  600. package/dist/languages-FNE45NXJ.js +0 -40
  601. package/dist/leads-2XOSAYP4.js +0 -293
  602. package/dist/leads-2XOSAYP4.js.map +0 -1
  603. package/dist/leads-MKLSWZO6.js +0 -90
  604. package/dist/learn-C564OA7W.js +0 -204
  605. package/dist/line-item-writes-K7QNWRQ3.js +0 -208
  606. package/dist/line-items-TBTHVKCZ.js +0 -103
  607. package/dist/link-CPJJ6T4M.js +0 -64
  608. package/dist/linkedin-HGUK624E.js +0 -1057
  609. package/dist/list-AAT5CWDA.js +0 -303
  610. package/dist/list-N5SJXLYF.js +0 -64
  611. package/dist/list-OKDU5W4D.js +0 -151
  612. package/dist/locations-FTDI4FBI.js +0 -40
  613. package/dist/locations-VL2G22Y5.js +0 -67
  614. package/dist/locations-VL2G22Y5.js.map +0 -1
  615. package/dist/log-KVRWIJS5.js +0 -92
  616. package/dist/logo-YSNUUT33.js +0 -18
  617. package/dist/make-4NTHJ4TG.js +0 -1353
  618. package/dist/map-HQ43MKEC.js +0 -433
  619. package/dist/mcp-MFLUHPL5.js +0 -714
  620. package/dist/media-ES2UBGYW.js +0 -15
  621. package/dist/media-ES2UBGYW.js.map +0 -1
  622. package/dist/media-sources-A4ICRSKB.js +0 -32
  623. package/dist/members-NRKQSSVS.js +0 -44
  624. package/dist/meta-AOIPEDV5.js +0 -69
  625. package/dist/meta-AOIPEDV5.js.map +0 -1
  626. package/dist/metrics-3BRTJNGW.js +0 -152
  627. package/dist/models-IH6KE6OH.js +0 -155
  628. package/dist/normalize-EH6BTBOB.js +0 -141
  629. package/dist/options-YEPQXXRY.js +0 -122
  630. package/dist/organization-XSWT7S5S.js +0 -836
  631. package/dist/organization-XSWT7S5S.js.map +0 -1
  632. package/dist/pages-FTI44OSH.js +0 -66
  633. package/dist/performance-YJVMM6DL.js +0 -24
  634. package/dist/pixels-DWW2TDY2.js +0 -60
  635. package/dist/pixels-MBKR4XPX.js +0 -108
  636. package/dist/preview-V4YBD45S.js +0 -169
  637. package/dist/preview-V4YBD45S.js.map +0 -1
  638. package/dist/promoted-tweet-writes-M5OVEBC5.js +0 -180
  639. package/dist/promoted-tweets-2MOIERNB.js +0 -119
  640. package/dist/publish-NPENZIHV.js +0 -341
  641. package/dist/query-3OMCFGLU.js +0 -61
  642. package/dist/reddit-LI37G5LS.js +0 -26
  643. package/dist/refresh-4BBV5SPL.js +0 -94
  644. package/dist/release-4X3TLMQT.js +0 -60
  645. package/dist/relevant-pages-DIYZM6FJ.js +0 -99
  646. package/dist/remove-Q4AES5UH.js +0 -50
  647. package/dist/reopen-SDTPL3BN.js +0 -63
  648. package/dist/rerun-NA3MH4HG.js +0 -90
  649. package/dist/research-5H265UV7.js +0 -262
  650. package/dist/research-LXQRNAQ2.js +0 -62
  651. package/dist/reset-42M5IKDI.js +0 -54
  652. package/dist/reset-52PU3CVD.js +0 -54
  653. package/dist/resolve-R4IACKIZ.js +0 -121
  654. package/dist/retry-FPF42ZNG.js +0 -62
  655. package/dist/retry-RTQGAH6G.js +0 -60
  656. package/dist/rules-CGNYJYVC.js +0 -96
  657. package/dist/rules-add-EO5476BF.js +0 -462
  658. package/dist/run-3AZJ3UQU.js +0 -66
  659. package/dist/run-AFMTXJTU.js +0 -65
  660. package/dist/scaffold-ad-OGU2IINY.js +0 -1511
  661. package/dist/scaffold-static-ad-HO4BJW4H.js +0 -1005
  662. package/dist/scaffold-video-TLQ4WSDK.js +0 -883
  663. package/dist/schedule-AWWMI5FO.js +0 -61
  664. package/dist/scheduled-agents-ELLU7BSE.js +0 -50
  665. package/dist/schema-BOOZEJPA.js +0 -69
  666. package/dist/schema-QNVLKMKG.js +0 -132
  667. package/dist/search-BZNIB2XF.js +0 -174
  668. package/dist/select-NLWZIQ7L.js +0 -101
  669. package/dist/set-prompt-QKW2L553.js +0 -193
  670. package/dist/setup-links-NMSQ4BG7.js +0 -141
  671. package/dist/shared-NDRFKAH7.js +0 -31
  672. package/dist/site-GGYFBZT5.js +0 -177
  673. package/dist/sources-KTGDMUV4.js +0 -30
  674. package/dist/sources-LPQZDTIU.js +0 -454
  675. package/dist/stale-C5JLQ4D2.js +0 -71
  676. package/dist/stats-RCLQE4HJ.js +0 -34
  677. package/dist/status-6PS3HDS5.js +0 -62
  678. package/dist/stock-ECRBD7RP.js +0 -179
  679. package/dist/studio-LMDDQWRY.js +0 -49
  680. package/dist/sync-XSATDLE6.js +0 -54
  681. package/dist/sync-definition-LSGDHMHV.js +0 -64
  682. package/dist/tag-manager-G3LBQZUL.js +0 -43
  683. package/dist/tags-5Y7TPJNZ.js +0 -20
  684. package/dist/tags-6TT5ZJVX.js +0 -26
  685. package/dist/tags-BQLIOWS4.js +0 -20
  686. package/dist/tags-EXWKO6Q6.js +0 -224
  687. package/dist/tags-OK34UGSM.js +0 -20
  688. package/dist/targeting-criteria-AWPMOX4V.js +0 -113
  689. package/dist/targets-EXYCOHEX.js +0 -103
  690. package/dist/testimonials-BTYMR3U4.js +0 -32
  691. package/dist/themes-AOU4ZZXL.js +0 -94
  692. package/dist/top-companies-FRPAURAH.js +0 -108
  693. package/dist/translate-SF234KLG.js +0 -604
  694. package/dist/triggers-SJUXDU3X.js +0 -142
  695. package/dist/unlink-RIZD3XTI.js +0 -67
  696. package/dist/unstage-MKTIVI3I.js +0 -85
  697. package/dist/update-COHXM25C.js +0 -152
  698. package/dist/update-NKX2GXAR.js +0 -63
  699. package/dist/update-OXVZXDYH.js +0 -98
  700. package/dist/update-SZLYEEU4.js +0 -188
  701. package/dist/upload-LEDO3IRC.js +0 -126
  702. package/dist/url-options-Q5SL42CV.js +0 -130
  703. package/dist/url-params-KP6D7BF3.js +0 -98
  704. package/dist/validate-7QWQZ2OL.js +0 -117
  705. package/dist/videos-VABK4KHJ.js +0 -39
  706. package/dist/viewer-check-I45HHWSW.js +0 -80
  707. package/dist/web-DZGUPZYQ.js +0 -140
  708. package/dist/winning-ads-6MDLRSKM.js +0 -84
  709. package/dist/write-commands-3VIK3VC4.js +0 -1024
  710. package/dist/write-commands-HCQI4Y27.js +0 -737
  711. package/dist/write-commands-HCQI4Y27.js.map +0 -1
  712. package/dist/x-GRDU7QC2.js +0 -47
  713. /package/dist/{account-ELL7ZZLM.js.map → account-3H6BZO5H.js.map} +0 -0
  714. /package/dist/{account-YVQGH2GB.js.map → account-KNRDOUJP.js.map} +0 -0
  715. /package/dist/{account-reads-5B4FFOZU.js.map → account-reads-GA6FVKLE.js.map} +0 -0
  716. /package/dist/{account-writes-CEPERFD6.js.map → account-writes-AE5IJGGW.js.map} +0 -0
  717. /package/dist/{accounts-UA2ZWRN4.js.map → accounts-K4INATCW.js.map} +0 -0
  718. /package/dist/{accounts-6WNFCGUW.js.map → accounts-RTN5ZGTU.js.map} +0 -0
  719. /package/dist/{accounts-ZIE7J6RR.js.map → accounts-RW6KXBOQ.js.map} +0 -0
  720. /package/dist/{actions-QZQTB3KR.js.map → actions-HNLISA7T.js.map} +0 -0
  721. /package/dist/{activecampaign-LIXWDX74.js.map → activecampaign-I5CILZPU.js.map} +0 -0
  722. /package/dist/{activities-IQPJPP4B.js.map → activities-T253KK4Q.js.map} +0 -0
  723. /package/dist/{ad-group-writes-XGSCEQTW.js.map → ad-group-writes-VRSBI2Z2.js.map} +0 -0
  724. /package/dist/{ad-groups-GKOLDGET.js.map → ad-groups-IEBVEAMS.js.map} +0 -0
  725. /package/dist/{ad-writes-VVD36JKH.js.map → ad-writes-ALV4KFPZ.js.map} +0 -0
  726. /package/dist/{add-HQFI5UVS.js.map → add-6WKPFMLG.js.map} +0 -0
  727. /package/dist/{add-JWJP4CQY.js.map → add-XF5COUAS.js.map} +0 -0
  728. /package/dist/{ads-EKZVHKPN.js.map → ads-CQZHD7FC.js.map} +0 -0
  729. /package/dist/{ads-F365TPXO.js.map → ads-QIKZ6O2N.js.map} +0 -0
  730. /package/dist/{advertisers-TPIS4R73.js.map → advertisers-6NUM2Q3A.js.map} +0 -0
  731. /package/dist/{analytics-AFW7ESJW.js.map → analytics-ALOZ7ZZ4.js.map} +0 -0
  732. /package/dist/{analytics-QG7TBGMC.js.map → analytics-VLHE5A2M.js.map} +0 -0
  733. /package/dist/{animate-G4P3OEJE.js.map → animate-SVEPM267.js.map} +0 -0
  734. /package/dist/{connect-J722BTO4.js.map → asset-writes-L5TMKIZC.js.map} +0 -0
  735. /package/dist/{assign-VKINQVCJ.js.map → assign-6HI6TNLP.js.map} +0 -0
  736. /package/dist/{audience-size-6ZEWCPX6.js.map → audience-size-25LP2OBF.js.map} +0 -0
  737. /package/dist/{audiences-BU4JZJT7.js.map → audiences-AAZH56WD.js.map} +0 -0
  738. /package/dist/{audit-5US7TTUF.js.map → audit-YY6X2MPA.js.map} +0 -0
  739. /package/dist/{autocomplete-XBVLHJ4R.js.map → autocomplete-SAWJK4NF.js.map} +0 -0
  740. /package/dist/{avatars-5IBVOF63.js.map → avatars-YSFFRHDK.js.map} +0 -0
  741. /package/dist/{bid-pricing-EFYUHTWP.js.map → bid-pricing-HZ74SLEB.js.map} +0 -0
  742. /package/dist/{brand-Z5KRGJX4.js.map → brand-T3OACVQX.js.map} +0 -0
  743. /package/dist/{brief-DGAZ6NJG.js.map → brief-7S6XCJIA.js.map} +0 -0
  744. /package/dist/{businesses-PRRYPR7H.js.map → businesses-H3HIDQX6.js.map} +0 -0
  745. /package/dist/{campaign-groups-AOMTKPUY.js.map → campaign-groups-YJK767AP.js.map} +0 -0
  746. /package/dist/{campaign-writes-NSEJCINS.js.map → campaign-writes-U5PUVSMT.js.map} +0 -0
  747. /package/dist/{campaigns-UELLCVI2.js.map → campaigns-GALDR5KK.js.map} +0 -0
  748. /package/dist/{campaigns-VWN2XPK2.js.map → campaigns-JEIKY2M4.js.map} +0 -0
  749. /package/dist/{campaigns-WE42FQKM.js.map → campaigns-VTRMKSAT.js.map} +0 -0
  750. /package/dist/{canvas-DG3CJ7FA.js.map → canvas-SVJEQO4V.js.map} +0 -0
  751. /package/dist/{capabilities-FDCILMJK.js.map → capabilities-2KT6TCGZ.js.map} +0 -0
  752. /package/dist/{catalog-KZNB2YJS.js.map → catalog-S32MX453.js.map} +0 -0
  753. /package/dist/{catalogs-XH5NHH4C.js.map → catalogs-OCVXZLIF.js.map} +0 -0
  754. /package/dist/{changes-DKP263OZ.js.map → changes-5TOYRKZR.js.map} +0 -0
  755. /package/dist/{chatgpt-K6KNTME4.js.map → chatgpt-QVF2FD3E.js.map} +0 -0
  756. /package/dist/{check-6UVMPPNH.js.map → check-SLNHVYGS.js.map} +0 -0
  757. /package/dist/{chunk-HVI4DNZL.js.map → chunk-2LI6746F.js.map} +0 -0
  758. /package/dist/{chunk-AQMMAB2N.js.map → chunk-2PWNIEW4.js.map} +0 -0
  759. /package/dist/{chunk-KPYDTIAI.js.map → chunk-2WZI36D3.js.map} +0 -0
  760. /package/dist/{chunk-ONVPV23E.js.map → chunk-3W6G6ARX.js.map} +0 -0
  761. /package/dist/{chunk-OKLYOMQ3.js.map → chunk-45UK4KYJ.js.map} +0 -0
  762. /package/dist/{chunk-GYJQV3IX.js.map → chunk-46GWHUKN.js.map} +0 -0
  763. /package/dist/{chunk-F5IH7G2F.js.map → chunk-4AMIHNNP.js.map} +0 -0
  764. /package/dist/{chunk-7RKUHTS6.js.map → chunk-4KJMLYCD.js.map} +0 -0
  765. /package/dist/{chunk-Y2GH4YWA.js.map → chunk-5HJRZFMW.js.map} +0 -0
  766. /package/dist/{chunk-36SU43V2.js.map → chunk-66QHX566.js.map} +0 -0
  767. /package/dist/{chunk-EIDTAHUC.js.map → chunk-6NCJGU6I.js.map} +0 -0
  768. /package/dist/{chunk-WRMMJUNJ.js.map → chunk-6WCAV27H.js.map} +0 -0
  769. /package/dist/{chunk-E4GWQFTL.js.map → chunk-AO45BX6Q.js.map} +0 -0
  770. /package/dist/{chunk-M2D7ZWEU.js.map → chunk-BDYLILMW.js.map} +0 -0
  771. /package/dist/{chunk-GGY2KH3K.js.map → chunk-BL2MX6CR.js.map} +0 -0
  772. /package/dist/{chunk-GFTDR3Z2.js.map → chunk-BOPC3D6I.js.map} +0 -0
  773. /package/dist/{chunk-I2WRZJAC.js.map → chunk-BTY4LZBG.js.map} +0 -0
  774. /package/dist/{chunk-P5ENZXC2.js.map → chunk-C7NWUCLQ.js.map} +0 -0
  775. /package/dist/{chunk-6KULDLLR.js.map → chunk-D4CKCNGW.js.map} +0 -0
  776. /package/dist/{chunk-QK76OM22.js.map → chunk-D5CUAOQX.js.map} +0 -0
  777. /package/dist/{chunk-NDVAOHMY.js.map → chunk-D5UXWKLQ.js.map} +0 -0
  778. /package/dist/{chunk-H5HDZ7IC.js.map → chunk-DCBZ5CHZ.js.map} +0 -0
  779. /package/dist/{chunk-XLJVJ5TK.js.map → chunk-E2RFM6R2.js.map} +0 -0
  780. /package/dist/{chunk-MP5IMGKF.js.map → chunk-EOY6BK4C.js.map} +0 -0
  781. /package/dist/{chunk-IMWXYSCP.js.map → chunk-FA4YZFRV.js.map} +0 -0
  782. /package/dist/{chunk-VYZ4KQ3C.js.map → chunk-FVHJCERJ.js.map} +0 -0
  783. /package/dist/{chunk-3VCHJN2B.js.map → chunk-G2LGMWNG.js.map} +0 -0
  784. /package/dist/{chunk-RESDRJRP.js.map → chunk-G4STCTY3.js.map} +0 -0
  785. /package/dist/{chunk-BITS62MF.js.map → chunk-G6XKD7QE.js.map} +0 -0
  786. /package/dist/{chunk-5QW4OQM4.js.map → chunk-GSZZLW5Q.js.map} +0 -0
  787. /package/dist/{chunk-NA2KOPW6.js.map → chunk-HSPMBLKE.js.map} +0 -0
  788. /package/dist/{chunk-5562QFVB.js.map → chunk-IJ22WP3G.js.map} +0 -0
  789. /package/dist/{chunk-B7FVPHCW.js.map → chunk-IKCP5NCE.js.map} +0 -0
  790. /package/dist/{chunk-ERRMJ7AZ.js.map → chunk-ILSKYRDR.js.map} +0 -0
  791. /package/dist/{chunk-6OIKNJ7G.js.map → chunk-JAC6JVCI.js.map} +0 -0
  792. /package/dist/{chunk-OWRFIAW2.js.map → chunk-JKJQWRLO.js.map} +0 -0
  793. /package/dist/{chunk-TFJW5CXD.js.map → chunk-JQH5VG6F.js.map} +0 -0
  794. /package/dist/{chunk-AJ45PER5.js.map → chunk-JQU2LUZG.js.map} +0 -0
  795. /package/dist/{chunk-YSB26POP.js.map → chunk-JVH5A3XC.js.map} +0 -0
  796. /package/dist/{chunk-RGX7AQ2K.js.map → chunk-JYALBYN7.js.map} +0 -0
  797. /package/dist/{chunk-RWLQYW2L.js.map → chunk-KOXDXSKN.js.map} +0 -0
  798. /package/dist/{chunk-EZ5KY6I2.js.map → chunk-LOMH4TTC.js.map} +0 -0
  799. /package/dist/{chunk-TBZPXGEW.js.map → chunk-LXQB4ZGE.js.map} +0 -0
  800. /package/dist/{chunk-6TG4CAYD.js.map → chunk-M6PN3VH6.js.map} +0 -0
  801. /package/dist/{chunk-AL3VGEG5.js.map → chunk-M7IJU77B.js.map} +0 -0
  802. /package/dist/{chunk-C4MJ3WPQ.js.map → chunk-MVB32GPI.js.map} +0 -0
  803. /package/dist/{chunk-C6BFE4X2.js.map → chunk-MXH35PJ5.js.map} +0 -0
  804. /package/dist/{chunk-SIKCVWM3.js.map → chunk-MZPS46OR.js.map} +0 -0
  805. /package/dist/{chunk-IHUIXQBP.js.map → chunk-NEIUVSDK.js.map} +0 -0
  806. /package/dist/{chunk-2GT76KEX.js.map → chunk-NEOUY3Q7.js.map} +0 -0
  807. /package/dist/{chunk-RBIWYPJQ.js.map → chunk-NXZCCGES.js.map} +0 -0
  808. /package/dist/{chunk-YT2ZSPWF.js.map → chunk-P3W6SRSQ.js.map} +0 -0
  809. /package/dist/{chunk-NLUFREI6.js.map → chunk-P5FRWPG7.js.map} +0 -0
  810. /package/dist/{chunk-D2YHDDKW.js.map → chunk-PA4W7BCQ.js.map} +0 -0
  811. /package/dist/{chunk-B6VCTXSD.js.map → chunk-PQJXIY64.js.map} +0 -0
  812. /package/dist/{chunk-TPS3X5DI.js.map → chunk-PTGYM4J6.js.map} +0 -0
  813. /package/dist/{chunk-33XFNSBM.js.map → chunk-QNLJ3GNZ.js.map} +0 -0
  814. /package/dist/{chunk-UWDYGSJF.js.map → chunk-SISA4HQR.js.map} +0 -0
  815. /package/dist/{chunk-V57TZQPI.js.map → chunk-SVM3DGAQ.js.map} +0 -0
  816. /package/dist/{chunk-6VZHOXP6.js.map → chunk-TP7HKSBX.js.map} +0 -0
  817. /package/dist/{chunk-VLKYUZF7.js.map → chunk-TRPJJMCS.js.map} +0 -0
  818. /package/dist/{chunk-R5IZ6P3E.js.map → chunk-UNX6BS4U.js.map} +0 -0
  819. /package/dist/{chunk-AGVCQHQK.js.map → chunk-VD73V44J.js.map} +0 -0
  820. /package/dist/{chunk-UM7ESCIN.js.map → chunk-VL65H6YM.js.map} +0 -0
  821. /package/dist/{chunk-HY4G44UC.js.map → chunk-X7F4Z6UM.js.map} +0 -0
  822. /package/dist/{chunk-S7B2TOOU.js.map → chunk-ZCQVKDHV.js.map} +0 -0
  823. /package/dist/{chunk-WY5H3XYC.js.map → chunk-ZJSGGJ5R.js.map} +0 -0
  824. /package/dist/{claim-7CB6TVEW.js.map → claim-SLGYOOWD.js.map} +0 -0
  825. /package/dist/{companies-CACKHSY5.js.map → companies-IVMH6YII.js.map} +0 -0
  826. /package/dist/{complete-IHLTYFT2.js.map → complete-45L2FI2X.js.map} +0 -0
  827. /package/dist/{customers-EZEVYT4Z.js.map → connect-S54TJ6OV.js.map} +0 -0
  828. /package/dist/{conversation-HRNJJJW5.js.map → conversation-RIOL3OJ7.js.map} +0 -0
  829. /package/dist/{conversion-report-KL4LIVY5.js.map → conversion-report-REOHVLCI.js.map} +0 -0
  830. /package/dist/{conversion-upload-command-WT6C35QL.js.map → conversion-upload-command-W4GELHIQ.js.map} +0 -0
  831. /package/dist/{conversion-writes-MPBCTVSP.js.map → conversion-writes-ECZBVY7D.js.map} +0 -0
  832. /package/dist/{conversions-ACYT6K7H.js.map → conversions-5QCSCRLI.js.map} +0 -0
  833. /package/dist/{conversions-DE7W5T4Z.js.map → conversions-TKIXNSYR.js.map} +0 -0
  834. /package/dist/{create-W7OTXLCZ.js.map → create-7JY2PTIZ.js.map} +0 -0
  835. /package/dist/{create-6ZDLKC4F.js.map → create-ACLCRXQP.js.map} +0 -0
  836. /package/dist/{create-7YO6DAAT.js.map → create-KYBMFD32.js.map} +0 -0
  837. /package/dist/{create-ZU7AHBYM.js.map → create-VAPJ52GJ.js.map} +0 -0
  838. /package/dist/{creatives-XUIY3MQI.js.map → creatives-5I3G5YP3.js.map} +0 -0
  839. /package/dist/{creatives-6UYAAC5E.js.map → creatives-PCAGWPW3.js.map} +0 -0
  840. /package/dist/{credentials-ADGJKYA7.js.map → credentials-YTQ6BHWV.js.map} +0 -0
  841. /package/dist/{critique-T7QGPPEX.js.map → critique-BHYJYZDV.js.map} +0 -0
  842. /package/dist/{critique-BBHPASRE.js.map → critique-NRHUPIWF.js.map} +0 -0
  843. /package/dist/{crm-MXT2HUKU.js.map → crm-IKTWHWEB.js.map} +0 -0
  844. /package/dist/{crm-EKDV2SET.js.map → crm-N7K57LZJ.js.map} +0 -0
  845. /package/dist/{currency-TBBXPWXU.js.map → currency-PW7HIBZ6.js.map} +0 -0
  846. /package/dist/{fit-KEFUU7QA.js.map → customers-NLU7NYDC.js.map} +0 -0
  847. /package/dist/{delete-SRU4GRDT.js.map → delete-26J3X3ZH.js.map} +0 -0
  848. /package/dist/{delete-3UDIH2ZD.js.map → delete-A4F5Z54J.js.map} +0 -0
  849. /package/dist/{delete-4L3HO5B6.js.map → delete-EVXOFT2H.js.map} +0 -0
  850. /package/dist/{demographics-3OWQDW7B.js.map → demographics-VZKFMM4X.js.map} +0 -0
  851. /package/dist/{discard-UEMA5UHL.js.map → discard-ULRVUJDV.js.map} +0 -0
  852. /package/dist/{discover-RTV5XWRI.js.map → discover-PVXWX2WL.js.map} +0 -0
  853. /package/dist/{domain-6324IS6I.js.map → domain-L4WCCX7R.js.map} +0 -0
  854. /package/dist/{draft-VXGZDBC7.js.map → draft-34CGWUVA.js.map} +0 -0
  855. /package/dist/{draft-GRL7577L.js.map → draft-57OQKHZI.js.map} +0 -0
  856. /package/dist/{draft-777O2UIX.js.map → draft-O4S5RKWK.js.map} +0 -0
  857. /package/dist/{draft-2KS56KCT.js.map → draft-PAYD6GIM.js.map} +0 -0
  858. /package/dist/{experiment-G3FQVAJU.js.map → experiment-7N4QFRWV.js.map} +0 -0
  859. /package/dist/{facets-YV6NORA6.js.map → facets-EHQKGGJ2.js.map} +0 -0
  860. /package/dist/{feedback-YITFVOHX.js.map → feedback-O3H42V4I.js.map} +0 -0
  861. /package/dist/{feedback-record-FW2QWFYQ.js.map → feedback-record-FAPN2GBS.js.map} +0 -0
  862. /package/dist/{fetch-EYXLTSKW.js.map → fetch-ETKT2RBC.js.map} +0 -0
  863. /package/dist/{find-EVY4XEIQ.js.map → find-FSQAEGGF.js.map} +0 -0
  864. /package/dist/{fonts-DMIBVZ6D.js.map → fit-UJQ47C4A.js.map} +0 -0
  865. /package/dist/{flows-EJV7WMGD.js.map → flows-T22B77J3.js.map} +0 -0
  866. /package/dist/{ideas-W4IIVOZ4.js.map → fonts-7VWBQPJF.js.map} +0 -0
  867. /package/dist/{forecast-G43FKEZE.js.map → forecast-HB3RDBQN.js.map} +0 -0
  868. /package/dist/{forecast-5YKQZSE7.js.map → forecast-OI7YWZ6F.js.map} +0 -0
  869. /package/dist/{funnel-ND7OXIKT.js.map → funnel-7OA33VRP.js.map} +0 -0
  870. /package/dist/{ga4-2BL5YAYN.js.map → ga4-LPDIBNYP.js.map} +0 -0
  871. /package/dist/{generate-D3LUXFJT.js.map → generate-OMXBFGGR.js.map} +0 -0
  872. /package/dist/{get-PU3YHQWN.js.map → get-2RSN4N3J.js.map} +0 -0
  873. /package/dist/{get-GB6SPWCA.js.map → get-6N7QJMIP.js.map} +0 -0
  874. /package/dist/{google-7STODZQR.js.map → google-5ESVO76E.js.map} +0 -0
  875. /package/dist/{google-MHB5TOFN.js.map → google-6JZBJ2ZQ.js.map} +0 -0
  876. /package/dist/{google-ads-XGEGKEL6.js.map → google-ads-G7REKD4A.js.map} +0 -0
  877. /package/dist/{gsc-UU3T2C6B.js.map → gsc-FIZTQX3N.js.map} +0 -0
  878. /package/dist/{history-OQAOTEO3.js.map → history-QKDYBSYM.js.map} +0 -0
  879. /package/dist/{history-NYWAMWAY.js.map → history-YMK2JNZU.js.map} +0 -0
  880. /package/dist/{hubspot-LMIVY7FR.js.map → hubspot-BUFS7S33.js.map} +0 -0
  881. /package/dist/{icon-GB7UH5RF.js.map → icon-CSVAZ7NE.js.map} +0 -0
  882. /package/dist/{ingest-FRDTTPYD.js.map → ideas-JQT422P7.js.map} +0 -0
  883. /package/dist/{images-PPMIMPTS.js.map → images-WBNWK2ZH.js.map} +0 -0
  884. /package/dist/{ingest-2YGWBWAB.js.map → ingest-RQUJGS7K.js.map} +0 -0
  885. /package/dist/{logo-YSNUUT33.js.map → ingest-XLTRLCDV.js.map} +0 -0
  886. /package/dist/{insights-PZXFCMX2.js.map → insights-SQLE5NOJ.js.map} +0 -0
  887. /package/dist/{inspect-QF2S3U2E.js.map → inspect-KFVAMD4N.js.map} +0 -0
  888. /package/dist/{inspiration-XQYHBJY2.js.map → inspiration-IX5N724J.js.map} +0 -0
  889. /package/dist/{intent-JJTDJ732.js.map → intent-4KJGYYHL.js.map} +0 -0
  890. /package/dist/{keyword-gap-4NQN56JP.js.map → keyword-gap-U64KXDR4.js.map} +0 -0
  891. /package/dist/{keyword-metrics-QCIOBMTW.js.map → keyword-metrics-WYF3QMCW.js.map} +0 -0
  892. /package/dist/{keywords-for-site-FS635JXM.js.map → keywords-for-site-G5L5EP3T.js.map} +0 -0
  893. /package/dist/{landing-6H5QEHOW.js.map → landing-Y6QCTXCZ.js.map} +0 -0
  894. /package/dist/{languages-FNE45NXJ.js.map → languages-7IPVGGW5.js.map} +0 -0
  895. /package/dist/{leads-MKLSWZO6.js.map → leads-4SJ4NJOI.js.map} +0 -0
  896. /package/dist/{learn-C564OA7W.js.map → learn-3BDZUWDT.js.map} +0 -0
  897. /package/dist/{line-item-writes-K7QNWRQ3.js.map → line-item-writes-YXKYR25W.js.map} +0 -0
  898. /package/dist/{line-items-TBTHVKCZ.js.map → line-items-CKUD2UU4.js.map} +0 -0
  899. /package/dist/{link-CPJJ6T4M.js.map → link-VBYFI7AM.js.map} +0 -0
  900. /package/dist/{linkedin-HGUK624E.js.map → linkedin-UGMAFSGO.js.map} +0 -0
  901. /package/dist/{list-OKDU5W4D.js.map → list-6ZNZGRRK.js.map} +0 -0
  902. /package/dist/{list-N5SJXLYF.js.map → list-ENYDGT3F.js.map} +0 -0
  903. /package/dist/{list-AAT5CWDA.js.map → list-VSUF2IWT.js.map} +0 -0
  904. /package/dist/{locations-FTDI4FBI.js.map → locations-QJBYWRCN.js.map} +0 -0
  905. /package/dist/{log-KVRWIJS5.js.map → log-AACKGBDW.js.map} +0 -0
  906. /package/dist/{performance-YJVMM6DL.js.map → logo-VHXH4J6A.js.map} +0 -0
  907. /package/dist/{make-4NTHJ4TG.js.map → make-W2PYZXYF.js.map} +0 -0
  908. /package/dist/{map-HQ43MKEC.js.map → map-63CQHWPI.js.map} +0 -0
  909. /package/dist/{mcp-MFLUHPL5.js.map → mcp-RKAXC6IP.js.map} +0 -0
  910. /package/dist/{media-sources-A4ICRSKB.js.map → media-sources-EZKAJNVD.js.map} +0 -0
  911. /package/dist/{members-NRKQSSVS.js.map → members-SELIA674.js.map} +0 -0
  912. /package/dist/{metrics-3BRTJNGW.js.map → metrics-V6SKOVNH.js.map} +0 -0
  913. /package/dist/{models-IH6KE6OH.js.map → models-2XRYXSRA.js.map} +0 -0
  914. /package/dist/{normalize-EH6BTBOB.js.map → normalize-VAZPTBDX.js.map} +0 -0
  915. /package/dist/{options-YEPQXXRY.js.map → options-NSCZSQ5P.js.map} +0 -0
  916. /package/dist/{pages-FTI44OSH.js.map → pages-PTWRXAZT.js.map} +0 -0
  917. /package/dist/{query-3OMCFGLU.js.map → performance-K7E5KAZW.js.map} +0 -0
  918. /package/dist/{pixels-DWW2TDY2.js.map → pixels-MYT3TCHZ.js.map} +0 -0
  919. /package/dist/{pixels-MBKR4XPX.js.map → pixels-ZZCQUS3J.js.map} +0 -0
  920. /package/dist/{promoted-tweet-writes-M5OVEBC5.js.map → promoted-tweet-writes-PKEO6WUK.js.map} +0 -0
  921. /package/dist/{promoted-tweets-2MOIERNB.js.map → promoted-tweets-7MXVZRBI.js.map} +0 -0
  922. /package/dist/{publish-NPENZIHV.js.map → publish-MPMGRV72.js.map} +0 -0
  923. /package/dist/{reddit-LI37G5LS.js.map → query-UD4OIZ3A.js.map} +0 -0
  924. /package/dist/{run-AFMTXJTU.js.map → reddit-XIHRI3CN.js.map} +0 -0
  925. /package/dist/{refresh-4BBV5SPL.js.map → refresh-A27N75NH.js.map} +0 -0
  926. /package/dist/{release-4X3TLMQT.js.map → release-UKRB5IUN.js.map} +0 -0
  927. /package/dist/{relevant-pages-DIYZM6FJ.js.map → relevant-pages-VXSHEOU2.js.map} +0 -0
  928. /package/dist/{remove-Q4AES5UH.js.map → remove-AFNFVPZY.js.map} +0 -0
  929. /package/dist/{reopen-SDTPL3BN.js.map → reopen-M5HE6J3G.js.map} +0 -0
  930. /package/dist/{rerun-NA3MH4HG.js.map → rerun-5THJLQQJ.js.map} +0 -0
  931. /package/dist/{research-LXQRNAQ2.js.map → research-JHDWWFL7.js.map} +0 -0
  932. /package/dist/{research-5H265UV7.js.map → research-U7RQXMYH.js.map} +0 -0
  933. /package/dist/{reset-52PU3CVD.js.map → reset-4CCWB2RT.js.map} +0 -0
  934. /package/dist/{reset-42M5IKDI.js.map → reset-J3KCWFMZ.js.map} +0 -0
  935. /package/dist/{resolve-R4IACKIZ.js.map → resolve-HEK27ANI.js.map} +0 -0
  936. /package/dist/{retry-FPF42ZNG.js.map → retry-HPZIUG2S.js.map} +0 -0
  937. /package/dist/{retry-RTQGAH6G.js.map → retry-VVI6N6UR.js.map} +0 -0
  938. /package/dist/{rules-CGNYJYVC.js.map → rules-YLLFDZEM.js.map} +0 -0
  939. /package/dist/{rules-add-EO5476BF.js.map → rules-add-U2GU4AGP.js.map} +0 -0
  940. /package/dist/{run-3AZJ3UQU.js.map → run-M7ZDE6IA.js.map} +0 -0
  941. /package/dist/{shared-NDRFKAH7.js.map → run-V5YQB6TH.js.map} +0 -0
  942. /package/dist/{scaffold-ad-OGU2IINY.js.map → scaffold-ad-H4GJOKAW.js.map} +0 -0
  943. /package/dist/{scaffold-static-ad-HO4BJW4H.js.map → scaffold-static-ad-2YIFHCTL.js.map} +0 -0
  944. /package/dist/{scaffold-video-TLQ4WSDK.js.map → scaffold-video-3EJLKR2O.js.map} +0 -0
  945. /package/dist/{schedule-AWWMI5FO.js.map → schedule-QMOKWTJ3.js.map} +0 -0
  946. /package/dist/{scheduled-agents-ELLU7BSE.js.map → scheduled-agents-FCQHQ6KR.js.map} +0 -0
  947. /package/dist/{schema-QNVLKMKG.js.map → schema-THFLCMBN.js.map} +0 -0
  948. /package/dist/{schema-BOOZEJPA.js.map → schema-XKEEAUXP.js.map} +0 -0
  949. /package/dist/{search-BZNIB2XF.js.map → search-XIUYSWO6.js.map} +0 -0
  950. /package/dist/{select-NLWZIQ7L.js.map → select-I22NPSIW.js.map} +0 -0
  951. /package/dist/{set-prompt-QKW2L553.js.map → set-prompt-S75OMQ7L.js.map} +0 -0
  952. /package/dist/{setup-links-NMSQ4BG7.js.map → setup-links-QVI6NAOK.js.map} +0 -0
  953. /package/dist/{sync-definition-LSGDHMHV.js.map → shared-3IBNDEFL.js.map} +0 -0
  954. /package/dist/{site-GGYFBZT5.js.map → site-PZPJY33N.js.map} +0 -0
  955. /package/dist/{sources-LPQZDTIU.js.map → sources-ER7ANNG3.js.map} +0 -0
  956. /package/dist/{sources-KTGDMUV4.js.map → sources-VA23PDND.js.map} +0 -0
  957. /package/dist/{stale-C5JLQ4D2.js.map → stale-MHTU2NQJ.js.map} +0 -0
  958. /package/dist/{stats-RCLQE4HJ.js.map → stats-ZAGJH4AD.js.map} +0 -0
  959. /package/dist/{status-6PS3HDS5.js.map → status-ABMJBCPJ.js.map} +0 -0
  960. /package/dist/{stock-ECRBD7RP.js.map → stock-6SHHLSKG.js.map} +0 -0
  961. /package/dist/{studio-LMDDQWRY.js.map → studio-ZLCGXFAN.js.map} +0 -0
  962. /package/dist/{sync-XSATDLE6.js.map → sync-QDD3MRJ6.js.map} +0 -0
  963. /package/dist/{viewer-check-I45HHWSW.js.map → sync-definition-2EBSQA6A.js.map} +0 -0
  964. /package/dist/{tag-manager-G3LBQZUL.js.map → tag-manager-3CJ66GKJ.js.map} +0 -0
  965. /package/dist/{tags-OK34UGSM.js.map → tags-5JYOEYIT.js.map} +0 -0
  966. /package/dist/{tags-EXWKO6Q6.js.map → tags-B473RWAA.js.map} +0 -0
  967. /package/dist/{tags-5Y7TPJNZ.js.map → tags-EWHPUM2V.js.map} +0 -0
  968. /package/dist/{tags-6TT5ZJVX.js.map → tags-KBCX6BDU.js.map} +0 -0
  969. /package/dist/{tags-BQLIOWS4.js.map → tags-PEWN6GNZ.js.map} +0 -0
  970. /package/dist/{targeting-criteria-AWPMOX4V.js.map → targeting-criteria-EU65WUUF.js.map} +0 -0
  971. /package/dist/{targets-EXYCOHEX.js.map → targets-KVXS5QKM.js.map} +0 -0
  972. /package/dist/{testimonials-BTYMR3U4.js.map → testimonials-GR6TIS5S.js.map} +0 -0
  973. /package/dist/{themes-AOU4ZZXL.js.map → themes-JWWTOR3I.js.map} +0 -0
  974. /package/dist/{top-companies-FRPAURAH.js.map → top-companies-OOX3DITI.js.map} +0 -0
  975. /package/dist/{translate-SF234KLG.js.map → translate-GEFUP6KQ.js.map} +0 -0
  976. /package/dist/{triggers-SJUXDU3X.js.map → triggers-OX2GKG4Y.js.map} +0 -0
  977. /package/dist/{unlink-RIZD3XTI.js.map → unlink-3USEPJSA.js.map} +0 -0
  978. /package/dist/{unstage-MKTIVI3I.js.map → unstage-VSCNPTAC.js.map} +0 -0
  979. /package/dist/{update-COHXM25C.js.map → update-6JKTH65B.js.map} +0 -0
  980. /package/dist/{update-OXVZXDYH.js.map → update-FG4ELXYJ.js.map} +0 -0
  981. /package/dist/{update-SZLYEEU4.js.map → update-GZFKHA3A.js.map} +0 -0
  982. /package/dist/{update-NKX2GXAR.js.map → update-HZHG67N6.js.map} +0 -0
  983. /package/dist/{upload-LEDO3IRC.js.map → upload-BKCQ6FRW.js.map} +0 -0
  984. /package/dist/{url-options-Q5SL42CV.js.map → url-options-HCVRPZYU.js.map} +0 -0
  985. /package/dist/{url-params-KP6D7BF3.js.map → url-params-UN4DRN2H.js.map} +0 -0
  986. /package/dist/{validate-7QWQZ2OL.js.map → validate-NOWIOAHE.js.map} +0 -0
  987. /package/dist/{videos-VABK4KHJ.js.map → videos-XMTDEHEJ.js.map} +0 -0
  988. /package/dist/{web-DZGUPZYQ.js.map → web-UGU7YMII.js.map} +0 -0
  989. /package/dist/{winning-ads-6MDLRSKM.js.map → winning-ads-QOAYIR5U.js.map} +0 -0
  990. /package/dist/{write-commands-3VIK3VC4.js.map → write-commands-6VR2UD3T.js.map} +0 -0
  991. /package/dist/{x-GRDU7QC2.js.map → x-VCSMV7T5.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../api/src/ads-meta/adStudies.ts","../../api/src/ads-meta/limits.ts"],"sourcesContent":["/**\n * Meta A/B tests (ad studies, `POST /{business_id}/ad_studies`) — the staged contract.\n *\n * A split test divides one audience into non-overlapping groups and shows each\n * group one version — an ad set or a campaign — so the versions are compared\n * on people who saw only that one. Meta owns the split, the measurement and the\n * verdict; Baker stages the test and creates it at Publish.\n *\n * The payload keeps Meta's own shape — `cells[{name, treatment_percentage,\n * adsets|campaigns}]`, unix-second times, `confidence_level` as 0.8/0.9/0.95 —\n * so a test read with `baker ads meta studies --study-id` reads back the way it\n * was staged.\n *\n * Meta's API takes far more than Ads Manager does (live, v25.0, 2026-10-14: a\n * one-cell test, cells summing to 80, a 5% cell, a one-hour or 100-day test,\n * the same ad set in both cells, and an ad-set cell beside a campaign cell were\n * all created). Each of those is a test that cannot answer its question, so the\n * refusals below are Ads Manager's rules for an A/B test, not the API's, and\n * each one says why. The API's own refusals are marked \"live\".\n */\nimport { z } from \"zod\";\nimport { NUMERIC_ID_REGEX, TEMP_REF_REGEX } from \"./limits\";\n\nconst DAY_SECONDS = 86_400;\n\nconst entityRefSchema = z.string().refine((value) => NUMERIC_ID_REGEX.test(value) || TEMP_REF_REGEX.test(value), {\n message: \"expected a numeric Meta id or a meta_temp_* reference from this chat\",\n});\n\nexport const adStudyCellSchema = z.strictObject({\n name: z.string().min(1).max(100),\n /** Share of the audience that sees this version, in percent. */\n treatment_percentage: z.number().positive().max(100),\n /** A lift study: the share of the audience held out from the ads, so what they do is the baseline. */\n control_percentage: z.number().positive().max(100).optional(),\n adsets: z.array(entityRefSchema).min(1).max(100).optional(),\n campaigns: z.array(entityRefSchema).min(1).max(100).optional(),\n /** A creative test: the one ad this version runs. */\n ads: z.array(entityRefSchema).min(1).max(100).optional(),\n});\nexport type AdStudyCell = z.infer<typeof adStudyCellSchema>;\n\n/** Live: Meta refuses any other value (\"Confidence interval value must be 0.8, 0.9, or 0.95\"). */\nexport const AD_STUDY_CONFIDENCE_LEVELS = [0.8, 0.9, 0.95] as const;\nconst confidenceLevelSchema = z\n .number()\n .refine((value) => (AD_STUDY_CONFIDENCE_LEVELS as readonly number[]).includes(value), {\n message: \"confidence_level must be 0.8, 0.9 or 0.95 (80%, 90% or 95%)\",\n });\n\nconst eventSourceSchema = z.strictObject({\n id: z.string().regex(NUMERIC_ID_REGEX),\n /** Pixel or app events counted, e.g. Lead, Purchase. Meta stores pixel events by their standard name. */\n event_names: z.array(z.string().min(1)).min(1).optional(),\n});\n\n/** What a split test is decided on. Meta's other objective types (SALES, BRAND, …) belong to lift studies. */\nexport const AD_STUDY_OBJECTIVE_TYPES = [\n \"CONVERSIONS\",\n \"SALES\",\n \"NONSALES\",\n \"BRAND\",\n \"BRANDLIFT\",\n \"MAE\",\n \"MAI\",\n] as const;\n\nexport const adStudyObjectiveSchema = z.strictObject({\n name: z.string().min(1).max(100),\n /** A split test is decided on CONVERSIONS; a lift study may measure sales, brand, app events (Meta's types). */\n type: z.enum(AD_STUDY_OBJECTIVE_TYPES).default(\"CONVERSIONS\"),\n is_primary: z.boolean().optional(),\n adspixels: z.array(eventSourceSchema).min(1).optional(),\n customconversions: z.array(eventSourceSchema).min(1).optional(),\n applications: z.array(eventSourceSchema).min(1).optional(),\n offsite_datasets: z.array(eventSourceSchema).min(1).optional(),\n});\nexport type AdStudyObjective = z.infer<typeof adStudyObjectiveSchema>;\n\nconst OBJECTIVE_SOURCES = [\"adspixels\", \"customconversions\", \"applications\", \"offsite_datasets\"] as const;\n\nexport interface AdStudyIssue {\n path: PropertyKey[];\n message: string;\n}\n\n/** Ads Manager's limits; Meta's API documents up to 150 cells of up to 100 objects. */\nexport const AD_STUDY_MIN_CELLS = 2;\nexport const AD_STUDY_MAX_CELLS = 150;\n\n/** The ad sets, campaigns or ads a version runs. */\nexport function cellObjects(cell: Pick<AdStudyCell, \"adsets\" | \"campaigns\" | \"ads\">): string[] {\n return [...(cell.adsets ?? []), ...(cell.campaigns ?? []), ...(cell.ads ?? [])];\n}\n\nexport type AdStudyLevel = \"adsets\" | \"campaigns\" | \"ads\";\n\n/** What the versions are — ad sets, campaigns or ads — or undefined while they disagree. */\nexport function adStudyLevel(\n cells: readonly Pick<AdStudyCell, \"adsets\" | \"campaigns\" | \"ads\">[],\n): AdStudyLevel | undefined {\n const levels = new Set(\n cells.flatMap((cell) =>\n [cell.adsets ? \"adsets\" : [], cell.campaigns ? \"campaigns\" : [], cell.ads ? \"ads\" : []].flat(),\n ),\n );\n return levels.size === 1 ? ([...levels][0] as AdStudyLevel) : undefined;\n}\n\nfunction levelIssues(cells: readonly AdStudyCell[]): AdStudyIssue[] {\n const issues: AdStudyIssue[] = [];\n cells.forEach((cell, index) => {\n if (cellObjects(cell).length === 0) {\n issues.push({\n path: [\"cells\", index],\n message: `version \"${cell.name}\" runs nothing — give it the ad sets (adsets) or campaigns (campaigns) it shows`,\n });\n }\n });\n if (cells.some((cell) => cell.ads)) {\n issues.push({\n path: [\"cells\"],\n message:\n 'an A/B test compares ad sets or campaigns — to compare single ads of one ad set, stage a creative test (type \"SPLIT_TEST_V2\", `--type creative`)',\n });\n }\n const named = cells.filter((cell) => cellObjects(cell).length > 0);\n if (named.length > 0 && adStudyLevel(named) === undefined) {\n issues.push({\n path: [\"cells\"],\n message:\n \"the versions must be all ad sets or all campaigns — comparing an ad set with a campaign compares two different things\",\n });\n }\n return issues;\n}\n\nfunction duplicateObjectIssues(cells: readonly AdStudyCell[]): AdStudyIssue[] {\n const seen = new Map<string, number>();\n const issues: AdStudyIssue[] = [];\n cells.forEach((cell, index) => {\n for (const id of cellObjects(cell)) {\n const first = seen.get(id);\n if (first !== undefined && first !== index) {\n issues.push({\n path: [\"cells\", index],\n message: `${id} is in more than one version — each version must run its own ad sets or campaigns, or it is compared with itself`,\n });\n }\n seen.set(id, first ?? index);\n }\n });\n return issues;\n}\n\nfunction shareIssues(cells: readonly { treatment_percentage: number }[]): AdStudyIssue[] {\n const total = Math.round(cells.reduce((sum, cell) => sum + cell.treatment_percentage, 0) * 100) / 100;\n if (total === 100) {\n return [];\n }\n // Live: Meta refuses more than 100 (1840025) and creates anything under it.\n return [\n {\n path: [\"cells\"],\n message: `the versions' shares must add up to 100% (now ${total}%) — every person in the test sees exactly one version`,\n },\n ];\n}\n\nfunction cellIssues(cells: readonly AdStudyCell[]): AdStudyIssue[] {\n if (cells.length < AD_STUDY_MIN_CELLS) {\n return [\n {\n path: [\"cells\"],\n message: `an A/B test needs at least 2 versions (cells) — with ${cells.length} there is nothing to compare`,\n },\n ];\n }\n const issues: AdStudyIssue[] = [...shareIssues(cells)];\n issues.push(...levelIssues(cells), ...duplicateObjectIssues(cells));\n return issues;\n}\n\n/**\n * Ads Manager runs an A/B test for 1 to 30 days and recommends at least 7.\n * Meta's API created a one-hour and a 100-day test (live): neither is one Meta\n * can call — an hour reaches nobody, and past a month the audience the test\n * started with has changed under it.\n */\nexport const AD_STUDY_MIN_DAYS = 1;\nexport const AD_STUDY_MAX_DAYS = 30;\nexport const AD_STUDY_RECOMMENDED_DAYS = 7;\n\nexport function adStudyDays(startTime: number, endTime: number): number {\n return Math.round(((endTime - startTime) / DAY_SECONDS) * 10) / 10;\n}\n\nexport function scheduleIssues(startTime: number, endTime: number): AdStudyIssue[] {\n if (endTime <= startTime) {\n return [{ path: [\"end_time\"], message: \"the test ends before it starts — end_time must be after start_time\" }];\n }\n const days = adStudyDays(startTime, endTime);\n if (endTime - startTime < AD_STUDY_MIN_DAYS * DAY_SECONDS) {\n return [{ path: [\"end_time\"], message: `an A/B test runs for at least 1 day (this one: ${days} days)` }];\n }\n if (endTime - startTime > AD_STUDY_MAX_DAYS * DAY_SECONDS) {\n return [\n {\n path: [\"end_time\"],\n message: `an A/B test runs for at most 30 days, as in Ads Manager (this one: ${days} days) — split a longer question into two tests`,\n },\n ];\n }\n return [];\n}\n\nfunction objectiveIssues(objectives: readonly AdStudyObjective[] | undefined): AdStudyIssue[] {\n if (!objectives || objectives.length === 0) {\n return [];\n }\n const issues: AdStudyIssue[] = [];\n objectives.forEach((objective, index) => {\n if (!OBJECTIVE_SOURCES.some((source) => objective[source] !== undefined)) {\n issues.push({\n path: [\"objectives\", index],\n message: `measure \"${objective.name}\" counts nothing — give it a pixel event (adspixels), a custom conversion (customconversions) or an app event (applications)`,\n });\n }\n });\n const primaries = objectives.filter((objective) => objective.is_primary === true).length;\n const implicitPrimary = objectives.length === 1 && objectives[0]?.is_primary === undefined;\n if (primaries !== 1 && !implicitPrimary) {\n issues.push({\n path: [\"objectives\"],\n message: `a test is decided on exactly one primary measure (is_primary: true) — ${primaries} are marked`,\n });\n }\n return issues;\n}\n\n/**\n * A lift study measures what the ads ADD: each cell holds a share of its\n * audience out (`control_percentage`) and compares it with the share that\n * sees the ads. One cell is a whole study. Live on v26.0 (2026-10-15) Meta\n * created a one-cell 90/10 conversion lift study on a campaign of\n * act_1342210013621203 once it named `observation_end_time` (≥ the end,\n * 1840009) and `cooldown_start_time` (1840013) — Baker fills both.\n */\nexport const LIFT_MAX_DAYS = 90;\n\n/** Meta subcode 1840009: a lift study or creative test is read until it ends, at the least. */\nfunction observationEndIssues(\n study: Pick<AdStudyCreate, \"end_time\"> & Partial<Pick<AdStudyCreate, \"observation_end_time\">>,\n): AdStudyIssue[] {\n if (study.observation_end_time === undefined || study.observation_end_time >= study.end_time) return [];\n return [\n {\n path: [\"observation_end_time\"],\n message: \"observation_end_time must run at least until the study ends (end_time) — Meta reads results until then\",\n },\n ];\n}\n\nfunction liftIssues(\n study: Pick<AdStudyCreate, \"cells\" | \"start_time\" | \"end_time\" | \"objectives\"> &\n Partial<Pick<AdStudyCreate, \"observation_end_time\">>,\n): AdStudyIssue[] {\n const issues: AdStudyIssue[] = [];\n if (study.cells.length === 0) issues.push({ path: [\"cells\"], message: \"a lift study needs at least one cell\" });\n study.cells.forEach((cell, index) => {\n const total = cell.treatment_percentage + (cell.control_percentage ?? 0);\n if (cell.control_percentage === undefined) {\n issues.push({\n path: [\"cells\", index, \"control_percentage\"],\n message: `cell \"${cell.name}\" holds nobody out — give it a control_percentage (the people who do not see the ads)`,\n });\n } else if (total > 100) {\n issues.push({\n path: [\"cells\", index],\n message: `cell \"${cell.name}\" splits ${total}% of its audience — at most 100%`,\n });\n }\n if (cell.ads)\n issues.push({\n path: [\"cells\", index, \"ads\"],\n message: \"a lift study measures campaigns or ad sets, not single ads\",\n });\n else if (!cell.campaigns && !cell.adsets)\n issues.push({\n path: [\"cells\", index],\n message: `cell \"${cell.name}\" runs nothing — give it the campaigns (campaigns) or ad sets (adsets) whose lift it measures`,\n });\n });\n issues.push(...observationEndIssues(study));\n if (!study.objectives || study.objectives.length === 0) {\n issues.push({\n path: [\"objectives\"],\n message: \"a lift study needs a measure — the pixel event or conversion whose lift it reads\",\n });\n }\n if (study.end_time <= study.start_time) {\n issues.push({ path: [\"end_time\"], message: \"the study ends before it starts\" });\n } else if (study.end_time - study.start_time > LIFT_MAX_DAYS * DAY_SECONDS) {\n issues.push({ path: [\"end_time\"], message: \"a lift study runs for at most 90 days\" });\n }\n return [...issues, ...duplicateObjectIssues(study.cells), ...objectiveIssues(study.objectives)].filter(\n (issue, index, all) => all.findIndex((other) => other.message === issue.message) === index,\n );\n}\n\n/**\n * A creative test (`SPLIT_TEST_V2`): 2 to 5 ads of ONE ad set, each version\n * one ad, compared on a share of the ad set's budget (`testDailyBudget`, sent\n * as `creative_test_config.daily_budget`). Live on v26.0 (2026-10-15) Meta\n * created one over two paused ads of a €5/day ad set with a €2 test budget,\n * and refused `lifetime_budget_percentage` on that daily-budget ad set\n * (5024025 \"does not align with the campaign's budget\").\n */\nexport const CREATIVE_TEST_MIN_CELLS = 2;\nexport const CREATIVE_TEST_MAX_CELLS = 5;\n\nfunction creativeTestIssues(\n study: Pick<AdStudyCreate, \"cells\" | \"start_time\" | \"end_time\" | \"testDailyBudget\"> &\n Partial<Pick<AdStudyCreate, \"observation_end_time\">>,\n): AdStudyIssue[] {\n const issues: AdStudyIssue[] = [];\n if (study.cells.length < CREATIVE_TEST_MIN_CELLS || study.cells.length > CREATIVE_TEST_MAX_CELLS) {\n issues.push({ path: [\"cells\"], message: `a creative test compares 2 to 5 ads (now ${study.cells.length})` });\n }\n study.cells.forEach((cell, index) => {\n if (cell.ads?.length !== 1 || cell.adsets || cell.campaigns) {\n issues.push({ path: [\"cells\", index], message: `version \"${cell.name}\" runs exactly one ad (ads: [<ad id>])` });\n }\n });\n if (!study.testDailyBudget) {\n issues.push({\n path: [\"testDailyBudget\"],\n message: \"a creative test needs testDailyBudget — the part of the ad set's daily budget the test spends\",\n });\n }\n return [\n ...issues,\n ...shareIssues(study.cells),\n ...duplicateObjectIssues(study.cells),\n ...scheduleIssues(study.start_time, study.end_time),\n ...observationEndIssues(study),\n ];\n}\n\n/** Everything wrong with a test as it would be created, in the words a refusal reads. */\nexport function adStudyIssues(\n study: Pick<AdStudyCreate, \"cells\" | \"start_time\" | \"end_time\" | \"objectives\"> &\n Partial<Pick<AdStudyCreate, \"type\" | \"testDailyBudget\" | \"observation_end_time\">>,\n): AdStudyIssue[] {\n if (study.type === \"LIFT\") return liftIssues(study);\n if (study.type === \"SPLIT_TEST_V2\") return creativeTestIssues(study);\n return [\n ...cellIssues(study.cells),\n ...scheduleIssues(study.start_time, study.end_time),\n ...objectiveIssues(study.objectives),\n ];\n}\n\nfunction addIssues(issues: readonly AdStudyIssue[], ctx: z.RefinementCtx): void {\n for (const issue of issues) {\n ctx.addIssue({ code: \"custom\", path: issue.path, message: issue.message });\n }\n}\n\n/** A split (A/B) test, a lift study, or a creative test of single ads. */\nexport const AD_STUDY_TYPES = [\"SPLIT_TEST\", \"LIFT\", \"SPLIT_TEST_V2\"] as const;\n\nconst adStudyCreateBaseSchema = z.strictObject({\n name: z.string().min(1).max(255),\n description: z.string().max(1000).optional(),\n type: z.enum(AD_STUDY_TYPES).default(\"SPLIT_TEST\"),\n start_time: z.number().int().positive(),\n end_time: z.number().int().positive(),\n /** A lift study or creative test: when Meta stops counting results (≥ the end). Defaults to the end. */\n observation_end_time: z.number().int().positive().optional(),\n /** A creative test: the part of the ad set's daily budget it spends, major units. */\n testDailyBudget: z\n .strictObject({\n amount: z.string().regex(/^\\d+(\\.\\d{1,2})?$/, \"expected a decimal amount like 2 or 2.50\"),\n currencyCode: z.string().length(3).optional(),\n })\n .optional(),\n cells: z.array(adStudyCellSchema).max(AD_STUDY_MAX_CELLS),\n /** How sure Meta must be before it names a winner; Meta applies its own when none is sent. */\n confidence_level: confidenceLevelSchema.optional(),\n /** What the test is decided on. Without one, Meta compares cost per result on the campaigns' objective. */\n objectives: z.array(adStudyObjectiveSchema).max(10).optional(),\n /** The Business that owns the test — Meta creates studies on a Business. Filled by the backend from the ad account. */\n business_id: z.string().regex(NUMERIC_ID_REGEX).optional(),\n});\nexport type AdStudyCreate = z.infer<typeof adStudyCreateBaseSchema>;\n\nexport const adStudyCreateSchema = adStudyCreateBaseSchema.superRefine((study, ctx) =>\n addIssues(adStudyIssues(study), ctx),\n);\n\n/** Within this long of its start, a test may be published too late — Meta then refuses it (1840012). */\nconst START_SOON_SECONDS = 6 * 3600;\n\n/** Non-blocking notes on a staged test: things Meta takes but a marketer should know. */\nexport function adStudyWarnings(study: AdStudyCreate, nowSeconds: number): string[] {\n const warnings: string[] = [];\n if (study.end_time - study.start_time < AD_STUDY_RECOMMENDED_DAYS * DAY_SECONDS) {\n warnings.push(\n `this test runs ${adStudyDays(study.start_time, study.end_time)} days — Meta recommends at least 7 days for a result it can call`,\n );\n }\n if (study.start_time - nowSeconds < START_SOON_SECONDS) {\n warnings.push(\n \"this test starts within 6 hours — publish before then, or Meta refuses it because its start has passed\",\n );\n }\n for (const cell of study.cells) {\n if (cell.treatment_percentage < SMALL_VERSION_PERCENT) {\n warnings.push(\n `${cell.name} gets ${cell.treatment_percentage}% of the audience — Meta takes it, but a version under ${SMALL_VERSION_PERCENT}% rarely gathers enough results for Meta to call a winner (Meta's guidance is at least ${SMALL_VERSION_PERCENT}% per version)`,\n );\n }\n }\n return warnings;\n}\n\n/**\n * Below this share a version is warned about, not refused: live on v25.0\n * (2026-10-14) Meta created a test split 95/5, against its own guidance of at\n * least 10% per version.\n */\nconst SMALL_VERSION_PERCENT = 10;\n\n// --- Update ---\n\n/** A live version's new share, named by its cell id (`studies --study-id` lists them). */\nexport const adStudyCellShareSchema = z.strictObject({\n id: z.string().regex(NUMERIC_ID_REGEX),\n treatment_percentage: z.number().positive().max(100),\n});\n\n/**\n * What a live test takes, from Meta's update reference and what it answered\n * live. Once a test has started its start and its split are fixed (1840011,\n * live), so those are refused at staging against the test as it stands; its\n * name, description and end move freely, and the end can move later again\n * even after the test has ended (live).\n */\nconst adStudyUpdateBaseSchema = z.strictObject({\n name: z.string().min(1).max(255).optional(),\n description: z.string().max(1000).optional(),\n start_time: z.number().int().positive().optional(),\n end_time: z.number().int().positive().optional(),\n /** A lift study or creative test: when Meta stops counting results (≥ the end). Moved out with a later end on its own (`carryObservationEnd`). */\n observation_end_time: z.number().int().positive().optional(),\n /** End the test at publish: the end is set a few minutes after the change applies (Meta refuses an end in the past). */\n end_now: z.literal(true).optional(),\n confidence_level: confidenceLevelSchema.optional(),\n /** Every version's new share — Meta re-splits the whole audience at once, so name every cell. */\n cells: z.array(adStudyCellShareSchema).min(AD_STUDY_MIN_CELLS).optional(),\n /** Delete the test. Meta removes it, results and all; ending it keeps them. */\n status: z.literal(\"DELETED\").optional(),\n});\nexport type AdStudyUpdate = z.infer<typeof adStudyUpdateBaseSchema>;\n\nfunction updateShapeIssues(p: AdStudyUpdate): AdStudyIssue[] {\n const set = Object.entries(p).filter(([, value]) => value !== undefined);\n if (set.length === 0) {\n return [{ path: [], message: \"update needs at least one field\" }];\n }\n if (p.status === \"DELETED\" && set.length > 1) {\n return [{ path: [\"status\"], message: \"delete alone — a deleted test takes no other change\" }];\n }\n const issues: AdStudyIssue[] = [];\n if (p.end_now && p.end_time !== undefined) {\n issues.push({ path: [\"end_now\"], message: \"end now or set end_time, not both\" });\n }\n if (p.observation_end_time !== undefined && p.end_time !== undefined && p.observation_end_time < p.end_time) {\n issues.push({\n path: [\"observation_end_time\"],\n message: \"observation_end_time must run at least until the study ends (end_time) — Meta reads results until then\",\n });\n }\n if (p.cells) {\n issues.push(...shareIssues(p.cells));\n const ids = p.cells.map((cell) => cell.id);\n if (new Set(ids).size !== ids.length) {\n issues.push({ path: [\"cells\"], message: \"each version's share is given once\" });\n }\n }\n return issues;\n}\n\nexport const adStudyUpdateSchema = adStudyUpdateBaseSchema.superRefine((p, ctx) =>\n addIssues(updateShapeIssues(p), ctx),\n);\n\n/**\n * Room a publish needs between the check and Meta's call: the merge, the\n * workflow's queue and the ops staged ahead of the test all run first.\n */\nexport const AD_STUDY_PUBLISH_MARGIN_SECONDS = 600;\n\n/**\n * Why a staged test's times no longer hold at publish, or undefined. Staging\n * checked them against the moment it ran; a chat published a day later meets\n * Meta's own refusal (1840012) after the merge, when nothing can be fixed. So\n * publish holds the change back first, with what to do.\n */\nexport function adStudyPublishTimeBlocker(\n kind: \"adStudy.create\" | \"adStudy.update\",\n payload: Pick<AdStudyUpdate, \"start_time\" | \"end_time\">,\n nowSeconds: number,\n): string | undefined {\n const deadline = nowSeconds + AD_STUDY_PUBLISH_MARGIN_SECONDS;\n if (payload.start_time !== undefined && payload.start_time <= deadline) {\n return kind === \"adStudy.create\"\n ? \"this A/B test's start has passed (or is minutes away) since it was staged, and Meta refuses a test that starts in the past — re-stage it with a later start\"\n : \"this test's new start has passed (or is minutes away) since it was staged, and Meta refuses a start in the past — re-stage the change with a later start\";\n }\n if (payload.end_time !== undefined && payload.end_time <= deadline) {\n return \"this test's new end has passed (or is minutes away) since it was staged, and Meta refuses an end in the past — re-stage it with a later end, or end the test now (`studies end`)\";\n }\n return undefined;\n}\n\n// --- References, wire, reads ---\n\nexport type AdStudyRefEntity = \"adSet\" | \"campaign\" | \"ad\";\n\n/** The meta_temp_* refs a test's versions name — the ad sets and campaigns this chat creates first. */\nconst CELL_REF_ENTITIES = [\n [\"ads\", \"ad\"],\n [\"adsets\", \"adSet\"],\n [\"campaigns\", \"campaign\"],\n] as const;\n\nexport function adStudyTempRefs(\n cells: readonly Pick<AdStudyCell, \"adsets\" | \"campaigns\" | \"ads\">[] | undefined,\n): { ref: string; entity: AdStudyRefEntity }[] {\n return (cells ?? []).flatMap((cell) =>\n CELL_REF_ENTITIES.flatMap(([key, entity]) =>\n (cell[key] ?? []).filter((id) => TEMP_REF_REGEX.test(id)).map((ref) => ({ ref, entity })),\n ),\n );\n}\n\n/** A live cell as Meta returns it: id lists wrapped in `{data: [{id, name}]}`. */\ninterface WireCell {\n id?: unknown;\n name?: unknown;\n treatment_percentage?: unknown;\n control_percentage?: unknown;\n adsets?: { data?: { id?: unknown; name?: unknown }[] };\n campaigns?: { data?: { id?: unknown; name?: unknown }[] };\n ads?: { data?: { id?: unknown; name?: unknown }[] };\n}\n\n/** A live test in staged vocabulary, with the names of what its versions run. */\nexport interface AdStudySnapshot {\n id: string;\n name?: string;\n description?: string;\n type?: string;\n start_time?: number;\n end_time?: number;\n /** A lift study or creative test: when Meta stops counting results (≥ the end). */\n observation_end_time?: number;\n business_id?: string;\n cells: (AdStudyCell & { id: string })[];\n objectives?: AdStudyObjective[];\n names: Record<string, string>;\n}\n\n/** Meta's ISO time (`2026-10-16T14:28:53+0000`) as unix seconds. */\nexport function unixSeconds(value: unknown): number | undefined {\n if (typeof value === \"number\") {\n return value > 1e12 ? Math.floor(value / 1000) : value;\n }\n if (typeof value !== \"string\" || value === \"\") {\n return undefined;\n }\n const iso = value.replace(/([+-]\\d{2})(\\d{2})$/, \"$1:$2\");\n const ms = Date.parse(iso);\n return Number.isNaN(ms) ? undefined : Math.floor(ms / 1000);\n}\n\nfunction wireIds(edge: WireCell[\"adsets\"], names: Record<string, string>): string[] | undefined {\n const rows = edge?.data;\n if (!rows || rows.length === 0) {\n return undefined;\n }\n return rows.flatMap((row) => {\n if (typeof row.id !== \"string\") return [];\n if (typeof row.name === \"string\") names[row.id] = row.name;\n return [row.id];\n });\n}\n\nfunction text(value: unknown): string | undefined {\n return typeof value === \"string\" && value !== \"\" ? value : undefined;\n}\n\nfunction wireSources(edge: unknown): { id: string; event_names?: string[] }[] | undefined {\n const rows = (edge as { data?: { id?: unknown; event_names?: unknown }[] } | undefined)?.data;\n if (!rows || rows.length === 0) {\n return undefined;\n }\n return rows.map((row) => ({\n id: String(row.id ?? \"\"),\n ...(Array.isArray(row.event_names) && row.event_names.length > 0\n ? { event_names: row.event_names.map(String) }\n : {}),\n }));\n}\n\nfunction objectivesFromWire(edge: unknown): AdStudyObjective[] | undefined {\n const rows = (edge as { data?: Record<string, unknown>[] } | undefined)?.data;\n if (!rows || rows.length === 0) {\n return undefined;\n }\n return rows.map((row) => {\n const objective: AdStudyObjective = {\n name: String(row.name ?? \"\"),\n type: \"CONVERSIONS\",\n ...(typeof row.is_primary === \"boolean\" ? { is_primary: row.is_primary } : {}),\n };\n for (const source of OBJECTIVE_SOURCES) {\n const sources = wireSources(row[source]);\n if (sources) objective[source] = sources;\n }\n return objective;\n });\n}\n\nexport function adStudyFromWire(node: Record<string, unknown>): AdStudySnapshot {\n const names: Record<string, string> = {};\n const cellRows = ((node.cells as { data?: WireCell[] } | undefined)?.data ?? []) as WireCell[];\n const cells = cellRows.map((cell) => {\n const adsets = wireIds(cell.adsets, names);\n const campaigns = wireIds(cell.campaigns, names);\n const ads = wireIds(cell.ads, names);\n return {\n id: String(cell.id ?? \"\"),\n name: String(cell.name ?? \"\"),\n treatment_percentage: Number(cell.treatment_percentage ?? 0),\n ...(typeof cell.control_percentage === \"number\" ? { control_percentage: cell.control_percentage } : {}),\n ...(adsets ? { adsets } : {}),\n ...(campaigns ? { campaigns } : {}),\n ...(ads ? { ads } : {}),\n };\n });\n const out: AdStudySnapshot = { id: String(node.id ?? \"\"), cells, names };\n const fields: Array<[keyof AdStudySnapshot, unknown]> = [\n [\"name\", text(node.name)],\n [\"description\", text(node.description)],\n [\"type\", text(node.type)],\n [\"start_time\", unixSeconds(node.start_time)],\n [\"end_time\", unixSeconds(node.end_time)],\n [\"observation_end_time\", unixSeconds(node.observation_end_time)],\n [\"business_id\", text((node.business as { id?: unknown } | undefined)?.id)],\n [\"objectives\", objectivesFromWire(node.objectives)],\n ];\n for (const [key, value] of fields) {\n if (value !== undefined) (out as unknown as Record<string, unknown>)[key] = value;\n }\n return out;\n}\n\n/**\n * A staged test as Meta takes it on create: the Business is the path, not a\n * field, and a lone measure is the primary one — Meta decides on the primary.\n */\nexport function adStudyCreateToWire(p: AdStudyCreate): Record<string, unknown> {\n const { business_id: _business, objectives, testDailyBudget: _budget, observation_end_time, ...study } = p;\n const lonePrimary = objectives?.length === 1 && objectives[0]?.is_primary === undefined;\n // A lift study and a creative test both need these two; Meta's own\n // creative-test guide sets them to the start and the end.\n const windows =\n p.type === \"SPLIT_TEST\"\n ? {}\n : { cooldown_start_time: p.start_time, observation_end_time: observation_end_time ?? p.end_time };\n return {\n ...study,\n ...windows,\n ...(objectives ? { objectives: lonePrimary ? [{ ...objectives[0], is_primary: true }] : objectives } : {}),\n };\n}\n\n/**\n * \"End now\" lands this far after the change applies. Meta refuses an end in\n * the past, and refused one two seconds ahead (live) — the clock it checks\n * against runs ahead of the request.\n */\nexport const AD_STUDY_END_NOW_LEAD_SECONDS = 300;\n\n/** A staged change as Meta takes it on `POST /{study_id}`; `nowSeconds` places an \"end now\". */\n/**\n * A lift study or creative test counts results until its observation end, and\n * Meta refuses an end after it (1840009, as on create). So a later end moves\n * the observation end out with it, staged where the review shows it; an A/B\n * test has none, and an observation end the change names is kept.\n */\nexport function carryObservationEnd(\n update: AdStudyUpdate,\n live: Pick<AdStudySnapshot, \"type\" | \"observation_end_time\">,\n): AdStudyUpdate {\n const counting = live.observation_end_time;\n if (\n live.type === \"SPLIT_TEST\" ||\n counting === undefined ||\n update.observation_end_time !== undefined ||\n update.end_time === undefined ||\n update.end_time <= counting\n ) {\n return update;\n }\n return { ...update, observation_end_time: update.end_time };\n}\n\nexport function adStudyUpdateToWire(p: AdStudyUpdate, nowSeconds: number): Record<string, unknown> {\n const { end_now, status: _status, ...fields } = p;\n return end_now ? { ...fields, end_time: nowSeconds + AD_STUDY_END_NOW_LEAD_SECONDS } : fields;\n}\n","/**\n * Single source of truth for Meta Marketing API write constraints\n * (Graph API v25.0). Every zod schema in `ops.ts` reads from here — no\n * scattered literals. The naming follows Meta's object graph: Campaign →\n * Ad Set → Ad Creative → Ad, plus Custom Audiences and media.\n */\n\nexport const META_LIMITS = {\n /** Meta caps the labels on one object at 50 (`adlabels`, \"max 50\"); it documents no name length, so 255. */\n adLabel: {\n nameMax: 255,\n perObjectMax: 50,\n },\n campaign: {\n nameMax: 400,\n },\n adSet: {\n nameMax: 400,\n /**\n * Meta's own bounds for a minimum ROAS, as a multiple of spend (2 = 200%):\n * \"roas_average_floor … should be larger than or equal to 0.001 and smaller\n * than or equal to 1000\" (subcode 1815888, live on v25.0, 2026-10-14).\n */\n minRoasMin: 0.001,\n minRoasMax: 1000,\n /** Frequency caps: `interval_days` and `max_frequency` are each 1–90 (Meta's #100 refusal, live v25.0). */\n frequencyIntervalDaysMax: 90,\n frequencyMaxImpressionsMax: 90,\n /** \"You can set up a maximum of 50 high demand periods per campaign or ad set\" (High Demand Period reference). */\n budgetSchedulesMax: 50,\n },\n ad: {\n nameMax: 400,\n },\n creative: {\n nameMax: 400,\n /** Feed truncates the primary text past this with \"… See more\". */\n messageSoftMax: 125,\n messageHardMax: 5000,\n /** Below this, primary text reads as too thin to carry a hook + value + reason to act. */\n messageGoodMin: 40,\n headlineMax: 255,\n descriptionMax: 300,\n carouselCardsMin: 2,\n carouselCardsMax: 10,\n /** Carousels tell a fuller story and give Meta more to optimize at this many cards. */\n carouselCardsGoodMin: 3,\n dynamicTextsMin: 1,\n dynamicTextsMax: 5,\n /** Dynamic ads mix and match best with at least this many media assets. */\n dynamicAssetsGoodMin: 3,\n /**\n * `asset_feed_spec` limits (Meta's Asset Feed Spec Options, \"restrictions\"):\n * body text 1024 characters, titles and descriptions 255, at most 10\n * images and 10 videos, 30 assets in all (the ad format counts as one).\n */\n assetFeedBodyMax: 1024,\n assetFeedTitleMax: 255,\n assetFeedImagesMax: 10,\n assetFeedVideosMax: 10,\n assetFeedAssetsMax: 30,\n },\n audience: {\n nameMax: 100,\n /** Website/engagement audiences below this rarely serve. */\n minLookalikeSourceRows: 100,\n retentionDaysMax: 180,\n },\n customConversion: {\n nameMax: 100,\n descriptionMax: 500,\n /**\n * Meta's hard cap per ad account. It matters because deleting a custom\n * conversion archives it rather than removing it, so a chat that creates\n * one per campaign spends slots that only a person, in Events Manager, can\n * think about reclaiming.\n */\n perAccountMax: 100,\n },\n} as const;\n\n// --- Campaign ---\n\nexport const OBJECTIVES = [\n \"OUTCOME_TRAFFIC\",\n \"OUTCOME_ENGAGEMENT\",\n \"OUTCOME_LEADS\",\n \"OUTCOME_SALES\",\n \"OUTCOME_AWARENESS\",\n \"OUTCOME_APP_PROMOTION\",\n] as const;\nexport type MetaObjective = (typeof OBJECTIVES)[number];\n\nexport const SPECIAL_AD_CATEGORIES = [\n \"NONE\",\n \"HOUSING\",\n \"EMPLOYMENT\",\n /** Deprecated by Meta on 2025-01-14 — replaced by FINANCIAL_PRODUCTS_SERVICES. Still accepted as input and mapped on the wire. */\n \"CREDIT\",\n \"ISSUES_ELECTIONS_POLITICS\",\n \"FINANCIAL_PRODUCTS_SERVICES\",\n \"ONLINE_GAMBLING_AND_GAMING\",\n] as const;\nexport type MetaSpecialAdCategory = (typeof SPECIAL_AD_CATEGORIES)[number];\n\n/** ISO Alpha-2 country declaration is mandatory for these categories. */\nexport const SPECIAL_CATEGORIES_REQUIRING_COUNTRY: readonly MetaSpecialAdCategory[] = [\"ISSUES_ELECTIONS_POLITICS\"];\n\nexport const BUYING_TYPES = [\"AUCTION\", \"RESERVED\"] as const;\n\nexport const BID_STRATEGIES = [\n \"LOWEST_COST_WITHOUT_CAP\",\n \"LOWEST_COST_WITH_BID_CAP\",\n \"COST_CAP\",\n \"LOWEST_COST_WITH_MIN_ROAS\",\n] as const;\nexport type MetaBidStrategy = (typeof BID_STRATEGIES)[number];\n\n/** Bid strategies that require an explicit `bid_amount` on the ad set. */\nexport const BID_STRATEGIES_REQUIRING_AMOUNT: readonly MetaBidStrategy[] = [\"LOWEST_COST_WITH_BID_CAP\", \"COST_CAP\"];\n\n/**\n * Bid strategies that must NOT carry a `bid_amount` — Meta rejects one.\n * Auto-bid (`LOWEST_COST_WITHOUT_CAP`) has no cap; `LOWEST_COST_WITH_MIN_ROAS`\n * uses `bid_constraints.roas_average_floor` instead of a flat amount.\n */\n/**\n * Meta takes a minimum ROAS as `bid_constraints.roas_average_floor`, an integer\n * scaled 10000×: 10000 is 1.0× (100%), 23300 is 2.33×. Baker stages the\n * multiple itself and scales it on the wire, the way money is staged in major\n * units and converted there.\n */\nexport const ROAS_FLOOR_SCALE = 10000;\n\nexport const BID_STRATEGIES_FORBIDDING_AMOUNT: readonly MetaBidStrategy[] = [\n \"LOWEST_COST_WITHOUT_CAP\",\n \"LOWEST_COST_WITH_MIN_ROAS\",\n];\n\n// --- Ad set ---\n\nexport const BILLING_EVENTS = [\n \"APP_INSTALLS\",\n \"CLICKS\",\n \"IMPRESSIONS\",\n \"LINK_CLICKS\",\n \"NONE\",\n \"OFFER_CLAIMS\",\n \"PAGE_LIKES\",\n \"POST_ENGAGEMENT\",\n \"THRUPLAY\",\n \"PURCHASE\",\n \"LISTING_INTERACTION\",\n] as const;\nexport type MetaBillingEvent = (typeof BILLING_EVENTS)[number];\n\nexport const OPTIMIZATION_GOALS = [\n \"NONE\",\n \"APP_INSTALLS\",\n \"AD_RECALL_LIFT\",\n \"ENGAGED_USERS\",\n \"EVENT_RESPONSES\",\n \"IMPRESSIONS\",\n \"LEAD_GENERATION\",\n \"QUALITY_LEAD\",\n \"QUALITY_CALL\",\n \"LINK_CLICKS\",\n \"OFFSITE_CONVERSIONS\",\n \"LANDING_PAGE_VIEWS\",\n \"PAGE_LIKES\",\n \"POST_ENGAGEMENT\",\n \"REACH\",\n \"THRUPLAY\",\n \"VALUE\",\n \"CONVERSATIONS\",\n \"DERIVED_EVENTS\",\n // Added 2026-09-18 from Meta's own generated enum spec\n // (facebook-business-sdk-codegen › AdSet_optimization_goal). Every one of these\n // is a goal Meta accepts and Baker used to refuse at stage time — the messaging\n // and Instagram-profile goals are the ones that cost real campaigns, because a\n // click-to-WhatsApp ad set cannot be expressed without them.\n \"ADVERTISER_SILOED_VALUE\",\n \"APP_INSTALLS_AND_OFFSITE_CONVERSIONS\",\n \"AUTOMATIC_OBJECTIVE\",\n \"ENGAGED_PAGE_VIEWS\",\n \"IN_APP_VALUE\",\n \"MEANINGFUL_CALL_ATTEMPT\",\n \"MESSAGING_APPOINTMENT_CONVERSION\",\n \"MESSAGING_DEEP_CONVERSATION_AND_FOLLOW\",\n \"MESSAGING_PURCHASE_CONVERSION\",\n \"PROFILE_AND_PAGE_ENGAGEMENT\",\n \"PROFILE_VISIT\",\n \"REMINDERS_SET\",\n \"SUBSCRIBERS\",\n \"VISIT_INSTAGRAM_PROFILE\",\n] as const;\nexport type MetaOptimizationGoal = (typeof OPTIMIZATION_GOALS)[number];\n\n/**\n * Optimization goals Meta rejects without a `promoted_object.page_id` — the\n * lead-form and page goals where the promoted object *is* the page (instant\n * forms, page likes). Missing it fails publish with subcode 1815430\n * (\"Please select a promoted object for your ad set\").\n */\nexport const OPTIMIZATION_GOALS_REQUIRING_PAGE: readonly MetaOptimizationGoal[] = [\n \"LEAD_GENERATION\",\n \"QUALITY_LEAD\",\n \"PAGE_LIKES\",\n];\n\n/**\n * Web-conversion goals Meta rejects without `promoted_object.pixel_id` +\n * `custom_event_type` — the pixel/event the ad set optimizes toward. Meta docs:\n * \"For OFFSITE_CONVERSIONS: Requires pixel_id and custom_event_type.\"\n */\nexport const OPTIMIZATION_GOALS_REQUIRING_PIXEL: readonly MetaOptimizationGoal[] = [\"OFFSITE_CONVERSIONS\"];\n\n/**\n * Value-optimization goals need `custom_event_type` plus a conversion *source* —\n * `pixel_id` for web value optimization, or `application_id` for app value\n * optimization (AEO/VO). Requiring `pixel_id` unconditionally would reject a\n * legitimate app-based VALUE campaign, so we accept either source.\n */\nexport const OPTIMIZATION_GOALS_REQUIRING_CONVERSION_SOURCE: readonly MetaOptimizationGoal[] = [\"VALUE\"];\n\n/** App-promotion goals Meta rejects without `promoted_object.application_id`. */\nexport const OPTIMIZATION_GOALS_REQUIRING_APP: readonly MetaOptimizationGoal[] = [\"APP_INSTALLS\"];\n\n/**\n * `PHONE_CALL` is CONTESTED and deliberately kept. Meta's Destination Type page\n * documents it; Meta's own generated enum spec does not list it. Neither source\n * settles it and a create is the only thing that would, so it stays accepted —\n * removing a value Meta takes breaks a campaign shape, keeping one it refuses\n * costs a single publish error that names itself.\n */\nexport const DESTINATION_TYPES = [\n \"WEBSITE\",\n \"APP\",\n \"MESSENGER\",\n \"INSTAGRAM_DIRECT\",\n \"ON_AD\",\n \"ON_PAGE\",\n \"ON_POST\",\n \"ON_VIDEO\",\n \"WHATSAPP\",\n \"PHONE_CALL\",\n \"INSTAGRAM_PROFILE\",\n \"SHOP_AUTOMATIC\",\n // Added 2026-09-18 from adcampaign_destination_type. The four MESSAGING_* values\n // are the click-to-message destinations (Messenger / Instagram Direct / WhatsApp\n // in every combination Meta ships); without them Baker could not stage a\n // click-to-WhatsApp ad set at all.\n \"APPLINKS_AUTOMATIC\",\n \"FACEBOOK\",\n \"FACEBOOK_LIVE\",\n \"FACEBOOK_PAGE\",\n \"IMAGINE\",\n \"INSTAGRAM_LIVE\",\n \"INSTAGRAM_PROFILE_AND_FACEBOOK_PAGE\",\n \"MESSAGING_INSTAGRAM_DIRECT_MESSENGER\",\n \"MESSAGING_INSTAGRAM_DIRECT_MESSENGER_WHATSAPP\",\n \"MESSAGING_INSTAGRAM_DIRECT_WHATSAPP\",\n \"MESSAGING_MESSENGER_WHATSAPP\",\n \"ON_EVENT\",\n] as const;\nexport type MetaDestinationType = (typeof DESTINATION_TYPES)[number];\n\nexport const CUSTOM_EVENT_TYPES = [\n \"PURCHASE\",\n \"LEAD\",\n \"COMPLETE_REGISTRATION\",\n \"ADD_TO_CART\",\n \"ADD_PAYMENT_INFO\",\n \"INITIATED_CHECKOUT\",\n \"CONTENT_VIEW\",\n \"SEARCH\",\n \"SUBSCRIBE\",\n \"START_TRIAL\",\n \"CONTACT\",\n \"OTHER\",\n // Added 2026-09-18 from AdPromotedObject_custom_event_type. SCHEDULE,\n // SUBMIT_APPLICATION, SERVICE_BOOKING_REQUEST and\n // MESSAGING_CONVERSATION_STARTED_7D are the conversions service businesses and\n // click-to-message campaigns actually optimize toward.\n \"ACHIEVEMENT_UNLOCKED\",\n \"ADD_TO_WISHLIST\",\n \"AD_IMPRESSION\",\n \"CUSTOMIZE_PRODUCT\",\n \"D2_RETENTION\",\n \"D7_RETENTION\",\n \"DONATE\",\n \"FIND_LOCATION\",\n \"LEVEL_ACHIEVED\",\n \"LISTING_INTERACTION\",\n \"MESSAGING_CONVERSATION_STARTED_7D\",\n \"RATE\",\n \"SCHEDULE\",\n \"SERVICE_BOOKING_REQUEST\",\n \"SPENT_CREDITS\",\n \"SUBMIT_APPLICATION\",\n \"TUTORIAL_COMPLETION\",\n] as const;\n\n/**\n * The only goals Meta lets an ad set cap frequency on: \"Writes to this field are\n * only available in ad sets where REACH and THRUPLAY are the performance goal\"\n * (Ad Account Ad Sets reference); anything else is subcode 1815211, live v25.0.\n */\nexport const OPTIMIZATION_GOALS_WITH_FREQUENCY_CAP: readonly MetaOptimizationGoal[] = [\"REACH\", \"THRUPLAY\"];\n\n/**\n * What a frequency cap counts — the values Meta's own refusal lists on v25.0.\n * Not all of them work: see `validateFrequencyCap` (VIDEO_VIEWS fails with an\n * unknown error, VIDEO_VIEWS_6S is REACH-only).\n */\nexport const FREQUENCY_CAP_EVENTS = [\n \"IMPRESSIONS\",\n \"VIDEO_VIEWS\",\n \"VIDEO_VIEWS_2S\",\n \"VIDEO_VIEWS_15S\",\n \"VIDEO_VIEWS_6S\",\n] as const;\n\n/**\n * CAP holds people at or below the number; TARGET aims at it — reach-and-frequency\n * only: live on v25.0 an auction ad set's TARGET cap passed the dry run and was\n * refused at create for having no prediction (subcode 3858652), so staging\n * refuses it (`validateFrequencyCap`). Kept so a live ad set carrying one reads.\n */\nexport const FREQUENCY_CAP_TYPES = [\"CAP\", \"TARGET\"] as const;\n\n/**\n * How an ad set spends through its day. `standard` spreads the budget evenly;\n * `no_pacing` (Ads Manager's accelerated delivery) spends as fast as it can and\n * only works on a bid cap; `day_parting` runs only in the hours `adset_schedule`\n * names. Sent as Meta's one-element `pacing_type` list.\n */\nexport const PACING_TYPES = [\"standard\", \"no_pacing\", \"day_parting\"] as const;\nexport type MetaPacingType = (typeof PACING_TYPES)[number];\n\n/** Whose clock an ad schedule follows: the viewer's (USER) or the ad account's (ADVERTISER). */\nexport const SCHEDULE_TIMEZONE_TYPES = [\"USER\", \"ADVERTISER\"] as const;\n\nexport const ATTRIBUTION_EVENT_TYPES = [\"CLICK_THROUGH\", \"VIEW_THROUGH\", \"ENGAGED_VIDEO_VIEW\"] as const;\nexport const ATTRIBUTION_WINDOW_DAYS = [1, 7] as const;\n\n/**\n * The longest window Meta still takes per event, live on v25.0 (2026-10-14):\n * a 28-day click is refused for every goal (\"supported values is/are\n * attribution window of 1, 7 day(s)\", subcode 1885423), a view or an engaged\n * video view only counts for one day (\"supported combination of click-through\n * and view-through attribution window values are: (1, 0), (1, 1), (7, 0),\n * (7, 1)\", subcode 1885501). Which combinations a given goal takes is narrower\n * still and Meta's to say — the stage-time dry run asks it.\n */\nexport const ATTRIBUTION_MAX_WINDOW_DAYS: Readonly<Record<(typeof ATTRIBUTION_EVENT_TYPES)[number], number>> = {\n CLICK_THROUGH: 7,\n VIEW_THROUGH: 1,\n ENGAGED_VIDEO_VIEW: 1,\n};\n\n// --- Advantage+ Audience (targeting_automation.advantage_audience) ---\n\n/**\n * With Advantage+ Audience on (`advantage_audience: 1`, the Meta v23+ default\n * when age/gender/custom-audience/detailed inclusions are default or omitted),\n * age & gender become mere suggestions: `age_max` is pinned to 65 and `age_min`\n * is limited to 18–25. Setting a narrower `age_max`, an `age_min` above 25, or a\n * single-gender restriction is rejected (subcode 1870189, \"add a lower maximum\n * age as a suggestion instead\"). To enforce a HARD age/gender limit you must set\n * `advantage_audience: 0`.\n */\nexport const ADVANTAGE_AUDIENCE_OPEN_AGE_MAX = 65;\nexport const ADVANTAGE_AUDIENCE_MAX_HARD_AGE_MIN = 25;\n\n// --- EU Digital Services Act (DSA) ---\n\n/**\n * When an ad set targets any EU country, Meta requires `dsa_beneficiary` and\n * `dsa_payor` (who benefits from / pays for the ad) for Digital Services Act\n * compliance — the create is rejected without them. The backend auto-fills both\n * from the ad account's business name when the caller omits them.\n */\nexport const EU_DSA_COUNTRIES = new Set([\n \"AT\",\n \"BE\",\n \"BG\",\n \"HR\",\n \"CY\",\n \"CZ\",\n \"DK\",\n \"EE\",\n \"FI\",\n \"FR\",\n \"DE\",\n \"GR\",\n \"HU\",\n \"IE\",\n \"IT\",\n \"LV\",\n \"LT\",\n \"LU\",\n \"MT\",\n \"NL\",\n \"PL\",\n \"PT\",\n \"RO\",\n \"SK\",\n \"SI\",\n \"ES\",\n \"SE\",\n]);\n\n// --- Ad creative ---\n\n/**\n * Every button Meta accepts on `object_story_spec.link_data.call_to_action.type`\n * — a single ad, a video ad, and each card of a carousel.\n *\n * Read off Meta itself on 2026-09-01 by posting an invalid type and keeping the\n * list its 400 enumerates, because the published reference and the live\n * validator disagree: `SEE_DETAILS` is missing from the docs page and accepted\n * by the API, and it is the button three of one client's live ads actually use.\n * This list used to be a hand-picked 27, so those ads could not be rebuilt\n * through Baker at all — the button was the thing that stopped them.\n *\n * Meta keeps a SECOND, different list for `asset_feed_spec.call_to_action_types`\n * ({@link ASSET_FEED_CTA_TYPES}). Neither contains the other:\n * `SEE_DETAILS` is link-only, `GET_STARTED` and `VIEW_CART` are feed-only. A\n * value in the wrong slot is refused at creation, so the two are kept apart\n * rather than unioned.\n */\nexport const CTA_TYPES = [\n \"BOOK_TRAVEL\",\n \"CONTACT_US\",\n \"DONATE\",\n \"DONATE_NOW\",\n \"DOWNLOAD\",\n \"GET_DIRECTIONS\",\n \"GO_LIVE\",\n \"INTERESTED\",\n \"LEARN_MORE\",\n \"SEE_DETAILS\",\n \"LIKE_PAGE\",\n \"MESSAGE_PAGE\",\n \"RAISE_MONEY\",\n \"SAVE\",\n \"SEND_TIP\",\n \"SHOP_NOW\",\n \"SIGN_UP\",\n \"VIEW_INSTAGRAM_PROFILE\",\n \"INSTAGRAM_MESSAGE\",\n \"LOYALTY_LEARN_MORE\",\n \"PURCHASE_GIFT_CARDS\",\n \"PAY_TO_ACCESS\",\n \"SEE_MORE\",\n \"TRY_IN_CAMERA\",\n \"WHATSAPP_LINK\",\n \"GET_IN_TOUCH\",\n \"TRY_NOW\",\n \"ASK_A_QUESTION\",\n \"START_A_CHAT\",\n \"CHAT_NOW\",\n \"ASK_US\",\n \"CHAT_WITH_US\",\n \"BOOK_NOW\",\n \"CHECK_AVAILABILITY\",\n \"ORDER_NOW\",\n \"WHATSAPP_MESSAGE\",\n \"GET_MOBILE_APP\",\n \"INSTALL_MOBILE_APP\",\n \"USE_MOBILE_APP\",\n \"INSTALL_APP\",\n \"USE_APP\",\n \"PLAY_GAME\",\n \"TRY_DEMO\",\n \"WATCH_VIDEO\",\n \"WATCH_MORE\",\n \"OPEN_LINK\",\n \"NO_BUTTON\",\n \"LISTEN_MUSIC\",\n \"MOBILE_DOWNLOAD\",\n \"GET_OFFER\",\n \"GET_OFFER_VIEW\",\n \"BUY_NOW\",\n \"BUY_TICKETS\",\n \"UPDATE_APP\",\n \"BET_NOW\",\n \"ADD_TO_CART\",\n \"SELL_NOW\",\n \"GET_SHOWTIMES\",\n \"LISTEN_NOW\",\n \"GET_EVENT_TICKETS\",\n \"REMIND_ME\",\n \"SEARCH_MORE\",\n \"PRE_REGISTER\",\n \"SWIPE_UP_PRODUCT\",\n \"SWIPE_UP_SHOP\",\n \"PLAY_GAME_ON_FACEBOOK\",\n \"VISIT_WORLD\",\n \"OPEN_INSTANT_APP\",\n \"JOIN_GROUP\",\n \"GET_PROMOTIONS\",\n \"SEND_UPDATES\",\n \"INQUIRE_NOW\",\n \"VISIT_PROFILE\",\n \"CHAT_ON_WHATSAPP\",\n \"EXPLORE_MORE\",\n \"CONFIRM\",\n \"JOIN_CHANNEL\",\n \"MAKE_AN_APPOINTMENT\",\n \"ASK_ABOUT_SERVICES\",\n \"BOOK_A_CONSULTATION\",\n \"GET_A_QUOTE\",\n \"BUY_VIA_MESSAGE\",\n \"ASK_FOR_MORE_INFO\",\n \"VIEW_PRODUCT\",\n \"VIEW_CHANNEL\",\n \"WATCH_LIVE_VIDEO\",\n \"JOIN_LIVE_VIDEO\",\n \"IMAGINE\",\n \"CALL\",\n \"MISSED_CALL\",\n \"CALL_NOW\",\n \"CALL_ME\",\n \"APPLY_NOW\",\n \"BUY\",\n \"GET_QUOTE\",\n \"SUBSCRIBE\",\n \"RECORD_NOW\",\n \"VOTE_NOW\",\n \"GIVE_FREE_RIDES\",\n \"REGISTER_NOW\",\n \"OPEN_MESSENGER_EXT\",\n \"EVENT_RSVP\",\n \"CIVIC_ACTION\",\n \"SEND_INVITES\",\n \"REFER_FRIENDS\",\n \"REQUEST_TIME\",\n \"SEE_MENU\",\n \"SEARCH\",\n \"TRY_IT\",\n \"TRY_ON\",\n \"LINK_CARD\",\n \"DIAL_CODE\",\n \"FIND_YOUR_GROUPS\",\n \"START_ORDER\",\n // Added 2026-09-18 from Meta's generated enum spec\n // (AdCreative_call_to_action_type). Additive on purpose: 37 of the values above\n // are absent from that spec and present in the live 400, which is the\n // disagreement the note above is about — so the spec widens this list and never\n // prunes it.\n \"AUDIO_CALL\",\n \"BROWSE_SHOP\",\n \"CONTACT\",\n \"FIND_A_GROUP\",\n \"FIND_OUT_MORE\",\n \"FOLLOW_NEWS_STORYLINE\",\n \"FOLLOW_PAGE\",\n \"FOLLOW_USER\",\n \"GET_DETAILS\",\n \"GET_STARTED\",\n \"SAY_THANKS\",\n \"SEE_SHOP\",\n \"SEND_A_GIFT\",\n \"SEND_GIFT_MONEY\",\n \"SHARE\",\n \"SHOP_WITH_AI\",\n \"SOTTO_SUBSCRIBE\",\n \"TRY_ON_WITH_AI\",\n \"VIDEO_ANNOTATION\",\n \"VIDEO_CALL\",\n \"VIEW_CART\",\n \"VIEW_IN_CART\",\n \"VISIT_PAGES_FEED\",\n \"VISIT_WEBSITE\",\n \"WOODHENGE_SUPPORT\",\n] as const;\nexport type MetaCtaType = (typeof CTA_TYPES)[number];\n\n/**\n * The buttons a dynamic / flexible creative may list in\n * `asset_feed_spec.call_to_action_types`. Read off Meta the same way and on the\n * same day as {@link CTA_TYPES}, and deliberately a separate list — see the\n * note there.\n */\nexport const ASSET_FEED_CTA_TYPES = [\n \"OPEN_LINK\",\n \"LIKE_PAGE\",\n \"SHOP_NOW\",\n \"PLAY_GAME\",\n \"INSTALL_APP\",\n \"USE_APP\",\n \"CALL\",\n \"CALL_ME\",\n \"VIDEO_CALL\",\n \"INSTALL_MOBILE_APP\",\n \"USE_MOBILE_APP\",\n \"MOBILE_DOWNLOAD\",\n \"BOOK_TRAVEL\",\n \"LISTEN_MUSIC\",\n \"WATCH_VIDEO\",\n \"LEARN_MORE\",\n \"SIGN_UP\",\n \"DOWNLOAD\",\n \"WATCH_MORE\",\n \"NO_BUTTON\",\n \"VISIT_PAGES_FEED\",\n \"CALL_NOW\",\n \"APPLY_NOW\",\n \"CONTACT\",\n \"BUY_NOW\",\n \"GET_OFFER\",\n \"GET_OFFER_VIEW\",\n \"BUY_TICKETS\",\n \"UPDATE_APP\",\n \"GET_DIRECTIONS\",\n \"BUY\",\n \"SEND_UPDATES\",\n \"MESSAGE_PAGE\",\n \"DONATE\",\n \"SUBSCRIBE\",\n \"SAY_THANKS\",\n \"SELL_NOW\",\n \"SHARE\",\n \"DONATE_NOW\",\n \"GET_QUOTE\",\n \"CONTACT_US\",\n \"ORDER_NOW\",\n \"START_ORDER\",\n \"ADD_TO_CART\",\n \"VIEW_CART\",\n \"VIEW_IN_CART\",\n \"VIDEO_ANNOTATION\",\n \"RECORD_NOW\",\n \"INQUIRE_NOW\",\n \"CONFIRM\",\n \"REFER_FRIENDS\",\n \"REQUEST_TIME\",\n \"GET_SHOWTIMES\",\n \"LISTEN_NOW\",\n \"TRY_DEMO\",\n \"WOODHENGE_SUPPORT\",\n \"SOTTO_SUBSCRIBE\",\n \"FOLLOW_USER\",\n \"RAISE_MONEY\",\n \"SEE_SHOP\",\n \"GET_DETAILS\",\n \"FIND_OUT_MORE\",\n \"VISIT_WEBSITE\",\n \"BROWSE_SHOP\",\n \"EVENT_RSVP\",\n \"WHATSAPP_MESSAGE\",\n \"FOLLOW_NEWS_STORYLINE\",\n \"SEE_MORE\",\n \"BOOK_NOW\",\n \"FIND_A_GROUP\",\n \"FIND_YOUR_GROUPS\",\n \"PAY_TO_ACCESS\",\n \"PURCHASE_GIFT_CARDS\",\n \"FOLLOW_PAGE\",\n \"SEND_A_GIFT\",\n \"SWIPE_UP_SHOP\",\n \"SWIPE_UP_PRODUCT\",\n \"SEND_GIFT_MONEY\",\n \"PLAY_GAME_ON_FACEBOOK\",\n \"GET_STARTED\",\n \"OPEN_INSTANT_APP\",\n \"AUDIO_CALL\",\n \"GET_PROMOTIONS\",\n \"JOIN_CHANNEL\",\n \"MAKE_AN_APPOINTMENT\",\n \"ASK_ABOUT_SERVICES\",\n \"BOOK_A_CONSULTATION\",\n \"GET_A_QUOTE\",\n \"BUY_VIA_MESSAGE\",\n \"ASK_FOR_MORE_INFO\",\n \"CHAT_WITH_US\",\n \"VIEW_PRODUCT\",\n \"VIEW_CHANNEL\",\n \"GET_IN_TOUCH\",\n \"ASK_A_QUESTION\",\n \"START_A_CHAT\",\n \"CHAT_NOW\",\n \"ASK_US\",\n \"WATCH_LIVE_VIDEO\",\n \"JOIN_LIVE_VIDEO\",\n \"SHOP_WITH_AI\",\n \"TRY_ON_WITH_AI\",\n] as const;\nexport type MetaAssetFeedCtaType = (typeof ASSET_FEED_CTA_TYPES)[number];\n\n/**\n * The buttons Meta allows on a creative that opens an instant form. Meta's\n * lead-ads guide names exactly these six for `link_data.call_to_action`, and\n * anything else is refused at creation with \"Invalid value field\n * lead_gen_form_id for CTA type: <TYPE>\" (subcode 1856030) — which is a publish\n * failure, after the ad's siblings have already been created on the account.\n * One real chat staged six instant-form creatives, two of them on CONTACT_US:\n * both creatives were rejected and both of their ads were skipped, leaving four\n * of six ads live and nobody able to tell why from Meta's sentence.\n */\nexport const LEAD_FORM_CTA_TYPES = [\n \"APPLY_NOW\",\n \"DOWNLOAD\",\n \"GET_QUOTE\",\n \"LEARN_MORE\",\n \"SIGN_UP\",\n \"SUBSCRIBE\",\n] as const satisfies readonly MetaCtaType[];\n\n/** `asset_feed_spec.ad_formats` (Asset Feed Spec Options): `AUTOMATIC_FORMAT` mixes pictures and videos. */\nexport const AD_FORMATS = [\"SINGLE_IMAGE\", \"CAROUSEL\", \"SINGLE_VIDEO\", \"AUTOMATIC_FORMAT\"] as const;\nexport type MetaAdFormat = (typeof AD_FORMATS)[number];\n\n/** Advantage+ Creative enroll state (case-sensitive) — set per individual feature. */\nexport const ENROLL_STATUSES = [\"OPT_IN\", \"OPT_OUT\"] as const;\nexport type MetaEnrollStatus = (typeof ENROLL_STATUSES)[number];\n\n/**\n * Meta deprecated the `standard_enhancements` bundle key at Marketing API v22.0\n * — including it in `creative_features_spec` now hard-fails (error subcode\n * 3858504: \"Including standard enhancements field in creative has been\n * deprecated. Please choose to set individual features instead.\"). The bundle is\n * replaced by these individual feature keys, opted in/out one at a time.\n *\n * Meta does NOT publish a per-media eligibility matrix and validates features\n * server-side, so we expand our master toggle into ONLY keys confirmed present\n * in the current `AdCreativeFeaturesSpec`, scoped to the creative's media type.\n * Callers needing a specific feature pass it explicitly via `enhancements.features`.\n */\nexport const STANDARD_ENHANCEMENT_IMAGE_FEATURES = [\n \"image_templates\",\n \"image_touchups\",\n \"text_optimizations\",\n \"inline_comment\",\n] as const;\n/** Video keeps only the universally-valid text/comment enhancements (visual crop keys aren't in the confirmed spec list). */\nexport const STANDARD_ENHANCEMENT_VIDEO_FEATURES = [\"text_optimizations\", \"inline_comment\"] as const;\n\n/**\n * Advantage+ Creative features that change the picture or video itself —\n * adding frames, re-cropping, AI outpainting, animating a still, generating\n * music, cutting a video. Read off a live creative's\n * `degrees_of_freedom_spec.creative_features_spec` (82 keys, v25.0,\n * 2026-10-14) and every one accepted as OPT_OUT by a validate-only create.\n *\n * Every composed creative sends them all OPT_OUT, so Meta changes nobody's\n * pixels by default; one is switched on only when the user asked for it by name.\n */\nexport const VISUAL_ENHANCEMENT_FEATURES = {\n adapt_to_placement: \"Adapt the picture to each placement\",\n add_text_overlay: \"Add text on top of the media\",\n audio: \"Add audio\",\n carousel_to_video: \"Turn the carousel into a video\",\n creative_stickers: \"Add stickers\",\n cv_transformation: \"Visual transformations\",\n image_animation: \"Animate the picture\",\n image_auto_crop: \"Crop the picture automatically\",\n image_background_gen: \"Generate a new background\",\n image_banner: \"Add a banner\",\n image_brightness_and_contrast: \"Adjust brightness and contrast\",\n image_end_card: \"Add an end card\",\n image_enhancement: \"Enhance the picture\",\n image_templates: \"Put the picture in a template frame\",\n image_text_translation: \"Translate text in the picture\",\n image_touchups: \"Touch up the picture\",\n image_uncrop: \"Expand the picture with AI\",\n media_liquidity_animated_image: \"Animate the picture\",\n media_type_automation: \"Turn the picture into a video\",\n multi_photo_to_video: \"Turn several pictures into a video\",\n music_generation: \"Generate music\",\n pac_genai_recomposition: \"Recompose the media with AI per placement\",\n pac_recomposition: \"Recompose the media per placement\",\n replace_media_text: \"Replace text in the media\",\n reveal_details_over_time: \"Reveal details over time\",\n text_overlay_translation: \"Translate text overlays\",\n translate_voiceover: \"Translate the voiceover\",\n video_auto_crop: \"Crop the video automatically\",\n video_filtering: \"Filter the video\",\n video_highlight: \"Cut a highlight from the video\",\n video_highlights: \"Cut highlights from the video\",\n video_to_image: \"Turn the video into a picture\",\n video_uncrop: \"Expand the video with AI\",\n video_uncrop_9x16_to_9x18: \"Expand a vertical video\",\n ig_video_native_subtitle: \"Add subtitles to the video\",\n} as const satisfies Record<string, string>;\nexport type VisualEnhancementFeature = keyof typeof VISUAL_ENHANCEMENT_FEATURES;\n\n/** The features that change the media which these enhancements switch on, in the reviewer's words. */\nexport function visualEnhancementsOn(enhancements: { features?: Record<string, string> } | undefined): string[] {\n return Object.entries(enhancements?.features ?? {})\n .filter(([key, status]) => status === \"OPT_IN\" && key in VISUAL_ENHANCEMENT_FEATURES)\n .map(([key]) => VISUAL_ENHANCEMENT_FEATURES[key as VisualEnhancementFeature]);\n}\n\n/** What the enhancements switch turns on or off: suggestions to the words, never to the media. */\nexport const TEXT_ENHANCEMENT_FEATURES = [\"text_optimizations\", \"inline_comment\"] as const;\n\n// --- Statuses ---\n\nexport const ENTITY_STATUSES = [\"ACTIVE\", \"PAUSED\", \"DELETED\", \"ARCHIVED\"] as const;\nexport type MetaEntityStatus = (typeof ENTITY_STATUSES)[number];\n\n/** Statuses a create op may request (Meta forbids launching straight to DELETED/ARCHIVED). */\nexport const STAGEABLE_CREATE_STATUSES = [\"ACTIVE\", \"PAUSED\"] as const;\n/**\n * Statuses a campaign, ad set or ad update op may set. ARCHIVED keeps the entity\n * readable in Ads Manager (and counts toward Meta's archived-object limit);\n * DELETED removes it for good and cannot be undone. The CLI stages DELETED only\n * through its `delete` command; `update --status` refuses it.\n */\nexport const UPDATE_STATUSES = [\"ACTIVE\", \"PAUSED\", \"ARCHIVED\", \"DELETED\"] as const;\n/**\n * Statuses a creative update may set. DELETED is how a creative is deleted —\n * `POST /{creative_id}` with `status: DELETED` (live on v25.0, 2026-10-14) —\n * and Meta refuses it for a creative an ad still uses.\n */\nexport const CREATIVE_UPDATE_STATUSES = [\"ACTIVE\", \"PAUSED\", \"ARCHIVED\", \"DELETED\"] as const;\n\n// --- Custom audiences ---\n\nexport const CUSTOM_AUDIENCE_SUBTYPES = [\"CUSTOM\", \"WEBSITE\", \"ENGAGEMENT\", \"LOOKALIKE\"] as const;\nexport type MetaCustomAudienceSubtype = (typeof CUSTOM_AUDIENCE_SUBTYPES)[number];\n\n/**\n * Where the rows of a customer-file audience came from. Meta publishes exactly\n * these three, and the field is a data-provenance declaration about personal\n * data — the one place in this file where a free string was the wrong type.\n */\nexport const CUSTOMER_FILE_SOURCES = [\n \"USER_PROVIDED_ONLY\",\n \"PARTNER_PROVIDED_ONLY\",\n \"BOTH_USER_AND_PARTNER_PROVIDED\",\n] as const;\nexport type MetaCustomerFileSource = (typeof CUSTOMER_FILE_SOURCES)[number];\n\n// --- Media ---\n\nexport const MEDIA_KINDS = [\"image\", \"video\"] as const;\nexport type MetaMediaKind = (typeof MEDIA_KINDS)[number];\n\n// --- Money ---\n\n// Minor-unit conversion for the wire lives in the backend's single source of\n// truth, `ads/meta/currency.ts` (Meta's own offset table: whole-unit and\n// hundredth currencies, an unlisted one refused). It is intentionally NOT duplicated here.\n\n/**\n * Indicative per-currency daily-budget floors (Meta enforces the authoritative\n * per-account `min_daily_budget` at stage time; these only catch obvious\n * mistakes offline). Amounts in major units.\n */\nexport const CURRENCY_MINIMUMS: Record<string, { dailyBudgetMin: number }> = {\n USD: { dailyBudgetMin: 1 },\n EUR: { dailyBudgetMin: 1 },\n GBP: { dailyBudgetMin: 1 },\n};\nexport const DEFAULT_CURRENCY_MINIMUM = { dailyBudgetMin: 1 };\n\n// --- Refs / ids ---\n\nexport const TEMP_REF_PREFIX = \"meta_temp_\";\nexport const TEMP_REF_REGEX = /^meta_temp_[A-Za-z0-9_-]{4,}$/;\n/** Meta node ids are bare numeric strings (the `act_` prefix is stripped for scoping). */\nexport const NUMERIC_ID_REGEX = /^\\d+$/;\n/** Ad-image hashes are hex; be lenient on length across Graph versions. */\nexport const IMAGE_HASH_REGEX = /^[A-Fa-f0-9]{16,}$/;\nexport const SIMULATED_ID_PREFIX = \"sim_meta_\";\n"],"mappings":"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AA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASO,IAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA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","names":[]}
@@ -0,0 +1,363 @@
1
+ import {
2
+ MAX_VIDEO_INGEST_BYTES,
3
+ MAX_VIDEO_INGEST_SECONDS,
4
+ directDedupeKey,
5
+ downloadTimeoutMs,
6
+ isDirectMediaUrl,
7
+ isDrmProtected,
8
+ isRegionBlocked,
9
+ isToolingOrBlockFailure,
10
+ refuseByDuration,
11
+ resolveIngestSource,
12
+ worthDownloadingInstead
13
+ } from "./chunk-FKOECEVC.js";
14
+ import {
15
+ YtDlpError,
16
+ canonicalUrl,
17
+ durationSeconds,
18
+ isAudioOnly,
19
+ isVimeoAuthFailure,
20
+ probeYtDlp,
21
+ runYtDlp,
22
+ ytDlpBlockSignal
23
+ } from "./chunk-CVBKW75S.js";
24
+ import {
25
+ videosIngestRequestSchema
26
+ } from "./chunk-66QHX566.js";
27
+ import {
28
+ ApiError,
29
+ apiPost
30
+ } from "./chunk-XDZVBX6L.js";
31
+ import {
32
+ captureVimeoCookie,
33
+ isProxyFailure
34
+ } from "./chunk-EE72SSB2.js";
35
+ import {
36
+ registerSchema,
37
+ writeJson
38
+ } from "./chunk-WNSE7N75.js";
39
+
40
+ // src/commands/videos/ingest.ts
41
+ import { mkdtemp, rm, stat } from "fs/promises";
42
+ import { tmpdir } from "os";
43
+ import path from "path";
44
+ import { defineCommand } from "citty";
45
+
46
+ // src/lib/streamUpload.ts
47
+ import { createHash } from "crypto";
48
+ import { createReadStream } from "fs";
49
+ import { Readable } from "stream";
50
+ import { pipeline } from "stream/promises";
51
+ async function hashFile(filePath) {
52
+ const hash = createHash("sha256");
53
+ await pipeline(createReadStream(filePath), hash);
54
+ return hash.digest("hex");
55
+ }
56
+ async function putFileStreamed(args) {
57
+ const body = Readable.toWeb(createReadStream(args.filePath));
58
+ return await fetch(args.putUrl, {
59
+ method: "PUT",
60
+ body,
61
+ headers: {
62
+ "Content-Type": args.contentType,
63
+ "Content-Length": String(args.sizeBytes)
64
+ },
65
+ duplex: "half"
66
+ });
67
+ }
68
+
69
+ // src/commands/videos/ingest.ts
70
+ registerSchema({
71
+ command: "videos.ingest",
72
+ description: "Add a video to the library from a URL \u2014 a direct file, or a YouTube/TikTok/Vimeo page.",
73
+ args: {
74
+ url: { type: "string", description: "Video URL (direct file or a watch/post page)", required: true },
75
+ source: { type: "string", description: "Provenance: url | youtube", required: false },
76
+ "external-id": { type: "string", description: "Provider asset id (deduped on)", required: false },
77
+ "external-url": { type: "string", description: "Canonical page URL", required: false },
78
+ download: {
79
+ type: "boolean",
80
+ description: "Force the download path instead of letting Baker fetch the URL directly",
81
+ required: false,
82
+ default: false
83
+ },
84
+ country: {
85
+ type: "string",
86
+ description: "Two-letter country to fetch from (e.g. US, DE, JP) \u2014 use when a video is blocked in your region",
87
+ required: false
88
+ },
89
+ context: {
90
+ type: "string",
91
+ description: "What you know that the video cannot show \u2014 the campaign, whether the person on camera is a real customer, what it is for. Highest-leverage flag here: it is what makes the clip findable later.",
92
+ required: false
93
+ },
94
+ "dry-run": { type: "boolean", description: "Preview the operation without executing", required: false }
95
+ }
96
+ });
97
+ var ingestCommand = defineCommand({
98
+ meta: {
99
+ name: "ingest",
100
+ description: "Add a video to the library from a URL. A direct file URL is handed straight to Baker, which fetches it. A page URL (YouTube, TikTok, Vimeo, Instagram) is downloaded here first, then uploaded \u2014 and a direct URL that Baker cannot fetch falls back to that same path automatically.\n\nExample: baker videos ingest https://www.youtube.com/watch?v=abc123"
101
+ },
102
+ args: {
103
+ url: { type: "positional", description: "Video URL", required: false },
104
+ source: { type: "string", description: "Provenance: url | youtube", required: false },
105
+ "external-id": { type: "string", description: "Provider asset id", required: false },
106
+ "external-url": { type: "string", description: "Canonical page URL", required: false },
107
+ download: { type: "boolean", description: "Force the download path", required: false, default: false },
108
+ country: { type: "string", description: "Two-letter country to fetch from, e.g. US", required: false },
109
+ context: {
110
+ type: "string",
111
+ description: "Context for the analysis \u2014 campaign, who is on camera, intended use",
112
+ required: false
113
+ },
114
+ "dry-run": { type: "boolean", description: "Preview without executing", required: false, default: false }
115
+ },
116
+ run: ({ args }) => runVideoIngest({
117
+ url: args.url,
118
+ source: args.source,
119
+ externalId: args["external-id"],
120
+ externalUrl: args["external-url"],
121
+ forceDownload: args.download === true,
122
+ country: args.country,
123
+ context: args.context,
124
+ dryRun: args["dry-run"] === true
125
+ })
126
+ });
127
+ async function runVideoIngest(opts) {
128
+ const url = opts.url;
129
+ if (!url) {
130
+ writeJson({ ok: false, error: { code: "VALIDATION_ERROR", message: "URL is required" } });
131
+ process.exit(1);
132
+ }
133
+ const direct = !opts.forceDownload && isDirectMediaUrl(url);
134
+ const country = opts.country?.trim() || void 0;
135
+ const args = {
136
+ url,
137
+ source: resolveIngestSource(opts.source, url),
138
+ externalId: opts.externalId,
139
+ // Deliberately NOT pre-filled with the pasted URL. Doing so shadowed the
140
+ // canonical URL the probe resolves (`?? canonicalUrl(...)` below could never
141
+ // run), so the same video filed under a different `externalUrl` depending on
142
+ // whether the link was copied from a share sheet, a shorts page or the
143
+ // address bar. `downloadThenIngest` falls back to `args.url` when the probe
144
+ // resolves nothing, which is the value this used to hard-code.
145
+ externalUrl: opts.externalUrl,
146
+ descriptionContext: opts.context?.trim() || void 0
147
+ };
148
+ const validation = videosIngestRequestSchema.safeParse({ ...args, url });
149
+ if (!validation.success) {
150
+ const problem = validation.error.issues[0];
151
+ writeJson({
152
+ ok: false,
153
+ error: {
154
+ code: "VALIDATION_ERROR",
155
+ message: problem ? `${problem.path.join(".") || "request"}: ${problem.message}` : "Invalid request"
156
+ }
157
+ });
158
+ process.exit(1);
159
+ }
160
+ if (opts.dryRun) {
161
+ reportDryRun(args, direct, country);
162
+ return;
163
+ }
164
+ try {
165
+ const data = await ingestByRoute(args, direct, country);
166
+ writeJson({ ok: true, data, hints: ingestHints(data) });
167
+ } catch (err) {
168
+ reportIngestFailure(err);
169
+ }
170
+ }
171
+ function ingestHints(data) {
172
+ if (data.reducedQuality !== true) return void 0;
173
+ return [
174
+ "Added, but at standard quality (360p): the site refused to release the full-quality file and this was the best it would hand over. Tell the user \u2014 the clip is in the library and usable, it is just not high-resolution. If they need the crisp version, ask them for the original file and use `baker videos upload <file>`."
175
+ ];
176
+ }
177
+ function reportDryRun(args, direct, country) {
178
+ writeJson({
179
+ ok: true,
180
+ dryRun: true,
181
+ operation: "videos.ingest",
182
+ params: {
183
+ url: args.url,
184
+ source: args.source,
185
+ // Known up front on the direct route, because it is derived from the URL
186
+ // alone. The download route's key comes from the probe, which a dry run
187
+ // does not perform, so there it stays null rather than becoming a guess.
188
+ externalId: args.externalId ?? (direct ? directDedupeKey(args.source, args.url) : null),
189
+ // A page URL's canonical form is only known after the probe, which a dry
190
+ // run does not perform — so this is null rather than a guess.
191
+ externalUrl: args.externalUrl ?? null,
192
+ direct,
193
+ country: country ?? null,
194
+ descriptionContext: args.descriptionContext ?? null
195
+ }
196
+ });
197
+ }
198
+ async function ingestByRoute(args, direct, country) {
199
+ if (!direct) {
200
+ return { ...await downloadThenIngest(args, country), via: "download" };
201
+ }
202
+ try {
203
+ const externalId = args.externalId ?? directDedupeKey(args.source, args.url);
204
+ return { ...await ingestUrl({ ...args, externalId }), via: "direct" };
205
+ } catch (err) {
206
+ if (!(err instanceof ApiError) || !worthDownloadingInstead(err.code)) throw err;
207
+ return { ...await downloadThenIngest(args, country), via: "download", fallbackFrom: err.message };
208
+ }
209
+ }
210
+ function reportYtDlpFailure(err) {
211
+ const detail = `${err.stderrTail} ${err.message}`;
212
+ if (isProxyFailure(ytDlpBlockSignal(detail))) {
213
+ fail(
214
+ "Couldn't download that video: our connection to the internet was refused.",
215
+ "This is Baker's egress proxy, not the link \u2014 its credentials look wrong or expired. The link is probably fine. Report it; retrying won't help until the proxy is fixed."
216
+ );
217
+ }
218
+ if (isDrmProtected(detail)) {
219
+ fail(
220
+ "That video is copy-protected, so it can't be added to the library.",
221
+ "The publisher encrypted this one against downloading. Nothing will change that \u2014 not retrying, not a different region. Ask whoever owns the video for the original file and add it with `baker videos upload <file>`."
222
+ );
223
+ }
224
+ if (isVimeoAuthFailure(detail)) {
225
+ fail(
226
+ "Vimeo wouldn't hand over that video \u2014 Baker isn't signed in to Vimeo.",
227
+ "Vimeo now refuses anonymous downloads entirely, so this needs a signed-in session and the one Baker holds has either expired or was never set. Nothing is wrong with the link. Report it so the Vimeo cookie can be refreshed; meanwhile download the file and use `baker videos upload <file>`."
228
+ );
229
+ }
230
+ if (isRegionBlocked(detail)) {
231
+ fail(
232
+ `That video isn't available in the region we're fetching from. ${err.stderrTail || err.message}`,
233
+ "Re-run with `--country <two-letter code>` for a country where the video plays \u2014 e.g. `--country US`. Pick the one the video belongs to (the uploader's country is the usual answer); each attempt costs a paid connection, so choose rather than work through the list."
234
+ );
235
+ }
236
+ fail(
237
+ `Couldn't download that video. ${err.stderrTail || err.message}`,
238
+ isToolingOrBlockFailure(detail) ? "The site wouldn't hand over the video \u2014 usually the downloader being out of date against a site that changed, or the request being blocked. Retrying won't help, and the link is probably fine. Report it so the tool can be updated; meanwhile download the file and use `baker videos upload <file>`." : "Check the link is public and playable. Private or age-restricted videos can't be downloaded \u2014 download the file yourself and use `baker videos upload <file>`."
239
+ );
240
+ }
241
+ function fail(message, fix, code = "INGEST_FAILED") {
242
+ writeJson({ ok: false, error: { code, message, fix } });
243
+ process.exit(1);
244
+ }
245
+ function reportIngestFailure(err) {
246
+ if (err instanceof ApiError) {
247
+ writeJson({ ok: false, error: { code: err.code, message: err.message } });
248
+ process.exit(1);
249
+ }
250
+ if (err instanceof YtDlpError) reportYtDlpFailure(err);
251
+ const detail = err instanceof Error ? err.message : String(err);
252
+ if (detail.includes("timed out after")) {
253
+ fail(
254
+ "That video took too long to download and was stopped part-way.",
255
+ "Long or slow-serving videos can outrun the download window. Try a shorter clip, or download this one yourself and use `baker videos upload <file>`.",
256
+ "INTERNAL_ERROR"
257
+ );
258
+ }
259
+ fail(
260
+ `Couldn't add that video. ${detail}`,
261
+ "This is a fault on Baker's side, not a problem with the link. Report it.",
262
+ "INTERNAL_ERROR"
263
+ );
264
+ }
265
+ function dedupeKey(args, info) {
266
+ const id = typeof info.id === "string" ? info.id : void 0;
267
+ if (!id) return void 0;
268
+ if (info.extractor === "generic") return `${args.source}:${canonicalUrl(info) ?? args.url}`;
269
+ return `${args.source}:${id}`;
270
+ }
271
+ function ingestUrl(args) {
272
+ const body = {
273
+ url: args.url,
274
+ source: args.source
275
+ };
276
+ if (args.externalId) body.externalId = args.externalId;
277
+ if (args.externalUrl) body.externalUrl = args.externalUrl;
278
+ if (args.descriptionContext) body.descriptionContext = args.descriptionContext;
279
+ return apiPost("/api/videos/ingest", body);
280
+ }
281
+ async function downloadThenIngest(args, country) {
282
+ const vimeoCookie = captureVimeoCookie();
283
+ const workDir = await mkdtemp(path.join(tmpdir(), "videos-ingest-"));
284
+ try {
285
+ const probe = await probeYtDlp({ url: args.url, country, vimeoCookie, cookieDir: workDir });
286
+ if (isAudioOnly(probe.info)) {
287
+ throw new ApiError(
288
+ "VALIDATION_ERROR",
289
+ "That link is audio, not video, so it can't go in the video library. Music and podcast links have no picture to store."
290
+ );
291
+ }
292
+ const tooLong = refuseByDuration(durationSeconds(probe.info), MAX_VIDEO_INGEST_SECONDS);
293
+ if (tooLong) {
294
+ throw new ApiError("VALIDATION_ERROR", tooLong);
295
+ }
296
+ const externalId = args.externalId ?? dedupeKey(args, probe.info);
297
+ const { filePath, tier, reducedQuality } = await runYtDlp({
298
+ url: args.url,
299
+ audioOnly: false,
300
+ workDir,
301
+ // Deliberately uncapped: take the best the site will release and let Mux
302
+ // decide what to serve. The 1080p ceiling this replaces was reasoning
303
+ // about the wrong cost — it saved download bytes by throwing away source
304
+ // pixels *before* the one system that can make renditions from them ever
305
+ // saw them, so a 4K master became a 1080p master permanently, for
306
+ // everything the library is ever asked to do with that clip afterwards.
307
+ // Downscaling is Mux's job and it is cheap; re-acquiring a master is not.
308
+ country,
309
+ vimeoCookie,
310
+ // Budgeted from the probed length, so the duration we accept and the time
311
+ // we allow to fetch it cannot drift apart.
312
+ timeoutMs: downloadTimeoutMs(durationSeconds(probe.info))
313
+ });
314
+ const stats = await stat(filePath);
315
+ if (stats.size > MAX_VIDEO_INGEST_BYTES) {
316
+ throw new ApiError(
317
+ "VALIDATION_ERROR",
318
+ `That video is ${(stats.size / 1024 ** 3).toFixed(1)} GB, over the ${Math.round(MAX_VIDEO_INGEST_BYTES / 1024 ** 3)} GB limit for this route.`
319
+ );
320
+ }
321
+ const publicUrl = await uploadToAssetStore(filePath, stats.size);
322
+ return {
323
+ ...await ingestUrl({
324
+ ...args,
325
+ url: publicUrl,
326
+ externalId,
327
+ externalUrl: args.externalUrl ?? canonicalUrl(probe.info) ?? args.url
328
+ }),
329
+ egress: tier,
330
+ // Named in the result for the same reason `egress` is: a geo-targeted exit
331
+ // is a deliberate, billable choice and must not be invisible afterwards.
332
+ ...country ? { country } : {},
333
+ // Third member of the same family. The site refused the good formats and
334
+ // the download quietly took the one it would release, which is the right
335
+ // call — but a clip that is 360p because of that must say so here, or the
336
+ // only way to find out is to watch it.
337
+ ...reducedQuality ? { reducedQuality: true } : {}
338
+ };
339
+ } finally {
340
+ await rm(workDir, { recursive: true, force: true }).catch(() => {
341
+ });
342
+ }
343
+ }
344
+ async function uploadToAssetStore(filePath, sizeBytes) {
345
+ const sha256 = await hashFile(filePath);
346
+ const { putUrl, publicUrl } = await apiPost("/api/canvas/assets/presign", {
347
+ sha256,
348
+ mime: "video/mp4",
349
+ purpose: "source"
350
+ });
351
+ const putRes = await putFileStreamed({ putUrl, filePath, contentType: "video/mp4", sizeBytes });
352
+ if (!putRes.ok) {
353
+ throw new ApiError("INTERNAL_ERROR", `Storing the downloaded video failed: HTTP ${putRes.status}`);
354
+ }
355
+ return publicUrl;
356
+ }
357
+
358
+ export {
359
+ ingestCommand,
360
+ runVideoIngest,
361
+ ingestHints
362
+ };
363
+ //# sourceMappingURL=chunk-HSPMBLKE.js.map