@koda-sl/baker-cli 0.481.0-dev.2d33e194f → 0.495.0-dev.c2b64ccca

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 (1417) hide show
  1. package/README.md +66 -131
  2. package/canvas/avocado-tutorial.json +3 -3
  3. package/canvas/hello-world-overlay.json +1 -1
  4. package/dist/account-5VPZ3XQ3.js +79 -0
  5. package/dist/account-SYUEXERA.js +49 -0
  6. package/dist/account-ZQH535IP.js +80 -0
  7. package/dist/account-reads-GUYNJEZA.js +218 -0
  8. package/dist/account-writes-DLCRTL6Y.js +66 -0
  9. package/dist/accounts-3TNEMLLC.js +115 -0
  10. package/dist/accounts-GBRGCLE3.js +611 -0
  11. package/dist/accounts-IPOCFAKK.js +114 -0
  12. package/dist/accounts-QBWYIJ7D.js +77 -0
  13. package/dist/accounts-TSM5EHRD.js +75 -0
  14. package/dist/actions-XZMLYLTK.js +55 -0
  15. package/dist/active-entities-MFWTN4VJ.js +103 -0
  16. package/dist/activecampaign-77V5X3FQ.js +935 -0
  17. package/dist/activecampaign-77V5X3FQ.js.map +1 -0
  18. package/dist/activities-ZXA53KY7.js +74 -0
  19. package/dist/ad-group-writes-2JBCTSJY.js +170 -0
  20. package/dist/ad-groups-6JQSO32O.js +68 -0
  21. package/dist/ad-writes-P34Z3ZTX.js +174 -0
  22. package/dist/add-F2BF2HAK.js +105 -0
  23. package/dist/add-JAXBNDLC.js +97 -0
  24. package/dist/add-KAMQP5RM.js +302 -0
  25. package/dist/add-Y6QCWI6Q.js +104 -0
  26. package/dist/add-accounts-M4R7ZVHN.js +91 -0
  27. package/dist/ads-6MIIAUFS.js +40 -0
  28. package/dist/ads-6MIIAUFS.js.map +1 -0
  29. package/dist/ads-KPUP4WG4.js +128 -0
  30. package/dist/ads-UVQN4BTT.js +113 -0
  31. package/dist/ads-VPSHNIWG.js +77 -0
  32. package/dist/adsets-JAQKFDLX.js +176 -0
  33. package/dist/advertisers-2ETFYRKA.js +120 -0
  34. package/dist/advertisers-6ONURKP2.js +125 -0
  35. package/dist/analytics-AVDCFCGF.js +433 -0
  36. package/dist/analytics-AVDCFCGF.js.map +1 -0
  37. package/dist/analytics-XZ56777C.js +1976 -0
  38. package/dist/animate-KZQCCL65.js +480 -0
  39. package/dist/assign-DDXB7A6W.js +77 -0
  40. package/dist/audience-size-5QQAABZQ.js +94 -0
  41. package/dist/audiences-I4KJ6DZ7.js +85 -0
  42. package/dist/audiences-IFBZCTME.js +78 -0
  43. package/dist/audiences-THTWZOMA.js +268 -0
  44. package/dist/audit-2KOD4YCF.js +151 -0
  45. package/dist/audit-MFTERSQZ.js +88 -0
  46. package/dist/autocomplete-JC46QNHQ.js +111 -0
  47. package/dist/avatars-ZXQRZJM2.js +38 -0
  48. package/dist/bid-pricing-46W7LSU5.js +99 -0
  49. package/dist/brand-XROP2WL2.js +22 -0
  50. package/dist/brief-B7C3SYDP.js +537 -0
  51. package/dist/brief-B7C3SYDP.js.map +1 -0
  52. package/dist/businesses-JWOIY3OR.js +53 -0
  53. package/dist/campaign-groups-5O3SR5X2.js +95 -0
  54. package/dist/campaign-writes-4D4256DP.js +170 -0
  55. package/dist/campaign-writes-5BEK2QBJ.js +165 -0
  56. package/dist/campaigns-6DX2MACO.js +76 -0
  57. package/dist/campaigns-EJT7IMDT.js +109 -0
  58. package/dist/campaigns-OKU4HN5Q.js +107 -0
  59. package/dist/campaigns-QVPLPTH3.js +110 -0
  60. package/dist/canvas-XCP2WPYO.js +46 -0
  61. package/dist/capabilities-W4XDJVDW.js +144 -0
  62. package/dist/cards-2QCVG77U.js +85 -0
  63. package/dist/catalog-LTH6SDYM.js +65 -0
  64. package/dist/catalog-LTH6SDYM.js.map +1 -0
  65. package/dist/catalogs-RVW4L6C6.js +128 -0
  66. package/dist/changes-XRPDY2K4.js +135 -0
  67. package/dist/chatgpt-RNGSOVHP.js +47 -0
  68. package/dist/chats-JKCUA26S.js +262 -0
  69. package/dist/check-NDPR32FH.js +102 -0
  70. package/dist/check-NDPR32FH.js.map +1 -0
  71. package/dist/chunk-2C36DHQH.js +96 -0
  72. package/dist/chunk-2LIAXB3W.js +1079 -0
  73. package/dist/chunk-2MT3AWDE.js +125 -0
  74. package/dist/chunk-2WRK44LZ.js +296 -0
  75. package/dist/chunk-34NQKHKY.js +1599 -0
  76. package/dist/chunk-34NQKHKY.js.map +1 -0
  77. package/dist/chunk-35WKYJQY.js +382 -0
  78. package/dist/chunk-35WKYJQY.js.map +1 -0
  79. package/dist/chunk-3AOMKBDC.js +3194 -0
  80. package/dist/chunk-3AOMKBDC.js.map +1 -0
  81. package/dist/chunk-3FDGC2UH.js +846 -0
  82. package/dist/chunk-3FFJYMKM.js +333 -0
  83. package/dist/chunk-3PL2QRF2.js +96 -0
  84. package/dist/chunk-3XDZMLX6.js +139 -0
  85. package/dist/chunk-4R7H4RV6.js +35 -0
  86. package/dist/chunk-4TBDEV7X.js +75 -0
  87. package/dist/chunk-4WYEGE4N.js +2123 -0
  88. package/dist/chunk-4WYEGE4N.js.map +1 -0
  89. package/dist/chunk-5IGQ6IQO.js +1837 -0
  90. package/dist/chunk-5IGQ6IQO.js.map +1 -0
  91. package/dist/chunk-5VD5GK6A.js +58 -0
  92. package/dist/chunk-5ZIGEHQQ.js +166 -0
  93. package/dist/chunk-66ZIZ7QP.js +26 -0
  94. package/dist/chunk-6DSLFOKJ.js +74 -0
  95. package/dist/chunk-6EV5MXLQ.js +66 -0
  96. package/dist/chunk-6EV5MXLQ.js.map +1 -0
  97. package/dist/chunk-6FHP2HIK.js +84 -0
  98. package/dist/chunk-6VI2DDGZ.js +106 -0
  99. package/dist/chunk-72QBQS63.js +111 -0
  100. package/dist/chunk-7DBOLSUL.js +51 -0
  101. package/dist/chunk-7FDDOOM4.js +19 -0
  102. package/dist/chunk-7XH4UQWS.js +302 -0
  103. package/dist/chunk-7XH4UQWS.js.map +1 -0
  104. package/dist/chunk-AN7CMLYY.js +25 -0
  105. package/dist/chunk-B2SAOVMU.js +148 -0
  106. package/dist/chunk-B2SAOVMU.js.map +1 -0
  107. package/dist/chunk-BC2BXRXY.js +2887 -0
  108. package/dist/chunk-BC2BXRXY.js.map +1 -0
  109. package/dist/chunk-BDMZRWQI.js +433 -0
  110. package/dist/chunk-BITS62MF.js +77 -0
  111. package/dist/chunk-BVMXTD4B.js +169 -0
  112. package/dist/chunk-BVMXTD4B.js.map +1 -0
  113. package/dist/chunk-CCFZB42B.js +76 -0
  114. package/dist/chunk-CKRSSMRT.js +191 -0
  115. package/dist/chunk-D53AAUG4.js +215 -0
  116. package/dist/chunk-DGUYFROS.js +76 -0
  117. package/dist/chunk-DS2ZRTAL.js +136 -0
  118. package/dist/chunk-EIJDXZW5.js +1743 -0
  119. package/dist/chunk-EJH2JOVG.js +98 -0
  120. package/dist/chunk-EJWFD6T3.js +188 -0
  121. package/dist/chunk-ELNN4SNW.js +52 -0
  122. package/dist/chunk-ELYP6BOS.js +156 -0
  123. package/dist/chunk-ELYP6BOS.js.map +1 -0
  124. package/dist/chunk-EUB327FC.js +57 -0
  125. package/dist/chunk-EWRGZZLS.js +159 -0
  126. package/dist/chunk-EWRGZZLS.js.map +1 -0
  127. package/dist/chunk-FBF5XDJX.js +106 -0
  128. package/dist/chunk-FP3GNJN2.js +98 -0
  129. package/dist/chunk-FZKUUI3F.js +455 -0
  130. package/dist/chunk-FZKUUI3F.js.map +1 -0
  131. package/dist/chunk-G2AZCDX4.js +216 -0
  132. package/dist/chunk-G2AZCDX4.js.map +1 -0
  133. package/dist/chunk-G373L4GL.js +45 -0
  134. package/dist/chunk-GFFV6YS7.js +903 -0
  135. package/dist/chunk-GFFV6YS7.js.map +1 -0
  136. package/dist/chunk-GN6WIZDD.js +392 -0
  137. package/dist/chunk-GN6WIZDD.js.map +1 -0
  138. package/dist/chunk-GTOHNTTI.js +274 -0
  139. package/dist/chunk-HDNZSVJJ.js +665 -0
  140. package/dist/chunk-HLAAGGDS.js +346 -0
  141. package/dist/chunk-HX7PM34O.js +197 -0
  142. package/dist/chunk-IGOOLUE2.js +821 -0
  143. package/dist/chunk-IGOOLUE2.js.map +1 -0
  144. package/dist/chunk-IKTKWXP6.js +172 -0
  145. package/dist/chunk-IOGKJZ4Z.js +74 -0
  146. package/dist/chunk-IVRXPYQ7.js +60 -0
  147. package/dist/chunk-JIJJCU6E.js +363 -0
  148. package/dist/chunk-JOCKYH6U.js +297 -0
  149. package/dist/chunk-KPYDTIAI.js +317 -0
  150. package/dist/chunk-KPYDTIAI.js.map +1 -0
  151. package/dist/chunk-L44WSWSZ.js +23 -0
  152. package/dist/chunk-LF3MFO2N.js +23992 -0
  153. package/dist/chunk-LF3MFO2N.js.map +1 -0
  154. package/dist/chunk-M525HJTA.js +275 -0
  155. package/dist/chunk-M6UNISGO.js +66 -0
  156. package/dist/chunk-M6UNISGO.js.map +1 -0
  157. package/dist/chunk-MBYTIGZE.js +111 -0
  158. package/dist/chunk-MBYTIGZE.js.map +1 -0
  159. package/dist/chunk-MMU6XHCH.js +97 -0
  160. package/dist/chunk-MNPBPU3G.js +225 -0
  161. package/dist/chunk-MNPBPU3G.js.map +1 -0
  162. package/dist/chunk-MRRSKRZZ.js +84 -0
  163. package/dist/chunk-MV2J73HP.js +6238 -0
  164. package/dist/chunk-MV2J73HP.js.map +1 -0
  165. package/dist/chunk-NEHQGYZS.js +5181 -0
  166. package/dist/chunk-NEHQGYZS.js.map +1 -0
  167. package/dist/chunk-NFHUJRDE.js +136 -0
  168. package/dist/chunk-NG2DMLU6.js +175 -0
  169. package/dist/chunk-NG2DMLU6.js.map +1 -0
  170. package/dist/chunk-NSHJ6OOK.js +67 -0
  171. package/dist/chunk-OCBAKPHH.js +76 -0
  172. package/dist/chunk-OFTU5XBQ.js +92 -0
  173. package/dist/chunk-OSWCEDFE.js +216 -0
  174. package/dist/chunk-OTNGMKI6.js +309 -0
  175. package/dist/chunk-PAJJXZ3Z.js +170 -0
  176. package/dist/chunk-PALFKSJV.js +237 -0
  177. package/dist/chunk-PALFKSJV.js.map +1 -0
  178. package/dist/chunk-PGSXR5UM.js +206 -0
  179. package/dist/chunk-PPMSWLQC.js +158 -0
  180. package/dist/chunk-PPMSWLQC.js.map +1 -0
  181. package/dist/chunk-QAOEVZYY.js +509 -0
  182. package/dist/chunk-QEW64BBR.js +777 -0
  183. package/dist/chunk-QEW64BBR.js.map +1 -0
  184. package/dist/chunk-QK5PEHFX.js +3088 -0
  185. package/dist/chunk-QK5PEHFX.js.map +1 -0
  186. package/dist/chunk-QVQKCVP7.js +85 -0
  187. package/dist/chunk-QVQKCVP7.js.map +1 -0
  188. package/dist/chunk-QW2Q4C2X.js +547 -0
  189. package/dist/chunk-QW2Q4C2X.js.map +1 -0
  190. package/dist/chunk-R5HMAIZM.js +169 -0
  191. package/dist/chunk-RPRLCIHB.js +103 -0
  192. package/dist/chunk-RV4GIY23.js +149 -0
  193. package/dist/chunk-RVXN2YTM.js +544 -0
  194. package/dist/chunk-RVXN2YTM.js.map +1 -0
  195. package/dist/chunk-RXUEYD2S.js +592 -0
  196. package/dist/chunk-S4ROJTDY.js +580 -0
  197. package/dist/chunk-S4ROJTDY.js.map +1 -0
  198. package/dist/chunk-SJOWZKNB.js +56 -0
  199. package/dist/chunk-SQQ4VBNI.js +304 -0
  200. package/dist/chunk-SQQ4VBNI.js.map +1 -0
  201. package/dist/chunk-SYED65QF.js +46 -0
  202. package/dist/chunk-SYED65QF.js.map +1 -0
  203. package/dist/chunk-T5HB6R4I.js +518 -0
  204. package/dist/chunk-T5HB6R4I.js.map +1 -0
  205. package/dist/chunk-TE3N5AGN.js +94 -0
  206. package/dist/chunk-TPQH4UXJ.js +174 -0
  207. package/dist/chunk-TQUNJFGF.js +225 -0
  208. package/dist/chunk-TYSN5VVJ.js +55 -0
  209. package/dist/chunk-UKMG6YWX.js +26 -0
  210. package/dist/chunk-WDAWTHQK.js +66 -0
  211. package/dist/chunk-WJNLQEOZ.js +131 -0
  212. package/dist/chunk-WJNLQEOZ.js.map +1 -0
  213. package/dist/chunk-WZDKROPU.js +6995 -0
  214. package/dist/chunk-WZDKROPU.js.map +1 -0
  215. package/dist/chunk-X3PCCHP2.js +74 -0
  216. package/dist/chunk-XQ4KKF5E.js +1448 -0
  217. package/dist/chunk-XQ4KKF5E.js.map +1 -0
  218. package/dist/chunk-XXU7XRMM.js +4434 -0
  219. package/dist/chunk-XXU7XRMM.js.map +1 -0
  220. package/dist/chunk-YJAQWTS6.js +455 -0
  221. package/dist/chunk-YNOJN5Z6.js +42 -0
  222. package/dist/chunk-YTV5VW7S.js +494 -0
  223. package/dist/chunk-ZO4GMUO3.js +172 -0
  224. package/dist/chunk-ZSRLDTDC.js +46 -0
  225. package/dist/claim-JBNO7M6J.js +197 -0
  226. package/dist/cli.js +39 -38
  227. package/dist/cli.js.map +1 -1
  228. package/dist/client-CPAPILIF.js +19 -0
  229. package/dist/code-GHOVETWX.js +76 -0
  230. package/dist/companies-47T2PCRZ.js +195 -0
  231. package/dist/complete-T3PKN4B7.js +81 -0
  232. package/dist/config-AFNXR5FA.js +88 -0
  233. package/dist/connect-T7R43GIH.js +42 -0
  234. package/dist/content-M3U2SCFJ.js +85 -0
  235. package/dist/conversation-BG7WEMXQ.js +93 -0
  236. package/dist/conversion-report-URDTPXQ7.js +125 -0
  237. package/dist/conversion-upload-command-BWF6MAOK.js +438 -0
  238. package/dist/conversion-writes-7MGIFJ3H.js +120 -0
  239. package/dist/conversions-QY6COYPP.js +76 -0
  240. package/dist/conversions-UTXG5YEO.js +135 -0
  241. package/dist/countries-MUZPFSYZ.js +82 -0
  242. package/dist/create-6QASIASQ.js +235 -0
  243. package/dist/create-FIHEJRAF.js +59 -0
  244. package/dist/create-JXZBMXUS.js +207 -0
  245. package/dist/create-LN23WUB5.js +126 -0
  246. package/dist/create-LN23WUB5.js.map +1 -0
  247. package/dist/creatives-6FG6VAB4.js +87 -0
  248. package/dist/creatives-NJ7SZ3S4.js +58 -0
  249. package/dist/creatives-NJ7SZ3S4.js.map +1 -0
  250. package/dist/creatives-UD6TFATS.js +182 -0
  251. package/dist/credentials-ECPD2A7X.js +287 -0
  252. package/dist/critique-LINKOKOE.js +220 -0
  253. package/dist/critique-LINKOKOE.js.map +1 -0
  254. package/dist/critique-WQ3EP6E5.js +1450 -0
  255. package/dist/critique-WQ3EP6E5.js.map +1 -0
  256. package/dist/crm-4EWUWZNZ.js +318 -0
  257. package/dist/crm-ASWKMKF3.js +224 -0
  258. package/dist/crop-MIVSA2YF.js +113 -0
  259. package/dist/currency-5LU3D62R.js +88 -0
  260. package/dist/custom-conversions-3QGJQRYS.js +125 -0
  261. package/dist/customers-EEBZXQ4J.js +56 -0
  262. package/dist/decide-ZODJU7DY.js +199 -0
  263. package/dist/delete-CTH3TGNM.js +71 -0
  264. package/dist/delete-D6GNTBYI.js +54 -0
  265. package/dist/delete-IWIDUJNS.js +69 -0
  266. package/dist/delete-TLVYBVRP.js +71 -0
  267. package/dist/delete-XPHIQY5Z.js +63 -0
  268. package/dist/delete-XZEPLAKT.js +66 -0
  269. package/dist/demographics-L3TJJAFF.js +138 -0
  270. package/dist/describe-5PM5OSYK.js +97 -0
  271. package/dist/describe-KQLRHGFX.js +97 -0
  272. package/dist/dimensions-6H24D7CM.js +101 -0
  273. package/dist/discard-74I3M2DF.js +66 -0
  274. package/dist/discover-6LGIHWVP.js +93 -0
  275. package/dist/discover-HBQO4RSF.js +172 -0
  276. package/dist/domain-E5DTPAZI.js +98 -0
  277. package/dist/download-ED52W77T.js +299 -0
  278. package/dist/draft-3XYF2L4K.js +306 -0
  279. package/dist/draft-5IEMZ4W3.js +103 -0
  280. package/dist/draft-6UVGEERY.js +281 -0
  281. package/dist/draft-FDBE36CP.js +233 -0
  282. package/dist/draft-PE4DN44Y.js +307 -0
  283. package/dist/draft-QBR22TG2.js +328 -0
  284. package/dist/draft-VZYSJVF5.js +217 -0
  285. package/dist/draft-YWTLO2ON.js +100 -0
  286. package/dist/engine/index.js +15 -14
  287. package/dist/env-GS2TUVCM.js +43 -0
  288. package/dist/experiment-XDJHSOBC.js +1397 -0
  289. package/dist/export-GV5CF5UM.js +168 -0
  290. package/dist/extract-4OXK7L7R.js +113 -0
  291. package/dist/facets-XPB2ELM2.js +114 -0
  292. package/dist/favorites-VKPXGTK6.js +178 -0
  293. package/dist/feed-B2YLZQNU.js +177 -0
  294. package/dist/feedback-HT2M63QW.js +66 -0
  295. package/dist/feedback-record-V7UU6CG3.js +246 -0
  296. package/dist/feedback-record-V7UU6CG3.js.map +1 -0
  297. package/dist/fetch-2O7EUCCZ.js +139 -0
  298. package/dist/fetch-GMNE6KOJ.js +176 -0
  299. package/dist/find-LZZNPFJH.js +134 -0
  300. package/dist/find-LZZNPFJH.js.map +1 -0
  301. package/dist/fit-S5ZGPNE3.js +56 -0
  302. package/dist/flows-5SXT5F22.js +247 -0
  303. package/dist/flows-5SXT5F22.js.map +1 -0
  304. package/dist/follow-UNIHLZKA.js +94 -0
  305. package/dist/follow-competitors-CQL2B55H.js +112 -0
  306. package/dist/following-GMXZIEDZ.js +113 -0
  307. package/dist/fonts-GPJQLNQL.js +35 -0
  308. package/dist/forecast-6AHSHRDJ.js +168 -0
  309. package/dist/forecast-V6BCMR4Y.js +104 -0
  310. package/dist/funding-WPREDQVA.js +85 -0
  311. package/dist/funnel-QDYX3UH5.js +394 -0
  312. package/dist/ga4-6AUOX2UW.js +55 -0
  313. package/dist/generate-LWSAKRIT.js +263 -0
  314. package/dist/generate-LWSAKRIT.js.map +1 -0
  315. package/dist/get-5OEDAT2Q.js +63 -0
  316. package/dist/get-7WEE5V7M.js +56 -0
  317. package/dist/get-DXGJSEZZ.js +63 -0
  318. package/dist/get-GQWOLALT.js +59 -0
  319. package/dist/get-W7F4FOAR.js +92 -0
  320. package/dist/get-WY6JXFP6.js +61 -0
  321. package/dist/get-X6DSFXN6.js +78 -0
  322. package/dist/gif-JXWSR2TC.js +94 -0
  323. package/dist/google-44QA3M4N.js +3190 -0
  324. package/dist/google-44QA3M4N.js.map +1 -0
  325. package/dist/google-6QFL6GV3.js +136 -0
  326. package/dist/google-ads-ZG3BDUEG.js +195 -0
  327. package/dist/group-7ADT2GWA.js +43 -0
  328. package/dist/group-VD3UIBKE.js +43 -0
  329. package/dist/gsc-WHMPFTYA.js +30 -0
  330. package/dist/history-33JKOKAV.js +133 -0
  331. package/dist/history-M3IKDCEO.js +67 -0
  332. package/dist/hubspot-B4IUIOYX.js +779 -0
  333. package/dist/icon-R2K27DKI.js +137 -0
  334. package/dist/ideas-HHTLPC6Y.js +39 -0
  335. package/dist/images-PV6TZQLL.js +90 -0
  336. package/dist/improve-TVFAR27Q.js +86 -0
  337. package/dist/ingest-25ZX36RL.js +23 -0
  338. package/dist/ingest-MFIT3L23.js +107 -0
  339. package/dist/insights-CE3GICP7.js +423 -0
  340. package/dist/insights-CE3GICP7.js.map +1 -0
  341. package/dist/insights-TGAQLNHO.js +122 -0
  342. package/dist/insights-TGAQLNHO.js.map +1 -0
  343. package/dist/inspect-2IASA5YV.js +189 -0
  344. package/dist/inspiration-O56SOIQP.js +53 -0
  345. package/dist/intent-JOW24MTF.js +95 -0
  346. package/dist/job-QUO6KULI.js +202 -0
  347. package/dist/job-create-JTOG5M3Q.js +109 -0
  348. package/dist/job-status-3B4X5IPG.js +74 -0
  349. package/dist/keep-5TVGX7EG.js +78 -0
  350. package/dist/keyword-gap-SHLXRIHO.js +130 -0
  351. package/dist/keyword-metrics-NYH6DXKJ.js +197 -0
  352. package/dist/keywords-for-site-JTK64W4I.js +128 -0
  353. package/dist/landing-4V7HMYCZ.js +28 -0
  354. package/dist/landings-LZZO4VVW.js +151 -0
  355. package/dist/languages-TINK472E.js +55 -0
  356. package/dist/languages-ZIGJHY2T.js +40 -0
  357. package/dist/launches-C5XXNF7C.js +19 -0
  358. package/dist/layerize-YVCA4JO7.js +190 -0
  359. package/dist/leads-2WTL7F24.js +90 -0
  360. package/dist/leads-QUO3YNHO.js +293 -0
  361. package/dist/learn-RL66WKHT.js +204 -0
  362. package/dist/learn-RL66WKHT.js.map +1 -0
  363. package/dist/library-EEHRR7WX.js +109 -0
  364. package/dist/library-EEHRR7WX.js.map +1 -0
  365. package/dist/lighthouse-QLFI7PSQ.js +75 -0
  366. package/dist/line-item-writes-SYSYGV3L.js +208 -0
  367. package/dist/line-items-H3M6T7P2.js +103 -0
  368. package/dist/link-EHSSSV6K.js +64 -0
  369. package/dist/linkedin-BGZIR43P.js +1008 -0
  370. package/dist/list-2IAOPMQC.js +76 -0
  371. package/dist/list-BGT2BEWD.js +57 -0
  372. package/dist/list-G2VYAKYF.js +151 -0
  373. package/dist/list-IFXQWBBE.js +65 -0
  374. package/dist/list-LK3CVZ3B.js +50 -0
  375. package/dist/list-X2TMGY7C.js +303 -0
  376. package/dist/list-X3SEZDKE.js +51 -0
  377. package/dist/list-ZFS7XBD7.js +63 -0
  378. package/dist/locations-JC2H5JMY.js +67 -0
  379. package/dist/locations-M4L7FUOB.js +40 -0
  380. package/dist/log-4EINR63D.js +92 -0
  381. package/dist/logo-7GDRTSLI.js +18 -0
  382. package/dist/lookup-SJXNPUXG.js +22 -0
  383. package/dist/make-4XCSN76S.js +1137 -0
  384. package/dist/make-4XCSN76S.js.map +1 -0
  385. package/dist/map-EFEKUPNJ.js +433 -0
  386. package/dist/map-EFEKUPNJ.js.map +1 -0
  387. package/dist/mcp-RQJAEJCJ.js +463 -0
  388. package/dist/media-FYGHJAEG.js +89 -0
  389. package/dist/media-YYYCKXMZ.js +15 -0
  390. package/dist/media-sources-ZLBIC4RM.js +32 -0
  391. package/dist/members-SXATNT7V.js +44 -0
  392. package/dist/meta-OGB3NB2W.js +69 -0
  393. package/dist/metrics-52ZARN6M.js +152 -0
  394. package/dist/models-LSEMO4XH.js +155 -0
  395. package/dist/normalize-3HI26S34.js +806 -0
  396. package/dist/normalize-SOFYZQSJ.js +141 -0
  397. package/dist/options-GKSCCFM7.js +122 -0
  398. package/dist/options-GKSCCFM7.js.map +1 -0
  399. package/dist/output-YJ4YBUU4.js +24 -0
  400. package/dist/page-ZGCK6MOQ.js +105 -0
  401. package/dist/pages-QMP3W2R3.js +66 -0
  402. package/dist/performance-BQSWGNFO.js +24 -0
  403. package/dist/pinterest-LCVUB2ZL.js +96 -0
  404. package/dist/pixels-UQGAPBLG.js +60 -0
  405. package/dist/pixels-YM2DX7EN.js +108 -0
  406. package/dist/plan-Z5TZRRCH.js +207 -0
  407. package/dist/preview-DZQUUQGD.js +169 -0
  408. package/dist/profile-SXX36XVS.js +159 -0
  409. package/dist/profile-SXX36XVS.js.map +1 -0
  410. package/dist/promoted-tweet-writes-VUNJIUA3.js +180 -0
  411. package/dist/promoted-tweets-55X4H7NG.js +119 -0
  412. package/dist/properties-CSW67FJG.js +101 -0
  413. package/dist/publish-U73OR33K.js +322 -0
  414. package/dist/query-UQQNESTT.js +236 -0
  415. package/dist/query-V4I3VCJ7.js +61 -0
  416. package/dist/query-XPCC7OUP.js +247 -0
  417. package/dist/questionnaire-UQNRYZK7.js +93 -0
  418. package/dist/read-RXAOLPG5.js +141 -0
  419. package/dist/reddit-C2B7NT7X.js +26 -0
  420. package/dist/refresh-JN4HKE4H.js +94 -0
  421. package/dist/release-HSAOBN5K.js +60 -0
  422. package/dist/relevant-pages-XBWFEHHE.js +99 -0
  423. package/dist/remove-G5UXVQ2W.js +50 -0
  424. package/dist/remove-Q4TL5ZFS.js +48 -0
  425. package/dist/reopen-D26VSRRL.js +63 -0
  426. package/dist/rerun-NWOGRYHU.js +89 -0
  427. package/dist/rerun-NWOGRYHU.js.map +1 -0
  428. package/dist/research-CRYX2CAR.js +262 -0
  429. package/dist/research-XRVD2GSG.js +62 -0
  430. package/dist/reset-2VVN4CY7.js +54 -0
  431. package/dist/reset-FWDPBHYO.js +54 -0
  432. package/dist/resolve-D4PCGIWO.js +121 -0
  433. package/dist/retry-AHZFHMTH.js +60 -0
  434. package/dist/retry-FV6ASVO5.js +62 -0
  435. package/dist/retry-failed-AENQRGML.js +45 -0
  436. package/dist/rules-DSLE6LVU.js +95 -0
  437. package/dist/rules-DSLE6LVU.js.map +1 -0
  438. package/dist/rules-add-NBOMKFAI.js +446 -0
  439. package/dist/rules-add-NBOMKFAI.js.map +1 -0
  440. package/dist/run-AGSHZQND.js +65 -0
  441. package/dist/run-IRJWKZ3K.js +64 -0
  442. package/dist/scaffold-ad-3BSA7BWT.js +1553 -0
  443. package/dist/scaffold-ad-3BSA7BWT.js.map +1 -0
  444. package/dist/scaffold-static-ad-Q26LLBWQ.js +976 -0
  445. package/dist/scaffold-static-ad-Q26LLBWQ.js.map +1 -0
  446. package/dist/scaffold-video-WE52C7YZ.js +877 -0
  447. package/dist/scaffold-video-WE52C7YZ.js.map +1 -0
  448. package/dist/schedule-DTKBBIEH.js +66 -0
  449. package/dist/schedule-ESHQ4II7.js +61 -0
  450. package/dist/scheduled-agents-AREYFW23.js +50 -0
  451. package/dist/scheduled-agents-AREYFW23.js.map +1 -0
  452. package/dist/schema-OBF4T2QN.js +63 -0
  453. package/dist/schema-SWG2WKYX.js +132 -0
  454. package/dist/scrape-AGGDUPPD.js +2241 -0
  455. package/dist/screenshot-6GGCQCIV.js +102 -0
  456. package/dist/search-FRSFGJLZ.js +92 -0
  457. package/dist/search-I64WW2QC.js +174 -0
  458. package/dist/search-L2KHX5DO.js +224 -0
  459. package/dist/search-MBDEQ6EE.js +26 -0
  460. package/dist/search-UCDN4TOT.js +91 -0
  461. package/dist/search-copy-HX3FYZGT.js +168 -0
  462. package/dist/seeds-VFEFE4AK.js +101 -0
  463. package/dist/select-4IQQNKLN.js +100 -0
  464. package/dist/select-4IQQNKLN.js.map +1 -0
  465. package/dist/sends-WDSOXBSS.js +309 -0
  466. package/dist/sequences-NMJ55HS5.js +146 -0
  467. package/dist/set-prompt-DE4TD2V7.js +192 -0
  468. package/dist/set-prompt-DE4TD2V7.js.map +1 -0
  469. package/dist/setup-links-NAAUQD7O.js +141 -0
  470. package/dist/shared-3GVQQQNL.js +31 -0
  471. package/dist/site-VTJU5CRE.js +177 -0
  472. package/dist/sitemaps-KS57YDGB.js +87 -0
  473. package/dist/sites-PUEEVW7H.js +101 -0
  474. package/dist/skills-N6NRI2LC.js +47 -0
  475. package/dist/sources-CMUU4FER.js +454 -0
  476. package/dist/sources-CMUU4FER.js.map +1 -0
  477. package/dist/sources-YUMNEFK5.js +30 -0
  478. package/dist/stale-E34H24C3.js +70 -0
  479. package/dist/stale-E34H24C3.js.map +1 -0
  480. package/dist/stats-SY6GRHKB.js +34 -0
  481. package/dist/status-PVW64CLX.js +62 -0
  482. package/dist/sticker-YS6W5TSZ.js +94 -0
  483. package/dist/stock-DWL5E6K4.js +179 -0
  484. package/dist/studio-SXBK2IJJ.js +49 -0
  485. package/dist/sync-FOLYGQDI.js +54 -0
  486. package/dist/sync-NORMNZEE.js +54 -0
  487. package/dist/sync-XHJDCWWP.js +265 -0
  488. package/dist/sync-XHJDCWWP.js.map +1 -0
  489. package/dist/sync-definition-DTWEW6ZC.js +61 -0
  490. package/dist/tag-manager-ARFZU46G.js +43 -0
  491. package/dist/tags-77JUO75W.js +20 -0
  492. package/dist/tags-DOJUSHJB.js +224 -0
  493. package/dist/tags-IESRRMGW.js +20 -0
  494. package/dist/tags-MRTUBMRD.js +20 -0
  495. package/dist/tags-SP6GW4R7.js +26 -0
  496. package/dist/targeting-constants-DVGRIRKD.js +118 -0
  497. package/dist/targeting-criteria-SOK3HUE2.js +113 -0
  498. package/dist/targets-V2HNKVUL.js +102 -0
  499. package/dist/testimonials-PA2FUV4H.js +32 -0
  500. package/dist/themes-IDB7YPHW.js +94 -0
  501. package/dist/top-companies-XDP4SZN7.js +108 -0
  502. package/dist/translate-V6XPDX4M.js +604 -0
  503. package/dist/translate-V6XPDX4M.js.map +1 -0
  504. package/dist/triggers-QDXCA5P4.js +141 -0
  505. package/dist/tweets-AISMWXM3.js +123 -0
  506. package/dist/unfollow-PHLMILG2.js +46 -0
  507. package/dist/unlink-GDZV5GVL.js +67 -0
  508. package/dist/unstage-WCC2TI5Z.js +95 -0
  509. package/dist/unstage-WDJXHSAV.js +84 -0
  510. package/dist/update-KBF35KYV.js +63 -0
  511. package/dist/update-MRG5MPHR.js +98 -0
  512. package/dist/update-XNNQGZBO.js +155 -0
  513. package/dist/update-ZGDQJPDL.js +142 -0
  514. package/dist/upload-ID35OCCY.js +126 -0
  515. package/dist/upload-R7YJORED.js +150 -0
  516. package/dist/upscale-XPGVJWW2.js +109 -0
  517. package/dist/url-options-6X7M2J7D.js +130 -0
  518. package/dist/url-params-WRLCJRJQ.js +98 -0
  519. package/dist/use-VCL3PRCB.js +95 -0
  520. package/dist/validate-VTAKQGD5.js +95 -0
  521. package/dist/validate-VTAKQGD5.js.map +1 -0
  522. package/dist/variant-2NADVT6Q.js +338 -0
  523. package/dist/videos-M6VK66NI.js +39 -0
  524. package/dist/view-Q5B57K42.js +121 -0
  525. package/dist/viewer-check-3T2EZOSH.js +79 -0
  526. package/dist/viewer-check-3T2EZOSH.js.map +1 -0
  527. package/dist/web-GOD7BF7X.js +140 -0
  528. package/dist/winners-PK6EMR6B.js +113 -0
  529. package/dist/winning-ads-F765TFLS.js +84 -0
  530. package/dist/write-commands-4KWMNH6A.js +1015 -0
  531. package/dist/write-commands-7ECRGXLK.js +737 -0
  532. package/dist/write-commands-GL2PHXSU.js +713 -0
  533. package/dist/write-commands-NMV65XXB.js +206 -0
  534. package/dist/x-MDENBZ3X.js +47 -0
  535. package/package.json +1 -1
  536. package/dist/account-67PZBEP6.js +0 -79
  537. package/dist/account-HZC6X2PH.js +0 -49
  538. package/dist/account-TQUV64XP.js +0 -80
  539. package/dist/account-reads-IRBTERTY.js +0 -218
  540. package/dist/account-writes-ALDSHAEV.js +0 -66
  541. package/dist/accounts-4P54UY6F.js +0 -115
  542. package/dist/accounts-6UNBLIUH.js +0 -75
  543. package/dist/accounts-GVTZN4VE.js +0 -114
  544. package/dist/accounts-NJ6TF6WH.js +0 -611
  545. package/dist/accounts-WTB737BM.js +0 -77
  546. package/dist/actions-D3BOWDEB.js +0 -55
  547. package/dist/active-entities-J2O76SRP.js +0 -103
  548. package/dist/activities-2J7FTZMN.js +0 -74
  549. package/dist/ad-group-writes-PQKDCMQF.js +0 -170
  550. package/dist/ad-groups-NGYEJMV4.js +0 -68
  551. package/dist/ad-writes-77FVHJTS.js +0 -174
  552. package/dist/add-2FHPLALV.js +0 -105
  553. package/dist/add-2XJYOGKW.js +0 -104
  554. package/dist/add-62JPGFD4.js +0 -302
  555. package/dist/add-JP76KCCY.js +0 -97
  556. package/dist/add-accounts-M5Y4DQFM.js +0 -91
  557. package/dist/ads-DB5NDHX5.js +0 -128
  558. package/dist/ads-J2F7BSHR.js +0 -45
  559. package/dist/ads-J2F7BSHR.js.map +0 -1
  560. package/dist/ads-LYNA2I7B.js +0 -77
  561. package/dist/ads-W2IPUWHQ.js +0 -113
  562. package/dist/adsets-PY5ZKGBO.js +0 -176
  563. package/dist/advertisers-BVAZ4XUX.js +0 -125
  564. package/dist/advertisers-NZPJQF7W.js +0 -120
  565. package/dist/analytics-K2QIWKBN.js +0 -444
  566. package/dist/analytics-K2QIWKBN.js.map +0 -1
  567. package/dist/analytics-NTPZKMYK.js +0 -1976
  568. package/dist/animate-EIV2OHXT.js +0 -480
  569. package/dist/assign-UNIA5YDC.js +0 -77
  570. package/dist/audience-size-4NN6ENP5.js +0 -94
  571. package/dist/audiences-45ZCY2VZ.js +0 -268
  572. package/dist/audiences-UUIYQFS6.js +0 -78
  573. package/dist/audiences-VYFX7OFS.js +0 -85
  574. package/dist/audit-NSVHNA5J.js +0 -151
  575. package/dist/audit-OWXTLQC4.js +0 -88
  576. package/dist/autocomplete-EHWAQYVB.js +0 -111
  577. package/dist/avatars-7WZPW7BV.js +0 -38
  578. package/dist/bid-pricing-F5NDMS6W.js +0 -99
  579. package/dist/brand-QAJ5VWFM.js +0 -22
  580. package/dist/brief-V2OB5OJW.js +0 -490
  581. package/dist/brief-V2OB5OJW.js.map +0 -1
  582. package/dist/businesses-ZH67AXR6.js +0 -53
  583. package/dist/campaign-groups-KFJKLNNU.js +0 -95
  584. package/dist/campaign-writes-BDGQ6XB3.js +0 -170
  585. package/dist/campaign-writes-FNMAGCKB.js +0 -165
  586. package/dist/campaigns-66OOGMDW.js +0 -110
  587. package/dist/campaigns-6HMHOXXY.js +0 -109
  588. package/dist/campaigns-HJTGX5WW.js +0 -76
  589. package/dist/campaigns-KT3J2O7S.js +0 -107
  590. package/dist/canvas-MQ6ZE5CZ.js +0 -46
  591. package/dist/capabilities-RVUMPP7C.js +0 -144
  592. package/dist/cards-I4BZIYUV.js +0 -85
  593. package/dist/catalog-NLL5VDRK.js +0 -64
  594. package/dist/catalog-NLL5VDRK.js.map +0 -1
  595. package/dist/catalogs-B2NKQO24.js +0 -128
  596. package/dist/changes-FX3TPYGT.js +0 -135
  597. package/dist/chatgpt-3NS2R442.js +0 -47
  598. package/dist/chats-72L7U4ML.js +0 -262
  599. package/dist/chunk-2KIF3U2C.js +0 -51
  600. package/dist/chunk-35ENAFJX.js +0 -46
  601. package/dist/chunk-3ZWHAIMU.js +0 -207
  602. package/dist/chunk-3ZWHAIMU.js.map +0 -1
  603. package/dist/chunk-4DM6OAQ6.js +0 -2065
  604. package/dist/chunk-4DM6OAQ6.js.map +0 -1
  605. package/dist/chunk-4TU2MWBJ.js +0 -275
  606. package/dist/chunk-57UECM77.js +0 -98
  607. package/dist/chunk-5HYSKH77.js +0 -315
  608. package/dist/chunk-5HYSKH77.js.map +0 -1
  609. package/dist/chunk-65BQAJMH.js +0 -136
  610. package/dist/chunk-6GFJFTG6.js +0 -75
  611. package/dist/chunk-6HPIWZHS.js +0 -76
  612. package/dist/chunk-73B3RQJC.js +0 -610
  613. package/dist/chunk-73B3RQJC.js.map +0 -1
  614. package/dist/chunk-7GYM4I5I.js +0 -206
  615. package/dist/chunk-7NTION5F.js +0 -26
  616. package/dist/chunk-7SX73SH2.js +0 -2902
  617. package/dist/chunk-7SX73SH2.js.map +0 -1
  618. package/dist/chunk-AFDPISNJ.js +0 -111
  619. package/dist/chunk-AIDXJHZ4.js +0 -433
  620. package/dist/chunk-AR7PU7BB.js +0 -76
  621. package/dist/chunk-AXVOBRQT.js +0 -1442
  622. package/dist/chunk-AXVOBRQT.js.map +0 -1
  623. package/dist/chunk-BBBZR7MF.js +0 -160
  624. package/dist/chunk-BBBZR7MF.js.map +0 -1
  625. package/dist/chunk-BVYPRGPG.js +0 -92
  626. package/dist/chunk-CAMX6OHF.js +0 -3182
  627. package/dist/chunk-CAMX6OHF.js.map +0 -1
  628. package/dist/chunk-CBCGVPHB.js +0 -125
  629. package/dist/chunk-CECS3DHZ.js +0 -333
  630. package/dist/chunk-CZYUZL6R.js +0 -3151
  631. package/dist/chunk-CZYUZL6R.js.map +0 -1
  632. package/dist/chunk-D5MF337I.js +0 -97
  633. package/dist/chunk-DDTILZXI.js +0 -103
  634. package/dist/chunk-DL2W4N7J.js +0 -52
  635. package/dist/chunk-DLUWHZCE.js +0 -225
  636. package/dist/chunk-EOGPNV25.js +0 -509
  637. package/dist/chunk-F3FSD6BO.js +0 -96
  638. package/dist/chunk-FDG2LLX7.js +0 -494
  639. package/dist/chunk-FE7T32YL.js +0 -163
  640. package/dist/chunk-FE7T32YL.js.map +0 -1
  641. package/dist/chunk-FIN4ZXGJ.js +0 -70
  642. package/dist/chunk-FIN4ZXGJ.js.map +0 -1
  643. package/dist/chunk-FO5EP6DA.js +0 -24008
  644. package/dist/chunk-FO5EP6DA.js.map +0 -1
  645. package/dist/chunk-FSGTITIW.js +0 -622
  646. package/dist/chunk-FSGTITIW.js.map +0 -1
  647. package/dist/chunk-FSPV2DUG.js +0 -310
  648. package/dist/chunk-FSPV2DUG.js.map +0 -1
  649. package/dist/chunk-FYAWA3FO.js +0 -1830
  650. package/dist/chunk-FYAWA3FO.js.map +0 -1
  651. package/dist/chunk-G3KO2HFZ.js +0 -35
  652. package/dist/chunk-GKXMIXEV.js +0 -166
  653. package/dist/chunk-GT4UFORX.js +0 -296
  654. package/dist/chunk-GZ6YS7TG.js +0 -106
  655. package/dist/chunk-H7JOVRHO.js +0 -106
  656. package/dist/chunk-IJDF7D4U.js +0 -139
  657. package/dist/chunk-INJHF7AF.js +0 -172
  658. package/dist/chunk-IZFGTGFR.js +0 -67
  659. package/dist/chunk-J2QOKD2F.js +0 -76
  660. package/dist/chunk-J5WZ7SAD.js +0 -346
  661. package/dist/chunk-JC6GNMA7.js +0 -297
  662. package/dist/chunk-KB5HBQEK.js +0 -25
  663. package/dist/chunk-KB5XJHQX.js +0 -216
  664. package/dist/chunk-KM4AAAHZ.js +0 -5187
  665. package/dist/chunk-KM4AAAHZ.js.map +0 -1
  666. package/dist/chunk-LFZTGIPJ.js +0 -384
  667. package/dist/chunk-LFZTGIPJ.js.map +0 -1
  668. package/dist/chunk-LHNL6JM2.js +0 -309
  669. package/dist/chunk-LMHVLUD4.js +0 -175
  670. package/dist/chunk-LMHVLUD4.js.map +0 -1
  671. package/dist/chunk-NAMEFVWL.js +0 -1743
  672. package/dist/chunk-NFSLRRIE.js +0 -77
  673. package/dist/chunk-NORAJYUI.js +0 -172
  674. package/dist/chunk-NQTSHC7Z.js +0 -304
  675. package/dist/chunk-NQTSHC7Z.js.map +0 -1
  676. package/dist/chunk-O3LHCQ7Q.js +0 -136
  677. package/dist/chunk-O4ABJ352.js +0 -4410
  678. package/dist/chunk-O4ABJ352.js.map +0 -1
  679. package/dist/chunk-O5XLQUDS.js +0 -846
  680. package/dist/chunk-OI7KSXZM.js +0 -6265
  681. package/dist/chunk-OI7KSXZM.js.map +0 -1
  682. package/dist/chunk-OO67YTPM.js +0 -35
  683. package/dist/chunk-OO67YTPM.js.map +0 -1
  684. package/dist/chunk-OXBPKBSK.js +0 -6667
  685. package/dist/chunk-OXBPKBSK.js.map +0 -1
  686. package/dist/chunk-P3XJUOWT.js +0 -474
  687. package/dist/chunk-P3XJUOWT.js.map +0 -1
  688. package/dist/chunk-P3ZJIIDS.js +0 -57
  689. package/dist/chunk-P5T7OZKV.js +0 -26
  690. package/dist/chunk-P66JWKAL.js +0 -533
  691. package/dist/chunk-P66JWKAL.js.map +0 -1
  692. package/dist/chunk-PA5MYVQY.js +0 -66
  693. package/dist/chunk-PELW56D7.js +0 -45
  694. package/dist/chunk-PGVF4SB7.js +0 -169
  695. package/dist/chunk-Q676JHJA.js +0 -58
  696. package/dist/chunk-QDOVBGKZ.js +0 -149
  697. package/dist/chunk-QHIUJXU7.js +0 -363
  698. package/dist/chunk-QJPPPQPD.js +0 -98
  699. package/dist/chunk-QNEX7FEC.js +0 -174
  700. package/dist/chunk-QTL4NJ5I.js +0 -65
  701. package/dist/chunk-QTL4NJ5I.js.map +0 -1
  702. package/dist/chunk-QWX3QJNM.js +0 -170
  703. package/dist/chunk-QXDEZKAR.js +0 -455
  704. package/dist/chunk-QXDEZKAR.js.map +0 -1
  705. package/dist/chunk-RG7OMI5W.js +0 -1621
  706. package/dist/chunk-RG7OMI5W.js.map +0 -1
  707. package/dist/chunk-RUHMLPH5.js +0 -455
  708. package/dist/chunk-SJLIV6PF.js +0 -19
  709. package/dist/chunk-SLCSLVGS.js +0 -274
  710. package/dist/chunk-THU74XR6.js +0 -96
  711. package/dist/chunk-TY7TEU3T.js +0 -1079
  712. package/dist/chunk-UXTZ5MBE.js +0 -56
  713. package/dist/chunk-V43RLLZE.js +0 -55
  714. package/dist/chunk-V7PMSMPF.js +0 -817
  715. package/dist/chunk-V7PMSMPF.js.map +0 -1
  716. package/dist/chunk-VFSLIDXA.js +0 -42
  717. package/dist/chunk-VHMNSO2B.js +0 -84
  718. package/dist/chunk-VKH6LSC2.js +0 -188
  719. package/dist/chunk-VTCBPYGE.js +0 -592
  720. package/dist/chunk-W6ASM6UP.js +0 -197
  721. package/dist/chunk-W7KB3LJE.js +0 -60
  722. package/dist/chunk-WESRVXFS.js +0 -133
  723. package/dist/chunk-WESRVXFS.js.map +0 -1
  724. package/dist/chunk-WILN7TD6.js +0 -84
  725. package/dist/chunk-YGK7ZHNI.js +0 -337
  726. package/dist/chunk-YGK7ZHNI.js.map +0 -1
  727. package/dist/chunk-YGL5LTEA.js +0 -665
  728. package/dist/chunk-YONSWWCF.js +0 -215
  729. package/dist/chunk-Z5KBRTB2.js +0 -191
  730. package/dist/chunk-Z62XZCBE.js +0 -541
  731. package/dist/chunk-Z62XZCBE.js.map +0 -1
  732. package/dist/chunk-ZBKBTTHD.js +0 -74
  733. package/dist/chunk-ZJR5E53N.js +0 -23
  734. package/dist/chunk-ZLU5QDLU.js +0 -486
  735. package/dist/chunk-ZLU5QDLU.js.map +0 -1
  736. package/dist/chunk-ZNNC6B75.js +0 -94
  737. package/dist/chunk-ZO2YLHRW.js +0 -74
  738. package/dist/chunk-ZPJE6D7W.js +0 -74
  739. package/dist/claim-DIITRUIN.js +0 -197
  740. package/dist/client-LY2JCQS2.js +0 -19
  741. package/dist/code-7CBNYUPU.js +0 -76
  742. package/dist/companies-HHSYHL74.js +0 -195
  743. package/dist/complete-M3TURPU5.js +0 -81
  744. package/dist/config-7COTFJWK.js +0 -88
  745. package/dist/connect-TQL5EVVE.js +0 -42
  746. package/dist/content-OXMONMHJ.js +0 -85
  747. package/dist/conversation-GE273GC4.js +0 -93
  748. package/dist/conversion-report-BH4HH2Q3.js +0 -125
  749. package/dist/conversion-upload-command-QWWYCTNV.js +0 -438
  750. package/dist/conversion-writes-HG2O6JI7.js +0 -120
  751. package/dist/conversions-DP6ZF57D.js +0 -135
  752. package/dist/conversions-XPSN7SOW.js +0 -76
  753. package/dist/countries-UXAUGSBR.js +0 -82
  754. package/dist/create-ENQWVWGB.js +0 -59
  755. package/dist/create-NVXJP477.js +0 -207
  756. package/dist/create-PITWGVAS.js +0 -130
  757. package/dist/create-PITWGVAS.js.map +0 -1
  758. package/dist/create-XLZYNFKN.js +0 -235
  759. package/dist/creatives-O3444SBT.js +0 -182
  760. package/dist/creatives-ONKKGW5T.js +0 -87
  761. package/dist/creatives-U6IKIQBT.js +0 -51
  762. package/dist/creatives-U6IKIQBT.js.map +0 -1
  763. package/dist/credentials-3UY7RVUL.js +0 -287
  764. package/dist/critique-3LMW73QJ.js +0 -1449
  765. package/dist/critique-3LMW73QJ.js.map +0 -1
  766. package/dist/critique-KB32Y4AW.js +0 -213
  767. package/dist/critique-KB32Y4AW.js.map +0 -1
  768. package/dist/crm-OX67TBWD.js +0 -224
  769. package/dist/crm-XXU5XZIQ.js +0 -318
  770. package/dist/crop-3ZV5BFCA.js +0 -113
  771. package/dist/currency-XP4EMU4M.js +0 -88
  772. package/dist/custom-conversions-TV23XQHW.js +0 -125
  773. package/dist/customers-EJ7FVCTC.js +0 -56
  774. package/dist/decide-EGQ3CRHI.js +0 -199
  775. package/dist/delete-55IHV25V.js +0 -63
  776. package/dist/delete-GXLPIGTC.js +0 -54
  777. package/dist/delete-MUPTLWHI.js +0 -71
  778. package/dist/delete-OW2N4WIA.js +0 -66
  779. package/dist/delete-R2SEUSLV.js +0 -69
  780. package/dist/delete-ZGBBWFAW.js +0 -71
  781. package/dist/demographics-K6DEWUE5.js +0 -138
  782. package/dist/describe-4O3VCV6L.js +0 -97
  783. package/dist/describe-FCTM53MM.js +0 -97
  784. package/dist/dimensions-AD4VS5AH.js +0 -101
  785. package/dist/discard-NZ7FQJEE.js +0 -66
  786. package/dist/discover-OISU5EJF.js +0 -172
  787. package/dist/discover-UQXQUPNO.js +0 -93
  788. package/dist/domain-DXBHNZLO.js +0 -98
  789. package/dist/download-IE6XLFHM.js +0 -299
  790. package/dist/draft-DB6KMBCH.js +0 -306
  791. package/dist/draft-ENA7S4Y7.js +0 -103
  792. package/dist/draft-HJBAG3SN.js +0 -307
  793. package/dist/draft-ICEVLF4E.js +0 -328
  794. package/dist/draft-MGKJ5RYI.js +0 -100
  795. package/dist/draft-OBFKQEPK.js +0 -281
  796. package/dist/draft-OOHU6NMA.js +0 -217
  797. package/dist/draft-S6VPKZYY.js +0 -233
  798. package/dist/env-YLOVBOAE.js +0 -43
  799. package/dist/experiment-PHFP6IBM.js +0 -1397
  800. package/dist/export-R2IMUCQO.js +0 -168
  801. package/dist/extract-OQP3TSQG.js +0 -113
  802. package/dist/facets-NUKR7I57.js +0 -114
  803. package/dist/favorites-NS73FDG5.js +0 -178
  804. package/dist/feed-SQPOB7SP.js +0 -177
  805. package/dist/feedback-SQAAAKOQ.js +0 -66
  806. package/dist/feedback-record-7W7WBHSQ.js +0 -175
  807. package/dist/feedback-record-7W7WBHSQ.js.map +0 -1
  808. package/dist/fetch-PQ3NOPIE.js +0 -139
  809. package/dist/fetch-PTSAVQW5.js +0 -176
  810. package/dist/find-Y22AANDE.js +0 -134
  811. package/dist/find-Y22AANDE.js.map +0 -1
  812. package/dist/fit-IITU6UWC.js +0 -45
  813. package/dist/flows-ZLF3QJ76.js +0 -247
  814. package/dist/flows-ZLF3QJ76.js.map +0 -1
  815. package/dist/follow-N3DQZV7M.js +0 -94
  816. package/dist/follow-competitors-BZPCBGIB.js +0 -112
  817. package/dist/following-KESWTEBR.js +0 -113
  818. package/dist/fonts-FG6XMK5A.js +0 -34
  819. package/dist/forecast-43XBSHJR.js +0 -168
  820. package/dist/forecast-MAFZQ4UF.js +0 -104
  821. package/dist/funding-HYSCYS62.js +0 -85
  822. package/dist/funnel-32CNV57L.js +0 -394
  823. package/dist/ga4-J2KTNCD4.js +0 -55
  824. package/dist/generate-G3I5BLLW.js +0 -262
  825. package/dist/generate-G3I5BLLW.js.map +0 -1
  826. package/dist/get-3P2EQLP3.js +0 -63
  827. package/dist/get-FJB3X44Z.js +0 -61
  828. package/dist/get-GDF5V3RN.js +0 -78
  829. package/dist/get-MBGO4VJD.js +0 -63
  830. package/dist/get-NOKSZPIV.js +0 -59
  831. package/dist/get-W7MKBMQ3.js +0 -56
  832. package/dist/get-WHC4SRYK.js +0 -92
  833. package/dist/gif-SFYVDLCU.js +0 -94
  834. package/dist/google-THWFDDHJ.js +0 -3191
  835. package/dist/google-THWFDDHJ.js.map +0 -1
  836. package/dist/google-XRAMIES5.js +0 -136
  837. package/dist/google-ads-N55SE2CB.js +0 -195
  838. package/dist/group-6RDJTWVN.js +0 -43
  839. package/dist/group-TZJCKHKS.js +0 -43
  840. package/dist/gsc-HD6UFRYM.js +0 -30
  841. package/dist/history-4RWCE7WW.js +0 -67
  842. package/dist/history-IROFQ6LA.js +0 -133
  843. package/dist/hubspot-75N4AI43.js +0 -779
  844. package/dist/icon-BMCDFGMN.js +0 -137
  845. package/dist/ideas-7UQMXLI5.js +0 -32
  846. package/dist/images-OFR3S2U4.js +0 -90
  847. package/dist/improve-P6F2HXYQ.js +0 -86
  848. package/dist/ingest-HGR7KSG4.js +0 -107
  849. package/dist/ingest-XU4WXE4U.js +0 -23
  850. package/dist/insights-7SI2TB72.js +0 -128
  851. package/dist/insights-7SI2TB72.js.map +0 -1
  852. package/dist/insights-P5VIDOZN.js +0 -432
  853. package/dist/insights-P5VIDOZN.js.map +0 -1
  854. package/dist/inspect-TL2VZBN7.js +0 -189
  855. package/dist/inspiration-7WTS3AVI.js +0 -53
  856. package/dist/intent-OCZE4O7R.js +0 -95
  857. package/dist/job-XMPQ27SJ.js +0 -202
  858. package/dist/job-create-HTDQHPEF.js +0 -109
  859. package/dist/job-status-L7WUTZ2C.js +0 -74
  860. package/dist/keep-42SLV4CR.js +0 -78
  861. package/dist/keyword-gap-323NE4AK.js +0 -130
  862. package/dist/keyword-metrics-V6DGO7U5.js +0 -197
  863. package/dist/keywords-for-site-ANSLXBHB.js +0 -128
  864. package/dist/landing-K25GUBLZ.js +0 -28
  865. package/dist/landings-5IYXHA5Z.js +0 -151
  866. package/dist/languages-SRFGW6Z3.js +0 -55
  867. package/dist/languages-US6JUATO.js +0 -40
  868. package/dist/launches-7U4TPNO3.js +0 -108
  869. package/dist/launches-7U4TPNO3.js.map +0 -1
  870. package/dist/layerize-U672AXED.js +0 -190
  871. package/dist/leads-MXUQISOC.js +0 -293
  872. package/dist/leads-UJVKPRXX.js +0 -90
  873. package/dist/learn-XTEU4K66.js +0 -203
  874. package/dist/learn-XTEU4K66.js.map +0 -1
  875. package/dist/library-RPFXNER4.js +0 -109
  876. package/dist/library-RPFXNER4.js.map +0 -1
  877. package/dist/lighthouse-SJ4QNLUS.js +0 -75
  878. package/dist/line-item-writes-NURRHJ7P.js +0 -208
  879. package/dist/line-items-PC6QWV5J.js +0 -103
  880. package/dist/link-ZSXKCLQD.js +0 -64
  881. package/dist/linkedin-EZJJBKY3.js +0 -1008
  882. package/dist/list-ECF3RA26.js +0 -303
  883. package/dist/list-GQ65MC2N.js +0 -65
  884. package/dist/list-K56J7FZW.js +0 -51
  885. package/dist/list-M4Z3WYPM.js +0 -76
  886. package/dist/list-N7ZLO2LE.js +0 -63
  887. package/dist/list-Q5ZZRPHO.js +0 -151
  888. package/dist/list-SXYVDDMU.js +0 -57
  889. package/dist/list-XFIOXFB2.js +0 -50
  890. package/dist/locations-LZUHWKZY.js +0 -40
  891. package/dist/locations-NG4YXIBT.js +0 -67
  892. package/dist/log-EEBJQ6X2.js +0 -92
  893. package/dist/logo-4JOWGJ5A.js +0 -18
  894. package/dist/lookup-7NBZ64TE.js +0 -22
  895. package/dist/make-3J5EK52U.js +0 -633
  896. package/dist/make-3J5EK52U.js.map +0 -1
  897. package/dist/map-JVVNH2RI.js +0 -404
  898. package/dist/map-JVVNH2RI.js.map +0 -1
  899. package/dist/mcp-DAKGMA2Z.js +0 -463
  900. package/dist/media-2SWDJDA6.js +0 -15
  901. package/dist/media-R64YP7T2.js +0 -89
  902. package/dist/media-sources-L2X3KRDU.js +0 -32
  903. package/dist/members-22BOEGQS.js +0 -44
  904. package/dist/meta-RBHF2RG3.js +0 -69
  905. package/dist/metrics-IXRQZVSM.js +0 -152
  906. package/dist/models-BDXZ56GI.js +0 -155
  907. package/dist/normalize-JAE3NVOX.js +0 -141
  908. package/dist/normalize-P5Q3F7FU.js +0 -806
  909. package/dist/options-YTIU3BDC.js +0 -121
  910. package/dist/options-YTIU3BDC.js.map +0 -1
  911. package/dist/output-ZL62UZHQ.js +0 -24
  912. package/dist/page-FZ7IZ5CV.js +0 -105
  913. package/dist/pages-SS7TZTHV.js +0 -66
  914. package/dist/performance-FOOV624A.js +0 -24
  915. package/dist/performance-VYEANYQ5.js +0 -4707
  916. package/dist/performance-VYEANYQ5.js.map +0 -1
  917. package/dist/pinterest-UETS7U7U.js +0 -96
  918. package/dist/pixels-LCTMLKGP.js +0 -108
  919. package/dist/pixels-MPZYWGFD.js +0 -60
  920. package/dist/plan-V74EVXTW.js +0 -207
  921. package/dist/preview-RU54Z4EM.js +0 -169
  922. package/dist/profile-NQOIBLJL.js +0 -150
  923. package/dist/profile-NQOIBLJL.js.map +0 -1
  924. package/dist/promoted-tweet-writes-FQRFU7PB.js +0 -180
  925. package/dist/promoted-tweets-L2L3V5SF.js +0 -119
  926. package/dist/properties-ZUDQH3LE.js +0 -101
  927. package/dist/publish-5XTAHTM4.js +0 -322
  928. package/dist/query-26T7XATH.js +0 -236
  929. package/dist/query-SHUOHXTO.js +0 -247
  930. package/dist/query-XISUHMBR.js +0 -62
  931. package/dist/questionnaire-UG55JLVW.js +0 -93
  932. package/dist/read-UYSQAXRV.js +0 -141
  933. package/dist/reddit-BCB4FT6J.js +0 -26
  934. package/dist/refresh-WY5NPNLX.js +0 -94
  935. package/dist/release-JBSPPNQE.js +0 -60
  936. package/dist/relevant-pages-OU5H56KY.js +0 -99
  937. package/dist/remove-2KACTXKP.js +0 -48
  938. package/dist/remove-M5P7M5JU.js +0 -50
  939. package/dist/reopen-J3VW5766.js +0 -63
  940. package/dist/rerun-5MRYJG6U.js +0 -84
  941. package/dist/rerun-5MRYJG6U.js.map +0 -1
  942. package/dist/research-4CAA5CA2.js +0 -262
  943. package/dist/research-7LBTJ2B2.js +0 -62
  944. package/dist/reset-DBWWGCXY.js +0 -54
  945. package/dist/reset-DJSSXC4Y.js +0 -54
  946. package/dist/resolve-BNRUYS56.js +0 -121
  947. package/dist/retry-TMRIFGVT.js +0 -62
  948. package/dist/retry-WRBGLB7O.js +0 -60
  949. package/dist/retry-failed-NWLH6WHK.js +0 -45
  950. package/dist/run-TA3DP6QG.js +0 -59
  951. package/dist/run-VVTLDRRW.js +0 -65
  952. package/dist/scaffold-ad-7DSV6XDB.js +0 -1548
  953. package/dist/scaffold-ad-7DSV6XDB.js.map +0 -1
  954. package/dist/scaffold-static-ad-BEZ37QWN.js +0 -971
  955. package/dist/scaffold-static-ad-BEZ37QWN.js.map +0 -1
  956. package/dist/scaffold-video-SPCMTYK3.js +0 -872
  957. package/dist/scaffold-video-SPCMTYK3.js.map +0 -1
  958. package/dist/schedule-BQQGYGT7.js +0 -61
  959. package/dist/schedule-S547HPUT.js +0 -66
  960. package/dist/scheduled-agents-4Q6WS333.js +0 -49
  961. package/dist/scheduled-agents-4Q6WS333.js.map +0 -1
  962. package/dist/schema-DDEWM5ZX.js +0 -132
  963. package/dist/schema-SQIP75WG.js +0 -63
  964. package/dist/scrape-TI6S2W7I.js +0 -2241
  965. package/dist/screenshot-XFAYY4WW.js +0 -102
  966. package/dist/search-4HIOKYFR.js +0 -26
  967. package/dist/search-D2IV7KFJ.js +0 -92
  968. package/dist/search-IZPDHRJ4.js +0 -224
  969. package/dist/search-KFDL2IGG.js +0 -91
  970. package/dist/search-VJBKRD2U.js +0 -174
  971. package/dist/search-copy-QZXCAGK4.js +0 -168
  972. package/dist/seeds-VUNZMHZH.js +0 -101
  973. package/dist/select-U5TPAXGY.js +0 -94
  974. package/dist/select-U5TPAXGY.js.map +0 -1
  975. package/dist/sends-7HWLIOUO.js +0 -309
  976. package/dist/sequences-5RAGZE7L.js +0 -146
  977. package/dist/set-prompt-MHU4WI3Q.js +0 -185
  978. package/dist/set-prompt-MHU4WI3Q.js.map +0 -1
  979. package/dist/setup-links-SPIGXQTY.js +0 -141
  980. package/dist/shared-3CGGKICB.js +0 -31
  981. package/dist/site-FW6K6L6M.js +0 -177
  982. package/dist/sitemaps-3WDYQHYR.js +0 -87
  983. package/dist/sites-G4DQ2Z2X.js +0 -101
  984. package/dist/skills-PA26HXEP.js +0 -47
  985. package/dist/sources-4NAC6HV6.js +0 -421
  986. package/dist/sources-4NAC6HV6.js.map +0 -1
  987. package/dist/sources-PMBWG4KO.js +0 -30
  988. package/dist/stale-5IMY6MWC.js +0 -63
  989. package/dist/stale-5IMY6MWC.js.map +0 -1
  990. package/dist/stats-Q35I5DRW.js +0 -34
  991. package/dist/status-62SUXUWW.js +0 -62
  992. package/dist/sticker-MC2IAIQB.js +0 -94
  993. package/dist/stock-B7LKMKUK.js +0 -179
  994. package/dist/studio-BB2EVW5I.js +0 -49
  995. package/dist/sync-CLZDZL5F.js +0 -54
  996. package/dist/sync-XCHBEBZG.js +0 -279
  997. package/dist/sync-XCHBEBZG.js.map +0 -1
  998. package/dist/sync-YTHNOAAM.js +0 -54
  999. package/dist/sync-definition-DYSVT7BJ.js +0 -52
  1000. package/dist/tag-manager-EAREWVYR.js +0 -43
  1001. package/dist/tags-53AG3FYG.js +0 -20
  1002. package/dist/tags-7TH7TVR6.js +0 -224
  1003. package/dist/tags-EB4RE3ML.js +0 -20
  1004. package/dist/tags-EUEWDTTN.js +0 -20
  1005. package/dist/tags-ICAWBCOR.js +0 -26
  1006. package/dist/targeting-constants-IFE72XKL.js +0 -118
  1007. package/dist/targeting-criteria-WZDGJKOI.js +0 -113
  1008. package/dist/targets-OKJ6A4YL.js +0 -102
  1009. package/dist/templates-IA5TDCCZ.js +0 -178
  1010. package/dist/templates-IA5TDCCZ.js.map +0 -1
  1011. package/dist/testimonials-THHR5JH5.js +0 -32
  1012. package/dist/themes-ZFRM6AVO.js +0 -94
  1013. package/dist/top-companies-63Q475IA.js +0 -108
  1014. package/dist/translate-XKUWIIOS.js +0 -598
  1015. package/dist/translate-XKUWIIOS.js.map +0 -1
  1016. package/dist/triggers-XLKO2QXQ.js +0 -141
  1017. package/dist/tweets-7EZRFG3Y.js +0 -123
  1018. package/dist/unfollow-WBBTVEHE.js +0 -46
  1019. package/dist/unlink-P7KU54YU.js +0 -67
  1020. package/dist/unstage-EG7AUE5X.js +0 -84
  1021. package/dist/unstage-GHXGDOT2.js +0 -95
  1022. package/dist/update-7EWDO32L.js +0 -98
  1023. package/dist/update-BVYGB4YL.js +0 -142
  1024. package/dist/update-KVMQOVQK.js +0 -63
  1025. package/dist/update-N74F5KXB.js +0 -155
  1026. package/dist/upload-6PYPHPCZ.js +0 -126
  1027. package/dist/upload-NA62W5RS.js +0 -150
  1028. package/dist/upscale-RXJUBHXN.js +0 -109
  1029. package/dist/url-options-EUDXLDBD.js +0 -130
  1030. package/dist/url-params-DBJSM2LP.js +0 -98
  1031. package/dist/use-MHPNS4V4.js +0 -95
  1032. package/dist/validate-TTAGVGM2.js +0 -88
  1033. package/dist/validate-TTAGVGM2.js.map +0 -1
  1034. package/dist/variant-ZFCWILPG.js +0 -338
  1035. package/dist/videos-DUG7JYUA.js +0 -39
  1036. package/dist/view-PYCGDGT2.js +0 -121
  1037. package/dist/viewer-check-HIMNCZGY.js +0 -68
  1038. package/dist/web-SDG42OBC.js +0 -140
  1039. package/dist/winners-AI4PVSOI.js +0 -113
  1040. package/dist/winning-ads-KGAYAIPG.js +0 -84
  1041. package/dist/write-commands-34L5LJIB.js +0 -713
  1042. package/dist/write-commands-5TJ3LQ5F.js +0 -737
  1043. package/dist/write-commands-OYMWOFEY.js +0 -1015
  1044. package/dist/write-commands-R3UCCBUI.js +0 -206
  1045. package/dist/x-VNRVGVLI.js +0 -47
  1046. /package/dist/{account-67PZBEP6.js.map → account-5VPZ3XQ3.js.map} +0 -0
  1047. /package/dist/{account-HZC6X2PH.js.map → account-SYUEXERA.js.map} +0 -0
  1048. /package/dist/{account-TQUV64XP.js.map → account-ZQH535IP.js.map} +0 -0
  1049. /package/dist/{account-reads-IRBTERTY.js.map → account-reads-GUYNJEZA.js.map} +0 -0
  1050. /package/dist/{account-writes-ALDSHAEV.js.map → account-writes-DLCRTL6Y.js.map} +0 -0
  1051. /package/dist/{accounts-4P54UY6F.js.map → accounts-3TNEMLLC.js.map} +0 -0
  1052. /package/dist/{accounts-NJ6TF6WH.js.map → accounts-GBRGCLE3.js.map} +0 -0
  1053. /package/dist/{accounts-GVTZN4VE.js.map → accounts-IPOCFAKK.js.map} +0 -0
  1054. /package/dist/{accounts-WTB737BM.js.map → accounts-QBWYIJ7D.js.map} +0 -0
  1055. /package/dist/{accounts-6UNBLIUH.js.map → accounts-TSM5EHRD.js.map} +0 -0
  1056. /package/dist/{actions-D3BOWDEB.js.map → actions-XZMLYLTK.js.map} +0 -0
  1057. /package/dist/{active-entities-J2O76SRP.js.map → active-entities-MFWTN4VJ.js.map} +0 -0
  1058. /package/dist/{activities-2J7FTZMN.js.map → activities-ZXA53KY7.js.map} +0 -0
  1059. /package/dist/{ad-group-writes-PQKDCMQF.js.map → ad-group-writes-2JBCTSJY.js.map} +0 -0
  1060. /package/dist/{ad-groups-NGYEJMV4.js.map → ad-groups-6JQSO32O.js.map} +0 -0
  1061. /package/dist/{ad-writes-77FVHJTS.js.map → ad-writes-P34Z3ZTX.js.map} +0 -0
  1062. /package/dist/{add-2FHPLALV.js.map → add-F2BF2HAK.js.map} +0 -0
  1063. /package/dist/{add-JP76KCCY.js.map → add-JAXBNDLC.js.map} +0 -0
  1064. /package/dist/{add-62JPGFD4.js.map → add-KAMQP5RM.js.map} +0 -0
  1065. /package/dist/{add-2XJYOGKW.js.map → add-Y6QCWI6Q.js.map} +0 -0
  1066. /package/dist/{add-accounts-M5Y4DQFM.js.map → add-accounts-M4R7ZVHN.js.map} +0 -0
  1067. /package/dist/{ads-DB5NDHX5.js.map → ads-KPUP4WG4.js.map} +0 -0
  1068. /package/dist/{ads-W2IPUWHQ.js.map → ads-UVQN4BTT.js.map} +0 -0
  1069. /package/dist/{ads-LYNA2I7B.js.map → ads-VPSHNIWG.js.map} +0 -0
  1070. /package/dist/{adsets-PY5ZKGBO.js.map → adsets-JAQKFDLX.js.map} +0 -0
  1071. /package/dist/{advertisers-NZPJQF7W.js.map → advertisers-2ETFYRKA.js.map} +0 -0
  1072. /package/dist/{advertisers-BVAZ4XUX.js.map → advertisers-6ONURKP2.js.map} +0 -0
  1073. /package/dist/{analytics-NTPZKMYK.js.map → analytics-XZ56777C.js.map} +0 -0
  1074. /package/dist/{animate-EIV2OHXT.js.map → animate-KZQCCL65.js.map} +0 -0
  1075. /package/dist/{assign-UNIA5YDC.js.map → assign-DDXB7A6W.js.map} +0 -0
  1076. /package/dist/{audience-size-4NN6ENP5.js.map → audience-size-5QQAABZQ.js.map} +0 -0
  1077. /package/dist/{audiences-VYFX7OFS.js.map → audiences-I4KJ6DZ7.js.map} +0 -0
  1078. /package/dist/{audiences-UUIYQFS6.js.map → audiences-IFBZCTME.js.map} +0 -0
  1079. /package/dist/{audiences-45ZCY2VZ.js.map → audiences-THTWZOMA.js.map} +0 -0
  1080. /package/dist/{audit-NSVHNA5J.js.map → audit-2KOD4YCF.js.map} +0 -0
  1081. /package/dist/{audit-OWXTLQC4.js.map → audit-MFTERSQZ.js.map} +0 -0
  1082. /package/dist/{autocomplete-EHWAQYVB.js.map → autocomplete-JC46QNHQ.js.map} +0 -0
  1083. /package/dist/{avatars-7WZPW7BV.js.map → avatars-ZXQRZJM2.js.map} +0 -0
  1084. /package/dist/{bid-pricing-F5NDMS6W.js.map → bid-pricing-46W7LSU5.js.map} +0 -0
  1085. /package/dist/{brand-QAJ5VWFM.js.map → brand-XROP2WL2.js.map} +0 -0
  1086. /package/dist/{businesses-ZH67AXR6.js.map → businesses-JWOIY3OR.js.map} +0 -0
  1087. /package/dist/{campaign-groups-KFJKLNNU.js.map → campaign-groups-5O3SR5X2.js.map} +0 -0
  1088. /package/dist/{campaign-writes-BDGQ6XB3.js.map → campaign-writes-4D4256DP.js.map} +0 -0
  1089. /package/dist/{campaign-writes-FNMAGCKB.js.map → campaign-writes-5BEK2QBJ.js.map} +0 -0
  1090. /package/dist/{campaigns-HJTGX5WW.js.map → campaigns-6DX2MACO.js.map} +0 -0
  1091. /package/dist/{campaigns-6HMHOXXY.js.map → campaigns-EJT7IMDT.js.map} +0 -0
  1092. /package/dist/{campaigns-KT3J2O7S.js.map → campaigns-OKU4HN5Q.js.map} +0 -0
  1093. /package/dist/{campaigns-66OOGMDW.js.map → campaigns-QVPLPTH3.js.map} +0 -0
  1094. /package/dist/{canvas-MQ6ZE5CZ.js.map → canvas-XCP2WPYO.js.map} +0 -0
  1095. /package/dist/{capabilities-RVUMPP7C.js.map → capabilities-W4XDJVDW.js.map} +0 -0
  1096. /package/dist/{cards-I4BZIYUV.js.map → cards-2QCVG77U.js.map} +0 -0
  1097. /package/dist/{catalogs-B2NKQO24.js.map → catalogs-RVW4L6C6.js.map} +0 -0
  1098. /package/dist/{changes-FX3TPYGT.js.map → changes-XRPDY2K4.js.map} +0 -0
  1099. /package/dist/{chatgpt-3NS2R442.js.map → chatgpt-RNGSOVHP.js.map} +0 -0
  1100. /package/dist/{chats-72L7U4ML.js.map → chats-JKCUA26S.js.map} +0 -0
  1101. /package/dist/{chunk-F3FSD6BO.js.map → chunk-2C36DHQH.js.map} +0 -0
  1102. /package/dist/{chunk-TY7TEU3T.js.map → chunk-2LIAXB3W.js.map} +0 -0
  1103. /package/dist/{chunk-CBCGVPHB.js.map → chunk-2MT3AWDE.js.map} +0 -0
  1104. /package/dist/{chunk-GT4UFORX.js.map → chunk-2WRK44LZ.js.map} +0 -0
  1105. /package/dist/{chunk-O5XLQUDS.js.map → chunk-3FDGC2UH.js.map} +0 -0
  1106. /package/dist/{chunk-CECS3DHZ.js.map → chunk-3FFJYMKM.js.map} +0 -0
  1107. /package/dist/{chunk-THU74XR6.js.map → chunk-3PL2QRF2.js.map} +0 -0
  1108. /package/dist/{chunk-IJDF7D4U.js.map → chunk-3XDZMLX6.js.map} +0 -0
  1109. /package/dist/{chunk-G3KO2HFZ.js.map → chunk-4R7H4RV6.js.map} +0 -0
  1110. /package/dist/{chunk-6GFJFTG6.js.map → chunk-4TBDEV7X.js.map} +0 -0
  1111. /package/dist/{chunk-Q676JHJA.js.map → chunk-5VD5GK6A.js.map} +0 -0
  1112. /package/dist/{chunk-GKXMIXEV.js.map → chunk-5ZIGEHQQ.js.map} +0 -0
  1113. /package/dist/{chunk-P5T7OZKV.js.map → chunk-66ZIZ7QP.js.map} +0 -0
  1114. /package/dist/{chunk-ZO2YLHRW.js.map → chunk-6DSLFOKJ.js.map} +0 -0
  1115. /package/dist/{chunk-VHMNSO2B.js.map → chunk-6FHP2HIK.js.map} +0 -0
  1116. /package/dist/{chunk-H7JOVRHO.js.map → chunk-6VI2DDGZ.js.map} +0 -0
  1117. /package/dist/{chunk-AFDPISNJ.js.map → chunk-72QBQS63.js.map} +0 -0
  1118. /package/dist/{chunk-2KIF3U2C.js.map → chunk-7DBOLSUL.js.map} +0 -0
  1119. /package/dist/{chunk-SJLIV6PF.js.map → chunk-7FDDOOM4.js.map} +0 -0
  1120. /package/dist/{chunk-KB5HBQEK.js.map → chunk-AN7CMLYY.js.map} +0 -0
  1121. /package/dist/{chunk-AIDXJHZ4.js.map → chunk-BDMZRWQI.js.map} +0 -0
  1122. /package/dist/{chunk-NFSLRRIE.js.map → chunk-BITS62MF.js.map} +0 -0
  1123. /package/dist/{chunk-AR7PU7BB.js.map → chunk-CCFZB42B.js.map} +0 -0
  1124. /package/dist/{chunk-Z5KBRTB2.js.map → chunk-CKRSSMRT.js.map} +0 -0
  1125. /package/dist/{chunk-YONSWWCF.js.map → chunk-D53AAUG4.js.map} +0 -0
  1126. /package/dist/{chunk-6HPIWZHS.js.map → chunk-DGUYFROS.js.map} +0 -0
  1127. /package/dist/{chunk-65BQAJMH.js.map → chunk-DS2ZRTAL.js.map} +0 -0
  1128. /package/dist/{chunk-NAMEFVWL.js.map → chunk-EIJDXZW5.js.map} +0 -0
  1129. /package/dist/{chunk-57UECM77.js.map → chunk-EJH2JOVG.js.map} +0 -0
  1130. /package/dist/{chunk-VKH6LSC2.js.map → chunk-EJWFD6T3.js.map} +0 -0
  1131. /package/dist/{chunk-DL2W4N7J.js.map → chunk-ELNN4SNW.js.map} +0 -0
  1132. /package/dist/{chunk-P3ZJIIDS.js.map → chunk-EUB327FC.js.map} +0 -0
  1133. /package/dist/{chunk-GZ6YS7TG.js.map → chunk-FBF5XDJX.js.map} +0 -0
  1134. /package/dist/{chunk-QJPPPQPD.js.map → chunk-FP3GNJN2.js.map} +0 -0
  1135. /package/dist/{chunk-PELW56D7.js.map → chunk-G373L4GL.js.map} +0 -0
  1136. /package/dist/{chunk-SLCSLVGS.js.map → chunk-GTOHNTTI.js.map} +0 -0
  1137. /package/dist/{chunk-YGL5LTEA.js.map → chunk-HDNZSVJJ.js.map} +0 -0
  1138. /package/dist/{chunk-J5WZ7SAD.js.map → chunk-HLAAGGDS.js.map} +0 -0
  1139. /package/dist/{chunk-W6ASM6UP.js.map → chunk-HX7PM34O.js.map} +0 -0
  1140. /package/dist/{chunk-INJHF7AF.js.map → chunk-IKTKWXP6.js.map} +0 -0
  1141. /package/dist/{chunk-ZBKBTTHD.js.map → chunk-IOGKJZ4Z.js.map} +0 -0
  1142. /package/dist/{chunk-W7KB3LJE.js.map → chunk-IVRXPYQ7.js.map} +0 -0
  1143. /package/dist/{chunk-QHIUJXU7.js.map → chunk-JIJJCU6E.js.map} +0 -0
  1144. /package/dist/{chunk-JC6GNMA7.js.map → chunk-JOCKYH6U.js.map} +0 -0
  1145. /package/dist/{chunk-ZJR5E53N.js.map → chunk-L44WSWSZ.js.map} +0 -0
  1146. /package/dist/{chunk-4TU2MWBJ.js.map → chunk-M525HJTA.js.map} +0 -0
  1147. /package/dist/{chunk-D5MF337I.js.map → chunk-MMU6XHCH.js.map} +0 -0
  1148. /package/dist/{chunk-WILN7TD6.js.map → chunk-MRRSKRZZ.js.map} +0 -0
  1149. /package/dist/{chunk-O3LHCQ7Q.js.map → chunk-NFHUJRDE.js.map} +0 -0
  1150. /package/dist/{chunk-IZFGTGFR.js.map → chunk-NSHJ6OOK.js.map} +0 -0
  1151. /package/dist/{chunk-J2QOKD2F.js.map → chunk-OCBAKPHH.js.map} +0 -0
  1152. /package/dist/{chunk-BVYPRGPG.js.map → chunk-OFTU5XBQ.js.map} +0 -0
  1153. /package/dist/{chunk-KB5XJHQX.js.map → chunk-OSWCEDFE.js.map} +0 -0
  1154. /package/dist/{chunk-LHNL6JM2.js.map → chunk-OTNGMKI6.js.map} +0 -0
  1155. /package/dist/{chunk-QWX3QJNM.js.map → chunk-PAJJXZ3Z.js.map} +0 -0
  1156. /package/dist/{chunk-7GYM4I5I.js.map → chunk-PGSXR5UM.js.map} +0 -0
  1157. /package/dist/{chunk-EOGPNV25.js.map → chunk-QAOEVZYY.js.map} +0 -0
  1158. /package/dist/{chunk-PGVF4SB7.js.map → chunk-R5HMAIZM.js.map} +0 -0
  1159. /package/dist/{chunk-DDTILZXI.js.map → chunk-RPRLCIHB.js.map} +0 -0
  1160. /package/dist/{chunk-QDOVBGKZ.js.map → chunk-RV4GIY23.js.map} +0 -0
  1161. /package/dist/{chunk-VTCBPYGE.js.map → chunk-RXUEYD2S.js.map} +0 -0
  1162. /package/dist/{chunk-UXTZ5MBE.js.map → chunk-SJOWZKNB.js.map} +0 -0
  1163. /package/dist/{chunk-ZNNC6B75.js.map → chunk-TE3N5AGN.js.map} +0 -0
  1164. /package/dist/{chunk-QNEX7FEC.js.map → chunk-TPQH4UXJ.js.map} +0 -0
  1165. /package/dist/{chunk-DLUWHZCE.js.map → chunk-TQUNJFGF.js.map} +0 -0
  1166. /package/dist/{chunk-V43RLLZE.js.map → chunk-TYSN5VVJ.js.map} +0 -0
  1167. /package/dist/{chunk-7NTION5F.js.map → chunk-UKMG6YWX.js.map} +0 -0
  1168. /package/dist/{chunk-PA5MYVQY.js.map → chunk-WDAWTHQK.js.map} +0 -0
  1169. /package/dist/{chunk-ZPJE6D7W.js.map → chunk-X3PCCHP2.js.map} +0 -0
  1170. /package/dist/{chunk-RUHMLPH5.js.map → chunk-YJAQWTS6.js.map} +0 -0
  1171. /package/dist/{chunk-VFSLIDXA.js.map → chunk-YNOJN5Z6.js.map} +0 -0
  1172. /package/dist/{chunk-FDG2LLX7.js.map → chunk-YTV5VW7S.js.map} +0 -0
  1173. /package/dist/{chunk-NORAJYUI.js.map → chunk-ZO4GMUO3.js.map} +0 -0
  1174. /package/dist/{chunk-35ENAFJX.js.map → chunk-ZSRLDTDC.js.map} +0 -0
  1175. /package/dist/{claim-DIITRUIN.js.map → claim-JBNO7M6J.js.map} +0 -0
  1176. /package/dist/{client-LY2JCQS2.js.map → client-CPAPILIF.js.map} +0 -0
  1177. /package/dist/{code-7CBNYUPU.js.map → code-GHOVETWX.js.map} +0 -0
  1178. /package/dist/{companies-HHSYHL74.js.map → companies-47T2PCRZ.js.map} +0 -0
  1179. /package/dist/{complete-M3TURPU5.js.map → complete-T3PKN4B7.js.map} +0 -0
  1180. /package/dist/{config-7COTFJWK.js.map → config-AFNXR5FA.js.map} +0 -0
  1181. /package/dist/{connect-TQL5EVVE.js.map → connect-T7R43GIH.js.map} +0 -0
  1182. /package/dist/{content-OXMONMHJ.js.map → content-M3U2SCFJ.js.map} +0 -0
  1183. /package/dist/{conversation-GE273GC4.js.map → conversation-BG7WEMXQ.js.map} +0 -0
  1184. /package/dist/{conversion-report-BH4HH2Q3.js.map → conversion-report-URDTPXQ7.js.map} +0 -0
  1185. /package/dist/{conversion-upload-command-QWWYCTNV.js.map → conversion-upload-command-BWF6MAOK.js.map} +0 -0
  1186. /package/dist/{conversion-writes-HG2O6JI7.js.map → conversion-writes-7MGIFJ3H.js.map} +0 -0
  1187. /package/dist/{conversions-XPSN7SOW.js.map → conversions-QY6COYPP.js.map} +0 -0
  1188. /package/dist/{conversions-DP6ZF57D.js.map → conversions-UTXG5YEO.js.map} +0 -0
  1189. /package/dist/{countries-UXAUGSBR.js.map → countries-MUZPFSYZ.js.map} +0 -0
  1190. /package/dist/{create-XLZYNFKN.js.map → create-6QASIASQ.js.map} +0 -0
  1191. /package/dist/{create-ENQWVWGB.js.map → create-FIHEJRAF.js.map} +0 -0
  1192. /package/dist/{create-NVXJP477.js.map → create-JXZBMXUS.js.map} +0 -0
  1193. /package/dist/{creatives-ONKKGW5T.js.map → creatives-6FG6VAB4.js.map} +0 -0
  1194. /package/dist/{creatives-O3444SBT.js.map → creatives-UD6TFATS.js.map} +0 -0
  1195. /package/dist/{credentials-3UY7RVUL.js.map → credentials-ECPD2A7X.js.map} +0 -0
  1196. /package/dist/{crm-XXU5XZIQ.js.map → crm-4EWUWZNZ.js.map} +0 -0
  1197. /package/dist/{crm-OX67TBWD.js.map → crm-ASWKMKF3.js.map} +0 -0
  1198. /package/dist/{crop-3ZV5BFCA.js.map → crop-MIVSA2YF.js.map} +0 -0
  1199. /package/dist/{currency-XP4EMU4M.js.map → currency-5LU3D62R.js.map} +0 -0
  1200. /package/dist/{custom-conversions-TV23XQHW.js.map → custom-conversions-3QGJQRYS.js.map} +0 -0
  1201. /package/dist/{customers-EJ7FVCTC.js.map → customers-EEBZXQ4J.js.map} +0 -0
  1202. /package/dist/{decide-EGQ3CRHI.js.map → decide-ZODJU7DY.js.map} +0 -0
  1203. /package/dist/{delete-MUPTLWHI.js.map → delete-CTH3TGNM.js.map} +0 -0
  1204. /package/dist/{delete-GXLPIGTC.js.map → delete-D6GNTBYI.js.map} +0 -0
  1205. /package/dist/{delete-R2SEUSLV.js.map → delete-IWIDUJNS.js.map} +0 -0
  1206. /package/dist/{delete-ZGBBWFAW.js.map → delete-TLVYBVRP.js.map} +0 -0
  1207. /package/dist/{delete-55IHV25V.js.map → delete-XPHIQY5Z.js.map} +0 -0
  1208. /package/dist/{delete-OW2N4WIA.js.map → delete-XZEPLAKT.js.map} +0 -0
  1209. /package/dist/{demographics-K6DEWUE5.js.map → demographics-L3TJJAFF.js.map} +0 -0
  1210. /package/dist/{describe-FCTM53MM.js.map → describe-5PM5OSYK.js.map} +0 -0
  1211. /package/dist/{describe-4O3VCV6L.js.map → describe-KQLRHGFX.js.map} +0 -0
  1212. /package/dist/{dimensions-AD4VS5AH.js.map → dimensions-6H24D7CM.js.map} +0 -0
  1213. /package/dist/{discard-NZ7FQJEE.js.map → discard-74I3M2DF.js.map} +0 -0
  1214. /package/dist/{discover-UQXQUPNO.js.map → discover-6LGIHWVP.js.map} +0 -0
  1215. /package/dist/{discover-OISU5EJF.js.map → discover-HBQO4RSF.js.map} +0 -0
  1216. /package/dist/{domain-DXBHNZLO.js.map → domain-E5DTPAZI.js.map} +0 -0
  1217. /package/dist/{download-IE6XLFHM.js.map → download-ED52W77T.js.map} +0 -0
  1218. /package/dist/{draft-DB6KMBCH.js.map → draft-3XYF2L4K.js.map} +0 -0
  1219. /package/dist/{draft-ENA7S4Y7.js.map → draft-5IEMZ4W3.js.map} +0 -0
  1220. /package/dist/{draft-OBFKQEPK.js.map → draft-6UVGEERY.js.map} +0 -0
  1221. /package/dist/{draft-S6VPKZYY.js.map → draft-FDBE36CP.js.map} +0 -0
  1222. /package/dist/{draft-HJBAG3SN.js.map → draft-PE4DN44Y.js.map} +0 -0
  1223. /package/dist/{draft-ICEVLF4E.js.map → draft-QBR22TG2.js.map} +0 -0
  1224. /package/dist/{draft-OOHU6NMA.js.map → draft-VZYSJVF5.js.map} +0 -0
  1225. /package/dist/{draft-MGKJ5RYI.js.map → draft-YWTLO2ON.js.map} +0 -0
  1226. /package/dist/{env-YLOVBOAE.js.map → env-GS2TUVCM.js.map} +0 -0
  1227. /package/dist/{experiment-PHFP6IBM.js.map → experiment-XDJHSOBC.js.map} +0 -0
  1228. /package/dist/{export-R2IMUCQO.js.map → export-GV5CF5UM.js.map} +0 -0
  1229. /package/dist/{extract-OQP3TSQG.js.map → extract-4OXK7L7R.js.map} +0 -0
  1230. /package/dist/{facets-NUKR7I57.js.map → facets-XPB2ELM2.js.map} +0 -0
  1231. /package/dist/{favorites-NS73FDG5.js.map → favorites-VKPXGTK6.js.map} +0 -0
  1232. /package/dist/{feed-SQPOB7SP.js.map → feed-B2YLZQNU.js.map} +0 -0
  1233. /package/dist/{feedback-SQAAAKOQ.js.map → feedback-HT2M63QW.js.map} +0 -0
  1234. /package/dist/{fetch-PQ3NOPIE.js.map → fetch-2O7EUCCZ.js.map} +0 -0
  1235. /package/dist/{fetch-PTSAVQW5.js.map → fetch-GMNE6KOJ.js.map} +0 -0
  1236. /package/dist/{fit-IITU6UWC.js.map → fit-S5ZGPNE3.js.map} +0 -0
  1237. /package/dist/{follow-N3DQZV7M.js.map → follow-UNIHLZKA.js.map} +0 -0
  1238. /package/dist/{follow-competitors-BZPCBGIB.js.map → follow-competitors-CQL2B55H.js.map} +0 -0
  1239. /package/dist/{following-KESWTEBR.js.map → following-GMXZIEDZ.js.map} +0 -0
  1240. /package/dist/{fonts-FG6XMK5A.js.map → fonts-GPJQLNQL.js.map} +0 -0
  1241. /package/dist/{forecast-43XBSHJR.js.map → forecast-6AHSHRDJ.js.map} +0 -0
  1242. /package/dist/{forecast-MAFZQ4UF.js.map → forecast-V6BCMR4Y.js.map} +0 -0
  1243. /package/dist/{funding-HYSCYS62.js.map → funding-WPREDQVA.js.map} +0 -0
  1244. /package/dist/{funnel-32CNV57L.js.map → funnel-QDYX3UH5.js.map} +0 -0
  1245. /package/dist/{ga4-J2KTNCD4.js.map → ga4-6AUOX2UW.js.map} +0 -0
  1246. /package/dist/{get-MBGO4VJD.js.map → get-5OEDAT2Q.js.map} +0 -0
  1247. /package/dist/{get-W7MKBMQ3.js.map → get-7WEE5V7M.js.map} +0 -0
  1248. /package/dist/{get-3P2EQLP3.js.map → get-DXGJSEZZ.js.map} +0 -0
  1249. /package/dist/{get-NOKSZPIV.js.map → get-GQWOLALT.js.map} +0 -0
  1250. /package/dist/{get-WHC4SRYK.js.map → get-W7F4FOAR.js.map} +0 -0
  1251. /package/dist/{get-FJB3X44Z.js.map → get-WY6JXFP6.js.map} +0 -0
  1252. /package/dist/{get-GDF5V3RN.js.map → get-X6DSFXN6.js.map} +0 -0
  1253. /package/dist/{gif-SFYVDLCU.js.map → gif-JXWSR2TC.js.map} +0 -0
  1254. /package/dist/{google-XRAMIES5.js.map → google-6QFL6GV3.js.map} +0 -0
  1255. /package/dist/{google-ads-N55SE2CB.js.map → google-ads-ZG3BDUEG.js.map} +0 -0
  1256. /package/dist/{group-TZJCKHKS.js.map → group-7ADT2GWA.js.map} +0 -0
  1257. /package/dist/{group-6RDJTWVN.js.map → group-VD3UIBKE.js.map} +0 -0
  1258. /package/dist/{gsc-HD6UFRYM.js.map → gsc-WHMPFTYA.js.map} +0 -0
  1259. /package/dist/{history-IROFQ6LA.js.map → history-33JKOKAV.js.map} +0 -0
  1260. /package/dist/{history-4RWCE7WW.js.map → history-M3IKDCEO.js.map} +0 -0
  1261. /package/dist/{hubspot-75N4AI43.js.map → hubspot-B4IUIOYX.js.map} +0 -0
  1262. /package/dist/{icon-BMCDFGMN.js.map → icon-R2K27DKI.js.map} +0 -0
  1263. /package/dist/{ideas-7UQMXLI5.js.map → ideas-HHTLPC6Y.js.map} +0 -0
  1264. /package/dist/{images-OFR3S2U4.js.map → images-PV6TZQLL.js.map} +0 -0
  1265. /package/dist/{improve-P6F2HXYQ.js.map → improve-TVFAR27Q.js.map} +0 -0
  1266. /package/dist/{ingest-XU4WXE4U.js.map → ingest-25ZX36RL.js.map} +0 -0
  1267. /package/dist/{ingest-HGR7KSG4.js.map → ingest-MFIT3L23.js.map} +0 -0
  1268. /package/dist/{inspect-TL2VZBN7.js.map → inspect-2IASA5YV.js.map} +0 -0
  1269. /package/dist/{inspiration-7WTS3AVI.js.map → inspiration-O56SOIQP.js.map} +0 -0
  1270. /package/dist/{intent-OCZE4O7R.js.map → intent-JOW24MTF.js.map} +0 -0
  1271. /package/dist/{job-XMPQ27SJ.js.map → job-QUO6KULI.js.map} +0 -0
  1272. /package/dist/{job-create-HTDQHPEF.js.map → job-create-JTOG5M3Q.js.map} +0 -0
  1273. /package/dist/{job-status-L7WUTZ2C.js.map → job-status-3B4X5IPG.js.map} +0 -0
  1274. /package/dist/{keep-42SLV4CR.js.map → keep-5TVGX7EG.js.map} +0 -0
  1275. /package/dist/{keyword-gap-323NE4AK.js.map → keyword-gap-SHLXRIHO.js.map} +0 -0
  1276. /package/dist/{keyword-metrics-V6DGO7U5.js.map → keyword-metrics-NYH6DXKJ.js.map} +0 -0
  1277. /package/dist/{keywords-for-site-ANSLXBHB.js.map → keywords-for-site-JTK64W4I.js.map} +0 -0
  1278. /package/dist/{landing-K25GUBLZ.js.map → landing-4V7HMYCZ.js.map} +0 -0
  1279. /package/dist/{landings-5IYXHA5Z.js.map → landings-LZZO4VVW.js.map} +0 -0
  1280. /package/dist/{languages-SRFGW6Z3.js.map → languages-TINK472E.js.map} +0 -0
  1281. /package/dist/{languages-US6JUATO.js.map → languages-ZIGJHY2T.js.map} +0 -0
  1282. /package/dist/{logo-4JOWGJ5A.js.map → launches-C5XXNF7C.js.map} +0 -0
  1283. /package/dist/{layerize-U672AXED.js.map → layerize-YVCA4JO7.js.map} +0 -0
  1284. /package/dist/{leads-UJVKPRXX.js.map → leads-2WTL7F24.js.map} +0 -0
  1285. /package/dist/{leads-MXUQISOC.js.map → leads-QUO3YNHO.js.map} +0 -0
  1286. /package/dist/{lighthouse-SJ4QNLUS.js.map → lighthouse-QLFI7PSQ.js.map} +0 -0
  1287. /package/dist/{line-item-writes-NURRHJ7P.js.map → line-item-writes-SYSYGV3L.js.map} +0 -0
  1288. /package/dist/{line-items-PC6QWV5J.js.map → line-items-H3M6T7P2.js.map} +0 -0
  1289. /package/dist/{link-ZSXKCLQD.js.map → link-EHSSSV6K.js.map} +0 -0
  1290. /package/dist/{linkedin-EZJJBKY3.js.map → linkedin-BGZIR43P.js.map} +0 -0
  1291. /package/dist/{list-M4Z3WYPM.js.map → list-2IAOPMQC.js.map} +0 -0
  1292. /package/dist/{list-SXYVDDMU.js.map → list-BGT2BEWD.js.map} +0 -0
  1293. /package/dist/{list-Q5ZZRPHO.js.map → list-G2VYAKYF.js.map} +0 -0
  1294. /package/dist/{list-GQ65MC2N.js.map → list-IFXQWBBE.js.map} +0 -0
  1295. /package/dist/{list-XFIOXFB2.js.map → list-LK3CVZ3B.js.map} +0 -0
  1296. /package/dist/{list-ECF3RA26.js.map → list-X2TMGY7C.js.map} +0 -0
  1297. /package/dist/{list-K56J7FZW.js.map → list-X3SEZDKE.js.map} +0 -0
  1298. /package/dist/{list-N7ZLO2LE.js.map → list-ZFS7XBD7.js.map} +0 -0
  1299. /package/dist/{locations-NG4YXIBT.js.map → locations-JC2H5JMY.js.map} +0 -0
  1300. /package/dist/{locations-LZUHWKZY.js.map → locations-M4L7FUOB.js.map} +0 -0
  1301. /package/dist/{log-EEBJQ6X2.js.map → log-4EINR63D.js.map} +0 -0
  1302. /package/dist/{lookup-7NBZ64TE.js.map → logo-7GDRTSLI.js.map} +0 -0
  1303. /package/dist/{output-ZL62UZHQ.js.map → lookup-SJXNPUXG.js.map} +0 -0
  1304. /package/dist/{mcp-DAKGMA2Z.js.map → mcp-RQJAEJCJ.js.map} +0 -0
  1305. /package/dist/{media-R64YP7T2.js.map → media-FYGHJAEG.js.map} +0 -0
  1306. /package/dist/{media-2SWDJDA6.js.map → media-YYYCKXMZ.js.map} +0 -0
  1307. /package/dist/{media-sources-L2X3KRDU.js.map → media-sources-ZLBIC4RM.js.map} +0 -0
  1308. /package/dist/{members-22BOEGQS.js.map → members-SXATNT7V.js.map} +0 -0
  1309. /package/dist/{meta-RBHF2RG3.js.map → meta-OGB3NB2W.js.map} +0 -0
  1310. /package/dist/{metrics-IXRQZVSM.js.map → metrics-52ZARN6M.js.map} +0 -0
  1311. /package/dist/{models-BDXZ56GI.js.map → models-LSEMO4XH.js.map} +0 -0
  1312. /package/dist/{normalize-P5Q3F7FU.js.map → normalize-3HI26S34.js.map} +0 -0
  1313. /package/dist/{normalize-JAE3NVOX.js.map → normalize-SOFYZQSJ.js.map} +0 -0
  1314. /package/dist/{performance-FOOV624A.js.map → output-YJ4YBUU4.js.map} +0 -0
  1315. /package/dist/{page-FZ7IZ5CV.js.map → page-ZGCK6MOQ.js.map} +0 -0
  1316. /package/dist/{pages-SS7TZTHV.js.map → pages-QMP3W2R3.js.map} +0 -0
  1317. /package/dist/{query-XISUHMBR.js.map → performance-BQSWGNFO.js.map} +0 -0
  1318. /package/dist/{pinterest-UETS7U7U.js.map → pinterest-LCVUB2ZL.js.map} +0 -0
  1319. /package/dist/{pixels-MPZYWGFD.js.map → pixels-UQGAPBLG.js.map} +0 -0
  1320. /package/dist/{pixels-LCTMLKGP.js.map → pixels-YM2DX7EN.js.map} +0 -0
  1321. /package/dist/{plan-V74EVXTW.js.map → plan-Z5TZRRCH.js.map} +0 -0
  1322. /package/dist/{preview-RU54Z4EM.js.map → preview-DZQUUQGD.js.map} +0 -0
  1323. /package/dist/{promoted-tweet-writes-FQRFU7PB.js.map → promoted-tweet-writes-VUNJIUA3.js.map} +0 -0
  1324. /package/dist/{promoted-tweets-L2L3V5SF.js.map → promoted-tweets-55X4H7NG.js.map} +0 -0
  1325. /package/dist/{properties-ZUDQH3LE.js.map → properties-CSW67FJG.js.map} +0 -0
  1326. /package/dist/{publish-5XTAHTM4.js.map → publish-U73OR33K.js.map} +0 -0
  1327. /package/dist/{query-26T7XATH.js.map → query-UQQNESTT.js.map} +0 -0
  1328. /package/dist/{reddit-BCB4FT6J.js.map → query-V4I3VCJ7.js.map} +0 -0
  1329. /package/dist/{query-SHUOHXTO.js.map → query-XPCC7OUP.js.map} +0 -0
  1330. /package/dist/{questionnaire-UG55JLVW.js.map → questionnaire-UQNRYZK7.js.map} +0 -0
  1331. /package/dist/{read-UYSQAXRV.js.map → read-RXAOLPG5.js.map} +0 -0
  1332. /package/dist/{run-TA3DP6QG.js.map → reddit-C2B7NT7X.js.map} +0 -0
  1333. /package/dist/{refresh-WY5NPNLX.js.map → refresh-JN4HKE4H.js.map} +0 -0
  1334. /package/dist/{release-JBSPPNQE.js.map → release-HSAOBN5K.js.map} +0 -0
  1335. /package/dist/{relevant-pages-OU5H56KY.js.map → relevant-pages-XBWFEHHE.js.map} +0 -0
  1336. /package/dist/{remove-M5P7M5JU.js.map → remove-G5UXVQ2W.js.map} +0 -0
  1337. /package/dist/{remove-2KACTXKP.js.map → remove-Q4TL5ZFS.js.map} +0 -0
  1338. /package/dist/{reopen-J3VW5766.js.map → reopen-D26VSRRL.js.map} +0 -0
  1339. /package/dist/{research-4CAA5CA2.js.map → research-CRYX2CAR.js.map} +0 -0
  1340. /package/dist/{research-7LBTJ2B2.js.map → research-XRVD2GSG.js.map} +0 -0
  1341. /package/dist/{reset-DJSSXC4Y.js.map → reset-2VVN4CY7.js.map} +0 -0
  1342. /package/dist/{reset-DBWWGCXY.js.map → reset-FWDPBHYO.js.map} +0 -0
  1343. /package/dist/{resolve-BNRUYS56.js.map → resolve-D4PCGIWO.js.map} +0 -0
  1344. /package/dist/{retry-WRBGLB7O.js.map → retry-AHZFHMTH.js.map} +0 -0
  1345. /package/dist/{retry-TMRIFGVT.js.map → retry-FV6ASVO5.js.map} +0 -0
  1346. /package/dist/{retry-failed-NWLH6WHK.js.map → retry-failed-AENQRGML.js.map} +0 -0
  1347. /package/dist/{run-VVTLDRRW.js.map → run-AGSHZQND.js.map} +0 -0
  1348. /package/dist/{search-4HIOKYFR.js.map → run-IRJWKZ3K.js.map} +0 -0
  1349. /package/dist/{schedule-S547HPUT.js.map → schedule-DTKBBIEH.js.map} +0 -0
  1350. /package/dist/{schedule-BQQGYGT7.js.map → schedule-ESHQ4II7.js.map} +0 -0
  1351. /package/dist/{schema-SQIP75WG.js.map → schema-OBF4T2QN.js.map} +0 -0
  1352. /package/dist/{schema-DDEWM5ZX.js.map → schema-SWG2WKYX.js.map} +0 -0
  1353. /package/dist/{scrape-TI6S2W7I.js.map → scrape-AGGDUPPD.js.map} +0 -0
  1354. /package/dist/{screenshot-XFAYY4WW.js.map → screenshot-6GGCQCIV.js.map} +0 -0
  1355. /package/dist/{search-D2IV7KFJ.js.map → search-FRSFGJLZ.js.map} +0 -0
  1356. /package/dist/{search-VJBKRD2U.js.map → search-I64WW2QC.js.map} +0 -0
  1357. /package/dist/{search-IZPDHRJ4.js.map → search-L2KHX5DO.js.map} +0 -0
  1358. /package/dist/{shared-3CGGKICB.js.map → search-MBDEQ6EE.js.map} +0 -0
  1359. /package/dist/{search-KFDL2IGG.js.map → search-UCDN4TOT.js.map} +0 -0
  1360. /package/dist/{search-copy-QZXCAGK4.js.map → search-copy-HX3FYZGT.js.map} +0 -0
  1361. /package/dist/{seeds-VUNZMHZH.js.map → seeds-VFEFE4AK.js.map} +0 -0
  1362. /package/dist/{sends-7HWLIOUO.js.map → sends-WDSOXBSS.js.map} +0 -0
  1363. /package/dist/{sequences-5RAGZE7L.js.map → sequences-NMJ55HS5.js.map} +0 -0
  1364. /package/dist/{setup-links-SPIGXQTY.js.map → setup-links-NAAUQD7O.js.map} +0 -0
  1365. /package/dist/{sync-definition-DYSVT7BJ.js.map → shared-3GVQQQNL.js.map} +0 -0
  1366. /package/dist/{site-FW6K6L6M.js.map → site-VTJU5CRE.js.map} +0 -0
  1367. /package/dist/{sitemaps-3WDYQHYR.js.map → sitemaps-KS57YDGB.js.map} +0 -0
  1368. /package/dist/{sites-G4DQ2Z2X.js.map → sites-PUEEVW7H.js.map} +0 -0
  1369. /package/dist/{skills-PA26HXEP.js.map → skills-N6NRI2LC.js.map} +0 -0
  1370. /package/dist/{sources-PMBWG4KO.js.map → sources-YUMNEFK5.js.map} +0 -0
  1371. /package/dist/{stats-Q35I5DRW.js.map → stats-SY6GRHKB.js.map} +0 -0
  1372. /package/dist/{status-62SUXUWW.js.map → status-PVW64CLX.js.map} +0 -0
  1373. /package/dist/{sticker-MC2IAIQB.js.map → sticker-YS6W5TSZ.js.map} +0 -0
  1374. /package/dist/{stock-B7LKMKUK.js.map → stock-DWL5E6K4.js.map} +0 -0
  1375. /package/dist/{studio-BB2EVW5I.js.map → studio-SXBK2IJJ.js.map} +0 -0
  1376. /package/dist/{sync-YTHNOAAM.js.map → sync-FOLYGQDI.js.map} +0 -0
  1377. /package/dist/{sync-CLZDZL5F.js.map → sync-NORMNZEE.js.map} +0 -0
  1378. /package/dist/{viewer-check-HIMNCZGY.js.map → sync-definition-DTWEW6ZC.js.map} +0 -0
  1379. /package/dist/{tag-manager-EAREWVYR.js.map → tag-manager-ARFZU46G.js.map} +0 -0
  1380. /package/dist/{tags-53AG3FYG.js.map → tags-77JUO75W.js.map} +0 -0
  1381. /package/dist/{tags-7TH7TVR6.js.map → tags-DOJUSHJB.js.map} +0 -0
  1382. /package/dist/{tags-EUEWDTTN.js.map → tags-IESRRMGW.js.map} +0 -0
  1383. /package/dist/{tags-EB4RE3ML.js.map → tags-MRTUBMRD.js.map} +0 -0
  1384. /package/dist/{tags-ICAWBCOR.js.map → tags-SP6GW4R7.js.map} +0 -0
  1385. /package/dist/{targeting-constants-IFE72XKL.js.map → targeting-constants-DVGRIRKD.js.map} +0 -0
  1386. /package/dist/{targeting-criteria-WZDGJKOI.js.map → targeting-criteria-SOK3HUE2.js.map} +0 -0
  1387. /package/dist/{targets-OKJ6A4YL.js.map → targets-V2HNKVUL.js.map} +0 -0
  1388. /package/dist/{testimonials-THHR5JH5.js.map → testimonials-PA2FUV4H.js.map} +0 -0
  1389. /package/dist/{themes-ZFRM6AVO.js.map → themes-IDB7YPHW.js.map} +0 -0
  1390. /package/dist/{top-companies-63Q475IA.js.map → top-companies-XDP4SZN7.js.map} +0 -0
  1391. /package/dist/{triggers-XLKO2QXQ.js.map → triggers-QDXCA5P4.js.map} +0 -0
  1392. /package/dist/{tweets-7EZRFG3Y.js.map → tweets-AISMWXM3.js.map} +0 -0
  1393. /package/dist/{unfollow-WBBTVEHE.js.map → unfollow-PHLMILG2.js.map} +0 -0
  1394. /package/dist/{unlink-P7KU54YU.js.map → unlink-GDZV5GVL.js.map} +0 -0
  1395. /package/dist/{unstage-GHXGDOT2.js.map → unstage-WCC2TI5Z.js.map} +0 -0
  1396. /package/dist/{unstage-EG7AUE5X.js.map → unstage-WDJXHSAV.js.map} +0 -0
  1397. /package/dist/{update-KVMQOVQK.js.map → update-KBF35KYV.js.map} +0 -0
  1398. /package/dist/{update-7EWDO32L.js.map → update-MRG5MPHR.js.map} +0 -0
  1399. /package/dist/{update-N74F5KXB.js.map → update-XNNQGZBO.js.map} +0 -0
  1400. /package/dist/{update-BVYGB4YL.js.map → update-ZGDQJPDL.js.map} +0 -0
  1401. /package/dist/{upload-6PYPHPCZ.js.map → upload-ID35OCCY.js.map} +0 -0
  1402. /package/dist/{upload-NA62W5RS.js.map → upload-R7YJORED.js.map} +0 -0
  1403. /package/dist/{upscale-RXJUBHXN.js.map → upscale-XPGVJWW2.js.map} +0 -0
  1404. /package/dist/{url-options-EUDXLDBD.js.map → url-options-6X7M2J7D.js.map} +0 -0
  1405. /package/dist/{url-params-DBJSM2LP.js.map → url-params-WRLCJRJQ.js.map} +0 -0
  1406. /package/dist/{use-MHPNS4V4.js.map → use-VCL3PRCB.js.map} +0 -0
  1407. /package/dist/{variant-ZFCWILPG.js.map → variant-2NADVT6Q.js.map} +0 -0
  1408. /package/dist/{videos-DUG7JYUA.js.map → videos-M6VK66NI.js.map} +0 -0
  1409. /package/dist/{view-PYCGDGT2.js.map → view-Q5B57K42.js.map} +0 -0
  1410. /package/dist/{web-SDG42OBC.js.map → web-GOD7BF7X.js.map} +0 -0
  1411. /package/dist/{winners-AI4PVSOI.js.map → winners-PK6EMR6B.js.map} +0 -0
  1412. /package/dist/{winning-ads-KGAYAIPG.js.map → winning-ads-F765TFLS.js.map} +0 -0
  1413. /package/dist/{write-commands-OYMWOFEY.js.map → write-commands-4KWMNH6A.js.map} +0 -0
  1414. /package/dist/{write-commands-5TJ3LQ5F.js.map → write-commands-7ECRGXLK.js.map} +0 -0
  1415. /package/dist/{write-commands-34L5LJIB.js.map → write-commands-GL2PHXSU.js.map} +0 -0
  1416. /package/dist/{write-commands-R3UCCBUI.js.map → write-commands-NMV65XXB.js.map} +0 -0
  1417. /package/dist/{x-VNRVGVLI.js.map → x-MDENBZ3X.js.map} +0 -0
@@ -0,0 +1,3088 @@
1
+ import {
2
+ __commonJS,
3
+ __toESM
4
+ } from "./chunk-YQSBHWOI.js";
5
+
6
+ // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/766ad107c42df28eeadaf0ac2f9089c8a9e200f6ba0b2b1a817b8d536cbdcc49/node_modules/safe-stable-stringify/index.js
7
+ var require_safe_stable_stringify = __commonJS({
8
+ "../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/766ad107c42df28eeadaf0ac2f9089c8a9e200f6ba0b2b1a817b8d536cbdcc49/node_modules/safe-stable-stringify/index.js"(exports, module) {
9
+ "use strict";
10
+ var { hasOwnProperty } = Object.prototype;
11
+ var stringify = configure2();
12
+ stringify.configure = configure2;
13
+ stringify.stringify = stringify;
14
+ stringify.default = stringify;
15
+ exports.stringify = stringify;
16
+ exports.configure = configure2;
17
+ module.exports = stringify;
18
+ var strEscapeSequencesRegExp = /[\u0000-\u001f\u0022\u005c\ud800-\udfff]/;
19
+ function strEscape(str) {
20
+ if (str.length < 5e3 && !strEscapeSequencesRegExp.test(str)) {
21
+ return `"${str}"`;
22
+ }
23
+ return JSON.stringify(str);
24
+ }
25
+ function sort(array, comparator) {
26
+ if (array.length > 200 || comparator) {
27
+ return array.sort(comparator);
28
+ }
29
+ for (let i = 1; i < array.length; i++) {
30
+ const currentValue = array[i];
31
+ let position = i;
32
+ while (position !== 0 && array[position - 1] > currentValue) {
33
+ array[position] = array[position - 1];
34
+ position--;
35
+ }
36
+ array[position] = currentValue;
37
+ }
38
+ return array;
39
+ }
40
+ var typedArrayPrototypeGetSymbolToStringTag = Object.getOwnPropertyDescriptor(
41
+ Object.getPrototypeOf(
42
+ Object.getPrototypeOf(
43
+ new Int8Array()
44
+ )
45
+ ),
46
+ Symbol.toStringTag
47
+ ).get;
48
+ function isTypedArrayWithEntries(value) {
49
+ return typedArrayPrototypeGetSymbolToStringTag.call(value) !== void 0 && value.length !== 0;
50
+ }
51
+ function stringifyTypedArray(array, separator, maximumBreadth) {
52
+ if (array.length < maximumBreadth) {
53
+ maximumBreadth = array.length;
54
+ }
55
+ const whitespace = separator === "," ? "" : " ";
56
+ let res = `"0":${whitespace}${array[0]}`;
57
+ for (let i = 1; i < maximumBreadth; i++) {
58
+ res += `${separator}"${i}":${whitespace}${array[i]}`;
59
+ }
60
+ return res;
61
+ }
62
+ function getCircularValueOption(options) {
63
+ if (hasOwnProperty.call(options, "circularValue")) {
64
+ const circularValue = options.circularValue;
65
+ if (typeof circularValue === "string") {
66
+ return `"${circularValue}"`;
67
+ }
68
+ if (circularValue == null) {
69
+ return circularValue;
70
+ }
71
+ if (circularValue === Error || circularValue === TypeError) {
72
+ return {
73
+ toString() {
74
+ throw new TypeError("Converting circular structure to JSON");
75
+ }
76
+ };
77
+ }
78
+ throw new TypeError('The "circularValue" argument must be of type string or the value null or undefined');
79
+ }
80
+ return '"[Circular]"';
81
+ }
82
+ function getDeterministicOption(options) {
83
+ let value;
84
+ if (hasOwnProperty.call(options, "deterministic")) {
85
+ value = options.deterministic;
86
+ if (typeof value !== "boolean" && typeof value !== "function") {
87
+ throw new TypeError('The "deterministic" argument must be of type boolean or comparator function');
88
+ }
89
+ }
90
+ return value === void 0 ? true : value;
91
+ }
92
+ function getBooleanOption(options, key) {
93
+ let value;
94
+ if (hasOwnProperty.call(options, key)) {
95
+ value = options[key];
96
+ if (typeof value !== "boolean") {
97
+ throw new TypeError(`The "${key}" argument must be of type boolean`);
98
+ }
99
+ }
100
+ return value === void 0 ? true : value;
101
+ }
102
+ function getPositiveIntegerOption(options, key) {
103
+ let value;
104
+ if (hasOwnProperty.call(options, key)) {
105
+ value = options[key];
106
+ if (typeof value !== "number") {
107
+ throw new TypeError(`The "${key}" argument must be of type number`);
108
+ }
109
+ if (!Number.isInteger(value)) {
110
+ throw new TypeError(`The "${key}" argument must be an integer`);
111
+ }
112
+ if (value < 1) {
113
+ throw new RangeError(`The "${key}" argument must be >= 1`);
114
+ }
115
+ }
116
+ return value === void 0 ? Infinity : value;
117
+ }
118
+ function getItemCount(number) {
119
+ if (number === 1) {
120
+ return "1 item";
121
+ }
122
+ return `${number} items`;
123
+ }
124
+ function getUniqueReplacerSet(replacerArray) {
125
+ const replacerSet = /* @__PURE__ */ new Set();
126
+ for (const value of replacerArray) {
127
+ if (typeof value === "string" || typeof value === "number") {
128
+ replacerSet.add(String(value));
129
+ }
130
+ }
131
+ return replacerSet;
132
+ }
133
+ function getStrictOption(options) {
134
+ if (hasOwnProperty.call(options, "strict")) {
135
+ const value = options.strict;
136
+ if (typeof value !== "boolean") {
137
+ throw new TypeError('The "strict" argument must be of type boolean');
138
+ }
139
+ if (value) {
140
+ return (value2) => {
141
+ let message = `Object can not safely be stringified. Received type ${typeof value2}`;
142
+ if (typeof value2 !== "function") message += ` (${value2.toString()})`;
143
+ throw new Error(message);
144
+ };
145
+ }
146
+ }
147
+ }
148
+ function configure2(options) {
149
+ options = { ...options };
150
+ const fail = getStrictOption(options);
151
+ if (fail) {
152
+ if (options.bigint === void 0) {
153
+ options.bigint = false;
154
+ }
155
+ if (!("circularValue" in options)) {
156
+ options.circularValue = Error;
157
+ }
158
+ }
159
+ const circularValue = getCircularValueOption(options);
160
+ const bigint = getBooleanOption(options, "bigint");
161
+ const deterministic = getDeterministicOption(options);
162
+ const comparator = typeof deterministic === "function" ? deterministic : void 0;
163
+ const maximumDepth = getPositiveIntegerOption(options, "maximumDepth");
164
+ const maximumBreadth = getPositiveIntegerOption(options, "maximumBreadth");
165
+ function stringifyFnReplacer(key, parent, stack, replacer, spacer, indentation) {
166
+ let value = parent[key];
167
+ if (typeof value === "object" && value !== null && typeof value.toJSON === "function") {
168
+ value = value.toJSON(key);
169
+ }
170
+ value = replacer.call(parent, key, value);
171
+ switch (typeof value) {
172
+ case "string":
173
+ return strEscape(value);
174
+ case "object": {
175
+ if (value === null) {
176
+ return "null";
177
+ }
178
+ if (stack.indexOf(value) !== -1) {
179
+ return circularValue;
180
+ }
181
+ let res = "";
182
+ let join = ",";
183
+ const originalIndentation = indentation;
184
+ if (Array.isArray(value)) {
185
+ if (value.length === 0) {
186
+ return "[]";
187
+ }
188
+ if (maximumDepth < stack.length + 1) {
189
+ return '"[Array]"';
190
+ }
191
+ stack.push(value);
192
+ if (spacer !== "") {
193
+ indentation += spacer;
194
+ res += `
195
+ ${indentation}`;
196
+ join = `,
197
+ ${indentation}`;
198
+ }
199
+ const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
200
+ let i = 0;
201
+ for (; i < maximumValuesToStringify - 1; i++) {
202
+ const tmp2 = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
203
+ res += tmp2 !== void 0 ? tmp2 : "null";
204
+ res += join;
205
+ }
206
+ const tmp = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
207
+ res += tmp !== void 0 ? tmp : "null";
208
+ if (value.length - 1 > maximumBreadth) {
209
+ const removedKeys = value.length - maximumBreadth - 1;
210
+ res += `${join}"... ${getItemCount(removedKeys)} not stringified"`;
211
+ }
212
+ if (spacer !== "") {
213
+ res += `
214
+ ${originalIndentation}`;
215
+ }
216
+ stack.pop();
217
+ return `[${res}]`;
218
+ }
219
+ let keys = Object.keys(value);
220
+ const keyLength = keys.length;
221
+ if (keyLength === 0) {
222
+ return "{}";
223
+ }
224
+ if (maximumDepth < stack.length + 1) {
225
+ return '"[Object]"';
226
+ }
227
+ let whitespace = "";
228
+ let separator = "";
229
+ if (spacer !== "") {
230
+ indentation += spacer;
231
+ join = `,
232
+ ${indentation}`;
233
+ whitespace = " ";
234
+ }
235
+ const maximumPropertiesToStringify = Math.min(keyLength, maximumBreadth);
236
+ if (deterministic && !isTypedArrayWithEntries(value)) {
237
+ keys = sort(keys, comparator);
238
+ }
239
+ stack.push(value);
240
+ for (let i = 0; i < maximumPropertiesToStringify; i++) {
241
+ const key2 = keys[i];
242
+ const tmp = stringifyFnReplacer(key2, value, stack, replacer, spacer, indentation);
243
+ if (tmp !== void 0) {
244
+ res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
245
+ separator = join;
246
+ }
247
+ }
248
+ if (keyLength > maximumBreadth) {
249
+ const removedKeys = keyLength - maximumBreadth;
250
+ res += `${separator}"...":${whitespace}"${getItemCount(removedKeys)} not stringified"`;
251
+ separator = join;
252
+ }
253
+ if (spacer !== "" && separator.length > 1) {
254
+ res = `
255
+ ${indentation}${res}
256
+ ${originalIndentation}`;
257
+ }
258
+ stack.pop();
259
+ return `{${res}}`;
260
+ }
261
+ case "number":
262
+ return isFinite(value) ? String(value) : fail ? fail(value) : "null";
263
+ case "boolean":
264
+ return value === true ? "true" : "false";
265
+ case "undefined":
266
+ return void 0;
267
+ case "bigint":
268
+ if (bigint) {
269
+ return String(value);
270
+ }
271
+ // fallthrough
272
+ default:
273
+ return fail ? fail(value) : void 0;
274
+ }
275
+ }
276
+ function stringifyArrayReplacer(key, value, stack, replacer, spacer, indentation) {
277
+ if (typeof value === "object" && value !== null && typeof value.toJSON === "function") {
278
+ value = value.toJSON(key);
279
+ }
280
+ switch (typeof value) {
281
+ case "string":
282
+ return strEscape(value);
283
+ case "object": {
284
+ if (value === null) {
285
+ return "null";
286
+ }
287
+ if (stack.indexOf(value) !== -1) {
288
+ return circularValue;
289
+ }
290
+ const originalIndentation = indentation;
291
+ let res = "";
292
+ let join = ",";
293
+ if (Array.isArray(value)) {
294
+ if (value.length === 0) {
295
+ return "[]";
296
+ }
297
+ if (maximumDepth < stack.length + 1) {
298
+ return '"[Array]"';
299
+ }
300
+ stack.push(value);
301
+ if (spacer !== "") {
302
+ indentation += spacer;
303
+ res += `
304
+ ${indentation}`;
305
+ join = `,
306
+ ${indentation}`;
307
+ }
308
+ const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
309
+ let i = 0;
310
+ for (; i < maximumValuesToStringify - 1; i++) {
311
+ const tmp2 = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
312
+ res += tmp2 !== void 0 ? tmp2 : "null";
313
+ res += join;
314
+ }
315
+ const tmp = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
316
+ res += tmp !== void 0 ? tmp : "null";
317
+ if (value.length - 1 > maximumBreadth) {
318
+ const removedKeys = value.length - maximumBreadth - 1;
319
+ res += `${join}"... ${getItemCount(removedKeys)} not stringified"`;
320
+ }
321
+ if (spacer !== "") {
322
+ res += `
323
+ ${originalIndentation}`;
324
+ }
325
+ stack.pop();
326
+ return `[${res}]`;
327
+ }
328
+ stack.push(value);
329
+ let whitespace = "";
330
+ if (spacer !== "") {
331
+ indentation += spacer;
332
+ join = `,
333
+ ${indentation}`;
334
+ whitespace = " ";
335
+ }
336
+ let separator = "";
337
+ for (const key2 of replacer) {
338
+ const tmp = stringifyArrayReplacer(key2, value[key2], stack, replacer, spacer, indentation);
339
+ if (tmp !== void 0) {
340
+ res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
341
+ separator = join;
342
+ }
343
+ }
344
+ if (spacer !== "" && separator.length > 1) {
345
+ res = `
346
+ ${indentation}${res}
347
+ ${originalIndentation}`;
348
+ }
349
+ stack.pop();
350
+ return `{${res}}`;
351
+ }
352
+ case "number":
353
+ return isFinite(value) ? String(value) : fail ? fail(value) : "null";
354
+ case "boolean":
355
+ return value === true ? "true" : "false";
356
+ case "undefined":
357
+ return void 0;
358
+ case "bigint":
359
+ if (bigint) {
360
+ return String(value);
361
+ }
362
+ // fallthrough
363
+ default:
364
+ return fail ? fail(value) : void 0;
365
+ }
366
+ }
367
+ function stringifyIndent(key, value, stack, spacer, indentation) {
368
+ switch (typeof value) {
369
+ case "string":
370
+ return strEscape(value);
371
+ case "object": {
372
+ if (value === null) {
373
+ return "null";
374
+ }
375
+ if (typeof value.toJSON === "function") {
376
+ value = value.toJSON(key);
377
+ if (typeof value !== "object") {
378
+ return stringifyIndent(key, value, stack, spacer, indentation);
379
+ }
380
+ if (value === null) {
381
+ return "null";
382
+ }
383
+ }
384
+ if (stack.indexOf(value) !== -1) {
385
+ return circularValue;
386
+ }
387
+ const originalIndentation = indentation;
388
+ if (Array.isArray(value)) {
389
+ if (value.length === 0) {
390
+ return "[]";
391
+ }
392
+ if (maximumDepth < stack.length + 1) {
393
+ return '"[Array]"';
394
+ }
395
+ stack.push(value);
396
+ indentation += spacer;
397
+ let res2 = `
398
+ ${indentation}`;
399
+ const join2 = `,
400
+ ${indentation}`;
401
+ const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
402
+ let i = 0;
403
+ for (; i < maximumValuesToStringify - 1; i++) {
404
+ const tmp2 = stringifyIndent(String(i), value[i], stack, spacer, indentation);
405
+ res2 += tmp2 !== void 0 ? tmp2 : "null";
406
+ res2 += join2;
407
+ }
408
+ const tmp = stringifyIndent(String(i), value[i], stack, spacer, indentation);
409
+ res2 += tmp !== void 0 ? tmp : "null";
410
+ if (value.length - 1 > maximumBreadth) {
411
+ const removedKeys = value.length - maximumBreadth - 1;
412
+ res2 += `${join2}"... ${getItemCount(removedKeys)} not stringified"`;
413
+ }
414
+ res2 += `
415
+ ${originalIndentation}`;
416
+ stack.pop();
417
+ return `[${res2}]`;
418
+ }
419
+ let keys = Object.keys(value);
420
+ const keyLength = keys.length;
421
+ if (keyLength === 0) {
422
+ return "{}";
423
+ }
424
+ if (maximumDepth < stack.length + 1) {
425
+ return '"[Object]"';
426
+ }
427
+ indentation += spacer;
428
+ const join = `,
429
+ ${indentation}`;
430
+ let res = "";
431
+ let separator = "";
432
+ let maximumPropertiesToStringify = Math.min(keyLength, maximumBreadth);
433
+ if (isTypedArrayWithEntries(value)) {
434
+ res += stringifyTypedArray(value, join, maximumBreadth);
435
+ keys = keys.slice(value.length);
436
+ maximumPropertiesToStringify -= value.length;
437
+ separator = join;
438
+ }
439
+ if (deterministic) {
440
+ keys = sort(keys, comparator);
441
+ }
442
+ stack.push(value);
443
+ for (let i = 0; i < maximumPropertiesToStringify; i++) {
444
+ const key2 = keys[i];
445
+ const tmp = stringifyIndent(key2, value[key2], stack, spacer, indentation);
446
+ if (tmp !== void 0) {
447
+ res += `${separator}${strEscape(key2)}: ${tmp}`;
448
+ separator = join;
449
+ }
450
+ }
451
+ if (keyLength > maximumBreadth) {
452
+ const removedKeys = keyLength - maximumBreadth;
453
+ res += `${separator}"...": "${getItemCount(removedKeys)} not stringified"`;
454
+ separator = join;
455
+ }
456
+ if (separator !== "") {
457
+ res = `
458
+ ${indentation}${res}
459
+ ${originalIndentation}`;
460
+ }
461
+ stack.pop();
462
+ return `{${res}}`;
463
+ }
464
+ case "number":
465
+ return isFinite(value) ? String(value) : fail ? fail(value) : "null";
466
+ case "boolean":
467
+ return value === true ? "true" : "false";
468
+ case "undefined":
469
+ return void 0;
470
+ case "bigint":
471
+ if (bigint) {
472
+ return String(value);
473
+ }
474
+ // fallthrough
475
+ default:
476
+ return fail ? fail(value) : void 0;
477
+ }
478
+ }
479
+ function stringifySimple(key, value, stack) {
480
+ switch (typeof value) {
481
+ case "string":
482
+ return strEscape(value);
483
+ case "object": {
484
+ if (value === null) {
485
+ return "null";
486
+ }
487
+ if (typeof value.toJSON === "function") {
488
+ value = value.toJSON(key);
489
+ if (typeof value !== "object") {
490
+ return stringifySimple(key, value, stack);
491
+ }
492
+ if (value === null) {
493
+ return "null";
494
+ }
495
+ }
496
+ if (stack.indexOf(value) !== -1) {
497
+ return circularValue;
498
+ }
499
+ let res = "";
500
+ const hasLength = value.length !== void 0;
501
+ if (hasLength && Array.isArray(value)) {
502
+ if (value.length === 0) {
503
+ return "[]";
504
+ }
505
+ if (maximumDepth < stack.length + 1) {
506
+ return '"[Array]"';
507
+ }
508
+ stack.push(value);
509
+ const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
510
+ let i = 0;
511
+ for (; i < maximumValuesToStringify - 1; i++) {
512
+ const tmp2 = stringifySimple(String(i), value[i], stack);
513
+ res += tmp2 !== void 0 ? tmp2 : "null";
514
+ res += ",";
515
+ }
516
+ const tmp = stringifySimple(String(i), value[i], stack);
517
+ res += tmp !== void 0 ? tmp : "null";
518
+ if (value.length - 1 > maximumBreadth) {
519
+ const removedKeys = value.length - maximumBreadth - 1;
520
+ res += `,"... ${getItemCount(removedKeys)} not stringified"`;
521
+ }
522
+ stack.pop();
523
+ return `[${res}]`;
524
+ }
525
+ let keys = Object.keys(value);
526
+ const keyLength = keys.length;
527
+ if (keyLength === 0) {
528
+ return "{}";
529
+ }
530
+ if (maximumDepth < stack.length + 1) {
531
+ return '"[Object]"';
532
+ }
533
+ let separator = "";
534
+ let maximumPropertiesToStringify = Math.min(keyLength, maximumBreadth);
535
+ if (hasLength && isTypedArrayWithEntries(value)) {
536
+ res += stringifyTypedArray(value, ",", maximumBreadth);
537
+ keys = keys.slice(value.length);
538
+ maximumPropertiesToStringify -= value.length;
539
+ separator = ",";
540
+ }
541
+ if (deterministic) {
542
+ keys = sort(keys, comparator);
543
+ }
544
+ stack.push(value);
545
+ for (let i = 0; i < maximumPropertiesToStringify; i++) {
546
+ const key2 = keys[i];
547
+ const tmp = stringifySimple(key2, value[key2], stack);
548
+ if (tmp !== void 0) {
549
+ res += `${separator}${strEscape(key2)}:${tmp}`;
550
+ separator = ",";
551
+ }
552
+ }
553
+ if (keyLength > maximumBreadth) {
554
+ const removedKeys = keyLength - maximumBreadth;
555
+ res += `${separator}"...":"${getItemCount(removedKeys)} not stringified"`;
556
+ }
557
+ stack.pop();
558
+ return `{${res}}`;
559
+ }
560
+ case "number":
561
+ return isFinite(value) ? String(value) : fail ? fail(value) : "null";
562
+ case "boolean":
563
+ return value === true ? "true" : "false";
564
+ case "undefined":
565
+ return void 0;
566
+ case "bigint":
567
+ if (bigint) {
568
+ return String(value);
569
+ }
570
+ // fallthrough
571
+ default:
572
+ return fail ? fail(value) : void 0;
573
+ }
574
+ }
575
+ function stringify2(value, replacer, space) {
576
+ if (arguments.length > 1) {
577
+ let spacer = "";
578
+ if (typeof space === "number") {
579
+ spacer = " ".repeat(Math.min(space, 10));
580
+ } else if (typeof space === "string") {
581
+ spacer = space.slice(0, 10);
582
+ }
583
+ if (replacer != null) {
584
+ if (typeof replacer === "function") {
585
+ return stringifyFnReplacer("", { "": value }, [], replacer, spacer, "");
586
+ }
587
+ if (Array.isArray(replacer)) {
588
+ return stringifyArrayReplacer("", value, [], getUniqueReplacerSet(replacer), spacer, "");
589
+ }
590
+ }
591
+ if (spacer.length !== 0) {
592
+ return stringifyIndent("", value, [], spacer, "");
593
+ }
594
+ }
595
+ return stringifySimple("", value, []);
596
+ }
597
+ return stringify2;
598
+ }
599
+ }
600
+ });
601
+
602
+ // ../canvas-contract/src/adPlacements.ts
603
+ var AD_PLATFORMS = [
604
+ "meta",
605
+ "google_display",
606
+ "google_pmax",
607
+ "google_demandgen",
608
+ "google_search",
609
+ "youtube",
610
+ "linkedin",
611
+ "tiktok",
612
+ "x",
613
+ "reddit",
614
+ "pinterest",
615
+ "snapchat",
616
+ "chatgpt"
617
+ ];
618
+ var FEED_MARGIN = { top: 0.04, bottom: 0.04, left: 0.04, right: 0.04 };
619
+ var size = (width, height, required = true) => ({ width, height, required });
620
+ var AD_PLACEMENTS = [
621
+ {
622
+ id: "meta_feed",
623
+ platform: "meta",
624
+ name: "Facebook and Instagram feeds",
625
+ sizes: [size(1080, 1350), size(1080, 1080, false)],
626
+ safe: FEED_MARGIN,
627
+ source: "https://www.facebook.com/business/ads-guide/update/image/instagram-feed"
628
+ },
629
+ {
630
+ id: "meta_stories",
631
+ platform: "meta",
632
+ name: "Facebook and Instagram Stories",
633
+ sizes: [size(1080, 1920)],
634
+ safe: { top: 0.16, bottom: 0.22, left: 0.04, right: 0.04 },
635
+ cover: { top: 0.09, bottom: 0.15 },
636
+ source: "https://www.facebook.com/business/ads-guide/update/image/instagram-story"
637
+ },
638
+ {
639
+ id: "meta_reels",
640
+ platform: "meta",
641
+ name: "Facebook and Instagram Reels",
642
+ sizes: [size(1080, 1920)],
643
+ safe: { top: 0.16, bottom: 0.37, left: 0.04, right: 0.04 },
644
+ cover: { top: 0.09, bottom: 0.32, rail: { width: 0.08, from: 0.6 } },
645
+ railMargin: { width: 0.1, from: 0.55 },
646
+ source: "https://www.facebook.com/business/ads-guide/update/image/instagram-reels"
647
+ },
648
+ {
649
+ id: "meta_right_column",
650
+ platform: "meta",
651
+ name: "Facebook right column, Marketplace and search results",
652
+ sizes: [size(1080, 1080), size(1200, 628, false)],
653
+ safe: FEED_MARGIN,
654
+ source: "https://www.facebook.com/business/ads-guide/update/image/facebook-right-column"
655
+ },
656
+ {
657
+ id: "google_display_responsive",
658
+ platform: "google_display",
659
+ name: "Responsive display ads (Google Display Network)",
660
+ sizes: [size(1200, 628), size(1200, 1200), size(900, 1600, false)],
661
+ safe: FEED_MARGIN,
662
+ rule: "Text may cover at most 20% of the image; Google crops up to 5% from each side.",
663
+ source: "https://support.google.com/google-ads/answer/9823397"
664
+ },
665
+ {
666
+ id: "google_display_banners",
667
+ platform: "google_display",
668
+ name: "Uploaded display banners",
669
+ sizes: [
670
+ size(300, 250),
671
+ size(728, 90),
672
+ size(320, 50),
673
+ size(336, 280, false),
674
+ size(300, 600, false),
675
+ size(160, 600, false),
676
+ size(320, 100, false),
677
+ size(970, 250, false)
678
+ ],
679
+ safe: FEED_MARGIN,
680
+ rule: "Each banner is exactly its pixel size, 150 KB at most.",
681
+ source: "https://support.google.com/google-ads/answer/7031480"
682
+ },
683
+ {
684
+ id: "google_pmax",
685
+ platform: "google_pmax",
686
+ name: "Performance Max asset group",
687
+ sizes: [size(1200, 628), size(1200, 1200), size(960, 1200, false)],
688
+ safe: FEED_MARGIN,
689
+ rule: "Google crops up to 5% from each side; keep text and logos off the edges.",
690
+ source: "https://support.google.com/google-ads/answer/13676244"
691
+ },
692
+ {
693
+ id: "google_demandgen",
694
+ platform: "google_demandgen",
695
+ name: "Demand Gen (YouTube, Discover, Gmail)",
696
+ sizes: [size(1200, 628), size(1200, 1200), size(960, 1200, false)],
697
+ safe: FEED_MARGIN,
698
+ source: "https://support.google.com/google-ads/answer/13547298"
699
+ },
700
+ {
701
+ id: "google_search_images",
702
+ platform: "google_search",
703
+ name: "Image assets on Search ads",
704
+ sizes: [size(1200, 1200), size(1200, 628, false)],
705
+ safe: FEED_MARGIN,
706
+ rule: "No overlaid text, logos or buttons on the image.",
707
+ source: "https://support.google.com/google-ads/answer/12118270"
708
+ },
709
+ {
710
+ id: "youtube_feed",
711
+ platform: "youtube",
712
+ name: "YouTube home and watch-next feeds",
713
+ sizes: [size(1200, 628), size(1200, 1200, false)],
714
+ safe: FEED_MARGIN,
715
+ source: "https://support.google.com/google-ads/answer/13547298"
716
+ },
717
+ {
718
+ id: "youtube_shorts",
719
+ platform: "youtube",
720
+ name: "YouTube Shorts",
721
+ sizes: [size(1080, 1920)],
722
+ safe: { top: 0.12, bottom: 0.35, left: 0.05, right: 0.05 },
723
+ cover: { top: 0.08, bottom: 0.3, rail: { width: 0.14, from: 0.45 } },
724
+ railMargin: { width: 0.16, from: 0.4 },
725
+ source: "https://support.google.com/youtube/answer/10059070"
726
+ },
727
+ {
728
+ id: "linkedin_feed",
729
+ platform: "linkedin",
730
+ name: "LinkedIn feed (single image)",
731
+ sizes: [size(1200, 1200), size(1200, 627, false), size(720, 900, false)],
732
+ safe: FEED_MARGIN,
733
+ source: "https://www.linkedin.com/help/lms/answer/a426534"
734
+ },
735
+ {
736
+ id: "tiktok_feed",
737
+ platform: "tiktok",
738
+ name: "TikTok For You feed",
739
+ sizes: [size(1080, 1920)],
740
+ safe: { top: 0.1, bottom: 0.3, left: 0.06, right: 0.06 },
741
+ cover: { top: 0.07, bottom: 0.25, rail: { width: 0.13, from: 0.45 } },
742
+ railMargin: { width: 0.15, from: 0.4 },
743
+ source: "https://ads.tiktok.com/help/article/tiktok-ads-safe-zone"
744
+ },
745
+ {
746
+ id: "x_timeline",
747
+ platform: "x",
748
+ name: "X timeline (image and website card)",
749
+ sizes: [size(1200, 628), size(1200, 1200, false)],
750
+ safe: FEED_MARGIN,
751
+ source: "https://business.x.com/en/help/campaign-setup/creative-ad-specifications"
752
+ },
753
+ {
754
+ id: "reddit_feed",
755
+ platform: "reddit",
756
+ name: "Reddit feed and conversation pages",
757
+ sizes: [size(1080, 1080), size(1080, 1350, false), size(1200, 628, false)],
758
+ safe: FEED_MARGIN,
759
+ source: "https://business.reddithelp.com/s/article/image-ad-specs"
760
+ },
761
+ {
762
+ id: "pinterest_feed",
763
+ platform: "pinterest",
764
+ name: "Pinterest home feed and search (standard pin)",
765
+ sizes: [size(1e3, 1500), size(1e3, 1e3, false)],
766
+ safe: FEED_MARGIN,
767
+ source: "https://help.pinterest.com/en/business/article/pinterest-product-specs"
768
+ },
769
+ {
770
+ id: "snapchat_snap_ads",
771
+ platform: "snapchat",
772
+ name: "Snapchat Snap Ads",
773
+ sizes: [size(1080, 1920)],
774
+ safe: { top: 0.11, bottom: 0.21, left: 0.04, right: 0.04 },
775
+ cover: { top: 0.08, bottom: 0.18 },
776
+ source: "https://businesshelp.snapchat.com/s/article/single-image-video-specs"
777
+ },
778
+ {
779
+ id: "chatgpt_card",
780
+ platform: "chatgpt",
781
+ name: "ChatGPT sponsored card",
782
+ sizes: [size(1200, 1200)],
783
+ safe: FEED_MARGIN,
784
+ rule: "The card shows a square of the image; keep everything that matters inside it.",
785
+ source: "https://help.openai.com/en/articles/chatgpt-ads"
786
+ }
787
+ ];
788
+ var RATIOS = [
789
+ ["1:1", 1],
790
+ ["4:5", 4 / 5],
791
+ ["9:16", 9 / 16],
792
+ ["16:9", 16 / 9],
793
+ ["1.91:1", 1.91],
794
+ ["2:3", 2 / 3],
795
+ ["3:4", 3 / 4],
796
+ ["4:3", 4 / 3]
797
+ ];
798
+ function ratioLabel(width, height) {
799
+ const r = width / height;
800
+ const known = RATIOS.find(([, value]) => Math.abs(Math.log(r / value)) < 0.01);
801
+ return known ? known[0] : `${width}x${height}`;
802
+ }
803
+ function placementsFor(names) {
804
+ const placements = [];
805
+ const unknown = [];
806
+ for (const raw of names) {
807
+ const name = raw.trim().toLowerCase();
808
+ if (!name) continue;
809
+ const found = AD_PLACEMENTS.filter((p) => p.platform === name || p.id === name);
810
+ if (found.length === 0) unknown.push(raw.trim());
811
+ for (const p of found) if (!placements.includes(p)) placements.push(p);
812
+ }
813
+ return { placements, unknown };
814
+ }
815
+ function addSize(into, format, size2, placement) {
816
+ const existing = into.find((f) => f.format === format);
817
+ if (!existing) {
818
+ into.push({ format, width: size2.width, height: size2.height, placements: [placement] });
819
+ return;
820
+ }
821
+ if (!existing.placements.includes(placement)) existing.placements.push(placement);
822
+ if (size2.width > existing.width) Object.assign(existing, { width: size2.width, height: size2.height });
823
+ }
824
+ function deliverySet(names) {
825
+ const { placements, unknown } = placementsFor(names);
826
+ const formats = [];
827
+ const banners = [];
828
+ for (const placement of placements) {
829
+ for (const s of placement.sizes.filter((x) => x.required)) {
830
+ const format = ratioLabel(s.width, s.height);
831
+ addSize(format.includes("x") ? banners : formats, format, s, placement.id);
832
+ }
833
+ }
834
+ return { formats, banners, unknown };
835
+ }
836
+ function verticalCover(placementIds) {
837
+ const covering = AD_PLACEMENTS.filter((p) => placementIds.includes(p.id) && p.cover);
838
+ if (covering.length === 0) return null;
839
+ const max = (pick) => Math.max(...covering.map((p) => pick(p) ?? 0));
840
+ const rails = covering.filter((p) => p.cover?.rail);
841
+ const margins = covering.filter((p) => p.railMargin);
842
+ return {
843
+ top: max((p) => p.cover?.top),
844
+ bottom: max((p) => p.cover?.bottom),
845
+ ...rails.length > 0 ? {
846
+ rail: {
847
+ width: max((p) => p.cover?.rail?.width),
848
+ from: Math.min(...rails.map((p) => p.cover?.rail?.from ?? 1))
849
+ }
850
+ } : {},
851
+ ...margins.length > 0 ? {
852
+ railMargin: {
853
+ width: max((p) => p.railMargin?.width),
854
+ from: Math.min(...margins.map((p) => p.railMargin?.from ?? 1))
855
+ }
856
+ } : {},
857
+ safe: {
858
+ top: max((p) => p.safe.top),
859
+ bottom: max((p) => p.safe.bottom),
860
+ left: max((p) => p.safe.left),
861
+ right: max((p) => p.safe.right)
862
+ }
863
+ };
864
+ }
865
+
866
+ // ../canvas-contract/src/adPlatformFormats.ts
867
+ var AD_FORMAT_PLATFORMS = [
868
+ "meta_feed",
869
+ "meta_feed_stories",
870
+ "meta_all",
871
+ "linkedin",
872
+ "google_search",
873
+ "google_demandgen",
874
+ "tiktok",
875
+ "youtube"
876
+ ];
877
+ var AD_PLATFORM_FORMAT_PRESETS = {
878
+ meta_feed: { formats: ["4:5"], note: "Meta/Instagram feed static." },
879
+ meta_feed_stories: { formats: ["4:5", "9:16"], note: "Meta feed + Stories/Reels." },
880
+ meta_all: { formats: ["4:5", "9:16", "1:1"], note: "Meta feed + Stories/Reels + square." },
881
+ linkedin: { formats: ["1:1"], note: "LinkedIn single-image feed (square)." },
882
+ google_search: {
883
+ // Search image assets: 1:1 is the required one, 1.91:1 the optional landscape.
884
+ // 16:9 is rendered only as the crop source for that landscape — Search never serves 16:9 itself.
885
+ formats: ["1:1", "16:9"],
886
+ offGrid: ["1.91:1"],
887
+ note: "Google Search image assets (the image extension on a text ad); 1:1 required, 1.91:1 landscape \u2014 crop that from the rendered 16:9. Stage 3+ per campaign."
888
+ },
889
+ google_demandgen: {
890
+ // Renders 16:9 too so the off-grid 1.91:1 landscape has a native source to crop from.
891
+ formats: ["1:1", "4:5", "16:9"],
892
+ offGrid: ["1.91:1"],
893
+ note: "Google Demand Gen; also wants 1.91:1 landscape \u2014 crop that from the rendered 16:9."
894
+ },
895
+ tiktok: { formats: ["9:16"], note: "TikTok full-screen vertical." },
896
+ youtube: { formats: ["16:9"], note: "YouTube in-stream / companion display." }
897
+ };
898
+ function platformFormats(platform) {
899
+ return AD_PLATFORM_FORMAT_PRESETS[platform].formats;
900
+ }
901
+ function resolveAdaptFormats(params) {
902
+ if (params.platform) return platformFormats(params.platform);
903
+ return params.formats ?? [];
904
+ }
905
+
906
+ // ../canvas-contract/src/adRead.ts
907
+ var AD_DESCRIBE_FOCUS = "FIRST, WHY THIS AD WINS, in layers, in `why_it_wins` { disguise (what it pretends to be: a note, a tweet, a newspaper, a chat, a plain ad), voice (who speaks, and how), trigger (the emotion or need it pulls: a free gift, a hidden loss, status, curiosity), attention (what stops the scroll), logic (why it convinces: reciprocity, social proof, a comparison, a price anchor) }, one short phrase each; and in `load_bearing` the 1-4 elements it stops working without (never decoration), each { element, needs: what it takes to carry it } (a free gift, a real peer's face, priced tiers, a native disguise). THEN the LAYOUT: the column/row grid, which region holds what (describe each by what fills it and where it sits, never by percentages or pixel figures), any panel splits, and for EVERY text block its string verbatim, its size relative to the other text (x_large | large | medium | small), weight, case, colour in words, and placement, including small bottom-corner fine print, and whether it is lettered on something in the scene (`surface`). Also: the EXPRESSION and emotion of every person/animal (capture exaggerated or AI-edited faces), the ad_intent, logos by brand, and all visible text verbatim. The TYPOGRAPHY as a first-class identity signal: for EVERY distinct typeface record a `fonts` entry (which text blocks use it, its classification, a best-guess family or close lookalike, its weight/case/styling), and whether the advertiser's LOGO appears in more than one lockup (a square/icon MARK and a horizontal WORDMARK are two assets: capture BOTH). Capture as a photographer would describe it in words (phone or studio, the height and angle, the light and its direction), never as lens or exposure figures. CRITICAL: name the MECHANISM, the one device that makes THIS ad work on a stranger rather than a generic ad (VERBAL: a rhyme, pun, repetition, antithesis; VISUAL: an unexpected crop or scale, a visual gag, a before/after or comparison, bold negative space; STRUCTURAL: an unusual hook, order or reveal). Record every device in `winning_mechanisms` as { kind: verbal|visual|structural, device, why_it_works } and the strongest one in `mechanism`. And read WHO the ad is for, in `audience`: the viewer it speaks to, their awareness stage, how warm they must already be, and whether the copy only works if they already know this brand or offer (`presumes_brand_knowledge`), so a rebuild for a different audience knows what to change";
908
+ var AD_SELECT_SYSTEM = 'You identify the MAIN, identity-critical visual elements of an advertisement from its JSON blueprint \u2014 the things a faithful reproduction must supply as REAL reference images instead of letting a model invent them. Output ONLY a JSON object of the form { "elements": [ ... ] }, no prose.';
909
+ var AD_SELECT_PROMPT = `AD BLUEPRINT (from image_describe):
910
+ {{blueprint}}
911
+
912
+ From this blueprint, list ONLY the elements that are prominent, important, and identity-bearing \u2014 the ones a reproduction must ground in a real asset:
913
+ - the brand logo/wordmark (from brands_logos with function_in_image = advertiser_brand) -> type "logo". A brand often ships its logo in TWO lockups \u2014 a square/icon MARK and a horizontal WORDMARK \u2014 and an ad may use both (e.g. an icon in a product mock plus the wordmark in the sign-off). When more than one distinct lockup of the SAME advertiser appears, emit a SEPARATE logo element for each (label them by lockup, e.g. LOGO_MARK and LOGO_WORDMARK) so the reproduction can drop the right file in each slot instead of stretching one logo to cover both.
914
+ - trust/rating/certification/app-store/review badges (brands_logos with function_in_image = trust_badge | review_platform | certification_or_seal | app_store_badge | payment_method) -> type "badge"
915
+ - a showcased/hero product or package (a foreground entry in subjects that the ad is selling) -> type "product"
916
+ - a foreground person (from people) \u2014 keep it when its identity matters OR it is the emotional/hero focal point of the ad, even a generic one with no brand identity -> type "person". Describe them as a castable, invented everyday person (age band, look, wardrobe, expression) \u2014 never the source person's identity: unless a company avatar is cast, the render draws this person from your words alone
917
+ - a foreground animal/character (from subjects) \u2014 keep it when it carries a specific expression OR it is the emotional/hero focal point, even a generic one -> type "animal"
918
+ (For an animal: a free-generated muzzle or teeth reads as AI and grows artifacts \u2014 malformed mouths, foam \u2014 so the emotional hero needs the STRONGEST real grounding, not the weakest; "it's just a generic dog/person" is never a reason to drop either.)
919
+
920
+ DROP background extras, decorative props, generic scenery, and anything small or incidental. Keep at most ~6. If there are none, return an empty list.
921
+
922
+ For each kept element return: { "type": one of logo|product|person|animal|badge, "label": a short UPPER_SNAKE_CASE name (e.g. LOGO, PRODUCT, HERO_DOG, TRUSTPILOT), "description": a concrete reusable description to source/shoot the real asset (include the exact expression for a living subject, and its castable attributes \u2014 breed/species for an animal, apparent age band, apparent origin/ethnicity, and wardrobe/setting for a person \u2014 so it can be recast to fit OUR audience/market), "expression": the facial expression for a living subject or null, "reason": why it is identity-critical, "locator": the blueprint entry this element came from as { "collection": one of "subjects" | "people" | "brands_logos", "index": its 0-based position in that array } (people -> people; logos/badges -> brands_logos; products/animals/objects -> subjects). Output ONLY the JSON object.`;
923
+
924
+ // ../canvas-contract/src/castName.ts
925
+ function withoutCastName(text, names) {
926
+ let out = text;
927
+ for (const name of names) {
928
+ const token = name.trim();
929
+ if (token.length < 3) continue;
930
+ const pattern = new RegExp(`(?<![\\p{L}\\p{N}])${escapeForPattern(token)}(?![\\p{L}\\p{N}])`, "giu");
931
+ out = out.replace(pattern, "the person in the reference");
932
+ }
933
+ return out;
934
+ }
935
+ function escapeForPattern(value) {
936
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
937
+ }
938
+
939
+ // ../canvas-contract/src/registry.ts
940
+ var OPENROUTER_ROUTE = { provider: "openrouter" };
941
+ var USAGE_BILLED = { kind: "usage" };
942
+ var MIN_BILLED_SECONDS = 5;
943
+ var SEEDANCE_FACE_RECOVERY_ROUTE = {
944
+ provider: "fal",
945
+ wireModel: "bytedance/seedance-2.5/reference-to-video"
946
+ };
947
+ var OPENROUTER_IMAGE_AR = ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"];
948
+ var OPENROUTER_IMAGE_AR_EXTREME = [...OPENROUTER_IMAGE_AR, "1:4", "4:1", "1:8", "8:1"];
949
+ var OPENROUTER_IMAGE_AR_GPT = ["1:1", "2:3", "3:2", "3:4", "4:3", "9:16", "16:9", "21:9"];
950
+ var GPT_IMAGE_PROMPT_MAX = 32e3;
951
+ var RECRAFT_PROMPT_MAX = 1e4;
952
+ var SEEDANCE_PROMPT_MAX = 4e3;
953
+ var KLING_PROMPT_MAX = 2500;
954
+ var UINT32_MAX = 4294967295;
955
+ var VEO_SEED_MAX = UINT32_MAX;
956
+ var GPT_IMAGE_MAX_REFERENCES = 16;
957
+ var GEMINI_IMAGE_MAX_REFERENCES = 14;
958
+ var RECRAFT_MAX_REFERENCES = 1;
959
+ var SEEDANCE_MAX_REFERENCES = 9;
960
+ var OPENROUTER_IMAGE_SIZE = ["1K", "2K", "4K"];
961
+ var OPENROUTER_IMAGE_SIZES = ["0.5K", ...OPENROUTER_IMAGE_SIZE];
962
+ var OPENROUTER_IMAGE_SIZE_EXTENDED = OPENROUTER_IMAGE_SIZES;
963
+ var GEMINI_LITE_IMAGE_SIZE = ["1K"];
964
+ var OPENROUTER_IMAGE_QUALITY = ["auto", "low", "medium", "high"];
965
+ var OPENROUTER_IMAGE_QUALITY_25 = ["auto", "low", "medium", "high", "xhigh", "max"];
966
+ var OPENROUTER_IMAGE_N = { kind: "number", integer: true, min: 1, max: 10 };
967
+ var RECRAFT_IMAGE_AR = ["1:1", "4:3", "3:4", "16:9", "9:16"];
968
+ var SEEDANCE_DURATIONS = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
969
+ var SEEDANCE_25_DURATIONS = [
970
+ 4,
971
+ 5,
972
+ 6,
973
+ 7,
974
+ 8,
975
+ 9,
976
+ 10,
977
+ 11,
978
+ 12,
979
+ 13,
980
+ 14,
981
+ 15,
982
+ 16,
983
+ 17,
984
+ 18,
985
+ 19,
986
+ 20,
987
+ 21,
988
+ 22,
989
+ 23,
990
+ 24,
991
+ 25,
992
+ 26,
993
+ 27,
994
+ 28,
995
+ 29,
996
+ 30
997
+ ];
998
+ var SEEDANCE_25_ASPECT_RATIOS = ["1:1", "3:4", "9:16", "4:3", "16:9", "21:9"];
999
+ var SEEDANCE_25_RESOLUTIONS = ["480p", "720p"];
1000
+ var SEEDANCE_25_MAX_IMAGE_REFERENCES = 30;
1001
+ var SEEDANCE_25_MAX_VIDEO_REFERENCES = 10;
1002
+ var SEEDANCE_25_MAX_AUDIO_REFERENCES = 10;
1003
+ var KLING_DURATIONS = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
1004
+ var GEMINI_OMNI_DURATIONS = [3, 4, 5, 6, 7, 8, 9, 10];
1005
+ var GEMINI_OMNI_ASPECT_RATIOS = ["16:9", "9:16"];
1006
+ var GEMINI_OMNI_RESOLUTIONS = ["360p", "720p", "1080p", "4k"];
1007
+ var GEMINI_OMNI_IMAGE_MIMES = ["image/png", "image/jpeg", "image/webp"];
1008
+ var GROK_IMAGINE_DURATIONS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1009
+ var WAN_27_DURATIONS = [2, 3, 4, 5, 6, 7, 8, 9, 10];
1010
+ var HAPPYHORSE_DURATIONS = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
1011
+ var WAN_30_DURATIONS = [
1012
+ 2,
1013
+ 3,
1014
+ 4,
1015
+ 5,
1016
+ 6,
1017
+ 7,
1018
+ 8,
1019
+ 9,
1020
+ 10,
1021
+ 11,
1022
+ 12,
1023
+ 13,
1024
+ 14,
1025
+ 15,
1026
+ 16,
1027
+ 17,
1028
+ 18,
1029
+ 19,
1030
+ 20,
1031
+ 21,
1032
+ 22,
1033
+ 23,
1034
+ 24,
1035
+ 25,
1036
+ 26,
1037
+ 27,
1038
+ 28,
1039
+ 29,
1040
+ 30
1041
+ ];
1042
+ var GROK_IMAGINE_15_DURATIONS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
1043
+ var RUNWAY_45_DURATIONS = [2, 3, 4, 5, 6, 7, 8, 9, 10];
1044
+ var ELEVENLABS_OUTPUT_FORMATS = [
1045
+ "mp3_22050_32",
1046
+ "mp3_44100_32",
1047
+ "mp3_44100_64",
1048
+ "mp3_44100_96",
1049
+ "mp3_44100_128",
1050
+ "mp3_44100_192"
1051
+ ];
1052
+ var ELEVENLABS_MAX_TEXT_CHARS = 45454;
1053
+ var ELEVENLABS_MAX_MUSIC_LENGTH_MS = 454545;
1054
+ var ELEVENLABS_MUSIC_ENGINE = "music_v2";
1055
+ var OPENROUTER_IMAGE_MIMES = ["image/png", "image/jpeg", "image/webp", "image/gif"];
1056
+ var OPENROUTER_VIDEO_REFERENCE_MIMES = ["video/mp4", "video/quicktime", "video/webm"];
1057
+ var OPENROUTER_AUDIO_REFERENCE_MIMES = ["audio/mpeg", "audio/mp3", "audio/wav"];
1058
+ var REPLICATE_IMAGE_MIMES = ["image/png", "image/jpeg", "image/webp"];
1059
+ var REPLICATE_VIDEO_MIMES = ["video/mp4", "video/webm", "video/quicktime"];
1060
+ var DECONSTRUCT_VIDEO_MIMES = ["video/mp4", "video/webm", "video/quicktime"];
1061
+ var REPLICATE_AUDIO_MIMES = ["audio/wav", "audio/mpeg", "audio/mp3"];
1062
+ var IMAGE_GENERATE_MODELS = [
1063
+ "openai/gpt-image-2.5-sunburst",
1064
+ "openai/gpt-image-2",
1065
+ "google/gemini-3.1-flash-image",
1066
+ "google/gemini-3.1-flash-lite-image",
1067
+ "google/gemini-3-pro-image",
1068
+ "recraft/recraft-v4.1-pro-vector"
1069
+ ];
1070
+ var DEFAULT_IMAGE_GENERATE_MODEL = "google/gemini-3.1-flash-image";
1071
+ var IMAGE_PRICE_TIER = {
1072
+ "openai/gpt-image-2.5-sunburst": "standard",
1073
+ "openai/gpt-image-2": "standard",
1074
+ "google/gemini-3.1-flash-image": "standard",
1075
+ "google/gemini-3.1-flash-lite-image": "standard",
1076
+ "google/gemini-3-pro-image": "pro",
1077
+ "recraft/recraft-v4.1-pro-vector": "standard"
1078
+ };
1079
+ var IMAGE_TIER_CREDITS = { pro: 20, standard: 5 };
1080
+ function imagePictureCredits(model) {
1081
+ const tier = IMAGE_PRICE_TIER[canonicalModelId(model)] ?? "standard";
1082
+ return IMAGE_TIER_CREDITS[tier];
1083
+ }
1084
+ var VIDEO_GENERATE_MODELS = [
1085
+ "bytedance/seedance-2.0",
1086
+ "bytedance/seedance-2.5",
1087
+ "google/gemini-omni-1.1-flash",
1088
+ "google/gemini-omni-flash",
1089
+ "google/veo-3.1",
1090
+ "google/veo-3.1-fast",
1091
+ "google/veo-3.1-lite",
1092
+ "kwaivgi/kling-v3.0-pro",
1093
+ "x-ai/grok-imagine-video",
1094
+ "x-ai/grok-imagine-video-1.5",
1095
+ "alibaba/wan-2.7",
1096
+ "alibaba/wan-3.0",
1097
+ "runway/gen-4.5",
1098
+ "alibaba/happyhorse-1.1"
1099
+ ];
1100
+ var DEFAULT_VIDEO_GENERATE_MODEL = "google/gemini-omni-1.1-flash";
1101
+ var REFERENCE_TO_VIDEO_MODELS = [
1102
+ "bytedance/seedance-2.0",
1103
+ "bytedance/seedance-2.5",
1104
+ "google/gemini-omni-1.1-flash",
1105
+ "google/gemini-omni-flash",
1106
+ "x-ai/grok-imagine-video",
1107
+ "alibaba/wan-2.7",
1108
+ "alibaba/happyhorse-1.1"
1109
+ ];
1110
+ function supportsReferenceToVideo(model) {
1111
+ return REFERENCE_TO_VIDEO_MODELS.includes(model);
1112
+ }
1113
+ var DEFAULT_AVATAR_VIDEO_MODEL = "x-ai/grok-imagine-video";
1114
+ function isGeminiOmniModel(model) {
1115
+ return model.startsWith("google/gemini-omni");
1116
+ }
1117
+ var GEMINI_OMNI_PREVIEW_MODEL = "google/gemini-omni-flash";
1118
+ function isGeminiOmniPreviewModel(model) {
1119
+ return model === GEMINI_OMNI_PREVIEW_MODEL;
1120
+ }
1121
+ function isSeedance25Model(model) {
1122
+ return model === "bytedance/seedance-2.5";
1123
+ }
1124
+ var LAST_FRAME_TO_VIDEO_MODELS = [
1125
+ "bytedance/seedance-2.0",
1126
+ "bytedance/seedance-2.5",
1127
+ "google/veo-3.1",
1128
+ "google/veo-3.1-fast",
1129
+ "kwaivgi/kling-v3.0-pro"
1130
+ ];
1131
+ function supportsLastFrame(model) {
1132
+ return LAST_FRAME_TO_VIDEO_MODELS.includes(model);
1133
+ }
1134
+ var MODEL_REGISTRY = {
1135
+ text_generate: {
1136
+ "~google/gemini-flash-latest": {
1137
+ label: "Google Gemini Flash (latest)",
1138
+ route: OPENROUTER_ROUTE,
1139
+ billing: USAGE_BILLED,
1140
+ inputs: [],
1141
+ required: ["prompt"],
1142
+ params: {
1143
+ prompt: { kind: "string" },
1144
+ system: { kind: "string" },
1145
+ response_format: { kind: "string", enum: ["text", "json_object"] },
1146
+ web_search: { kind: "boolean" },
1147
+ temperature: { kind: "number", min: 0, max: 2 },
1148
+ max_tokens: { kind: "number", min: 1 }
1149
+ }
1150
+ },
1151
+ "~google/gemini-pro-latest": {
1152
+ label: "Google Gemini Pro (latest)",
1153
+ route: OPENROUTER_ROUTE,
1154
+ billing: USAGE_BILLED,
1155
+ inputs: [],
1156
+ required: ["prompt"],
1157
+ params: {
1158
+ prompt: { kind: "string" },
1159
+ system: { kind: "string" },
1160
+ response_format: { kind: "string", enum: ["text", "json_object"] },
1161
+ web_search: { kind: "boolean" },
1162
+ temperature: { kind: "number", min: 0, max: 2 },
1163
+ max_tokens: { kind: "number", min: 1 }
1164
+ }
1165
+ }
1166
+ },
1167
+ image_describe: {
1168
+ // Vision extraction — the Visual Architect system prompt lives on the
1169
+ // backend, so there is no `prompt` param; `focus` appends emphasis only.
1170
+ "~google/gemini-pro-latest": {
1171
+ label: "Google Gemini Pro (latest, Vision)",
1172
+ route: OPENROUTER_ROUTE,
1173
+ billing: USAGE_BILLED,
1174
+ inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1175
+ required: [],
1176
+ params: {
1177
+ focus: { kind: "string" },
1178
+ context: { kind: "string" },
1179
+ temperature: { kind: "number", min: 0, max: 2 },
1180
+ max_tokens: { kind: "number", min: 1 }
1181
+ }
1182
+ },
1183
+ "~google/gemini-flash-latest": {
1184
+ label: "Google Gemini Flash (latest, Vision)",
1185
+ route: OPENROUTER_ROUTE,
1186
+ billing: USAGE_BILLED,
1187
+ inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1188
+ required: [],
1189
+ params: {
1190
+ focus: { kind: "string" },
1191
+ context: { kind: "string" },
1192
+ temperature: { kind: "number", min: 0, max: 2 },
1193
+ max_tokens: { kind: "number", min: 1 }
1194
+ }
1195
+ }
1196
+ },
1197
+ image_select: {
1198
+ // Vision judgement — the selection contract (numbered images, JSON
1199
+ // response) is baked into the backend prompt; `prompt` carries only the
1200
+ // selection criteria. `count` has an engine-side default of 1, so it is
1201
+ // not registry-required.
1202
+ "~google/gemini-flash-latest": {
1203
+ label: "Google Gemini Flash (latest, Vision)",
1204
+ route: OPENROUTER_ROUTE,
1205
+ billing: USAGE_BILLED,
1206
+ inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1207
+ required: ["prompt"],
1208
+ params: {
1209
+ prompt: { kind: "string" },
1210
+ count: { kind: "number", min: 1 },
1211
+ temperature: { kind: "number", min: 0, max: 2 },
1212
+ max_tokens: { kind: "number", min: 1 }
1213
+ }
1214
+ },
1215
+ "~google/gemini-pro-latest": {
1216
+ label: "Google Gemini Pro (latest, Vision)",
1217
+ route: OPENROUTER_ROUTE,
1218
+ billing: USAGE_BILLED,
1219
+ inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1220
+ required: ["prompt"],
1221
+ params: {
1222
+ prompt: { kind: "string" },
1223
+ count: { kind: "number", min: 1 },
1224
+ temperature: { kind: "number", min: 0, max: 2 },
1225
+ max_tokens: { kind: "number", min: 1 }
1226
+ }
1227
+ }
1228
+ },
1229
+ image_generate: {
1230
+ // `seed` is omitted on every entry — OpenRouter's `image_config` schema
1231
+ // has no `seed` slot for image-gen (different from video-gen), so passing
1232
+ // it would be a silent no-op.
1233
+ // The direct image model, not the `gpt-5.4-image-2` chat model that emitted
1234
+ // images as a side effect. Notable capability gaps vs the Gemini entries:
1235
+ // no `image_size` (OpenAI picks the pixel dimensions from the ratio, and a
1236
+ // `resolution` is silently ignored) and the narrower `..._AR_GPT` ratio set.
1237
+ "openai/gpt-image-2.5-sunburst": {
1238
+ // Identical to the gpt-image-2 entry below except for the quality ladder and `n`
1239
+ // (several images from one call) — the ratio set, the 16-reference ceiling, the missing `image_size` and the reasons
1240
+ // `background` / `output_compression` stay undeclared all carry over unchanged.
1241
+ label: "OpenAI GPT Image 2.5",
1242
+ route: OPENROUTER_ROUTE,
1243
+ billing: USAGE_BILLED,
1244
+ inputs: [],
1245
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GPT_IMAGE_MAX_REFERENCES }],
1246
+ required: ["prompt"],
1247
+ params: {
1248
+ prompt: { kind: "string", maxLength: GPT_IMAGE_PROMPT_MAX },
1249
+ aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_GPT },
1250
+ quality: { kind: "string", enum: OPENROUTER_IMAGE_QUALITY_25 },
1251
+ n: OPENROUTER_IMAGE_N
1252
+ }
1253
+ },
1254
+ "openai/gpt-image-2": {
1255
+ // Its live endpoint also advertises `background` (auto|opaque) and
1256
+ // `output_compression` (0-100), which we deliberately do not declare. Not an
1257
+ // oversight: a registry param is a promise the whole system keeps — the
1258
+ // canvas node schema, the dashboard control, the CLI flag and the cost model
1259
+ // all have to carry it — and neither knob changes what the picture IS.
1260
+ // Declaring them would widen four surfaces to expose a file-size dial.
1261
+ label: "OpenAI GPT Image 2",
1262
+ route: OPENROUTER_ROUTE,
1263
+ billing: USAGE_BILLED,
1264
+ inputs: [],
1265
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GPT_IMAGE_MAX_REFERENCES }],
1266
+ required: ["prompt"],
1267
+ params: {
1268
+ prompt: { kind: "string", maxLength: GPT_IMAGE_PROMPT_MAX },
1269
+ aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_GPT },
1270
+ quality: { kind: "string", enum: OPENROUTER_IMAGE_QUALITY }
1271
+ }
1272
+ },
1273
+ // The GA Nano Banana ids (2026-06-18). Same surface as the preview ids they replace
1274
+ // — read off GET /api/v1/images/models/google/gemini-3.1-flash-image/endpoints and
1275
+ // .../gemini-3-pro-image/endpoints — which is why those ids are plain aliases of
1276
+ // these (`MODEL_ALIASES`): a canvas moves between them unchanged.
1277
+ "google/gemini-3.1-flash-image": {
1278
+ label: "Google Gemini 3.1 Flash Image (Nano Banana 2)",
1279
+ route: OPENROUTER_ROUTE,
1280
+ billing: USAGE_BILLED,
1281
+ inputs: [],
1282
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GEMINI_IMAGE_MAX_REFERENCES }],
1283
+ required: ["prompt"],
1284
+ params: {
1285
+ prompt: { kind: "string" },
1286
+ aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_EXTREME },
1287
+ image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE_EXTENDED }
1288
+ }
1289
+ },
1290
+ "google/gemini-3-pro-image": {
1291
+ label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1292
+ route: OPENROUTER_ROUTE,
1293
+ billing: USAGE_BILLED,
1294
+ inputs: [],
1295
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GEMINI_IMAGE_MAX_REFERENCES }],
1296
+ required: ["prompt"],
1297
+ params: {
1298
+ prompt: { kind: "string" },
1299
+ aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR },
1300
+ image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE }
1301
+ // No `quality`: OpenRouter's per-endpoint schema lists it for gpt-image and for
1302
+ // NO Gemini image model, pro included. It is accepted-then-dropped, so declaring
1303
+ // it invites the scaffolder to emit a param that does nothing.
1304
+ }
1305
+ },
1306
+ "google/gemini-3.1-flash-lite-image": {
1307
+ // Nano Banana 2 Lite. Same Gemini image family as the flash tier — same
1308
+ // extreme aspect-ratio set, same reference editing — at HALF the output-token
1309
+ // price ($0.00003 vs $0.00006 per output image token), which makes it the
1310
+ // cheap-iteration tier for image work the way `veo-3.1-fast` is for video.
1311
+ //
1312
+ // The one thing it gives up is resolution: it renders 1K and nothing else.
1313
+ // That is a hard provider 400, not a soft clamp, so it is gated here rather
1314
+ // than discovered at dispatch. A 2K/4K hero frame belongs on the flash or pro
1315
+ // tier. Unlike gpt-image it keeps 4:5 and 5:4, so Meta/Instagram portrait
1316
+ // formats still come straight out of it.
1317
+ //
1318
+ // Reached through the normal OpenRouter image gateway (Google Vertex and
1319
+ // Google AI Studio both serve it) — no direct-provider exception needed.
1320
+ // Source: GET /api/v1/images/models/google/gemini-3.1-flash-lite-image/endpoints.
1321
+ label: "Google Gemini 3.1 Flash Lite Image",
1322
+ route: OPENROUTER_ROUTE,
1323
+ billing: USAGE_BILLED,
1324
+ inputs: [],
1325
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GEMINI_IMAGE_MAX_REFERENCES }],
1326
+ required: ["prompt"],
1327
+ params: {
1328
+ prompt: { kind: "string" },
1329
+ aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_EXTREME },
1330
+ image_size: { kind: "string", enum: GEMINI_LITE_IMAGE_SIZE }
1331
+ }
1332
+ },
1333
+ "recraft/recraft-v4.1-pro-vector": {
1334
+ // The vector/logo tier, and the odd one out of this roster in three ways.
1335
+ // All three are read off its live endpoint schema, and all three are the
1336
+ // kind of fact that only shows up as a billed 400 if it is guessed:
1337
+ // - it renders FIVE ratios (no 4:5 / 5:4 / 2:3 / 3:2 / 21:9), so portrait
1338
+ // ad shapes snap to 3:4 rather than being sent as-is;
1339
+ // - it has NO resolution knob (`supported_parameters` lists none), so
1340
+ // `image_size` is refused here instead of accepted and ignored;
1341
+ // - it takes exactly ONE reference image, against 14-16 everywhere else.
1342
+ // Its palette levers are real but arrive as provider passthrough
1343
+ // (`controls`), which is why they are `json` rather than typed enums; the
1344
+ // backend adapter builds that block in `buildImageGenBody`.
1345
+ label: "Recraft v4.1 Pro Vector",
1346
+ route: OPENROUTER_ROUTE,
1347
+ billing: USAGE_BILLED,
1348
+ inputs: [],
1349
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: RECRAFT_MAX_REFERENCES }],
1350
+ required: ["prompt"],
1351
+ params: {
1352
+ prompt: { kind: "string", maxLength: RECRAFT_PROMPT_MAX },
1353
+ aspect_ratio: { kind: "string", enum: RECRAFT_IMAGE_AR },
1354
+ strength: { kind: "number", min: 0, max: 1 },
1355
+ rgb_colors: { kind: "json" },
1356
+ background_rgb_color: { kind: "json" }
1357
+ }
1358
+ }
1359
+ },
1360
+ image_reference_sheet: {
1361
+ // Multi-view subject reference sheets (turnaround grids). The sheet prompt
1362
+ // is baked into the backend handler — params here are semantic levers
1363
+ // only. Both models consume MULTIPLE reference images via the `references`
1364
+ // input slot (required: a sheet without source images is just image_generate).
1365
+ "google/gemini-3-pro-image": {
1366
+ label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1367
+ route: OPENROUTER_ROUTE,
1368
+ billing: USAGE_BILLED,
1369
+ inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1370
+ required: ["subject_description", "subject_type"],
1371
+ params: {
1372
+ subject_description: { kind: "string" },
1373
+ subject_type: { kind: "string", enum: ["character", "person", "product", "location"] },
1374
+ views: { kind: "json" },
1375
+ style: { kind: "string" },
1376
+ prompt_override: { kind: "string" },
1377
+ aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR },
1378
+ image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE }
1379
+ }
1380
+ },
1381
+ "google/gemini-3.1-flash-image": {
1382
+ label: "Google Gemini 3.1 Flash Image (Nano Banana 2)",
1383
+ route: OPENROUTER_ROUTE,
1384
+ billing: USAGE_BILLED,
1385
+ inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1386
+ required: ["subject_description", "subject_type"],
1387
+ params: {
1388
+ subject_description: { kind: "string" },
1389
+ subject_type: { kind: "string", enum: ["character", "person", "product", "location"] },
1390
+ views: { kind: "json" },
1391
+ style: { kind: "string" },
1392
+ prompt_override: { kind: "string" },
1393
+ aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_EXTREME },
1394
+ image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE_EXTENDED }
1395
+ }
1396
+ }
1397
+ },
1398
+ image_aspect_adapt: {
1399
+ // Multi-format adaptation of one creative. The recomposition prompt is
1400
+ // baked into the backend handler. The target ratios come from EITHER an
1401
+ // explicit `formats` list OR a `platform` preset that expands to the
1402
+ // canonical set; exactly one of the two is required — that "one of" gate,
1403
+ // and per-element ratio validation, live in the node's Zod schema (the
1404
+ // registry can't express "one of" or gate array elements), so `formats`
1405
+ // is not listed as registry-required. The source creative is a required
1406
+ // input slot. `copy` (the exact lines the ad carries) and `safe_areas` (per
1407
+ // format, the fractions each edge's interface covers) are set by the static
1408
+ // scaffold so the reframe keeps every word, once, where the platform shows it.
1409
+ "google/gemini-3-pro-image": {
1410
+ label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1411
+ route: OPENROUTER_ROUTE,
1412
+ billing: USAGE_BILLED,
1413
+ inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1414
+ required: [],
1415
+ params: {
1416
+ formats: { kind: "json" },
1417
+ platform: { kind: "string", enum: AD_FORMAT_PLATFORMS },
1418
+ guidance: { kind: "string" },
1419
+ copy: { kind: "json" },
1420
+ safe_areas: { kind: "json" },
1421
+ image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE }
1422
+ }
1423
+ },
1424
+ "google/gemini-3.1-flash-image": {
1425
+ label: "Google Gemini 3.1 Flash Image (Nano Banana 2)",
1426
+ route: OPENROUTER_ROUTE,
1427
+ billing: USAGE_BILLED,
1428
+ inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1429
+ required: [],
1430
+ params: {
1431
+ formats: { kind: "json" },
1432
+ platform: { kind: "string", enum: AD_FORMAT_PLATFORMS },
1433
+ guidance: { kind: "string" },
1434
+ copy: { kind: "json" },
1435
+ safe_areas: { kind: "json" },
1436
+ image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE_EXTENDED }
1437
+ }
1438
+ }
1439
+ },
1440
+ video_generate: {
1441
+ "bytedance/seedance-2.0": {
1442
+ // Routed via Replicate's official `bytedance/seedance-2.0` model. NOTE:
1443
+ // ByteDance's upstream likeness filter blocks photoreal human faces on ANY
1444
+ // reseller, and it does NOT care whether the person is real: it classifies
1445
+ // pixels, so an AI-generated face that looks photographic is refused
1446
+ // exactly like a photograph (E005 / content_policy_blocked). Confirmed in
1447
+ // production against faces we generated ourselves. The only escape is Veo
1448
+ // — NOT a synthetic presenter, which an earlier version of this note
1449
+ // wrongly recommended and which sends you round the same loop.
1450
+ label: "ByteDance Seedance 2.0",
1451
+ route: { provider: "replicate" },
1452
+ billing: { kind: "formula", formula: "seedance-2.0" },
1453
+ inputs: [],
1454
+ optional_inputs: [{ kind: "image", mimes: REPLICATE_IMAGE_MIMES, max: SEEDANCE_MAX_REFERENCES }],
1455
+ required: ["prompt"],
1456
+ params: {
1457
+ // Replicate's Seedance wrapper hard-caps the prompt at 4000 chars; gate
1458
+ // it here so an over-length prompt fails validate (free) not the billed call.
1459
+ prompt: { kind: "string", maxLength: SEEDANCE_PROMPT_MAX },
1460
+ aspect_ratio: {
1461
+ kind: "string",
1462
+ enum: ["1:1", "3:4", "9:16", "4:3", "16:9", "21:9", "9:21"]
1463
+ },
1464
+ resolution: { kind: "string", enum: ["480p", "720p", "1080p", "4k"] },
1465
+ duration: { kind: "number", enum: SEEDANCE_DURATIONS },
1466
+ // Replicate types this `integer`, and a fractional seed is a schema
1467
+ // rejection rather than a rounded one. No range is advertised, so none is
1468
+ // invented — see `InputSpec.max` on why absent must stay ungated.
1469
+ seed: { kind: "number", integer: true },
1470
+ generate_audio: { kind: "boolean" }
1471
+ }
1472
+ },
1473
+ "bytedance/seedance-2.5": {
1474
+ // Seedance 2.5 — the LONG-FORM, MULTIMODAL tier, and the only curated video
1475
+ // model reached through OpenRouter that is not frame-only.
1476
+ //
1477
+ // Routed through OpenRouter's video gateway (provider `seed`), NOT through
1478
+ // Replicate like 2.0 — the gateway carries the multimodal reference surface
1479
+ // 2.5 exists for, and Replicate's 2.0 wrapper only has `reference_images`.
1480
+ // The backend branches on the exact 2.0 id for the Replicate path, so this
1481
+ // model must never be folded into a `startsWith("bytedance/seedance")`
1482
+ // routing test: that is one character away from sending 2.5 to a wrapper
1483
+ // that cannot express half of what it is being asked to do.
1484
+ //
1485
+ // Same upstream likeness filter as 2.0 — ByteDance classifies PIXELS, so an
1486
+ // AI-generated face that reads photographic is refused exactly like a
1487
+ // photograph (content_policy_blocked). A reference-guided clip refused that
1488
+ // way is re-rendered on fal, which serves the same model under a licence that
1489
+ // takes faces; a frame-started one is reported, never moved to another model.
1490
+ //
1491
+ // No published prompt cap on this route, so none is invented: OpenRouter's
1492
+ // request schema declares no `maxLength` and the model is sold on long,
1493
+ // multi-shot briefs. A ceiling we made up would refuse the exact prompts
1494
+ // this tier exists to render.
1495
+ label: "ByteDance Seedance 2.5",
1496
+ route: OPENROUTER_ROUTE,
1497
+ billing: { kind: "formula", formula: "seedance-2.5" },
1498
+ recoveryRoute: SEEDANCE_FACE_RECOVERY_ROUTE,
1499
+ inputs: [],
1500
+ optional_inputs: [
1501
+ { kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: SEEDANCE_25_MAX_IMAGE_REFERENCES },
1502
+ { kind: "video", mimes: OPENROUTER_VIDEO_REFERENCE_MIMES, max: SEEDANCE_25_MAX_VIDEO_REFERENCES },
1503
+ { kind: "audio", mimes: OPENROUTER_AUDIO_REFERENCE_MIMES, max: SEEDANCE_25_MAX_AUDIO_REFERENCES }
1504
+ ],
1505
+ required: ["prompt"],
1506
+ params: {
1507
+ prompt: { kind: "string" },
1508
+ aspect_ratio: { kind: "string", enum: SEEDANCE_25_ASPECT_RATIOS },
1509
+ resolution: { kind: "string", enum: SEEDANCE_25_RESOLUTIONS },
1510
+ duration: { kind: "number", enum: SEEDANCE_25_DURATIONS },
1511
+ seed: { kind: "number", integer: true, min: 0, max: UINT32_MAX },
1512
+ generate_audio: { kind: "boolean" },
1513
+ // A visible AI watermark on an ad creative is a defect, and this is the
1514
+ // only curated model that lets us turn one off: `watermark` is named in
1515
+ // the model's own `allowed_passthrough_parameters`, so it rides as a
1516
+ // top-level body field exactly like Kling's `cfg_scale` does.
1517
+ watermark: { kind: "boolean" }
1518
+ }
1519
+ },
1520
+ "google/gemini-omni-1.1-flash": {
1521
+ // Google Gemini Omni 1.1 Flash — the DEFAULT video model. Natively
1522
+ // multimodal: it reasons over text + images and renders video WITH
1523
+ // synchronized audio in one call, and it is the only curated model that
1524
+ // takes reference images through its own first-party API (task
1525
+ // `reference_to_video`).
1526
+ //
1527
+ // It is a SEPARATE entry from `google/gemini-omni-flash` (the preview),
1528
+ // not a rolling upgrade of it, because the two do not render the same
1529
+ // things: 1.1 takes a `resolution` and the preview does not, and 1.1 bills
1530
+ // the seconds it renders where the preview bills its whole 10s window. One
1531
+ // shared key would have to promise the union of those, which means a canvas
1532
+ // could ask the preview for 360p and be quoted a third of what it charges.
1533
+ //
1534
+ // NOT on OpenRouter. `GET /api/v1/videos/models` lists 17 video models and
1535
+ // no Gemini Omni at either version, so this is the sanctioned direct-provider
1536
+ // exception (see `convex/lib/geminiOmni.ts`): Google's Interactions API,
1537
+ // `POST /v1beta/interactions`. Its own `generateContent` endpoint refuses it
1538
+ // ("This model only supports Interactions API"), so the Veo `predictLongRunning`
1539
+ // shape does not apply either.
1540
+ //
1541
+ // The param set below is deliberately short and was read off the live API,
1542
+ // not off the docs — the knobs absent here are rejected with a pre-dispatch
1543
+ // 400 (`Unknown parameter '<name>'`): no `seed`, no `negative_prompt`, no
1544
+ // `generate_audio`, no `person_generation` / `enhance_prompt` /
1545
+ // `conditioning_scale`. Audio is always on and cannot be turned off.
1546
+ // Widening this list does not widen the model; it just moves a free
1547
+ // validation error into a billed one.
1548
+ //
1549
+ // `duration` is the odd one out: Omni has no duration FIELD at any nesting
1550
+ // level, but it honours a length named in the prompt (3-10s), so the adapter
1551
+ // turns this param into a prompt directive. It is a real, billable knob.
1552
+ //
1553
+ // NO VIDEO INPUT SLOT, and that is a gate on our project rather than a gap
1554
+ // in the model or a mistake in how we ask. 1.1 advertises video references,
1555
+ // `edit` and `extend`, and every request carrying a video comes back 400
1556
+ // `content_blocked`.
1557
+ //
1558
+ // The controlled version, run through the shape Google's own docs use
1559
+ // (`{"type":"document","uri":<Files API uri>}`, no generation_config),
1560
+ // changing only the uploaded file: an IMAGE returns 200 and renders a clip;
1561
+ // a VIDEO returns `content_blocked`. Same route, same structure. So the
1562
+ // request shape is right and video input specifically is refused. Also
1563
+ // measured across inline base64, all three tasks, video AND text output,
1564
+ // synthetic clips, Omni's own output, real camera footage, and both our
1565
+ // keys. Full probe log: `.context/omni-1.1-measurements.md`.
1566
+ //
1567
+ // Adding `{ kind: "video", mimes: … }` below is the ONE line that turns the
1568
+ // whole feature on — the "Build on" control, the reference picker taking an
1569
+ // MP4, the drop target and the source-clip cost premium are all driven off
1570
+ // this slot. Add it the day the 400 stops, not before: until then it offers
1571
+ // a control whose every use is refused.
1572
+ label: "Google Gemini Omni 1.1 Flash",
1573
+ route: { provider: "google-interactions", wireModel: "gemini-omni-1.1-flash" },
1574
+ billing: { kind: "formula", formula: "gemini-omni" },
1575
+ inputs: [],
1576
+ optional_inputs: [{ kind: "image", mimes: GEMINI_OMNI_IMAGE_MIMES }],
1577
+ required: ["prompt"],
1578
+ params: {
1579
+ prompt: { kind: "string" },
1580
+ aspect_ratio: { kind: "string", enum: GEMINI_OMNI_ASPECT_RATIOS },
1581
+ resolution: { kind: "string", enum: GEMINI_OMNI_RESOLUTIONS },
1582
+ duration: { kind: "number", enum: GEMINI_OMNI_DURATIONS }
1583
+ }
1584
+ },
1585
+ "google/gemini-omni-flash": {
1586
+ // LEGACY — the Omni PREVIEW (`gemini-omni-flash-preview`), superseded by
1587
+ // `google/gemini-omni-1.1-flash` above. Kept so canvases authored before 1.1
1588
+ // still validate and re-run unchanged (`baker canvas run --slug` restores a
1589
+ // recorded canvas verbatim, so dropping this model would break every stored
1590
+ // creative that used it). Don't reach for it in new work.
1591
+ //
1592
+ // Its param surface is the ORIGINAL one on purpose, and the omission that
1593
+ // matters is `resolution`. This model renders 720p / 24fps and nothing else.
1594
+ //
1595
+ // It does NOT reject the field, which is the trap and the reason this is
1596
+ // enforced here rather than left to the provider: asked for `360p` it
1597
+ // returns HTTP 200, a 1280x720 clip, and a bill of 17,376 video tokens —
1598
+ // the 720p rate, three times the 5,793 that tier costs on 1.1. Accepted,
1599
+ // ignored, and charged for. Copying 1.1's enum across to make the two
1600
+ // entries match would hand a canvas a quality dial that does nothing and a
1601
+ // quote a third of the real charge.
1602
+ label: "Google Gemini Omni Flash (legacy preview)",
1603
+ route: { provider: "google-interactions", wireModel: "gemini-omni-flash-preview" },
1604
+ billing: { kind: "formula", formula: "gemini-omni" },
1605
+ inputs: [],
1606
+ optional_inputs: [{ kind: "image", mimes: GEMINI_OMNI_IMAGE_MIMES }],
1607
+ required: ["prompt"],
1608
+ params: {
1609
+ prompt: { kind: "string" },
1610
+ aspect_ratio: { kind: "string", enum: GEMINI_OMNI_ASPECT_RATIOS },
1611
+ duration: { kind: "number", enum: GEMINI_OMNI_DURATIONS }
1612
+ }
1613
+ },
1614
+ "google/veo-3.1": {
1615
+ // Photoreal CINE CEILING + the real-face fallback (Veo generates adult
1616
+ // humans from a keyframe, dodging ByteDance's real-person filter). Same
1617
+ // OpenRouter google-vertex routing as the fast tier; the quality dial is
1618
+ // `resolution: 1080p` + `generate_audio` + a real `negative_prompt`, not a
1619
+ // separate provider knob. Reach for this for hero beats and any clip that
1620
+ // must carry a real human likeness.
1621
+ label: "Google Veo 3.1",
1622
+ route: OPENROUTER_ROUTE,
1623
+ billing: {
1624
+ kind: "per_second",
1625
+ // Veo prices 4K far above the base tier, and 4K is a selectable resolution,
1626
+ // so folding it into the base rate under-quotes the dearest clip we can make.
1627
+ // A QUOTE only: the charge is the usage OpenRouter reports for the call.
1628
+ usd: { silent: 0.2, audio: 0.4, byResolution: { "4K": { silent: 0.4, audio: 0.6 } } }
1629
+ },
1630
+ inputs: [],
1631
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1632
+ required: ["prompt"],
1633
+ params: {
1634
+ prompt: { kind: "string" },
1635
+ negative_prompt: { kind: "string" },
1636
+ aspect_ratio: { kind: "string", enum: ["16:9", "9:16"] },
1637
+ resolution: { kind: "string", enum: ["720p", "1080p", "4K"] },
1638
+ duration: { kind: "number", enum: [4, 6, 8] },
1639
+ // Vertex declares `seed` a uint32: "accepted range 0-4294967295".
1640
+ seed: { kind: "number", integer: true, min: 0, max: VEO_SEED_MAX },
1641
+ generate_audio: { kind: "boolean" },
1642
+ person_generation: { kind: "string", enum: ["allow_all", "allow_adult"] },
1643
+ enhance_prompt: { kind: "boolean" },
1644
+ conditioning_scale: { kind: "number" }
1645
+ }
1646
+ },
1647
+ "kwaivgi/kling-v3.0-pro": {
1648
+ // Motion-transfer / dynamic multi-shot beats. Reachable through the default
1649
+ // OpenRouter gateway (generic video body — no google-vertex block), so it
1650
+ // needs no direct-provider exception. `cfg_scale` trades prompt adherence
1651
+ // vs motion freedom; higher = closer to prompt.
1652
+ //
1653
+ // Params below are the ones OpenRouter actually advertises for this model
1654
+ // (GET /api/v1/videos/models). Three were wrong before and each was a free
1655
+ // 400 or a silently unsupported knob: it renders 720p ONLY (1080p was
1656
+ // offered and rejected), it takes ANY duration from 3-15s (we allowed just
1657
+ // 5 and 10), and it does not support `seed` at all.
1658
+ label: "Kling 3.0",
1659
+ route: OPENROUTER_ROUTE,
1660
+ billing: {
1661
+ kind: "per_second",
1662
+ // One flat rate across every resolution and mode.
1663
+ usd: { silent: 0.112, audio: 0.168 }
1664
+ },
1665
+ inputs: [],
1666
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1667
+ required: ["prompt"],
1668
+ params: {
1669
+ // Kling caps the prompt shorter than Seedance; gate it here so an
1670
+ // over-length prompt fails validate (free) not the billed call. Its
1671
+ // negative prompt is a SEPARATE 2,500 budget, not a shared one.
1672
+ prompt: { kind: "string", maxLength: KLING_PROMPT_MAX },
1673
+ negative_prompt: { kind: "string", maxLength: KLING_PROMPT_MAX },
1674
+ aspect_ratio: { kind: "string", enum: ["16:9", "9:16", "1:1"] },
1675
+ resolution: { kind: "string", enum: ["720p"] },
1676
+ duration: { kind: "number", enum: KLING_DURATIONS },
1677
+ generate_audio: { kind: "boolean" },
1678
+ cfg_scale: { kind: "number", min: 0, max: 1 }
1679
+ }
1680
+ },
1681
+ "x-ai/grok-imagine-video": {
1682
+ // The avatar workhorse. Measured best of the reference-capable models on
1683
+ // identity retention AND aspect-ratio obedience, at the lowest rate of any
1684
+ // video model we carry ($0.05/s at 480p). No audio at all — `generate_audio`
1685
+ // is absent from its OpenRouter listing, so a talking head goes to Wan 2.7.
1686
+ // NOTE: `x-ai/grok-imagine-video-1.5` is NOT a drop-in upgrade — it is
1687
+ // described as plain image-to-video and drops the reference conditioning
1688
+ // this entry exists for.
1689
+ label: "Grok Imagine Video",
1690
+ route: OPENROUTER_ROUTE,
1691
+ billing: {
1692
+ kind: "per_second",
1693
+ usd: {
1694
+ silent: 0.07,
1695
+ audio: 0.07,
1696
+ byResolution: { "480p": { silent: 0.05, audio: 0.05 }, "720p": { silent: 0.07, audio: 0.07 } }
1697
+ }
1698
+ },
1699
+ inputs: [],
1700
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1701
+ required: ["prompt"],
1702
+ params: {
1703
+ prompt: { kind: "string" },
1704
+ aspect_ratio: { kind: "string", enum: ["16:9", "9:16", "1:1", "4:3", "3:4", "3:2", "2:3"] },
1705
+ resolution: { kind: "string", enum: ["480p", "720p"] },
1706
+ duration: { kind: "number", enum: GROK_IMAGINE_DURATIONS }
1707
+ }
1708
+ },
1709
+ "alibaba/wan-2.7": {
1710
+ // Reference-to-video AND native audio — the only model we carry with both,
1711
+ // which makes it the landscape talking-head option.
1712
+ //
1713
+ // LANDSCAPE ONLY, measured. It advertises 9:16, 1:1, 4:3 and 3:4, and
1714
+ // delivers 16:9 regardless: asked for vertical via `aspect_ratio: "9:16"`
1715
+ // it returned 1280x720, and asked again via an explicit
1716
+ // `size: "720x1280"` from its own `supported_sizes` it returned 1280x720
1717
+ // again. The enum below is therefore what it DOES, not what it claims, so
1718
+ // nobody pays for a vertical clip that comes back landscape. For a vertical
1719
+ // avatar clip use `x-ai/grok-imagine-video` (silent) or animate a generated
1720
+ // still with `google/veo-3.1-lite` (native audio, honours 9:16).
1721
+ label: "Alibaba Wan 2.7",
1722
+ route: OPENROUTER_ROUTE,
1723
+ billing: {
1724
+ kind: "per_second",
1725
+ // Flat $0.10/s across resolutions and modes, audio included.
1726
+ usd: { silent: 0.1, audio: 0.1 },
1727
+ minBilledSeconds: MIN_BILLED_SECONDS
1728
+ },
1729
+ inputs: [],
1730
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1731
+ required: ["prompt"],
1732
+ params: {
1733
+ prompt: { kind: "string" },
1734
+ negative_prompt: { kind: "string" },
1735
+ aspect_ratio: { kind: "string", enum: ["16:9"] },
1736
+ resolution: { kind: "string", enum: ["720p", "1080p"] },
1737
+ duration: { kind: "number", enum: WAN_27_DURATIONS },
1738
+ seed: { kind: "number" },
1739
+ generate_audio: { kind: "boolean" }
1740
+ }
1741
+ },
1742
+ "x-ai/grok-imagine-video-1.5": {
1743
+ // NOT a replacement for the entry above, and deliberately absent from
1744
+ // `AVATAR_VIDEO_MODELS` and `REFERENCE_TO_VIDEO_MODELS`: OpenRouter describes the
1745
+ // older Grok as "text-, image-, and reference-conditioned" and 1.5 as taking "an
1746
+ // optional starting image". Reference conditioning is the whole reason Grok carries
1747
+ // avatars — it is what holds a face from the identity sheet — so swapping them
1748
+ // would quietly cost every avatar clip its likeness.
1749
+ //
1750
+ // What it adds over the older one: 1080p, and 15s rather than 10.
1751
+ label: "Grok Imagine Video 1.5",
1752
+ route: OPENROUTER_ROUTE,
1753
+ billing: {
1754
+ kind: "per_second",
1755
+ // `cents_per_video_output_second_*`: 8c, 14c and 25c. No audio, so both
1756
+ // columns are the same rate rather than one being wrong.
1757
+ usd: {
1758
+ silent: 0.14,
1759
+ audio: 0.14,
1760
+ byResolution: {
1761
+ "480p": { silent: 0.08, audio: 0.08 },
1762
+ "720p": { silent: 0.14, audio: 0.14 },
1763
+ "1080p": { silent: 0.25, audio: 0.25 }
1764
+ }
1765
+ }
1766
+ },
1767
+ inputs: [],
1768
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1769
+ required: ["prompt"],
1770
+ params: {
1771
+ prompt: { kind: "string" },
1772
+ aspect_ratio: { kind: "string", enum: ["16:9", "9:16", "1:1", "4:3", "3:4", "3:2", "2:3"] },
1773
+ resolution: { kind: "string", enum: ["480p", "720p", "1080p"] },
1774
+ duration: { kind: "number", enum: GROK_IMAGINE_15_DURATIONS }
1775
+ }
1776
+ },
1777
+ "alibaba/wan-3.0": {
1778
+ // 2.7's successor on every axis that matters: 2–30s against 2–10, 1080p and 480p
1779
+ // as well as 720p, and it keeps the native audio that made 2.7 the landscape
1780
+ // talking-head option.
1781
+ //
1782
+ // The ratios are what it ADVERTISES. 2.7 advertised five and delivered 16:9 for
1783
+ // all of them — measured, twice, which is why its enum here is a single value. That
1784
+ // was a different model and this one is not gated on its predecessor's lie, but
1785
+ // the first vertical clip anyone renders here is worth looking at before a campaign
1786
+ // is built on it.
1787
+ //
1788
+ // No `last_frame`: 2.7 takes one and 3.0 does not, so a canvas that ends a shot on
1789
+ // a chosen frame stays on 2.7.
1790
+ label: "Alibaba Wan 3.0",
1791
+ route: OPENROUTER_ROUTE,
1792
+ billing: {
1793
+ kind: "per_second",
1794
+ // Priced per resolution where 2.7 was flat, and the rate still includes
1795
+ // audio: there is no separate audio SKU. `duration_seconds_480p|720p|1080p`.
1796
+ usd: {
1797
+ silent: 0.1,
1798
+ audio: 0.1,
1799
+ byResolution: {
1800
+ "480p": { silent: 0.05, audio: 0.05 },
1801
+ "720p": { silent: 0.1, audio: 0.1 },
1802
+ "1080p": { silent: 0.2, audio: 0.2 }
1803
+ }
1804
+ }
1805
+ },
1806
+ inputs: [],
1807
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1808
+ required: ["prompt"],
1809
+ params: {
1810
+ prompt: { kind: "string" },
1811
+ aspect_ratio: { kind: "string", enum: ["16:9", "9:16", "1:1", "4:3", "3:4"] },
1812
+ resolution: { kind: "string", enum: ["480p", "720p", "1080p"] },
1813
+ duration: { kind: "number", enum: WAN_30_DURATIONS },
1814
+ seed: { kind: "number" },
1815
+ generate_audio: { kind: "boolean" }
1816
+ }
1817
+ },
1818
+ "runway/gen-4.5": {
1819
+ // One resolution, two shapes, and silent — `generate_audio: false` in its listing,
1820
+ // so a talking head belongs on Wan or Omni. First frame only, no reference.
1821
+ label: "Runway Gen-4.5",
1822
+ route: OPENROUTER_ROUTE,
1823
+ billing: {
1824
+ kind: "per_second",
1825
+ // One flat rate, one resolution: `cents_per_second_output: 12`. Silent.
1826
+ usd: { silent: 0.12, audio: 0.12 }
1827
+ },
1828
+ inputs: [],
1829
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1830
+ required: ["prompt"],
1831
+ params: {
1832
+ prompt: { kind: "string" },
1833
+ aspect_ratio: { kind: "string", enum: ["16:9", "9:16"] },
1834
+ resolution: { kind: "string", enum: ["720p"] },
1835
+ duration: { kind: "number", enum: RUNWAY_45_DURATIONS },
1836
+ seed: { kind: "number" }
1837
+ }
1838
+ },
1839
+ "alibaba/happyhorse-1.1": {
1840
+ // Third reference-capable option: strong identity, correct ratios, no audio.
1841
+ // First-frame only (no `last_frame`), so it cannot close a beat on a
1842
+ // specified end pose the way Wan and Veo can.
1843
+ label: "Alibaba HappyHorse 1.1",
1844
+ route: OPENROUTER_ROUTE,
1845
+ billing: {
1846
+ kind: "per_second",
1847
+ usd: { silent: 0.1278, audio: 0.1278, byResolution: { "720p": { silent: 0.0988, audio: 0.0988 } } },
1848
+ minBilledSeconds: MIN_BILLED_SECONDS
1849
+ },
1850
+ inputs: [],
1851
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1852
+ required: ["prompt"],
1853
+ params: {
1854
+ prompt: { kind: "string" },
1855
+ aspect_ratio: { kind: "string", enum: ["16:9", "9:16", "1:1", "4:3", "3:4", "21:9", "9:21"] },
1856
+ resolution: { kind: "string", enum: ["720p", "1080p"] },
1857
+ duration: { kind: "number", enum: HAPPYHORSE_DURATIONS },
1858
+ seed: { kind: "number" }
1859
+ }
1860
+ },
1861
+ "google/veo-3.1-lite": {
1862
+ // The cheapest way to animate a still that carries a real face: same Veo
1863
+ // family and the same escape from ByteDance's filter, at $0.05/s with audio
1864
+ // at 720p against Veo 3.1's $0.40. That 8x is the difference between an
1865
+ // avatar clip you iterate on and one you think twice about.
1866
+ label: "Google Veo 3.1 Lite",
1867
+ route: OPENROUTER_ROUTE,
1868
+ billing: {
1869
+ kind: "per_second",
1870
+ usd: { silent: 0.05, audio: 0.08, byResolution: { "720p": { silent: 0.03, audio: 0.05 } } }
1871
+ },
1872
+ inputs: [],
1873
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1874
+ required: ["prompt"],
1875
+ params: {
1876
+ prompt: { kind: "string" },
1877
+ negative_prompt: { kind: "string" },
1878
+ aspect_ratio: { kind: "string", enum: ["16:9", "9:16"] },
1879
+ resolution: { kind: "string", enum: ["720p", "1080p"] },
1880
+ duration: { kind: "number", enum: [4, 6, 8] },
1881
+ seed: { kind: "number" },
1882
+ generate_audio: { kind: "boolean" },
1883
+ person_generation: { kind: "string", enum: ["allow_all", "allow_adult"] },
1884
+ enhance_prompt: { kind: "boolean" },
1885
+ conditioning_scale: { kind: "number" }
1886
+ }
1887
+ },
1888
+ "google/veo-3.1-fast": {
1889
+ // Cheap test/iteration model. Forwarded by the backend via
1890
+ // `provider.options.google-vertex.parameters` (camelCased on the wire).
1891
+ label: "Google Veo 3.1 Fast",
1892
+ route: OPENROUTER_ROUTE,
1893
+ billing: {
1894
+ kind: "per_second",
1895
+ usd: {
1896
+ silent: 0.1,
1897
+ audio: 0.12,
1898
+ byResolution: { "720p": { silent: 0.08, audio: 0.1 }, "4K": { silent: 0.25, audio: 0.3 } }
1899
+ }
1900
+ },
1901
+ inputs: [],
1902
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1903
+ required: ["prompt"],
1904
+ params: {
1905
+ prompt: { kind: "string" },
1906
+ negative_prompt: { kind: "string" },
1907
+ aspect_ratio: { kind: "string", enum: ["16:9", "9:16"] },
1908
+ resolution: { kind: "string", enum: ["720p", "1080p", "4K"] },
1909
+ duration: { kind: "number", enum: [4, 6, 8] },
1910
+ seed: { kind: "number", integer: true, min: 0, max: VEO_SEED_MAX },
1911
+ generate_audio: { kind: "boolean" },
1912
+ // Image-to-video and EU/UK/CH/MENA regions cap this at `allow_adult`;
1913
+ // `allow_all` is text-to-video only. Allow both so an image-conditioned
1914
+ // Veo clip (the real-face fallback) validates.
1915
+ person_generation: { kind: "string", enum: ["allow_all", "allow_adult"] },
1916
+ enhance_prompt: { kind: "boolean" },
1917
+ conditioning_scale: { kind: "number" }
1918
+ }
1919
+ }
1920
+ },
1921
+ video_deconstruct: {
1922
+ // Replication-grade video extraction — the forensic system prompts live on
1923
+ // the backend; `focus` appends emphasis only. Frames ride on a throwaway
1924
+ // Mux asset; analysis runs on Gemini with the video as a file part.
1925
+ "~google/gemini-flash-latest": {
1926
+ label: "Google Gemini Flash (latest, Video)",
1927
+ route: OPENROUTER_ROUTE,
1928
+ billing: USAGE_BILLED,
1929
+ inputs: [{ kind: "video", mimes: DECONSTRUCT_VIDEO_MIMES }],
1930
+ required: [],
1931
+ params: {
1932
+ mode: { kind: "string", enum: ["full", "index"] },
1933
+ language: { kind: "string" },
1934
+ max_scenes: { kind: "number", min: 1, max: 60 },
1935
+ focus: { kind: "string" },
1936
+ start_s: { kind: "number", min: 0 },
1937
+ end_s: { kind: "number", min: 0 },
1938
+ max_clip_s: { kind: "number", min: 1, max: 60 },
1939
+ transcriber: { kind: "string", enum: ["groq", "deepgram"] },
1940
+ // Real visual shot-cut timestamps (seconds) from local PySceneDetect;
1941
+ // scene boundaries snap onto them so frames never straddle a hard cut.
1942
+ // Shape (number[]) is enforced by the node + backend Zod schemas.
1943
+ shot_cuts: { kind: "json" }
1944
+ }
1945
+ },
1946
+ "~google/gemini-pro-latest": {
1947
+ label: "Google Gemini Pro (latest, Video)",
1948
+ route: OPENROUTER_ROUTE,
1949
+ billing: USAGE_BILLED,
1950
+ inputs: [{ kind: "video", mimes: DECONSTRUCT_VIDEO_MIMES }],
1951
+ required: [],
1952
+ params: {
1953
+ mode: { kind: "string", enum: ["full", "index"] },
1954
+ language: { kind: "string" },
1955
+ max_scenes: { kind: "number", min: 1, max: 60 },
1956
+ focus: { kind: "string" },
1957
+ start_s: { kind: "number", min: 0 },
1958
+ end_s: { kind: "number", min: 0 },
1959
+ max_clip_s: { kind: "number", min: 1, max: 60 },
1960
+ transcriber: { kind: "string", enum: ["groq", "deepgram"] },
1961
+ // See gemini-flash-latest above — local PySceneDetect shot-cut timestamps.
1962
+ shot_cuts: { kind: "json" }
1963
+ }
1964
+ }
1965
+ },
1966
+ video_lipsync: {
1967
+ // Formerly `fal/veed-lipsync`, which named a provider and a model it had stopped
1968
+ // running on; that id stays accepted through `MODEL_ALIASES`.
1969
+ "replicate/sync-lipsync-2": {
1970
+ label: "Sync Labs Lipsync 2 (Replicate)",
1971
+ route: { provider: "replicate", wireModel: "sync/lipsync-2" },
1972
+ billing: { kind: "formula", formula: "lipsync-minutes" },
1973
+ inputs: [
1974
+ { kind: "video", mimes: REPLICATE_VIDEO_MIMES },
1975
+ { kind: "audio", mimes: REPLICATE_AUDIO_MIMES }
1976
+ ],
1977
+ required: [],
1978
+ params: {}
1979
+ }
1980
+ },
1981
+ tts: {
1982
+ "elevenlabs/eleven_v3": {
1983
+ // eleven_v3 does NOT yet support context stitching
1984
+ // (previous_text/next_text/*_request_ids). ElevenLabs returns a clean
1985
+ // `unsupported_model` 400 if you pass them.
1986
+ label: "ElevenLabs Eleven v3",
1987
+ route: { provider: "elevenlabs", wireModel: "eleven_v3" },
1988
+ billing: { kind: "formula", formula: "elevenlabs-characters" },
1989
+ inputs: [],
1990
+ required: ["text", "voice"],
1991
+ params: {
1992
+ text: { kind: "string", maxLength: ELEVENLABS_MAX_TEXT_CHARS },
1993
+ voice: { kind: "string" },
1994
+ language_code: { kind: "string" },
1995
+ stability: { kind: "number", min: 0, max: 1 },
1996
+ similarity_boost: { kind: "number", min: 0, max: 1 },
1997
+ voice_settings: { kind: "json" },
1998
+ seed: { kind: "number", min: 0, max: 4294967295 },
1999
+ pronunciation_dictionary_locators: { kind: "json" },
2000
+ apply_text_normalization: { kind: "string", enum: ["auto", "on", "off"] },
2001
+ apply_language_text_normalization: { kind: "boolean" },
2002
+ with_timestamps: { kind: "boolean" },
2003
+ output_format: { kind: "string", enum: ELEVENLABS_OUTPUT_FORMATS }
2004
+ }
2005
+ }
2006
+ },
2007
+ audio_voice_convert: {
2008
+ "elevenlabs/eleven_multilingual_sts_v2": {
2009
+ // Speech-to-speech / Voice Changer: re-voice an existing audio clip in the
2010
+ // TARGET voice, preserving timing/prosody. Used to normalize a talking-head
2011
+ // clip's native (generator-chosen) voice into ONE consistent brand voice.
2012
+ label: "ElevenLabs Voice Changer (multilingual STS v2)",
2013
+ route: { provider: "elevenlabs", wireModel: "eleven_multilingual_sts_v2" },
2014
+ billing: { kind: "formula", formula: "elevenlabs-voice-convert-minutes" },
2015
+ inputs: [{ kind: "audio", mimes: REPLICATE_AUDIO_MIMES }],
2016
+ required: ["voice"],
2017
+ params: {
2018
+ voice: { kind: "string" },
2019
+ output_format: { kind: "string", enum: ELEVENLABS_OUTPUT_FORMATS },
2020
+ remove_background_noise: { kind: "boolean" }
2021
+ }
2022
+ }
2023
+ },
2024
+ music: {
2025
+ "elevenlabs/music-v1": {
2026
+ label: "ElevenLabs Music v1 (Compose)",
2027
+ route: { provider: "elevenlabs", wireModel: ELEVENLABS_MUSIC_ENGINE },
2028
+ billing: { kind: "formula", formula: "elevenlabs-music-seconds" },
2029
+ inputs: [],
2030
+ required: [],
2031
+ params: {
2032
+ prompt: { kind: "string" },
2033
+ composition_plan: { kind: "json" },
2034
+ music_length_ms: { kind: "number", min: 3e3, max: ELEVENLABS_MAX_MUSIC_LENGTH_MS },
2035
+ seed: { kind: "number" },
2036
+ force_instrumental: { kind: "boolean" },
2037
+ respect_sections_durations: { kind: "boolean" },
2038
+ with_timestamps: { kind: "boolean" },
2039
+ output_format: { kind: "string", enum: ELEVENLABS_OUTPUT_FORMATS }
2040
+ }
2041
+ },
2042
+ "elevenlabs/video-background-music-v1": {
2043
+ label: "ElevenLabs Video Background Music v1",
2044
+ route: { provider: "elevenlabs", wireModel: ELEVENLABS_MUSIC_ENGINE },
2045
+ billing: { kind: "formula", formula: "elevenlabs-music-seconds" },
2046
+ inputs: [{ kind: "video", mimes: REPLICATE_VIDEO_MIMES }],
2047
+ required: [],
2048
+ params: {
2049
+ description: { kind: "string" },
2050
+ tags: { kind: "json" },
2051
+ output_format: { kind: "string", enum: ELEVENLABS_OUTPUT_FORMATS }
2052
+ }
2053
+ }
2054
+ },
2055
+ dialogue: {
2056
+ "elevenlabs/eleven_v3": {
2057
+ label: "ElevenLabs Eleven v3 (Dialogue)",
2058
+ route: { provider: "elevenlabs", wireModel: "eleven_v3" },
2059
+ billing: { kind: "formula", formula: "elevenlabs-characters" },
2060
+ inputs: [],
2061
+ required: ["inputs"],
2062
+ params: {
2063
+ inputs: { kind: "json" },
2064
+ language_code: { kind: "string" },
2065
+ settings: { kind: "json" },
2066
+ seed: { kind: "number", min: 0, max: 4294967295 },
2067
+ apply_text_normalization: { kind: "string", enum: ["auto", "on", "off"] },
2068
+ with_timestamps: { kind: "boolean" },
2069
+ output_format: { kind: "string", enum: ELEVENLABS_OUTPUT_FORMATS }
2070
+ }
2071
+ }
2072
+ },
2073
+ sound_effect: {
2074
+ "elevenlabs/eleven_text_to_sound_v2": {
2075
+ label: "ElevenLabs Text-to-Sound v2",
2076
+ route: { provider: "elevenlabs", wireModel: "eleven_text_to_sound_v2" },
2077
+ billing: { kind: "formula", formula: "elevenlabs-sound-effect-seconds" },
2078
+ inputs: [],
2079
+ required: ["text"],
2080
+ params: {
2081
+ text: { kind: "string" },
2082
+ duration_seconds: { kind: "number", min: 0.5, max: 30 },
2083
+ prompt_influence: { kind: "number", min: 0, max: 1 },
2084
+ loop: { kind: "boolean" },
2085
+ output_format: { kind: "string", enum: ELEVENLABS_OUTPUT_FORMATS }
2086
+ }
2087
+ }
2088
+ }
2089
+ };
2090
+ var MODEL_ALIASES = {
2091
+ "fal/veed-lipsync": "replicate/sync-lipsync-2",
2092
+ "fal/veed-video-background-removal": "replicate/birefnet-video",
2093
+ "fal/birefnet-v2": "replicate/birefnet",
2094
+ "google/gemini-3.1-flash-image-preview": "google/gemini-3.1-flash-image",
2095
+ "google/gemini-3-pro-image-preview": "google/gemini-3-pro-image",
2096
+ "openai/gpt-5.4-image-2": "openai/gpt-image-2.5-sunburst"
2097
+ };
2098
+ function canonicalModelId(model) {
2099
+ return Object.keys(MODEL_ALIASES).includes(model) ? MODEL_ALIASES[model] : model;
2100
+ }
2101
+ function modelIdsAccepted(canonical) {
2102
+ return [canonical, ...Object.keys(MODEL_ALIASES).filter((legacy) => MODEL_ALIASES[legacy] === canonical)];
2103
+ }
2104
+ function modelSpec(kind, model) {
2105
+ return MODEL_REGISTRY[kind]?.[canonicalModelId(model)];
2106
+ }
2107
+ var NARROWED_ALIASES = ["openai/gpt-5.4-image-2"];
2108
+ function canonicalModelParams(kind, params) {
2109
+ const model = params.model;
2110
+ if (typeof model !== "string" || canonicalModelId(model) === model) return params;
2111
+ const successor = canonicalModelId(model);
2112
+ if (!NARROWED_ALIASES.includes(model)) return { ...params, model: successor };
2113
+ const fitted = { ...params, model: successor };
2114
+ if (typeof fitted.aspect_ratio === "string") {
2115
+ fitted.aspect_ratio = nearestSupportedAspectRatio(kind, successor, fitted.aspect_ratio);
2116
+ }
2117
+ if (typeof fitted.image_size === "string") {
2118
+ fitted.image_size = supportsParam(kind, successor, "image_size") ? nearestSupportedImageSize(kind, successor, fitted.image_size) : void 0;
2119
+ }
2120
+ if (typeof fitted.quality === "string") {
2121
+ fitted.quality = bestSupportedQuality(kind, successor, fitted.quality);
2122
+ }
2123
+ return Object.fromEntries(Object.entries(fitted).filter(([, value]) => value !== void 0));
2124
+ }
2125
+ function perSecondBilling(model) {
2126
+ const billing = MODEL_REGISTRY.video_generate[model]?.billing;
2127
+ return billing?.kind === "per_second" ? billing : void 0;
2128
+ }
2129
+ var MODEL_ROLES = {
2130
+ /** Ad frames and static-ad plates: the most faithful text and identity reproduction. */
2131
+ adImage: { kind: "image_generate", model: "openai/gpt-image-2.5-sunburst" },
2132
+ /**
2133
+ * The multi-view reference sheet a recurring element is fused on. Gemini 3 Pro makes
2134
+ * the cleanest, best-labelled turnaround, worth it for the ONE reference every frame
2135
+ * of an ad grounds on.
2136
+ */
2137
+ referenceSheet: { kind: "image_reference_sheet", model: "google/gemini-3-pro-image" },
2138
+ /** Re-framing a static ad whose copy is baked into the pixels. */
2139
+ aspectAdapt: { kind: "image_aspect_adapt", model: "google/gemini-3-pro-image" },
2140
+ /**
2141
+ * The judge comparing candidate plates. Flash, not Pro: Pro measured 5 credits for
2142
+ * one pick, a tenth of the render it judges.
2143
+ */
2144
+ plateJudge: { kind: "image_select", model: "~google/gemini-flash-latest" },
2145
+ /**
2146
+ * The static-ad blueprint extraction, and the fit of a reference to a company (`winning-ads fit`).
2147
+ * Flash, not Pro: measured on 16 proven ads (dev, Oct 2026), Flash read as well, answered 11 describes
2148
+ * of 12 (Pro 8: its preview model stopped answers part-way) and 16 fits of 16 (Pro 15), at under half
2149
+ * the describe's cost and a fifth of the fit's; the fit kept or rejected the same ads 14 times of 15.
2150
+ * A describe takes ~10 s longer (40 s), a fit ~12 s less (10 s).
2151
+ */
2152
+ adDescribe: { kind: "image_describe", model: "~google/gemini-flash-latest" },
2153
+ /** The element-selection and layout passes over a blueprint. */
2154
+ blueprintAnalysis: { kind: "text_generate", model: "~google/gemini-flash-latest" },
2155
+ /**
2156
+ * The viewer an ad reaches, played before a static ad renders (`baker canvas viewer-check`):
2157
+ * says from the copy and the scene what is offered, to whom, and what to do next. Text
2158
+ * only and asked once per ad and viewer, so Flash; the calibration set (E8) decides.
2159
+ */
2160
+ viewerCheck: { kind: "text_generate", model: "~google/gemini-flash-latest" },
2161
+ /**
2162
+ * Picks the customer truths out of reviews, testimonials and threads (`baker research
2163
+ * customers`): returns exact spans the code then checks against the source. Text only and
2164
+ * one call per batch, so Flash.
2165
+ */
2166
+ customerInsights: { kind: "text_generate", model: "~google/gemini-flash-latest" },
2167
+ /**
2168
+ * The same viewer shown the FINISHED static ad at phone size for about three seconds, with no
2169
+ * brand and no brief: what is sold, whether it is for them, what to do next, what stopped them
2170
+ * (`glance-check.ts`). One small picture per run, so Flash.
2171
+ */
2172
+ glanceCheck: { kind: "image_describe", model: "~google/gemini-flash-latest" },
2173
+ /**
2174
+ * Reads every line of text and the logo of a finished static ad WITH its box, for the
2175
+ * copy and safe-area checks. Bench E10 (2026-09-30): word F1 0.994, box IoU 0.937, 4.3 s,
2176
+ * about $0.005 an image on `google/gemini-3.8-flash`, which this alias resolves to;
2177
+ * tesseract and PaddleOCR missed the 0.95 F1 gate.
2178
+ */
2179
+ textBoxReader: { kind: "image_describe", model: "~google/gemini-flash-latest" },
2180
+ /**
2181
+ * Scene-by-scene video extraction. Flash: ~2-3x faster per call than Pro, which keeps
2182
+ * each per-scene step inside the action time budget.
2183
+ */
2184
+ videoDeconstruct: { kind: "video_deconstruct", model: "~google/gemini-flash-latest" },
2185
+ /** The backend `image_search` agent loop that picks search tools and queries. */
2186
+ imageSearch: { kind: "text_generate", model: "~google/gemini-flash-latest" },
2187
+ voiceover: { kind: "tts", model: "elevenlabs/eleven_v3" },
2188
+ soundEffect: { kind: "sound_effect", model: "elevenlabs/eleven_text_to_sound_v2" },
2189
+ musicBed: { kind: "music", model: "elevenlabs/music-v1" },
2190
+ /** Re-voices a talking clip's native audio into one consistent brand voice. */
2191
+ voiceConvert: { kind: "audio_voice_convert", model: "elevenlabs/eleven_multilingual_sts_v2" },
2192
+ /** The scored video router's candidates, one per job it can route to. */
2193
+ videoRouterWorkhorse: { kind: "video_generate", model: "bytedance/seedance-2.0" },
2194
+ videoRouterRealFace: { kind: "video_generate", model: "google/veo-3.1" },
2195
+ videoRouterRealFaceEconomy: { kind: "video_generate", model: "google/veo-3.1-fast" },
2196
+ videoRouterMotion: { kind: "video_generate", model: "kwaivgi/kling-v3.0-pro" },
2197
+ imageDefault: { kind: "image_generate", model: DEFAULT_IMAGE_GENERATE_MODEL },
2198
+ videoDefault: { kind: "video_generate", model: DEFAULT_VIDEO_GENERATE_MODEL },
2199
+ avatarVideo: { kind: "video_generate", model: DEFAULT_AVATAR_VIDEO_MODEL }
2200
+ };
2201
+ var AD_IMAGE_MODEL = MODEL_ROLES.adImage.model;
2202
+ var REFERENCE_SHEET_MODEL = MODEL_ROLES.referenceSheet.model;
2203
+ var ASPECT_ADAPT_MODEL = MODEL_ROLES.aspectAdapt.model;
2204
+ var PLATE_JUDGE_MODEL = MODEL_ROLES.plateJudge.model;
2205
+ var AD_DESCRIBE_MODEL = MODEL_ROLES.adDescribe.model;
2206
+ var BLUEPRINT_ANALYSIS_MODEL = MODEL_ROLES.blueprintAnalysis.model;
2207
+ var VIEWER_CHECK_MODEL = MODEL_ROLES.viewerCheck.model;
2208
+ var CUSTOMER_INSIGHTS_MODEL = MODEL_ROLES.customerInsights.model;
2209
+ var GLANCE_CHECK_MODEL = MODEL_ROLES.glanceCheck.model;
2210
+ var TEXT_BOX_READER_MODEL = MODEL_ROLES.textBoxReader.model;
2211
+ var VIDEO_DECONSTRUCT_MODEL = MODEL_ROLES.videoDeconstruct.model;
2212
+ var IMAGE_SEARCH_MODEL = MODEL_ROLES.imageSearch.model;
2213
+ var VOICEOVER_MODEL = MODEL_ROLES.voiceover.model;
2214
+ var SOUND_EFFECT_MODEL = MODEL_ROLES.soundEffect.model;
2215
+ var MUSIC_BED_MODEL = MODEL_ROLES.musicBed.model;
2216
+ var VOICE_CONVERT_MODEL = MODEL_ROLES.voiceConvert.model;
2217
+ function isRegisteredModel(kind, model) {
2218
+ return MODEL_REGISTRY[kind]?.[canonicalModelId(model)] !== void 0;
2219
+ }
2220
+ function imageGenerateAspectRatios() {
2221
+ const seen = /* @__PURE__ */ new Set();
2222
+ for (const model of IMAGE_GENERATE_MODELS) {
2223
+ for (const ratio of supportedAspectRatios("image_generate", model) ?? []) seen.add(ratio);
2224
+ }
2225
+ return [...seen];
2226
+ }
2227
+ function supportsParam(kind, model, param) {
2228
+ return modelSpec(kind, model)?.params[param] !== void 0;
2229
+ }
2230
+ var DEFAULT_CLIP_DURATION_S = 5;
2231
+ var SPOKEN_WORDS_PER_SECOND = 2.5;
2232
+ var SPOKEN_LINE = new RegExp(`(?<![\\p{L}\\p{N}])['"\\u201c\\u201d\\u2018\\u2019]((?:[^'"\\u201c\\u201d\\u2018\\u2019]|(?<=\\p{L})['\\u2019](?=\\p{L})){8,})['"\\u201c\\u201d\\u2018\\u2019](?![\\p{L}\\p{N}])`, "gu");
2233
+ function spokenWordsIn(prompt) {
2234
+ if (!prompt) return 0;
2235
+ const quoted = [...prompt.matchAll(SPOKEN_LINE)].map((m) => m[1] ?? "");
2236
+ const text = quoted.join(" ").trim();
2237
+ return text ? text.split(/\s+/).filter(Boolean).length : 0;
2238
+ }
2239
+ var SPOKEN_CLIP_DURATION_S = 8;
2240
+ function nearestClipDuration(model, preferred) {
2241
+ const schema = MODEL_REGISTRY.video_generate[model]?.params.duration;
2242
+ const allowed = schema?.kind === "number" ? schema.enum : void 0;
2243
+ if (!allowed?.length || allowed.includes(preferred)) return preferred;
2244
+ return [...allowed].sort((a, b) => Math.abs(a - preferred) - Math.abs(b - preferred) || a - b)[0];
2245
+ }
2246
+ var SILENT_VIDEO_MODELS = /* @__PURE__ */ new Set([
2247
+ "runway/gen-4.5",
2248
+ "x-ai/grok-imagine-video",
2249
+ "x-ai/grok-imagine-video-1.5",
2250
+ "alibaba/happyhorse-1.1"
2251
+ ]);
2252
+ function clipAudioMode(model) {
2253
+ if (supportsParam("video_generate", model, "generate_audio")) return "toggle";
2254
+ return SILENT_VIDEO_MODELS.has(model) ? "never" : "always";
2255
+ }
2256
+ function clipDurationsFor(model) {
2257
+ const schema = MODEL_REGISTRY.video_generate[model]?.params.duration;
2258
+ const allowed = schema?.kind === "number" ? schema.enum : void 0;
2259
+ return allowed?.length ? [...allowed].sort((a, b) => a - b) : void 0;
2260
+ }
2261
+ function maxClipSeconds(model) {
2262
+ const allowed = clipDurationsFor(model);
2263
+ return allowed ? allowed[allowed.length - 1] : void 0;
2264
+ }
2265
+ function splitScriptFor(words, model) {
2266
+ const maxSeconds = maxClipSeconds(model);
2267
+ if (!maxSeconds) return null;
2268
+ const perClip = Math.floor(maxSeconds * SPOKEN_WORDS_PER_SECOND);
2269
+ if (words <= perClip) return null;
2270
+ const clips = Math.ceil(words / perClip);
2271
+ return { clips, wordsPerClip: Math.ceil(words / clips), maxSeconds };
2272
+ }
2273
+ function promptMaxLength(kind, model) {
2274
+ const schema = modelSpec(kind, model)?.params.prompt;
2275
+ return schema?.kind === "string" ? schema.maxLength : void 0;
2276
+ }
2277
+ function inputSlot(kind, model, inputKind) {
2278
+ const spec = modelSpec(kind, model);
2279
+ return spec?.optional_inputs?.find((input) => input.kind === inputKind) ?? spec?.inputs.find((input) => input.kind === inputKind);
2280
+ }
2281
+ function maxInputSlot(kind, model, inputKind) {
2282
+ return inputSlot(kind, model, inputKind)?.max;
2283
+ }
2284
+ function maxInputReferences(kind, model) {
2285
+ return maxInputSlot(kind, model, "image");
2286
+ }
2287
+ function supportedQualities(kind, model) {
2288
+ const schema = modelSpec(kind, model)?.params.quality;
2289
+ return schema?.kind === "string" ? schema.enum : void 0;
2290
+ }
2291
+ function bestSupportedQuality(kind, model, want) {
2292
+ const supported = supportedQualities(kind, model);
2293
+ if (!supported) return void 0;
2294
+ if (supported.includes(want)) return want;
2295
+ const ladder = supported.filter((step) => step !== "auto");
2296
+ const ceiling = ladder.indexOf(want);
2297
+ const reachable = ceiling === -1 ? ladder : ladder.slice(0, ceiling);
2298
+ return reachable[reachable.length - 1];
2299
+ }
2300
+ function supportedAspectRatios(kind, model) {
2301
+ const schema = modelSpec(kind, model)?.params.aspect_ratio;
2302
+ return schema?.kind === "string" ? schema.enum : void 0;
2303
+ }
2304
+ function ratioValue(ratio) {
2305
+ const [w, h] = ratio.split(":").map(Number);
2306
+ if (!w || !h || !Number.isFinite(w) || !Number.isFinite(h)) return null;
2307
+ return w / h;
2308
+ }
2309
+ function nearestSupportedAspectRatio(kind, model, target) {
2310
+ const supported = supportedAspectRatios(kind, model);
2311
+ if (!supported || supported.includes(target)) return target;
2312
+ const wanted = ratioValue(target);
2313
+ if (wanted === null) return target;
2314
+ let best = target;
2315
+ let bestDistance = Number.POSITIVE_INFINITY;
2316
+ for (const candidate of supported) {
2317
+ const value = ratioValue(candidate);
2318
+ if (value === null) continue;
2319
+ const distance = Math.abs(Math.log(value / wanted));
2320
+ if (distance < bestDistance) {
2321
+ bestDistance = distance;
2322
+ best = candidate;
2323
+ }
2324
+ }
2325
+ return best;
2326
+ }
2327
+ function supportedImageSizes(kind, model) {
2328
+ const schema = modelSpec(kind, model)?.params.image_size;
2329
+ return schema?.kind === "string" ? schema.enum : void 0;
2330
+ }
2331
+ var IMAGE_SIZE_ORDER = ["0.5K", "1K", "2K", "4K"];
2332
+ function nearestSupportedImageSize(kind, model, target) {
2333
+ const supported = supportedImageSizes(kind, model);
2334
+ if (!supported || supported.includes(target)) return target;
2335
+ const wanted = IMAGE_SIZE_ORDER.indexOf(target);
2336
+ if (wanted < 0) return target;
2337
+ const ranked = supported.filter((s) => IMAGE_SIZE_ORDER.includes(s)).sort((a, b) => IMAGE_SIZE_ORDER.indexOf(a) - IMAGE_SIZE_ORDER.indexOf(b));
2338
+ if (ranked.length === 0) return target;
2339
+ const belowOrEqual = ranked.filter((s) => IMAGE_SIZE_ORDER.indexOf(s) <= wanted);
2340
+ return belowOrEqual.length > 0 ? belowOrEqual[belowOrEqual.length - 1] : ranked[0];
2341
+ }
2342
+
2343
+ // ../canvas-contract/src/credits.ts
2344
+ var CREDITS_PER_USD = 100;
2345
+ function usdToCredits(usd) {
2346
+ if (!(usd > 0)) return 0;
2347
+ return Math.ceil(Number((usd * CREDITS_PER_USD).toFixed(6)));
2348
+ }
2349
+
2350
+ // ../canvas-contract/src/videoCost.ts
2351
+ var OPENING_FRAME_CREDITS = usdToCredits(0.03);
2352
+ var SEEDANCE_USD_PER_SECOND = {
2353
+ "480p": 0.18,
2354
+ "720p": 0.5,
2355
+ "1080p": 0.62,
2356
+ "4k": 0.62
2357
+ };
2358
+ var DEFAULT_VIDEO_RESOLUTION = "720p";
2359
+ var DEFAULT_VIDEO_DURATION_S = 5;
2360
+ function isSeedanceModel(model) {
2361
+ return model.startsWith("bytedance/seedance");
2362
+ }
2363
+ var SEEDANCE_25_USD_PER_SECOND = {
2364
+ "480p": 0.1075,
2365
+ "720p": 0.2326
2366
+ };
2367
+ var SEEDANCE_25_FALLBACK_USD_PER_SECOND = 0.2326;
2368
+ function seedance25UsdPerSecond(resolution) {
2369
+ return SEEDANCE_25_USD_PER_SECOND[resolution ?? DEFAULT_VIDEO_RESOLUTION] ?? SEEDANCE_25_FALLBACK_USD_PER_SECOND;
2370
+ }
2371
+ var FALLBACK_USD_PER_SECOND = 0.5;
2372
+ function billedSeconds(model, duration) {
2373
+ const floor = perSecondBilling(model)?.minBilledSeconds;
2374
+ return floor === void 0 ? duration : Math.max(duration, floor);
2375
+ }
2376
+ function seedanceUsdPerSecond(resolution) {
2377
+ return SEEDANCE_USD_PER_SECOND[resolution ?? DEFAULT_VIDEO_RESOLUTION] ?? FALLBACK_USD_PER_SECOND;
2378
+ }
2379
+ var GEMINI_OMNI_USD_PER_1M_VIDEO_TOKENS = 17.5;
2380
+ var GEMINI_OMNI_VIDEO_TOKENS_PER_SECOND = 5792;
2381
+ var GEMINI_OMNI_RESOLUTION_MULTIPLIER = {
2382
+ "360p": 1 / 3,
2383
+ "720p": 1,
2384
+ "1080p": 1.5,
2385
+ "4k": 3
2386
+ };
2387
+ var GEMINI_OMNI_DEFAULT_RESOLUTION = "720p";
2388
+ var GEMINI_OMNI_OVERHEAD_TOKENS = 600;
2389
+ var GEMINI_OMNI_WINDOW_SECONDS = 10;
2390
+ var GEMINI_OMNI_USD_PER_SECOND = GEMINI_OMNI_VIDEO_TOKENS_PER_SECOND * GEMINI_OMNI_USD_PER_1M_VIDEO_TOKENS / 1e6;
2391
+ function geminiOmniUsdPerSecond(resolution) {
2392
+ const multiplier = GEMINI_OMNI_RESOLUTION_MULTIPLIER[resolution ?? GEMINI_OMNI_DEFAULT_RESOLUTION] ?? 1;
2393
+ return GEMINI_OMNI_USD_PER_SECOND * multiplier;
2394
+ }
2395
+ var VIDEO_SOURCE_COST_MULTIPLIER = 2.5;
2396
+ var FAL_SEEDANCE_USD_PER_1K_TOKENS = 0.0214;
2397
+ var SEEDANCE_SOURCE_CLIP_DISCOUNT = 0.6;
2398
+ var SEEDANCE_DEAREST_FRAME = {
2399
+ "480p": { width: 992, height: 432 },
2400
+ "720p": { width: 1112, height: 834 }
2401
+ };
2402
+ function falSeedanceUsdPerSecond(resolution, buildsOnSourceClip = false) {
2403
+ const frame = SEEDANCE_DEAREST_FRAME[resolution ?? DEFAULT_VIDEO_RESOLUTION] ?? SEEDANCE_DEAREST_FRAME["720p"];
2404
+ const tokensPerSecond = (frame?.width ?? 1112) * (frame?.height ?? 834) * 24 / 1024;
2405
+ const rate = tokensPerSecond * FAL_SEEDANCE_USD_PER_1K_TOKENS / 1e3;
2406
+ return buildsOnSourceClip ? rate * SEEDANCE_SOURCE_CLIP_DISCOUNT : rate;
2407
+ }
2408
+ function geminiOmniCostUsd(model, duration, resolution) {
2409
+ const tier = isGeminiOmniPreviewModel(model) ? GEMINI_OMNI_DEFAULT_RESOLUTION : resolution;
2410
+ const footage = geminiOmniUsdPerSecond(tier) * (duration ?? GEMINI_OMNI_WINDOW_SECONDS);
2411
+ return footage + GEMINI_OMNI_OVERHEAD_TOKENS * GEMINI_OMNI_USD_PER_1M_VIDEO_TOKENS / 1e6;
2412
+ }
2413
+ function seedance20CostUsd(resolution, seconds, mayRouteToFal) {
2414
+ const viaReplicate = seedanceUsdPerSecond(resolution) * seconds;
2415
+ if (!mayRouteToFal) return viaReplicate;
2416
+ const falTier = resolution === "480p" || resolution === "720p" ? resolution : void 0;
2417
+ return Math.max(viaReplicate, falSeedanceUsdPerSecond(falTier) * seconds);
2418
+ }
2419
+ function estimateVideoCostUsd(input) {
2420
+ const { model, duration, resolution, generateAudio, buildsOnSourceClip } = input;
2421
+ const seconds = billedSeconds(model, duration ?? DEFAULT_VIDEO_DURATION_S);
2422
+ const sourceClipPremium = buildsOnSourceClip ? VIDEO_SOURCE_COST_MULTIPLIER : 1;
2423
+ if (isGeminiOmniModel(model)) return geminiOmniCostUsd(model, duration, resolution);
2424
+ if (isSeedance25Model(model)) {
2425
+ const viaOpenRouter = seedance25UsdPerSecond(resolution) * seconds * sourceClipPremium;
2426
+ if (!input.mayRouteToFal) return viaOpenRouter;
2427
+ return Math.max(viaOpenRouter, falSeedanceUsdPerSecond(resolution, buildsOnSourceClip) * seconds);
2428
+ }
2429
+ if (isSeedanceModel(model)) return seedance20CostUsd(resolution, seconds, input.mayRouteToFal === true);
2430
+ const published = perSecondBilling(model)?.usd;
2431
+ if (published) {
2432
+ const rate = (resolution ? published.byResolution?.[resolution] : void 0) ?? published;
2433
+ return (generateAudio ? rate.audio : rate.silent) * seconds;
2434
+ }
2435
+ const dearestKnownRate = Math.max(...Object.values(SEEDANCE_USD_PER_SECOND));
2436
+ return dearestKnownRate * seconds;
2437
+ }
2438
+ function estimateVideoCredits(input) {
2439
+ return usdToCredits(estimateVideoCostUsd(input));
2440
+ }
2441
+
2442
+ // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/766ad107c42df28eeadaf0ac2f9089c8a9e200f6ba0b2b1a817b8d536cbdcc49/node_modules/safe-stable-stringify/esm/wrapper.js
2443
+ var import__ = __toESM(require_safe_stable_stringify(), 1);
2444
+ var configure = import__.default.configure;
2445
+ var wrapper_default = import__.default;
2446
+
2447
+ // ../canvas-contract/src/canonical.ts
2448
+ function canonicalize(value) {
2449
+ const normalized = normalizeForCanonical(value);
2450
+ const out = wrapper_default(normalized);
2451
+ if (out === void 0) {
2452
+ throw new Error("canonicalize: value serialized to undefined (top-level undefined?)");
2453
+ }
2454
+ return out;
2455
+ }
2456
+ function normalizeForCanonical(value) {
2457
+ if (value === null) return null;
2458
+ if (typeof value === "string") return value.normalize("NFC");
2459
+ if (typeof value === "number") {
2460
+ if (!Number.isFinite(value)) {
2461
+ throw new Error(`canonicalize: non-finite number ${value}`);
2462
+ }
2463
+ return value;
2464
+ }
2465
+ if (typeof value === "boolean") return value;
2466
+ if (typeof value === "bigint") {
2467
+ throw new Error("canonicalize: bigint not supported");
2468
+ }
2469
+ if (Array.isArray(value)) {
2470
+ return value.map(normalizeForCanonical);
2471
+ }
2472
+ if (typeof value === "object") {
2473
+ const out = {};
2474
+ for (const [k, v] of Object.entries(value)) {
2475
+ if (v === void 0) continue;
2476
+ out[k.normalize("NFC")] = normalizeForCanonical(v);
2477
+ }
2478
+ return out;
2479
+ }
2480
+ return void 0;
2481
+ }
2482
+
2483
+ // ../canvas-contract/src/clipWeight.ts
2484
+ var MB_PER_SECOND_720P = 2.13;
2485
+ var RESOLUTION_WEIGHT = {
2486
+ "360p": 0.25,
2487
+ "480p": 0.44,
2488
+ "720p": 1,
2489
+ "1080p": 2.25,
2490
+ "4k": 9,
2491
+ "4K": 9
2492
+ };
2493
+ var MAX_CLIP_INGEST_MB = 120;
2494
+ function estimateClipMb(durationSeconds, resolution) {
2495
+ const weight = RESOLUTION_WEIGHT[resolution ?? "720p"] ?? 1;
2496
+ return durationSeconds * MB_PER_SECOND_720P * weight;
2497
+ }
2498
+ function clipTooHeavyToIngest(durationSeconds, resolution) {
2499
+ if (!durationSeconds) return null;
2500
+ const mb = estimateClipMb(durationSeconds, resolution);
2501
+ if (mb <= MAX_CLIP_INGEST_MB) return null;
2502
+ const fits = Math.floor(MAX_CLIP_INGEST_MB / (estimateClipMb(1, resolution) || 1));
2503
+ return `A ${durationSeconds}s clip at ${resolution ?? "720p"} comes to roughly ${Math.round(mb)} MB, more than the ${MAX_CLIP_INGEST_MB} MB we can take in \u2014 it would render, bill, and then fail on the way into the library. Shorten it to about ${fits}s at this resolution, or drop the resolution and keep the length.`;
2504
+ }
2505
+
2506
+ // ../canvas-contract/src/frameRealism.ts
2507
+ function frameRealismDirection(opts = {}) {
2508
+ return " Everything obeys real-world physics: paper, card and screens are OPAQUE with nothing showing through from behind, every object is at believable real-world scale next to the people handling it, and every object has its real-world form and construction \u2014 a phone has ONE screen and it is on the front." + // The worst of the three failures behind this, because the viewer reads the number: a
2509
+ // model invents one whenever a screen or a document is in shot, and it contradicts the
2510
+ // script it sits under. Frames simply do not get legible text; the captions carry the
2511
+ // numbers.
2512
+ //
2513
+ // Default ON, and asked for explicitly rather than inferred: an ad frame with no
2514
+ // person in it still sits under a script for an invented number to argue with. Only a
2515
+ // plain Studio picture opts out — it has no script, and it may BE the poster somebody
2516
+ // asked for, which the model picker sells GPT Image 2.5 on being able to render.
2517
+ (opts.readableText === "allowed" ? "" : " NO readable text or numbers anywhere in frame \u2014 phone screens, documents and signage stay illegible or out of focus, because any figure the model invents will contradict the script.") + // Measured: one finished ad reported malformed hands or limbs in 8 of 12 sampled frames;
2518
+ // another, a woman with an extra right arm and an unattached hand gripping a panel.
2519
+ // Fiddly work at close range is where a video model breaks, every time.
2520
+ " Hands are kept simple: no close-up of fingers manipulating small parts, no hand gripping the edge of an object, and each person has exactly TWO arms and TWO legs, all attached and all visible or all out of frame. Anyone working does so the way the trade actually does it: nobody stands or kneels on the equipment being installed, nothing is fitted overhanging an edge or floating unsupported, and every part rests on the structure that would really carry it." + // The newest clause, and the one no route had. A testimonial came back with the customer
2521
+ // repairing the panel herself: nothing said she was not the installer, so the model cast
2522
+ // her as one. Who someone IS in the picture has to be stated, or it is guessed.
2523
+ (opts.role ? ` The person on camera is ${opts.role} \u2014 they are shown as that and never doing somebody else's job.` : "") + (opts.currency ? ` If a currency is unavoidably visible it is ${opts.currency}.` : "");
2524
+ }
2525
+
2526
+ // ../canvas-contract/src/nodeCost.ts
2527
+ var ELEVENLABS_USD_PER_CHARACTER = 22e-5;
2528
+ var ELEVENLABS_MUSIC_USD_PER_SECOND = 0.022;
2529
+ var ELEVENLABS_SOUND_EFFECT_USD_PER_SECOND = 0.022;
2530
+ var ELEVENLABS_STS_USD_PER_MINUTE = 1e3 * ELEVENLABS_USD_PER_CHARACTER;
2531
+ var FALAI_LIPSYNC_PER_MIN_USD = 0.4;
2532
+ var FALAI_VIDEO_BG_REMOVE_REFINED_USD_PER_30_FRAMES = 0.012;
2533
+ var FALAI_VIDEO_BG_REMOVE_FAST_USD_PER_30_FRAMES = 8e-3;
2534
+ var FALAI_IMAGE_BG_REMOVE_USD_PER_CALL = 1e-3;
2535
+ var GROQ_WHISPER_COST_PER_HOUR = 0.04;
2536
+ var GROQ_WHISPER_MINIMUM_SECONDS = 10;
2537
+ var DEEPGRAM_NOVA3_COST_PER_MINUTE = 43e-4;
2538
+ var FIRECRAWL_COST_PER_SCRAPE = 1e-3;
2539
+ var DEFAULT_MUSIC_SECONDS = 30;
2540
+ var DEFAULT_SOUND_EFFECT_SECONDS = 5;
2541
+ var DEFAULT_BACKGROUND_REMOVE_SECONDS = 30;
2542
+ var DEFAULT_MEDIA_SECONDS = 60;
2543
+ function ttsCharactersUsd(characters) {
2544
+ return characters * ELEVENLABS_USD_PER_CHARACTER;
2545
+ }
2546
+ function musicSecondsUsd(seconds) {
2547
+ return seconds * ELEVENLABS_MUSIC_USD_PER_SECOND;
2548
+ }
2549
+ function soundEffectSecondsUsd(seconds) {
2550
+ return seconds * ELEVENLABS_SOUND_EFFECT_USD_PER_SECOND;
2551
+ }
2552
+ function voiceConvertMinutes(durationMs) {
2553
+ return Math.max(durationMs / 6e4, 0.1);
2554
+ }
2555
+ function voiceConvertUsd(minutes) {
2556
+ return minutes * ELEVENLABS_STS_USD_PER_MINUTE;
2557
+ }
2558
+ function lipsyncMinutes(audioMs, videoMs) {
2559
+ const durationMs = Math.max(audioMs ?? 0, videoMs ?? 0);
2560
+ return durationMs > 0 ? durationMs / 6e4 : 1;
2561
+ }
2562
+ function lipsyncUsd(minutes) {
2563
+ return minutes * FALAI_LIPSYNC_PER_MIN_USD;
2564
+ }
2565
+ function backgroundRemoveFrames(durationSeconds) {
2566
+ return Math.max(30, Math.ceil((durationSeconds ?? DEFAULT_BACKGROUND_REMOVE_SECONDS) * 30));
2567
+ }
2568
+ function videoBackgroundRemoveUsd(durationSeconds, edgeRefinement) {
2569
+ const unit = edgeRefinement ? FALAI_VIDEO_BG_REMOVE_REFINED_USD_PER_30_FRAMES : FALAI_VIDEO_BG_REMOVE_FAST_USD_PER_30_FRAMES;
2570
+ return backgroundRemoveFrames(durationSeconds) / 30 * unit;
2571
+ }
2572
+ function transcriptionUsd(transcriber, seconds) {
2573
+ if (seconds <= 0) return 0;
2574
+ if (transcriber === "deepgram") return seconds / 60 * DEEPGRAM_NOVA3_COST_PER_MINUTE;
2575
+ return Math.max(seconds, GROQ_WHISPER_MINIMUM_SECONDS) / 3600 * GROQ_WHISPER_COST_PER_HOUR;
2576
+ }
2577
+ function asBag(value) {
2578
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
2579
+ }
2580
+ function num(value) {
2581
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
2582
+ }
2583
+ function inputDurationMs(inputs, slot) {
2584
+ const ref = asBag(inputs[slot]);
2585
+ return num(ref.duration_ms) ?? num(asBag(ref.metadata).duration_ms);
2586
+ }
2587
+ function slotCount(inputs, slot) {
2588
+ const value = inputs[slot];
2589
+ if (Array.isArray(value)) return value.length;
2590
+ return value ? 1 : 0;
2591
+ }
2592
+ function textLength(value) {
2593
+ return typeof value === "string" ? value.length : 0;
2594
+ }
2595
+ function estimateVideoGenerateUsd(params, inputs, preferFal) {
2596
+ const model = params.model;
2597
+ if (typeof model !== "string") return null;
2598
+ const referenceOnly = slotCount(inputs, "references") > 0 && !inputs.first_frame;
2599
+ return estimateVideoCostUsd({
2600
+ model,
2601
+ duration: num(params.duration),
2602
+ resolution: typeof params.resolution === "string" ? params.resolution : void 0,
2603
+ generateAudio: typeof params.generate_audio === "boolean" ? params.generate_audio : void 0,
2604
+ buildsOnSourceClip: slotCount(inputs, "video_references") > 0,
2605
+ mayRouteToFal: isSeedanceModel(model) && (preferFal || referenceOnly)
2606
+ });
2607
+ }
2608
+ function estimateMusicUsd(params, inputs) {
2609
+ const pinnedMs = num(params.music_length_ms);
2610
+ const scoredMs = params.model === "elevenlabs/video-background-music-v1" ? inputDurationMs(inputs, "video") : void 0;
2611
+ const seconds = (pinnedMs ?? scoredMs ?? DEFAULT_MUSIC_SECONDS * 1e3) / 1e3;
2612
+ return musicSecondsUsd(seconds);
2613
+ }
2614
+ function estimateDialogueUsd(params) {
2615
+ if (!Array.isArray(params.inputs)) return null;
2616
+ const characters = params.inputs.reduce((sum, line) => sum + textLength(asBag(line).text), 0);
2617
+ return ttsCharactersUsd(characters);
2618
+ }
2619
+ function estimateNodeCostUsd(input) {
2620
+ const params = asBag(input.params);
2621
+ const inputs = asBag(input.inputs);
2622
+ switch (input.nodeType) {
2623
+ case "video_generate":
2624
+ return estimateVideoGenerateUsd(params, inputs, input.preferFal === true);
2625
+ case "tts":
2626
+ return typeof params.text === "string" ? ttsCharactersUsd(params.text.length) : null;
2627
+ case "dialogue":
2628
+ return estimateDialogueUsd(params);
2629
+ case "music":
2630
+ return estimateMusicUsd(params, inputs);
2631
+ case "sound_effect":
2632
+ return soundEffectSecondsUsd(num(params.duration_seconds) ?? DEFAULT_SOUND_EFFECT_SECONDS);
2633
+ case "audio_voice_convert": {
2634
+ const ms = inputDurationMs(inputs, "audio") ?? DEFAULT_MEDIA_SECONDS * 1e3;
2635
+ return voiceConvertUsd(voiceConvertMinutes(ms));
2636
+ }
2637
+ case "video_lipsync":
2638
+ return lipsyncUsd(lipsyncMinutes(inputDurationMs(inputs, "audio"), inputDurationMs(inputs, "video")));
2639
+ case "video_background_remove": {
2640
+ const ms = inputDurationMs(inputs, "video");
2641
+ return videoBackgroundRemoveUsd(ms === void 0 ? void 0 : ms / 1e3, params.edge_refinement !== false);
2642
+ }
2643
+ case "image_background_remove":
2644
+ return FALAI_IMAGE_BG_REMOVE_USD_PER_CALL;
2645
+ case "video_transcribe": {
2646
+ const ms = inputDurationMs(inputs, "video") ?? DEFAULT_MEDIA_SECONDS * 1e3;
2647
+ return transcriptionUsd(params.transcriber === "deepgram" ? "deepgram" : "groq", ms / 1e3);
2648
+ }
2649
+ case "ingest":
2650
+ return params.strategy === "firecrawl" ? FIRECRAWL_COST_PER_SCRAPE : 0;
2651
+ case "voice_select":
2652
+ case "load_artifact":
2653
+ case "save_artifact":
2654
+ case "resize":
2655
+ case "crop":
2656
+ return 0;
2657
+ default:
2658
+ return null;
2659
+ }
2660
+ }
2661
+ function estimateNodeCredits(input) {
2662
+ const usd = estimateNodeCostUsd(input);
2663
+ return usd === null ? null : usdToCredits(usd);
2664
+ }
2665
+
2666
+ // ../canvas-contract/src/personRealism.ts
2667
+ var PHONE_CAMERA = "Shot on a phone, an iPhone or a Samsung Galaxy, with the main camera in the default photo mode (not portrait mode): slightly wide angle, held by a friend about a metre away or at arm's length, the background mostly in focus the way phone photos are, the phone's own processing \u2014 HDR evening out a bright window, a touch of over-sharpening, smoothed noise in the shadows, punchy everyday colour. Slightly imperfect framing. Not a professional camera: no bokeh or creamy background blur, no lens compression, no studio or flash lighting, no colour grade.";
2668
+ var REAL_SKIN = "Real skin and a real face: visible pores, fine lines, uneven tone, small marks, stray hairs, slight asymmetry. Clothes with real creases.";
2669
+ var NOT_A_MODEL = "Not stock photography, not a model or an influencer: no beauty retouching, no glowing or plastic skin, no perfectly symmetrical features.";
2670
+ function candidPersonPortraitPrompt(p) {
2671
+ return [
2672
+ `An unretouched candid phone photo of one ordinary, real person: ${p.subject}`,
2673
+ p.wardrobe?.trim() ? `Wearing: ${p.wardrobe.trim()}` : null,
2674
+ `Where: ${p.setting?.trim() || "an everyday place that fits who they are, in daylight"}, available light only. They look toward the lens mid-conversation with a relaxed, unposed expression. Framed from the head to mid-torso, face clearly visible.`,
2675
+ PHONE_CAMERA,
2676
+ REAL_SKIN,
2677
+ NOT_A_MODEL,
2678
+ "No text, logos or watermarks. One person only."
2679
+ ].filter((line) => line !== null).join("\n");
2680
+ }
2681
+
2682
+ // ../canvas-contract/src/validateParams.ts
2683
+ function isManagedNodeKind(nodeType) {
2684
+ return Object.keys(MODEL_REGISTRY).includes(nodeType);
2685
+ }
2686
+ function checkRequiredParams(spec, params, model) {
2687
+ const errors = [];
2688
+ for (const req of spec.required) {
2689
+ if (params[req] === void 0 || params[req] === null) {
2690
+ errors.push({
2691
+ code: "missing_required_param",
2692
+ param: req,
2693
+ message: `missing required param "${req}" for model "${model}"`
2694
+ });
2695
+ }
2696
+ }
2697
+ return errors;
2698
+ }
2699
+ function checkParamValues(spec, params, model) {
2700
+ const errors = [];
2701
+ for (const [key, value] of Object.entries(params)) {
2702
+ if (key === "model") continue;
2703
+ if (value === void 0) continue;
2704
+ const schema = spec.params[key];
2705
+ if (!schema) {
2706
+ errors.push({
2707
+ code: "unknown_param",
2708
+ param: key,
2709
+ message: `param "${key}" is not supported by model "${model}"`
2710
+ });
2711
+ continue;
2712
+ }
2713
+ const valueErr = validateValue(key, value, schema, model);
2714
+ if (valueErr) errors.push(valueErr);
2715
+ }
2716
+ return errors;
2717
+ }
2718
+ function validateModelParams(nodeType, model, params) {
2719
+ const spec = MODEL_REGISTRY[nodeType][canonicalModelId(model)];
2720
+ if (!spec) {
2721
+ return {
2722
+ ok: false,
2723
+ errors: [{ code: "unknown_model", message: `unknown model "${model}" for node "${nodeType}"` }]
2724
+ };
2725
+ }
2726
+ const fitted = canonicalModelParams(nodeType, { ...params, model });
2727
+ const errors = [...checkRequiredParams(spec, fitted, model), ...checkParamValues(spec, fitted, model)];
2728
+ if (errors.length > 0) return { ok: false, errors };
2729
+ if (nodeType === "video_generate") {
2730
+ const tooHeavy = clipTooHeavyToIngest(
2731
+ typeof params.duration === "number" ? params.duration : void 0,
2732
+ typeof params.resolution === "string" ? params.resolution : void 0
2733
+ );
2734
+ if (tooHeavy) return { ok: false, errors: [{ code: "clip_too_heavy", message: tooHeavy }] };
2735
+ }
2736
+ return { ok: true };
2737
+ }
2738
+ function validateModelInputs(nodeType, model, providedKinds) {
2739
+ const spec = MODEL_REGISTRY[nodeType][canonicalModelId(model)];
2740
+ if (!spec) {
2741
+ return {
2742
+ ok: false,
2743
+ errors: [{ code: "unknown_model", message: `unknown model "${model}" for node "${nodeType}"` }]
2744
+ };
2745
+ }
2746
+ const have = new Set(providedKinds);
2747
+ const errors = [];
2748
+ for (const inputSpec of spec.inputs) {
2749
+ if (!have.has(inputSpec.kind)) {
2750
+ errors.push({
2751
+ code: "missing_input",
2752
+ input: inputSpec.kind,
2753
+ message: `model "${model}" requires input of kind "${inputSpec.kind}"`
2754
+ });
2755
+ }
2756
+ }
2757
+ if (errors.length > 0) return { ok: false, errors };
2758
+ return { ok: true };
2759
+ }
2760
+ function validateStringValue(key, value, schema, model) {
2761
+ if (typeof value !== "string") {
2762
+ return { code: "invalid_value", param: key, message: `${key}: expected string, got ${typeof value}` };
2763
+ }
2764
+ if (schema.enum && !schema.enum.includes(value)) {
2765
+ return {
2766
+ code: "invalid_value",
2767
+ param: key,
2768
+ message: `${key}: "${value}" not allowed by "${model}" (allowed: ${schema.enum.join(", ")})`
2769
+ };
2770
+ }
2771
+ if (schema.maxLength !== void 0 && value.length > schema.maxLength) {
2772
+ return {
2773
+ code: "invalid_value",
2774
+ param: key,
2775
+ message: `${key}: ${value.length} characters exceeds max ${schema.maxLength} for "${model}"`
2776
+ };
2777
+ }
2778
+ return null;
2779
+ }
2780
+ function validateNumberValue(key, value, schema, model) {
2781
+ if (typeof value !== "number" || Number.isNaN(value)) {
2782
+ return { code: "invalid_value", param: key, message: `${key}: expected number, got ${typeof value}` };
2783
+ }
2784
+ if (schema.enum && !schema.enum.includes(value)) {
2785
+ return {
2786
+ code: "invalid_value",
2787
+ param: key,
2788
+ message: `${key}: ${value} not allowed by "${model}" (allowed: ${schema.enum.join(", ")})`
2789
+ };
2790
+ }
2791
+ if (schema.integer && !Number.isInteger(value)) {
2792
+ return { code: "invalid_value", param: key, message: `${key}: ${value} must be a whole number` };
2793
+ }
2794
+ if (schema.min !== void 0 && value < schema.min) {
2795
+ return { code: "invalid_value", param: key, message: `${key}: ${value} below min ${schema.min}` };
2796
+ }
2797
+ if (schema.max !== void 0 && value > schema.max) {
2798
+ return { code: "invalid_value", param: key, message: `${key}: ${value} above max ${schema.max}` };
2799
+ }
2800
+ return null;
2801
+ }
2802
+ function validateValue(key, value, schema, model) {
2803
+ switch (schema.kind) {
2804
+ case "string":
2805
+ return validateStringValue(key, value, schema, model);
2806
+ case "number":
2807
+ return validateNumberValue(key, value, schema, model);
2808
+ case "boolean":
2809
+ if (typeof value !== "boolean") {
2810
+ return { code: "invalid_value", param: key, message: `${key}: expected boolean, got ${typeof value}` };
2811
+ }
2812
+ return null;
2813
+ case "json":
2814
+ return null;
2815
+ default: {
2816
+ const _exhaustive = schema;
2817
+ return _exhaustive;
2818
+ }
2819
+ }
2820
+ }
2821
+
2822
+ // ../canvas-contract/src/videoBlueprint.ts
2823
+ import { z } from "zod";
2824
+ var FrameAssetSchema = z.object({ url: z.string().optional() }).loose().optional();
2825
+ var BlueprintDialogueLineSchema = z.object({
2826
+ speaker: z.string().optional(),
2827
+ line: z.string().optional(),
2828
+ // Absolute seconds on the source timeline (the deconstruct emits both).
2829
+ start_s: z.number().optional(),
2830
+ end_s: z.number().optional(),
2831
+ delivery: z.string().optional(),
2832
+ voice_description: z.string().optional(),
2833
+ // DECON-supplied: is this speaker's FACE visibly speaking in THIS scene? Element
2834
+ // presence alone can't answer that — a founder pictured in a polaroid close-up is
2835
+ // "present" yet the line is voiceover, and treating it as on-camera produced a
2836
+ // native Seedance lip-sync clip of a still photograph. `false` pins the line to
2837
+ // the VO path; absent keeps the presence-based decision (old blueprints).
2838
+ on_camera: z.boolean().optional()
2839
+ }).loose();
2840
+ var SfxSchema = z.object({
2841
+ at_s: z.number().optional(),
2842
+ duration_s: z.number().optional(),
2843
+ sound_effect_prompt: z.string().optional(),
2844
+ description: z.string().optional()
2845
+ }).loose();
2846
+ var CompositionRegionSchema = z.object({
2847
+ // full | top | bottom | left | right | inset
2848
+ panel: z.string().optional(),
2849
+ // 9-grid anchor for an `inset` presenter box.
2850
+ position: z.string().optional(),
2851
+ is_presenter: z.boolean().optional(),
2852
+ // The cast id shown/speaking in this region (routes lip-sync + element refs).
2853
+ cast_ref: z.string().optional(),
2854
+ // What the region's content IS: camera | screen_capture | static_graphic |
2855
+ // generated. Authoritative for routing when present (regex-over-prose fallback
2856
+ // otherwise): screen_capture/static_graphic are rebuilt from REAL surfaces on the
2857
+ // overlay layer, never AI-generated.
2858
+ kind: z.string().optional(),
2859
+ // Opaque id naming the SPECIFIC on-screen document/note/app-state this
2860
+ // screen_capture region shows. Two scenes share it only when they show the SAME
2861
+ // recording continuing (scrolling/typing/waiting within it) — a genuinely
2862
+ // DIFFERENT document/note/recording (a source video splicing two screen captures)
2863
+ // gets a different id. Breaks a persistent-layout run into separate surface stubs
2864
+ // instead of asking the operator for one screenshot that can't cover both.
2865
+ surface_id: z.string().optional(),
2866
+ // Camera bubble(s)/inset(s) embedded INSIDE this region's surface (a Loom-style
2867
+ // presenter bubble inside a screen recording) — video-in-video the reproduction
2868
+ // must re-composite, not paint into the surface.
2869
+ nested: z.array(z.object({}).loose()).optional(),
2870
+ summary: z.string().optional(),
2871
+ frame_prompt: z.string().optional(),
2872
+ motion_prompt: z.string().optional()
2873
+ }).loose();
2874
+ var SceneCompositionSchema = z.object({
2875
+ // full_frame (default) | split_screen | pip | keyed_overlay
2876
+ layout: z.string().optional(),
2877
+ // split_screen only: vertical (top/bottom) | horizontal (left/right).
2878
+ split_axis: z.string().optional(),
2879
+ regions: z.array(CompositionRegionSchema).optional()
2880
+ }).loose();
2881
+ var CameraMotionSchema = z.object({ movement: z.string().optional(), detail: z.string().optional() }).loose();
2882
+ var TranscriptWordSchema = z.object({ text: z.string().optional() }).loose();
2883
+ var SCENE_ROUTE_HINTS = ["brand_card"];
2884
+ var VideoSceneSchema = z.object({
2885
+ start_s: z.number().optional(),
2886
+ end_s: z.number().optional(),
2887
+ duration_s: z.number().optional(),
2888
+ summary: z.string().optional(),
2889
+ action_detail: z.string().optional(),
2890
+ // The scene's spatial layout. Absent/full_frame ⇒ one uncut shot (default path).
2891
+ // A layered layout (split_screen/pip/keyed_overlay) with regions ⇒ the scaffold
2892
+ // builds one clip per region and stacks/overlays them into the scene picture.
2893
+ composition: SceneCompositionSchema.optional(),
2894
+ // The capture "look" for this scene — selected from the ad-native shoot-mode
2895
+ // grammar (the CLI's scaffold/lib/shoot-modes.ts). When absent the scaffold
2896
+ // auto-derives a UGC/product mode; a human can override per scene by setting this.
2897
+ shoot_mode: z.string().optional(),
2898
+ // Diegetic ambient the clip's native audio should carry (no music). When
2899
+ // absent the scene falls back to its shoot mode's default ambience.
2900
+ ambient: z.string().optional(),
2901
+ camera_motion: CameraMotionSchema.optional(),
2902
+ start_frame_prompt: z.string().optional(),
2903
+ end_frame_prompt: z.string().optional(),
2904
+ motion_prompt: z.string().optional(),
2905
+ // The scene's role in the ad's persuasion arc (DECON-supplied); drives the
2906
+ // script re-craft checklist. Inferred from position when absent.
2907
+ narrative_role: z.string().optional(),
2908
+ // See `SceneRouteHint`.
2909
+ route_hint: z.enum(SCENE_ROUTE_HINTS).optional(),
2910
+ // DECON-supplied on the HOOK scene: the engineered physical/emotional state that
2911
+ // makes the first frame stop the scroll (sweaty/breathless/urgent …). Injected
2912
+ // into the hook's start-frame description so the generator renders that state,
2913
+ // not a calm influencer (CCA-11).
2914
+ hook_mechanic: z.object({ mechanic: z.string().optional(), why_it_stops_scroll: z.string().optional() }).loose().optional(),
2915
+ // DECON-supplied per-scene location (so a gym hook isn't flattened to "home").
2916
+ scene_setting: z.string().optional(),
2917
+ // How this scene cuts to the next (DECON-supplied). A recognized non-cut type
2918
+ // (fade/whip/zoom/dissolve/swipe) is reproduced as an ffmpeg xfade at the
2919
+ // boundary; cut/match_cut/none/other stay hard cuts. The last scene's value is
2920
+ // ignored (nothing follows it).
2921
+ transition_out: z.object({ type: z.string().optional(), description: z.string().optional() }).loose().optional(),
2922
+ dialogue: z.array(BlueprintDialogueLineSchema).optional(),
2923
+ sfx: z.array(SfxSchema).optional(),
2924
+ // Parsed element by element where they are read (`BlueprintOverlaySchema`,
2925
+ // `BlueprintFloatingElementSchema`), so one malformed graphic never rejects the scene.
2926
+ overlays: z.array(z.unknown()).optional(),
2927
+ floating_elements: z.array(z.unknown()).optional(),
2928
+ // DECON-supplied: how much the picture itself moves within the shot. Gates the
2929
+ // flash-hold optimization — a sub-2s b-roll flash with REAL subject motion
2930
+ // (pouring, spreading, hands working) must stay a real clip; freezing it turns
2931
+ // a montage into a slideshow. Absent (old blueprints) keeps the cheap still.
2932
+ motion_level: z.enum(["static", "subtle", "dynamic"]).optional(),
2933
+ transcript_slice: z.array(TranscriptWordSchema).optional(),
2934
+ start_frame_asset: FrameAssetSchema,
2935
+ end_frame_asset: FrameAssetSchema,
2936
+ // DECON-supplied: true when this scene is a length-split CONTINUATION of the
2937
+ // previous one (the SAME physical shot, broken up only because it exceeded the
2938
+ // clip ceiling). The scaffold then shares the splice keyframe — this scene's
2939
+ // start frame IS the previous scene's end frame — so the join is seamless.
2940
+ continues_previous: z.boolean().optional()
2941
+ }).loose();
2942
+ var VideoBlueprintSchema = z.object({
2943
+ source: z.object({ aspect_ratio: z.string().optional(), duration_s: z.number().optional() }).loose().optional(),
2944
+ global: z.object({
2945
+ music: z.object({
2946
+ present: z.boolean().optional(),
2947
+ music_prompt: z.string().optional(),
2948
+ // Absolute second the music enters in the reference (the bed often
2949
+ // kicks in mid-ad, after the hook). We start the regenerated track here
2950
+ // instead of at 0 so the timing matches.
2951
+ starts_at_s: z.number().optional(),
2952
+ // Populated by the deconstruct when AudD (Shazam-style) recognizes the
2953
+ // reference track. We never reuse it — only style the regenerated bed.
2954
+ identified_track: z.object({ title: z.string().optional(), artist: z.string().optional() }).loose().nullish()
2955
+ }).loose().optional(),
2956
+ cast: z.array(
2957
+ z.object({
2958
+ id: z.string().optional(),
2959
+ description: z.string().optional(),
2960
+ // The deconstruct's note on the target-market localization (e.g. "native
2961
+ // French speaker") — read to derive the spoken-track language code.
2962
+ market_localization_note: z.string().optional()
2963
+ }).loose()
2964
+ ).optional(),
2965
+ voiceover: z.object({
2966
+ // on_camera | mixed → mouths are on screen (lip-sync candidates);
2967
+ // voiceover | none → narration over the picture (no lip-sync).
2968
+ mode: z.string().optional(),
2969
+ // Which variety of the language the speech is in. Stated because the model
2970
+ // picks one otherwise: ads set in Spain came back in Latin American Spanish,
2971
+ // and the pinned peninsular voice could not undo it — the re-voicing is
2972
+ // speech-to-speech, so it carries the accent across and swaps only the timbre.
2973
+ accent: z.string().optional(),
2974
+ voice_description: z.string().optional(),
2975
+ persona: z.string().optional()
2976
+ }).loose().optional(),
2977
+ // Visual palette — read only to colour a clean brand-card/CTA plate (the
2978
+ // first hex is the dominant brand colour); never to drive frame generation.
2979
+ style: z.object({ palette: z.array(z.object({ hex: z.string().optional() }).loose()).optional() }).loose().optional(),
2980
+ // Written by `scaffold-ad` (the deconstruct names its own fields, e.g. `branding.brand_name`):
2981
+ // the whole script as one string, where the ad is set, and the brand it closes on.
2982
+ transcript: z.string().optional(),
2983
+ market: z.string().optional(),
2984
+ branding: z.object({ name: z.string().optional(), logo_path: z.string().optional() }).loose().optional()
2985
+ }).loose().optional(),
2986
+ // Written by `scaffold-ad`: what the beats add up to, so a short ad is caught before it renders.
2987
+ estimated_duration_s: z.number().optional(),
2988
+ scenes: z.array(VideoSceneSchema).min(1)
2989
+ }).loose();
2990
+ var OverlayStyleSchema = z.object({ color_hex: z.string().optional(), background: z.string().optional(), size: z.string().optional() }).loose();
2991
+ var BlueprintOverlaySchema = z.object({
2992
+ text: z.string().optional(),
2993
+ appears_at_s: z.number().optional(),
2994
+ duration_s: z.number().optional(),
2995
+ position: z.string().optional(),
2996
+ role: z.string().optional(),
2997
+ animation: z.string().optional(),
2998
+ animation_detail: z.string().optional(),
2999
+ style: OverlayStyleSchema.optional()
3000
+ }).loose();
3001
+ var BlueprintFloatingElementSchema = z.object({
3002
+ kind: z.string().optional(),
3003
+ description: z.string().optional(),
3004
+ brand_name: z.string().nullish(),
3005
+ what_it_represents: z.string().optional(),
3006
+ appears_at_s: z.number().optional(),
3007
+ duration_s: z.number().optional(),
3008
+ position: z.string().optional()
3009
+ }).loose();
3010
+
3011
+ export {
3012
+ AD_PLATFORMS,
3013
+ AD_PLACEMENTS,
3014
+ deliverySet,
3015
+ verticalCover,
3016
+ AD_FORMAT_PLATFORMS,
3017
+ platformFormats,
3018
+ resolveAdaptFormats,
3019
+ AD_DESCRIBE_FOCUS,
3020
+ AD_SELECT_SYSTEM,
3021
+ AD_SELECT_PROMPT,
3022
+ canonicalize,
3023
+ withoutCastName,
3024
+ frameRealismDirection,
3025
+ OPENROUTER_IMAGE_SIZES,
3026
+ SEEDANCE_DURATIONS,
3027
+ ELEVENLABS_OUTPUT_FORMATS,
3028
+ ELEVENLABS_MAX_TEXT_CHARS,
3029
+ ELEVENLABS_MAX_MUSIC_LENGTH_MS,
3030
+ IMAGE_GENERATE_MODELS,
3031
+ DEFAULT_IMAGE_GENERATE_MODEL,
3032
+ IMAGE_TIER_CREDITS,
3033
+ imagePictureCredits,
3034
+ VIDEO_GENERATE_MODELS,
3035
+ DEFAULT_VIDEO_GENERATE_MODEL,
3036
+ supportsReferenceToVideo,
3037
+ supportsLastFrame,
3038
+ MODEL_REGISTRY,
3039
+ canonicalModelId,
3040
+ modelIdsAccepted,
3041
+ MODEL_ROLES,
3042
+ AD_IMAGE_MODEL,
3043
+ REFERENCE_SHEET_MODEL,
3044
+ ASPECT_ADAPT_MODEL,
3045
+ PLATE_JUDGE_MODEL,
3046
+ AD_DESCRIBE_MODEL,
3047
+ BLUEPRINT_ANALYSIS_MODEL,
3048
+ VIEWER_CHECK_MODEL,
3049
+ CUSTOMER_INSIGHTS_MODEL,
3050
+ GLANCE_CHECK_MODEL,
3051
+ TEXT_BOX_READER_MODEL,
3052
+ VIDEO_DECONSTRUCT_MODEL,
3053
+ VOICEOVER_MODEL,
3054
+ SOUND_EFFECT_MODEL,
3055
+ MUSIC_BED_MODEL,
3056
+ VOICE_CONVERT_MODEL,
3057
+ isRegisteredModel,
3058
+ imageGenerateAspectRatios,
3059
+ supportsParam,
3060
+ DEFAULT_CLIP_DURATION_S,
3061
+ SPOKEN_WORDS_PER_SECOND,
3062
+ spokenWordsIn,
3063
+ SPOKEN_CLIP_DURATION_S,
3064
+ nearestClipDuration,
3065
+ clipAudioMode,
3066
+ clipDurationsFor,
3067
+ maxClipSeconds,
3068
+ splitScriptFor,
3069
+ promptMaxLength,
3070
+ maxInputSlot,
3071
+ maxInputReferences,
3072
+ bestSupportedQuality,
3073
+ supportedAspectRatios,
3074
+ nearestSupportedAspectRatio,
3075
+ nearestSupportedImageSize,
3076
+ estimateVideoCredits,
3077
+ DEFAULT_MUSIC_SECONDS,
3078
+ DEFAULT_SOUND_EFFECT_SECONDS,
3079
+ estimateNodeCredits,
3080
+ candidPersonPortraitPrompt,
3081
+ isManagedNodeKind,
3082
+ validateModelParams,
3083
+ validateModelInputs,
3084
+ VideoBlueprintSchema,
3085
+ BlueprintOverlaySchema,
3086
+ BlueprintFloatingElementSchema
3087
+ };
3088
+ //# sourceMappingURL=chunk-QK5PEHFX.js.map