@koda-sl/baker-cli 0.454.0-dev.67ad219ab → 0.454.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1293) hide show
  1. package/README.md +20 -19
  2. package/dist/account-F6MHQ64I.js +80 -0
  3. package/dist/account-HS7SDSEB.js +79 -0
  4. package/dist/account-IEVEOFIK.js +49 -0
  5. package/dist/account-writes-ISE4U2FQ.js +66 -0
  6. package/dist/accounts-3JKABIGU.js +77 -0
  7. package/dist/accounts-4CDRK4S4.js +75 -0
  8. package/dist/accounts-5QDKBZMH.js +115 -0
  9. package/dist/accounts-KYJO3JC6.js +114 -0
  10. package/dist/accounts-ZZONEKPU.js +611 -0
  11. package/dist/actions-VKHKHUUC.js +55 -0
  12. package/dist/active-entities-YUSOUR5M.js +103 -0
  13. package/dist/activities-ZVQOBHZH.js +74 -0
  14. package/dist/ad-group-writes-UU5NNKSO.js +170 -0
  15. package/dist/ad-groups-CGFXZNIA.js +68 -0
  16. package/dist/ad-writes-NALDYWOR.js +174 -0
  17. package/dist/add-53DDLTVG.js +104 -0
  18. package/dist/add-577QWMCF.js +97 -0
  19. package/dist/add-ATD4MBOO.js +302 -0
  20. package/dist/add-CUWAW7KG.js +105 -0
  21. package/dist/ads-6UEDYT3O.js +113 -0
  22. package/dist/ads-PV7GZXPR.js +77 -0
  23. package/dist/ads-QFAUJCWM.js +40 -0
  24. package/dist/adsets-Q5DWGANV.js +176 -0
  25. package/dist/advertisers-HYUASJAS.js +120 -0
  26. package/dist/advertisers-YMHPZYNF.js +111 -0
  27. package/dist/analytics-RQROMSQ3.js +433 -0
  28. package/dist/analytics-WLYXY5OT.js +1976 -0
  29. package/dist/analytics-WLYXY5OT.js.map +1 -0
  30. package/dist/animate-FWWHSYPL.js +480 -0
  31. package/dist/assign-7332DMG5.js +77 -0
  32. package/dist/audience-size-UYX5RPTA.js +94 -0
  33. package/dist/audiences-AMRFZRZ7.js +78 -0
  34. package/dist/audiences-HFRVIE2X.js +85 -0
  35. package/dist/audiences-VEKGLWBG.js +268 -0
  36. package/dist/audit-AD4ZZNJN.js +88 -0
  37. package/dist/audit-ZGTG7VRD.js +151 -0
  38. package/dist/autocomplete-LPG4WWTY.js +111 -0
  39. package/dist/avatars-HTQMIA2F.js +38 -0
  40. package/dist/bid-pricing-IK2C2IKE.js +99 -0
  41. package/dist/brand-3WCTQWWX.js +22 -0
  42. package/dist/brief-WDKTAKVA.js +477 -0
  43. package/dist/businesses-JBDQZZIG.js +53 -0
  44. package/dist/campaign-groups-6CJ45XMO.js +95 -0
  45. package/dist/campaign-writes-2MLRVFJK.js +165 -0
  46. package/dist/campaign-writes-SX52CJYW.js +170 -0
  47. package/dist/campaigns-D6B6Z67Y.js +110 -0
  48. package/dist/campaigns-DTH5ADA7.js +107 -0
  49. package/dist/campaigns-X3DPCCSN.js +76 -0
  50. package/dist/campaigns-ZVA7SUNN.js +109 -0
  51. package/dist/canvas-EJLQ27CK.js +46 -0
  52. package/dist/canvas-EJLQ27CK.js.map +1 -0
  53. package/dist/capabilities-VWJGP43K.js +144 -0
  54. package/dist/cards-4477BFEV.js +85 -0
  55. package/dist/catalog-BKQOAVR2.js +65 -0
  56. package/dist/catalogs-G3YEVG6S.js +128 -0
  57. package/dist/changes-TP7ZZHB3.js +135 -0
  58. package/dist/chatgpt-QNUN63YS.js +47 -0
  59. package/dist/chats-JOZKLOFU.js +262 -0
  60. package/dist/chunk-237WE5LX.js +455 -0
  61. package/dist/chunk-237WE5LX.js.map +1 -0
  62. package/dist/chunk-2BKVVCCV.js +133 -0
  63. package/dist/chunk-2TK4DEOE.js +74 -0
  64. package/dist/chunk-35XWJEWH.js +274 -0
  65. package/dist/chunk-3EUFAONS.js +5189 -0
  66. package/dist/chunk-3JCF3NK6.js +57 -0
  67. package/dist/chunk-3XPFBSD7.js +275 -0
  68. package/dist/chunk-3XPFBSD7.js.map +1 -0
  69. package/dist/chunk-4GOS37IA.js +382 -0
  70. package/dist/chunk-4JHUG6Y3.js +172 -0
  71. package/dist/chunk-4NDCTLI5.js +191 -0
  72. package/dist/chunk-4QEY2L6U.js +486 -0
  73. package/dist/chunk-54UVGFX3.js +440 -0
  74. package/dist/chunk-5PKB7LNI.js +23 -0
  75. package/dist/chunk-5RPU6KG5.js +6667 -0
  76. package/dist/chunk-5RPU6KG5.js.map +1 -0
  77. package/dist/chunk-5YGBRHO6.js +96 -0
  78. package/dist/chunk-5Z2KSVIV.js +67 -0
  79. package/dist/chunk-6B7VKFS4.js +172 -0
  80. package/dist/chunk-6G5K6ZC6.js +46 -0
  81. package/dist/chunk-6QJLVNGU.js +541 -0
  82. package/dist/chunk-75FDTDLH.js +96 -0
  83. package/dist/chunk-7OFNN4CT.js +58 -0
  84. package/dist/chunk-7ZHMGXE2.js +819 -0
  85. package/dist/chunk-BBDAVFTG.js +3153 -0
  86. package/dist/chunk-BBDAVFTG.js.map +1 -0
  87. package/dist/chunk-BNCW67EM.js +534 -0
  88. package/dist/chunk-C6U6UDHJ.js +106 -0
  89. package/dist/chunk-CHSNHVYF.js +3182 -0
  90. package/dist/chunk-CHSNHVYF.js.map +1 -0
  91. package/dist/chunk-D76QEIFG.js +207 -0
  92. package/dist/chunk-DGPLXY37.js +103 -0
  93. package/dist/chunk-DTD2IRDA.js +149 -0
  94. package/dist/chunk-DTD2IRDA.js.map +1 -0
  95. package/dist/chunk-DZSIUEGH.js +136 -0
  96. package/dist/chunk-E6KL5ZRN.js +455 -0
  97. package/dist/chunk-EFSYTROP.js +94 -0
  98. package/dist/chunk-EKCPMVZ3.js +175 -0
  99. package/dist/chunk-EUFCY63X.js +6178 -0
  100. package/dist/chunk-EUFCY63X.js.map +1 -0
  101. package/dist/chunk-F2S5BLPE.js +97 -0
  102. package/dist/chunk-F4CUV4FV.js +509 -0
  103. package/dist/chunk-G7HYW5TH.js +304 -0
  104. package/dist/chunk-GX6VAHY7.js +830 -0
  105. package/dist/chunk-H26L3OQY.js +42 -0
  106. package/dist/chunk-HQSCJYZO.js +26 -0
  107. package/dist/chunk-HRYOZUSK.js +1711 -0
  108. package/dist/chunk-HTW7FTP4.js +45 -0
  109. package/dist/chunk-HTW7FTP4.js.map +1 -0
  110. package/dist/chunk-IFWP3ZDO.js +215 -0
  111. package/dist/chunk-IFWP3ZDO.js.map +1 -0
  112. package/dist/chunk-JERXV5A3.js +26 -0
  113. package/dist/chunk-JYWZRDLZ.js +297 -0
  114. package/dist/chunk-K46X77UI.js +51 -0
  115. package/dist/chunk-KFE3S63W.js +1441 -0
  116. package/dist/chunk-KLBTXETO.js +23992 -0
  117. package/dist/chunk-KLBTXETO.js.map +1 -0
  118. package/dist/chunk-KLNKEVIY.js +136 -0
  119. package/dist/chunk-KNY76UGC.js +84 -0
  120. package/dist/chunk-KQTYTCKQ.js +98 -0
  121. package/dist/chunk-KRZV6VS2.js +19 -0
  122. package/dist/chunk-KS2QY6MK.js +139 -0
  123. package/dist/chunk-L27H2R2N.js +174 -0
  124. package/dist/chunk-LERTEZST.js +28 -0
  125. package/dist/chunk-LF2PIA67.js +159 -0
  126. package/dist/chunk-LLOOWRBB.js +496 -0
  127. package/dist/chunk-LS5MTRFI.js +106 -0
  128. package/dist/chunk-LYBXCXJB.js +160 -0
  129. package/dist/chunk-M4G3NKDB.js +197 -0
  130. package/dist/chunk-MM22NUA6.js +169 -0
  131. package/dist/chunk-MM5XO4MP.js +433 -0
  132. package/dist/chunk-MZ3SJ6FV.js +310 -0
  133. package/dist/chunk-MZL4H5PY.js +225 -0
  134. package/dist/chunk-NAWWC5I3.js +454 -0
  135. package/dist/chunk-NAWWC5I3.js.map +1 -0
  136. package/dist/chunk-NU7JSWVA.js +946 -0
  137. package/dist/chunk-PBA3YCZA.js +76 -0
  138. package/dist/chunk-PROV2XDR.js +592 -0
  139. package/dist/chunk-PWGWMIIJ.js +25 -0
  140. package/dist/chunk-PZ7EPJRF.js +60 -0
  141. package/dist/chunk-QSN5MZGS.js +74 -0
  142. package/dist/chunk-QZOS6FXW.js +206 -0
  143. package/dist/chunk-RNDPEHCH.js +337 -0
  144. package/dist/chunk-RX6F3GEA.js +610 -0
  145. package/dist/chunk-STIB5DR5.js +56 -0
  146. package/dist/chunk-T4DD5YMP.js +166 -0
  147. package/dist/chunk-TD2P4HBP.js +55 -0
  148. package/dist/chunk-TJFELVYS.js +92 -0
  149. package/dist/chunk-ULJ5RFOV.js +76 -0
  150. package/dist/chunk-VAJBWA2U.js +75 -0
  151. package/dist/chunk-VB6WJJR3.js +1830 -0
  152. package/dist/chunk-VFIOJD5M.js +309 -0
  153. package/dist/chunk-VVZBBKRC.js +296 -0
  154. package/dist/chunk-W3B4BHQU.js +31 -0
  155. package/dist/chunk-WNFIJAUO.js +98 -0
  156. package/dist/chunk-WS2GMOSG.js +74 -0
  157. package/dist/chunk-WTOYCUKH.js +84 -0
  158. package/dist/chunk-X7ZODEXJ.js +36 -0
  159. package/dist/chunk-X7ZODEXJ.js.map +1 -0
  160. package/dist/chunk-XBOK23HI.js +214 -0
  161. package/dist/chunk-XL3BMSYG.js +125 -0
  162. package/dist/chunk-XX53CHKP.js +346 -0
  163. package/dist/chunk-XXHMVDLL.js +1079 -0
  164. package/dist/chunk-XXHMVDLL.js.map +1 -0
  165. package/dist/chunk-YBMVHGY3.js +333 -0
  166. package/dist/chunk-YIWXHIVZ.js +111 -0
  167. package/dist/chunk-YKFEHWHC.js +188 -0
  168. package/dist/chunk-YTNJODFK.js +494 -0
  169. package/dist/chunk-Z6XEMPOZ.js +363 -0
  170. package/dist/chunk-ZIHEIVJC.js +4410 -0
  171. package/dist/chunk-ZIHEIVJC.js.map +1 -0
  172. package/dist/chunk-ZWKPXWS5.js +622 -0
  173. package/dist/chunk-ZZQXVYUY.js +66 -0
  174. package/dist/claim-ITPOQ2I7.js +197 -0
  175. package/dist/cli.js +37 -40
  176. package/dist/cli.js.map +1 -1
  177. package/dist/client-VHN32ZRE.js +19 -0
  178. package/dist/code-YS6ZMGX3.js +76 -0
  179. package/dist/companies-Y5HPLJF5.js +195 -0
  180. package/dist/complete-SRXMUS4R.js +81 -0
  181. package/dist/config-CQN5FHMZ.js +88 -0
  182. package/dist/connect-CRHMP3NK.js +42 -0
  183. package/dist/content-3ZPP4SW2.js +81 -0
  184. package/dist/conversation-BBOPGOMH.js +93 -0
  185. package/dist/conversion-report-N4HANYOB.js +125 -0
  186. package/dist/conversion-upload-command-AUF3LNTH.js +438 -0
  187. package/dist/conversion-writes-LW4HQKK5.js +120 -0
  188. package/dist/conversions-DH3Q6UTJ.js +135 -0
  189. package/dist/conversions-TS723AZV.js +76 -0
  190. package/dist/countries-ESAKTQAE.js +82 -0
  191. package/dist/create-CW5E5Y2S.js +59 -0
  192. package/dist/create-HOIUANHB.js +207 -0
  193. package/dist/create-M7TK4QUC.js +235 -0
  194. package/dist/create-ZWSKHSPD.js +130 -0
  195. package/dist/creatives-LLWNKS47.js +51 -0
  196. package/dist/creatives-QQZNCA6V.js +182 -0
  197. package/dist/creatives-UEPLNCPN.js +87 -0
  198. package/dist/credentials-CFKCUDES.js +1055 -0
  199. package/dist/credentials-CFKCUDES.js.map +1 -0
  200. package/dist/critique-AQDXRULE.js +213 -0
  201. package/dist/critique-ORSUUTHE.js +1449 -0
  202. package/dist/crm-EPSZEOD2.js +318 -0
  203. package/dist/crm-WNFEWAAM.js +224 -0
  204. package/dist/crop-2J4RKJ6B.js +113 -0
  205. package/dist/currency-XCGKQ7FE.js +88 -0
  206. package/dist/custom-conversions-2VLJGPRV.js +125 -0
  207. package/dist/customers-NZDE7V3P.js +56 -0
  208. package/dist/delete-3AV3ARMX.js +71 -0
  209. package/dist/delete-6RAKC62Z.js +66 -0
  210. package/dist/delete-7HMQBDFC.js +54 -0
  211. package/dist/delete-A5XD52K4.js +69 -0
  212. package/dist/delete-FKXR5ZOP.js +63 -0
  213. package/dist/delete-MRM2S4Z5.js +71 -0
  214. package/dist/demographics-PRZS2ZC4.js +138 -0
  215. package/dist/describe-6NVOWIBE.js +97 -0
  216. package/dist/describe-P3PPIQME.js +97 -0
  217. package/dist/dimensions-EYAYO27I.js +101 -0
  218. package/dist/discard-YLTMCFE6.js +66 -0
  219. package/dist/discover-BJPZNXUQ.js +172 -0
  220. package/dist/domain-Z533IR5M.js +98 -0
  221. package/dist/download-7T6HIJKD.js +299 -0
  222. package/dist/draft-3ZVCQSAG.js +103 -0
  223. package/dist/draft-4PURIMDM.js +217 -0
  224. package/dist/draft-5YAYCEYY.js +107 -0
  225. package/dist/draft-7ZWPABVG.js +306 -0
  226. package/dist/draft-KIBMVKSR.js +100 -0
  227. package/dist/draft-THPZFASM.js +281 -0
  228. package/dist/draft-YDY2Q2K6.js +233 -0
  229. package/dist/draft-ZXZEQRCL.js +328 -0
  230. package/dist/engine/index.js +14 -14
  231. package/dist/env-KIP2J2UB.js +43 -0
  232. package/dist/experiment-PYQPAZZN.js +1397 -0
  233. package/dist/experiment-PYQPAZZN.js.map +1 -0
  234. package/dist/export-JQRMBJ7D.js +168 -0
  235. package/dist/extract-7QKLME7Z.js +113 -0
  236. package/dist/facets-453OFMAM.js +114 -0
  237. package/dist/favorites-NSGF4OV5.js +178 -0
  238. package/dist/feed-RV4KPPXM.js +157 -0
  239. package/dist/feedback-JFV6BMJW.js +66 -0
  240. package/dist/feedback-record-HCOBRTY2.js +175 -0
  241. package/dist/fetch-44PPB6UO.js +176 -0
  242. package/dist/fetch-XF76JABV.js +139 -0
  243. package/dist/find-FRRHAPWX.js +134 -0
  244. package/dist/fit-7237F5EB.js +45 -0
  245. package/dist/flows-N7UZ4ZO5.js +247 -0
  246. package/dist/follow-FN7LV3WV.js +82 -0
  247. package/dist/follow-competitors-MKXFHLXB.js +131 -0
  248. package/dist/following-RKC2FLHI.js +109 -0
  249. package/dist/fonts-YW7SU5EY.js +34 -0
  250. package/dist/forecast-W57WFVDL.js +104 -0
  251. package/dist/funding-NYO65IMT.js +85 -0
  252. package/dist/funnel-VW542JTE.js +394 -0
  253. package/dist/funnel-VW542JTE.js.map +1 -0
  254. package/dist/ga4-DV2AXCSL.js +55 -0
  255. package/dist/generate-MMBYB44G.js +262 -0
  256. package/dist/get-2NA3LPCN.js +78 -0
  257. package/dist/get-3L6W3E3T.js +59 -0
  258. package/dist/get-6WEYKOY6.js +63 -0
  259. package/dist/get-MEGPYKQR.js +56 -0
  260. package/dist/get-P743RPSI.js +63 -0
  261. package/dist/get-XN5ZGDIK.js +61 -0
  262. package/dist/get-YIHTAMRT.js +92 -0
  263. package/dist/gif-53ULFVLR.js +94 -0
  264. package/dist/google-M7KEXVK5.js +1872 -0
  265. package/dist/google-QYYYSSXI.js +136 -0
  266. package/dist/google-ads-G2XD4RMT.js +195 -0
  267. package/dist/group-EFZ3AJIE.js +43 -0
  268. package/dist/group-GKWCCX66.js +43 -0
  269. package/dist/gsc-TAKOF7J5.js +30 -0
  270. package/dist/history-DBIEYQHY.js +67 -0
  271. package/dist/history-RCKMMUWI.js +133 -0
  272. package/dist/hubspot-CKS7F77W.js +779 -0
  273. package/dist/icon-L4RSS6PZ.js +137 -0
  274. package/dist/ideas-EYC6K33G.js +32 -0
  275. package/dist/images-2HJ7YKTH.js +90 -0
  276. package/dist/improve-BCCU5AS6.js +86 -0
  277. package/dist/ingest-26O5Q462.js +23 -0
  278. package/dist/ingest-RR5GAX3G.js +107 -0
  279. package/dist/insights-NZWSJKU4.js +423 -0
  280. package/dist/insights-ZIU6FJMS.js +122 -0
  281. package/dist/inspect-XPDUPSUP.js +189 -0
  282. package/dist/inspiration-S3DU4CMQ.js +53 -0
  283. package/dist/intent-E3UIVZBN.js +95 -0
  284. package/dist/job-L7RJZMSG.js +202 -0
  285. package/dist/job-create-JUDAN52O.js +109 -0
  286. package/dist/job-status-U43WE3RJ.js +74 -0
  287. package/dist/keep-55CPC7DG.js +78 -0
  288. package/dist/keyword-gap-BG6M665A.js +130 -0
  289. package/dist/keyword-metrics-KOPXTILA.js +197 -0
  290. package/dist/keywords-for-site-PONNELI5.js +128 -0
  291. package/dist/landing-RYRZ5VZ2.js +28 -0
  292. package/dist/languages-HORKPDNH.js +40 -0
  293. package/dist/languages-JSGWCC7Z.js +55 -0
  294. package/dist/layerize-RPD6SNP6.js +190 -0
  295. package/dist/leads-ARUWPHBM.js +293 -0
  296. package/dist/leads-R7YSJDIG.js +90 -0
  297. package/dist/learn-IZ6QKTCX.js +203 -0
  298. package/dist/library-ARKRLCNJ.js +109 -0
  299. package/dist/lighthouse-6ZC45E53.js +75 -0
  300. package/dist/line-item-writes-25FE22UX.js +208 -0
  301. package/dist/line-items-V522VKSU.js +103 -0
  302. package/dist/link-ZZZVDSUP.js +64 -0
  303. package/dist/linkedin-HXLYJVGI.js +1008 -0
  304. package/dist/list-7MVBXOJT.js +51 -0
  305. package/dist/list-A5UCIR2J.js +65 -0
  306. package/dist/list-AL7N6X2P.js +50 -0
  307. package/dist/list-HSXOTG5R.js +151 -0
  308. package/dist/list-KYEK3N34.js +303 -0
  309. package/dist/list-LI4OGQFW.js +57 -0
  310. package/dist/list-LKHHCQZU.js +63 -0
  311. package/dist/list-P7NAFN6J.js +76 -0
  312. package/dist/locations-74TPQWAT.js +67 -0
  313. package/dist/locations-J4G5RNPH.js +40 -0
  314. package/dist/log-6ELXS5EJ.js +92 -0
  315. package/dist/logo-Q5D7PZY6.js +18 -0
  316. package/dist/lookup-TCU2ZEZW.js +22 -0
  317. package/dist/make-2PV4B2TT.js +596 -0
  318. package/dist/make-2PV4B2TT.js.map +1 -0
  319. package/dist/map-SJLRAB5X.js +404 -0
  320. package/dist/map-SJLRAB5X.js.map +1 -0
  321. package/dist/mcp-W7DBSUF7.js +476 -0
  322. package/dist/media-53DJRC4N.js +15 -0
  323. package/dist/media-6CQYG4UY.js +89 -0
  324. package/dist/media-sources-M35YZQY5.js +32 -0
  325. package/dist/members-QXYMJQWU.js +44 -0
  326. package/dist/meta-A7KM6TF5.js +69 -0
  327. package/dist/metrics-SQDJ5NQO.js +152 -0
  328. package/dist/models-7U3GRYHF.js +155 -0
  329. package/dist/normalize-DYJLUBQP.js +141 -0
  330. package/dist/normalize-ICQF2AST.js +806 -0
  331. package/dist/options-77SHB5KA.js +121 -0
  332. package/dist/output-RAH3TSIL.js +24 -0
  333. package/dist/page-GS3WLT2C.js +105 -0
  334. package/dist/pages-FXYQLHSJ.js +66 -0
  335. package/dist/performance-VVTYUSTW.js +24 -0
  336. package/dist/pinterest-AUH7WBA7.js +96 -0
  337. package/dist/pixels-45A55MOP.js +60 -0
  338. package/dist/pixels-ZFF4BGUH.js +108 -0
  339. package/dist/plan-4QP2G7GV.js +207 -0
  340. package/dist/plan-4QP2G7GV.js.map +1 -0
  341. package/dist/preview-AD4GKYIA.js +169 -0
  342. package/dist/promoted-tweet-writes-QP37NMQC.js +180 -0
  343. package/dist/promoted-tweets-WPSM6MGX.js +119 -0
  344. package/dist/properties-L2XIYQDS.js +101 -0
  345. package/dist/publish-YF6ESBGQ.js +322 -0
  346. package/dist/query-IEZRY6HV.js +1341 -0
  347. package/dist/query-SGGBCHTF.js +236 -0
  348. package/dist/query-VTGVZQIO.js +247 -0
  349. package/dist/questionnaire-J56AATOX.js +93 -0
  350. package/dist/questionnaire-J56AATOX.js.map +1 -0
  351. package/dist/read-G5AC332V.js +141 -0
  352. package/dist/read-G5AC332V.js.map +1 -0
  353. package/dist/reddit-VC3IOFNC.js +26 -0
  354. package/dist/refresh-UXBCTVCG.js +94 -0
  355. package/dist/release-PP5S5QHD.js +60 -0
  356. package/dist/relevant-pages-OWMNUCP7.js +99 -0
  357. package/dist/remove-6LGGKMLJ.js +48 -0
  358. package/dist/remove-OUWQ7NPN.js +50 -0
  359. package/dist/reopen-KXAM5LVX.js +63 -0
  360. package/dist/rerun-ZVFP4FNN.js +85 -0
  361. package/dist/research-52CURSLR.js +262 -0
  362. package/dist/research-WEW3TISC.js +62 -0
  363. package/dist/reset-MVLV7GEB.js +54 -0
  364. package/dist/reset-RBL2NSDV.js +54 -0
  365. package/dist/resolve-JG3TGLCR.js +121 -0
  366. package/dist/retry-2B3V4CJO.js +60 -0
  367. package/dist/retry-Y3VUKOZ3.js +62 -0
  368. package/dist/retry-failed-6HXPUVXJ.js +45 -0
  369. package/dist/run-3BCAHPCW.js +65 -0
  370. package/dist/run-FZL7FYTL.js +60 -0
  371. package/dist/scaffold-ad-TL5URKZF.js +1549 -0
  372. package/dist/scaffold-static-ad-PN6RR3IP.js +966 -0
  373. package/dist/scaffold-static-ad-PN6RR3IP.js.map +1 -0
  374. package/dist/scaffold-video-LRTELU5X.js +873 -0
  375. package/dist/schedule-7QLWW5HA.js +61 -0
  376. package/dist/schedule-O2K6M43V.js +66 -0
  377. package/dist/scheduled-agents-HDALX27W.js +49 -0
  378. package/dist/schema-6GR77VJG.js +63 -0
  379. package/dist/schema-EY3Y3KFB.js +132 -0
  380. package/dist/scrape-ETAMW43A.js +2241 -0
  381. package/dist/screenshot-YCQF25ZB.js +102 -0
  382. package/dist/search-4XS7AO5R.js +174 -0
  383. package/dist/search-742XSULP.js +224 -0
  384. package/dist/search-MEEM4D3W.js +92 -0
  385. package/dist/search-OQNGSMUH.js +91 -0
  386. package/dist/search-UO5KJTYS.js +26 -0
  387. package/dist/seeds-N6FF5S4T.js +101 -0
  388. package/dist/select-J3QVFWVE.js +94 -0
  389. package/dist/sends-WGJVQUMF.js +309 -0
  390. package/dist/sequences-OIPVR7JL.js +146 -0
  391. package/dist/set-prompt-MEMSZEZK.js +186 -0
  392. package/dist/setup-links-4PCSBEJD.js +141 -0
  393. package/dist/shared-HJDFNID4.js +31 -0
  394. package/dist/site-IG62FRYT.js +177 -0
  395. package/dist/sitemaps-POPZJTAX.js +87 -0
  396. package/dist/sites-262H6LM4.js +101 -0
  397. package/dist/skills-6TQZLIMP.js +47 -0
  398. package/dist/sources-5YFONIJP.js +30 -0
  399. package/dist/sources-AM7SIZUY.js +421 -0
  400. package/dist/stale-UMI4XCKX.js +63 -0
  401. package/dist/stats-NNXZMPZR.js +34 -0
  402. package/dist/status-F4XMET7U.js +62 -0
  403. package/dist/sticker-4KMBSMP5.js +94 -0
  404. package/dist/stock-KXJ26BY4.js +179 -0
  405. package/dist/studio-EKIPLLHD.js +49 -0
  406. package/dist/sync-CF7FVUQJ.js +54 -0
  407. package/dist/sync-LXYAJ7SU.js +54 -0
  408. package/dist/sync-ZSNUBYPM.js +265 -0
  409. package/dist/sync-definition-WU6V5245.js +53 -0
  410. package/dist/tag-manager-JAAMOUGB.js +43 -0
  411. package/dist/tags-6WV3PQH5.js +20 -0
  412. package/dist/tags-FTOD6CYS.js +20 -0
  413. package/dist/tags-KXNOWUMN.js +224 -0
  414. package/dist/tags-PJRNCPQJ.js +20 -0
  415. package/dist/tags-R5JCZRAV.js +26 -0
  416. package/dist/targeting-constants-XJ2VOW7K.js +118 -0
  417. package/dist/targeting-criteria-HJ7YFAB2.js +113 -0
  418. package/dist/targets-RLZSBUCI.js +102 -0
  419. package/dist/templates-4SWUBLOC.js +178 -0
  420. package/dist/testimonials-YYLALSV4.js +32 -0
  421. package/dist/top-companies-SNOQQFUS.js +108 -0
  422. package/dist/translate-CZRVAEUQ.js +598 -0
  423. package/dist/triggers-MFDFO2Y4.js +141 -0
  424. package/dist/tweets-ATP3FQAC.js +123 -0
  425. package/dist/unfollow-CBVPGPF7.js +46 -0
  426. package/dist/unlink-BVDKP7VQ.js +67 -0
  427. package/dist/unstage-V7GMMOWR.js +95 -0
  428. package/dist/unstage-ZTOQEWRC.js +84 -0
  429. package/dist/update-R46SJ55S.js +155 -0
  430. package/dist/update-R572VWKO.js +142 -0
  431. package/dist/update-SQEWFFFG.js +98 -0
  432. package/dist/update-VVK6SWSI.js +63 -0
  433. package/dist/upload-L5SYZB3X.js +150 -0
  434. package/dist/upload-TUYWMS6E.js +126 -0
  435. package/dist/upscale-YWRLFU22.js +109 -0
  436. package/dist/url-options-GGXAL3J4.js +127 -0
  437. package/dist/url-params-CU3KVLI5.js +98 -0
  438. package/dist/use-UT2DIZOG.js +95 -0
  439. package/dist/validate-WPJXPGWS.js +89 -0
  440. package/dist/variant-FLZJYGYL.js +338 -0
  441. package/dist/videos-KGNLYRUS.js +39 -0
  442. package/dist/view-NPAG66QK.js +121 -0
  443. package/dist/viewer-check-45T2HLAH.js +69 -0
  444. package/dist/web-IEJBIF7U.js +140 -0
  445. package/dist/winners-I5BMATJZ.js +79 -0
  446. package/dist/winning-ads-GGQ3DZXX.js +62 -0
  447. package/dist/winning-ads-GGQ3DZXX.js.map +1 -0
  448. package/dist/write-commands-CT74VHH6.js +737 -0
  449. package/dist/write-commands-CXRXLXX2.js +1015 -0
  450. package/dist/write-commands-VWSLDBPT.js +206 -0
  451. package/dist/write-commands-WTRSOSO3.js +713 -0
  452. package/dist/x-WHE6PSDD.js +47 -0
  453. package/package.json +1 -1
  454. package/dist/account-BENZTU54.js +0 -79
  455. package/dist/account-TJPJXX5L.js +0 -80
  456. package/dist/account-WOEYURTR.js +0 -49
  457. package/dist/account-writes-QLHQ6QRN.js +0 -66
  458. package/dist/accounts-CIYRAWVY.js +0 -114
  459. package/dist/accounts-EKYHTEL5.js +0 -611
  460. package/dist/accounts-ILE6LUH2.js +0 -115
  461. package/dist/accounts-MZXNJ4FY.js +0 -75
  462. package/dist/accounts-RVRE3XSZ.js +0 -77
  463. package/dist/actions-SE4RT5VJ.js +0 -55
  464. package/dist/active-entities-NNSRMERA.js +0 -103
  465. package/dist/activities-IOIEQTVH.js +0 -74
  466. package/dist/ad-group-writes-TQCKLL34.js +0 -170
  467. package/dist/ad-groups-LZWSLBC5.js +0 -68
  468. package/dist/ad-writes-UH2WTTGA.js +0 -174
  469. package/dist/add-AYKM57Z4.js +0 -97
  470. package/dist/add-IBRKJ3YA.js +0 -302
  471. package/dist/add-IKO6F33F.js +0 -104
  472. package/dist/add-VHJNMLIZ.js +0 -105
  473. package/dist/ads-6GT5744J.js +0 -113
  474. package/dist/ads-QFCFTASQ.js +0 -40
  475. package/dist/ads-RJNNP6XJ.js +0 -77
  476. package/dist/adsets-XG64ZCJY.js +0 -176
  477. package/dist/advertisers-MWTH3NR4.js +0 -120
  478. package/dist/advertisers-XVGBLKB3.js +0 -111
  479. package/dist/analytics-M2YUE6P3.js +0 -433
  480. package/dist/analytics-YC2J5RTR.js +0 -1958
  481. package/dist/analytics-YC2J5RTR.js.map +0 -1
  482. package/dist/animate-RC3ZBLLZ.js +0 -480
  483. package/dist/assign-6MIMTPG6.js +0 -77
  484. package/dist/audience-size-LG3EJVUQ.js +0 -94
  485. package/dist/audiences-CDQPFZOH.js +0 -78
  486. package/dist/audiences-FEP7LYRA.js +0 -85
  487. package/dist/audiences-H3RVGETG.js +0 -268
  488. package/dist/audit-65M7ZYPF.js +0 -88
  489. package/dist/audit-NLSSM2KK.js +0 -151
  490. package/dist/autocomplete-FWTUDPDJ.js +0 -111
  491. package/dist/avatars-HSU7KUT3.js +0 -38
  492. package/dist/bid-pricing-SDJGBZQI.js +0 -99
  493. package/dist/brand-4E7GKZYV.js +0 -22
  494. package/dist/brief-2YLVLL3Q.js +0 -477
  495. package/dist/businesses-PJGOECA7.js +0 -53
  496. package/dist/campaign-groups-J3ZLWO6K.js +0 -95
  497. package/dist/campaign-writes-PIOQVLAI.js +0 -170
  498. package/dist/campaign-writes-UGUL5EDR.js +0 -165
  499. package/dist/campaigns-6ARLQJU2.js +0 -109
  500. package/dist/campaigns-IZZ4FCHQ.js +0 -110
  501. package/dist/campaigns-PFNTJHMX.js +0 -107
  502. package/dist/campaigns-ZU7FMRQ3.js +0 -76
  503. package/dist/canvas-EOHG44TK.js +0 -46
  504. package/dist/canvas-EOHG44TK.js.map +0 -1
  505. package/dist/capabilities-K3DVPGYB.js +0 -144
  506. package/dist/cards-PS3VNNX3.js +0 -85
  507. package/dist/catalog-O5U2VMKK.js +0 -65
  508. package/dist/catalogs-ALSH4R2K.js +0 -128
  509. package/dist/changes-KFQKVM3M.js +0 -135
  510. package/dist/chatgpt-NHGFCJYH.js +0 -47
  511. package/dist/chats-YRRTFHKK.js +0 -262
  512. package/dist/chunk-2ACGDQ2P.js +0 -225
  513. package/dist/chunk-33F4O6OO.js +0 -296
  514. package/dist/chunk-3ASE4O2H.js +0 -111
  515. package/dist/chunk-3J62OINP.js +0 -310
  516. package/dist/chunk-3REUG4QF.js +0 -94
  517. package/dist/chunk-3XZEAI7E.js +0 -5189
  518. package/dist/chunk-4BIU2YVF.js +0 -274
  519. package/dist/chunk-4CYUOGDC.js +0 -496
  520. package/dist/chunk-52KJDURD.js +0 -174
  521. package/dist/chunk-5BQCBI2G.js +0 -214
  522. package/dist/chunk-5J5NHV3X.js +0 -486
  523. package/dist/chunk-5SAQ7MNN.js +0 -92
  524. package/dist/chunk-5TYFAJY4.js +0 -275
  525. package/dist/chunk-5TYFAJY4.js.map +0 -1
  526. package/dist/chunk-5WW456MW.js +0 -948
  527. package/dist/chunk-63VMGEZI.js +0 -172
  528. package/dist/chunk-6C3ADYIW.js +0 -440
  529. package/dist/chunk-6K47VIWF.js +0 -67
  530. package/dist/chunk-6TDEGWZJ.js +0 -75
  531. package/dist/chunk-6TQHA2UF.js +0 -1441
  532. package/dist/chunk-7GZNYQ3Z.js +0 -197
  533. package/dist/chunk-7P2Y7OQF.js +0 -136
  534. package/dist/chunk-A7F3C6AJ.js +0 -215
  535. package/dist/chunk-A7F3C6AJ.js.map +0 -1
  536. package/dist/chunk-AW2UE5AI.js +0 -125
  537. package/dist/chunk-B7COZ237.js +0 -96
  538. package/dist/chunk-BDI5INZA.js +0 -610
  539. package/dist/chunk-BFBTBN66.js +0 -830
  540. package/dist/chunk-BPQARCYW.js +0 -382
  541. package/dist/chunk-CAMX6OHF.js +0 -3182
  542. package/dist/chunk-CAMX6OHF.js.map +0 -1
  543. package/dist/chunk-CEYPS4IS.js +0 -4383
  544. package/dist/chunk-CEYPS4IS.js.map +0 -1
  545. package/dist/chunk-CWW5ITFK.js +0 -309
  546. package/dist/chunk-DMA7XZLS.js +0 -175
  547. package/dist/chunk-DTKZEXIF.js +0 -191
  548. package/dist/chunk-E25X7QES.js +0 -106
  549. package/dist/chunk-E7GYHNQO.js +0 -56
  550. package/dist/chunk-EDU6N5NY.js +0 -57
  551. package/dist/chunk-EMLKO3AU.js +0 -58
  552. package/dist/chunk-EOIYM35Z.js +0 -188
  553. package/dist/chunk-F4IQVOOJ.js +0 -494
  554. package/dist/chunk-GLPKJMMO.js +0 -28
  555. package/dist/chunk-GLRM72PT.js +0 -84
  556. package/dist/chunk-H4VPQQN7.js +0 -106
  557. package/dist/chunk-HNBLXWWQ.js +0 -26
  558. package/dist/chunk-IDYAVGCS.js +0 -6291
  559. package/dist/chunk-IDYAVGCS.js.map +0 -1
  560. package/dist/chunk-II7LSCAH.js +0 -160
  561. package/dist/chunk-ITQWQINC.js +0 -206
  562. package/dist/chunk-IY3JSASS.js +0 -455
  563. package/dist/chunk-JCUKNC4M.js +0 -141
  564. package/dist/chunk-JCUKNC4M.js.map +0 -1
  565. package/dist/chunk-JFMMCONZ.js +0 -23
  566. package/dist/chunk-JGCYENVG.js +0 -23992
  567. package/dist/chunk-JGCYENVG.js.map +0 -1
  568. package/dist/chunk-JGST7KMB.js +0 -139
  569. package/dist/chunk-JIB3JWL7.js +0 -363
  570. package/dist/chunk-JTFZ5M3C.js +0 -74
  571. package/dist/chunk-JXOPTOVM.js +0 -42
  572. package/dist/chunk-K45KDAV7.js +0 -98
  573. package/dist/chunk-KFHLUX6M.js +0 -541
  574. package/dist/chunk-KKRN7XRQ.js +0 -60
  575. package/dist/chunk-KKT24G5X.js +0 -20
  576. package/dist/chunk-KKT24G5X.js.map +0 -1
  577. package/dist/chunk-KVHZLRNU.js +0 -51
  578. package/dist/chunk-L2ZNZSPV.js +0 -55
  579. package/dist/chunk-L4C4OPO2.js +0 -31
  580. package/dist/chunk-LAHBXTKI.js +0 -297
  581. package/dist/chunk-LX2VM245.js +0 -74
  582. package/dist/chunk-MJYRLGGI.js +0 -304
  583. package/dist/chunk-NJY65ACF.js +0 -76
  584. package/dist/chunk-NPW3LEAE.js +0 -172
  585. package/dist/chunk-NXJSPLN5.js +0 -3147
  586. package/dist/chunk-NXJSPLN5.js.map +0 -1
  587. package/dist/chunk-ODMRAEEP.js +0 -159
  588. package/dist/chunk-P5T7OZKV.js +0 -26
  589. package/dist/chunk-PLMHZLJ6.js +0 -346
  590. package/dist/chunk-Q4U3ENKF.js +0 -1830
  591. package/dist/chunk-Q5KR4RRB.js +0 -207
  592. package/dist/chunk-RASBZ6SN.js +0 -103
  593. package/dist/chunk-RE6ZIHDH.js +0 -819
  594. package/dist/chunk-RNHSGH44.js +0 -84
  595. package/dist/chunk-S2IOUC5B.js +0 -1711
  596. package/dist/chunk-S5MBDWB3.js +0 -98
  597. package/dist/chunk-SCG3FY3H.js +0 -96
  598. package/dist/chunk-SLE4FEFP.js +0 -592
  599. package/dist/chunk-TIL76IDK.js +0 -136
  600. package/dist/chunk-TQO6WNUH.js +0 -166
  601. package/dist/chunk-UK4DUS6I.js +0 -52
  602. package/dist/chunk-UK4DUS6I.js.map +0 -1
  603. package/dist/chunk-UOFHTLPD.js +0 -433
  604. package/dist/chunk-UXQ4YQ2O.js +0 -66
  605. package/dist/chunk-V4YMBLWX.js +0 -1079
  606. package/dist/chunk-V4YMBLWX.js.map +0 -1
  607. package/dist/chunk-W5FCTANB.js +0 -169
  608. package/dist/chunk-X7TD2MW7.js +0 -509
  609. package/dist/chunk-XDEQ3JIR.js +0 -97
  610. package/dist/chunk-XFGAUP5B.js +0 -76
  611. package/dist/chunk-XLNVBDP2.js +0 -25
  612. package/dist/chunk-XOSUSV2O.js +0 -622
  613. package/dist/chunk-XUNG5I2P.js +0 -46
  614. package/dist/chunk-XXBIY75O.js +0 -74
  615. package/dist/chunk-Y6YECJIC.js +0 -6667
  616. package/dist/chunk-Y6YECJIC.js.map +0 -1
  617. package/dist/chunk-YI34MMBL.js +0 -534
  618. package/dist/chunk-YORMRROI.js +0 -337
  619. package/dist/chunk-YYBQUXFX.js +0 -333
  620. package/dist/chunk-YZIZEPAQ.js +0 -454
  621. package/dist/chunk-YZIZEPAQ.js.map +0 -1
  622. package/dist/chunk-Z6DVODBW.js +0 -19
  623. package/dist/chunk-ZR55VIOO.js +0 -133
  624. package/dist/claim-Y72FU77H.js +0 -197
  625. package/dist/client-4H6FYKCS.js +0 -19
  626. package/dist/code-JRNGF4AQ.js +0 -76
  627. package/dist/companies-XEYBYAYB.js +0 -195
  628. package/dist/complete-ZANYQ6HF.js +0 -81
  629. package/dist/config-ON2KUCQT.js +0 -88
  630. package/dist/connect-VBCLYQF4.js +0 -42
  631. package/dist/content-QIEV6TB3.js +0 -81
  632. package/dist/conversation-XVGX7HL2.js +0 -93
  633. package/dist/conversion-report-RC7G5FYK.js +0 -125
  634. package/dist/conversion-upload-command-PEE3VQTU.js +0 -438
  635. package/dist/conversion-writes-W7ICHG76.js +0 -120
  636. package/dist/conversions-KF4AHFCY.js +0 -135
  637. package/dist/conversions-OI7JVWXC.js +0 -76
  638. package/dist/countries-DYGDGADD.js +0 -82
  639. package/dist/create-5ZYWRS65.js +0 -59
  640. package/dist/create-HOZVJTLQ.js +0 -235
  641. package/dist/create-O4HLNNZZ.js +0 -130
  642. package/dist/create-TH4PAKLA.js +0 -207
  643. package/dist/creatives-4NBWBNE3.js +0 -51
  644. package/dist/creatives-QCA5K3QN.js +0 -182
  645. package/dist/creatives-QWCZYDFX.js +0 -87
  646. package/dist/credentials-MF5KMPVX.js +0 -1055
  647. package/dist/credentials-MF5KMPVX.js.map +0 -1
  648. package/dist/critique-AWVCL2V3.js +0 -213
  649. package/dist/critique-JHTYUNM4.js +0 -1449
  650. package/dist/crm-7CJYHUOM.js +0 -318
  651. package/dist/crm-UGKYWOXB.js +0 -224
  652. package/dist/crop-HS55YINN.js +0 -113
  653. package/dist/currency-UIK2FQKD.js +0 -88
  654. package/dist/custom-conversions-NBZZO6CH.js +0 -125
  655. package/dist/customers-NIAOEYND.js +0 -56
  656. package/dist/decide-WPI5RC2Z.js +0 -199
  657. package/dist/decide-WPI5RC2Z.js.map +0 -1
  658. package/dist/delete-2LZGYUPS.js +0 -66
  659. package/dist/delete-7YUYMN6C.js +0 -69
  660. package/dist/delete-JUT3DSKM.js +0 -54
  661. package/dist/delete-KFY6CQNU.js +0 -71
  662. package/dist/delete-NQTQ3KDZ.js +0 -71
  663. package/dist/delete-W6U5RF5Q.js +0 -63
  664. package/dist/demographics-I7AAPHXO.js +0 -138
  665. package/dist/describe-GR23KX6I.js +0 -97
  666. package/dist/describe-H4WLDC3H.js +0 -97
  667. package/dist/dimensions-H47GQ7EG.js +0 -101
  668. package/dist/discard-WVDVBN64.js +0 -66
  669. package/dist/discover-TYVFSFBE.js +0 -172
  670. package/dist/domain-YOUKBS2S.js +0 -98
  671. package/dist/download-FST2EONO.js +0 -299
  672. package/dist/draft-2YWPCLWT.js +0 -217
  673. package/dist/draft-34F45F46.js +0 -281
  674. package/dist/draft-53B4DCWT.js +0 -103
  675. package/dist/draft-AGQGAQDL.js +0 -100
  676. package/dist/draft-AUJKE57P.js +0 -328
  677. package/dist/draft-F4TRTDSV.js +0 -233
  678. package/dist/draft-GIDPSFBJ.js +0 -306
  679. package/dist/draft-P5OM2FM4.js +0 -107
  680. package/dist/env-36PNRGN2.js +0 -43
  681. package/dist/experiment-3QBXTXD7.js +0 -1377
  682. package/dist/experiment-3QBXTXD7.js.map +0 -1
  683. package/dist/export-WFKV2OYY.js +0 -168
  684. package/dist/extract-QIVN46BW.js +0 -113
  685. package/dist/facets-R3PIL4VO.js +0 -114
  686. package/dist/favorites-Q3QVUTEF.js +0 -178
  687. package/dist/feed-2T3HP275.js +0 -157
  688. package/dist/feedback-NK63HSFT.js +0 -66
  689. package/dist/feedback-record-ANSY2BEC.js +0 -175
  690. package/dist/fetch-D57AS4RQ.js +0 -139
  691. package/dist/fetch-V4XGLUEZ.js +0 -176
  692. package/dist/find-7MSB5EHL.js +0 -134
  693. package/dist/fit-2GADEYRG.js +0 -45
  694. package/dist/flows-ZWQHM6U6.js +0 -247
  695. package/dist/follow-556YL7IJ.js +0 -82
  696. package/dist/follow-competitors-LNAJCROC.js +0 -131
  697. package/dist/following-V6QK3ROG.js +0 -109
  698. package/dist/fonts-CB44BCDC.js +0 -34
  699. package/dist/forecast-FKNCIFVA.js +0 -104
  700. package/dist/funding-NP22ZLBH.js +0 -85
  701. package/dist/funnel-VMV2JTRA.js +0 -837
  702. package/dist/funnel-VMV2JTRA.js.map +0 -1
  703. package/dist/ga4-T3IODHS2.js +0 -55
  704. package/dist/generate-VSAS3QA5.js +0 -262
  705. package/dist/get-77U4CN3V.js +0 -63
  706. package/dist/get-BNO4T5SH.js +0 -56
  707. package/dist/get-IUS3RB5H.js +0 -92
  708. package/dist/get-QWEQMBGA.js +0 -59
  709. package/dist/get-ST2ZAQR3.js +0 -61
  710. package/dist/get-UMFJ26TV.js +0 -63
  711. package/dist/get-VBB6GNOW.js +0 -78
  712. package/dist/gif-5PQMJHUZ.js +0 -94
  713. package/dist/google-2WSPNB7K.js +0 -136
  714. package/dist/google-ITIUG5PK.js +0 -1872
  715. package/dist/google-ads-TLZR2JRG.js +0 -195
  716. package/dist/group-4LZM3SOQ.js +0 -43
  717. package/dist/group-JSDECSRD.js +0 -43
  718. package/dist/gsc-3LQHAWWC.js +0 -30
  719. package/dist/history-NE4I5SEE.js +0 -133
  720. package/dist/history-VZIYKR7A.js +0 -67
  721. package/dist/hubspot-H2SYPIFD.js +0 -779
  722. package/dist/icon-LBWC5HYT.js +0 -137
  723. package/dist/ideas-LQUVKQKS.js +0 -32
  724. package/dist/images-T5GD4WFJ.js +0 -90
  725. package/dist/improve-RBY3HJ4Z.js +0 -86
  726. package/dist/ingest-DHSFUFHB.js +0 -23
  727. package/dist/ingest-YNNFZQF4.js +0 -107
  728. package/dist/insights-DO7CTSGR.js +0 -122
  729. package/dist/insights-JBRJWBZ2.js +0 -423
  730. package/dist/inspect-KELSQCLK.js +0 -189
  731. package/dist/inspiration-UUHVLEJ6.js +0 -53
  732. package/dist/intent-DRB4VZXP.js +0 -95
  733. package/dist/job-QFXKGFW4.js +0 -202
  734. package/dist/job-create-Q2OOGI7E.js +0 -109
  735. package/dist/job-status-SUO4X7UP.js +0 -74
  736. package/dist/keep-TZK5V4ZY.js +0 -78
  737. package/dist/keyword-gap-HZONPMCA.js +0 -130
  738. package/dist/keyword-metrics-6B6I4PN4.js +0 -197
  739. package/dist/keywords-for-site-BI6DHP7K.js +0 -128
  740. package/dist/landing-CSX5DZVJ.js +0 -28
  741. package/dist/languages-DR2PONQX.js +0 -40
  742. package/dist/languages-PEZHTXZX.js +0 -55
  743. package/dist/layerize-VYLLKEKU.js +0 -190
  744. package/dist/leads-3OAJRMWS.js +0 -293
  745. package/dist/leads-BL6GWOAG.js +0 -90
  746. package/dist/learn-2O6NKJCX.js +0 -203
  747. package/dist/library-TXRUECDM.js +0 -109
  748. package/dist/lighthouse-RLUZZOKE.js +0 -75
  749. package/dist/line-item-writes-O3AYCYIS.js +0 -208
  750. package/dist/line-items-NLFOGAAO.js +0 -103
  751. package/dist/link-YDGPKGM6.js +0 -64
  752. package/dist/linkedin-WBO6EPMB.js +0 -1008
  753. package/dist/list-BPSQWWLP.js +0 -50
  754. package/dist/list-BTS2E4UI.js +0 -51
  755. package/dist/list-DJOQQI6Y.js +0 -63
  756. package/dist/list-EJYJIIUY.js +0 -151
  757. package/dist/list-EPRACXON.js +0 -57
  758. package/dist/list-EVPBQSRL.js +0 -65
  759. package/dist/list-L7CZJZRS.js +0 -76
  760. package/dist/list-VBLCEHPO.js +0 -303
  761. package/dist/locations-SPFNXQGT.js +0 -67
  762. package/dist/locations-UGSAWLNK.js +0 -40
  763. package/dist/log-VG77KFB4.js +0 -92
  764. package/dist/logo-HUGNK27I.js +0 -18
  765. package/dist/lookup-MPFB5G7E.js +0 -22
  766. package/dist/make-DPQIVORE.js +0 -593
  767. package/dist/make-DPQIVORE.js.map +0 -1
  768. package/dist/map-XQHIM4IU.js +0 -404
  769. package/dist/map-XQHIM4IU.js.map +0 -1
  770. package/dist/mcp-LD6W2RSB.js +0 -476
  771. package/dist/media-A7UWIMMD.js +0 -89
  772. package/dist/media-T6H3CRXB.js +0 -15
  773. package/dist/media-sources-5S6IFOOS.js +0 -32
  774. package/dist/members-HI2MH5SY.js +0 -44
  775. package/dist/meta-ZN3LHUU3.js +0 -69
  776. package/dist/metrics-BK5JSR6I.js +0 -152
  777. package/dist/models-3LS4Q2MN.js +0 -155
  778. package/dist/normalize-DGZPN2OM.js +0 -141
  779. package/dist/normalize-X7SHHCQD.js +0 -806
  780. package/dist/options-FCWD257L.js +0 -121
  781. package/dist/output-OJITAE7Q.js +0 -24
  782. package/dist/page-NBFLD3L5.js +0 -105
  783. package/dist/pages-MPEWHREN.js +0 -66
  784. package/dist/performance-PI372VKJ.js +0 -24
  785. package/dist/pinterest-22ODL6Q5.js +0 -96
  786. package/dist/pixels-DDNYT7R4.js +0 -60
  787. package/dist/pixels-OASXHZAX.js +0 -108
  788. package/dist/preview-YK7RI76O.js +0 -169
  789. package/dist/promoted-tweet-writes-MDBNSHVZ.js +0 -180
  790. package/dist/promoted-tweets-YGENR6WV.js +0 -119
  791. package/dist/properties-6ME4XYT7.js +0 -101
  792. package/dist/publish-6T7IEXRD.js +0 -322
  793. package/dist/query-TUNPWBPS.js +0 -247
  794. package/dist/query-WC5I2S6Z.js +0 -236
  795. package/dist/query-X5L4AZSD.js +0 -1341
  796. package/dist/read-EPTLUQAT.js +0 -140
  797. package/dist/read-EPTLUQAT.js.map +0 -1
  798. package/dist/reddit-6UJUB2YN.js +0 -26
  799. package/dist/refresh-2IU3CVJO.js +0 -94
  800. package/dist/release-LUHIB4XJ.js +0 -60
  801. package/dist/relevant-pages-MJXI3LW7.js +0 -99
  802. package/dist/remove-BRUS6SUG.js +0 -50
  803. package/dist/remove-RGHZHRJF.js +0 -48
  804. package/dist/reopen-CQEGEBUP.js +0 -63
  805. package/dist/rerun-EXCTHG7R.js +0 -85
  806. package/dist/research-GCAWQBH5.js +0 -262
  807. package/dist/research-RIOSGFV2.js +0 -62
  808. package/dist/reset-GZWJLJIA.js +0 -54
  809. package/dist/reset-TZQLXUOT.js +0 -54
  810. package/dist/resolve-C3L4SMTW.js +0 -121
  811. package/dist/retry-4IZ5UQMO.js +0 -60
  812. package/dist/retry-OJER6P7D.js +0 -62
  813. package/dist/retry-failed-CEFUP2NC.js +0 -45
  814. package/dist/run-7PMBP5DC.js +0 -65
  815. package/dist/run-CRFK4Z6L.js +0 -60
  816. package/dist/scaffold-ad-WWK3HEII.js +0 -1549
  817. package/dist/scaffold-static-ad-JZFBZYCN.js +0 -966
  818. package/dist/scaffold-static-ad-JZFBZYCN.js.map +0 -1
  819. package/dist/scaffold-video-P5CYWG4Z.js +0 -873
  820. package/dist/schedule-LHLE7VFM.js +0 -66
  821. package/dist/schedule-Z66CE7MU.js +0 -61
  822. package/dist/scheduled-agents-HHRJ5Q46.js +0 -49
  823. package/dist/schema-CQCIYXEX.js +0 -132
  824. package/dist/schema-J23F2JAU.js +0 -63
  825. package/dist/scrape-3SETPPMM.js +0 -2241
  826. package/dist/screenshot-OV4DCO6W.js +0 -102
  827. package/dist/search-BHQQFJB5.js +0 -26
  828. package/dist/search-CYS7UK5T.js +0 -224
  829. package/dist/search-IDQCAKVR.js +0 -174
  830. package/dist/search-QKKK3H6U.js +0 -91
  831. package/dist/search-XWFMVJ4J.js +0 -92
  832. package/dist/seeds-DMT6OIMK.js +0 -101
  833. package/dist/select-2U66UMVQ.js +0 -94
  834. package/dist/sends-LNKJRME5.js +0 -309
  835. package/dist/sequences-4YSD3GH3.js +0 -146
  836. package/dist/set-prompt-NY3HV4KV.js +0 -186
  837. package/dist/setup-links-LJLWQVQ2.js +0 -141
  838. package/dist/shared-PAORAY6M.js +0 -31
  839. package/dist/site-F4TGY5OE.js +0 -177
  840. package/dist/sitemaps-XEMTLWYG.js +0 -87
  841. package/dist/sites-K755KMC2.js +0 -101
  842. package/dist/skills-S65DX7PQ.js +0 -47
  843. package/dist/sources-HZF7UXW6.js +0 -30
  844. package/dist/sources-XTNEWFHJ.js +0 -421
  845. package/dist/stale-NLXN7V3N.js +0 -63
  846. package/dist/stats-CZJKNCIZ.js +0 -34
  847. package/dist/status-M7RTOGLJ.js +0 -62
  848. package/dist/sticker-UQ2XPXIB.js +0 -94
  849. package/dist/stock-FKAD46O3.js +0 -179
  850. package/dist/studio-BHZSCE67.js +0 -49
  851. package/dist/sync-AAXI4RZD.js +0 -54
  852. package/dist/sync-E6BLPR6W.js +0 -54
  853. package/dist/sync-L4LK3QQS.js +0 -265
  854. package/dist/sync-definition-CAHBKD3F.js +0 -53
  855. package/dist/tag-manager-4LCQUQNJ.js +0 -43
  856. package/dist/tags-BVQNIIQU.js +0 -20
  857. package/dist/tags-QQ632HNZ.js +0 -20
  858. package/dist/tags-RSAVBZCB.js +0 -20
  859. package/dist/tags-TZIDBVTK.js +0 -26
  860. package/dist/tags-URQYAJMH.js +0 -224
  861. package/dist/targeting-constants-HKGJVLJ5.js +0 -118
  862. package/dist/targeting-criteria-J2V47AJP.js +0 -113
  863. package/dist/targets-H7YOEVOJ.js +0 -102
  864. package/dist/templates-WLSSRPZ4.js +0 -178
  865. package/dist/testimonials-A26T3NY3.js +0 -32
  866. package/dist/top-companies-26MYZU5T.js +0 -108
  867. package/dist/translate-BD6ULLLZ.js +0 -598
  868. package/dist/triggers-XFCQHRLA.js +0 -141
  869. package/dist/tweets-PPL2ZRV6.js +0 -123
  870. package/dist/unfollow-A6GAUIGZ.js +0 -46
  871. package/dist/unlink-XNZACHV3.js +0 -67
  872. package/dist/unstage-2HSBJ726.js +0 -84
  873. package/dist/unstage-B6ZGECFU.js +0 -95
  874. package/dist/update-2BYOVA5C.js +0 -142
  875. package/dist/update-EG4OSVE4.js +0 -155
  876. package/dist/update-RSYR6ABL.js +0 -98
  877. package/dist/update-SXVXLTND.js +0 -63
  878. package/dist/upload-HOJK4HT6.js +0 -126
  879. package/dist/upload-PH6ZWOIA.js +0 -150
  880. package/dist/upscale-R25SXKQI.js +0 -109
  881. package/dist/url-options-SK3CKY5H.js +0 -127
  882. package/dist/url-params-246VH6BJ.js +0 -98
  883. package/dist/use-WIFON4IC.js +0 -95
  884. package/dist/validate-JFL2PL54.js +0 -89
  885. package/dist/variant-EHLAO2EZ.js +0 -338
  886. package/dist/videos-5SPZWUWN.js +0 -39
  887. package/dist/view-JS33UZGE.js +0 -121
  888. package/dist/viewer-check-TKST6FWT.js +0 -69
  889. package/dist/web-ZDEM5O3C.js +0 -140
  890. package/dist/winners-SDADXE22.js +0 -79
  891. package/dist/winning-ads-SPPDT7JW.js +0 -62
  892. package/dist/winning-ads-SPPDT7JW.js.map +0 -1
  893. package/dist/write-commands-PKB23ZBZ.js +0 -1015
  894. package/dist/write-commands-VKKEGFTJ.js +0 -713
  895. package/dist/write-commands-WYET5424.js +0 -737
  896. package/dist/write-commands-X2IJUI5D.js +0 -206
  897. package/dist/x-CZOHX4T2.js +0 -47
  898. /package/dist/{account-TJPJXX5L.js.map → account-F6MHQ64I.js.map} +0 -0
  899. /package/dist/{account-BENZTU54.js.map → account-HS7SDSEB.js.map} +0 -0
  900. /package/dist/{account-WOEYURTR.js.map → account-IEVEOFIK.js.map} +0 -0
  901. /package/dist/{account-writes-QLHQ6QRN.js.map → account-writes-ISE4U2FQ.js.map} +0 -0
  902. /package/dist/{accounts-RVRE3XSZ.js.map → accounts-3JKABIGU.js.map} +0 -0
  903. /package/dist/{accounts-MZXNJ4FY.js.map → accounts-4CDRK4S4.js.map} +0 -0
  904. /package/dist/{accounts-ILE6LUH2.js.map → accounts-5QDKBZMH.js.map} +0 -0
  905. /package/dist/{accounts-CIYRAWVY.js.map → accounts-KYJO3JC6.js.map} +0 -0
  906. /package/dist/{accounts-EKYHTEL5.js.map → accounts-ZZONEKPU.js.map} +0 -0
  907. /package/dist/{actions-SE4RT5VJ.js.map → actions-VKHKHUUC.js.map} +0 -0
  908. /package/dist/{active-entities-NNSRMERA.js.map → active-entities-YUSOUR5M.js.map} +0 -0
  909. /package/dist/{activities-IOIEQTVH.js.map → activities-ZVQOBHZH.js.map} +0 -0
  910. /package/dist/{ad-group-writes-TQCKLL34.js.map → ad-group-writes-UU5NNKSO.js.map} +0 -0
  911. /package/dist/{ad-groups-LZWSLBC5.js.map → ad-groups-CGFXZNIA.js.map} +0 -0
  912. /package/dist/{ad-writes-UH2WTTGA.js.map → ad-writes-NALDYWOR.js.map} +0 -0
  913. /package/dist/{add-IKO6F33F.js.map → add-53DDLTVG.js.map} +0 -0
  914. /package/dist/{add-AYKM57Z4.js.map → add-577QWMCF.js.map} +0 -0
  915. /package/dist/{add-IBRKJ3YA.js.map → add-ATD4MBOO.js.map} +0 -0
  916. /package/dist/{add-VHJNMLIZ.js.map → add-CUWAW7KG.js.map} +0 -0
  917. /package/dist/{ads-6GT5744J.js.map → ads-6UEDYT3O.js.map} +0 -0
  918. /package/dist/{ads-RJNNP6XJ.js.map → ads-PV7GZXPR.js.map} +0 -0
  919. /package/dist/{ads-QFCFTASQ.js.map → ads-QFAUJCWM.js.map} +0 -0
  920. /package/dist/{adsets-XG64ZCJY.js.map → adsets-Q5DWGANV.js.map} +0 -0
  921. /package/dist/{advertisers-MWTH3NR4.js.map → advertisers-HYUASJAS.js.map} +0 -0
  922. /package/dist/{advertisers-XVGBLKB3.js.map → advertisers-YMHPZYNF.js.map} +0 -0
  923. /package/dist/{analytics-M2YUE6P3.js.map → analytics-RQROMSQ3.js.map} +0 -0
  924. /package/dist/{animate-RC3ZBLLZ.js.map → animate-FWWHSYPL.js.map} +0 -0
  925. /package/dist/{assign-6MIMTPG6.js.map → assign-7332DMG5.js.map} +0 -0
  926. /package/dist/{audience-size-LG3EJVUQ.js.map → audience-size-UYX5RPTA.js.map} +0 -0
  927. /package/dist/{audiences-CDQPFZOH.js.map → audiences-AMRFZRZ7.js.map} +0 -0
  928. /package/dist/{audiences-FEP7LYRA.js.map → audiences-HFRVIE2X.js.map} +0 -0
  929. /package/dist/{audiences-H3RVGETG.js.map → audiences-VEKGLWBG.js.map} +0 -0
  930. /package/dist/{audit-65M7ZYPF.js.map → audit-AD4ZZNJN.js.map} +0 -0
  931. /package/dist/{audit-NLSSM2KK.js.map → audit-ZGTG7VRD.js.map} +0 -0
  932. /package/dist/{autocomplete-FWTUDPDJ.js.map → autocomplete-LPG4WWTY.js.map} +0 -0
  933. /package/dist/{avatars-HSU7KUT3.js.map → avatars-HTQMIA2F.js.map} +0 -0
  934. /package/dist/{bid-pricing-SDJGBZQI.js.map → bid-pricing-IK2C2IKE.js.map} +0 -0
  935. /package/dist/{brand-4E7GKZYV.js.map → brand-3WCTQWWX.js.map} +0 -0
  936. /package/dist/{brief-2YLVLL3Q.js.map → brief-WDKTAKVA.js.map} +0 -0
  937. /package/dist/{businesses-PJGOECA7.js.map → businesses-JBDQZZIG.js.map} +0 -0
  938. /package/dist/{campaign-groups-J3ZLWO6K.js.map → campaign-groups-6CJ45XMO.js.map} +0 -0
  939. /package/dist/{campaign-writes-UGUL5EDR.js.map → campaign-writes-2MLRVFJK.js.map} +0 -0
  940. /package/dist/{campaign-writes-PIOQVLAI.js.map → campaign-writes-SX52CJYW.js.map} +0 -0
  941. /package/dist/{campaigns-IZZ4FCHQ.js.map → campaigns-D6B6Z67Y.js.map} +0 -0
  942. /package/dist/{campaigns-PFNTJHMX.js.map → campaigns-DTH5ADA7.js.map} +0 -0
  943. /package/dist/{campaigns-ZU7FMRQ3.js.map → campaigns-X3DPCCSN.js.map} +0 -0
  944. /package/dist/{campaigns-6ARLQJU2.js.map → campaigns-ZVA7SUNN.js.map} +0 -0
  945. /package/dist/{capabilities-K3DVPGYB.js.map → capabilities-VWJGP43K.js.map} +0 -0
  946. /package/dist/{cards-PS3VNNX3.js.map → cards-4477BFEV.js.map} +0 -0
  947. /package/dist/{catalog-O5U2VMKK.js.map → catalog-BKQOAVR2.js.map} +0 -0
  948. /package/dist/{catalogs-ALSH4R2K.js.map → catalogs-G3YEVG6S.js.map} +0 -0
  949. /package/dist/{changes-KFQKVM3M.js.map → changes-TP7ZZHB3.js.map} +0 -0
  950. /package/dist/{chatgpt-NHGFCJYH.js.map → chatgpt-QNUN63YS.js.map} +0 -0
  951. /package/dist/{chats-YRRTFHKK.js.map → chats-JOZKLOFU.js.map} +0 -0
  952. /package/dist/{chunk-ZR55VIOO.js.map → chunk-2BKVVCCV.js.map} +0 -0
  953. /package/dist/{chunk-XXBIY75O.js.map → chunk-2TK4DEOE.js.map} +0 -0
  954. /package/dist/{chunk-4BIU2YVF.js.map → chunk-35XWJEWH.js.map} +0 -0
  955. /package/dist/{chunk-3XZEAI7E.js.map → chunk-3EUFAONS.js.map} +0 -0
  956. /package/dist/{chunk-EDU6N5NY.js.map → chunk-3JCF3NK6.js.map} +0 -0
  957. /package/dist/{chunk-BPQARCYW.js.map → chunk-4GOS37IA.js.map} +0 -0
  958. /package/dist/{chunk-63VMGEZI.js.map → chunk-4JHUG6Y3.js.map} +0 -0
  959. /package/dist/{chunk-DTKZEXIF.js.map → chunk-4NDCTLI5.js.map} +0 -0
  960. /package/dist/{chunk-5J5NHV3X.js.map → chunk-4QEY2L6U.js.map} +0 -0
  961. /package/dist/{chunk-6C3ADYIW.js.map → chunk-54UVGFX3.js.map} +0 -0
  962. /package/dist/{chunk-JFMMCONZ.js.map → chunk-5PKB7LNI.js.map} +0 -0
  963. /package/dist/{chunk-SCG3FY3H.js.map → chunk-5YGBRHO6.js.map} +0 -0
  964. /package/dist/{chunk-6K47VIWF.js.map → chunk-5Z2KSVIV.js.map} +0 -0
  965. /package/dist/{chunk-NPW3LEAE.js.map → chunk-6B7VKFS4.js.map} +0 -0
  966. /package/dist/{chunk-XUNG5I2P.js.map → chunk-6G5K6ZC6.js.map} +0 -0
  967. /package/dist/{chunk-KFHLUX6M.js.map → chunk-6QJLVNGU.js.map} +0 -0
  968. /package/dist/{chunk-B7COZ237.js.map → chunk-75FDTDLH.js.map} +0 -0
  969. /package/dist/{chunk-EMLKO3AU.js.map → chunk-7OFNN4CT.js.map} +0 -0
  970. /package/dist/{chunk-RE6ZIHDH.js.map → chunk-7ZHMGXE2.js.map} +0 -0
  971. /package/dist/{chunk-YI34MMBL.js.map → chunk-BNCW67EM.js.map} +0 -0
  972. /package/dist/{chunk-E25X7QES.js.map → chunk-C6U6UDHJ.js.map} +0 -0
  973. /package/dist/{chunk-Q5KR4RRB.js.map → chunk-D76QEIFG.js.map} +0 -0
  974. /package/dist/{chunk-RASBZ6SN.js.map → chunk-DGPLXY37.js.map} +0 -0
  975. /package/dist/{chunk-TIL76IDK.js.map → chunk-DZSIUEGH.js.map} +0 -0
  976. /package/dist/{chunk-IY3JSASS.js.map → chunk-E6KL5ZRN.js.map} +0 -0
  977. /package/dist/{chunk-3REUG4QF.js.map → chunk-EFSYTROP.js.map} +0 -0
  978. /package/dist/{chunk-DMA7XZLS.js.map → chunk-EKCPMVZ3.js.map} +0 -0
  979. /package/dist/{chunk-XDEQ3JIR.js.map → chunk-F2S5BLPE.js.map} +0 -0
  980. /package/dist/{chunk-X7TD2MW7.js.map → chunk-F4CUV4FV.js.map} +0 -0
  981. /package/dist/{chunk-MJYRLGGI.js.map → chunk-G7HYW5TH.js.map} +0 -0
  982. /package/dist/{chunk-BFBTBN66.js.map → chunk-GX6VAHY7.js.map} +0 -0
  983. /package/dist/{chunk-JXOPTOVM.js.map → chunk-H26L3OQY.js.map} +0 -0
  984. /package/dist/{chunk-P5T7OZKV.js.map → chunk-HQSCJYZO.js.map} +0 -0
  985. /package/dist/{chunk-S2IOUC5B.js.map → chunk-HRYOZUSK.js.map} +0 -0
  986. /package/dist/{chunk-HNBLXWWQ.js.map → chunk-JERXV5A3.js.map} +0 -0
  987. /package/dist/{chunk-LAHBXTKI.js.map → chunk-JYWZRDLZ.js.map} +0 -0
  988. /package/dist/{chunk-KVHZLRNU.js.map → chunk-K46X77UI.js.map} +0 -0
  989. /package/dist/{chunk-6TQHA2UF.js.map → chunk-KFE3S63W.js.map} +0 -0
  990. /package/dist/{chunk-7P2Y7OQF.js.map → chunk-KLNKEVIY.js.map} +0 -0
  991. /package/dist/{chunk-GLRM72PT.js.map → chunk-KNY76UGC.js.map} +0 -0
  992. /package/dist/{chunk-K45KDAV7.js.map → chunk-KQTYTCKQ.js.map} +0 -0
  993. /package/dist/{chunk-Z6DVODBW.js.map → chunk-KRZV6VS2.js.map} +0 -0
  994. /package/dist/{chunk-JGST7KMB.js.map → chunk-KS2QY6MK.js.map} +0 -0
  995. /package/dist/{chunk-52KJDURD.js.map → chunk-L27H2R2N.js.map} +0 -0
  996. /package/dist/{chunk-GLPKJMMO.js.map → chunk-LERTEZST.js.map} +0 -0
  997. /package/dist/{chunk-ODMRAEEP.js.map → chunk-LF2PIA67.js.map} +0 -0
  998. /package/dist/{chunk-4CYUOGDC.js.map → chunk-LLOOWRBB.js.map} +0 -0
  999. /package/dist/{chunk-H4VPQQN7.js.map → chunk-LS5MTRFI.js.map} +0 -0
  1000. /package/dist/{chunk-II7LSCAH.js.map → chunk-LYBXCXJB.js.map} +0 -0
  1001. /package/dist/{chunk-7GZNYQ3Z.js.map → chunk-M4G3NKDB.js.map} +0 -0
  1002. /package/dist/{chunk-W5FCTANB.js.map → chunk-MM22NUA6.js.map} +0 -0
  1003. /package/dist/{chunk-UOFHTLPD.js.map → chunk-MM5XO4MP.js.map} +0 -0
  1004. /package/dist/{chunk-3J62OINP.js.map → chunk-MZ3SJ6FV.js.map} +0 -0
  1005. /package/dist/{chunk-2ACGDQ2P.js.map → chunk-MZL4H5PY.js.map} +0 -0
  1006. /package/dist/{chunk-5WW456MW.js.map → chunk-NU7JSWVA.js.map} +0 -0
  1007. /package/dist/{chunk-NJY65ACF.js.map → chunk-PBA3YCZA.js.map} +0 -0
  1008. /package/dist/{chunk-SLE4FEFP.js.map → chunk-PROV2XDR.js.map} +0 -0
  1009. /package/dist/{chunk-XLNVBDP2.js.map → chunk-PWGWMIIJ.js.map} +0 -0
  1010. /package/dist/{chunk-KKRN7XRQ.js.map → chunk-PZ7EPJRF.js.map} +0 -0
  1011. /package/dist/{chunk-JTFZ5M3C.js.map → chunk-QSN5MZGS.js.map} +0 -0
  1012. /package/dist/{chunk-ITQWQINC.js.map → chunk-QZOS6FXW.js.map} +0 -0
  1013. /package/dist/{chunk-YORMRROI.js.map → chunk-RNDPEHCH.js.map} +0 -0
  1014. /package/dist/{chunk-BDI5INZA.js.map → chunk-RX6F3GEA.js.map} +0 -0
  1015. /package/dist/{chunk-E7GYHNQO.js.map → chunk-STIB5DR5.js.map} +0 -0
  1016. /package/dist/{chunk-TQO6WNUH.js.map → chunk-T4DD5YMP.js.map} +0 -0
  1017. /package/dist/{chunk-L2ZNZSPV.js.map → chunk-TD2P4HBP.js.map} +0 -0
  1018. /package/dist/{chunk-5SAQ7MNN.js.map → chunk-TJFELVYS.js.map} +0 -0
  1019. /package/dist/{chunk-XFGAUP5B.js.map → chunk-ULJ5RFOV.js.map} +0 -0
  1020. /package/dist/{chunk-6TDEGWZJ.js.map → chunk-VAJBWA2U.js.map} +0 -0
  1021. /package/dist/{chunk-Q4U3ENKF.js.map → chunk-VB6WJJR3.js.map} +0 -0
  1022. /package/dist/{chunk-CWW5ITFK.js.map → chunk-VFIOJD5M.js.map} +0 -0
  1023. /package/dist/{chunk-33F4O6OO.js.map → chunk-VVZBBKRC.js.map} +0 -0
  1024. /package/dist/{chunk-L4C4OPO2.js.map → chunk-W3B4BHQU.js.map} +0 -0
  1025. /package/dist/{chunk-S5MBDWB3.js.map → chunk-WNFIJAUO.js.map} +0 -0
  1026. /package/dist/{chunk-LX2VM245.js.map → chunk-WS2GMOSG.js.map} +0 -0
  1027. /package/dist/{chunk-RNHSGH44.js.map → chunk-WTOYCUKH.js.map} +0 -0
  1028. /package/dist/{chunk-5BQCBI2G.js.map → chunk-XBOK23HI.js.map} +0 -0
  1029. /package/dist/{chunk-AW2UE5AI.js.map → chunk-XL3BMSYG.js.map} +0 -0
  1030. /package/dist/{chunk-PLMHZLJ6.js.map → chunk-XX53CHKP.js.map} +0 -0
  1031. /package/dist/{chunk-YYBQUXFX.js.map → chunk-YBMVHGY3.js.map} +0 -0
  1032. /package/dist/{chunk-3ASE4O2H.js.map → chunk-YIWXHIVZ.js.map} +0 -0
  1033. /package/dist/{chunk-EOIYM35Z.js.map → chunk-YKFEHWHC.js.map} +0 -0
  1034. /package/dist/{chunk-F4IQVOOJ.js.map → chunk-YTNJODFK.js.map} +0 -0
  1035. /package/dist/{chunk-JIB3JWL7.js.map → chunk-Z6XEMPOZ.js.map} +0 -0
  1036. /package/dist/{chunk-XOSUSV2O.js.map → chunk-ZWKPXWS5.js.map} +0 -0
  1037. /package/dist/{chunk-UXQ4YQ2O.js.map → chunk-ZZQXVYUY.js.map} +0 -0
  1038. /package/dist/{claim-Y72FU77H.js.map → claim-ITPOQ2I7.js.map} +0 -0
  1039. /package/dist/{client-4H6FYKCS.js.map → client-VHN32ZRE.js.map} +0 -0
  1040. /package/dist/{code-JRNGF4AQ.js.map → code-YS6ZMGX3.js.map} +0 -0
  1041. /package/dist/{companies-XEYBYAYB.js.map → companies-Y5HPLJF5.js.map} +0 -0
  1042. /package/dist/{complete-ZANYQ6HF.js.map → complete-SRXMUS4R.js.map} +0 -0
  1043. /package/dist/{config-ON2KUCQT.js.map → config-CQN5FHMZ.js.map} +0 -0
  1044. /package/dist/{connect-VBCLYQF4.js.map → connect-CRHMP3NK.js.map} +0 -0
  1045. /package/dist/{content-QIEV6TB3.js.map → content-3ZPP4SW2.js.map} +0 -0
  1046. /package/dist/{conversation-XVGX7HL2.js.map → conversation-BBOPGOMH.js.map} +0 -0
  1047. /package/dist/{conversion-report-RC7G5FYK.js.map → conversion-report-N4HANYOB.js.map} +0 -0
  1048. /package/dist/{conversion-upload-command-PEE3VQTU.js.map → conversion-upload-command-AUF3LNTH.js.map} +0 -0
  1049. /package/dist/{conversion-writes-W7ICHG76.js.map → conversion-writes-LW4HQKK5.js.map} +0 -0
  1050. /package/dist/{conversions-KF4AHFCY.js.map → conversions-DH3Q6UTJ.js.map} +0 -0
  1051. /package/dist/{conversions-OI7JVWXC.js.map → conversions-TS723AZV.js.map} +0 -0
  1052. /package/dist/{countries-DYGDGADD.js.map → countries-ESAKTQAE.js.map} +0 -0
  1053. /package/dist/{create-5ZYWRS65.js.map → create-CW5E5Y2S.js.map} +0 -0
  1054. /package/dist/{create-TH4PAKLA.js.map → create-HOIUANHB.js.map} +0 -0
  1055. /package/dist/{create-HOZVJTLQ.js.map → create-M7TK4QUC.js.map} +0 -0
  1056. /package/dist/{create-O4HLNNZZ.js.map → create-ZWSKHSPD.js.map} +0 -0
  1057. /package/dist/{creatives-4NBWBNE3.js.map → creatives-LLWNKS47.js.map} +0 -0
  1058. /package/dist/{creatives-QCA5K3QN.js.map → creatives-QQZNCA6V.js.map} +0 -0
  1059. /package/dist/{creatives-QWCZYDFX.js.map → creatives-UEPLNCPN.js.map} +0 -0
  1060. /package/dist/{critique-AWVCL2V3.js.map → critique-AQDXRULE.js.map} +0 -0
  1061. /package/dist/{critique-JHTYUNM4.js.map → critique-ORSUUTHE.js.map} +0 -0
  1062. /package/dist/{crm-7CJYHUOM.js.map → crm-EPSZEOD2.js.map} +0 -0
  1063. /package/dist/{crm-UGKYWOXB.js.map → crm-WNFEWAAM.js.map} +0 -0
  1064. /package/dist/{crop-HS55YINN.js.map → crop-2J4RKJ6B.js.map} +0 -0
  1065. /package/dist/{currency-UIK2FQKD.js.map → currency-XCGKQ7FE.js.map} +0 -0
  1066. /package/dist/{custom-conversions-NBZZO6CH.js.map → custom-conversions-2VLJGPRV.js.map} +0 -0
  1067. /package/dist/{customers-NIAOEYND.js.map → customers-NZDE7V3P.js.map} +0 -0
  1068. /package/dist/{delete-NQTQ3KDZ.js.map → delete-3AV3ARMX.js.map} +0 -0
  1069. /package/dist/{delete-2LZGYUPS.js.map → delete-6RAKC62Z.js.map} +0 -0
  1070. /package/dist/{delete-JUT3DSKM.js.map → delete-7HMQBDFC.js.map} +0 -0
  1071. /package/dist/{delete-7YUYMN6C.js.map → delete-A5XD52K4.js.map} +0 -0
  1072. /package/dist/{delete-W6U5RF5Q.js.map → delete-FKXR5ZOP.js.map} +0 -0
  1073. /package/dist/{delete-KFY6CQNU.js.map → delete-MRM2S4Z5.js.map} +0 -0
  1074. /package/dist/{demographics-I7AAPHXO.js.map → demographics-PRZS2ZC4.js.map} +0 -0
  1075. /package/dist/{describe-GR23KX6I.js.map → describe-6NVOWIBE.js.map} +0 -0
  1076. /package/dist/{describe-H4WLDC3H.js.map → describe-P3PPIQME.js.map} +0 -0
  1077. /package/dist/{dimensions-H47GQ7EG.js.map → dimensions-EYAYO27I.js.map} +0 -0
  1078. /package/dist/{discard-WVDVBN64.js.map → discard-YLTMCFE6.js.map} +0 -0
  1079. /package/dist/{discover-TYVFSFBE.js.map → discover-BJPZNXUQ.js.map} +0 -0
  1080. /package/dist/{domain-YOUKBS2S.js.map → domain-Z533IR5M.js.map} +0 -0
  1081. /package/dist/{download-FST2EONO.js.map → download-7T6HIJKD.js.map} +0 -0
  1082. /package/dist/{draft-53B4DCWT.js.map → draft-3ZVCQSAG.js.map} +0 -0
  1083. /package/dist/{draft-2YWPCLWT.js.map → draft-4PURIMDM.js.map} +0 -0
  1084. /package/dist/{draft-P5OM2FM4.js.map → draft-5YAYCEYY.js.map} +0 -0
  1085. /package/dist/{draft-GIDPSFBJ.js.map → draft-7ZWPABVG.js.map} +0 -0
  1086. /package/dist/{draft-AGQGAQDL.js.map → draft-KIBMVKSR.js.map} +0 -0
  1087. /package/dist/{draft-34F45F46.js.map → draft-THPZFASM.js.map} +0 -0
  1088. /package/dist/{draft-F4TRTDSV.js.map → draft-YDY2Q2K6.js.map} +0 -0
  1089. /package/dist/{draft-AUJKE57P.js.map → draft-ZXZEQRCL.js.map} +0 -0
  1090. /package/dist/{env-36PNRGN2.js.map → env-KIP2J2UB.js.map} +0 -0
  1091. /package/dist/{export-WFKV2OYY.js.map → export-JQRMBJ7D.js.map} +0 -0
  1092. /package/dist/{extract-QIVN46BW.js.map → extract-7QKLME7Z.js.map} +0 -0
  1093. /package/dist/{facets-R3PIL4VO.js.map → facets-453OFMAM.js.map} +0 -0
  1094. /package/dist/{favorites-Q3QVUTEF.js.map → favorites-NSGF4OV5.js.map} +0 -0
  1095. /package/dist/{feed-2T3HP275.js.map → feed-RV4KPPXM.js.map} +0 -0
  1096. /package/dist/{feedback-NK63HSFT.js.map → feedback-JFV6BMJW.js.map} +0 -0
  1097. /package/dist/{feedback-record-ANSY2BEC.js.map → feedback-record-HCOBRTY2.js.map} +0 -0
  1098. /package/dist/{fetch-V4XGLUEZ.js.map → fetch-44PPB6UO.js.map} +0 -0
  1099. /package/dist/{fetch-D57AS4RQ.js.map → fetch-XF76JABV.js.map} +0 -0
  1100. /package/dist/{find-7MSB5EHL.js.map → find-FRRHAPWX.js.map} +0 -0
  1101. /package/dist/{fit-2GADEYRG.js.map → fit-7237F5EB.js.map} +0 -0
  1102. /package/dist/{flows-ZWQHM6U6.js.map → flows-N7UZ4ZO5.js.map} +0 -0
  1103. /package/dist/{follow-556YL7IJ.js.map → follow-FN7LV3WV.js.map} +0 -0
  1104. /package/dist/{follow-competitors-LNAJCROC.js.map → follow-competitors-MKXFHLXB.js.map} +0 -0
  1105. /package/dist/{following-V6QK3ROG.js.map → following-RKC2FLHI.js.map} +0 -0
  1106. /package/dist/{fonts-CB44BCDC.js.map → fonts-YW7SU5EY.js.map} +0 -0
  1107. /package/dist/{forecast-FKNCIFVA.js.map → forecast-W57WFVDL.js.map} +0 -0
  1108. /package/dist/{funding-NP22ZLBH.js.map → funding-NYO65IMT.js.map} +0 -0
  1109. /package/dist/{ga4-T3IODHS2.js.map → ga4-DV2AXCSL.js.map} +0 -0
  1110. /package/dist/{generate-VSAS3QA5.js.map → generate-MMBYB44G.js.map} +0 -0
  1111. /package/dist/{get-VBB6GNOW.js.map → get-2NA3LPCN.js.map} +0 -0
  1112. /package/dist/{get-QWEQMBGA.js.map → get-3L6W3E3T.js.map} +0 -0
  1113. /package/dist/{get-77U4CN3V.js.map → get-6WEYKOY6.js.map} +0 -0
  1114. /package/dist/{get-BNO4T5SH.js.map → get-MEGPYKQR.js.map} +0 -0
  1115. /package/dist/{get-UMFJ26TV.js.map → get-P743RPSI.js.map} +0 -0
  1116. /package/dist/{get-ST2ZAQR3.js.map → get-XN5ZGDIK.js.map} +0 -0
  1117. /package/dist/{get-IUS3RB5H.js.map → get-YIHTAMRT.js.map} +0 -0
  1118. /package/dist/{gif-5PQMJHUZ.js.map → gif-53ULFVLR.js.map} +0 -0
  1119. /package/dist/{google-ITIUG5PK.js.map → google-M7KEXVK5.js.map} +0 -0
  1120. /package/dist/{google-2WSPNB7K.js.map → google-QYYYSSXI.js.map} +0 -0
  1121. /package/dist/{google-ads-TLZR2JRG.js.map → google-ads-G2XD4RMT.js.map} +0 -0
  1122. /package/dist/{group-JSDECSRD.js.map → group-EFZ3AJIE.js.map} +0 -0
  1123. /package/dist/{group-4LZM3SOQ.js.map → group-GKWCCX66.js.map} +0 -0
  1124. /package/dist/{gsc-3LQHAWWC.js.map → gsc-TAKOF7J5.js.map} +0 -0
  1125. /package/dist/{history-VZIYKR7A.js.map → history-DBIEYQHY.js.map} +0 -0
  1126. /package/dist/{history-NE4I5SEE.js.map → history-RCKMMUWI.js.map} +0 -0
  1127. /package/dist/{hubspot-H2SYPIFD.js.map → hubspot-CKS7F77W.js.map} +0 -0
  1128. /package/dist/{icon-LBWC5HYT.js.map → icon-L4RSS6PZ.js.map} +0 -0
  1129. /package/dist/{ideas-LQUVKQKS.js.map → ideas-EYC6K33G.js.map} +0 -0
  1130. /package/dist/{images-T5GD4WFJ.js.map → images-2HJ7YKTH.js.map} +0 -0
  1131. /package/dist/{improve-RBY3HJ4Z.js.map → improve-BCCU5AS6.js.map} +0 -0
  1132. /package/dist/{ingest-DHSFUFHB.js.map → ingest-26O5Q462.js.map} +0 -0
  1133. /package/dist/{ingest-YNNFZQF4.js.map → ingest-RR5GAX3G.js.map} +0 -0
  1134. /package/dist/{insights-JBRJWBZ2.js.map → insights-NZWSJKU4.js.map} +0 -0
  1135. /package/dist/{insights-DO7CTSGR.js.map → insights-ZIU6FJMS.js.map} +0 -0
  1136. /package/dist/{inspect-KELSQCLK.js.map → inspect-XPDUPSUP.js.map} +0 -0
  1137. /package/dist/{inspiration-UUHVLEJ6.js.map → inspiration-S3DU4CMQ.js.map} +0 -0
  1138. /package/dist/{intent-DRB4VZXP.js.map → intent-E3UIVZBN.js.map} +0 -0
  1139. /package/dist/{job-QFXKGFW4.js.map → job-L7RJZMSG.js.map} +0 -0
  1140. /package/dist/{job-create-Q2OOGI7E.js.map → job-create-JUDAN52O.js.map} +0 -0
  1141. /package/dist/{job-status-SUO4X7UP.js.map → job-status-U43WE3RJ.js.map} +0 -0
  1142. /package/dist/{keep-TZK5V4ZY.js.map → keep-55CPC7DG.js.map} +0 -0
  1143. /package/dist/{keyword-gap-HZONPMCA.js.map → keyword-gap-BG6M665A.js.map} +0 -0
  1144. /package/dist/{keyword-metrics-6B6I4PN4.js.map → keyword-metrics-KOPXTILA.js.map} +0 -0
  1145. /package/dist/{keywords-for-site-BI6DHP7K.js.map → keywords-for-site-PONNELI5.js.map} +0 -0
  1146. /package/dist/{landing-CSX5DZVJ.js.map → landing-RYRZ5VZ2.js.map} +0 -0
  1147. /package/dist/{languages-DR2PONQX.js.map → languages-HORKPDNH.js.map} +0 -0
  1148. /package/dist/{languages-PEZHTXZX.js.map → languages-JSGWCC7Z.js.map} +0 -0
  1149. /package/dist/{layerize-VYLLKEKU.js.map → layerize-RPD6SNP6.js.map} +0 -0
  1150. /package/dist/{leads-3OAJRMWS.js.map → leads-ARUWPHBM.js.map} +0 -0
  1151. /package/dist/{leads-BL6GWOAG.js.map → leads-R7YSJDIG.js.map} +0 -0
  1152. /package/dist/{learn-2O6NKJCX.js.map → learn-IZ6QKTCX.js.map} +0 -0
  1153. /package/dist/{library-TXRUECDM.js.map → library-ARKRLCNJ.js.map} +0 -0
  1154. /package/dist/{lighthouse-RLUZZOKE.js.map → lighthouse-6ZC45E53.js.map} +0 -0
  1155. /package/dist/{line-item-writes-O3AYCYIS.js.map → line-item-writes-25FE22UX.js.map} +0 -0
  1156. /package/dist/{line-items-NLFOGAAO.js.map → line-items-V522VKSU.js.map} +0 -0
  1157. /package/dist/{link-YDGPKGM6.js.map → link-ZZZVDSUP.js.map} +0 -0
  1158. /package/dist/{linkedin-WBO6EPMB.js.map → linkedin-HXLYJVGI.js.map} +0 -0
  1159. /package/dist/{list-BTS2E4UI.js.map → list-7MVBXOJT.js.map} +0 -0
  1160. /package/dist/{list-EVPBQSRL.js.map → list-A5UCIR2J.js.map} +0 -0
  1161. /package/dist/{list-BPSQWWLP.js.map → list-AL7N6X2P.js.map} +0 -0
  1162. /package/dist/{list-EJYJIIUY.js.map → list-HSXOTG5R.js.map} +0 -0
  1163. /package/dist/{list-VBLCEHPO.js.map → list-KYEK3N34.js.map} +0 -0
  1164. /package/dist/{list-EPRACXON.js.map → list-LI4OGQFW.js.map} +0 -0
  1165. /package/dist/{list-DJOQQI6Y.js.map → list-LKHHCQZU.js.map} +0 -0
  1166. /package/dist/{list-L7CZJZRS.js.map → list-P7NAFN6J.js.map} +0 -0
  1167. /package/dist/{locations-SPFNXQGT.js.map → locations-74TPQWAT.js.map} +0 -0
  1168. /package/dist/{locations-UGSAWLNK.js.map → locations-J4G5RNPH.js.map} +0 -0
  1169. /package/dist/{log-VG77KFB4.js.map → log-6ELXS5EJ.js.map} +0 -0
  1170. /package/dist/{logo-HUGNK27I.js.map → logo-Q5D7PZY6.js.map} +0 -0
  1171. /package/dist/{lookup-MPFB5G7E.js.map → lookup-TCU2ZEZW.js.map} +0 -0
  1172. /package/dist/{mcp-LD6W2RSB.js.map → mcp-W7DBSUF7.js.map} +0 -0
  1173. /package/dist/{media-T6H3CRXB.js.map → media-53DJRC4N.js.map} +0 -0
  1174. /package/dist/{media-A7UWIMMD.js.map → media-6CQYG4UY.js.map} +0 -0
  1175. /package/dist/{media-sources-5S6IFOOS.js.map → media-sources-M35YZQY5.js.map} +0 -0
  1176. /package/dist/{members-HI2MH5SY.js.map → members-QXYMJQWU.js.map} +0 -0
  1177. /package/dist/{meta-ZN3LHUU3.js.map → meta-A7KM6TF5.js.map} +0 -0
  1178. /package/dist/{metrics-BK5JSR6I.js.map → metrics-SQDJ5NQO.js.map} +0 -0
  1179. /package/dist/{models-3LS4Q2MN.js.map → models-7U3GRYHF.js.map} +0 -0
  1180. /package/dist/{normalize-DGZPN2OM.js.map → normalize-DYJLUBQP.js.map} +0 -0
  1181. /package/dist/{normalize-X7SHHCQD.js.map → normalize-ICQF2AST.js.map} +0 -0
  1182. /package/dist/{options-FCWD257L.js.map → options-77SHB5KA.js.map} +0 -0
  1183. /package/dist/{output-OJITAE7Q.js.map → output-RAH3TSIL.js.map} +0 -0
  1184. /package/dist/{page-NBFLD3L5.js.map → page-GS3WLT2C.js.map} +0 -0
  1185. /package/dist/{pages-MPEWHREN.js.map → pages-FXYQLHSJ.js.map} +0 -0
  1186. /package/dist/{performance-PI372VKJ.js.map → performance-VVTYUSTW.js.map} +0 -0
  1187. /package/dist/{pinterest-22ODL6Q5.js.map → pinterest-AUH7WBA7.js.map} +0 -0
  1188. /package/dist/{pixels-DDNYT7R4.js.map → pixels-45A55MOP.js.map} +0 -0
  1189. /package/dist/{pixels-OASXHZAX.js.map → pixels-ZFF4BGUH.js.map} +0 -0
  1190. /package/dist/{preview-YK7RI76O.js.map → preview-AD4GKYIA.js.map} +0 -0
  1191. /package/dist/{promoted-tweet-writes-MDBNSHVZ.js.map → promoted-tweet-writes-QP37NMQC.js.map} +0 -0
  1192. /package/dist/{promoted-tweets-YGENR6WV.js.map → promoted-tweets-WPSM6MGX.js.map} +0 -0
  1193. /package/dist/{properties-6ME4XYT7.js.map → properties-L2XIYQDS.js.map} +0 -0
  1194. /package/dist/{publish-6T7IEXRD.js.map → publish-YF6ESBGQ.js.map} +0 -0
  1195. /package/dist/{query-X5L4AZSD.js.map → query-IEZRY6HV.js.map} +0 -0
  1196. /package/dist/{query-WC5I2S6Z.js.map → query-SGGBCHTF.js.map} +0 -0
  1197. /package/dist/{query-TUNPWBPS.js.map → query-VTGVZQIO.js.map} +0 -0
  1198. /package/dist/{reddit-6UJUB2YN.js.map → reddit-VC3IOFNC.js.map} +0 -0
  1199. /package/dist/{refresh-2IU3CVJO.js.map → refresh-UXBCTVCG.js.map} +0 -0
  1200. /package/dist/{release-LUHIB4XJ.js.map → release-PP5S5QHD.js.map} +0 -0
  1201. /package/dist/{relevant-pages-MJXI3LW7.js.map → relevant-pages-OWMNUCP7.js.map} +0 -0
  1202. /package/dist/{remove-RGHZHRJF.js.map → remove-6LGGKMLJ.js.map} +0 -0
  1203. /package/dist/{remove-BRUS6SUG.js.map → remove-OUWQ7NPN.js.map} +0 -0
  1204. /package/dist/{reopen-CQEGEBUP.js.map → reopen-KXAM5LVX.js.map} +0 -0
  1205. /package/dist/{rerun-EXCTHG7R.js.map → rerun-ZVFP4FNN.js.map} +0 -0
  1206. /package/dist/{research-GCAWQBH5.js.map → research-52CURSLR.js.map} +0 -0
  1207. /package/dist/{research-RIOSGFV2.js.map → research-WEW3TISC.js.map} +0 -0
  1208. /package/dist/{reset-GZWJLJIA.js.map → reset-MVLV7GEB.js.map} +0 -0
  1209. /package/dist/{reset-TZQLXUOT.js.map → reset-RBL2NSDV.js.map} +0 -0
  1210. /package/dist/{resolve-C3L4SMTW.js.map → resolve-JG3TGLCR.js.map} +0 -0
  1211. /package/dist/{retry-4IZ5UQMO.js.map → retry-2B3V4CJO.js.map} +0 -0
  1212. /package/dist/{retry-OJER6P7D.js.map → retry-Y3VUKOZ3.js.map} +0 -0
  1213. /package/dist/{retry-failed-CEFUP2NC.js.map → retry-failed-6HXPUVXJ.js.map} +0 -0
  1214. /package/dist/{run-7PMBP5DC.js.map → run-3BCAHPCW.js.map} +0 -0
  1215. /package/dist/{run-CRFK4Z6L.js.map → run-FZL7FYTL.js.map} +0 -0
  1216. /package/dist/{scaffold-ad-WWK3HEII.js.map → scaffold-ad-TL5URKZF.js.map} +0 -0
  1217. /package/dist/{scaffold-video-P5CYWG4Z.js.map → scaffold-video-LRTELU5X.js.map} +0 -0
  1218. /package/dist/{schedule-Z66CE7MU.js.map → schedule-7QLWW5HA.js.map} +0 -0
  1219. /package/dist/{schedule-LHLE7VFM.js.map → schedule-O2K6M43V.js.map} +0 -0
  1220. /package/dist/{scheduled-agents-HHRJ5Q46.js.map → scheduled-agents-HDALX27W.js.map} +0 -0
  1221. /package/dist/{schema-J23F2JAU.js.map → schema-6GR77VJG.js.map} +0 -0
  1222. /package/dist/{schema-CQCIYXEX.js.map → schema-EY3Y3KFB.js.map} +0 -0
  1223. /package/dist/{scrape-3SETPPMM.js.map → scrape-ETAMW43A.js.map} +0 -0
  1224. /package/dist/{screenshot-OV4DCO6W.js.map → screenshot-YCQF25ZB.js.map} +0 -0
  1225. /package/dist/{search-IDQCAKVR.js.map → search-4XS7AO5R.js.map} +0 -0
  1226. /package/dist/{search-CYS7UK5T.js.map → search-742XSULP.js.map} +0 -0
  1227. /package/dist/{search-XWFMVJ4J.js.map → search-MEEM4D3W.js.map} +0 -0
  1228. /package/dist/{search-QKKK3H6U.js.map → search-OQNGSMUH.js.map} +0 -0
  1229. /package/dist/{search-BHQQFJB5.js.map → search-UO5KJTYS.js.map} +0 -0
  1230. /package/dist/{seeds-DMT6OIMK.js.map → seeds-N6FF5S4T.js.map} +0 -0
  1231. /package/dist/{select-2U66UMVQ.js.map → select-J3QVFWVE.js.map} +0 -0
  1232. /package/dist/{sends-LNKJRME5.js.map → sends-WGJVQUMF.js.map} +0 -0
  1233. /package/dist/{sequences-4YSD3GH3.js.map → sequences-OIPVR7JL.js.map} +0 -0
  1234. /package/dist/{set-prompt-NY3HV4KV.js.map → set-prompt-MEMSZEZK.js.map} +0 -0
  1235. /package/dist/{setup-links-LJLWQVQ2.js.map → setup-links-4PCSBEJD.js.map} +0 -0
  1236. /package/dist/{shared-PAORAY6M.js.map → shared-HJDFNID4.js.map} +0 -0
  1237. /package/dist/{site-F4TGY5OE.js.map → site-IG62FRYT.js.map} +0 -0
  1238. /package/dist/{sitemaps-XEMTLWYG.js.map → sitemaps-POPZJTAX.js.map} +0 -0
  1239. /package/dist/{sites-K755KMC2.js.map → sites-262H6LM4.js.map} +0 -0
  1240. /package/dist/{skills-S65DX7PQ.js.map → skills-6TQZLIMP.js.map} +0 -0
  1241. /package/dist/{sources-HZF7UXW6.js.map → sources-5YFONIJP.js.map} +0 -0
  1242. /package/dist/{sources-XTNEWFHJ.js.map → sources-AM7SIZUY.js.map} +0 -0
  1243. /package/dist/{stale-NLXN7V3N.js.map → stale-UMI4XCKX.js.map} +0 -0
  1244. /package/dist/{stats-CZJKNCIZ.js.map → stats-NNXZMPZR.js.map} +0 -0
  1245. /package/dist/{status-M7RTOGLJ.js.map → status-F4XMET7U.js.map} +0 -0
  1246. /package/dist/{sticker-UQ2XPXIB.js.map → sticker-4KMBSMP5.js.map} +0 -0
  1247. /package/dist/{stock-FKAD46O3.js.map → stock-KXJ26BY4.js.map} +0 -0
  1248. /package/dist/{studio-BHZSCE67.js.map → studio-EKIPLLHD.js.map} +0 -0
  1249. /package/dist/{sync-E6BLPR6W.js.map → sync-CF7FVUQJ.js.map} +0 -0
  1250. /package/dist/{sync-AAXI4RZD.js.map → sync-LXYAJ7SU.js.map} +0 -0
  1251. /package/dist/{sync-L4LK3QQS.js.map → sync-ZSNUBYPM.js.map} +0 -0
  1252. /package/dist/{sync-definition-CAHBKD3F.js.map → sync-definition-WU6V5245.js.map} +0 -0
  1253. /package/dist/{tag-manager-4LCQUQNJ.js.map → tag-manager-JAAMOUGB.js.map} +0 -0
  1254. /package/dist/{tags-RSAVBZCB.js.map → tags-6WV3PQH5.js.map} +0 -0
  1255. /package/dist/{tags-BVQNIIQU.js.map → tags-FTOD6CYS.js.map} +0 -0
  1256. /package/dist/{tags-URQYAJMH.js.map → tags-KXNOWUMN.js.map} +0 -0
  1257. /package/dist/{tags-QQ632HNZ.js.map → tags-PJRNCPQJ.js.map} +0 -0
  1258. /package/dist/{tags-TZIDBVTK.js.map → tags-R5JCZRAV.js.map} +0 -0
  1259. /package/dist/{targeting-constants-HKGJVLJ5.js.map → targeting-constants-XJ2VOW7K.js.map} +0 -0
  1260. /package/dist/{targeting-criteria-J2V47AJP.js.map → targeting-criteria-HJ7YFAB2.js.map} +0 -0
  1261. /package/dist/{targets-H7YOEVOJ.js.map → targets-RLZSBUCI.js.map} +0 -0
  1262. /package/dist/{templates-WLSSRPZ4.js.map → templates-4SWUBLOC.js.map} +0 -0
  1263. /package/dist/{testimonials-A26T3NY3.js.map → testimonials-YYLALSV4.js.map} +0 -0
  1264. /package/dist/{top-companies-26MYZU5T.js.map → top-companies-SNOQQFUS.js.map} +0 -0
  1265. /package/dist/{translate-BD6ULLLZ.js.map → translate-CZRVAEUQ.js.map} +0 -0
  1266. /package/dist/{triggers-XFCQHRLA.js.map → triggers-MFDFO2Y4.js.map} +0 -0
  1267. /package/dist/{tweets-PPL2ZRV6.js.map → tweets-ATP3FQAC.js.map} +0 -0
  1268. /package/dist/{unfollow-A6GAUIGZ.js.map → unfollow-CBVPGPF7.js.map} +0 -0
  1269. /package/dist/{unlink-XNZACHV3.js.map → unlink-BVDKP7VQ.js.map} +0 -0
  1270. /package/dist/{unstage-B6ZGECFU.js.map → unstage-V7GMMOWR.js.map} +0 -0
  1271. /package/dist/{unstage-2HSBJ726.js.map → unstage-ZTOQEWRC.js.map} +0 -0
  1272. /package/dist/{update-EG4OSVE4.js.map → update-R46SJ55S.js.map} +0 -0
  1273. /package/dist/{update-2BYOVA5C.js.map → update-R572VWKO.js.map} +0 -0
  1274. /package/dist/{update-RSYR6ABL.js.map → update-SQEWFFFG.js.map} +0 -0
  1275. /package/dist/{update-SXVXLTND.js.map → update-VVK6SWSI.js.map} +0 -0
  1276. /package/dist/{upload-PH6ZWOIA.js.map → upload-L5SYZB3X.js.map} +0 -0
  1277. /package/dist/{upload-HOJK4HT6.js.map → upload-TUYWMS6E.js.map} +0 -0
  1278. /package/dist/{upscale-R25SXKQI.js.map → upscale-YWRLFU22.js.map} +0 -0
  1279. /package/dist/{url-options-SK3CKY5H.js.map → url-options-GGXAL3J4.js.map} +0 -0
  1280. /package/dist/{url-params-246VH6BJ.js.map → url-params-CU3KVLI5.js.map} +0 -0
  1281. /package/dist/{use-WIFON4IC.js.map → use-UT2DIZOG.js.map} +0 -0
  1282. /package/dist/{validate-JFL2PL54.js.map → validate-WPJXPGWS.js.map} +0 -0
  1283. /package/dist/{variant-EHLAO2EZ.js.map → variant-FLZJYGYL.js.map} +0 -0
  1284. /package/dist/{videos-5SPZWUWN.js.map → videos-KGNLYRUS.js.map} +0 -0
  1285. /package/dist/{view-JS33UZGE.js.map → view-NPAG66QK.js.map} +0 -0
  1286. /package/dist/{viewer-check-TKST6FWT.js.map → viewer-check-45T2HLAH.js.map} +0 -0
  1287. /package/dist/{web-ZDEM5O3C.js.map → web-IEJBIF7U.js.map} +0 -0
  1288. /package/dist/{winners-SDADXE22.js.map → winners-I5BMATJZ.js.map} +0 -0
  1289. /package/dist/{write-commands-WYET5424.js.map → write-commands-CT74VHH6.js.map} +0 -0
  1290. /package/dist/{write-commands-PKB23ZBZ.js.map → write-commands-CXRXLXX2.js.map} +0 -0
  1291. /package/dist/{write-commands-X2IJUI5D.js.map → write-commands-VWSLDBPT.js.map} +0 -0
  1292. /package/dist/{write-commands-VKKEGFTJ.js.map → write-commands-WTRSOSO3.js.map} +0 -0
  1293. /package/dist/{x-CZOHX4T2.js.map → x-WHE6PSDD.js.map} +0 -0
@@ -1,3182 +0,0 @@
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
- "openai/gpt-5.4-image-2",
1066
- "google/gemini-3.1-flash-image",
1067
- "google/gemini-3.1-flash-lite-image",
1068
- "google/gemini-3-pro-image",
1069
- "recraft/recraft-v4.1-pro-vector",
1070
- // LEGACY — the preview ids the Gemini image models shipped under until they went GA
1071
- // on 2026-06-18. Kept so every canvas written with them still validates and re-runs;
1072
- // never pick them for new work.
1073
- "google/gemini-3.1-flash-image-preview",
1074
- "google/gemini-3-pro-image-preview"
1075
- ];
1076
- var DEFAULT_IMAGE_GENERATE_MODEL = "google/gemini-3.1-flash-image";
1077
- var IMAGE_PRICE_TIER = {
1078
- "openai/gpt-image-2.5-sunburst": "standard",
1079
- "openai/gpt-image-2": "standard",
1080
- "openai/gpt-5.4-image-2": "standard",
1081
- "google/gemini-3.1-flash-image": "standard",
1082
- "google/gemini-3.1-flash-lite-image": "standard",
1083
- "google/gemini-3-pro-image": "pro",
1084
- "recraft/recraft-v4.1-pro-vector": "standard",
1085
- "google/gemini-3.1-flash-image-preview": "standard",
1086
- "google/gemini-3-pro-image-preview": "pro"
1087
- };
1088
- var IMAGE_TIER_CREDITS = { pro: 20, standard: 5 };
1089
- function imagePictureCredits(model) {
1090
- const tier = IMAGE_PRICE_TIER[model] ?? "standard";
1091
- return IMAGE_TIER_CREDITS[tier];
1092
- }
1093
- var VIDEO_GENERATE_MODELS = [
1094
- "bytedance/seedance-2.0",
1095
- "bytedance/seedance-2.5",
1096
- "google/gemini-omni-1.1-flash",
1097
- "google/gemini-omni-flash",
1098
- "google/veo-3.1",
1099
- "google/veo-3.1-fast",
1100
- "google/veo-3.1-lite",
1101
- "kwaivgi/kling-v3.0-pro",
1102
- "x-ai/grok-imagine-video",
1103
- "x-ai/grok-imagine-video-1.5",
1104
- "alibaba/wan-2.7",
1105
- "alibaba/wan-3.0",
1106
- "runway/gen-4.5",
1107
- "alibaba/happyhorse-1.1"
1108
- ];
1109
- var DEFAULT_VIDEO_GENERATE_MODEL = "google/gemini-omni-1.1-flash";
1110
- var REFERENCE_TO_VIDEO_MODELS = [
1111
- "bytedance/seedance-2.0",
1112
- "bytedance/seedance-2.5",
1113
- "google/gemini-omni-1.1-flash",
1114
- "google/gemini-omni-flash",
1115
- "x-ai/grok-imagine-video",
1116
- "alibaba/wan-2.7",
1117
- "alibaba/happyhorse-1.1"
1118
- ];
1119
- function supportsReferenceToVideo(model) {
1120
- return REFERENCE_TO_VIDEO_MODELS.includes(model);
1121
- }
1122
- var DEFAULT_AVATAR_VIDEO_MODEL = "x-ai/grok-imagine-video";
1123
- function isGeminiOmniModel(model) {
1124
- return model.startsWith("google/gemini-omni");
1125
- }
1126
- var GEMINI_OMNI_PREVIEW_MODEL = "google/gemini-omni-flash";
1127
- function isGeminiOmniPreviewModel(model) {
1128
- return model === GEMINI_OMNI_PREVIEW_MODEL;
1129
- }
1130
- function isSeedance25Model(model) {
1131
- return model === "bytedance/seedance-2.5";
1132
- }
1133
- var LAST_FRAME_TO_VIDEO_MODELS = [
1134
- "bytedance/seedance-2.0",
1135
- "bytedance/seedance-2.5",
1136
- "google/veo-3.1",
1137
- "google/veo-3.1-fast",
1138
- "kwaivgi/kling-v3.0-pro"
1139
- ];
1140
- function supportsLastFrame(model) {
1141
- return LAST_FRAME_TO_VIDEO_MODELS.includes(model);
1142
- }
1143
- var MODEL_REGISTRY = {
1144
- text_generate: {
1145
- "~google/gemini-flash-latest": {
1146
- label: "Google Gemini Flash (latest)",
1147
- route: OPENROUTER_ROUTE,
1148
- billing: USAGE_BILLED,
1149
- inputs: [],
1150
- required: ["prompt"],
1151
- params: {
1152
- prompt: { kind: "string" },
1153
- system: { kind: "string" },
1154
- response_format: { kind: "string", enum: ["text", "json_object"] },
1155
- web_search: { kind: "boolean" },
1156
- temperature: { kind: "number", min: 0, max: 2 },
1157
- max_tokens: { kind: "number", min: 1 }
1158
- }
1159
- },
1160
- "~google/gemini-pro-latest": {
1161
- label: "Google Gemini Pro (latest)",
1162
- route: OPENROUTER_ROUTE,
1163
- billing: USAGE_BILLED,
1164
- inputs: [],
1165
- required: ["prompt"],
1166
- params: {
1167
- prompt: { kind: "string" },
1168
- system: { kind: "string" },
1169
- response_format: { kind: "string", enum: ["text", "json_object"] },
1170
- web_search: { kind: "boolean" },
1171
- temperature: { kind: "number", min: 0, max: 2 },
1172
- max_tokens: { kind: "number", min: 1 }
1173
- }
1174
- }
1175
- },
1176
- image_describe: {
1177
- // Vision extraction — the Visual Architect system prompt lives on the
1178
- // backend, so there is no `prompt` param; `focus` appends emphasis only.
1179
- "~google/gemini-pro-latest": {
1180
- label: "Google Gemini Pro (latest, Vision)",
1181
- route: OPENROUTER_ROUTE,
1182
- billing: USAGE_BILLED,
1183
- inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1184
- required: [],
1185
- params: {
1186
- focus: { kind: "string" },
1187
- context: { kind: "string" },
1188
- temperature: { kind: "number", min: 0, max: 2 },
1189
- max_tokens: { kind: "number", min: 1 }
1190
- }
1191
- },
1192
- "~google/gemini-flash-latest": {
1193
- label: "Google Gemini Flash (latest, Vision)",
1194
- route: OPENROUTER_ROUTE,
1195
- billing: USAGE_BILLED,
1196
- inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1197
- required: [],
1198
- params: {
1199
- focus: { kind: "string" },
1200
- context: { kind: "string" },
1201
- temperature: { kind: "number", min: 0, max: 2 },
1202
- max_tokens: { kind: "number", min: 1 }
1203
- }
1204
- }
1205
- },
1206
- image_select: {
1207
- // Vision judgement — the selection contract (numbered images, JSON
1208
- // response) is baked into the backend prompt; `prompt` carries only the
1209
- // selection criteria. `count` has an engine-side default of 1, so it is
1210
- // not registry-required.
1211
- "~google/gemini-flash-latest": {
1212
- label: "Google Gemini Flash (latest, Vision)",
1213
- route: OPENROUTER_ROUTE,
1214
- billing: USAGE_BILLED,
1215
- inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1216
- required: ["prompt"],
1217
- params: {
1218
- prompt: { kind: "string" },
1219
- count: { kind: "number", min: 1 },
1220
- temperature: { kind: "number", min: 0, max: 2 },
1221
- max_tokens: { kind: "number", min: 1 }
1222
- }
1223
- },
1224
- "~google/gemini-pro-latest": {
1225
- label: "Google Gemini Pro (latest, Vision)",
1226
- route: OPENROUTER_ROUTE,
1227
- billing: USAGE_BILLED,
1228
- inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1229
- required: ["prompt"],
1230
- params: {
1231
- prompt: { kind: "string" },
1232
- count: { kind: "number", min: 1 },
1233
- temperature: { kind: "number", min: 0, max: 2 },
1234
- max_tokens: { kind: "number", min: 1 }
1235
- }
1236
- }
1237
- },
1238
- image_generate: {
1239
- // `seed` is omitted on every entry — OpenRouter's `image_config` schema
1240
- // has no `seed` slot for image-gen (different from video-gen), so passing
1241
- // it would be a silent no-op.
1242
- // The direct image model, not the `gpt-5.4-image-2` chat model that emitted
1243
- // images as a side effect. Notable capability gaps vs the Gemini entries:
1244
- // no `image_size` (OpenAI picks the pixel dimensions from the ratio, and a
1245
- // `resolution` is silently ignored) and the narrower `..._AR_GPT` ratio set.
1246
- "openai/gpt-image-2.5-sunburst": {
1247
- // Identical to the gpt-image-2 entry below except for the quality ladder and `n`
1248
- // (several images from one call) — the ratio set, the 16-reference ceiling, the missing `image_size` and the reasons
1249
- // `background` / `output_compression` stay undeclared all carry over unchanged.
1250
- label: "OpenAI GPT Image 2.5",
1251
- route: OPENROUTER_ROUTE,
1252
- billing: USAGE_BILLED,
1253
- inputs: [],
1254
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GPT_IMAGE_MAX_REFERENCES }],
1255
- required: ["prompt"],
1256
- params: {
1257
- prompt: { kind: "string", maxLength: GPT_IMAGE_PROMPT_MAX },
1258
- aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_GPT },
1259
- quality: { kind: "string", enum: OPENROUTER_IMAGE_QUALITY_25 },
1260
- n: OPENROUTER_IMAGE_N
1261
- }
1262
- },
1263
- "openai/gpt-image-2": {
1264
- // Its live endpoint also advertises `background` (auto|opaque) and
1265
- // `output_compression` (0-100), which we deliberately do not declare. Not an
1266
- // oversight: a registry param is a promise the whole system keeps — the
1267
- // canvas node schema, the dashboard control, the CLI flag and the cost model
1268
- // all have to carry it — and neither knob changes what the picture IS.
1269
- // Declaring them would widen four surfaces to expose a file-size dial.
1270
- label: "OpenAI GPT Image 2",
1271
- route: OPENROUTER_ROUTE,
1272
- billing: USAGE_BILLED,
1273
- inputs: [],
1274
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GPT_IMAGE_MAX_REFERENCES }],
1275
- required: ["prompt"],
1276
- params: {
1277
- prompt: { kind: "string", maxLength: GPT_IMAGE_PROMPT_MAX },
1278
- aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_GPT },
1279
- quality: { kind: "string", enum: OPENROUTER_IMAGE_QUALITY }
1280
- }
1281
- },
1282
- // LEGACY — kept so canvases authored before the gpt-image-2 switch still
1283
- // validate and re-run unchanged (`baker canvas run --slug` restores a recorded
1284
- // canvas verbatim, so dropping this model would break every stored creative
1285
- // that used it). Its param surface is the ORIGINAL one on purpose: unlike
1286
- // gpt-image-2 it still honors 4:5/5:4, and `image_size` is accepted-then-
1287
- // ignored upstream rather than rejected. Verified live on /api/v1/images.
1288
- // Don't reach for it in new work — the scaffolders default to gpt-image-2.
1289
- "openai/gpt-5.4-image-2": {
1290
- label: "OpenAI GPT-5.4 Image 2 (legacy)",
1291
- route: OPENROUTER_ROUTE,
1292
- billing: USAGE_BILLED,
1293
- inputs: [],
1294
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GPT_IMAGE_MAX_REFERENCES }],
1295
- required: ["prompt"],
1296
- params: {
1297
- prompt: { kind: "string", maxLength: GPT_IMAGE_PROMPT_MAX },
1298
- aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR },
1299
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE },
1300
- quality: { kind: "string", enum: OPENROUTER_IMAGE_QUALITY }
1301
- }
1302
- },
1303
- // The GA Nano Banana ids (2026-06-18). Same surface as the preview entries they
1304
- // replace — read off GET /api/v1/images/models/google/gemini-3.1-flash-image/endpoints
1305
- // and .../gemini-3-pro-image/endpoints — so a canvas moves between them unchanged.
1306
- "google/gemini-3.1-flash-image": {
1307
- label: "Google Gemini 3.1 Flash Image (Nano Banana 2)",
1308
- route: OPENROUTER_ROUTE,
1309
- billing: USAGE_BILLED,
1310
- inputs: [],
1311
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GEMINI_IMAGE_MAX_REFERENCES }],
1312
- required: ["prompt"],
1313
- params: {
1314
- prompt: { kind: "string" },
1315
- aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_EXTREME },
1316
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE_EXTENDED }
1317
- }
1318
- },
1319
- "google/gemini-3-pro-image": {
1320
- label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1321
- route: OPENROUTER_ROUTE,
1322
- billing: USAGE_BILLED,
1323
- inputs: [],
1324
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GEMINI_IMAGE_MAX_REFERENCES }],
1325
- required: ["prompt"],
1326
- params: {
1327
- prompt: { kind: "string" },
1328
- aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR },
1329
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE }
1330
- }
1331
- },
1332
- // LEGACY preview ids — see IMAGE_GENERATE_MODELS.
1333
- "google/gemini-3.1-flash-image-preview": {
1334
- label: "Google Gemini 3.1 Flash Image (Preview)",
1335
- route: OPENROUTER_ROUTE,
1336
- billing: USAGE_BILLED,
1337
- inputs: [],
1338
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GEMINI_IMAGE_MAX_REFERENCES }],
1339
- required: ["prompt"],
1340
- params: {
1341
- prompt: { kind: "string" },
1342
- aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_EXTREME },
1343
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE_EXTENDED }
1344
- }
1345
- },
1346
- "google/gemini-3.1-flash-lite-image": {
1347
- // Nano Banana 2 Lite. Same Gemini image family as the flash tier — same
1348
- // extreme aspect-ratio set, same reference editing — at HALF the output-token
1349
- // price ($0.00003 vs $0.00006 per output image token), which makes it the
1350
- // cheap-iteration tier for image work the way `veo-3.1-fast` is for video.
1351
- //
1352
- // The one thing it gives up is resolution: it renders 1K and nothing else.
1353
- // That is a hard provider 400, not a soft clamp, so it is gated here rather
1354
- // than discovered at dispatch. A 2K/4K hero frame belongs on the flash or pro
1355
- // tier. Unlike gpt-image it keeps 4:5 and 5:4, so Meta/Instagram portrait
1356
- // formats still come straight out of it.
1357
- //
1358
- // Reached through the normal OpenRouter image gateway (Google Vertex and
1359
- // Google AI Studio both serve it) — no direct-provider exception needed.
1360
- // Source: GET /api/v1/images/models/google/gemini-3.1-flash-lite-image/endpoints.
1361
- label: "Google Gemini 3.1 Flash Lite Image",
1362
- route: OPENROUTER_ROUTE,
1363
- billing: USAGE_BILLED,
1364
- inputs: [],
1365
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GEMINI_IMAGE_MAX_REFERENCES }],
1366
- required: ["prompt"],
1367
- params: {
1368
- prompt: { kind: "string" },
1369
- aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_EXTREME },
1370
- image_size: { kind: "string", enum: GEMINI_LITE_IMAGE_SIZE }
1371
- }
1372
- },
1373
- "google/gemini-3-pro-image-preview": {
1374
- label: "Google Gemini 3 Pro Image (Preview)",
1375
- route: OPENROUTER_ROUTE,
1376
- billing: USAGE_BILLED,
1377
- inputs: [],
1378
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GEMINI_IMAGE_MAX_REFERENCES }],
1379
- required: ["prompt"],
1380
- params: {
1381
- prompt: { kind: "string" },
1382
- aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR },
1383
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE }
1384
- // No `quality`: OpenRouter's per-endpoint schema lists it for gpt-image and
1385
- // for NO Gemini image model, pro included. It is accepted-then-dropped, so
1386
- // declaring it invites the scaffolder to emit a param that does nothing.
1387
- }
1388
- },
1389
- "recraft/recraft-v4.1-pro-vector": {
1390
- // The vector/logo tier, and the odd one out of this roster in three ways.
1391
- // All three are read off its live endpoint schema, and all three are the
1392
- // kind of fact that only shows up as a billed 400 if it is guessed:
1393
- // - it renders FIVE ratios (no 4:5 / 5:4 / 2:3 / 3:2 / 21:9), so portrait
1394
- // ad shapes snap to 3:4 rather than being sent as-is;
1395
- // - it has NO resolution knob (`supported_parameters` lists none), so
1396
- // `image_size` is refused here instead of accepted and ignored;
1397
- // - it takes exactly ONE reference image, against 14-16 everywhere else.
1398
- // Its palette levers are real but arrive as provider passthrough
1399
- // (`controls`), which is why they are `json` rather than typed enums; the
1400
- // backend adapter builds that block in `buildImageGenBody`.
1401
- label: "Recraft v4.1 Pro Vector",
1402
- route: OPENROUTER_ROUTE,
1403
- billing: USAGE_BILLED,
1404
- inputs: [],
1405
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: RECRAFT_MAX_REFERENCES }],
1406
- required: ["prompt"],
1407
- params: {
1408
- prompt: { kind: "string", maxLength: RECRAFT_PROMPT_MAX },
1409
- aspect_ratio: { kind: "string", enum: RECRAFT_IMAGE_AR },
1410
- strength: { kind: "number", min: 0, max: 1 },
1411
- rgb_colors: { kind: "json" },
1412
- background_rgb_color: { kind: "json" }
1413
- }
1414
- }
1415
- },
1416
- image_reference_sheet: {
1417
- // Multi-view subject reference sheets (turnaround grids). The sheet prompt
1418
- // is baked into the backend handler — params here are semantic levers
1419
- // only. Both models consume MULTIPLE reference images via the `references`
1420
- // input slot (required: a sheet without source images is just image_generate).
1421
- "google/gemini-3-pro-image": {
1422
- label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1423
- route: OPENROUTER_ROUTE,
1424
- billing: USAGE_BILLED,
1425
- inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1426
- required: ["subject_description", "subject_type"],
1427
- params: {
1428
- subject_description: { kind: "string" },
1429
- subject_type: { kind: "string", enum: ["character", "person", "product", "location"] },
1430
- views: { kind: "json" },
1431
- style: { kind: "string" },
1432
- prompt_override: { kind: "string" },
1433
- aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR },
1434
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE }
1435
- }
1436
- },
1437
- "google/gemini-3.1-flash-image": {
1438
- label: "Google Gemini 3.1 Flash Image (Nano Banana 2)",
1439
- route: OPENROUTER_ROUTE,
1440
- billing: USAGE_BILLED,
1441
- inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1442
- required: ["subject_description", "subject_type"],
1443
- params: {
1444
- subject_description: { kind: "string" },
1445
- subject_type: { kind: "string", enum: ["character", "person", "product", "location"] },
1446
- views: { kind: "json" },
1447
- style: { kind: "string" },
1448
- prompt_override: { kind: "string" },
1449
- aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_EXTREME },
1450
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE_EXTENDED }
1451
- }
1452
- },
1453
- // LEGACY preview ids, kept so existing canvases re-run.
1454
- "google/gemini-3-pro-image-preview": {
1455
- label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1456
- route: OPENROUTER_ROUTE,
1457
- billing: USAGE_BILLED,
1458
- inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1459
- required: ["subject_description", "subject_type"],
1460
- params: {
1461
- subject_description: { kind: "string" },
1462
- subject_type: { kind: "string", enum: ["character", "person", "product", "location"] },
1463
- views: { kind: "json" },
1464
- style: { kind: "string" },
1465
- prompt_override: { kind: "string" },
1466
- aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR },
1467
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE }
1468
- }
1469
- },
1470
- "google/gemini-3.1-flash-image-preview": {
1471
- label: "Google Gemini 3.1 Flash Image (Preview)",
1472
- route: OPENROUTER_ROUTE,
1473
- billing: USAGE_BILLED,
1474
- inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1475
- required: ["subject_description", "subject_type"],
1476
- params: {
1477
- subject_description: { kind: "string" },
1478
- subject_type: { kind: "string", enum: ["character", "person", "product", "location"] },
1479
- views: { kind: "json" },
1480
- style: { kind: "string" },
1481
- prompt_override: { kind: "string" },
1482
- aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_EXTREME },
1483
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE_EXTENDED }
1484
- }
1485
- }
1486
- },
1487
- image_aspect_adapt: {
1488
- // Multi-format adaptation of one creative. The recomposition prompt is
1489
- // baked into the backend handler. The target ratios come from EITHER an
1490
- // explicit `formats` list OR a `platform` preset that expands to the
1491
- // canonical set; exactly one of the two is required — that "one of" gate,
1492
- // and per-element ratio validation, live in the node's Zod schema (the
1493
- // registry can't express "one of" or gate array elements), so `formats`
1494
- // is not listed as registry-required. The source creative is a required
1495
- // input slot. `copy` (the exact lines the ad carries) and `safe_areas` (per
1496
- // format, the fractions each edge's interface covers) are set by the static
1497
- // scaffold so the reframe keeps every word, once, where the platform shows it.
1498
- "google/gemini-3-pro-image": {
1499
- label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1500
- route: OPENROUTER_ROUTE,
1501
- billing: USAGE_BILLED,
1502
- inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1503
- required: [],
1504
- params: {
1505
- formats: { kind: "json" },
1506
- platform: { kind: "string", enum: AD_FORMAT_PLATFORMS },
1507
- guidance: { kind: "string" },
1508
- copy: { kind: "json" },
1509
- safe_areas: { kind: "json" },
1510
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE }
1511
- }
1512
- },
1513
- "google/gemini-3.1-flash-image": {
1514
- label: "Google Gemini 3.1 Flash Image (Nano Banana 2)",
1515
- route: OPENROUTER_ROUTE,
1516
- billing: USAGE_BILLED,
1517
- inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1518
- required: [],
1519
- params: {
1520
- formats: { kind: "json" },
1521
- platform: { kind: "string", enum: AD_FORMAT_PLATFORMS },
1522
- guidance: { kind: "string" },
1523
- copy: { kind: "json" },
1524
- safe_areas: { kind: "json" },
1525
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE_EXTENDED }
1526
- }
1527
- },
1528
- // LEGACY preview ids, kept so existing canvases re-run.
1529
- "google/gemini-3-pro-image-preview": {
1530
- label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1531
- route: OPENROUTER_ROUTE,
1532
- billing: USAGE_BILLED,
1533
- inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1534
- required: [],
1535
- params: {
1536
- formats: { kind: "json" },
1537
- platform: { kind: "string", enum: AD_FORMAT_PLATFORMS },
1538
- guidance: { kind: "string" },
1539
- copy: { kind: "json" },
1540
- safe_areas: { kind: "json" },
1541
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE }
1542
- }
1543
- },
1544
- "google/gemini-3.1-flash-image-preview": {
1545
- label: "Google Gemini 3.1 Flash Image (Preview)",
1546
- route: OPENROUTER_ROUTE,
1547
- billing: USAGE_BILLED,
1548
- inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1549
- required: [],
1550
- params: {
1551
- formats: { kind: "json" },
1552
- platform: { kind: "string", enum: AD_FORMAT_PLATFORMS },
1553
- guidance: { kind: "string" },
1554
- copy: { kind: "json" },
1555
- safe_areas: { kind: "json" },
1556
- image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE_EXTENDED }
1557
- }
1558
- }
1559
- },
1560
- video_generate: {
1561
- "bytedance/seedance-2.0": {
1562
- // Routed via Replicate's official `bytedance/seedance-2.0` model. NOTE:
1563
- // ByteDance's upstream likeness filter blocks photoreal human faces on ANY
1564
- // reseller, and it does NOT care whether the person is real: it classifies
1565
- // pixels, so an AI-generated face that looks photographic is refused
1566
- // exactly like a photograph (E005 / content_policy_blocked). Confirmed in
1567
- // production against faces we generated ourselves. The only escape is Veo
1568
- // — NOT a synthetic presenter, which an earlier version of this note
1569
- // wrongly recommended and which sends you round the same loop.
1570
- label: "ByteDance Seedance 2.0",
1571
- route: { provider: "replicate" },
1572
- billing: { kind: "formula", formula: "seedance-2.0" },
1573
- inputs: [],
1574
- optional_inputs: [{ kind: "image", mimes: REPLICATE_IMAGE_MIMES, max: SEEDANCE_MAX_REFERENCES }],
1575
- required: ["prompt"],
1576
- params: {
1577
- // Replicate's Seedance wrapper hard-caps the prompt at 4000 chars; gate
1578
- // it here so an over-length prompt fails validate (free) not the billed call.
1579
- prompt: { kind: "string", maxLength: SEEDANCE_PROMPT_MAX },
1580
- aspect_ratio: {
1581
- kind: "string",
1582
- enum: ["1:1", "3:4", "9:16", "4:3", "16:9", "21:9", "9:21"]
1583
- },
1584
- resolution: { kind: "string", enum: ["480p", "720p", "1080p", "4k"] },
1585
- duration: { kind: "number", enum: SEEDANCE_DURATIONS },
1586
- // Replicate types this `integer`, and a fractional seed is a schema
1587
- // rejection rather than a rounded one. No range is advertised, so none is
1588
- // invented — see `InputSpec.max` on why absent must stay ungated.
1589
- seed: { kind: "number", integer: true },
1590
- generate_audio: { kind: "boolean" }
1591
- }
1592
- },
1593
- "bytedance/seedance-2.5": {
1594
- // Seedance 2.5 — the LONG-FORM, MULTIMODAL tier, and the only curated video
1595
- // model reached through OpenRouter that is not frame-only.
1596
- //
1597
- // Routed through OpenRouter's video gateway (provider `seed`), NOT through
1598
- // Replicate like 2.0 — the gateway carries the multimodal reference surface
1599
- // 2.5 exists for, and Replicate's 2.0 wrapper only has `reference_images`.
1600
- // The backend branches on the exact 2.0 id for the Replicate path, so this
1601
- // model must never be folded into a `startsWith("bytedance/seedance")`
1602
- // routing test: that is one character away from sending 2.5 to a wrapper
1603
- // that cannot express half of what it is being asked to do.
1604
- //
1605
- // Same upstream likeness filter as 2.0 — ByteDance classifies PIXELS, so an
1606
- // AI-generated face that reads photographic is refused exactly like a
1607
- // photograph (content_policy_blocked). A reference-guided clip refused that
1608
- // way is re-rendered on fal, which serves the same model under a licence that
1609
- // takes faces; a frame-started one is reported, never moved to another model.
1610
- //
1611
- // No published prompt cap on this route, so none is invented: OpenRouter's
1612
- // request schema declares no `maxLength` and the model is sold on long,
1613
- // multi-shot briefs. A ceiling we made up would refuse the exact prompts
1614
- // this tier exists to render.
1615
- label: "ByteDance Seedance 2.5",
1616
- route: OPENROUTER_ROUTE,
1617
- billing: { kind: "formula", formula: "seedance-2.5" },
1618
- recoveryRoute: SEEDANCE_FACE_RECOVERY_ROUTE,
1619
- inputs: [],
1620
- optional_inputs: [
1621
- { kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: SEEDANCE_25_MAX_IMAGE_REFERENCES },
1622
- { kind: "video", mimes: OPENROUTER_VIDEO_REFERENCE_MIMES, max: SEEDANCE_25_MAX_VIDEO_REFERENCES },
1623
- { kind: "audio", mimes: OPENROUTER_AUDIO_REFERENCE_MIMES, max: SEEDANCE_25_MAX_AUDIO_REFERENCES }
1624
- ],
1625
- required: ["prompt"],
1626
- params: {
1627
- prompt: { kind: "string" },
1628
- aspect_ratio: { kind: "string", enum: SEEDANCE_25_ASPECT_RATIOS },
1629
- resolution: { kind: "string", enum: SEEDANCE_25_RESOLUTIONS },
1630
- duration: { kind: "number", enum: SEEDANCE_25_DURATIONS },
1631
- seed: { kind: "number", integer: true, min: 0, max: UINT32_MAX },
1632
- generate_audio: { kind: "boolean" },
1633
- // A visible AI watermark on an ad creative is a defect, and this is the
1634
- // only curated model that lets us turn one off: `watermark` is named in
1635
- // the model's own `allowed_passthrough_parameters`, so it rides as a
1636
- // top-level body field exactly like Kling's `cfg_scale` does.
1637
- watermark: { kind: "boolean" }
1638
- }
1639
- },
1640
- "google/gemini-omni-1.1-flash": {
1641
- // Google Gemini Omni 1.1 Flash — the DEFAULT video model. Natively
1642
- // multimodal: it reasons over text + images and renders video WITH
1643
- // synchronized audio in one call, and it is the only curated model that
1644
- // takes reference images through its own first-party API (task
1645
- // `reference_to_video`).
1646
- //
1647
- // It is a SEPARATE entry from `google/gemini-omni-flash` (the preview),
1648
- // not a rolling upgrade of it, because the two do not render the same
1649
- // things: 1.1 takes a `resolution` and the preview does not, and 1.1 bills
1650
- // the seconds it renders where the preview bills its whole 10s window. One
1651
- // shared key would have to promise the union of those, which means a canvas
1652
- // could ask the preview for 360p and be quoted a third of what it charges.
1653
- //
1654
- // NOT on OpenRouter. `GET /api/v1/videos/models` lists 17 video models and
1655
- // no Gemini Omni at either version, so this is the sanctioned direct-provider
1656
- // exception (see `convex/lib/geminiOmni.ts`): Google's Interactions API,
1657
- // `POST /v1beta/interactions`. Its own `generateContent` endpoint refuses it
1658
- // ("This model only supports Interactions API"), so the Veo `predictLongRunning`
1659
- // shape does not apply either.
1660
- //
1661
- // The param set below is deliberately short and was read off the live API,
1662
- // not off the docs — the knobs absent here are rejected with a pre-dispatch
1663
- // 400 (`Unknown parameter '<name>'`): no `seed`, no `negative_prompt`, no
1664
- // `generate_audio`, no `person_generation` / `enhance_prompt` /
1665
- // `conditioning_scale`. Audio is always on and cannot be turned off.
1666
- // Widening this list does not widen the model; it just moves a free
1667
- // validation error into a billed one.
1668
- //
1669
- // `duration` is the odd one out: Omni has no duration FIELD at any nesting
1670
- // level, but it honours a length named in the prompt (3-10s), so the adapter
1671
- // turns this param into a prompt directive. It is a real, billable knob.
1672
- //
1673
- // NO VIDEO INPUT SLOT, and that is a gate on our project rather than a gap
1674
- // in the model or a mistake in how we ask. 1.1 advertises video references,
1675
- // `edit` and `extend`, and every request carrying a video comes back 400
1676
- // `content_blocked`.
1677
- //
1678
- // The controlled version, run through the shape Google's own docs use
1679
- // (`{"type":"document","uri":<Files API uri>}`, no generation_config),
1680
- // changing only the uploaded file: an IMAGE returns 200 and renders a clip;
1681
- // a VIDEO returns `content_blocked`. Same route, same structure. So the
1682
- // request shape is right and video input specifically is refused. Also
1683
- // measured across inline base64, all three tasks, video AND text output,
1684
- // synthetic clips, Omni's own output, real camera footage, and both our
1685
- // keys. Full probe log: `.context/omni-1.1-measurements.md`.
1686
- //
1687
- // Adding `{ kind: "video", mimes: … }` below is the ONE line that turns the
1688
- // whole feature on — the "Build on" control, the reference picker taking an
1689
- // MP4, the drop target and the source-clip cost premium are all driven off
1690
- // this slot. Add it the day the 400 stops, not before: until then it offers
1691
- // a control whose every use is refused.
1692
- label: "Google Gemini Omni 1.1 Flash",
1693
- route: { provider: "google-interactions", wireModel: "gemini-omni-1.1-flash" },
1694
- billing: { kind: "formula", formula: "gemini-omni" },
1695
- inputs: [],
1696
- optional_inputs: [{ kind: "image", mimes: GEMINI_OMNI_IMAGE_MIMES }],
1697
- required: ["prompt"],
1698
- params: {
1699
- prompt: { kind: "string" },
1700
- aspect_ratio: { kind: "string", enum: GEMINI_OMNI_ASPECT_RATIOS },
1701
- resolution: { kind: "string", enum: GEMINI_OMNI_RESOLUTIONS },
1702
- duration: { kind: "number", enum: GEMINI_OMNI_DURATIONS }
1703
- }
1704
- },
1705
- "google/gemini-omni-flash": {
1706
- // LEGACY — the Omni PREVIEW (`gemini-omni-flash-preview`), superseded by
1707
- // `google/gemini-omni-1.1-flash` above. Kept so canvases authored before 1.1
1708
- // still validate and re-run unchanged (`baker canvas run --slug` restores a
1709
- // recorded canvas verbatim, so dropping this model would break every stored
1710
- // creative that used it). Don't reach for it in new work.
1711
- //
1712
- // Its param surface is the ORIGINAL one on purpose, and the omission that
1713
- // matters is `resolution`. This model renders 720p / 24fps and nothing else.
1714
- //
1715
- // It does NOT reject the field, which is the trap and the reason this is
1716
- // enforced here rather than left to the provider: asked for `360p` it
1717
- // returns HTTP 200, a 1280x720 clip, and a bill of 17,376 video tokens —
1718
- // the 720p rate, three times the 5,793 that tier costs on 1.1. Accepted,
1719
- // ignored, and charged for. Copying 1.1's enum across to make the two
1720
- // entries match would hand a canvas a quality dial that does nothing and a
1721
- // quote a third of the real charge.
1722
- label: "Google Gemini Omni Flash (legacy preview)",
1723
- route: { provider: "google-interactions", wireModel: "gemini-omni-flash-preview" },
1724
- billing: { kind: "formula", formula: "gemini-omni" },
1725
- inputs: [],
1726
- optional_inputs: [{ kind: "image", mimes: GEMINI_OMNI_IMAGE_MIMES }],
1727
- required: ["prompt"],
1728
- params: {
1729
- prompt: { kind: "string" },
1730
- aspect_ratio: { kind: "string", enum: GEMINI_OMNI_ASPECT_RATIOS },
1731
- duration: { kind: "number", enum: GEMINI_OMNI_DURATIONS }
1732
- }
1733
- },
1734
- "google/veo-3.1": {
1735
- // Photoreal CINE CEILING + the real-face fallback (Veo generates adult
1736
- // humans from a keyframe, dodging ByteDance's real-person filter). Same
1737
- // OpenRouter google-vertex routing as the fast tier; the quality dial is
1738
- // `resolution: 1080p` + `generate_audio` + a real `negative_prompt`, not a
1739
- // separate provider knob. Reach for this for hero beats and any clip that
1740
- // must carry a real human likeness.
1741
- label: "Google Veo 3.1",
1742
- route: OPENROUTER_ROUTE,
1743
- billing: {
1744
- kind: "per_second",
1745
- // Veo prices 4K far above the base tier, and 4K is a selectable resolution,
1746
- // so folding it into the base rate under-quotes the dearest clip we can make.
1747
- // A QUOTE only: the charge is the usage OpenRouter reports for the call.
1748
- usd: { silent: 0.2, audio: 0.4, byResolution: { "4K": { silent: 0.4, audio: 0.6 } } }
1749
- },
1750
- inputs: [],
1751
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1752
- required: ["prompt"],
1753
- params: {
1754
- prompt: { kind: "string" },
1755
- negative_prompt: { kind: "string" },
1756
- aspect_ratio: { kind: "string", enum: ["16:9", "9:16"] },
1757
- resolution: { kind: "string", enum: ["720p", "1080p", "4K"] },
1758
- duration: { kind: "number", enum: [4, 6, 8] },
1759
- // Vertex declares `seed` a uint32: "accepted range 0-4294967295".
1760
- seed: { kind: "number", integer: true, min: 0, max: VEO_SEED_MAX },
1761
- generate_audio: { kind: "boolean" },
1762
- person_generation: { kind: "string", enum: ["allow_all", "allow_adult"] },
1763
- enhance_prompt: { kind: "boolean" },
1764
- conditioning_scale: { kind: "number" }
1765
- }
1766
- },
1767
- "kwaivgi/kling-v3.0-pro": {
1768
- // Motion-transfer / dynamic multi-shot beats. Reachable through the default
1769
- // OpenRouter gateway (generic video body — no google-vertex block), so it
1770
- // needs no direct-provider exception. `cfg_scale` trades prompt adherence
1771
- // vs motion freedom; higher = closer to prompt.
1772
- //
1773
- // Params below are the ones OpenRouter actually advertises for this model
1774
- // (GET /api/v1/videos/models). Three were wrong before and each was a free
1775
- // 400 or a silently unsupported knob: it renders 720p ONLY (1080p was
1776
- // offered and rejected), it takes ANY duration from 3-15s (we allowed just
1777
- // 5 and 10), and it does not support `seed` at all.
1778
- label: "Kling 3.0",
1779
- route: OPENROUTER_ROUTE,
1780
- billing: {
1781
- kind: "per_second",
1782
- // One flat rate across every resolution and mode.
1783
- usd: { silent: 0.112, audio: 0.168 }
1784
- },
1785
- inputs: [],
1786
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1787
- required: ["prompt"],
1788
- params: {
1789
- // Kling caps the prompt shorter than Seedance; gate it here so an
1790
- // over-length prompt fails validate (free) not the billed call. Its
1791
- // negative prompt is a SEPARATE 2,500 budget, not a shared one.
1792
- prompt: { kind: "string", maxLength: KLING_PROMPT_MAX },
1793
- negative_prompt: { kind: "string", maxLength: KLING_PROMPT_MAX },
1794
- aspect_ratio: { kind: "string", enum: ["16:9", "9:16", "1:1"] },
1795
- resolution: { kind: "string", enum: ["720p"] },
1796
- duration: { kind: "number", enum: KLING_DURATIONS },
1797
- generate_audio: { kind: "boolean" },
1798
- cfg_scale: { kind: "number", min: 0, max: 1 }
1799
- }
1800
- },
1801
- "x-ai/grok-imagine-video": {
1802
- // The avatar workhorse. Measured best of the reference-capable models on
1803
- // identity retention AND aspect-ratio obedience, at the lowest rate of any
1804
- // video model we carry ($0.05/s at 480p). No audio at all — `generate_audio`
1805
- // is absent from its OpenRouter listing, so a talking head goes to Wan 2.7.
1806
- // NOTE: `x-ai/grok-imagine-video-1.5` is NOT a drop-in upgrade — it is
1807
- // described as plain image-to-video and drops the reference conditioning
1808
- // this entry exists for.
1809
- label: "Grok Imagine Video",
1810
- route: OPENROUTER_ROUTE,
1811
- billing: {
1812
- kind: "per_second",
1813
- usd: {
1814
- silent: 0.07,
1815
- audio: 0.07,
1816
- byResolution: { "480p": { silent: 0.05, audio: 0.05 }, "720p": { silent: 0.07, audio: 0.07 } }
1817
- }
1818
- },
1819
- inputs: [],
1820
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1821
- required: ["prompt"],
1822
- params: {
1823
- prompt: { kind: "string" },
1824
- aspect_ratio: { kind: "string", enum: ["16:9", "9:16", "1:1", "4:3", "3:4", "3:2", "2:3"] },
1825
- resolution: { kind: "string", enum: ["480p", "720p"] },
1826
- duration: { kind: "number", enum: GROK_IMAGINE_DURATIONS }
1827
- }
1828
- },
1829
- "alibaba/wan-2.7": {
1830
- // Reference-to-video AND native audio — the only model we carry with both,
1831
- // which makes it the landscape talking-head option.
1832
- //
1833
- // LANDSCAPE ONLY, measured. It advertises 9:16, 1:1, 4:3 and 3:4, and
1834
- // delivers 16:9 regardless: asked for vertical via `aspect_ratio: "9:16"`
1835
- // it returned 1280x720, and asked again via an explicit
1836
- // `size: "720x1280"` from its own `supported_sizes` it returned 1280x720
1837
- // again. The enum below is therefore what it DOES, not what it claims, so
1838
- // nobody pays for a vertical clip that comes back landscape. For a vertical
1839
- // avatar clip use `x-ai/grok-imagine-video` (silent) or animate a generated
1840
- // still with `google/veo-3.1-lite` (native audio, honours 9:16).
1841
- label: "Alibaba Wan 2.7",
1842
- route: OPENROUTER_ROUTE,
1843
- billing: {
1844
- kind: "per_second",
1845
- // Flat $0.10/s across resolutions and modes, audio included.
1846
- usd: { silent: 0.1, audio: 0.1 },
1847
- minBilledSeconds: MIN_BILLED_SECONDS
1848
- },
1849
- inputs: [],
1850
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1851
- required: ["prompt"],
1852
- params: {
1853
- prompt: { kind: "string" },
1854
- negative_prompt: { kind: "string" },
1855
- aspect_ratio: { kind: "string", enum: ["16:9"] },
1856
- resolution: { kind: "string", enum: ["720p", "1080p"] },
1857
- duration: { kind: "number", enum: WAN_27_DURATIONS },
1858
- seed: { kind: "number" },
1859
- generate_audio: { kind: "boolean" }
1860
- }
1861
- },
1862
- "x-ai/grok-imagine-video-1.5": {
1863
- // NOT a replacement for the entry above, and deliberately absent from
1864
- // `AVATAR_VIDEO_MODELS` and `REFERENCE_TO_VIDEO_MODELS`: OpenRouter describes the
1865
- // older Grok as "text-, image-, and reference-conditioned" and 1.5 as taking "an
1866
- // optional starting image". Reference conditioning is the whole reason Grok carries
1867
- // avatars — it is what holds a face from the identity sheet — so swapping them
1868
- // would quietly cost every avatar clip its likeness.
1869
- //
1870
- // What it adds over the older one: 1080p, and 15s rather than 10.
1871
- label: "Grok Imagine Video 1.5",
1872
- route: OPENROUTER_ROUTE,
1873
- billing: {
1874
- kind: "per_second",
1875
- // `cents_per_video_output_second_*`: 8c, 14c and 25c. No audio, so both
1876
- // columns are the same rate rather than one being wrong.
1877
- usd: {
1878
- silent: 0.14,
1879
- audio: 0.14,
1880
- byResolution: {
1881
- "480p": { silent: 0.08, audio: 0.08 },
1882
- "720p": { silent: 0.14, audio: 0.14 },
1883
- "1080p": { silent: 0.25, audio: 0.25 }
1884
- }
1885
- }
1886
- },
1887
- inputs: [],
1888
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1889
- required: ["prompt"],
1890
- params: {
1891
- prompt: { kind: "string" },
1892
- aspect_ratio: { kind: "string", enum: ["16:9", "9:16", "1:1", "4:3", "3:4", "3:2", "2:3"] },
1893
- resolution: { kind: "string", enum: ["480p", "720p", "1080p"] },
1894
- duration: { kind: "number", enum: GROK_IMAGINE_15_DURATIONS }
1895
- }
1896
- },
1897
- "alibaba/wan-3.0": {
1898
- // 2.7's successor on every axis that matters: 2–30s against 2–10, 1080p and 480p
1899
- // as well as 720p, and it keeps the native audio that made 2.7 the landscape
1900
- // talking-head option.
1901
- //
1902
- // The ratios are what it ADVERTISES. 2.7 advertised five and delivered 16:9 for
1903
- // all of them — measured, twice, which is why its enum here is a single value. That
1904
- // was a different model and this one is not gated on its predecessor's lie, but
1905
- // the first vertical clip anyone renders here is worth looking at before a campaign
1906
- // is built on it.
1907
- //
1908
- // No `last_frame`: 2.7 takes one and 3.0 does not, so a canvas that ends a shot on
1909
- // a chosen frame stays on 2.7.
1910
- label: "Alibaba Wan 3.0",
1911
- route: OPENROUTER_ROUTE,
1912
- billing: {
1913
- kind: "per_second",
1914
- // Priced per resolution where 2.7 was flat, and the rate still includes
1915
- // audio: there is no separate audio SKU. `duration_seconds_480p|720p|1080p`.
1916
- usd: {
1917
- silent: 0.1,
1918
- audio: 0.1,
1919
- byResolution: {
1920
- "480p": { silent: 0.05, audio: 0.05 },
1921
- "720p": { silent: 0.1, audio: 0.1 },
1922
- "1080p": { silent: 0.2, audio: 0.2 }
1923
- }
1924
- }
1925
- },
1926
- inputs: [],
1927
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1928
- required: ["prompt"],
1929
- params: {
1930
- prompt: { kind: "string" },
1931
- aspect_ratio: { kind: "string", enum: ["16:9", "9:16", "1:1", "4:3", "3:4"] },
1932
- resolution: { kind: "string", enum: ["480p", "720p", "1080p"] },
1933
- duration: { kind: "number", enum: WAN_30_DURATIONS },
1934
- seed: { kind: "number" },
1935
- generate_audio: { kind: "boolean" }
1936
- }
1937
- },
1938
- "runway/gen-4.5": {
1939
- // One resolution, two shapes, and silent — `generate_audio: false` in its listing,
1940
- // so a talking head belongs on Wan or Omni. First frame only, no reference.
1941
- label: "Runway Gen-4.5",
1942
- route: OPENROUTER_ROUTE,
1943
- billing: {
1944
- kind: "per_second",
1945
- // One flat rate, one resolution: `cents_per_second_output: 12`. Silent.
1946
- usd: { silent: 0.12, audio: 0.12 }
1947
- },
1948
- inputs: [],
1949
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1950
- required: ["prompt"],
1951
- params: {
1952
- prompt: { kind: "string" },
1953
- aspect_ratio: { kind: "string", enum: ["16:9", "9:16"] },
1954
- resolution: { kind: "string", enum: ["720p"] },
1955
- duration: { kind: "number", enum: RUNWAY_45_DURATIONS },
1956
- seed: { kind: "number" }
1957
- }
1958
- },
1959
- "alibaba/happyhorse-1.1": {
1960
- // Third reference-capable option: strong identity, correct ratios, no audio.
1961
- // First-frame only (no `last_frame`), so it cannot close a beat on a
1962
- // specified end pose the way Wan and Veo can.
1963
- label: "Alibaba HappyHorse 1.1",
1964
- route: OPENROUTER_ROUTE,
1965
- billing: {
1966
- kind: "per_second",
1967
- usd: { silent: 0.1278, audio: 0.1278, byResolution: { "720p": { silent: 0.0988, audio: 0.0988 } } },
1968
- minBilledSeconds: MIN_BILLED_SECONDS
1969
- },
1970
- inputs: [],
1971
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1972
- required: ["prompt"],
1973
- params: {
1974
- prompt: { kind: "string" },
1975
- aspect_ratio: { kind: "string", enum: ["16:9", "9:16", "1:1", "4:3", "3:4", "21:9", "9:21"] },
1976
- resolution: { kind: "string", enum: ["720p", "1080p"] },
1977
- duration: { kind: "number", enum: HAPPYHORSE_DURATIONS },
1978
- seed: { kind: "number" }
1979
- }
1980
- },
1981
- "google/veo-3.1-lite": {
1982
- // The cheapest way to animate a still that carries a real face: same Veo
1983
- // family and the same escape from ByteDance's filter, at $0.05/s with audio
1984
- // at 720p against Veo 3.1's $0.40. That 8x is the difference between an
1985
- // avatar clip you iterate on and one you think twice about.
1986
- label: "Google Veo 3.1 Lite",
1987
- route: OPENROUTER_ROUTE,
1988
- billing: {
1989
- kind: "per_second",
1990
- usd: { silent: 0.05, audio: 0.08, byResolution: { "720p": { silent: 0.03, audio: 0.05 } } }
1991
- },
1992
- inputs: [],
1993
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1994
- required: ["prompt"],
1995
- params: {
1996
- prompt: { kind: "string" },
1997
- negative_prompt: { kind: "string" },
1998
- aspect_ratio: { kind: "string", enum: ["16:9", "9:16"] },
1999
- resolution: { kind: "string", enum: ["720p", "1080p"] },
2000
- duration: { kind: "number", enum: [4, 6, 8] },
2001
- seed: { kind: "number" },
2002
- generate_audio: { kind: "boolean" },
2003
- person_generation: { kind: "string", enum: ["allow_all", "allow_adult"] },
2004
- enhance_prompt: { kind: "boolean" },
2005
- conditioning_scale: { kind: "number" }
2006
- }
2007
- },
2008
- "google/veo-3.1-fast": {
2009
- // Cheap test/iteration model. Forwarded by the backend via
2010
- // `provider.options.google-vertex.parameters` (camelCased on the wire).
2011
- label: "Google Veo 3.1 Fast",
2012
- route: OPENROUTER_ROUTE,
2013
- billing: {
2014
- kind: "per_second",
2015
- usd: {
2016
- silent: 0.1,
2017
- audio: 0.12,
2018
- byResolution: { "720p": { silent: 0.08, audio: 0.1 }, "4K": { silent: 0.25, audio: 0.3 } }
2019
- }
2020
- },
2021
- inputs: [],
2022
- optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
2023
- required: ["prompt"],
2024
- params: {
2025
- prompt: { kind: "string" },
2026
- negative_prompt: { kind: "string" },
2027
- aspect_ratio: { kind: "string", enum: ["16:9", "9:16"] },
2028
- resolution: { kind: "string", enum: ["720p", "1080p", "4K"] },
2029
- duration: { kind: "number", enum: [4, 6, 8] },
2030
- seed: { kind: "number", integer: true, min: 0, max: VEO_SEED_MAX },
2031
- generate_audio: { kind: "boolean" },
2032
- // Image-to-video and EU/UK/CH/MENA regions cap this at `allow_adult`;
2033
- // `allow_all` is text-to-video only. Allow both so an image-conditioned
2034
- // Veo clip (the real-face fallback) validates.
2035
- person_generation: { kind: "string", enum: ["allow_all", "allow_adult"] },
2036
- enhance_prompt: { kind: "boolean" },
2037
- conditioning_scale: { kind: "number" }
2038
- }
2039
- }
2040
- },
2041
- video_deconstruct: {
2042
- // Replication-grade video extraction — the forensic system prompts live on
2043
- // the backend; `focus` appends emphasis only. Frames ride on a throwaway
2044
- // Mux asset; analysis runs on Gemini with the video as a file part.
2045
- "~google/gemini-flash-latest": {
2046
- label: "Google Gemini Flash (latest, Video)",
2047
- route: OPENROUTER_ROUTE,
2048
- billing: USAGE_BILLED,
2049
- inputs: [{ kind: "video", mimes: DECONSTRUCT_VIDEO_MIMES }],
2050
- required: [],
2051
- params: {
2052
- mode: { kind: "string", enum: ["full", "index"] },
2053
- language: { kind: "string" },
2054
- max_scenes: { kind: "number", min: 1, max: 60 },
2055
- focus: { kind: "string" },
2056
- start_s: { kind: "number", min: 0 },
2057
- end_s: { kind: "number", min: 0 },
2058
- max_clip_s: { kind: "number", min: 1, max: 60 },
2059
- transcriber: { kind: "string", enum: ["groq", "deepgram"] },
2060
- // Real visual shot-cut timestamps (seconds) from local PySceneDetect;
2061
- // scene boundaries snap onto them so frames never straddle a hard cut.
2062
- // Shape (number[]) is enforced by the node + backend Zod schemas.
2063
- shot_cuts: { kind: "json" }
2064
- }
2065
- },
2066
- "~google/gemini-pro-latest": {
2067
- label: "Google Gemini Pro (latest, Video)",
2068
- route: OPENROUTER_ROUTE,
2069
- billing: USAGE_BILLED,
2070
- inputs: [{ kind: "video", mimes: DECONSTRUCT_VIDEO_MIMES }],
2071
- required: [],
2072
- params: {
2073
- mode: { kind: "string", enum: ["full", "index"] },
2074
- language: { kind: "string" },
2075
- max_scenes: { kind: "number", min: 1, max: 60 },
2076
- focus: { kind: "string" },
2077
- start_s: { kind: "number", min: 0 },
2078
- end_s: { kind: "number", min: 0 },
2079
- max_clip_s: { kind: "number", min: 1, max: 60 },
2080
- transcriber: { kind: "string", enum: ["groq", "deepgram"] },
2081
- // See gemini-flash-latest above — local PySceneDetect shot-cut timestamps.
2082
- shot_cuts: { kind: "json" }
2083
- }
2084
- }
2085
- },
2086
- video_lipsync: {
2087
- // Formerly `fal/veed-lipsync`, which named a provider and a model it had stopped
2088
- // running on; that id stays accepted through `MODEL_ALIASES`.
2089
- "replicate/sync-lipsync-2": {
2090
- label: "Sync Labs Lipsync 2 (Replicate)",
2091
- route: { provider: "replicate", wireModel: "sync/lipsync-2" },
2092
- billing: { kind: "formula", formula: "lipsync-minutes" },
2093
- inputs: [
2094
- { kind: "video", mimes: REPLICATE_VIDEO_MIMES },
2095
- { kind: "audio", mimes: REPLICATE_AUDIO_MIMES }
2096
- ],
2097
- required: [],
2098
- params: {}
2099
- }
2100
- },
2101
- tts: {
2102
- "elevenlabs/eleven_v3": {
2103
- // eleven_v3 does NOT yet support context stitching
2104
- // (previous_text/next_text/*_request_ids). ElevenLabs returns a clean
2105
- // `unsupported_model` 400 if you pass them.
2106
- label: "ElevenLabs Eleven v3",
2107
- route: { provider: "elevenlabs", wireModel: "eleven_v3" },
2108
- billing: { kind: "formula", formula: "elevenlabs-characters" },
2109
- inputs: [],
2110
- required: ["text", "voice"],
2111
- params: {
2112
- text: { kind: "string", maxLength: ELEVENLABS_MAX_TEXT_CHARS },
2113
- voice: { kind: "string" },
2114
- language_code: { kind: "string" },
2115
- stability: { kind: "number", min: 0, max: 1 },
2116
- similarity_boost: { kind: "number", min: 0, max: 1 },
2117
- voice_settings: { kind: "json" },
2118
- seed: { kind: "number", min: 0, max: 4294967295 },
2119
- pronunciation_dictionary_locators: { kind: "json" },
2120
- apply_text_normalization: { kind: "string", enum: ["auto", "on", "off"] },
2121
- apply_language_text_normalization: { kind: "boolean" },
2122
- with_timestamps: { kind: "boolean" },
2123
- output_format: { kind: "string", enum: ELEVENLABS_OUTPUT_FORMATS }
2124
- }
2125
- }
2126
- },
2127
- audio_voice_convert: {
2128
- "elevenlabs/eleven_multilingual_sts_v2": {
2129
- // Speech-to-speech / Voice Changer: re-voice an existing audio clip in the
2130
- // TARGET voice, preserving timing/prosody. Used to normalize a talking-head
2131
- // clip's native (generator-chosen) voice into ONE consistent brand voice.
2132
- label: "ElevenLabs Voice Changer (multilingual STS v2)",
2133
- route: { provider: "elevenlabs", wireModel: "eleven_multilingual_sts_v2" },
2134
- billing: { kind: "formula", formula: "elevenlabs-voice-convert-minutes" },
2135
- inputs: [{ kind: "audio", mimes: REPLICATE_AUDIO_MIMES }],
2136
- required: ["voice"],
2137
- params: {
2138
- voice: { kind: "string" },
2139
- output_format: { kind: "string", enum: ELEVENLABS_OUTPUT_FORMATS },
2140
- remove_background_noise: { kind: "boolean" }
2141
- }
2142
- }
2143
- },
2144
- music: {
2145
- "elevenlabs/music-v1": {
2146
- label: "ElevenLabs Music v1 (Compose)",
2147
- route: { provider: "elevenlabs", wireModel: ELEVENLABS_MUSIC_ENGINE },
2148
- billing: { kind: "formula", formula: "elevenlabs-music-seconds" },
2149
- inputs: [],
2150
- required: [],
2151
- params: {
2152
- prompt: { kind: "string" },
2153
- composition_plan: { kind: "json" },
2154
- music_length_ms: { kind: "number", min: 3e3, max: ELEVENLABS_MAX_MUSIC_LENGTH_MS },
2155
- seed: { kind: "number" },
2156
- force_instrumental: { kind: "boolean" },
2157
- respect_sections_durations: { kind: "boolean" },
2158
- with_timestamps: { kind: "boolean" },
2159
- output_format: { kind: "string", enum: ELEVENLABS_OUTPUT_FORMATS }
2160
- }
2161
- },
2162
- "elevenlabs/video-background-music-v1": {
2163
- label: "ElevenLabs Video Background Music v1",
2164
- route: { provider: "elevenlabs", wireModel: ELEVENLABS_MUSIC_ENGINE },
2165
- billing: { kind: "formula", formula: "elevenlabs-music-seconds" },
2166
- inputs: [{ kind: "video", mimes: REPLICATE_VIDEO_MIMES }],
2167
- required: [],
2168
- params: {
2169
- description: { kind: "string" },
2170
- tags: { kind: "json" },
2171
- output_format: { kind: "string", enum: ELEVENLABS_OUTPUT_FORMATS }
2172
- }
2173
- }
2174
- },
2175
- dialogue: {
2176
- "elevenlabs/eleven_v3": {
2177
- label: "ElevenLabs Eleven v3 (Dialogue)",
2178
- route: { provider: "elevenlabs", wireModel: "eleven_v3" },
2179
- billing: { kind: "formula", formula: "elevenlabs-characters" },
2180
- inputs: [],
2181
- required: ["inputs"],
2182
- params: {
2183
- inputs: { kind: "json" },
2184
- language_code: { kind: "string" },
2185
- settings: { kind: "json" },
2186
- seed: { kind: "number", min: 0, max: 4294967295 },
2187
- apply_text_normalization: { kind: "string", enum: ["auto", "on", "off"] },
2188
- with_timestamps: { kind: "boolean" },
2189
- output_format: { kind: "string", enum: ELEVENLABS_OUTPUT_FORMATS }
2190
- }
2191
- }
2192
- },
2193
- sound_effect: {
2194
- "elevenlabs/eleven_text_to_sound_v2": {
2195
- label: "ElevenLabs Text-to-Sound v2",
2196
- route: { provider: "elevenlabs", wireModel: "eleven_text_to_sound_v2" },
2197
- billing: { kind: "formula", formula: "elevenlabs-sound-effect-seconds" },
2198
- inputs: [],
2199
- required: ["text"],
2200
- params: {
2201
- text: { kind: "string" },
2202
- duration_seconds: { kind: "number", min: 0.5, max: 30 },
2203
- prompt_influence: { kind: "number", min: 0, max: 1 },
2204
- loop: { kind: "boolean" },
2205
- output_format: { kind: "string", enum: ELEVENLABS_OUTPUT_FORMATS }
2206
- }
2207
- }
2208
- }
2209
- };
2210
- var MODEL_ALIASES = {
2211
- "fal/veed-lipsync": "replicate/sync-lipsync-2",
2212
- "fal/veed-video-background-removal": "replicate/birefnet-video",
2213
- "fal/birefnet-v2": "replicate/birefnet"
2214
- };
2215
- function canonicalModelId(model) {
2216
- return Object.keys(MODEL_ALIASES).includes(model) ? MODEL_ALIASES[model] : model;
2217
- }
2218
- function modelIdsAccepted(canonical) {
2219
- return [canonical, ...Object.keys(MODEL_ALIASES).filter((legacy) => MODEL_ALIASES[legacy] === canonical)];
2220
- }
2221
- function perSecondBilling(model) {
2222
- const billing = MODEL_REGISTRY.video_generate[model]?.billing;
2223
- return billing?.kind === "per_second" ? billing : void 0;
2224
- }
2225
- var MODEL_ROLES = {
2226
- /** Ad frames and static-ad plates: the most faithful text and identity reproduction. */
2227
- adImage: { kind: "image_generate", model: "openai/gpt-image-2.5-sunburst" },
2228
- /**
2229
- * The multi-view reference sheet a recurring element is fused on. Gemini 3 Pro makes
2230
- * the cleanest, best-labelled turnaround, worth it for the ONE reference every frame
2231
- * of an ad grounds on.
2232
- */
2233
- referenceSheet: { kind: "image_reference_sheet", model: "google/gemini-3-pro-image" },
2234
- /** Re-framing a static ad whose copy is baked into the pixels. */
2235
- aspectAdapt: { kind: "image_aspect_adapt", model: "google/gemini-3-pro-image" },
2236
- /**
2237
- * The judge comparing candidate plates. Flash, not Pro: Pro measured 5 credits for
2238
- * one pick, a tenth of the render it judges.
2239
- */
2240
- plateJudge: { kind: "image_select", model: "~google/gemini-flash-latest" },
2241
- /**
2242
- * The static-ad blueprint extraction, and the fit of a reference to a company (`winning-ads fit`).
2243
- * Flash, not Pro: measured on 16 proven ads (dev, Oct 2026), Flash read as well, answered 11 describes
2244
- * of 12 (Pro 8: its preview model stopped answers part-way) and 16 fits of 16 (Pro 15), at under half
2245
- * the describe's cost and a fifth of the fit's; the fit kept or rejected the same ads 14 times of 15.
2246
- * A describe takes ~10 s longer (40 s), a fit ~12 s less (10 s).
2247
- */
2248
- adDescribe: { kind: "image_describe", model: "~google/gemini-flash-latest" },
2249
- /** The element-selection and layout passes over a blueprint. */
2250
- blueprintAnalysis: { kind: "text_generate", model: "~google/gemini-flash-latest" },
2251
- /**
2252
- * The viewer an ad reaches, played before a static ad renders (`baker canvas viewer-check`):
2253
- * says from the copy and the scene what is offered, to whom, and what to do next. Text
2254
- * only and asked once per ad and viewer, so Flash; the calibration set (E8) decides.
2255
- */
2256
- viewerCheck: { kind: "text_generate", model: "~google/gemini-flash-latest" },
2257
- /**
2258
- * Picks the customer truths out of reviews, testimonials and threads (`baker research
2259
- * customers`): returns exact spans the code then checks against the source. Text only and
2260
- * one call per batch, so Flash.
2261
- */
2262
- customerInsights: { kind: "text_generate", model: "~google/gemini-flash-latest" },
2263
- /**
2264
- * The same viewer shown the FINISHED static ad at phone size for about three seconds, with no
2265
- * brand and no brief: what is sold, whether it is for them, what to do next, what stopped them
2266
- * (`glance-check.ts`). One small picture per run, so Flash.
2267
- */
2268
- glanceCheck: { kind: "image_describe", model: "~google/gemini-flash-latest" },
2269
- /**
2270
- * Reads every line of text and the logo of a finished static ad WITH its box, for the
2271
- * copy and safe-area checks. Bench E10 (2026-09-30): word F1 0.994, box IoU 0.937, 4.3 s,
2272
- * about $0.005 an image on `google/gemini-3.8-flash`, which this alias resolves to;
2273
- * tesseract and PaddleOCR missed the 0.95 F1 gate.
2274
- */
2275
- textBoxReader: { kind: "image_describe", model: "~google/gemini-flash-latest" },
2276
- /**
2277
- * Scene-by-scene video extraction. Flash: ~2-3x faster per call than Pro, which keeps
2278
- * each per-scene step inside the action time budget.
2279
- */
2280
- videoDeconstruct: { kind: "video_deconstruct", model: "~google/gemini-flash-latest" },
2281
- /** The backend `image_search` agent loop that picks search tools and queries. */
2282
- imageSearch: { kind: "text_generate", model: "~google/gemini-flash-latest" },
2283
- voiceover: { kind: "tts", model: "elevenlabs/eleven_v3" },
2284
- soundEffect: { kind: "sound_effect", model: "elevenlabs/eleven_text_to_sound_v2" },
2285
- musicBed: { kind: "music", model: "elevenlabs/music-v1" },
2286
- /** Re-voices a talking clip's native audio into one consistent brand voice. */
2287
- voiceConvert: { kind: "audio_voice_convert", model: "elevenlabs/eleven_multilingual_sts_v2" },
2288
- /** The scored video router's candidates, one per job it can route to. */
2289
- videoRouterWorkhorse: { kind: "video_generate", model: "bytedance/seedance-2.0" },
2290
- videoRouterRealFace: { kind: "video_generate", model: "google/veo-3.1" },
2291
- videoRouterRealFaceEconomy: { kind: "video_generate", model: "google/veo-3.1-fast" },
2292
- videoRouterMotion: { kind: "video_generate", model: "kwaivgi/kling-v3.0-pro" },
2293
- imageDefault: { kind: "image_generate", model: DEFAULT_IMAGE_GENERATE_MODEL },
2294
- videoDefault: { kind: "video_generate", model: DEFAULT_VIDEO_GENERATE_MODEL },
2295
- avatarVideo: { kind: "video_generate", model: DEFAULT_AVATAR_VIDEO_MODEL }
2296
- };
2297
- var AD_IMAGE_MODEL = MODEL_ROLES.adImage.model;
2298
- var REFERENCE_SHEET_MODEL = MODEL_ROLES.referenceSheet.model;
2299
- var ASPECT_ADAPT_MODEL = MODEL_ROLES.aspectAdapt.model;
2300
- var PLATE_JUDGE_MODEL = MODEL_ROLES.plateJudge.model;
2301
- var AD_DESCRIBE_MODEL = MODEL_ROLES.adDescribe.model;
2302
- var BLUEPRINT_ANALYSIS_MODEL = MODEL_ROLES.blueprintAnalysis.model;
2303
- var VIEWER_CHECK_MODEL = MODEL_ROLES.viewerCheck.model;
2304
- var CUSTOMER_INSIGHTS_MODEL = MODEL_ROLES.customerInsights.model;
2305
- var GLANCE_CHECK_MODEL = MODEL_ROLES.glanceCheck.model;
2306
- var TEXT_BOX_READER_MODEL = MODEL_ROLES.textBoxReader.model;
2307
- var VIDEO_DECONSTRUCT_MODEL = MODEL_ROLES.videoDeconstruct.model;
2308
- var IMAGE_SEARCH_MODEL = MODEL_ROLES.imageSearch.model;
2309
- var VOICEOVER_MODEL = MODEL_ROLES.voiceover.model;
2310
- var SOUND_EFFECT_MODEL = MODEL_ROLES.soundEffect.model;
2311
- var MUSIC_BED_MODEL = MODEL_ROLES.musicBed.model;
2312
- var VOICE_CONVERT_MODEL = MODEL_ROLES.voiceConvert.model;
2313
- function isRegisteredModel(kind, model) {
2314
- return MODEL_REGISTRY[kind]?.[canonicalModelId(model)] !== void 0;
2315
- }
2316
- function imageGenerateAspectRatios() {
2317
- const seen = /* @__PURE__ */ new Set();
2318
- for (const model of IMAGE_GENERATE_MODELS) {
2319
- for (const ratio of supportedAspectRatios("image_generate", model) ?? []) seen.add(ratio);
2320
- }
2321
- return [...seen];
2322
- }
2323
- function supportsParam(kind, model, param) {
2324
- return MODEL_REGISTRY[kind]?.[model]?.params[param] !== void 0;
2325
- }
2326
- var DEFAULT_CLIP_DURATION_S = 5;
2327
- var SPOKEN_WORDS_PER_SECOND = 2.5;
2328
- 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");
2329
- function spokenWordsIn(prompt) {
2330
- if (!prompt) return 0;
2331
- const quoted = [...prompt.matchAll(SPOKEN_LINE)].map((m) => m[1] ?? "");
2332
- const text = quoted.join(" ").trim();
2333
- return text ? text.split(/\s+/).filter(Boolean).length : 0;
2334
- }
2335
- var SPOKEN_CLIP_DURATION_S = 8;
2336
- function nearestClipDuration(model, preferred) {
2337
- const schema = MODEL_REGISTRY.video_generate[model]?.params.duration;
2338
- const allowed = schema?.kind === "number" ? schema.enum : void 0;
2339
- if (!allowed?.length || allowed.includes(preferred)) return preferred;
2340
- return [...allowed].sort((a, b) => Math.abs(a - preferred) - Math.abs(b - preferred) || a - b)[0];
2341
- }
2342
- var SILENT_VIDEO_MODELS = /* @__PURE__ */ new Set([
2343
- "runway/gen-4.5",
2344
- "x-ai/grok-imagine-video",
2345
- "x-ai/grok-imagine-video-1.5",
2346
- "alibaba/happyhorse-1.1"
2347
- ]);
2348
- function clipAudioMode(model) {
2349
- if (supportsParam("video_generate", model, "generate_audio")) return "toggle";
2350
- return SILENT_VIDEO_MODELS.has(model) ? "never" : "always";
2351
- }
2352
- function clipDurationsFor(model) {
2353
- const schema = MODEL_REGISTRY.video_generate[model]?.params.duration;
2354
- const allowed = schema?.kind === "number" ? schema.enum : void 0;
2355
- return allowed?.length ? [...allowed].sort((a, b) => a - b) : void 0;
2356
- }
2357
- function maxClipSeconds(model) {
2358
- const allowed = clipDurationsFor(model);
2359
- return allowed ? allowed[allowed.length - 1] : void 0;
2360
- }
2361
- function splitScriptFor(words, model) {
2362
- const maxSeconds = maxClipSeconds(model);
2363
- if (!maxSeconds) return null;
2364
- const perClip = Math.floor(maxSeconds * SPOKEN_WORDS_PER_SECOND);
2365
- if (words <= perClip) return null;
2366
- const clips = Math.ceil(words / perClip);
2367
- return { clips, wordsPerClip: Math.ceil(words / clips), maxSeconds };
2368
- }
2369
- function promptMaxLength(kind, model) {
2370
- const schema = MODEL_REGISTRY[kind]?.[model]?.params.prompt;
2371
- return schema?.kind === "string" ? schema.maxLength : void 0;
2372
- }
2373
- function inputSlot(kind, model, inputKind) {
2374
- const spec = MODEL_REGISTRY[kind]?.[model];
2375
- return spec?.optional_inputs?.find((input) => input.kind === inputKind) ?? spec?.inputs.find((input) => input.kind === inputKind);
2376
- }
2377
- function maxInputSlot(kind, model, inputKind) {
2378
- return inputSlot(kind, model, inputKind)?.max;
2379
- }
2380
- function maxInputReferences(kind, model) {
2381
- return maxInputSlot(kind, model, "image");
2382
- }
2383
- function supportedQualities(kind, model) {
2384
- const schema = MODEL_REGISTRY[kind]?.[model]?.params.quality;
2385
- return schema?.kind === "string" ? schema.enum : void 0;
2386
- }
2387
- function bestSupportedQuality(kind, model, want) {
2388
- const supported = supportedQualities(kind, model);
2389
- if (!supported) return void 0;
2390
- if (supported.includes(want)) return want;
2391
- const ladder = supported.filter((step) => step !== "auto");
2392
- const ceiling = ladder.indexOf(want);
2393
- const reachable = ceiling === -1 ? ladder : ladder.slice(0, ceiling);
2394
- return reachable[reachable.length - 1];
2395
- }
2396
- function supportedAspectRatios(kind, model) {
2397
- const schema = MODEL_REGISTRY[kind]?.[model]?.params.aspect_ratio;
2398
- return schema?.kind === "string" ? schema.enum : void 0;
2399
- }
2400
- function ratioValue(ratio) {
2401
- const [w, h] = ratio.split(":").map(Number);
2402
- if (!w || !h || !Number.isFinite(w) || !Number.isFinite(h)) return null;
2403
- return w / h;
2404
- }
2405
- function nearestSupportedAspectRatio(kind, model, target) {
2406
- const supported = supportedAspectRatios(kind, model);
2407
- if (!supported || supported.includes(target)) return target;
2408
- const wanted = ratioValue(target);
2409
- if (wanted === null) return target;
2410
- let best = target;
2411
- let bestDistance = Number.POSITIVE_INFINITY;
2412
- for (const candidate of supported) {
2413
- const value = ratioValue(candidate);
2414
- if (value === null) continue;
2415
- const distance = Math.abs(Math.log(value / wanted));
2416
- if (distance < bestDistance) {
2417
- bestDistance = distance;
2418
- best = candidate;
2419
- }
2420
- }
2421
- return best;
2422
- }
2423
- function supportedImageSizes(kind, model) {
2424
- const schema = MODEL_REGISTRY[kind]?.[model]?.params.image_size;
2425
- return schema?.kind === "string" ? schema.enum : void 0;
2426
- }
2427
- var IMAGE_SIZE_ORDER = ["0.5K", "1K", "2K", "4K"];
2428
- function nearestSupportedImageSize(kind, model, target) {
2429
- const supported = supportedImageSizes(kind, model);
2430
- if (!supported || supported.includes(target)) return target;
2431
- const wanted = IMAGE_SIZE_ORDER.indexOf(target);
2432
- if (wanted < 0) return target;
2433
- const ranked = supported.filter((s) => IMAGE_SIZE_ORDER.includes(s)).sort((a, b) => IMAGE_SIZE_ORDER.indexOf(a) - IMAGE_SIZE_ORDER.indexOf(b));
2434
- if (ranked.length === 0) return target;
2435
- const belowOrEqual = ranked.filter((s) => IMAGE_SIZE_ORDER.indexOf(s) <= wanted);
2436
- return belowOrEqual.length > 0 ? belowOrEqual[belowOrEqual.length - 1] : ranked[0];
2437
- }
2438
-
2439
- // ../canvas-contract/src/credits.ts
2440
- var CREDITS_PER_USD = 100;
2441
- function usdToCredits(usd) {
2442
- if (!(usd > 0)) return 0;
2443
- return Math.ceil(Number((usd * CREDITS_PER_USD).toFixed(6)));
2444
- }
2445
-
2446
- // ../canvas-contract/src/videoCost.ts
2447
- var OPENING_FRAME_CREDITS = usdToCredits(0.03);
2448
- var SEEDANCE_USD_PER_SECOND = {
2449
- "480p": 0.18,
2450
- "720p": 0.5,
2451
- "1080p": 0.62,
2452
- "4k": 0.62
2453
- };
2454
- var DEFAULT_VIDEO_RESOLUTION = "720p";
2455
- var DEFAULT_VIDEO_DURATION_S = 5;
2456
- function isSeedanceModel(model) {
2457
- return model.startsWith("bytedance/seedance");
2458
- }
2459
- var SEEDANCE_25_USD_PER_SECOND = {
2460
- "480p": 0.1075,
2461
- "720p": 0.2326
2462
- };
2463
- var SEEDANCE_25_FALLBACK_USD_PER_SECOND = 0.2326;
2464
- function seedance25UsdPerSecond(resolution) {
2465
- return SEEDANCE_25_USD_PER_SECOND[resolution ?? DEFAULT_VIDEO_RESOLUTION] ?? SEEDANCE_25_FALLBACK_USD_PER_SECOND;
2466
- }
2467
- var FALLBACK_USD_PER_SECOND = 0.5;
2468
- function billedSeconds(model, duration) {
2469
- const floor = perSecondBilling(model)?.minBilledSeconds;
2470
- return floor === void 0 ? duration : Math.max(duration, floor);
2471
- }
2472
- function seedanceUsdPerSecond(resolution) {
2473
- return SEEDANCE_USD_PER_SECOND[resolution ?? DEFAULT_VIDEO_RESOLUTION] ?? FALLBACK_USD_PER_SECOND;
2474
- }
2475
- var GEMINI_OMNI_USD_PER_1M_VIDEO_TOKENS = 17.5;
2476
- var GEMINI_OMNI_VIDEO_TOKENS_PER_SECOND = 5792;
2477
- var GEMINI_OMNI_RESOLUTION_MULTIPLIER = {
2478
- "360p": 1 / 3,
2479
- "720p": 1,
2480
- "1080p": 1.5,
2481
- "4k": 3
2482
- };
2483
- var GEMINI_OMNI_DEFAULT_RESOLUTION = "720p";
2484
- var GEMINI_OMNI_OVERHEAD_TOKENS = 600;
2485
- var GEMINI_OMNI_WINDOW_SECONDS = 10;
2486
- var GEMINI_OMNI_USD_PER_SECOND = GEMINI_OMNI_VIDEO_TOKENS_PER_SECOND * GEMINI_OMNI_USD_PER_1M_VIDEO_TOKENS / 1e6;
2487
- function geminiOmniUsdPerSecond(resolution) {
2488
- const multiplier = GEMINI_OMNI_RESOLUTION_MULTIPLIER[resolution ?? GEMINI_OMNI_DEFAULT_RESOLUTION] ?? 1;
2489
- return GEMINI_OMNI_USD_PER_SECOND * multiplier;
2490
- }
2491
- var VIDEO_SOURCE_COST_MULTIPLIER = 2.5;
2492
- var FAL_SEEDANCE_USD_PER_1K_TOKENS = 0.0214;
2493
- var SEEDANCE_SOURCE_CLIP_DISCOUNT = 0.6;
2494
- var SEEDANCE_DEAREST_FRAME = {
2495
- "480p": { width: 992, height: 432 },
2496
- "720p": { width: 1112, height: 834 }
2497
- };
2498
- function falSeedanceUsdPerSecond(resolution, buildsOnSourceClip = false) {
2499
- const frame = SEEDANCE_DEAREST_FRAME[resolution ?? DEFAULT_VIDEO_RESOLUTION] ?? SEEDANCE_DEAREST_FRAME["720p"];
2500
- const tokensPerSecond = (frame?.width ?? 1112) * (frame?.height ?? 834) * 24 / 1024;
2501
- const rate = tokensPerSecond * FAL_SEEDANCE_USD_PER_1K_TOKENS / 1e3;
2502
- return buildsOnSourceClip ? rate * SEEDANCE_SOURCE_CLIP_DISCOUNT : rate;
2503
- }
2504
- function geminiOmniCostUsd(model, duration, resolution) {
2505
- const tier = isGeminiOmniPreviewModel(model) ? GEMINI_OMNI_DEFAULT_RESOLUTION : resolution;
2506
- const footage = geminiOmniUsdPerSecond(tier) * (duration ?? GEMINI_OMNI_WINDOW_SECONDS);
2507
- return footage + GEMINI_OMNI_OVERHEAD_TOKENS * GEMINI_OMNI_USD_PER_1M_VIDEO_TOKENS / 1e6;
2508
- }
2509
- function seedance20CostUsd(resolution, seconds, mayRouteToFal) {
2510
- const viaReplicate = seedanceUsdPerSecond(resolution) * seconds;
2511
- if (!mayRouteToFal) return viaReplicate;
2512
- const falTier = resolution === "480p" || resolution === "720p" ? resolution : void 0;
2513
- return Math.max(viaReplicate, falSeedanceUsdPerSecond(falTier) * seconds);
2514
- }
2515
- function estimateVideoCostUsd(input) {
2516
- const { model, duration, resolution, generateAudio, buildsOnSourceClip } = input;
2517
- const seconds = billedSeconds(model, duration ?? DEFAULT_VIDEO_DURATION_S);
2518
- const sourceClipPremium = buildsOnSourceClip ? VIDEO_SOURCE_COST_MULTIPLIER : 1;
2519
- if (isGeminiOmniModel(model)) return geminiOmniCostUsd(model, duration, resolution);
2520
- if (isSeedance25Model(model)) {
2521
- const viaOpenRouter = seedance25UsdPerSecond(resolution) * seconds * sourceClipPremium;
2522
- if (!input.mayRouteToFal) return viaOpenRouter;
2523
- return Math.max(viaOpenRouter, falSeedanceUsdPerSecond(resolution, buildsOnSourceClip) * seconds);
2524
- }
2525
- if (isSeedanceModel(model)) return seedance20CostUsd(resolution, seconds, input.mayRouteToFal === true);
2526
- const published = perSecondBilling(model)?.usd;
2527
- if (published) {
2528
- const rate = (resolution ? published.byResolution?.[resolution] : void 0) ?? published;
2529
- return (generateAudio ? rate.audio : rate.silent) * seconds;
2530
- }
2531
- const dearestKnownRate = Math.max(...Object.values(SEEDANCE_USD_PER_SECOND));
2532
- return dearestKnownRate * seconds;
2533
- }
2534
- function estimateVideoCredits(input) {
2535
- return usdToCredits(estimateVideoCostUsd(input));
2536
- }
2537
-
2538
- // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/766ad107c42df28eeadaf0ac2f9089c8a9e200f6ba0b2b1a817b8d536cbdcc49/node_modules/safe-stable-stringify/esm/wrapper.js
2539
- var import__ = __toESM(require_safe_stable_stringify(), 1);
2540
- var configure = import__.default.configure;
2541
- var wrapper_default = import__.default;
2542
-
2543
- // ../canvas-contract/src/canonical.ts
2544
- function canonicalize(value) {
2545
- const normalized = normalizeForCanonical(value);
2546
- const out = wrapper_default(normalized);
2547
- if (out === void 0) {
2548
- throw new Error("canonicalize: value serialized to undefined (top-level undefined?)");
2549
- }
2550
- return out;
2551
- }
2552
- function normalizeForCanonical(value) {
2553
- if (value === null) return null;
2554
- if (typeof value === "string") return value.normalize("NFC");
2555
- if (typeof value === "number") {
2556
- if (!Number.isFinite(value)) {
2557
- throw new Error(`canonicalize: non-finite number ${value}`);
2558
- }
2559
- return value;
2560
- }
2561
- if (typeof value === "boolean") return value;
2562
- if (typeof value === "bigint") {
2563
- throw new Error("canonicalize: bigint not supported");
2564
- }
2565
- if (Array.isArray(value)) {
2566
- return value.map(normalizeForCanonical);
2567
- }
2568
- if (typeof value === "object") {
2569
- const out = {};
2570
- for (const [k, v] of Object.entries(value)) {
2571
- if (v === void 0) continue;
2572
- out[k.normalize("NFC")] = normalizeForCanonical(v);
2573
- }
2574
- return out;
2575
- }
2576
- return void 0;
2577
- }
2578
-
2579
- // ../canvas-contract/src/clipWeight.ts
2580
- var MB_PER_SECOND_720P = 2.13;
2581
- var RESOLUTION_WEIGHT = {
2582
- "360p": 0.25,
2583
- "480p": 0.44,
2584
- "720p": 1,
2585
- "1080p": 2.25,
2586
- "4k": 9,
2587
- "4K": 9
2588
- };
2589
- var MAX_CLIP_INGEST_MB = 120;
2590
- function estimateClipMb(durationSeconds, resolution) {
2591
- const weight = RESOLUTION_WEIGHT[resolution ?? "720p"] ?? 1;
2592
- return durationSeconds * MB_PER_SECOND_720P * weight;
2593
- }
2594
- function clipTooHeavyToIngest(durationSeconds, resolution) {
2595
- if (!durationSeconds) return null;
2596
- const mb = estimateClipMb(durationSeconds, resolution);
2597
- if (mb <= MAX_CLIP_INGEST_MB) return null;
2598
- const fits = Math.floor(MAX_CLIP_INGEST_MB / (estimateClipMb(1, resolution) || 1));
2599
- 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.`;
2600
- }
2601
-
2602
- // ../canvas-contract/src/frameRealism.ts
2603
- function frameRealismDirection(opts = {}) {
2604
- 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
2605
- // model invents one whenever a screen or a document is in shot, and it contradicts the
2606
- // script it sits under. Frames simply do not get legible text; the captions carry the
2607
- // numbers.
2608
- //
2609
- // Default ON, and asked for explicitly rather than inferred: an ad frame with no
2610
- // person in it still sits under a script for an invented number to argue with. Only a
2611
- // plain Studio picture opts out — it has no script, and it may BE the poster somebody
2612
- // asked for, which the model picker sells GPT Image 2.5 on being able to render.
2613
- (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;
2614
- // another, a woman with an extra right arm and an unattached hand gripping a panel.
2615
- // Fiddly work at close range is where a video model breaks, every time.
2616
- " 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
2617
- // repairing the panel herself: nothing said she was not the installer, so the model cast
2618
- // her as one. Who someone IS in the picture has to be stated, or it is guessed.
2619
- (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}.` : "");
2620
- }
2621
-
2622
- // ../canvas-contract/src/nodeCost.ts
2623
- var ELEVENLABS_USD_PER_CHARACTER = 22e-5;
2624
- var ELEVENLABS_MUSIC_USD_PER_SECOND = 0.022;
2625
- var ELEVENLABS_SOUND_EFFECT_USD_PER_SECOND = 0.022;
2626
- var ELEVENLABS_STS_USD_PER_MINUTE = 1e3 * ELEVENLABS_USD_PER_CHARACTER;
2627
- var FALAI_LIPSYNC_PER_MIN_USD = 0.4;
2628
- var FALAI_VIDEO_BG_REMOVE_REFINED_USD_PER_30_FRAMES = 0.012;
2629
- var FALAI_VIDEO_BG_REMOVE_FAST_USD_PER_30_FRAMES = 8e-3;
2630
- var FALAI_IMAGE_BG_REMOVE_USD_PER_CALL = 1e-3;
2631
- var GROQ_WHISPER_COST_PER_HOUR = 0.04;
2632
- var GROQ_WHISPER_MINIMUM_SECONDS = 10;
2633
- var DEEPGRAM_NOVA3_COST_PER_MINUTE = 43e-4;
2634
- var FIRECRAWL_COST_PER_SCRAPE = 1e-3;
2635
- var DEFAULT_MUSIC_SECONDS = 30;
2636
- var DEFAULT_SOUND_EFFECT_SECONDS = 5;
2637
- var DEFAULT_BACKGROUND_REMOVE_SECONDS = 30;
2638
- var DEFAULT_MEDIA_SECONDS = 60;
2639
- function ttsCharactersUsd(characters) {
2640
- return characters * ELEVENLABS_USD_PER_CHARACTER;
2641
- }
2642
- function musicSecondsUsd(seconds) {
2643
- return seconds * ELEVENLABS_MUSIC_USD_PER_SECOND;
2644
- }
2645
- function soundEffectSecondsUsd(seconds) {
2646
- return seconds * ELEVENLABS_SOUND_EFFECT_USD_PER_SECOND;
2647
- }
2648
- function voiceConvertMinutes(durationMs) {
2649
- return Math.max(durationMs / 6e4, 0.1);
2650
- }
2651
- function voiceConvertUsd(minutes) {
2652
- return minutes * ELEVENLABS_STS_USD_PER_MINUTE;
2653
- }
2654
- function lipsyncMinutes(audioMs, videoMs) {
2655
- const durationMs = Math.max(audioMs ?? 0, videoMs ?? 0);
2656
- return durationMs > 0 ? durationMs / 6e4 : 1;
2657
- }
2658
- function lipsyncUsd(minutes) {
2659
- return minutes * FALAI_LIPSYNC_PER_MIN_USD;
2660
- }
2661
- function backgroundRemoveFrames(durationSeconds) {
2662
- return Math.max(30, Math.ceil((durationSeconds ?? DEFAULT_BACKGROUND_REMOVE_SECONDS) * 30));
2663
- }
2664
- function videoBackgroundRemoveUsd(durationSeconds, edgeRefinement) {
2665
- const unit = edgeRefinement ? FALAI_VIDEO_BG_REMOVE_REFINED_USD_PER_30_FRAMES : FALAI_VIDEO_BG_REMOVE_FAST_USD_PER_30_FRAMES;
2666
- return backgroundRemoveFrames(durationSeconds) / 30 * unit;
2667
- }
2668
- function transcriptionUsd(transcriber, seconds) {
2669
- if (seconds <= 0) return 0;
2670
- if (transcriber === "deepgram") return seconds / 60 * DEEPGRAM_NOVA3_COST_PER_MINUTE;
2671
- return Math.max(seconds, GROQ_WHISPER_MINIMUM_SECONDS) / 3600 * GROQ_WHISPER_COST_PER_HOUR;
2672
- }
2673
- function asBag(value) {
2674
- return value && typeof value === "object" && !Array.isArray(value) ? value : {};
2675
- }
2676
- function num(value) {
2677
- return typeof value === "number" && Number.isFinite(value) ? value : void 0;
2678
- }
2679
- function inputDurationMs(inputs, slot) {
2680
- const ref = asBag(inputs[slot]);
2681
- return num(ref.duration_ms) ?? num(asBag(ref.metadata).duration_ms);
2682
- }
2683
- function slotCount(inputs, slot) {
2684
- const value = inputs[slot];
2685
- if (Array.isArray(value)) return value.length;
2686
- return value ? 1 : 0;
2687
- }
2688
- function textLength(value) {
2689
- return typeof value === "string" ? value.length : 0;
2690
- }
2691
- function estimateVideoGenerateUsd(params, inputs, preferFal) {
2692
- const model = params.model;
2693
- if (typeof model !== "string") return null;
2694
- const referenceOnly = slotCount(inputs, "references") > 0 && !inputs.first_frame;
2695
- return estimateVideoCostUsd({
2696
- model,
2697
- duration: num(params.duration),
2698
- resolution: typeof params.resolution === "string" ? params.resolution : void 0,
2699
- generateAudio: typeof params.generate_audio === "boolean" ? params.generate_audio : void 0,
2700
- buildsOnSourceClip: slotCount(inputs, "video_references") > 0,
2701
- mayRouteToFal: isSeedanceModel(model) && (preferFal || referenceOnly)
2702
- });
2703
- }
2704
- function estimateMusicUsd(params, inputs) {
2705
- const pinnedMs = num(params.music_length_ms);
2706
- const scoredMs = params.model === "elevenlabs/video-background-music-v1" ? inputDurationMs(inputs, "video") : void 0;
2707
- const seconds = (pinnedMs ?? scoredMs ?? DEFAULT_MUSIC_SECONDS * 1e3) / 1e3;
2708
- return musicSecondsUsd(seconds);
2709
- }
2710
- function estimateDialogueUsd(params) {
2711
- if (!Array.isArray(params.inputs)) return null;
2712
- const characters = params.inputs.reduce((sum, line) => sum + textLength(asBag(line).text), 0);
2713
- return ttsCharactersUsd(characters);
2714
- }
2715
- function estimateNodeCostUsd(input) {
2716
- const params = asBag(input.params);
2717
- const inputs = asBag(input.inputs);
2718
- switch (input.nodeType) {
2719
- case "video_generate":
2720
- return estimateVideoGenerateUsd(params, inputs, input.preferFal === true);
2721
- case "tts":
2722
- return typeof params.text === "string" ? ttsCharactersUsd(params.text.length) : null;
2723
- case "dialogue":
2724
- return estimateDialogueUsd(params);
2725
- case "music":
2726
- return estimateMusicUsd(params, inputs);
2727
- case "sound_effect":
2728
- return soundEffectSecondsUsd(num(params.duration_seconds) ?? DEFAULT_SOUND_EFFECT_SECONDS);
2729
- case "audio_voice_convert": {
2730
- const ms = inputDurationMs(inputs, "audio") ?? DEFAULT_MEDIA_SECONDS * 1e3;
2731
- return voiceConvertUsd(voiceConvertMinutes(ms));
2732
- }
2733
- case "video_lipsync":
2734
- return lipsyncUsd(lipsyncMinutes(inputDurationMs(inputs, "audio"), inputDurationMs(inputs, "video")));
2735
- case "video_background_remove": {
2736
- const ms = inputDurationMs(inputs, "video");
2737
- return videoBackgroundRemoveUsd(ms === void 0 ? void 0 : ms / 1e3, params.edge_refinement !== false);
2738
- }
2739
- case "image_background_remove":
2740
- return FALAI_IMAGE_BG_REMOVE_USD_PER_CALL;
2741
- case "video_transcribe": {
2742
- const ms = inputDurationMs(inputs, "video") ?? DEFAULT_MEDIA_SECONDS * 1e3;
2743
- return transcriptionUsd(params.transcriber === "deepgram" ? "deepgram" : "groq", ms / 1e3);
2744
- }
2745
- case "ingest":
2746
- return params.strategy === "firecrawl" ? FIRECRAWL_COST_PER_SCRAPE : 0;
2747
- case "voice_select":
2748
- case "load_artifact":
2749
- case "save_artifact":
2750
- case "resize":
2751
- case "crop":
2752
- return 0;
2753
- default:
2754
- return null;
2755
- }
2756
- }
2757
- function estimateNodeCredits(input) {
2758
- const usd = estimateNodeCostUsd(input);
2759
- return usd === null ? null : usdToCredits(usd);
2760
- }
2761
-
2762
- // ../canvas-contract/src/personRealism.ts
2763
- 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.";
2764
- 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.";
2765
- 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.";
2766
- function candidPersonPortraitPrompt(p) {
2767
- return [
2768
- `An unretouched candid phone photo of one ordinary, real person: ${p.subject}`,
2769
- p.wardrobe?.trim() ? `Wearing: ${p.wardrobe.trim()}` : null,
2770
- `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.`,
2771
- PHONE_CAMERA,
2772
- REAL_SKIN,
2773
- NOT_A_MODEL,
2774
- "No text, logos or watermarks. One person only."
2775
- ].filter((line) => line !== null).join("\n");
2776
- }
2777
-
2778
- // ../canvas-contract/src/validateParams.ts
2779
- function isManagedNodeKind(nodeType) {
2780
- return Object.keys(MODEL_REGISTRY).includes(nodeType);
2781
- }
2782
- function checkRequiredParams(spec, params, model) {
2783
- const errors = [];
2784
- for (const req of spec.required) {
2785
- if (params[req] === void 0 || params[req] === null) {
2786
- errors.push({
2787
- code: "missing_required_param",
2788
- param: req,
2789
- message: `missing required param "${req}" for model "${model}"`
2790
- });
2791
- }
2792
- }
2793
- return errors;
2794
- }
2795
- function checkParamValues(spec, params, model) {
2796
- const errors = [];
2797
- for (const [key, value] of Object.entries(params)) {
2798
- if (key === "model") continue;
2799
- if (value === void 0) continue;
2800
- const schema = spec.params[key];
2801
- if (!schema) {
2802
- errors.push({
2803
- code: "unknown_param",
2804
- param: key,
2805
- message: `param "${key}" is not supported by model "${model}"`
2806
- });
2807
- continue;
2808
- }
2809
- const valueErr = validateValue(key, value, schema, model);
2810
- if (valueErr) errors.push(valueErr);
2811
- }
2812
- return errors;
2813
- }
2814
- function validateModelParams(nodeType, model, params) {
2815
- const spec = MODEL_REGISTRY[nodeType][canonicalModelId(model)];
2816
- if (!spec) {
2817
- return {
2818
- ok: false,
2819
- errors: [{ code: "unknown_model", message: `unknown model "${model}" for node "${nodeType}"` }]
2820
- };
2821
- }
2822
- const errors = [...checkRequiredParams(spec, params, model), ...checkParamValues(spec, params, model)];
2823
- if (errors.length > 0) return { ok: false, errors };
2824
- if (nodeType === "video_generate") {
2825
- const tooHeavy = clipTooHeavyToIngest(
2826
- typeof params.duration === "number" ? params.duration : void 0,
2827
- typeof params.resolution === "string" ? params.resolution : void 0
2828
- );
2829
- if (tooHeavy) return { ok: false, errors: [{ code: "clip_too_heavy", message: tooHeavy }] };
2830
- }
2831
- return { ok: true };
2832
- }
2833
- function validateModelInputs(nodeType, model, providedKinds) {
2834
- const spec = MODEL_REGISTRY[nodeType][canonicalModelId(model)];
2835
- if (!spec) {
2836
- return {
2837
- ok: false,
2838
- errors: [{ code: "unknown_model", message: `unknown model "${model}" for node "${nodeType}"` }]
2839
- };
2840
- }
2841
- const have = new Set(providedKinds);
2842
- const errors = [];
2843
- for (const inputSpec of spec.inputs) {
2844
- if (!have.has(inputSpec.kind)) {
2845
- errors.push({
2846
- code: "missing_input",
2847
- input: inputSpec.kind,
2848
- message: `model "${model}" requires input of kind "${inputSpec.kind}"`
2849
- });
2850
- }
2851
- }
2852
- if (errors.length > 0) return { ok: false, errors };
2853
- return { ok: true };
2854
- }
2855
- function validateStringValue(key, value, schema, model) {
2856
- if (typeof value !== "string") {
2857
- return { code: "invalid_value", param: key, message: `${key}: expected string, got ${typeof value}` };
2858
- }
2859
- if (schema.enum && !schema.enum.includes(value)) {
2860
- return {
2861
- code: "invalid_value",
2862
- param: key,
2863
- message: `${key}: "${value}" not allowed by "${model}" (allowed: ${schema.enum.join(", ")})`
2864
- };
2865
- }
2866
- if (schema.maxLength !== void 0 && value.length > schema.maxLength) {
2867
- return {
2868
- code: "invalid_value",
2869
- param: key,
2870
- message: `${key}: ${value.length} characters exceeds max ${schema.maxLength} for "${model}"`
2871
- };
2872
- }
2873
- return null;
2874
- }
2875
- function validateNumberValue(key, value, schema, model) {
2876
- if (typeof value !== "number" || Number.isNaN(value)) {
2877
- return { code: "invalid_value", param: key, message: `${key}: expected number, got ${typeof value}` };
2878
- }
2879
- if (schema.enum && !schema.enum.includes(value)) {
2880
- return {
2881
- code: "invalid_value",
2882
- param: key,
2883
- message: `${key}: ${value} not allowed by "${model}" (allowed: ${schema.enum.join(", ")})`
2884
- };
2885
- }
2886
- if (schema.integer && !Number.isInteger(value)) {
2887
- return { code: "invalid_value", param: key, message: `${key}: ${value} must be a whole number` };
2888
- }
2889
- if (schema.min !== void 0 && value < schema.min) {
2890
- return { code: "invalid_value", param: key, message: `${key}: ${value} below min ${schema.min}` };
2891
- }
2892
- if (schema.max !== void 0 && value > schema.max) {
2893
- return { code: "invalid_value", param: key, message: `${key}: ${value} above max ${schema.max}` };
2894
- }
2895
- return null;
2896
- }
2897
- function validateValue(key, value, schema, model) {
2898
- switch (schema.kind) {
2899
- case "string":
2900
- return validateStringValue(key, value, schema, model);
2901
- case "number":
2902
- return validateNumberValue(key, value, schema, model);
2903
- case "boolean":
2904
- if (typeof value !== "boolean") {
2905
- return { code: "invalid_value", param: key, message: `${key}: expected boolean, got ${typeof value}` };
2906
- }
2907
- return null;
2908
- case "json":
2909
- return null;
2910
- default: {
2911
- const _exhaustive = schema;
2912
- return _exhaustive;
2913
- }
2914
- }
2915
- }
2916
-
2917
- // ../canvas-contract/src/videoBlueprint.ts
2918
- import { z } from "zod";
2919
- var FrameAssetSchema = z.object({ url: z.string().optional() }).loose().optional();
2920
- var BlueprintDialogueLineSchema = z.object({
2921
- speaker: z.string().optional(),
2922
- line: z.string().optional(),
2923
- // Absolute seconds on the source timeline (the deconstruct emits both).
2924
- start_s: z.number().optional(),
2925
- end_s: z.number().optional(),
2926
- delivery: z.string().optional(),
2927
- voice_description: z.string().optional(),
2928
- // DECON-supplied: is this speaker's FACE visibly speaking in THIS scene? Element
2929
- // presence alone can't answer that — a founder pictured in a polaroid close-up is
2930
- // "present" yet the line is voiceover, and treating it as on-camera produced a
2931
- // native Seedance lip-sync clip of a still photograph. `false` pins the line to
2932
- // the VO path; absent keeps the presence-based decision (old blueprints).
2933
- on_camera: z.boolean().optional()
2934
- }).loose();
2935
- var SfxSchema = z.object({
2936
- at_s: z.number().optional(),
2937
- duration_s: z.number().optional(),
2938
- sound_effect_prompt: z.string().optional(),
2939
- description: z.string().optional()
2940
- }).loose();
2941
- var CompositionRegionSchema = z.object({
2942
- // full | top | bottom | left | right | inset
2943
- panel: z.string().optional(),
2944
- // 9-grid anchor for an `inset` presenter box.
2945
- position: z.string().optional(),
2946
- is_presenter: z.boolean().optional(),
2947
- // The cast id shown/speaking in this region (routes lip-sync + element refs).
2948
- cast_ref: z.string().optional(),
2949
- // What the region's content IS: camera | screen_capture | static_graphic |
2950
- // generated. Authoritative for routing when present (regex-over-prose fallback
2951
- // otherwise): screen_capture/static_graphic are rebuilt from REAL surfaces on the
2952
- // overlay layer, never AI-generated.
2953
- kind: z.string().optional(),
2954
- // Opaque id naming the SPECIFIC on-screen document/note/app-state this
2955
- // screen_capture region shows. Two scenes share it only when they show the SAME
2956
- // recording continuing (scrolling/typing/waiting within it) — a genuinely
2957
- // DIFFERENT document/note/recording (a source video splicing two screen captures)
2958
- // gets a different id. Breaks a persistent-layout run into separate surface stubs
2959
- // instead of asking the operator for one screenshot that can't cover both.
2960
- surface_id: z.string().optional(),
2961
- // Camera bubble(s)/inset(s) embedded INSIDE this region's surface (a Loom-style
2962
- // presenter bubble inside a screen recording) — video-in-video the reproduction
2963
- // must re-composite, not paint into the surface.
2964
- nested: z.array(z.object({}).loose()).optional(),
2965
- summary: z.string().optional(),
2966
- frame_prompt: z.string().optional(),
2967
- motion_prompt: z.string().optional()
2968
- }).loose();
2969
- var SceneCompositionSchema = z.object({
2970
- // full_frame (default) | split_screen | pip | keyed_overlay
2971
- layout: z.string().optional(),
2972
- // split_screen only: vertical (top/bottom) | horizontal (left/right).
2973
- split_axis: z.string().optional(),
2974
- regions: z.array(CompositionRegionSchema).optional()
2975
- }).loose();
2976
- var CameraMotionSchema = z.object({ movement: z.string().optional(), detail: z.string().optional() }).loose();
2977
- var TranscriptWordSchema = z.object({ text: z.string().optional() }).loose();
2978
- var SCENE_ROUTE_HINTS = ["brand_card"];
2979
- var VideoSceneSchema = z.object({
2980
- start_s: z.number().optional(),
2981
- end_s: z.number().optional(),
2982
- duration_s: z.number().optional(),
2983
- summary: z.string().optional(),
2984
- action_detail: z.string().optional(),
2985
- // The scene's spatial layout. Absent/full_frame ⇒ one uncut shot (default path).
2986
- // A layered layout (split_screen/pip/keyed_overlay) with regions ⇒ the scaffold
2987
- // builds one clip per region and stacks/overlays them into the scene picture.
2988
- composition: SceneCompositionSchema.optional(),
2989
- // The capture "look" for this scene — selected from the ad-native shoot-mode
2990
- // grammar (the CLI's scaffold/lib/shoot-modes.ts). When absent the scaffold
2991
- // auto-derives a UGC/product mode; a human can override per scene by setting this.
2992
- shoot_mode: z.string().optional(),
2993
- // Diegetic ambient the clip's native audio should carry (no music). When
2994
- // absent the scene falls back to its shoot mode's default ambience.
2995
- ambient: z.string().optional(),
2996
- camera_motion: CameraMotionSchema.optional(),
2997
- start_frame_prompt: z.string().optional(),
2998
- end_frame_prompt: z.string().optional(),
2999
- motion_prompt: z.string().optional(),
3000
- // The scene's role in the ad's persuasion arc (DECON-supplied); drives the
3001
- // script re-craft checklist. Inferred from position when absent.
3002
- narrative_role: z.string().optional(),
3003
- // See `SceneRouteHint`.
3004
- route_hint: z.enum(SCENE_ROUTE_HINTS).optional(),
3005
- // DECON-supplied on the HOOK scene: the engineered physical/emotional state that
3006
- // makes the first frame stop the scroll (sweaty/breathless/urgent …). Injected
3007
- // into the hook's start-frame description so the generator renders that state,
3008
- // not a calm influencer (CCA-11).
3009
- hook_mechanic: z.object({ mechanic: z.string().optional(), why_it_stops_scroll: z.string().optional() }).loose().optional(),
3010
- // DECON-supplied per-scene location (so a gym hook isn't flattened to "home").
3011
- scene_setting: z.string().optional(),
3012
- // How this scene cuts to the next (DECON-supplied). A recognized non-cut type
3013
- // (fade/whip/zoom/dissolve/swipe) is reproduced as an ffmpeg xfade at the
3014
- // boundary; cut/match_cut/none/other stay hard cuts. The last scene's value is
3015
- // ignored (nothing follows it).
3016
- transition_out: z.object({ type: z.string().optional(), description: z.string().optional() }).loose().optional(),
3017
- dialogue: z.array(BlueprintDialogueLineSchema).optional(),
3018
- sfx: z.array(SfxSchema).optional(),
3019
- // Parsed element by element where they are read (`BlueprintOverlaySchema`,
3020
- // `BlueprintFloatingElementSchema`), so one malformed graphic never rejects the scene.
3021
- overlays: z.array(z.unknown()).optional(),
3022
- floating_elements: z.array(z.unknown()).optional(),
3023
- // DECON-supplied: how much the picture itself moves within the shot. Gates the
3024
- // flash-hold optimization — a sub-2s b-roll flash with REAL subject motion
3025
- // (pouring, spreading, hands working) must stay a real clip; freezing it turns
3026
- // a montage into a slideshow. Absent (old blueprints) keeps the cheap still.
3027
- motion_level: z.enum(["static", "subtle", "dynamic"]).optional(),
3028
- transcript_slice: z.array(TranscriptWordSchema).optional(),
3029
- start_frame_asset: FrameAssetSchema,
3030
- end_frame_asset: FrameAssetSchema,
3031
- // DECON-supplied: true when this scene is a length-split CONTINUATION of the
3032
- // previous one (the SAME physical shot, broken up only because it exceeded the
3033
- // clip ceiling). The scaffold then shares the splice keyframe — this scene's
3034
- // start frame IS the previous scene's end frame — so the join is seamless.
3035
- continues_previous: z.boolean().optional()
3036
- }).loose();
3037
- var VideoBlueprintSchema = z.object({
3038
- source: z.object({ aspect_ratio: z.string().optional(), duration_s: z.number().optional() }).loose().optional(),
3039
- global: z.object({
3040
- music: z.object({
3041
- present: z.boolean().optional(),
3042
- music_prompt: z.string().optional(),
3043
- // Absolute second the music enters in the reference (the bed often
3044
- // kicks in mid-ad, after the hook). We start the regenerated track here
3045
- // instead of at 0 so the timing matches.
3046
- starts_at_s: z.number().optional(),
3047
- // Populated by the deconstruct when AudD (Shazam-style) recognizes the
3048
- // reference track. We never reuse it — only style the regenerated bed.
3049
- identified_track: z.object({ title: z.string().optional(), artist: z.string().optional() }).loose().nullish()
3050
- }).loose().optional(),
3051
- cast: z.array(
3052
- z.object({
3053
- id: z.string().optional(),
3054
- description: z.string().optional(),
3055
- // The deconstruct's note on the target-market localization (e.g. "native
3056
- // French speaker") — read to derive the spoken-track language code.
3057
- market_localization_note: z.string().optional()
3058
- }).loose()
3059
- ).optional(),
3060
- voiceover: z.object({
3061
- // on_camera | mixed → mouths are on screen (lip-sync candidates);
3062
- // voiceover | none → narration over the picture (no lip-sync).
3063
- mode: z.string().optional(),
3064
- // Which variety of the language the speech is in. Stated because the model
3065
- // picks one otherwise: ads set in Spain came back in Latin American Spanish,
3066
- // and the pinned peninsular voice could not undo it — the re-voicing is
3067
- // speech-to-speech, so it carries the accent across and swaps only the timbre.
3068
- accent: z.string().optional(),
3069
- voice_description: z.string().optional(),
3070
- persona: z.string().optional()
3071
- }).loose().optional(),
3072
- // Visual palette — read only to colour a clean brand-card/CTA plate (the
3073
- // first hex is the dominant brand colour); never to drive frame generation.
3074
- style: z.object({ palette: z.array(z.object({ hex: z.string().optional() }).loose()).optional() }).loose().optional(),
3075
- // Written by `scaffold-ad` (the deconstruct names its own fields, e.g. `branding.brand_name`):
3076
- // the whole script as one string, where the ad is set, and the brand it closes on.
3077
- transcript: z.string().optional(),
3078
- market: z.string().optional(),
3079
- branding: z.object({ name: z.string().optional(), logo_path: z.string().optional() }).loose().optional()
3080
- }).loose().optional(),
3081
- // Written by `scaffold-ad`: what the beats add up to, so a short ad is caught before it renders.
3082
- estimated_duration_s: z.number().optional(),
3083
- scenes: z.array(VideoSceneSchema).min(1)
3084
- }).loose();
3085
- var OverlayStyleSchema = z.object({ color_hex: z.string().optional(), background: z.string().optional(), size: z.string().optional() }).loose();
3086
- var BlueprintOverlaySchema = z.object({
3087
- text: z.string().optional(),
3088
- appears_at_s: z.number().optional(),
3089
- duration_s: z.number().optional(),
3090
- position: z.string().optional(),
3091
- role: z.string().optional(),
3092
- animation: z.string().optional(),
3093
- animation_detail: z.string().optional(),
3094
- style: OverlayStyleSchema.optional()
3095
- }).loose();
3096
- var BlueprintFloatingElementSchema = z.object({
3097
- kind: z.string().optional(),
3098
- description: z.string().optional(),
3099
- brand_name: z.string().nullish(),
3100
- what_it_represents: z.string().optional(),
3101
- appears_at_s: z.number().optional(),
3102
- duration_s: z.number().optional(),
3103
- position: z.string().optional()
3104
- }).loose();
3105
-
3106
- export {
3107
- AD_PLATFORMS,
3108
- AD_PLACEMENTS,
3109
- deliverySet,
3110
- verticalCover,
3111
- AD_FORMAT_PLATFORMS,
3112
- platformFormats,
3113
- resolveAdaptFormats,
3114
- AD_DESCRIBE_FOCUS,
3115
- AD_SELECT_SYSTEM,
3116
- AD_SELECT_PROMPT,
3117
- canonicalize,
3118
- withoutCastName,
3119
- frameRealismDirection,
3120
- OPENROUTER_IMAGE_SIZES,
3121
- SEEDANCE_DURATIONS,
3122
- ELEVENLABS_OUTPUT_FORMATS,
3123
- ELEVENLABS_MAX_TEXT_CHARS,
3124
- ELEVENLABS_MAX_MUSIC_LENGTH_MS,
3125
- IMAGE_GENERATE_MODELS,
3126
- DEFAULT_IMAGE_GENERATE_MODEL,
3127
- IMAGE_TIER_CREDITS,
3128
- imagePictureCredits,
3129
- VIDEO_GENERATE_MODELS,
3130
- DEFAULT_VIDEO_GENERATE_MODEL,
3131
- supportsReferenceToVideo,
3132
- supportsLastFrame,
3133
- MODEL_REGISTRY,
3134
- modelIdsAccepted,
3135
- MODEL_ROLES,
3136
- AD_IMAGE_MODEL,
3137
- REFERENCE_SHEET_MODEL,
3138
- ASPECT_ADAPT_MODEL,
3139
- PLATE_JUDGE_MODEL,
3140
- AD_DESCRIBE_MODEL,
3141
- BLUEPRINT_ANALYSIS_MODEL,
3142
- VIEWER_CHECK_MODEL,
3143
- CUSTOMER_INSIGHTS_MODEL,
3144
- GLANCE_CHECK_MODEL,
3145
- TEXT_BOX_READER_MODEL,
3146
- VIDEO_DECONSTRUCT_MODEL,
3147
- VOICEOVER_MODEL,
3148
- SOUND_EFFECT_MODEL,
3149
- MUSIC_BED_MODEL,
3150
- VOICE_CONVERT_MODEL,
3151
- isRegisteredModel,
3152
- imageGenerateAspectRatios,
3153
- supportsParam,
3154
- DEFAULT_CLIP_DURATION_S,
3155
- SPOKEN_WORDS_PER_SECOND,
3156
- spokenWordsIn,
3157
- SPOKEN_CLIP_DURATION_S,
3158
- nearestClipDuration,
3159
- clipAudioMode,
3160
- clipDurationsFor,
3161
- maxClipSeconds,
3162
- splitScriptFor,
3163
- promptMaxLength,
3164
- maxInputSlot,
3165
- maxInputReferences,
3166
- bestSupportedQuality,
3167
- supportedAspectRatios,
3168
- nearestSupportedAspectRatio,
3169
- nearestSupportedImageSize,
3170
- estimateVideoCredits,
3171
- DEFAULT_MUSIC_SECONDS,
3172
- DEFAULT_SOUND_EFFECT_SECONDS,
3173
- estimateNodeCredits,
3174
- candidPersonPortraitPrompt,
3175
- isManagedNodeKind,
3176
- validateModelParams,
3177
- validateModelInputs,
3178
- VideoBlueprintSchema,
3179
- BlueprintOverlaySchema,
3180
- BlueprintFloatingElementSchema
3181
- };
3182
- //# sourceMappingURL=chunk-CAMX6OHF.js.map