@koda-sl/baker-cli 0.533.0 → 0.534.0-dev.4da06ee4d
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.
- package/README.md +57 -10
- package/dist/account-NWIPSZM3.js +82 -0
- package/dist/account-WBGF3RGD.js +139 -0
- package/dist/account-ZE5ABGHY.js +82 -0
- package/dist/account-assets-BTDNFVBW.js +290 -0
- package/dist/account-level-T2YB6ILW.js +611 -0
- package/dist/account-reads-U4OI4N4V.js +219 -0
- package/dist/account-users-6RYS7LDR.js +64 -0
- package/dist/account-writes-4TE3ARDQ.js +68 -0
- package/dist/accounts-N2YX4AP6.js +114 -0
- package/dist/accounts-NY47CLTN.js +701 -0
- package/dist/accounts-SHGZX4V2.js +80 -0
- package/dist/accounts-TILUZQQT.js +115 -0
- package/dist/accounts-VAZ4ZXMA.js +76 -0
- package/dist/actions-TBWF3M5X.js +55 -0
- package/dist/active-entities-NTSGNVAV.js +103 -0
- package/dist/activecampaign-CBTOLWBM.js +938 -0
- package/dist/activities-XVFA3XF5.js +75 -0
- package/dist/ad-group-writes-HVNPWOXM.js +172 -0
- package/dist/ad-groups-NPD6TNK2.js +70 -0
- package/dist/ad-writes-O5GJSK3G.js +176 -0
- package/dist/add-AYILCHML.js +81 -0
- package/dist/add-D4USMEDM.js +107 -0
- package/dist/add-J76XNCNO.js +97 -0
- package/dist/add-JCNVWVNA.js +148 -0
- package/dist/add-NV5TBLCP.js +80 -0
- package/dist/add-SWSKLIMK.js +305 -0
- package/dist/add-accounts-2KEM5SDH.js +91 -0
- package/dist/ads-3ZCUKPVZ.js +128 -0
- package/dist/ads-CJIWTAGM.js +79 -0
- package/dist/ads-JSFDYLKJ.js +120 -0
- package/dist/ads-TLWYK3XS.js +48 -0
- package/dist/adsets-EQVLMBJX.js +182 -0
- package/dist/advertisers-NXJIWTA4.js +123 -0
- package/dist/advertisers-WQ2FDNHU.js +125 -0
- package/dist/analytics-FG5CBBPC.js +2437 -0
- package/dist/analytics-NH7M3XB7.js +447 -0
- package/dist/animate-IRSBEZVK.js +480 -0
- package/dist/approved-LNUYJEUZ.js +73 -0
- package/dist/asset-writes-JGOWG3L3.js +50 -0
- package/dist/assign-GDQFFWZ5.js +80 -0
- package/dist/audience-size-RBXNKZMD.js +76 -0
- package/dist/audience-writes-7HTQFT3Q.js +327 -0
- package/dist/audiences-FNNPTVSN.js +86 -0
- package/dist/audiences-I62OFJNP.js +280 -0
- package/dist/audiences-JOFKN2LB.js +85 -0
- package/dist/audit-SLXL2OET.js +154 -0
- package/dist/audit-SPBIEG2P.js +88 -0
- package/dist/autocomplete-4I6SKS33.js +114 -0
- package/dist/avatars-XLOSQRHV.js +38 -0
- package/dist/bid-pricing-IR7BOILK.js +103 -0
- package/dist/brand-YJXEJLZI.js +22 -0
- package/dist/brief-P5U4PV73.js +543 -0
- package/dist/businesses-ZGBQIBTU.js +54 -0
- package/dist/campaign-groups-6SO2DUYF.js +99 -0
- package/dist/campaign-writes-EXOITAX6.js +168 -0
- package/dist/campaign-writes-N2U4TJEG.js +176 -0
- package/dist/campaigns-7U5YMQWS.js +113 -0
- package/dist/campaigns-LUCBK4KX.js +111 -0
- package/dist/campaigns-N4IQNY5Z.js +78 -0
- package/dist/campaigns-PJP4QZQ6.js +130 -0
- package/dist/canvas-IP4MCAHT.js +46 -0
- package/dist/capabilities-SU25DKSW.js +147 -0
- package/dist/cards-IPWT3R7L.js +85 -0
- package/dist/catalog-PDP3ILYG.js +66 -0
- package/dist/catalog-PDP3ILYG.js.map +1 -0
- package/dist/catalogs-7TA4AJCV.js +130 -0
- package/dist/catalogs-TJ4HICNN.js +781 -0
- package/dist/changes-EJZJCZVV.js +135 -0
- package/dist/chatgpt-D7JWEOAM.js +47 -0
- package/dist/chats-JMQODNCE.js +279 -0
- package/dist/check-JK3BRROQ.js +107 -0
- package/dist/chunk-26TRRYCA.js +333 -0
- package/dist/chunk-2G46X2ID.js +930 -0
- package/dist/chunk-2G46X2ID.js.map +1 -0
- package/dist/chunk-2NYMB7WG.js +8954 -0
- package/dist/chunk-2TTGNQ5H.js +136 -0
- package/dist/chunk-2VUQOAT3.js +138 -0
- package/dist/chunk-34NX5OGV.js +61 -0
- package/dist/chunk-3P6VKACL.js +5368 -0
- package/dist/chunk-3WSBH7YB.js +479 -0
- package/dist/chunk-3ZNBYEZR.js +24026 -0
- package/dist/chunk-3ZNBYEZR.js.map +1 -0
- package/dist/chunk-45EERHDB.js +783 -0
- package/dist/chunk-4GARQXOI.js +84 -0
- package/dist/chunk-5JF25ZTI.js +715 -0
- package/dist/chunk-5JF25ZTI.js.map +1 -0
- package/dist/chunk-6CPII3NK.js +100 -0
- package/dist/chunk-6D2D6L6K.js +75 -0
- package/dist/chunk-6OIKNJ7G.js +26 -0
- package/dist/chunk-6SK56BHM.js +203 -0
- package/dist/chunk-6VKGKWB4.js +676 -0
- package/dist/chunk-6Z5NT7TE.js +170 -0
- package/dist/chunk-75SKCW3F.js +191 -0
- package/dist/chunk-7RAONNZM.js +843 -0
- package/dist/chunk-7YVITQPT.js +392 -0
- package/dist/chunk-AHPZKJ32.js +45 -0
- package/dist/chunk-ALJV3U4U.js +1518 -0
- package/dist/chunk-AZEJ727R.js +106 -0
- package/dist/chunk-AZWX3Q2J.js +544 -0
- package/dist/chunk-B6ZGSAHC.js +296 -0
- package/dist/chunk-BLXTPJGC.js +249 -0
- package/dist/chunk-BNDSCJUI.js +166 -0
- package/dist/chunk-BNFTHFBB.js +344 -0
- package/dist/chunk-CAYIC3ES.js +35 -0
- package/dist/chunk-CMQHTYTK.js +207 -0
- package/dist/chunk-DGE5UEMS.js +224 -0
- package/dist/chunk-DS6EJRF4.js +225 -0
- package/dist/chunk-DUWJG6QH.js +215 -0
- package/dist/chunk-DW4AEYFB.js +131 -0
- package/dist/chunk-DXHOUY74.js +149 -0
- package/dist/chunk-E3QYALFY.js +73 -0
- package/dist/chunk-EIKUBZEY.js +1902 -0
- package/dist/chunk-EIKUBZEY.js.map +1 -0
- package/dist/chunk-ERCYMMBF.js +2443 -0
- package/dist/chunk-ERCYMMBF.js.map +1 -0
- package/dist/chunk-F3CZFUXZ.js +3187 -0
- package/dist/chunk-F3CZFUXZ.js.map +1 -0
- package/dist/chunk-GB5TIOS5.js +910 -0
- package/dist/chunk-GLGTUZQE.js +163 -0
- package/dist/chunk-GONAHHY5.js +334 -0
- package/dist/chunk-GONAHHY5.js.map +1 -0
- package/dist/chunk-GZ6MSG7I.js +846 -0
- package/dist/chunk-HBMHTFKS.js +52 -0
- package/dist/chunk-HIXMP66B.js +125 -0
- package/dist/chunk-HUYOWLTS.js +64 -0
- package/dist/chunk-HWOSUF22.js +207 -0
- package/dist/chunk-IA5O6DDP.js +831 -0
- package/dist/chunk-IAA36IYQ.js +91 -0
- package/dist/chunk-IANNXUQQ.js +19 -0
- package/dist/chunk-IKZHHMG4.js +229 -0
- package/dist/chunk-IS6TXDPQ.js +23 -0
- package/dist/chunk-IZABTTW5.js +228 -0
- package/dist/chunk-JKBDO5EF.js +682 -0
- package/dist/chunk-JKBDO5EF.js.map +1 -0
- package/dist/chunk-JVFV6UJ3.js +142 -0
- package/dist/chunk-KJS3N47X.js +387 -0
- package/dist/chunk-KML35BKR.js +84 -0
- package/dist/chunk-KUH5WDSK.js +200 -0
- package/dist/chunk-LKK6R5FM.js +604 -0
- package/dist/chunk-LTWAROBR.js +274 -0
- package/dist/chunk-LXCDBNBJ.js +106 -0
- package/dist/chunk-LZOP5AKR.js +26 -0
- package/dist/chunk-MOXKTWY5.js +69 -0
- package/dist/chunk-MTSEFJ7Y.js +225 -0
- package/dist/chunk-MTV2RSGY.js +63 -0
- package/dist/chunk-MUS2UTWU.js +4254 -0
- package/dist/chunk-MUS2UTWU.js.map +1 -0
- package/dist/chunk-MZOVTEEY.js +98 -0
- package/dist/chunk-N2MYKKHX.js +51 -0
- package/dist/chunk-N6SZJDDF.js +57 -0
- package/dist/chunk-NSYYRMCV.js +94 -0
- package/dist/chunk-O3NCVHFP.js +69 -0
- package/dist/chunk-OAFALNL2.js +91 -0
- package/dist/chunk-OBEAXLVV.js +287 -0
- package/dist/chunk-OG4LGMJT.js +3510 -0
- package/dist/chunk-OG4LGMJT.js.map +1 -0
- package/dist/chunk-ORID3CGW.js +139 -0
- package/dist/chunk-PEEE5WPR.js +98 -0
- package/dist/chunk-PMCVYVRV.js +46 -0
- package/dist/chunk-PMKNHE6G.js +217 -0
- package/dist/chunk-PRMR2LAM.js +39 -0
- package/dist/chunk-Q3LTMXUE.js +97 -0
- package/dist/chunk-Q4L4Z2HT.js +111 -0
- package/dist/chunk-QE3DFWH4.js +64 -0
- package/dist/chunk-QG45DH5D.js +324 -0
- package/dist/chunk-R23MN7HH.js +191 -0
- package/dist/chunk-RCJAC2DY.js +167 -0
- package/dist/chunk-RLSFWA7K.js +438 -0
- package/dist/chunk-RQ5NSJPA.js +66 -0
- package/dist/chunk-RSQOWMZA.js +56 -0
- package/dist/chunk-RVMDQYPX.js +25 -0
- package/dist/chunk-SBGF4OKE.js +1919 -0
- package/dist/chunk-SIKCVWM3.js +76 -0
- package/dist/chunk-TBD7LIQL.js +76 -0
- package/dist/chunk-TDNLM4J4.js +455 -0
- package/dist/chunk-TH3OK7RO.js +148 -0
- package/dist/chunk-TJ6FFFE7.js +1744 -0
- package/dist/chunk-TSKD7WNX.js +74 -0
- package/dist/chunk-TT5UTVPK.js +219 -0
- package/dist/chunk-TUIUO4SW.js +285 -0
- package/dist/chunk-TUYFP4BC.js +89 -0
- package/dist/chunk-UKBFKTC2.js +103 -0
- package/dist/chunk-UMPAKBCB.js +66 -0
- package/dist/chunk-URMAEVZO.js +150 -0
- package/dist/chunk-VK7MSQ3P.js +494 -0
- package/dist/chunk-WBGJRI33.js +42 -0
- package/dist/chunk-WFPUHD6K.js +1646 -0
- package/dist/chunk-WNIDYKWO.js +7273 -0
- package/dist/chunk-WNIDYKWO.js.map +1 -0
- package/dist/chunk-WQYHEHBP.js +429 -0
- package/dist/chunk-WR7T2ZLW.js +275 -0
- package/dist/chunk-WX3TPPPN.js +377 -0
- package/dist/chunk-XKJO6WSY.js +476 -0
- package/dist/chunk-XLY23CY7.js +297 -0
- package/dist/chunk-XUTSNIUI.js +638 -0
- package/dist/chunk-YF6D3AXC.js +156 -0
- package/dist/chunk-YY5DKGMZ.js +76 -0
- package/dist/chunk-Z3UJKRF7.js +547 -0
- package/dist/chunk-Z5RBTOP5.js +46 -0
- package/dist/chunk-ZBKDD3SZ.js +169 -0
- package/dist/chunk-ZCIRAP2S.js +97 -0
- package/dist/chunk-ZKXHDXYI.js +188 -0
- package/dist/chunk-ZLGWQGXI.js +58 -0
- package/dist/chunk-ZQMYNDSV.js +197 -0
- package/dist/chunk-ZSPAWQ7O.js +2209 -0
- package/dist/chunk-ZSPAWQ7O.js.map +1 -0
- package/dist/chunk-ZXYM7V64.js +5471 -0
- package/dist/chunk-ZXYM7V64.js.map +1 -0
- package/dist/cite-2IFS3G46.js +186 -0
- package/dist/cite-2IFS3G46.js.map +1 -0
- package/dist/claim-NHSZNDTG.js +200 -0
- package/dist/cli.js +45 -45
- package/dist/client-2CPUMURU.js +19 -0
- package/dist/code-CZ5W3JNM.js +76 -0
- package/dist/companies-GF27MKDE.js +198 -0
- package/dist/company-I3QHEINQ.js +308 -0
- package/dist/complete-6Q6I6D4O.js +84 -0
- package/dist/config-EW6S72KY.js +88 -0
- package/dist/connect-V6JRDBQ5.js +45 -0
- package/dist/content-LNIBJKNQ.js +85 -0
- package/dist/conversation-MCR4WBGJ.js +96 -0
- package/dist/conversion-report-CNNF2KNN.js +127 -0
- package/dist/conversion-upload-command-GW2QGOBS.js +439 -0
- package/dist/conversion-writes-MIW2DW7Q.js +122 -0
- package/dist/conversions-6OKS45FG.js +140 -0
- package/dist/conversions-WRICMKDT.js +78 -0
- package/dist/copy-writes-5DO6N5V7.js +170 -0
- package/dist/countries-FPJKZDZJ.js +82 -0
- package/dist/create-BGOY6OUH.js +135 -0
- package/dist/create-F4AAMFZ5.js +62 -0
- package/dist/create-QSKVDFI5.js +210 -0
- package/dist/create-TI2ZQCEW.js +239 -0
- package/dist/creatives-AF2ZBRRU.js +223 -0
- package/dist/creatives-E3ZTGEC7.js +58 -0
- package/dist/creatives-ISMLBSRR.js +89 -0
- package/dist/credentials-X3E4TJGW.js +290 -0
- package/dist/critique-75HCFZD6.js +1451 -0
- package/dist/critique-OOFO5KNR.js +232 -0
- package/dist/crm-66P5WILT.js +323 -0
- package/dist/crm-NI7JZHHG.js +227 -0
- package/dist/crop-F2ZMKE4T.js +113 -0
- package/dist/currency-BJYQ7KWA.js +88 -0
- package/dist/custom-conversions-J56EGUH3.js +128 -0
- package/dist/customers-IAZLBVL4.js +63 -0
- package/dist/decide-KXEEEL5X.js +199 -0
- package/dist/delete-3JM2CRGW.js +67 -0
- package/dist/delete-7LUKYRYI.js +69 -0
- package/dist/delete-DKY2U7DN.js +57 -0
- package/dist/delete-JEHALEDU.js +69 -0
- package/dist/delete-K77BZNI7.js +85 -0
- package/dist/delete-TT5F4KOF.js +71 -0
- package/dist/demographics-2WIAENET.js +141 -0
- package/dist/describe-PD3T4TSU.js +97 -0
- package/dist/describe-QNULQ554.js +97 -0
- package/dist/dimensions-CITRMPQF.js +101 -0
- package/dist/discard-RL4HPJVG.js +69 -0
- package/dist/discover-BLUJYLBT.js +93 -0
- package/dist/discover-K743TWWV.js +172 -0
- package/dist/domain-DVUS4W6Q.js +101 -0
- package/dist/download-AIWQ4VO5.js +299 -0
- package/dist/download-N4KWWNJ5.js +172 -0
- package/dist/draft-3LGUY4GD.js +100 -0
- package/dist/draft-4ZK3K4EN.js +240 -0
- package/dist/draft-D5D6HCPA.js +103 -0
- package/dist/draft-EV5GJXOU.js +220 -0
- package/dist/draft-EYX33J4Y.js +335 -0
- package/dist/draft-MJYHWHEU.js +283 -0
- package/dist/draft-WIQ75STJ.js +308 -0
- package/dist/draft-WM3EJ622.js +310 -0
- package/dist/engine/index.js +15 -14
- package/dist/env-ZCVKU62Y.js +53 -0
- package/dist/experiment-YPN3PKI5.js +1397 -0
- package/dist/experiments-PL7JBQ47.js +236 -0
- package/dist/export-X7LIQORT.js +168 -0
- package/dist/extract-ADBKYCMK.js +113 -0
- package/dist/facets-HH2O62KL.js +117 -0
- package/dist/favorites-DH7FJY5B.js +178 -0
- package/dist/feed-IN5DQ6QV.js +177 -0
- package/dist/feedback-C6YB6P52.js +115 -0
- package/dist/feedback-C6YB6P52.js.map +1 -0
- package/dist/feedback-record-TZZYVD4E.js +269 -0
- package/dist/feedback-record-TZZYVD4E.js.map +1 -0
- package/dist/fetch-PGKOWX3F.js +204 -0
- package/dist/fetch-PGKOWX3F.js.map +1 -0
- package/dist/fetch-POVD4UV2.js +139 -0
- package/dist/find-YKH5NLDV.js +143 -0
- package/dist/fit-TC4AACBU.js +65 -0
- package/dist/flows-AYLK5KRV.js +250 -0
- package/dist/follow-NYSYOMPZ.js +94 -0
- package/dist/follow-competitors-XK7AHXV5.js +112 -0
- package/dist/following-5NSY62IF.js +113 -0
- package/dist/fonts-B4GG2ZVY.js +39 -0
- package/dist/forecast-SHLUTMQQ.js +169 -0
- package/dist/forecast-XKJ6SCJ5.js +121 -0
- package/dist/funding-JC6MPG5T.js +85 -0
- package/dist/funnel-NOQ5377L.js +397 -0
- package/dist/ga4-NOWI2YV7.js +55 -0
- package/dist/generate-T4CMEBFU.js +263 -0
- package/dist/get-3GC5BSEH.js +59 -0
- package/dist/get-KWERYDK2.js +59 -0
- package/dist/get-MTJGUYD7.js +66 -0
- package/dist/get-O5QJBI3A.js +92 -0
- package/dist/get-P6HXXYPJ.js +38 -0
- package/dist/get-SKQXAUCK.js +82 -0
- package/dist/get-VEXFF7PK.js +62 -0
- package/dist/get-VLJVPTC3.js +56 -0
- package/dist/gif-K4Z7LK5W.js +102 -0
- package/dist/google-OCEWR2NJ.js +3267 -0
- package/dist/google-TC2ZJD73.js +136 -0
- package/dist/google-ads-UQPFXZHG.js +198 -0
- package/dist/group-GRWRPBFN.js +43 -0
- package/dist/group-SP4TNI63.js +43 -0
- package/dist/gsc-UXGYY3GJ.js +30 -0
- package/dist/history-AGDBEDLW.js +69 -0
- package/dist/history-BD4RYCIO.js +102 -0
- package/dist/history-LTM7KP34.js +136 -0
- package/dist/hubspot-WJG45M2B.js +782 -0
- package/dist/icon-V3Y4YDOJ.js +137 -0
- package/dist/ideas-MG7U6TOP.js +45 -0
- package/dist/images-FM7FHPBS.js +92 -0
- package/dist/improve-TXA435K6.js +86 -0
- package/dist/ingest-HYCOCLKP.js +123 -0
- package/dist/ingest-RY5HTGWI.js +27 -0
- package/dist/insights-2G2E27IB.js +132 -0
- package/dist/insights-KLTFZPDU.js +439 -0
- package/dist/inspect-MBIVGHVX.js +192 -0
- package/dist/inspiration-K7L63RAJ.js +53 -0
- package/dist/instant-experiences-E7U6CJFG.js +260 -0
- package/dist/intent-ODOSNQHM.js +95 -0
- package/dist/job-IPZGUL7C.js +202 -0
- package/dist/job-create-DHDXT6JK.js +109 -0
- package/dist/job-status-LCK6OAML.js +74 -0
- package/dist/keep-WRQW625H.js +78 -0
- package/dist/keyword-gap-2CBACDPA.js +130 -0
- package/dist/keyword-metrics-V3DYPKHT.js +200 -0
- package/dist/keywords-for-site-3DNC73AI.js +131 -0
- package/dist/knowledge-N75ATS7T.js +195 -0
- package/dist/landing-76YHTTX7.js +28 -0
- package/dist/landings-23OMBXML.js +151 -0
- package/dist/languages-2PRQ5OQ3.js +40 -0
- package/dist/languages-A5Y7DKLJ.js +55 -0
- package/dist/launches-C3ZQH4VF.js +19 -0
- package/dist/layerize-KH5MUTCH.js +190 -0
- package/dist/lead-routes-IREDNU24.js +733 -0
- package/dist/leads-EVBUUZZS.js +115 -0
- package/dist/leads-NEQAJ5F7.js +540 -0
- package/dist/learn-KEMLEYW4.js +207 -0
- package/dist/library-3Q24O4XX.js +211 -0
- package/dist/lighthouse-H6XEFV6H.js +75 -0
- package/dist/line-item-writes-3LJTZRR3.js +211 -0
- package/dist/line-items-S2JDVEND.js +107 -0
- package/dist/link-GSZEQXLA.js +67 -0
- package/dist/linkedin-4TSXJIRQ.js +1328 -0
- package/dist/linkedin-person-JL4RZHEP.js +139 -0
- package/dist/list-23TETYHO.js +57 -0
- package/dist/list-5DUXP3Y6.js +65 -0
- package/dist/list-6N7C7AR4.js +93 -0
- package/dist/list-EUN2X7SS.js +51 -0
- package/dist/list-KZS624O5.js +306 -0
- package/dist/list-LU6N32Y7.js +154 -0
- package/dist/list-OQFCWNLE.js +67 -0
- package/dist/list-RTQVZYIC.js +76 -0
- package/dist/list-YLMKD7GM.js +50 -0
- package/dist/locations-C4LIWY3P.js +69 -0
- package/dist/locations-HC5FYEYX.js +40 -0
- package/dist/log-ATW73US2.js +95 -0
- package/dist/logo-2FXE3XAS.js +18 -0
- package/dist/lookup-JUK4JM52.js +23 -0
- package/dist/make-J6VYHNTA.js +1367 -0
- package/dist/make-J6VYHNTA.js.map +1 -0
- package/dist/map-MQ7GHCF4.js +436 -0
- package/dist/mcp-3NTRVTKU.js +729 -0
- package/dist/media-4XW3L7E3.js +18 -0
- package/dist/media-E5PMHJ2K.js +89 -0
- package/dist/media-sources-XAHG65FO.js +35 -0
- package/dist/members-64SFCBT5.js +47 -0
- package/dist/meme-UJBWLEMA.js +100 -0
- package/dist/meta-3PVMVKDP.js +122 -0
- package/dist/metrics-EJ7FSBSI.js +152 -0
- package/dist/models-RUAIOX4K.js +155 -0
- package/dist/normalize-4RHSWNML.js +144 -0
- package/dist/normalize-X6FMLNQW.js +806 -0
- package/dist/options-ERT4OVWB.js +125 -0
- package/dist/organization-CXMLBGZY.js +949 -0
- package/dist/output-4CMFKHKV.js +24 -0
- package/dist/page-U434ALBN.js +105 -0
- package/dist/page-photos-OYPS2GP2.js +118 -0
- package/dist/pages-EYX26EXP.js +67 -0
- package/dist/performance-OKWF6BPE.js +5565 -0
- package/dist/performance-SGU7XX4P.js +27 -0
- package/dist/pinterest-3MSPSGJC.js +96 -0
- package/dist/pixels-X5PK5IAF.js +109 -0
- package/dist/pixels-XC2RXJRH.js +62 -0
- package/dist/plan-K2ZIMLQU.js +208 -0
- package/dist/posts-BH2TE4U3.js +36 -0
- package/dist/preview-LA3P4TAF.js +218 -0
- package/dist/profile-VKYAKK5B.js +159 -0
- package/dist/promoted-tweet-writes-2O75KPVF.js +183 -0
- package/dist/promoted-tweets-6TF3VYJ2.js +119 -0
- package/dist/properties-NAEEQRLQ.js +101 -0
- package/dist/publish-BK4VU2I7.js +344 -0
- package/dist/query-O76WFU6D.js +236 -0
- package/dist/query-XJXFKIRF.js +62 -0
- package/dist/query-ZGA3F647.js +231 -0
- package/dist/questionnaire-GEQF5OAQ.js +94 -0
- package/dist/read-HOMAUJS4.js +141 -0
- package/dist/reddit-HVLOXPPU.js +29 -0
- package/dist/refresh-BOYLAG34.js +42 -0
- package/dist/refresh-H5RGVPYJ.js +97 -0
- package/dist/release-DVS4CIU6.js +63 -0
- package/dist/relevant-pages-ILNQC3F4.js +99 -0
- package/dist/remove-DFTGSOL5.js +49 -0
- package/dist/remove-K4SJF2GG.js +53 -0
- package/dist/reopen-CGWLLKSF.js +66 -0
- package/dist/rerun-75XUDDOM.js +96 -0
- package/dist/rerun-75XUDDOM.js.map +1 -0
- package/dist/research-MTK6ZRR3.js +265 -0
- package/dist/research-ZPDFDOFR.js +75 -0
- package/dist/research-ZPDFDOFR.js.map +1 -0
- package/dist/reset-AUBXKPPG.js +57 -0
- package/dist/reset-XDFY6COF.js +57 -0
- package/dist/resolve-MKMJ6R2P.js +124 -0
- package/dist/retry-CBMIRIAN.js +65 -0
- package/dist/retry-GNTB73JH.js +63 -0
- package/dist/retry-failed-XOBX3GC3.js +45 -0
- package/dist/revenue-HMGOVX4D.js +91 -0
- package/dist/rule-writes-C46MBD32.js +525 -0
- package/dist/rules-6FUE3OPU.js +217 -0
- package/dist/rules-AQWK62HZ.js +99 -0
- package/dist/rules-add-IFBUKD3Q.js +465 -0
- package/dist/run-AIK22EVA.js +71 -0
- package/dist/run-UTCDGXL6.js +69 -0
- package/dist/scaffold-ad-KYPBFNX4.js +1513 -0
- package/dist/scaffold-ad-KYPBFNX4.js.map +1 -0
- package/dist/scaffold-static-ad-JYKGY2WM.js +1011 -0
- package/dist/scaffold-static-ad-JYKGY2WM.js.map +1 -0
- package/dist/scaffold-video-XXDBAX6I.js +885 -0
- package/dist/scaffold-video-XXDBAX6I.js.map +1 -0
- package/dist/schedule-AVK2VICC.js +67 -0
- package/dist/schedule-MOSVC36T.js +64 -0
- package/dist/scheduled-agents-AXZH5RPS.js +55 -0
- package/dist/schema-BYFKNXCP.js +121 -0
- package/dist/schema-WHSDTY5R.js +135 -0
- package/dist/scrape-23YO56SP.js +2241 -0
- package/dist/screenshot-HNI4B3UC.js +102 -0
- package/dist/search-5442DCYM.js +51 -0
- package/dist/search-BTAXTYED.js +92 -0
- package/dist/search-JQ7CDJWO.js +26 -0
- package/dist/search-UZWWXBEZ.js +177 -0
- package/dist/search-YA5WLCJ3.js +224 -0
- package/dist/search-YTEHFCU4.js +91 -0
- package/dist/search-copy-Z7DVNT44.js +168 -0
- package/dist/seeds-BFXQKJP4.js +101 -0
- package/dist/select-O2JB6MIA.js +110 -0
- package/dist/select-O2JB6MIA.js.map +1 -0
- package/dist/sends-25OLZQJ5.js +349 -0
- package/dist/sequences-J7HKMCZK.js +146 -0
- package/dist/set-prompt-DJHFZKXZ.js +199 -0
- package/dist/set-prompt-DJHFZKXZ.js.map +1 -0
- package/dist/setup-links-MWWNI4FI.js +144 -0
- package/dist/shared-JNIGEH2W.js +32 -0
- package/dist/shopify-3MO725IQ.js +3958 -0
- package/dist/site-FZCH64VV.js +180 -0
- package/dist/sitemaps-BEQUUVF2.js +77 -0
- package/dist/sites-XMTXNK6S.js +97 -0
- package/dist/skills-HKYYWQ2P.js +47 -0
- package/dist/sources-HUD22QOK.js +30 -0
- package/dist/sources-UMJF4LTK.js +457 -0
- package/dist/stale-6GYSUIUU.js +90 -0
- package/dist/stale-6GYSUIUU.js.map +1 -0
- package/dist/stats-NI777LK6.js +34 -0
- package/dist/status-2HMHVFME.js +65 -0
- package/dist/sticker-2SDWKGXB.js +94 -0
- package/dist/stock-THW6RFE5.js +179 -0
- package/dist/studies-E6XXH4RQ.js +250 -0
- package/dist/studio-KIIZ6GDK.js +49 -0
- package/dist/study-writes-4JXFQSGC.js +470 -0
- package/dist/suggest-3JDI3QAM.js +66 -0
- package/dist/sync-6S6SYYJT.js +55 -0
- package/dist/sync-BBZXPCZ7.js +279 -0
- package/dist/sync-PTTAFAZU.js +57 -0
- package/dist/sync-definition-G3XRLP74.js +70 -0
- package/dist/tag-E5ZUMD2B.js +57 -0
- package/dist/tag-manager-IHQYDUX3.js +43 -0
- package/dist/tags-D3H7FZIG.js +23 -0
- package/dist/tags-EEP2WOHL.js +23 -0
- package/dist/tags-HP4YJR36.js +227 -0
- package/dist/tags-INMEQWNK.js +23 -0
- package/dist/tags-KMMY3HB4.js +26 -0
- package/dist/targeting-ECBOAQG7.js +762 -0
- package/dist/targeting-constants-CGNYPDQY.js +118 -0
- package/dist/targeting-criteria-L4VB7RBH.js +113 -0
- package/dist/targets-T22E54UC.js +106 -0
- package/dist/terms-QVIZ2IAN.js +102 -0
- package/dist/testimonials-MKIDUBZH.js +32 -0
- package/dist/themes-R6CCC3UX.js +95 -0
- package/dist/top-companies-WV3NYUJR.js +111 -0
- package/dist/transcript-DWZXMBGW.js +165 -0
- package/dist/translate-43KE4RT6.js +603 -0
- package/dist/translate-43KE4RT6.js.map +1 -0
- package/dist/triggers-JCOYDORO.js +144 -0
- package/dist/tweets-TTY4UMBC.js +123 -0
- package/dist/unfollow-E2ZSYWUK.js +46 -0
- package/dist/unlink-XWPK6C4B.js +70 -0
- package/dist/unstage-RAFDCOHK.js +88 -0
- package/dist/unstage-XVCM35JX.js +96 -0
- package/dist/update-3LVVYA4K.js +101 -0
- package/dist/update-6J4YFUWR.js +192 -0
- package/dist/update-P7XEX3CH.js +66 -0
- package/dist/update-RUX5WSOT.js +81 -0
- package/dist/update-USQX4QDE.js +155 -0
- package/dist/upload-B2DEP22E.js +130 -0
- package/dist/upload-NV2KLKEL.js +150 -0
- package/dist/upscale-4COZN4VQ.js +109 -0
- package/dist/url-options-JXKKTY74.js +131 -0
- package/dist/url-params-5XD4ZL3B.js +101 -0
- package/dist/use-SORHLK2I.js +111 -0
- package/dist/validate-BTDCSW2Y.js +125 -0
- package/dist/validate-BTDCSW2Y.js.map +1 -0
- package/dist/variant-UAMWGBXF.js +338 -0
- package/dist/videos-UR4VDDJV.js +41 -0
- package/dist/view-DOSL3QK3.js +121 -0
- package/dist/viewer-check-VLODHBXL.js +83 -0
- package/dist/web-J3EJVEVU.js +173 -0
- package/dist/web-J3EJVEVU.js.map +1 -0
- package/dist/winners-KZ7SEXZY.js +113 -0
- package/dist/winning-ads-H2LM75L5.js +86 -0
- package/dist/write-commands-2AKHGZ2J.js +206 -0
- package/dist/write-commands-BKB6QICK.js +713 -0
- package/dist/write-commands-FCQNHFFN.js +1525 -0
- package/dist/write-commands-VAMGJXDX.js +1172 -0
- package/dist/x-3KONMR4M.js +47 -0
- package/package.json +1 -1
- package/dist/account-2UXZ6CZJ.js +0 -82
- package/dist/account-HQD5P3AF.js +0 -139
- package/dist/account-OWMJG4IW.js +0 -82
- package/dist/account-assets-JRMYVXQP.js +0 -290
- package/dist/account-level-PEGLZQTI.js +0 -611
- package/dist/account-reads-W2GAN335.js +0 -219
- package/dist/account-users-WLTQNPL7.js +0 -64
- package/dist/account-writes-TNADUSHW.js +0 -68
- package/dist/accounts-D3SQTZB7.js +0 -701
- package/dist/accounts-HRQFOTBJ.js +0 -80
- package/dist/accounts-MQMEOGQD.js +0 -114
- package/dist/accounts-T6SRCZJQ.js +0 -76
- package/dist/accounts-Y2VWI3AA.js +0 -115
- package/dist/actions-VJXED57L.js +0 -55
- package/dist/active-entities-BOMM4YDF.js +0 -103
- package/dist/activecampaign-TNJIQA4C.js +0 -938
- package/dist/activities-YH4K4JAI.js +0 -75
- package/dist/ad-group-writes-7BGCZA3M.js +0 -172
- package/dist/ad-groups-A6GU6EW5.js +0 -70
- package/dist/ad-writes-CEMCUDU2.js +0 -176
- package/dist/add-2L2VQ5MU.js +0 -80
- package/dist/add-DRTKSLEQ.js +0 -107
- package/dist/add-LBHISK44.js +0 -305
- package/dist/add-PS36Q2S3.js +0 -97
- package/dist/add-RLMXZLLO.js +0 -148
- package/dist/add-Z2OTFSQO.js +0 -81
- package/dist/add-accounts-GXBE4ZR2.js +0 -91
- package/dist/ads-4EVKVAMR.js +0 -48
- package/dist/ads-OY455VCX.js +0 -79
- package/dist/ads-WYQYZ44U.js +0 -128
- package/dist/ads-ZEF5AU3D.js +0 -120
- package/dist/adsets-ZRS7AZIK.js +0 -182
- package/dist/advertisers-AAGUUSAX.js +0 -125
- package/dist/advertisers-G6DZRBOK.js +0 -123
- package/dist/analytics-ANG42PKM.js +0 -2437
- package/dist/analytics-UI4AKUSF.js +0 -447
- package/dist/animate-KCSICY2N.js +0 -480
- package/dist/approved-LHYBVDXH.js +0 -73
- package/dist/asset-writes-CUF25BLM.js +0 -50
- package/dist/assign-5DFH6HBV.js +0 -80
- package/dist/audience-size-P6WIXOB3.js +0 -76
- package/dist/audience-writes-L7SNU2SB.js +0 -327
- package/dist/audiences-4ASLCNOF.js +0 -280
- package/dist/audiences-A54MU63W.js +0 -86
- package/dist/audiences-SG2BBM7R.js +0 -85
- package/dist/audit-6K5FFV6K.js +0 -88
- package/dist/audit-LA4BSLXV.js +0 -154
- package/dist/autocomplete-XMG6E7TG.js +0 -114
- package/dist/avatars-4IFN4GZD.js +0 -38
- package/dist/bid-pricing-JEOG2Q3L.js +0 -103
- package/dist/brand-C6HUAK74.js +0 -22
- package/dist/brief-5BCPPBU3.js +0 -543
- package/dist/businesses-GQ5FOZDU.js +0 -54
- package/dist/campaign-groups-IYQZSICZ.js +0 -99
- package/dist/campaign-writes-CVOOPZ35.js +0 -176
- package/dist/campaign-writes-YXI5UOPH.js +0 -168
- package/dist/campaigns-FW4WVD25.js +0 -113
- package/dist/campaigns-QMFHNG3N.js +0 -111
- package/dist/campaigns-TX37WHVL.js +0 -78
- package/dist/campaigns-VZJMYETG.js +0 -130
- package/dist/canvas-G4QXNPPE.js +0 -46
- package/dist/capabilities-7643Y2HU.js +0 -147
- package/dist/cards-YHZFJ3US.js +0 -85
- package/dist/catalog-PTVQSATT.js +0 -65
- package/dist/catalog-PTVQSATT.js.map +0 -1
- package/dist/catalogs-YNIUP2AH.js +0 -130
- package/dist/catalogs-ZHCLH43A.js +0 -781
- package/dist/changes-QUKBZVB3.js +0 -135
- package/dist/chatgpt-TIUBMATF.js +0 -47
- package/dist/chats-BGLAG4Q7.js +0 -279
- package/dist/check-MN5ZQ7RX.js +0 -107
- package/dist/chunk-23KN4NL4.js +0 -45
- package/dist/chunk-2UJ5ABI6.js +0 -604
- package/dist/chunk-2XRFWXSA.js +0 -103
- package/dist/chunk-3JV4T6XW.js +0 -69
- package/dist/chunk-3OSBCYKA.js +0 -8954
- package/dist/chunk-3QQHPRRB.js +0 -89
- package/dist/chunk-3WTCMBDC.js +0 -1518
- package/dist/chunk-44ZRCSR7.js +0 -228
- package/dist/chunk-46YLDIQG.js +0 -4254
- package/dist/chunk-46YLDIQG.js.map +0 -1
- package/dist/chunk-4BTUF2AV.js +0 -69
- package/dist/chunk-4D37LCBS.js +0 -111
- package/dist/chunk-4QITYZUH.js +0 -163
- package/dist/chunk-4XNF52NU.js +0 -429
- package/dist/chunk-4Y7IJ2PU.js +0 -5368
- package/dist/chunk-53BTYIMJ.js +0 -91
- package/dist/chunk-56OEYUJU.js +0 -61
- package/dist/chunk-5ITB24SC.js +0 -544
- package/dist/chunk-5N47LB7X.js +0 -285
- package/dist/chunk-5UBFYJHF.js +0 -170
- package/dist/chunk-6CQOHJZW.js +0 -125
- package/dist/chunk-6PMJU7IU.js +0 -169
- package/dist/chunk-7GGLZOQN.js +0 -91
- package/dist/chunk-7I65KXU7.js +0 -98
- package/dist/chunk-7JFVMJZI.js +0 -207
- package/dist/chunk-A6VODUO3.js +0 -166
- package/dist/chunk-AGTA5FJX.js +0 -139
- package/dist/chunk-AGU4KGT6.js +0 -84
- package/dist/chunk-BXUUKRMM.js +0 -46
- package/dist/chunk-BZTAEZLT.js +0 -51
- package/dist/chunk-C7IOSSI4.js +0 -58
- package/dist/chunk-CIW3Q7B2.js +0 -229
- package/dist/chunk-CJQ77HO5.js +0 -1646
- package/dist/chunk-CKTVRR3D.js +0 -57
- package/dist/chunk-CNPYG4F3.js +0 -75
- package/dist/chunk-COS3TPHX.js +0 -377
- package/dist/chunk-CQ6HBFOB.js +0 -23
- package/dist/chunk-D7Y3UNWO.js +0 -66
- package/dist/chunk-DJTWY7GL.js +0 -942
- package/dist/chunk-DJTWY7GL.js.map +0 -1
- package/dist/chunk-DWW5QSUF.js +0 -638
- package/dist/chunk-E34YYDCE.js +0 -35
- package/dist/chunk-ENUCJ6AO.js +0 -148
- package/dist/chunk-ES3PWGS3.js +0 -438
- package/dist/chunk-FESQ5TXU.js +0 -42
- package/dist/chunk-FEUKUZRA.js +0 -106
- package/dist/chunk-FJDSL4O5.js +0 -910
- package/dist/chunk-FSTDWVXG.js +0 -455
- package/dist/chunk-FUR7R4D7.js +0 -249
- package/dist/chunk-GYMZCJX6.js +0 -97
- package/dist/chunk-HTT7RBRC.js +0 -846
- package/dist/chunk-HVJJEQDQ.js +0 -7234
- package/dist/chunk-HVJJEQDQ.js.map +0 -1
- package/dist/chunk-HZPTQRX6.js +0 -2441
- package/dist/chunk-HZPTQRX6.js.map +0 -1
- package/dist/chunk-I7AYMJZA.js +0 -783
- package/dist/chunk-IQWFJEA3.js +0 -217
- package/dist/chunk-IU5K42Q3.js +0 -831
- package/dist/chunk-JAC6JVCI.js +0 -26
- package/dist/chunk-JARRF5VX.js +0 -66
- package/dist/chunk-JEUFRIYS.js +0 -297
- package/dist/chunk-JNSRQQDP.js +0 -94
- package/dist/chunk-KGAI4E2I.js +0 -106
- package/dist/chunk-KITVYLEX.js +0 -843
- package/dist/chunk-L4LNS54Y.js +0 -138
- package/dist/chunk-L5VVKIMB.js +0 -203
- package/dist/chunk-L763CNKH.js +0 -333
- package/dist/chunk-LO2MZJJP.js +0 -225
- package/dist/chunk-LV7EU6HM.js +0 -324
- package/dist/chunk-LXZ5E6AC.js +0 -84
- package/dist/chunk-LZRZVIEJ.js +0 -191
- package/dist/chunk-M2MJ52HS.js +0 -676
- package/dist/chunk-MBSAHNMJ.js +0 -547
- package/dist/chunk-MCJ5I5LR.js +0 -3187
- package/dist/chunk-MCJ5I5LR.js.map +0 -1
- package/dist/chunk-MCKYNFPH.js +0 -219
- package/dist/chunk-MHZIOOT5.js +0 -197
- package/dist/chunk-MNOCC5AL.js +0 -207
- package/dist/chunk-MUEJVDHI.js +0 -200
- package/dist/chunk-MZPS46OR.js +0 -76
- package/dist/chunk-N6WHUUFH.js +0 -19
- package/dist/chunk-NA5Q473J.js +0 -3868
- package/dist/chunk-NA5Q473J.js.map +0 -1
- package/dist/chunk-NCO5NGBN.js +0 -74
- package/dist/chunk-NLW25WW3.js +0 -52
- package/dist/chunk-NYAFSC5V.js +0 -287
- package/dist/chunk-O7AMKMII.js +0 -215
- package/dist/chunk-OL3QHART.js +0 -188
- package/dist/chunk-OPUEQSKM.js +0 -122
- package/dist/chunk-OPUEQSKM.js.map +0 -1
- package/dist/chunk-OXLB5M5M.js +0 -592
- package/dist/chunk-OXLB5M5M.js.map +0 -1
- package/dist/chunk-OXYWSVOJ.js +0 -100
- package/dist/chunk-OYNBUT5X.js +0 -479
- package/dist/chunk-PE4ZP7MX.js +0 -8914
- package/dist/chunk-PE4ZP7MX.js.map +0 -1
- package/dist/chunk-PG5R35QY.js +0 -73
- package/dist/chunk-PHZOMTI6.js +0 -97
- package/dist/chunk-PIAG4UJT.js +0 -274
- package/dist/chunk-PYWIHAVD.js +0 -64
- package/dist/chunk-QKNPF6ZD.js +0 -24026
- package/dist/chunk-QKNPF6ZD.js.map +0 -1
- package/dist/chunk-QOBA6PHB.js +0 -131
- package/dist/chunk-QPPQXU3U.js +0 -98
- package/dist/chunk-QTKNS2U2.js +0 -149
- package/dist/chunk-QTLIXCVN.js +0 -46
- package/dist/chunk-R5LRBDEM.js +0 -136
- package/dist/chunk-RRC7F3QQ.js +0 -1919
- package/dist/chunk-S6VFDNSQ.js +0 -63
- package/dist/chunk-SEYCF446.js +0 -191
- package/dist/chunk-SF52UGHZ.js +0 -225
- package/dist/chunk-SG2TDQEE.js +0 -150
- package/dist/chunk-SVNH6P7O.js +0 -1744
- package/dist/chunk-SWFZJROM.js +0 -64
- package/dist/chunk-UBDY5RE4.js +0 -387
- package/dist/chunk-UCNIJ2IW.js +0 -494
- package/dist/chunk-UFUYTWEF.js +0 -344
- package/dist/chunk-ULW4EWAA.js +0 -39
- package/dist/chunk-UROKPFIS.js +0 -142
- package/dist/chunk-VCOIFNYH.js +0 -714
- package/dist/chunk-VCOIFNYH.js.map +0 -1
- package/dist/chunk-VP4PO7FW.js +0 -392
- package/dist/chunk-VPF5A7CM.js +0 -476
- package/dist/chunk-VV6FDIP5.js +0 -224
- package/dist/chunk-WRTG3KXU.js +0 -156
- package/dist/chunk-WWLZ5RRU.js +0 -319
- package/dist/chunk-WWLZ5RRU.js.map +0 -1
- package/dist/chunk-XAW5GL6B.js +0 -76
- package/dist/chunk-XRNJRQ6Q.js +0 -26
- package/dist/chunk-Y5GQO6CR.js +0 -56
- package/dist/chunk-YE4RCEEJ.js +0 -167
- package/dist/chunk-YJYKSMLF.js +0 -296
- package/dist/chunk-YO54MA7R.js +0 -275
- package/dist/chunk-Z6T6VDDA.js +0 -76
- package/dist/chunk-ZOH672S6.js +0 -25
- package/dist/claim-2JNNC66N.js +0 -200
- package/dist/client-YUVT3RZN.js +0 -19
- package/dist/code-LOOWLRUL.js +0 -76
- package/dist/companies-4NJU5TLU.js +0 -198
- package/dist/company-QOYWS4W6.js +0 -308
- package/dist/complete-7FX2K3PV.js +0 -84
- package/dist/config-AOF6ACIP.js +0 -88
- package/dist/connect-H2HSPMRT.js +0 -45
- package/dist/content-NCW5IJFR.js +0 -85
- package/dist/conversation-4M7YMQOL.js +0 -96
- package/dist/conversion-report-G5JMZNYV.js +0 -127
- package/dist/conversion-upload-command-43PZFYT7.js +0 -439
- package/dist/conversion-writes-JQQCCGPO.js +0 -122
- package/dist/conversions-UO4CQNF6.js +0 -78
- package/dist/conversions-Z7FW7CFT.js +0 -140
- package/dist/copy-writes-ONVSSBLJ.js +0 -170
- package/dist/countries-Q6TA42P7.js +0 -82
- package/dist/create-4SFO4AQZ.js +0 -62
- package/dist/create-D5MA64KL.js +0 -239
- package/dist/create-GJ4ZMY3A.js +0 -210
- package/dist/create-QVY6DSYM.js +0 -135
- package/dist/creatives-ADH6HCCA.js +0 -58
- package/dist/creatives-R3XILT6D.js +0 -223
- package/dist/creatives-S3EZCXUT.js +0 -89
- package/dist/credentials-EQRB6XGZ.js +0 -290
- package/dist/critique-4YRRUNAU.js +0 -1451
- package/dist/critique-JCU2ATT6.js +0 -232
- package/dist/crm-AF6XOOSF.js +0 -323
- package/dist/crm-LSMFGR6R.js +0 -227
- package/dist/crop-RDP7YCNV.js +0 -113
- package/dist/currency-4KNOOZUU.js +0 -88
- package/dist/custom-conversions-7MZFTHUM.js +0 -128
- package/dist/customers-MM3VIZNA.js +0 -59
- package/dist/decide-OPCCKAIT.js +0 -199
- package/dist/delete-CO2YBPTI.js +0 -67
- package/dist/delete-D7HTW32U.js +0 -57
- package/dist/delete-GKQTDOZF.js +0 -69
- package/dist/delete-JUPBYK3H.js +0 -69
- package/dist/delete-KZFI235B.js +0 -85
- package/dist/delete-R3LXCKA4.js +0 -71
- package/dist/demographics-DK5JDY6M.js +0 -141
- package/dist/describe-537PPL7P.js +0 -97
- package/dist/describe-GIG46DT5.js +0 -97
- package/dist/dimensions-UXK7DMTF.js +0 -101
- package/dist/discard-DEJOM62Y.js +0 -69
- package/dist/discover-MKFDG6NK.js +0 -93
- package/dist/discover-U6YLVLTF.js +0 -172
- package/dist/domain-MBOMV3CQ.js +0 -101
- package/dist/download-KN2I55SA.js +0 -172
- package/dist/download-PRBLR6IQ.js +0 -299
- package/dist/draft-BMNBT37B.js +0 -283
- package/dist/draft-CGPVRRKC.js +0 -335
- package/dist/draft-F74OIT5O.js +0 -310
- package/dist/draft-FIEZWBIX.js +0 -308
- package/dist/draft-H5RVDTFD.js +0 -240
- package/dist/draft-HZ5T6NOI.js +0 -220
- package/dist/draft-UMPCOCP6.js +0 -100
- package/dist/draft-XEUHTUMR.js +0 -103
- package/dist/env-VBSATLEF.js +0 -53
- package/dist/experiment-2XR6MBE2.js +0 -1397
- package/dist/experiments-YNJZCMQM.js +0 -236
- package/dist/export-YCLJG5YP.js +0 -168
- package/dist/extract-E3CMEN5U.js +0 -113
- package/dist/facets-Y4OACBMC.js +0 -117
- package/dist/favorites-NSQX6HKB.js +0 -178
- package/dist/feed-TKMMYAEH.js +0 -177
- package/dist/feedback-MORAVN52.js +0 -111
- package/dist/feedback-MORAVN52.js.map +0 -1
- package/dist/feedback-record-M3RB7H2C.js +0 -265
- package/dist/feedback-record-M3RB7H2C.js.map +0 -1
- package/dist/fetch-EHP2FK6Y.js +0 -139
- package/dist/fetch-XU6QVWMS.js +0 -179
- package/dist/fetch-XU6QVWMS.js.map +0 -1
- package/dist/find-I7U3THF3.js +0 -143
- package/dist/fit-IHUUFCGI.js +0 -65
- package/dist/flows-WSCIMXQX.js +0 -250
- package/dist/follow-A46RAJEX.js +0 -94
- package/dist/follow-competitors-VU2L3KWF.js +0 -112
- package/dist/following-UOUNSU6P.js +0 -113
- package/dist/fonts-3QW7EDHE.js +0 -39
- package/dist/forecast-2WVHMSZP.js +0 -169
- package/dist/forecast-F25LSCM5.js +0 -121
- package/dist/funding-2VROIMLS.js +0 -85
- package/dist/funnel-35DYDBJH.js +0 -397
- package/dist/ga4-ULHKTF23.js +0 -55
- package/dist/generate-Z7AROAES.js +0 -263
- package/dist/get-4CAX33L2.js +0 -59
- package/dist/get-5E4YJKPO.js +0 -66
- package/dist/get-ABQZJ2VQ.js +0 -38
- package/dist/get-ASAW6TVF.js +0 -62
- package/dist/get-GXVAJZHM.js +0 -56
- package/dist/get-IF7KHMSI.js +0 -92
- package/dist/get-N7X75ZJO.js +0 -82
- package/dist/get-ZISAHMTQ.js +0 -59
- package/dist/gif-QLNWBFAH.js +0 -102
- package/dist/google-FDR55RRD.js +0 -136
- package/dist/google-M6XR7YGT.js +0 -3267
- package/dist/google-ads-NCSMNNND.js +0 -198
- package/dist/group-HAQM6P7M.js +0 -43
- package/dist/group-XVDH2ONO.js +0 -43
- package/dist/gsc-GQFI6I2D.js +0 -30
- package/dist/history-FGQ2H7XH.js +0 -69
- package/dist/history-LTOFKBMJ.js +0 -136
- package/dist/history-VJ254UXF.js +0 -102
- package/dist/hubspot-W2NM75YK.js +0 -782
- package/dist/icon-F7AOOTFI.js +0 -137
- package/dist/ideas-54KFDNDM.js +0 -45
- package/dist/images-JOEVCCP6.js +0 -92
- package/dist/improve-LIKOER3S.js +0 -86
- package/dist/ingest-6R7XUL46.js +0 -27
- package/dist/ingest-VCIH5QDR.js +0 -123
- package/dist/insights-QNE6XCBA.js +0 -439
- package/dist/insights-UXUUOQB7.js +0 -132
- package/dist/inspect-MGOR77FP.js +0 -192
- package/dist/inspiration-VXNGKAJV.js +0 -53
- package/dist/instant-experiences-MT2XMQNH.js +0 -260
- package/dist/intent-FZWPRUCI.js +0 -95
- package/dist/job-TS34W4IU.js +0 -202
- package/dist/job-create-FXXDR2EE.js +0 -109
- package/dist/job-status-R2H4HNC5.js +0 -74
- package/dist/keep-YSU3XMW3.js +0 -78
- package/dist/keyword-gap-4ECYPWXJ.js +0 -130
- package/dist/keyword-metrics-SBIRN5KC.js +0 -200
- package/dist/keywords-for-site-TLNPJHT2.js +0 -131
- package/dist/knowledge-L3VLOVLG.js +0 -195
- package/dist/landing-ZICSVWKF.js +0 -28
- package/dist/landings-XTPNPTHN.js +0 -151
- package/dist/languages-DIKRMAYE.js +0 -55
- package/dist/languages-VNZQ5USL.js +0 -40
- package/dist/launches-5R7EUONQ.js +0 -19
- package/dist/layerize-Q2QWDARG.js +0 -190
- package/dist/lead-routes-IXUCGINI.js +0 -733
- package/dist/leads-JUQFNK55.js +0 -115
- package/dist/leads-UVG6VYAC.js +0 -540
- package/dist/learn-A6BT25LQ.js +0 -207
- package/dist/library-G5YAFLTR.js +0 -211
- package/dist/lighthouse-BCBV2XGP.js +0 -75
- package/dist/line-item-writes-NW7A6HNH.js +0 -211
- package/dist/line-items-OAG3QMDE.js +0 -107
- package/dist/link-4VJ7FSOA.js +0 -67
- package/dist/linkedin-CKOWKD4M.js +0 -1328
- package/dist/linkedin-person-C22IDK7S.js +0 -139
- package/dist/list-2DKLO6AO.js +0 -67
- package/dist/list-4SDJZVOL.js +0 -93
- package/dist/list-6YW4I4VG.js +0 -65
- package/dist/list-CDDXHMJQ.js +0 -306
- package/dist/list-GS42LK5C.js +0 -51
- package/dist/list-HWNHRWGB.js +0 -57
- package/dist/list-QSBEYU45.js +0 -76
- package/dist/list-ZFGOONWL.js +0 -50
- package/dist/list-ZORO7PFP.js +0 -154
- package/dist/locations-4RDUHKVR.js +0 -69
- package/dist/locations-HATR6PSC.js +0 -40
- package/dist/log-OSJHKHPV.js +0 -95
- package/dist/logo-ABO4HJRG.js +0 -18
- package/dist/lookup-SPNT3W3W.js +0 -23
- package/dist/make-7CIVNW77.js +0 -1366
- package/dist/make-7CIVNW77.js.map +0 -1
- package/dist/map-PMGZDXAN.js +0 -436
- package/dist/mcp-MOOOTRYG.js +0 -729
- package/dist/media-CIJW2Q3I.js +0 -89
- package/dist/media-GZKW2PZB.js +0 -18
- package/dist/media-sources-5OYCKQ5J.js +0 -35
- package/dist/members-QG5IP5HM.js +0 -47
- package/dist/meme-BPWX7YQH.js +0 -100
- package/dist/meta-KVOSCSPJ.js +0 -122
- package/dist/metrics-R4YS2JL6.js +0 -152
- package/dist/models-RJMZV5SH.js +0 -155
- package/dist/normalize-LATTXSL3.js +0 -144
- package/dist/normalize-NMNOJ6Q5.js +0 -806
- package/dist/options-KALH5TB7.js +0 -125
- package/dist/organization-AGCF7DUJ.js +0 -949
- package/dist/output-34QMC3OU.js +0 -24
- package/dist/page-UDF3LJHP.js +0 -105
- package/dist/page-photos-FCBW5UZS.js +0 -118
- package/dist/pages-5W5G4MRB.js +0 -67
- package/dist/performance-SITVZQWX.js +0 -5565
- package/dist/performance-YNXPUSGJ.js +0 -27
- package/dist/pinterest-IABDXLF5.js +0 -96
- package/dist/pixels-4QAWLSEL.js +0 -109
- package/dist/pixels-TYJVE377.js +0 -62
- package/dist/plan-I6EFL7RC.js +0 -208
- package/dist/posts-SXQSLOFV.js +0 -36
- package/dist/preview-7Y5LE24E.js +0 -218
- package/dist/profile-R5VPOOJU.js +0 -159
- package/dist/promoted-tweet-writes-NAHPJ3VD.js +0 -183
- package/dist/promoted-tweets-2XQ4MWAC.js +0 -119
- package/dist/properties-2D2BIDGC.js +0 -101
- package/dist/publish-UITYPUBD.js +0 -344
- package/dist/query-JOYRNM4O.js +0 -231
- package/dist/query-LB5H7IRK.js +0 -236
- package/dist/query-RE7NB2BK.js +0 -62
- package/dist/questionnaire-U767HYDE.js +0 -94
- package/dist/read-3TCDDALC.js +0 -141
- package/dist/reddit-6XIARCTX.js +0 -29
- package/dist/refresh-6UCN7PDX.js +0 -97
- package/dist/refresh-GIB6QQZS.js +0 -42
- package/dist/release-IN65L23O.js +0 -63
- package/dist/relevant-pages-W7IM6YQW.js +0 -99
- package/dist/remove-LZQHDFZF.js +0 -49
- package/dist/remove-X3XWVE2M.js +0 -53
- package/dist/reopen-RMMQ55CH.js +0 -66
- package/dist/rerun-ON6YCJAL.js +0 -95
- package/dist/rerun-ON6YCJAL.js.map +0 -1
- package/dist/research-LZBPCXIW.js +0 -72
- package/dist/research-LZBPCXIW.js.map +0 -1
- package/dist/research-W5KUOBXZ.js +0 -265
- package/dist/reset-MUWXTLIB.js +0 -57
- package/dist/reset-VQNKXFAF.js +0 -57
- package/dist/resolve-DMGWLMTC.js +0 -124
- package/dist/retry-YI4YLYTQ.js +0 -63
- package/dist/retry-ZQUJPKQH.js +0 -65
- package/dist/retry-failed-PEAUXGNT.js +0 -45
- package/dist/revenue-6YZAOMF6.js +0 -91
- package/dist/rule-writes-G25O5JZS.js +0 -525
- package/dist/rules-FHVZEN4D.js +0 -99
- package/dist/rules-KSOAKEI3.js +0 -217
- package/dist/rules-add-7X46VTIJ.js +0 -465
- package/dist/run-TA6HYFKZ.js +0 -69
- package/dist/run-YORKHK6S.js +0 -70
- package/dist/scaffold-ad-RHSHBCVV.js +0 -1512
- package/dist/scaffold-ad-RHSHBCVV.js.map +0 -1
- package/dist/scaffold-static-ad-XNOGCMPF.js +0 -1010
- package/dist/scaffold-static-ad-XNOGCMPF.js.map +0 -1
- package/dist/scaffold-video-XEVJQ7QZ.js +0 -884
- package/dist/scaffold-video-XEVJQ7QZ.js.map +0 -1
- package/dist/schedule-TMTLYULK.js +0 -64
- package/dist/schedule-TNF6M6UD.js +0 -67
- package/dist/scheduled-agents-TS3WLRCM.js +0 -55
- package/dist/schema-2YQAQVON.js +0 -121
- package/dist/schema-6S5ZEPBS.js +0 -135
- package/dist/scrape-FDBYU3TU.js +0 -2241
- package/dist/screenshot-QSRWL4J6.js +0 -102
- package/dist/search-BOCQFUM3.js +0 -51
- package/dist/search-CENPR7GA.js +0 -224
- package/dist/search-GEXDRTAQ.js +0 -26
- package/dist/search-LFTFNDMC.js +0 -91
- package/dist/search-LTUUAGZG.js +0 -177
- package/dist/search-PYLNVZXI.js +0 -92
- package/dist/search-copy-RLRRR3LB.js +0 -168
- package/dist/seeds-E2GLHJ2T.js +0 -101
- package/dist/select-BXBNFGVL.js +0 -106
- package/dist/select-BXBNFGVL.js.map +0 -1
- package/dist/sends-NBTGBZT7.js +0 -349
- package/dist/sequences-UOIHUOD3.js +0 -146
- package/dist/set-prompt-JJWBB23C.js +0 -198
- package/dist/set-prompt-JJWBB23C.js.map +0 -1
- package/dist/setup-links-6ANVKZCE.js +0 -144
- package/dist/shared-IMDHTVSW.js +0 -32
- package/dist/shopify-6ISTKZCA.js +0 -3958
- package/dist/site-OIV55MGO.js +0 -180
- package/dist/sitemaps-VYLDUI4L.js +0 -77
- package/dist/sites-HM7ZCGCZ.js +0 -97
- package/dist/skills-FBIVWINH.js +0 -47
- package/dist/sources-5L4S5BQV.js +0 -457
- package/dist/sources-GLJWZFHZ.js +0 -30
- package/dist/stale-SK2SDGOT.js +0 -76
- package/dist/stale-SK2SDGOT.js.map +0 -1
- package/dist/stats-2NLNQBRY.js +0 -34
- package/dist/status-TD7ISXC5.js +0 -65
- package/dist/sticker-4NKFAGEK.js +0 -94
- package/dist/stock-XOXZGGU3.js +0 -179
- package/dist/studies-C5IINK5Y.js +0 -250
- package/dist/studio-IDNM42JP.js +0 -49
- package/dist/study-writes-GJXLMM3D.js +0 -470
- package/dist/suggest-Z553OSYW.js +0 -66
- package/dist/sync-CIRDY55O.js +0 -279
- package/dist/sync-PVIFUXX3.js +0 -57
- package/dist/sync-UBOHNOXB.js +0 -55
- package/dist/sync-definition-7NBT6LTK.js +0 -69
- package/dist/tag-22TFBGDG.js +0 -57
- package/dist/tag-manager-QLZHU6NG.js +0 -43
- package/dist/tags-3HB7N5WB.js +0 -23
- package/dist/tags-DG3XQ4SF.js +0 -227
- package/dist/tags-T4EN6XYE.js +0 -23
- package/dist/tags-T6THTVNP.js +0 -26
- package/dist/tags-XY6R2VJ6.js +0 -23
- package/dist/targeting-GNEBULXU.js +0 -762
- package/dist/targeting-constants-GR6BVM2H.js +0 -118
- package/dist/targeting-criteria-CL472KJO.js +0 -113
- package/dist/targets-7AQMSO6H.js +0 -106
- package/dist/terms-LG7FYQOG.js +0 -102
- package/dist/testimonials-4QWVSEPU.js +0 -32
- package/dist/themes-ZTM4OVGK.js +0 -95
- package/dist/top-companies-PMFYOAFK.js +0 -111
- package/dist/transcript-YWFYNFWX.js +0 -165
- package/dist/translate-VMQHPX4B.js +0 -600
- package/dist/translate-VMQHPX4B.js.map +0 -1
- package/dist/triggers-JKXISN45.js +0 -144
- package/dist/tweets-IF5FFFTH.js +0 -123
- package/dist/unfollow-CDUOZWM7.js +0 -46
- package/dist/unlink-IUAFDLBT.js +0 -70
- package/dist/unstage-OVOZE6DA.js +0 -96
- package/dist/unstage-ZYT5RNLK.js +0 -88
- package/dist/update-23Q4T2J5.js +0 -155
- package/dist/update-74VME6PN.js +0 -66
- package/dist/update-O22DAZVX.js +0 -192
- package/dist/update-Q3WJ3DQN.js +0 -81
- package/dist/update-QAWK3O7L.js +0 -101
- package/dist/upload-EAEILUQB.js +0 -150
- package/dist/upload-WASRCKS4.js +0 -130
- package/dist/upscale-HB6L6SZG.js +0 -109
- package/dist/url-options-M7RX2TD4.js +0 -131
- package/dist/url-params-E5ON6W2N.js +0 -101
- package/dist/use-HGX7ZRH5.js +0 -111
- package/dist/validate-NB6PS5PF.js +0 -122
- package/dist/validate-NB6PS5PF.js.map +0 -1
- package/dist/variant-O7LXOA2E.js +0 -338
- package/dist/videos-SS2Y6FJF.js +0 -41
- package/dist/view-ED636LWD.js +0 -121
- package/dist/viewer-check-CWS6OVM7.js +0 -83
- package/dist/web-HT22JFQR.js +0 -143
- package/dist/web-HT22JFQR.js.map +0 -1
- package/dist/winners-ZG5SHNBS.js +0 -113
- package/dist/winning-ads-FXTP4PWZ.js +0 -86
- package/dist/write-commands-5YVQKO7E.js +0 -1525
- package/dist/write-commands-AIWR7NBO.js +0 -713
- package/dist/write-commands-UK6MKGHI.js +0 -206
- package/dist/write-commands-W3UN6F4Y.js +0 -1172
- package/dist/x-KEMAY75C.js +0 -47
- /package/dist/{account-OWMJG4IW.js.map → account-NWIPSZM3.js.map} +0 -0
- /package/dist/{account-HQD5P3AF.js.map → account-WBGF3RGD.js.map} +0 -0
- /package/dist/{account-2UXZ6CZJ.js.map → account-ZE5ABGHY.js.map} +0 -0
- /package/dist/{account-assets-JRMYVXQP.js.map → account-assets-BTDNFVBW.js.map} +0 -0
- /package/dist/{account-level-PEGLZQTI.js.map → account-level-T2YB6ILW.js.map} +0 -0
- /package/dist/{account-reads-W2GAN335.js.map → account-reads-U4OI4N4V.js.map} +0 -0
- /package/dist/{account-users-WLTQNPL7.js.map → account-users-6RYS7LDR.js.map} +0 -0
- /package/dist/{account-writes-TNADUSHW.js.map → account-writes-4TE3ARDQ.js.map} +0 -0
- /package/dist/{accounts-MQMEOGQD.js.map → accounts-N2YX4AP6.js.map} +0 -0
- /package/dist/{accounts-D3SQTZB7.js.map → accounts-NY47CLTN.js.map} +0 -0
- /package/dist/{accounts-HRQFOTBJ.js.map → accounts-SHGZX4V2.js.map} +0 -0
- /package/dist/{accounts-Y2VWI3AA.js.map → accounts-TILUZQQT.js.map} +0 -0
- /package/dist/{accounts-T6SRCZJQ.js.map → accounts-VAZ4ZXMA.js.map} +0 -0
- /package/dist/{actions-VJXED57L.js.map → actions-TBWF3M5X.js.map} +0 -0
- /package/dist/{active-entities-BOMM4YDF.js.map → active-entities-NTSGNVAV.js.map} +0 -0
- /package/dist/{activecampaign-TNJIQA4C.js.map → activecampaign-CBTOLWBM.js.map} +0 -0
- /package/dist/{activities-YH4K4JAI.js.map → activities-XVFA3XF5.js.map} +0 -0
- /package/dist/{ad-group-writes-7BGCZA3M.js.map → ad-group-writes-HVNPWOXM.js.map} +0 -0
- /package/dist/{ad-groups-A6GU6EW5.js.map → ad-groups-NPD6TNK2.js.map} +0 -0
- /package/dist/{ad-writes-CEMCUDU2.js.map → ad-writes-O5GJSK3G.js.map} +0 -0
- /package/dist/{add-Z2OTFSQO.js.map → add-AYILCHML.js.map} +0 -0
- /package/dist/{add-DRTKSLEQ.js.map → add-D4USMEDM.js.map} +0 -0
- /package/dist/{add-PS36Q2S3.js.map → add-J76XNCNO.js.map} +0 -0
- /package/dist/{add-RLMXZLLO.js.map → add-JCNVWVNA.js.map} +0 -0
- /package/dist/{add-2L2VQ5MU.js.map → add-NV5TBLCP.js.map} +0 -0
- /package/dist/{add-LBHISK44.js.map → add-SWSKLIMK.js.map} +0 -0
- /package/dist/{add-accounts-GXBE4ZR2.js.map → add-accounts-2KEM5SDH.js.map} +0 -0
- /package/dist/{ads-WYQYZ44U.js.map → ads-3ZCUKPVZ.js.map} +0 -0
- /package/dist/{ads-OY455VCX.js.map → ads-CJIWTAGM.js.map} +0 -0
- /package/dist/{ads-ZEF5AU3D.js.map → ads-JSFDYLKJ.js.map} +0 -0
- /package/dist/{ads-4EVKVAMR.js.map → ads-TLWYK3XS.js.map} +0 -0
- /package/dist/{adsets-ZRS7AZIK.js.map → adsets-EQVLMBJX.js.map} +0 -0
- /package/dist/{advertisers-G6DZRBOK.js.map → advertisers-NXJIWTA4.js.map} +0 -0
- /package/dist/{advertisers-AAGUUSAX.js.map → advertisers-WQ2FDNHU.js.map} +0 -0
- /package/dist/{analytics-ANG42PKM.js.map → analytics-FG5CBBPC.js.map} +0 -0
- /package/dist/{analytics-UI4AKUSF.js.map → analytics-NH7M3XB7.js.map} +0 -0
- /package/dist/{animate-KCSICY2N.js.map → animate-IRSBEZVK.js.map} +0 -0
- /package/dist/{approved-LHYBVDXH.js.map → approved-LNUYJEUZ.js.map} +0 -0
- /package/dist/{asset-writes-CUF25BLM.js.map → asset-writes-JGOWG3L3.js.map} +0 -0
- /package/dist/{assign-5DFH6HBV.js.map → assign-GDQFFWZ5.js.map} +0 -0
- /package/dist/{audience-size-P6WIXOB3.js.map → audience-size-RBXNKZMD.js.map} +0 -0
- /package/dist/{audience-writes-L7SNU2SB.js.map → audience-writes-7HTQFT3Q.js.map} +0 -0
- /package/dist/{audiences-A54MU63W.js.map → audiences-FNNPTVSN.js.map} +0 -0
- /package/dist/{audiences-4ASLCNOF.js.map → audiences-I62OFJNP.js.map} +0 -0
- /package/dist/{audiences-SG2BBM7R.js.map → audiences-JOFKN2LB.js.map} +0 -0
- /package/dist/{audit-LA4BSLXV.js.map → audit-SLXL2OET.js.map} +0 -0
- /package/dist/{audit-6K5FFV6K.js.map → audit-SPBIEG2P.js.map} +0 -0
- /package/dist/{autocomplete-XMG6E7TG.js.map → autocomplete-4I6SKS33.js.map} +0 -0
- /package/dist/{avatars-4IFN4GZD.js.map → avatars-XLOSQRHV.js.map} +0 -0
- /package/dist/{bid-pricing-JEOG2Q3L.js.map → bid-pricing-IR7BOILK.js.map} +0 -0
- /package/dist/{brand-C6HUAK74.js.map → brand-YJXEJLZI.js.map} +0 -0
- /package/dist/{brief-5BCPPBU3.js.map → brief-P5U4PV73.js.map} +0 -0
- /package/dist/{businesses-GQ5FOZDU.js.map → businesses-ZGBQIBTU.js.map} +0 -0
- /package/dist/{campaign-groups-IYQZSICZ.js.map → campaign-groups-6SO2DUYF.js.map} +0 -0
- /package/dist/{campaign-writes-YXI5UOPH.js.map → campaign-writes-EXOITAX6.js.map} +0 -0
- /package/dist/{campaign-writes-CVOOPZ35.js.map → campaign-writes-N2U4TJEG.js.map} +0 -0
- /package/dist/{campaigns-FW4WVD25.js.map → campaigns-7U5YMQWS.js.map} +0 -0
- /package/dist/{campaigns-QMFHNG3N.js.map → campaigns-LUCBK4KX.js.map} +0 -0
- /package/dist/{campaigns-TX37WHVL.js.map → campaigns-N4IQNY5Z.js.map} +0 -0
- /package/dist/{campaigns-VZJMYETG.js.map → campaigns-PJP4QZQ6.js.map} +0 -0
- /package/dist/{canvas-G4QXNPPE.js.map → canvas-IP4MCAHT.js.map} +0 -0
- /package/dist/{capabilities-7643Y2HU.js.map → capabilities-SU25DKSW.js.map} +0 -0
- /package/dist/{cards-YHZFJ3US.js.map → cards-IPWT3R7L.js.map} +0 -0
- /package/dist/{catalogs-YNIUP2AH.js.map → catalogs-7TA4AJCV.js.map} +0 -0
- /package/dist/{catalogs-ZHCLH43A.js.map → catalogs-TJ4HICNN.js.map} +0 -0
- /package/dist/{changes-QUKBZVB3.js.map → changes-EJZJCZVV.js.map} +0 -0
- /package/dist/{chatgpt-TIUBMATF.js.map → chatgpt-D7JWEOAM.js.map} +0 -0
- /package/dist/{chats-BGLAG4Q7.js.map → chats-JMQODNCE.js.map} +0 -0
- /package/dist/{check-MN5ZQ7RX.js.map → check-JK3BRROQ.js.map} +0 -0
- /package/dist/{chunk-L763CNKH.js.map → chunk-26TRRYCA.js.map} +0 -0
- /package/dist/{chunk-3OSBCYKA.js.map → chunk-2NYMB7WG.js.map} +0 -0
- /package/dist/{chunk-R5LRBDEM.js.map → chunk-2TTGNQ5H.js.map} +0 -0
- /package/dist/{chunk-L4LNS54Y.js.map → chunk-2VUQOAT3.js.map} +0 -0
- /package/dist/{chunk-56OEYUJU.js.map → chunk-34NX5OGV.js.map} +0 -0
- /package/dist/{chunk-4Y7IJ2PU.js.map → chunk-3P6VKACL.js.map} +0 -0
- /package/dist/{chunk-OYNBUT5X.js.map → chunk-3WSBH7YB.js.map} +0 -0
- /package/dist/{chunk-I7AYMJZA.js.map → chunk-45EERHDB.js.map} +0 -0
- /package/dist/{chunk-LXZ5E6AC.js.map → chunk-4GARQXOI.js.map} +0 -0
- /package/dist/{chunk-OXYWSVOJ.js.map → chunk-6CPII3NK.js.map} +0 -0
- /package/dist/{chunk-CNPYG4F3.js.map → chunk-6D2D6L6K.js.map} +0 -0
- /package/dist/{chunk-JAC6JVCI.js.map → chunk-6OIKNJ7G.js.map} +0 -0
- /package/dist/{chunk-L5VVKIMB.js.map → chunk-6SK56BHM.js.map} +0 -0
- /package/dist/{chunk-M2MJ52HS.js.map → chunk-6VKGKWB4.js.map} +0 -0
- /package/dist/{chunk-5UBFYJHF.js.map → chunk-6Z5NT7TE.js.map} +0 -0
- /package/dist/{chunk-SEYCF446.js.map → chunk-75SKCW3F.js.map} +0 -0
- /package/dist/{chunk-KITVYLEX.js.map → chunk-7RAONNZM.js.map} +0 -0
- /package/dist/{chunk-VP4PO7FW.js.map → chunk-7YVITQPT.js.map} +0 -0
- /package/dist/{chunk-23KN4NL4.js.map → chunk-AHPZKJ32.js.map} +0 -0
- /package/dist/{chunk-3WTCMBDC.js.map → chunk-ALJV3U4U.js.map} +0 -0
- /package/dist/{chunk-FEUKUZRA.js.map → chunk-AZEJ727R.js.map} +0 -0
- /package/dist/{chunk-5ITB24SC.js.map → chunk-AZWX3Q2J.js.map} +0 -0
- /package/dist/{chunk-YJYKSMLF.js.map → chunk-B6ZGSAHC.js.map} +0 -0
- /package/dist/{chunk-FUR7R4D7.js.map → chunk-BLXTPJGC.js.map} +0 -0
- /package/dist/{chunk-A6VODUO3.js.map → chunk-BNDSCJUI.js.map} +0 -0
- /package/dist/{chunk-UFUYTWEF.js.map → chunk-BNFTHFBB.js.map} +0 -0
- /package/dist/{chunk-E34YYDCE.js.map → chunk-CAYIC3ES.js.map} +0 -0
- /package/dist/{chunk-MNOCC5AL.js.map → chunk-CMQHTYTK.js.map} +0 -0
- /package/dist/{chunk-VV6FDIP5.js.map → chunk-DGE5UEMS.js.map} +0 -0
- /package/dist/{chunk-SF52UGHZ.js.map → chunk-DS6EJRF4.js.map} +0 -0
- /package/dist/{chunk-O7AMKMII.js.map → chunk-DUWJG6QH.js.map} +0 -0
- /package/dist/{chunk-QOBA6PHB.js.map → chunk-DW4AEYFB.js.map} +0 -0
- /package/dist/{chunk-QTKNS2U2.js.map → chunk-DXHOUY74.js.map} +0 -0
- /package/dist/{chunk-PG5R35QY.js.map → chunk-E3QYALFY.js.map} +0 -0
- /package/dist/{chunk-FJDSL4O5.js.map → chunk-GB5TIOS5.js.map} +0 -0
- /package/dist/{chunk-4QITYZUH.js.map → chunk-GLGTUZQE.js.map} +0 -0
- /package/dist/{chunk-HTT7RBRC.js.map → chunk-GZ6MSG7I.js.map} +0 -0
- /package/dist/{chunk-NLW25WW3.js.map → chunk-HBMHTFKS.js.map} +0 -0
- /package/dist/{chunk-6CQOHJZW.js.map → chunk-HIXMP66B.js.map} +0 -0
- /package/dist/{chunk-SWFZJROM.js.map → chunk-HUYOWLTS.js.map} +0 -0
- /package/dist/{chunk-7JFVMJZI.js.map → chunk-HWOSUF22.js.map} +0 -0
- /package/dist/{chunk-IU5K42Q3.js.map → chunk-IA5O6DDP.js.map} +0 -0
- /package/dist/{chunk-7GGLZOQN.js.map → chunk-IAA36IYQ.js.map} +0 -0
- /package/dist/{chunk-N6WHUUFH.js.map → chunk-IANNXUQQ.js.map} +0 -0
- /package/dist/{chunk-CIW3Q7B2.js.map → chunk-IKZHHMG4.js.map} +0 -0
- /package/dist/{chunk-CQ6HBFOB.js.map → chunk-IS6TXDPQ.js.map} +0 -0
- /package/dist/{chunk-44ZRCSR7.js.map → chunk-IZABTTW5.js.map} +0 -0
- /package/dist/{chunk-UROKPFIS.js.map → chunk-JVFV6UJ3.js.map} +0 -0
- /package/dist/{chunk-UBDY5RE4.js.map → chunk-KJS3N47X.js.map} +0 -0
- /package/dist/{chunk-AGU4KGT6.js.map → chunk-KML35BKR.js.map} +0 -0
- /package/dist/{chunk-MUEJVDHI.js.map → chunk-KUH5WDSK.js.map} +0 -0
- /package/dist/{chunk-2UJ5ABI6.js.map → chunk-LKK6R5FM.js.map} +0 -0
- /package/dist/{chunk-PIAG4UJT.js.map → chunk-LTWAROBR.js.map} +0 -0
- /package/dist/{chunk-KGAI4E2I.js.map → chunk-LXCDBNBJ.js.map} +0 -0
- /package/dist/{chunk-XRNJRQ6Q.js.map → chunk-LZOP5AKR.js.map} +0 -0
- /package/dist/{chunk-3JV4T6XW.js.map → chunk-MOXKTWY5.js.map} +0 -0
- /package/dist/{chunk-LO2MZJJP.js.map → chunk-MTSEFJ7Y.js.map} +0 -0
- /package/dist/{chunk-S6VFDNSQ.js.map → chunk-MTV2RSGY.js.map} +0 -0
- /package/dist/{chunk-QPPQXU3U.js.map → chunk-MZOVTEEY.js.map} +0 -0
- /package/dist/{chunk-BZTAEZLT.js.map → chunk-N2MYKKHX.js.map} +0 -0
- /package/dist/{chunk-CKTVRR3D.js.map → chunk-N6SZJDDF.js.map} +0 -0
- /package/dist/{chunk-JNSRQQDP.js.map → chunk-NSYYRMCV.js.map} +0 -0
- /package/dist/{chunk-4BTUF2AV.js.map → chunk-O3NCVHFP.js.map} +0 -0
- /package/dist/{chunk-53BTYIMJ.js.map → chunk-OAFALNL2.js.map} +0 -0
- /package/dist/{chunk-NYAFSC5V.js.map → chunk-OBEAXLVV.js.map} +0 -0
- /package/dist/{chunk-AGTA5FJX.js.map → chunk-ORID3CGW.js.map} +0 -0
- /package/dist/{chunk-7I65KXU7.js.map → chunk-PEEE5WPR.js.map} +0 -0
- /package/dist/{chunk-QTLIXCVN.js.map → chunk-PMCVYVRV.js.map} +0 -0
- /package/dist/{chunk-IQWFJEA3.js.map → chunk-PMKNHE6G.js.map} +0 -0
- /package/dist/{chunk-ULW4EWAA.js.map → chunk-PRMR2LAM.js.map} +0 -0
- /package/dist/{chunk-GYMZCJX6.js.map → chunk-Q3LTMXUE.js.map} +0 -0
- /package/dist/{chunk-4D37LCBS.js.map → chunk-Q4L4Z2HT.js.map} +0 -0
- /package/dist/{chunk-PYWIHAVD.js.map → chunk-QE3DFWH4.js.map} +0 -0
- /package/dist/{chunk-LV7EU6HM.js.map → chunk-QG45DH5D.js.map} +0 -0
- /package/dist/{chunk-LZRZVIEJ.js.map → chunk-R23MN7HH.js.map} +0 -0
- /package/dist/{chunk-YE4RCEEJ.js.map → chunk-RCJAC2DY.js.map} +0 -0
- /package/dist/{chunk-ES3PWGS3.js.map → chunk-RLSFWA7K.js.map} +0 -0
- /package/dist/{chunk-JARRF5VX.js.map → chunk-RQ5NSJPA.js.map} +0 -0
- /package/dist/{chunk-Y5GQO6CR.js.map → chunk-RSQOWMZA.js.map} +0 -0
- /package/dist/{chunk-ZOH672S6.js.map → chunk-RVMDQYPX.js.map} +0 -0
- /package/dist/{chunk-RRC7F3QQ.js.map → chunk-SBGF4OKE.js.map} +0 -0
- /package/dist/{chunk-MZPS46OR.js.map → chunk-SIKCVWM3.js.map} +0 -0
- /package/dist/{chunk-Z6T6VDDA.js.map → chunk-TBD7LIQL.js.map} +0 -0
- /package/dist/{chunk-FSTDWVXG.js.map → chunk-TDNLM4J4.js.map} +0 -0
- /package/dist/{chunk-ENUCJ6AO.js.map → chunk-TH3OK7RO.js.map} +0 -0
- /package/dist/{chunk-SVNH6P7O.js.map → chunk-TJ6FFFE7.js.map} +0 -0
- /package/dist/{chunk-NCO5NGBN.js.map → chunk-TSKD7WNX.js.map} +0 -0
- /package/dist/{chunk-MCKYNFPH.js.map → chunk-TT5UTVPK.js.map} +0 -0
- /package/dist/{chunk-5N47LB7X.js.map → chunk-TUIUO4SW.js.map} +0 -0
- /package/dist/{chunk-3QQHPRRB.js.map → chunk-TUYFP4BC.js.map} +0 -0
- /package/dist/{chunk-2XRFWXSA.js.map → chunk-UKBFKTC2.js.map} +0 -0
- /package/dist/{chunk-D7Y3UNWO.js.map → chunk-UMPAKBCB.js.map} +0 -0
- /package/dist/{chunk-SG2TDQEE.js.map → chunk-URMAEVZO.js.map} +0 -0
- /package/dist/{chunk-UCNIJ2IW.js.map → chunk-VK7MSQ3P.js.map} +0 -0
- /package/dist/{chunk-FESQ5TXU.js.map → chunk-WBGJRI33.js.map} +0 -0
- /package/dist/{chunk-CJQ77HO5.js.map → chunk-WFPUHD6K.js.map} +0 -0
- /package/dist/{chunk-4XNF52NU.js.map → chunk-WQYHEHBP.js.map} +0 -0
- /package/dist/{chunk-YO54MA7R.js.map → chunk-WR7T2ZLW.js.map} +0 -0
- /package/dist/{chunk-COS3TPHX.js.map → chunk-WX3TPPPN.js.map} +0 -0
- /package/dist/{chunk-VPF5A7CM.js.map → chunk-XKJO6WSY.js.map} +0 -0
- /package/dist/{chunk-JEUFRIYS.js.map → chunk-XLY23CY7.js.map} +0 -0
- /package/dist/{chunk-DWW5QSUF.js.map → chunk-XUTSNIUI.js.map} +0 -0
- /package/dist/{chunk-WRTG3KXU.js.map → chunk-YF6D3AXC.js.map} +0 -0
- /package/dist/{chunk-XAW5GL6B.js.map → chunk-YY5DKGMZ.js.map} +0 -0
- /package/dist/{chunk-MBSAHNMJ.js.map → chunk-Z3UJKRF7.js.map} +0 -0
- /package/dist/{chunk-BXUUKRMM.js.map → chunk-Z5RBTOP5.js.map} +0 -0
- /package/dist/{chunk-6PMJU7IU.js.map → chunk-ZBKDD3SZ.js.map} +0 -0
- /package/dist/{chunk-PHZOMTI6.js.map → chunk-ZCIRAP2S.js.map} +0 -0
- /package/dist/{chunk-OL3QHART.js.map → chunk-ZKXHDXYI.js.map} +0 -0
- /package/dist/{chunk-C7IOSSI4.js.map → chunk-ZLGWQGXI.js.map} +0 -0
- /package/dist/{chunk-MHZIOOT5.js.map → chunk-ZQMYNDSV.js.map} +0 -0
- /package/dist/{claim-2JNNC66N.js.map → claim-NHSZNDTG.js.map} +0 -0
- /package/dist/{client-YUVT3RZN.js.map → client-2CPUMURU.js.map} +0 -0
- /package/dist/{code-LOOWLRUL.js.map → code-CZ5W3JNM.js.map} +0 -0
- /package/dist/{companies-4NJU5TLU.js.map → companies-GF27MKDE.js.map} +0 -0
- /package/dist/{company-QOYWS4W6.js.map → company-I3QHEINQ.js.map} +0 -0
- /package/dist/{complete-7FX2K3PV.js.map → complete-6Q6I6D4O.js.map} +0 -0
- /package/dist/{config-AOF6ACIP.js.map → config-EW6S72KY.js.map} +0 -0
- /package/dist/{connect-H2HSPMRT.js.map → connect-V6JRDBQ5.js.map} +0 -0
- /package/dist/{content-NCW5IJFR.js.map → content-LNIBJKNQ.js.map} +0 -0
- /package/dist/{conversation-4M7YMQOL.js.map → conversation-MCR4WBGJ.js.map} +0 -0
- /package/dist/{conversion-report-G5JMZNYV.js.map → conversion-report-CNNF2KNN.js.map} +0 -0
- /package/dist/{conversion-upload-command-43PZFYT7.js.map → conversion-upload-command-GW2QGOBS.js.map} +0 -0
- /package/dist/{conversion-writes-JQQCCGPO.js.map → conversion-writes-MIW2DW7Q.js.map} +0 -0
- /package/dist/{conversions-Z7FW7CFT.js.map → conversions-6OKS45FG.js.map} +0 -0
- /package/dist/{conversions-UO4CQNF6.js.map → conversions-WRICMKDT.js.map} +0 -0
- /package/dist/{copy-writes-ONVSSBLJ.js.map → copy-writes-5DO6N5V7.js.map} +0 -0
- /package/dist/{countries-Q6TA42P7.js.map → countries-FPJKZDZJ.js.map} +0 -0
- /package/dist/{create-QVY6DSYM.js.map → create-BGOY6OUH.js.map} +0 -0
- /package/dist/{create-4SFO4AQZ.js.map → create-F4AAMFZ5.js.map} +0 -0
- /package/dist/{create-GJ4ZMY3A.js.map → create-QSKVDFI5.js.map} +0 -0
- /package/dist/{create-D5MA64KL.js.map → create-TI2ZQCEW.js.map} +0 -0
- /package/dist/{creatives-R3XILT6D.js.map → creatives-AF2ZBRRU.js.map} +0 -0
- /package/dist/{creatives-ADH6HCCA.js.map → creatives-E3ZTGEC7.js.map} +0 -0
- /package/dist/{creatives-S3EZCXUT.js.map → creatives-ISMLBSRR.js.map} +0 -0
- /package/dist/{credentials-EQRB6XGZ.js.map → credentials-X3E4TJGW.js.map} +0 -0
- /package/dist/{critique-4YRRUNAU.js.map → critique-75HCFZD6.js.map} +0 -0
- /package/dist/{critique-JCU2ATT6.js.map → critique-OOFO5KNR.js.map} +0 -0
- /package/dist/{crm-AF6XOOSF.js.map → crm-66P5WILT.js.map} +0 -0
- /package/dist/{crm-LSMFGR6R.js.map → crm-NI7JZHHG.js.map} +0 -0
- /package/dist/{crop-RDP7YCNV.js.map → crop-F2ZMKE4T.js.map} +0 -0
- /package/dist/{currency-4KNOOZUU.js.map → currency-BJYQ7KWA.js.map} +0 -0
- /package/dist/{custom-conversions-7MZFTHUM.js.map → custom-conversions-J56EGUH3.js.map} +0 -0
- /package/dist/{customers-MM3VIZNA.js.map → customers-IAZLBVL4.js.map} +0 -0
- /package/dist/{decide-OPCCKAIT.js.map → decide-KXEEEL5X.js.map} +0 -0
- /package/dist/{delete-CO2YBPTI.js.map → delete-3JM2CRGW.js.map} +0 -0
- /package/dist/{delete-GKQTDOZF.js.map → delete-7LUKYRYI.js.map} +0 -0
- /package/dist/{delete-D7HTW32U.js.map → delete-DKY2U7DN.js.map} +0 -0
- /package/dist/{delete-JUPBYK3H.js.map → delete-JEHALEDU.js.map} +0 -0
- /package/dist/{delete-KZFI235B.js.map → delete-K77BZNI7.js.map} +0 -0
- /package/dist/{delete-R3LXCKA4.js.map → delete-TT5F4KOF.js.map} +0 -0
- /package/dist/{demographics-DK5JDY6M.js.map → demographics-2WIAENET.js.map} +0 -0
- /package/dist/{describe-GIG46DT5.js.map → describe-PD3T4TSU.js.map} +0 -0
- /package/dist/{describe-537PPL7P.js.map → describe-QNULQ554.js.map} +0 -0
- /package/dist/{dimensions-UXK7DMTF.js.map → dimensions-CITRMPQF.js.map} +0 -0
- /package/dist/{discard-DEJOM62Y.js.map → discard-RL4HPJVG.js.map} +0 -0
- /package/dist/{discover-MKFDG6NK.js.map → discover-BLUJYLBT.js.map} +0 -0
- /package/dist/{discover-U6YLVLTF.js.map → discover-K743TWWV.js.map} +0 -0
- /package/dist/{domain-MBOMV3CQ.js.map → domain-DVUS4W6Q.js.map} +0 -0
- /package/dist/{download-PRBLR6IQ.js.map → download-AIWQ4VO5.js.map} +0 -0
- /package/dist/{download-KN2I55SA.js.map → download-N4KWWNJ5.js.map} +0 -0
- /package/dist/{draft-UMPCOCP6.js.map → draft-3LGUY4GD.js.map} +0 -0
- /package/dist/{draft-H5RVDTFD.js.map → draft-4ZK3K4EN.js.map} +0 -0
- /package/dist/{draft-XEUHTUMR.js.map → draft-D5D6HCPA.js.map} +0 -0
- /package/dist/{draft-HZ5T6NOI.js.map → draft-EV5GJXOU.js.map} +0 -0
- /package/dist/{draft-CGPVRRKC.js.map → draft-EYX33J4Y.js.map} +0 -0
- /package/dist/{draft-BMNBT37B.js.map → draft-MJYHWHEU.js.map} +0 -0
- /package/dist/{draft-FIEZWBIX.js.map → draft-WIQ75STJ.js.map} +0 -0
- /package/dist/{draft-F74OIT5O.js.map → draft-WM3EJ622.js.map} +0 -0
- /package/dist/{env-VBSATLEF.js.map → env-ZCVKU62Y.js.map} +0 -0
- /package/dist/{experiment-2XR6MBE2.js.map → experiment-YPN3PKI5.js.map} +0 -0
- /package/dist/{experiments-YNJZCMQM.js.map → experiments-PL7JBQ47.js.map} +0 -0
- /package/dist/{export-YCLJG5YP.js.map → export-X7LIQORT.js.map} +0 -0
- /package/dist/{extract-E3CMEN5U.js.map → extract-ADBKYCMK.js.map} +0 -0
- /package/dist/{facets-Y4OACBMC.js.map → facets-HH2O62KL.js.map} +0 -0
- /package/dist/{favorites-NSQX6HKB.js.map → favorites-DH7FJY5B.js.map} +0 -0
- /package/dist/{feed-TKMMYAEH.js.map → feed-IN5DQ6QV.js.map} +0 -0
- /package/dist/{fetch-EHP2FK6Y.js.map → fetch-POVD4UV2.js.map} +0 -0
- /package/dist/{find-I7U3THF3.js.map → find-YKH5NLDV.js.map} +0 -0
- /package/dist/{fit-IHUUFCGI.js.map → fit-TC4AACBU.js.map} +0 -0
- /package/dist/{flows-WSCIMXQX.js.map → flows-AYLK5KRV.js.map} +0 -0
- /package/dist/{follow-A46RAJEX.js.map → follow-NYSYOMPZ.js.map} +0 -0
- /package/dist/{follow-competitors-VU2L3KWF.js.map → follow-competitors-XK7AHXV5.js.map} +0 -0
- /package/dist/{following-UOUNSU6P.js.map → following-5NSY62IF.js.map} +0 -0
- /package/dist/{fonts-3QW7EDHE.js.map → fonts-B4GG2ZVY.js.map} +0 -0
- /package/dist/{forecast-2WVHMSZP.js.map → forecast-SHLUTMQQ.js.map} +0 -0
- /package/dist/{forecast-F25LSCM5.js.map → forecast-XKJ6SCJ5.js.map} +0 -0
- /package/dist/{funding-2VROIMLS.js.map → funding-JC6MPG5T.js.map} +0 -0
- /package/dist/{funnel-35DYDBJH.js.map → funnel-NOQ5377L.js.map} +0 -0
- /package/dist/{ga4-ULHKTF23.js.map → ga4-NOWI2YV7.js.map} +0 -0
- /package/dist/{generate-Z7AROAES.js.map → generate-T4CMEBFU.js.map} +0 -0
- /package/dist/{get-4CAX33L2.js.map → get-3GC5BSEH.js.map} +0 -0
- /package/dist/{get-ZISAHMTQ.js.map → get-KWERYDK2.js.map} +0 -0
- /package/dist/{get-5E4YJKPO.js.map → get-MTJGUYD7.js.map} +0 -0
- /package/dist/{get-IF7KHMSI.js.map → get-O5QJBI3A.js.map} +0 -0
- /package/dist/{get-ABQZJ2VQ.js.map → get-P6HXXYPJ.js.map} +0 -0
- /package/dist/{get-N7X75ZJO.js.map → get-SKQXAUCK.js.map} +0 -0
- /package/dist/{get-ASAW6TVF.js.map → get-VEXFF7PK.js.map} +0 -0
- /package/dist/{get-GXVAJZHM.js.map → get-VLJVPTC3.js.map} +0 -0
- /package/dist/{gif-QLNWBFAH.js.map → gif-K4Z7LK5W.js.map} +0 -0
- /package/dist/{google-M6XR7YGT.js.map → google-OCEWR2NJ.js.map} +0 -0
- /package/dist/{google-FDR55RRD.js.map → google-TC2ZJD73.js.map} +0 -0
- /package/dist/{google-ads-NCSMNNND.js.map → google-ads-UQPFXZHG.js.map} +0 -0
- /package/dist/{group-XVDH2ONO.js.map → group-GRWRPBFN.js.map} +0 -0
- /package/dist/{group-HAQM6P7M.js.map → group-SP4TNI63.js.map} +0 -0
- /package/dist/{gsc-GQFI6I2D.js.map → gsc-UXGYY3GJ.js.map} +0 -0
- /package/dist/{history-FGQ2H7XH.js.map → history-AGDBEDLW.js.map} +0 -0
- /package/dist/{history-VJ254UXF.js.map → history-BD4RYCIO.js.map} +0 -0
- /package/dist/{history-LTOFKBMJ.js.map → history-LTM7KP34.js.map} +0 -0
- /package/dist/{hubspot-W2NM75YK.js.map → hubspot-WJG45M2B.js.map} +0 -0
- /package/dist/{icon-F7AOOTFI.js.map → icon-V3Y4YDOJ.js.map} +0 -0
- /package/dist/{ideas-54KFDNDM.js.map → ideas-MG7U6TOP.js.map} +0 -0
- /package/dist/{images-JOEVCCP6.js.map → images-FM7FHPBS.js.map} +0 -0
- /package/dist/{improve-LIKOER3S.js.map → improve-TXA435K6.js.map} +0 -0
- /package/dist/{ingest-VCIH5QDR.js.map → ingest-HYCOCLKP.js.map} +0 -0
- /package/dist/{ingest-6R7XUL46.js.map → ingest-RY5HTGWI.js.map} +0 -0
- /package/dist/{insights-UXUUOQB7.js.map → insights-2G2E27IB.js.map} +0 -0
- /package/dist/{insights-QNE6XCBA.js.map → insights-KLTFZPDU.js.map} +0 -0
- /package/dist/{inspect-MGOR77FP.js.map → inspect-MBIVGHVX.js.map} +0 -0
- /package/dist/{inspiration-VXNGKAJV.js.map → inspiration-K7L63RAJ.js.map} +0 -0
- /package/dist/{instant-experiences-MT2XMQNH.js.map → instant-experiences-E7U6CJFG.js.map} +0 -0
- /package/dist/{intent-FZWPRUCI.js.map → intent-ODOSNQHM.js.map} +0 -0
- /package/dist/{job-TS34W4IU.js.map → job-IPZGUL7C.js.map} +0 -0
- /package/dist/{job-create-FXXDR2EE.js.map → job-create-DHDXT6JK.js.map} +0 -0
- /package/dist/{job-status-R2H4HNC5.js.map → job-status-LCK6OAML.js.map} +0 -0
- /package/dist/{keep-YSU3XMW3.js.map → keep-WRQW625H.js.map} +0 -0
- /package/dist/{keyword-gap-4ECYPWXJ.js.map → keyword-gap-2CBACDPA.js.map} +0 -0
- /package/dist/{keyword-metrics-SBIRN5KC.js.map → keyword-metrics-V3DYPKHT.js.map} +0 -0
- /package/dist/{keywords-for-site-TLNPJHT2.js.map → keywords-for-site-3DNC73AI.js.map} +0 -0
- /package/dist/{knowledge-L3VLOVLG.js.map → knowledge-N75ATS7T.js.map} +0 -0
- /package/dist/{landing-ZICSVWKF.js.map → landing-76YHTTX7.js.map} +0 -0
- /package/dist/{landings-XTPNPTHN.js.map → landings-23OMBXML.js.map} +0 -0
- /package/dist/{languages-VNZQ5USL.js.map → languages-2PRQ5OQ3.js.map} +0 -0
- /package/dist/{languages-DIKRMAYE.js.map → languages-A5Y7DKLJ.js.map} +0 -0
- /package/dist/{launches-5R7EUONQ.js.map → launches-C3ZQH4VF.js.map} +0 -0
- /package/dist/{layerize-Q2QWDARG.js.map → layerize-KH5MUTCH.js.map} +0 -0
- /package/dist/{lead-routes-IXUCGINI.js.map → lead-routes-IREDNU24.js.map} +0 -0
- /package/dist/{leads-JUQFNK55.js.map → leads-EVBUUZZS.js.map} +0 -0
- /package/dist/{leads-UVG6VYAC.js.map → leads-NEQAJ5F7.js.map} +0 -0
- /package/dist/{learn-A6BT25LQ.js.map → learn-KEMLEYW4.js.map} +0 -0
- /package/dist/{library-G5YAFLTR.js.map → library-3Q24O4XX.js.map} +0 -0
- /package/dist/{lighthouse-BCBV2XGP.js.map → lighthouse-H6XEFV6H.js.map} +0 -0
- /package/dist/{line-item-writes-NW7A6HNH.js.map → line-item-writes-3LJTZRR3.js.map} +0 -0
- /package/dist/{line-items-OAG3QMDE.js.map → line-items-S2JDVEND.js.map} +0 -0
- /package/dist/{link-4VJ7FSOA.js.map → link-GSZEQXLA.js.map} +0 -0
- /package/dist/{linkedin-CKOWKD4M.js.map → linkedin-4TSXJIRQ.js.map} +0 -0
- /package/dist/{linkedin-person-C22IDK7S.js.map → linkedin-person-JL4RZHEP.js.map} +0 -0
- /package/dist/{list-HWNHRWGB.js.map → list-23TETYHO.js.map} +0 -0
- /package/dist/{list-6YW4I4VG.js.map → list-5DUXP3Y6.js.map} +0 -0
- /package/dist/{list-4SDJZVOL.js.map → list-6N7C7AR4.js.map} +0 -0
- /package/dist/{list-GS42LK5C.js.map → list-EUN2X7SS.js.map} +0 -0
- /package/dist/{list-CDDXHMJQ.js.map → list-KZS624O5.js.map} +0 -0
- /package/dist/{list-ZORO7PFP.js.map → list-LU6N32Y7.js.map} +0 -0
- /package/dist/{list-2DKLO6AO.js.map → list-OQFCWNLE.js.map} +0 -0
- /package/dist/{list-QSBEYU45.js.map → list-RTQVZYIC.js.map} +0 -0
- /package/dist/{list-ZFGOONWL.js.map → list-YLMKD7GM.js.map} +0 -0
- /package/dist/{locations-4RDUHKVR.js.map → locations-C4LIWY3P.js.map} +0 -0
- /package/dist/{locations-HATR6PSC.js.map → locations-HC5FYEYX.js.map} +0 -0
- /package/dist/{log-OSJHKHPV.js.map → log-ATW73US2.js.map} +0 -0
- /package/dist/{logo-ABO4HJRG.js.map → logo-2FXE3XAS.js.map} +0 -0
- /package/dist/{lookup-SPNT3W3W.js.map → lookup-JUK4JM52.js.map} +0 -0
- /package/dist/{map-PMGZDXAN.js.map → map-MQ7GHCF4.js.map} +0 -0
- /package/dist/{mcp-MOOOTRYG.js.map → mcp-3NTRVTKU.js.map} +0 -0
- /package/dist/{media-GZKW2PZB.js.map → media-4XW3L7E3.js.map} +0 -0
- /package/dist/{media-CIJW2Q3I.js.map → media-E5PMHJ2K.js.map} +0 -0
- /package/dist/{media-sources-5OYCKQ5J.js.map → media-sources-XAHG65FO.js.map} +0 -0
- /package/dist/{members-QG5IP5HM.js.map → members-64SFCBT5.js.map} +0 -0
- /package/dist/{meme-BPWX7YQH.js.map → meme-UJBWLEMA.js.map} +0 -0
- /package/dist/{meta-KVOSCSPJ.js.map → meta-3PVMVKDP.js.map} +0 -0
- /package/dist/{metrics-R4YS2JL6.js.map → metrics-EJ7FSBSI.js.map} +0 -0
- /package/dist/{models-RJMZV5SH.js.map → models-RUAIOX4K.js.map} +0 -0
- /package/dist/{normalize-LATTXSL3.js.map → normalize-4RHSWNML.js.map} +0 -0
- /package/dist/{normalize-NMNOJ6Q5.js.map → normalize-X6FMLNQW.js.map} +0 -0
- /package/dist/{options-KALH5TB7.js.map → options-ERT4OVWB.js.map} +0 -0
- /package/dist/{organization-AGCF7DUJ.js.map → organization-CXMLBGZY.js.map} +0 -0
- /package/dist/{output-34QMC3OU.js.map → output-4CMFKHKV.js.map} +0 -0
- /package/dist/{page-UDF3LJHP.js.map → page-U434ALBN.js.map} +0 -0
- /package/dist/{page-photos-FCBW5UZS.js.map → page-photos-OYPS2GP2.js.map} +0 -0
- /package/dist/{pages-5W5G4MRB.js.map → pages-EYX26EXP.js.map} +0 -0
- /package/dist/{performance-SITVZQWX.js.map → performance-OKWF6BPE.js.map} +0 -0
- /package/dist/{performance-YNXPUSGJ.js.map → performance-SGU7XX4P.js.map} +0 -0
- /package/dist/{pinterest-IABDXLF5.js.map → pinterest-3MSPSGJC.js.map} +0 -0
- /package/dist/{pixels-4QAWLSEL.js.map → pixels-X5PK5IAF.js.map} +0 -0
- /package/dist/{pixels-TYJVE377.js.map → pixels-XC2RXJRH.js.map} +0 -0
- /package/dist/{plan-I6EFL7RC.js.map → plan-K2ZIMLQU.js.map} +0 -0
- /package/dist/{posts-SXQSLOFV.js.map → posts-BH2TE4U3.js.map} +0 -0
- /package/dist/{preview-7Y5LE24E.js.map → preview-LA3P4TAF.js.map} +0 -0
- /package/dist/{profile-R5VPOOJU.js.map → profile-VKYAKK5B.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-NAHPJ3VD.js.map → promoted-tweet-writes-2O75KPVF.js.map} +0 -0
- /package/dist/{promoted-tweets-2XQ4MWAC.js.map → promoted-tweets-6TF3VYJ2.js.map} +0 -0
- /package/dist/{properties-2D2BIDGC.js.map → properties-NAEEQRLQ.js.map} +0 -0
- /package/dist/{publish-UITYPUBD.js.map → publish-BK4VU2I7.js.map} +0 -0
- /package/dist/{query-LB5H7IRK.js.map → query-O76WFU6D.js.map} +0 -0
- /package/dist/{query-RE7NB2BK.js.map → query-XJXFKIRF.js.map} +0 -0
- /package/dist/{query-JOYRNM4O.js.map → query-ZGA3F647.js.map} +0 -0
- /package/dist/{questionnaire-U767HYDE.js.map → questionnaire-GEQF5OAQ.js.map} +0 -0
- /package/dist/{read-3TCDDALC.js.map → read-HOMAUJS4.js.map} +0 -0
- /package/dist/{reddit-6XIARCTX.js.map → reddit-HVLOXPPU.js.map} +0 -0
- /package/dist/{refresh-GIB6QQZS.js.map → refresh-BOYLAG34.js.map} +0 -0
- /package/dist/{refresh-6UCN7PDX.js.map → refresh-H5RGVPYJ.js.map} +0 -0
- /package/dist/{release-IN65L23O.js.map → release-DVS4CIU6.js.map} +0 -0
- /package/dist/{relevant-pages-W7IM6YQW.js.map → relevant-pages-ILNQC3F4.js.map} +0 -0
- /package/dist/{remove-LZQHDFZF.js.map → remove-DFTGSOL5.js.map} +0 -0
- /package/dist/{remove-X3XWVE2M.js.map → remove-K4SJF2GG.js.map} +0 -0
- /package/dist/{reopen-RMMQ55CH.js.map → reopen-CGWLLKSF.js.map} +0 -0
- /package/dist/{research-W5KUOBXZ.js.map → research-MTK6ZRR3.js.map} +0 -0
- /package/dist/{reset-VQNKXFAF.js.map → reset-AUBXKPPG.js.map} +0 -0
- /package/dist/{reset-MUWXTLIB.js.map → reset-XDFY6COF.js.map} +0 -0
- /package/dist/{resolve-DMGWLMTC.js.map → resolve-MKMJ6R2P.js.map} +0 -0
- /package/dist/{retry-ZQUJPKQH.js.map → retry-CBMIRIAN.js.map} +0 -0
- /package/dist/{retry-YI4YLYTQ.js.map → retry-GNTB73JH.js.map} +0 -0
- /package/dist/{retry-failed-PEAUXGNT.js.map → retry-failed-XOBX3GC3.js.map} +0 -0
- /package/dist/{revenue-6YZAOMF6.js.map → revenue-HMGOVX4D.js.map} +0 -0
- /package/dist/{rule-writes-G25O5JZS.js.map → rule-writes-C46MBD32.js.map} +0 -0
- /package/dist/{rules-KSOAKEI3.js.map → rules-6FUE3OPU.js.map} +0 -0
- /package/dist/{rules-FHVZEN4D.js.map → rules-AQWK62HZ.js.map} +0 -0
- /package/dist/{rules-add-7X46VTIJ.js.map → rules-add-IFBUKD3Q.js.map} +0 -0
- /package/dist/{run-YORKHK6S.js.map → run-AIK22EVA.js.map} +0 -0
- /package/dist/{run-TA6HYFKZ.js.map → run-UTCDGXL6.js.map} +0 -0
- /package/dist/{schedule-TNF6M6UD.js.map → schedule-AVK2VICC.js.map} +0 -0
- /package/dist/{schedule-TMTLYULK.js.map → schedule-MOSVC36T.js.map} +0 -0
- /package/dist/{scheduled-agents-TS3WLRCM.js.map → scheduled-agents-AXZH5RPS.js.map} +0 -0
- /package/dist/{schema-2YQAQVON.js.map → schema-BYFKNXCP.js.map} +0 -0
- /package/dist/{schema-6S5ZEPBS.js.map → schema-WHSDTY5R.js.map} +0 -0
- /package/dist/{scrape-FDBYU3TU.js.map → scrape-23YO56SP.js.map} +0 -0
- /package/dist/{screenshot-QSRWL4J6.js.map → screenshot-HNI4B3UC.js.map} +0 -0
- /package/dist/{search-BOCQFUM3.js.map → search-5442DCYM.js.map} +0 -0
- /package/dist/{search-PYLNVZXI.js.map → search-BTAXTYED.js.map} +0 -0
- /package/dist/{search-GEXDRTAQ.js.map → search-JQ7CDJWO.js.map} +0 -0
- /package/dist/{search-LTUUAGZG.js.map → search-UZWWXBEZ.js.map} +0 -0
- /package/dist/{search-CENPR7GA.js.map → search-YA5WLCJ3.js.map} +0 -0
- /package/dist/{search-LFTFNDMC.js.map → search-YTEHFCU4.js.map} +0 -0
- /package/dist/{search-copy-RLRRR3LB.js.map → search-copy-Z7DVNT44.js.map} +0 -0
- /package/dist/{seeds-E2GLHJ2T.js.map → seeds-BFXQKJP4.js.map} +0 -0
- /package/dist/{sends-NBTGBZT7.js.map → sends-25OLZQJ5.js.map} +0 -0
- /package/dist/{sequences-UOIHUOD3.js.map → sequences-J7HKMCZK.js.map} +0 -0
- /package/dist/{setup-links-6ANVKZCE.js.map → setup-links-MWWNI4FI.js.map} +0 -0
- /package/dist/{shared-IMDHTVSW.js.map → shared-JNIGEH2W.js.map} +0 -0
- /package/dist/{shopify-6ISTKZCA.js.map → shopify-3MO725IQ.js.map} +0 -0
- /package/dist/{site-OIV55MGO.js.map → site-FZCH64VV.js.map} +0 -0
- /package/dist/{sitemaps-VYLDUI4L.js.map → sitemaps-BEQUUVF2.js.map} +0 -0
- /package/dist/{sites-HM7ZCGCZ.js.map → sites-XMTXNK6S.js.map} +0 -0
- /package/dist/{skills-FBIVWINH.js.map → skills-HKYYWQ2P.js.map} +0 -0
- /package/dist/{sources-GLJWZFHZ.js.map → sources-HUD22QOK.js.map} +0 -0
- /package/dist/{sources-5L4S5BQV.js.map → sources-UMJF4LTK.js.map} +0 -0
- /package/dist/{stats-2NLNQBRY.js.map → stats-NI777LK6.js.map} +0 -0
- /package/dist/{status-TD7ISXC5.js.map → status-2HMHVFME.js.map} +0 -0
- /package/dist/{sticker-4NKFAGEK.js.map → sticker-2SDWKGXB.js.map} +0 -0
- /package/dist/{stock-XOXZGGU3.js.map → stock-THW6RFE5.js.map} +0 -0
- /package/dist/{studies-C5IINK5Y.js.map → studies-E6XXH4RQ.js.map} +0 -0
- /package/dist/{studio-IDNM42JP.js.map → studio-KIIZ6GDK.js.map} +0 -0
- /package/dist/{study-writes-GJXLMM3D.js.map → study-writes-4JXFQSGC.js.map} +0 -0
- /package/dist/{suggest-Z553OSYW.js.map → suggest-3JDI3QAM.js.map} +0 -0
- /package/dist/{sync-UBOHNOXB.js.map → sync-6S6SYYJT.js.map} +0 -0
- /package/dist/{sync-CIRDY55O.js.map → sync-BBZXPCZ7.js.map} +0 -0
- /package/dist/{sync-PVIFUXX3.js.map → sync-PTTAFAZU.js.map} +0 -0
- /package/dist/{sync-definition-7NBT6LTK.js.map → sync-definition-G3XRLP74.js.map} +0 -0
- /package/dist/{tag-22TFBGDG.js.map → tag-E5ZUMD2B.js.map} +0 -0
- /package/dist/{tag-manager-QLZHU6NG.js.map → tag-manager-IHQYDUX3.js.map} +0 -0
- /package/dist/{tags-T4EN6XYE.js.map → tags-D3H7FZIG.js.map} +0 -0
- /package/dist/{tags-XY6R2VJ6.js.map → tags-EEP2WOHL.js.map} +0 -0
- /package/dist/{tags-DG3XQ4SF.js.map → tags-HP4YJR36.js.map} +0 -0
- /package/dist/{tags-3HB7N5WB.js.map → tags-INMEQWNK.js.map} +0 -0
- /package/dist/{tags-T6THTVNP.js.map → tags-KMMY3HB4.js.map} +0 -0
- /package/dist/{targeting-GNEBULXU.js.map → targeting-ECBOAQG7.js.map} +0 -0
- /package/dist/{targeting-constants-GR6BVM2H.js.map → targeting-constants-CGNYPDQY.js.map} +0 -0
- /package/dist/{targeting-criteria-CL472KJO.js.map → targeting-criteria-L4VB7RBH.js.map} +0 -0
- /package/dist/{targets-7AQMSO6H.js.map → targets-T22E54UC.js.map} +0 -0
- /package/dist/{terms-LG7FYQOG.js.map → terms-QVIZ2IAN.js.map} +0 -0
- /package/dist/{testimonials-4QWVSEPU.js.map → testimonials-MKIDUBZH.js.map} +0 -0
- /package/dist/{themes-ZTM4OVGK.js.map → themes-R6CCC3UX.js.map} +0 -0
- /package/dist/{top-companies-PMFYOAFK.js.map → top-companies-WV3NYUJR.js.map} +0 -0
- /package/dist/{transcript-YWFYNFWX.js.map → transcript-DWZXMBGW.js.map} +0 -0
- /package/dist/{triggers-JKXISN45.js.map → triggers-JCOYDORO.js.map} +0 -0
- /package/dist/{tweets-IF5FFFTH.js.map → tweets-TTY4UMBC.js.map} +0 -0
- /package/dist/{unfollow-CDUOZWM7.js.map → unfollow-E2ZSYWUK.js.map} +0 -0
- /package/dist/{unlink-IUAFDLBT.js.map → unlink-XWPK6C4B.js.map} +0 -0
- /package/dist/{unstage-ZYT5RNLK.js.map → unstage-RAFDCOHK.js.map} +0 -0
- /package/dist/{unstage-OVOZE6DA.js.map → unstage-XVCM35JX.js.map} +0 -0
- /package/dist/{update-QAWK3O7L.js.map → update-3LVVYA4K.js.map} +0 -0
- /package/dist/{update-O22DAZVX.js.map → update-6J4YFUWR.js.map} +0 -0
- /package/dist/{update-74VME6PN.js.map → update-P7XEX3CH.js.map} +0 -0
- /package/dist/{update-Q3WJ3DQN.js.map → update-RUX5WSOT.js.map} +0 -0
- /package/dist/{update-23Q4T2J5.js.map → update-USQX4QDE.js.map} +0 -0
- /package/dist/{upload-WASRCKS4.js.map → upload-B2DEP22E.js.map} +0 -0
- /package/dist/{upload-EAEILUQB.js.map → upload-NV2KLKEL.js.map} +0 -0
- /package/dist/{upscale-HB6L6SZG.js.map → upscale-4COZN4VQ.js.map} +0 -0
- /package/dist/{url-options-M7RX2TD4.js.map → url-options-JXKKTY74.js.map} +0 -0
- /package/dist/{url-params-E5ON6W2N.js.map → url-params-5XD4ZL3B.js.map} +0 -0
- /package/dist/{use-HGX7ZRH5.js.map → use-SORHLK2I.js.map} +0 -0
- /package/dist/{variant-O7LXOA2E.js.map → variant-UAMWGBXF.js.map} +0 -0
- /package/dist/{videos-SS2Y6FJF.js.map → videos-UR4VDDJV.js.map} +0 -0
- /package/dist/{view-ED636LWD.js.map → view-DOSL3QK3.js.map} +0 -0
- /package/dist/{viewer-check-CWS6OVM7.js.map → viewer-check-VLODHBXL.js.map} +0 -0
- /package/dist/{winners-ZG5SHNBS.js.map → winners-KZ7SEXZY.js.map} +0 -0
- /package/dist/{winning-ads-FXTP4PWZ.js.map → winning-ads-H2LM75L5.js.map} +0 -0
- /package/dist/{write-commands-UK6MKGHI.js.map → write-commands-2AKHGZ2J.js.map} +0 -0
- /package/dist/{write-commands-AIWR7NBO.js.map → write-commands-BKB6QICK.js.map} +0 -0
- /package/dist/{write-commands-5YVQKO7E.js.map → write-commands-FCQNHFFN.js.map} +0 -0
- /package/dist/{write-commands-W3UN6F4Y.js.map → write-commands-VAMGJXDX.js.map} +0 -0
- /package/dist/{x-KEMAY75C.js.map → x-3KONMR4M.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/canvas/scaffold-ad.ts","../src/engine/scaffold/ad-spec.ts","../src/engine/scaffold/ad-spec-reading.ts","../src/engine/scaffold/ad-display-face.ts","../src/engine/scaffold/ad-layer-placement.ts","../src/engine/scaffold/ad-brand-overlay.ts"],"sourcesContent":["import { SPOKEN_CLIP_DURATION_S } from \"@baker/canvas-contract\";\nimport type { CompanyGetResponse, ImagesLogoResponse } from \"@baker/api\";\nimport { withoutCastName } from \"@baker/canvas-contract\";\nimport { apiGet, apiPost } from \"../../client.ts\";\nimport { pinnedModelHint } from \"../studio/avatarModel.ts\";\nimport { fetchClientLogo } from \"./clientLogo.ts\";\nimport { copyFile, cp, mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport {\n AdSpec,\n adSpecCastElements,\n beatsIntroducingSpeakerOffCamera,\n beatsTooShortToPlay,\n adSpecToBlueprint,\n castedAvatarOnRoster,\n staticTranscript,\n endCardCta,\n endCardWanted,\n marketFor,\n presenterIsInEveryShot,\n spokenLanguageFor,\n} from \"../../engine/scaffold/ad-spec.ts\";\nimport { adSpecVoices, readAdSpec } from \"../../engine/scaffold/ad-spec-reading.ts\";\nimport { askJevQuestions } from \"../../engine/nodes/local/lib/jev.ts\";\nimport { cachedJev } from \"../../engine/nodes/local/lib/jev-cache.ts\";\nimport { voiceGenderModel } from \"../../engine/scaffold/video/dialogue/voice-gender.ts\";\nimport type { ReviewUsage } from \"../../engine/nodes/local/lib/render-review.ts\";\nimport { findWorkspaceRoot } from \"./normalize-paths.ts\";\nimport { holdUnbilledSpend } from \"./unbilled-spend.ts\";\nimport { buildAdBrandOverlay, injectAdBrandOverlay } from \"../../engine/scaffold/ad-brand-overlay.ts\";\nimport { AD_DISPLAY_FAMILY, injectAdDisplayFace } from \"../../engine/scaffold/ad-display-face.ts\";\nimport { injectAdCaptionPlacement } from \"../../engine/scaffold/ad-layer-placement.ts\";\nimport { readNamedTypefaces, readStaticBrandKit } from \"../../engine/scaffold/static-brand.ts\";\nimport { brandHeadlineFont, webFontUrl } from \"../../engine/scaffold/static-fonts.ts\";\nimport { fetchExternalBytes } from \"../../lib/externalFetch.ts\";\nimport { fetchJson, lookupGoogleCss } from \"../brand/fonts.ts\";\nimport { findBrandRoot } from \"./static-copy-projection.ts\";\nimport {\n BRAND_DIR,\n markInkIsLight,\n plateIsDark,\n readBrandFromWorkspace,\n svgIsLiveText,\n markIsReal,\n} from \"../../engine/scaffold/ad-brand-source.ts\";\nimport { AD_IMAGE_MODEL, DEFAULT_VIDEO_GENERATE_MODEL, VIDEO_GENERATE_MODELS } from \"@baker/canvas-contract\";\nimport { defaultRegistry, validateCanvasDeep } from \"../../engine/index.ts\";\nimport { SHIPPED_CAPTIONS_DIR, SHIPPED_OVERLAY_COMPOSITION_DIR } from \"./scaffold-common.ts\";\nimport {\n buildCreativeDefinition,\n parseDefinitionStrategyFields,\n resolveFormats,\n definitionPlatformsOf,\n titleFromSlug,\n} from \"./creative-definition.ts\";\nimport { resolveRelativeCanvasPaths } from \"./resolve-paths.ts\";\nimport { REBUILD_FILE, writeSceneFiles } from \"./scene-files.ts\";\nimport { computeSourceSha } from \"./source-version.ts\";\nimport { readDefinitionPlatforms, syncCreativeDefinitionBestEffort } from \"./sync-definition.ts\";\nimport { renderStyleProjectionFromValue } from \"./style-projection.ts\";\nimport { ACTOR_SHEET_MODEL } from \"../../engine/scaffold/lib/elements.ts\";\nimport {\n canvasDims,\n genAspectsFor,\n resolveAspect,\n type ScaffoldVideoOpts,\n scaffoldVideoCanvas,\n} from \"../../engine/scaffold/video.ts\";\nimport { stampCompositionDims } from \"./composition-dims.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { readAvatars } from \"../avatars/transport.ts\";\n\n/** The pinned-model warning as a spreadable list. */\nfunction pinnedOnAvatar(handle: string | null | undefined, model: string | undefined): string[] {\n const hint = pinnedModelHint({ avatar: handle ?? undefined, model, generateAudio: true });\n return hint ? [hint] : [];\n}\n\n/** The spec an ad was built from, kept beside its canvas: `--spec <dir>/ad.spec.json` rebuilds it. */\nconst AD_SPEC_FILE = \"ad.spec.json\";\n\n\nregisterSchema({\n command: \"canvas.scaffold-ad\",\n description:\n \"Build a captioned vertical ad from a WRITTEN SPEC — no reference video. Start here when someone asks for an ad, a promo or a UGC-style clip and there is nothing to copy: `scaffold-video` reproduces a video you already have, this one writes a new one. You supply a spec of BEATS, and a beat is one line the voice says plus one shot the viewer sees while it is said. Everything else — the read, the caption cards, the clips, the music, the render — is derived from that pair, so the ad cannot drift out of sync with itself.\",\n args: {\n spec: {\n type: \"string\",\n required: true,\n description:\n \"Path to the ad spec JSON. Shape: { format?, market?, brand?, cast?, end_card?, voice?, music?, beats: [{ say, show, on_camera?, cast? }] }. Fill `brand` from src/brand/BRAND.md — `palette` (its hex tokens, most important first) and `logo` (the repo path to the mark) are what make the ad look like the client rather than like stock. `market` is where the ad is set (\\\"Mexico\\\"); omitted, it is the country of a regional `voice.language` (\\\"es-MX\\\"), else nowhere — a language alone names no country, and an ad with no place is what fills a Spanish ad with British houses. `voice.language` is a BCP-47 tag; omitted, the language is read off the `say` lines. `say` is one clause ending in its own punctuation — it becomes a caption card verbatim, so two sentences in one beat produce a card holding both. `show` is the shot brief for that line. Set `on_camera` only when that beat's subject talks to camera. \" +\n \"A beat's `sound` is one sound effect for that shot, and most beats should not have one. Add it only where \" +\n \"the picture shows a specific physical event the viewer expects to hear (a drill tightening a bolt, a door \" +\n \"closing, rain on glass, a graphic snapping in). On a talking head or a calm lifestyle shot it reads as a \" +\n \"stock sting, and one per beat turns a quiet ad into a noisy one. A music bed plus two well-placed effects \" +\n \"beats eight. \" +\n \"`voiceover: false` makes it a MUSIC-LED ad: nobody speaks, the `say` lines become on-screen text \" +\n \"captioned straight from the script, and it needs `music`. \" +\n \"`cast` is WHO the ad is about, and an ad with people in it needs one: `{ \\\"avatar\\\": \\\"marta\\\" }` names a cast \" +\n \"avatar (`baker avatars list`) and every beat is grounded on that avatar's identity sheet with its subject \" +\n \"description copied verbatim — the same face here as in the rest of the company's work. Without it each beat \" +\n \"invents its own stranger, which is how one 28-second ad came back with five different men playing one customer. \" +\n \"`{ \\\"description\\\": \\\"...\\\" }` invents a realistic person for this one ad: a candid portrait is generated from \" +\n \"the description and every beat grounds on it. Use an avatar only when the same actor must recur across ads. \" +\n \"A beat sets `cast: false` for a shot they are not in. \" +\n \"`end_card` is on by default whenever `brand` is set: the last beat becomes a flat brand plate with the mark and \" +\n \"a call to action drawn over it. `{ \\\"cta\\\": \\\"...\\\" }` sets the button copy — there is no default, so with no \" +\n \"`cta` the card carries the mark alone, and a `cta` repeating the closing line is dropped rather than printed \" +\n \"twice. `false` keeps the footage.\",\n },\n avatar: {\n type: \"string\",\n required: false,\n description: \"Cast this avatar as the ad's recurring person — the same flag, the same word and the same meaning as on `baker studio generate` and `baker studio animate`. Every beat they appear in is grounded on their identity sheet and their subject description is copied verbatim, so it is one face throughout and the same face as the rest of the company's work. Overrides `cast.avatar` in the spec. `baker avatars list` shows who there is.\",\n },\n \"no-brand\": {\n type: \"boolean\",\n description:\n \"Build the ad with no brand layer at all: no logo and no closing card. For an ad they asked to keep plain. A missing logo does not need it: with no mark in src/brand/logos/ the ad is built without the corner mark and the hints say how to add one. Never draw a stand-in mark.\",\n required: false,\n default: false,\n },\n \"video-model\": {\n type: \"string\",\n required: false,\n description: \"Curated video model id for the shots. Only for comparing models on one brief.\",\n enum: [...VIDEO_GENERATE_MODELS],\n },\n platforms: {\n type: \"string\",\n required: false,\n description:\n \"Where the ad runs, the main platform first (meta, linkedin, tiktok, …): recorded in _definition.md. Take it from the person's request or the idea.\",\n },\n slug: {\n type: \"string\",\n required: false,\n description: \"Creative slug — writes to src/creatives/<slug>/<slug>.canvas.json\",\n },\n out: {\n type: \"string\",\n required: false,\n description: \"Output canvas path (default <spec-dir>/<name>.canvas.json)\",\n },\n },\n});\n\n/**\n * A brief becomes a spec becomes a canvas.\n *\n * The compiler half of ADR 0006: the agent writes a Baker VideoSpec, this turns\n * it into the blueprint the existing engine already knows how to scaffold. No\n * second pipeline — the TTS, caption chain, music bus and render path are the\n * ones `scaffold-video` uses, reached by speaking their language rather than\n * reimplementing them.\n */\n/**\n * The cast avatar, in the words a voice is cast from.\n *\n * Their subject leads, because it is the only line that says whether this is a woman or a\n * man — the `voice_select` backend HARD-filters on that, and a narrator of the wrong gender\n * beside the presenter is the failure this is closest to. Their persona and how they speak\n * follow, which is what makes it this person rather than a stock read.\n */\nfunction avatarVoiceBrief(\n avatar: { subjectDescription?: string; profile?: { persona?: string; speech?: string } } | null,\n): string | undefined {\n if (!avatar) return undefined;\n const parts = [avatar.subjectDescription, avatar.profile?.persona, avatar.profile?.speech]\n .map((p) => p?.trim())\n .filter((p): p is string => Boolean(p));\n return parts.length > 0 ? parts.join(\"; \") : undefined;\n}\n\nexport const scaffoldAdCommand = defineCommand({\n meta: {\n name: \"scaffold-ad\",\n description:\n \"Build a captioned vertical ad from a written spec, with no reference video to copy.\\n\\n\" +\n \"A spec is a list of BEATS. One beat = one line the voice says + one shot on screen while it is said. \" +\n \"That pairing is what keeps the ad honest: the caption card IS the line, so it can never end mid-sentence, \" +\n \"and the picture can never drift from the read.\\n\\n\" +\n \"Two rules the spec enforces for you, both learned the expensive way:\\n\" +\n \" • `say` is one clause with its own punctuation. Two sentences in a beat is rejected.\\n\" +\n \" • Nobody in shot is speaking unless you set `on_camera` on that beat. A person visibly talking \" +\n \"under a voice that is not theirs reads as bad dubbing.\\n\\n\" +\n \"Example spec:\\n\" +\n ' { \"beats\": [\\n' +\n ' { \"say\": \"Mientras tú sigues pagando la luz a precio de oro,\", \"show\": \"Aerial over Spanish rooftops at golden hour.\" },\\n' +\n ' { \"say\": \"Haz clic en el enlace y reserva tu estudio gratuito.\", \"show\": \"A couple walking home at sunset.\" } ] }\\n\\n' +\n \"Who is in it:\\n\" +\n \" `cast: { avatar: \\\"marta\\\" }` grounds every beat on that avatar's face — cast one with `baker avatars`.\\n\" +\n \" Without a cast, each beat invents its own person and the ad reads as a stock-footage collage.\\n\\n\" +\n \"How it ends: with a `brand`, the last beat closes on a flat brand plate carrying the mark and the CTA.\\n\\n\" +\n \"Then: baker canvas run <the canvas it writes>\",\n },\n args: {\n spec: { type: \"string\", required: true, description: \"Path to the ad spec JSON\" },\n avatar: { type: \"string\", required: false, description: \"Cast this avatar as the ad's recurring person — the same flag, the same word and the same meaning as on `baker studio generate` and `baker studio animate`. Every beat they appear in is grounded on their identity sheet and their subject description is copied verbatim, so it is one face throughout and the same face as the rest of the company's work. Overrides `cast.avatar` in the spec. `baker avatars list` shows who there is.\" },\n \"video-model\": {\n type: \"string\",\n required: false,\n description:\n \"Which curated video model renders the shots. Defaults to the one the lane picks; pass this only to compare models on the same brief, because mixing models across a campaign changes how the same face reads. `baker canvas catalog --node video_generate` lists what each one takes.\",\n },\n \"no-brand\": {\n type: \"boolean\",\n required: false,\n default: false,\n description:\n \"Build the ad with no brand layer at all: no logo and no closing card. For an ad they asked to keep plain. A missing logo does not need it: the ad is then built without the corner mark.\",\n },\n platforms: {\n type: \"string\",\n required: false,\n description:\n \"Where the ad runs, the main platform first (meta, linkedin, tiktok, …): recorded in _definition.md. Take it from the person's request or the idea.\",\n },\n slug: {\n type: \"string\",\n required: false,\n description: \"Creative slug — writes to src/creatives/<slug>/<slug>.canvas.json\",\n },\n out: { type: \"string\", required: false, description: \"Output canvas path\" },\n },\n async run({ args }) {\n const specPath = args.spec as string;\n let parsed: unknown;\n try {\n parsed = JSON.parse(await readFile(specPath, \"utf-8\"));\n } catch (e) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: `Could not read the ad spec at ${specPath}: ${e instanceof Error ? e.message : String(e)}`,\n fix: \"Write the spec first — a JSON file with a `beats` array, each beat holding `say` (one clause) and `show` (the shot).\",\n },\n });\n process.exit(1);\n return;\n }\n\n const spec = AdSpec.safeParse(parsed);\n if (!spec.success) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: `That ad spec is not usable: ${spec.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`,\n fix: \"A beat is ONE line and ONE shot. If a beat holds two sentences, split it into two beats — the line becomes a caption card verbatim, and a card holding two sentences is the defect this refuses.\",\n },\n });\n process.exit(1);\n return;\n }\n\n // Resolve the avatar the spec named, rather than asking whoever wrote the spec to\n // paste its subject description and hunt down its sheet URL. `casting.ts` says as\n // much in its own guidance — \"anywhere `--avatar` does not exist, copy\n // subjectDescription VERBATIM\" — and the canvas was one of those places. Now it is\n // not: the handle is enough.\n // The flag wins over the spec. It is the same flag the agent already uses on\n // `studio generate` / `studio animate`, and it exists because a nested `cast.avatar`\n // field is a different shape to remember: asked three times for an ad with a named\n // avatar, the spec carried the handle once.\n const flagAvatar = (args.avatar as string | undefined)?.trim();\n if (flagAvatar) {\n spec.data.cast = { ...spec.data.cast, avatar: flagAvatar };\n }\n let autoCast: string | null = null;\n // Named in prose instead of cast. The agent wrote `cast.description: \"Marta, mujer\n // espanola, calida\"` on a brief that said \"Marta hablando a camara\", having cast her\n // correctly on an identical brief an hour before — so the ad grounded on words rather\n // than on her sheet, lost her accent direction, and never opened the native-audio path.\n // Nothing caught it, because a described cast is legitimate when there is no avatar.\n if (!flagAvatar && !spec.data.cast?.avatar) {\n const roster = await readAvatars<{ avatars: Array<{ handle: string; name: string; status?: string }> }>(\n \"/api/avatars\",\n { status: \"ready\" },\n ).catch(() => null);\n const named = roster ? castedAvatarOnRoster(spec.data, roster.avatars) : null;\n if (named) {\n // Cast, not refused. This WAS a refusal, and the agent routed around it the only\n // way that still produced an ad: it dropped the person entirely and shipped a\n // narrated one with nobody in it. A refusal that makes the job impossible gets\n // rerouted, not obeyed — the same mirror failure the on-camera voice gate hit. The\n // command already knows who they are and can just cast them, so it does, and says\n // so in the hints.\n spec.data.cast = { ...spec.data.cast, avatar: named };\n autoCast = named;\n }\n }\n // The spec as written, with who it casts settled, is the ad's editable source (ADR 0006):\n // kept beside the canvas so a later change edits it and re-runs, rather than starting\n // again from a brief. Taken before the workspace fills and the prompt rewrites below,\n // which every run derives again for itself.\n const specArtifact = structuredClone(spec.data);\n\n // A named place with no picture of it cannot be held still: the engine fuses a location\n // sheet FROM source material, and given none it leaves the canvas with a \"drop one real\n // source image here\" placeholder that never runs. Refused with the command that fixes\n // it, rather than scaffolding something that dies at run time.\n if (spec.data.set?.description && !spec.data.set.image?.trim()) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message:\n \"This ad names a recurring place but gives no picture of it. A location sheet is fused from a real \" +\n \"image; with nothing to fuse there is no sheet, and every shot invents the room again.\",\n // Names `studio generate`, which is the command that exists — `baker images`\n // finds and ingests pictures, it does not make them, so the line this used to\n // print could not be run. No `--model` either: the lane already defaults to the\n // curated image model, and the one named here was the legacy id the picker now\n // offers to nobody.\n fix:\n `Make the plate once, then pass it: \\`baker studio generate \"${spec.data.set.description}\"\\`, ` +\n 'then put its url in the spec as `\"set\": { \"description\": \"…\", \"image\": \"<url>\" }`. ' +\n 'Drop `set` entirely if the ad does not keep returning to one place.',\n },\n });\n process.exit(1);\n return;\n }\n\n // Validated against the catalogue rather than trusted: an invented id reaches the\n // provider as a 400 after the spec has already been written and the beats costed.\n const requestedModel = (args[\"video-model\"] as string | undefined)?.trim();\n if (requestedModel && !(VIDEO_GENERATE_MODELS as readonly string[]).includes(requestedModel)) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: `\\`${requestedModel}\\` is not one of the curated video models.`,\n fix: `Pick one of: ${VIDEO_GENERATE_MODELS.join(\", \")}. Leave --video-model off to use the default.`,\n },\n });\n process.exit(1);\n return;\n }\n const chosenVideoModel = requestedModel ?? DEFAULT_VIDEO_GENERATE_MODEL;\n\n const handle = flagAvatar || spec.data.cast?.avatar?.trim();\n let avatar: {\n name?: string;\n sheetUrl?: string;\n subjectDescription?: string;\n status?: string;\n profile?: { accent?: string; persona?: string; speech?: string; subjectDescription?: string };\n } | null = null;\n let avatarError: string | null = null;\n if (handle) {\n try {\n avatar = await readAvatars<{\n name?: string;\n sheetUrl?: string;\n subjectDescription?: string;\n status?: string;\n profile?: { accent?: string; persona?: string; speech?: string; subjectDescription?: string };\n }>(\n \"/api/avatars/get\",\n { handle, full: \"true\" },\n );\n if (avatar?.status && avatar.status !== \"ready\") {\n avatarError = `Avatar \\`${handle}\\` is ${avatar.status}, not ready — only a ready avatar can be cast. Check \\`baker avatars get ${handle}\\`.`;\n avatar = null;\n } else if (!avatar?.sheetUrl) {\n avatarError = `Avatar \\`${handle}\\` has no identity sheet yet, so the ad cannot ground on their face.`;\n avatar = null;\n }\n } catch (e) {\n avatarError = `Could not read avatar \\`${handle}\\`: ${e instanceof Error ? e.message : String(e)}. \\`baker avatars list\\` shows who there is.`;\n }\n }\n\n // An unresolved avatar is refused, not warned about, when the spec named a person and\n // wrote nothing else about them: `adSpecCastElements` then emits no person reference\n // at all while the blueprint still describes a recurring cast, so the render invents\n // one and the ad ships with a stranger. The warning version reported success and left\n // that to be found after the clips were paid for. With a written subject in the spec\n // there IS something to render, so that stays a warning.\n if (avatarError && !spec.data.cast?.description?.trim()) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: avatarError,\n fix:\n `This ad casts \\`${handle}\\` and describes nobody else, so without them every shot renders a person ` +\n \"nobody chose. Wait for the avatar and re-run — `baker avatars get \" +\n `${handle} --wait\\` returns the moment it is ready — or cast someone who is (\\`baker avatars list\\`). ` +\n \"To build it with an invented person instead, put a written description in `cast.description`.\",\n },\n });\n process.exit(1);\n return;\n }\n\n // Fill the brand from the workspace when the spec left it empty. Asked three times\n // for an ad \"with our logo\", the spec carried one once — so the correct outcome\n // stopped depending on somebody remembering to copy two values that are already\n // sitting at a fixed path.\n const fromWorkspace = await readBrandFromWorkspace();\n const filledLogo = !spec.data.brand?.logo && fromWorkspace.logo ? fromWorkspace.logo : undefined;\n const filledPalette =\n !spec.data.brand?.palette?.length && fromWorkspace.palette?.length ? fromWorkspace.palette : undefined;\n if (filledLogo || filledPalette) {\n spec.data.brand = {\n ...spec.data.brand,\n ...(filledLogo ? { logo: filledLogo } : {}),\n ...(filledPalette ? { palette: filledPalette } : {}),\n };\n }\n\n // The logo is optional, as it is on a static: Meta shows the page name and picture above\n // every ad. This used to refuse, and a refusal with no remedy the agent could reach sent\n // one to draw a mark and another to run `strings` over the CLI looking for a switch. So\n // no mark found means an ad with no corner mark and one hint saying how to add it.\n const resolvedLogo = spec.data.brand?.logo?.trim();\n const logoExists = resolvedLogo ? await stat(resolvedLogo).then(() => true, () => false) : false;\n // `--no-brand` is still \"no brand layer at all\": no mark and no closing card.\n const noBrand = Boolean(args[\"no-brand\"]);\n // Their mark is on record against their own domain, so the path from \"no logo\" to\n // \"their logo\" is one lookup. Tried before settling for none.\n const fetched = !logoExists && !noBrand ? await fetchClientLogo() : null;\n if (fetched?.ok) {\n spec.data.brand = { ...spec.data.brand, logo: fetched.path };\n }\n const haveLogo = logoExists || fetched?.ok === true;\n // A spec that names a mark which is not there must not carry the path on: the gates\n // below and the composition would read a file that does not exist.\n if (!haveLogo && spec.data.brand?.logo) {\n const { logo: _missing, ...rest } = spec.data.brand;\n spec.data.brand = rest;\n }\n const noLogoHint =\n !haveLogo && !noBrand\n ? [\n `This ad has no logo on screen: ${\n resolvedLogo ? `the mark at \\`${resolvedLogo}\\` does not exist` : `there is no mark in \\`${BRAND_DIR}/logos/\\``\n }. ${fetched && !fetched.ok ? `${fetched.reason} ` : \"\"}Meta still shows the page name and picture above ` +\n `it, so it can run as it is; say in your reply that it has no logo. To add the client's logo, put the file ` +\n `their designer delivered in \\`${BRAND_DIR}/logos/\\` and re-run this command. Never draw one.`,\n ]\n : [];\n\n // Re-read AFTER the fetch, because the fetch may have replaced it. `resolvedLogo` is\n // what the SPEC asked for, and the gates below are about the mark that will actually\n // be drawn. Read from the stale value they got it wrong in both directions: a spec\n // naming a missing `.svg` alongside a fetchable client mark was refused with \"could\n // not be read\", throwing away the logo the lookup had just downloaded; and a spec\n // naming no logo at all left `resolvedLogo` undefined, so a fetched mark skipped both\n // gates and shipped unchecked.\n const markPath = spec.data.brand?.logo?.trim();\n\n // Existing is not the same as being the client's mark. The one that reached a repo\n // was an SVG somebody typed: `<text>greenleaf</text>` in a font the renderer did not\n // have, with a leaf parked on the last letter — every ad it appeared in read\n // \"greenleá\". A real logo ships as outlines, which is why it renders the same\n // everywhere.\n if (!noBrand && markPath?.toLowerCase().endsWith(\".svg\")) {\n // `null` means the file could not be read at all, which is NOT the same as reading\n // clean. It used to collapse to \"\" and fall through, so a mark at a path that did\n // not resolve skipped the check in total silence and shipped whatever the renderer\n // made of it — the failure this gate exists to stop, waved through by the gate.\n const svg = await readFile(markPath, \"utf-8\").catch(() => null);\n if (svg === null) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message:\n `The brand mark at \\`${markPath}\\` could not be read, so there is no way to tell whether it ` +\n \"is a real logo or a typed stand-in. An ad is not shipped on a mark nobody could open.\",\n fix:\n `Check the file is there and readable, or put the client's logo in \\`${BRAND_DIR}/logos/\\` — ` +\n // Deliberately not a pixel threshold: the real GreenLeaf mark is 594px wide and a\n // number here would have sent an agent to redraw a perfectly good asset.\n \"the file their designer delivered — an outlined SVG, or the PNG they gave you.\",\n },\n });\n process.exit(1);\n return;\n }\n if (svgIsLiveText(svg)) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message:\n `The mark at \\`${markPath}\\` draws its wordmark with live \\`<text>\\`, not outlines. That is a ` +\n \"typed stand-in, not a logo: it renders in whatever font the machine happens to have, and the one \" +\n \"that shipped this way came out reading \\\"greenleá\\\" in every frame.\",\n fix:\n \"Ask the client for their real logo file and put it in \" +\n `\\`${BRAND_DIR}/logos/\\` — the one their designer delivered, as an outlined SVG or a PNG they ` +\n \"gave you. Do not redraw it, and do not export this file to PNG: rasterising it only bakes the \" +\n \"invented letters into pixels, where nothing downstream can tell they are wrong.\",\n },\n });\n process.exit(1);\n return;\n }\n }\n\n // Asked of the brand DIRECTORY, not of the file the spec points at. Checking only the\n // resolved `.svg` let a PNG rasterised from a typed stand-in through — and this\n // command's own advice (\"a PNG at 1000px or wider\") is what suggested making one.\n // Pixels cannot be read back, so the question has to be about the source material.\n if (!noBrand && markPath && !(await markIsReal(markPath))) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message:\n `There is no real logo in \\`${BRAND_DIR}/logos/\\` — what is there is a typed stand-in, whose ` +\n \"wordmark is drawn as live text in a font the renderer does not have. An ad built on it wears \" +\n \"letters the machine invented, and converting it to a PNG only bakes them in.\",\n fix:\n `Ask the client for their actual logo file and put it in \\`${BRAND_DIR}/logos/\\` — the one their ` +\n \"designer delivered, as an outlined SVG or a PNG they gave you. Do not redraw it and do not \" +\n \"export the stand-in to another format.\",\n },\n });\n process.exit(1);\n return;\n }\n\n // The cast's NAME comes out of every shot brief before the prompts are built. Gemini\n // refuses \"real people's names or likenesses\" as one filter, and an agent writes briefs\n // the way a person would — \"Carmen on camera, relaxed\". Observed on a real ad: five\n // clips rendered and the sixth was blocked, with nothing separating them but luck. The\n // face arrives as a reference image, so the name was never doing any work.\n if (handle) {\n const names = [handle, avatar?.name].filter((value): value is string => Boolean(value));\n spec.data.beats = spec.data.beats.map((beat) => ({ ...beat, show: withoutCastName(beat.show, names) }));\n if (spec.data.cast?.description) {\n spec.data.cast = { ...spec.data.cast, description: withoutCastName(spec.data.cast.description, names) };\n }\n }\n // Who the NARRATOR of the beats she is not in should sound like. `--avatar` is how an ad\n // casts somebody and it leaves `cast.description` empty, so without this the narrated\n // beats of the commonest spec there is are cast off the engine's last-resort brief — the\n // literal \"ad_narrator voice\", which is a voice for nobody.\n const avatarVoice = avatarVoiceBrief(avatar);\n // A closing plate with nothing to draw on it is an empty colour frame under the last\n // line, so with no mark and no call to action (or no brand layer at all) the last beat\n // keeps its footage instead.\n if (noBrand || (!haveLogo && !endCardCta(spec.data))) spec.data.end_card = false;\n const slug = (args.slug as string | undefined) ?? path.basename(specPath).replace(/\\.[^.]+$/, \"\");\n const outPath =\n (args.out as string | undefined) ??\n (args.slug ? path.join(\"src/creatives\", slug, `${slug}.canvas.json`) : path.join(path.dirname(specPath), `${slug}.canvas.json`));\n // A translation's `_definition.md` declares its language (`es-MX`), which is as good as the\n // spec declaring it: the voice speaks it and its country is where the ad is set.\n const definitionLanguage = parseDefinitionStrategyFields(\n await readFile(path.join(path.dirname(outPath), \"_definition.md\"), \"utf8\").catch(() => \"\"),\n ).language;\n\n // What the spec's own words say, read by Jev in one request (`readAdSpec`): which line has\n // its speaker introduce themselves, which brief asks for readable text, who the cast is,\n // the voice each description asks for, the words a caption card may not end on and, when\n // nobody declared it, the language. Read here, after the cast's name has come out of the\n // briefs and the closing card is settled, so it reads what will be built. Kept in the\n // workspace's cache, so a re-run reads the same; its spend waits for the next run record.\n const cacheDir = path.join(findWorkspaceRoot(path.dirname(path.resolve(outPath))) ?? process.cwd(), \"canvas\", \".cache\");\n const spent: ReviewUsage[] = [];\n const reading = await readAdSpec(\n spec.data,\n {\n voices: adSpecVoices(spec.data, avatarVoice),\n askLanguage: !spokenLanguageFor(spec.data, { definitionLanguage }),\n },\n {\n ask: cachedJev(cacheDir, (questions) => askJevQuestions(questions, (u) => spent.push(u))),\n genders: voiceGenderModel(cacheDir, (u) => spent.push(u)),\n },\n );\n await holdUnbilledSpend(cacheDir, spent).catch(() => {});\n\n // A brief that asks for the very thing every frame prompt forbids (\"NO readable text or\n // numbers anywhere in frame\", because a figure the model invents contradicts the script).\n // The two instructions sit side by side and the model obeys the nearer, more specific one:\n // \"Close-up of a UK electricity bill … Focus on the number\" rendered a fully legible bill\n // reading \"$58,085.00\" over a total of \"$139.00\". Refused here, where a rewrite is free.\n const contradicts = spec.data.beats.flatMap((beat, i) => (reading.wantsLegibleText[i] ? [{ i, show: beat.show }] : []));\n if (contradicts.length > 0) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message:\n `Beat ${contradicts.map(({ i }) => i + 1).join(\", \")} asks the picture for a readable figure ` +\n `(e.g. \"${contradicts[0]?.show.trim().slice(0, 90)}\"). Every frame also carries \"no readable text or ` +\n \"numbers\\\", so the two fight and the picture wins — one such brief rendered a bill reading $58,085.00 \" +\n \"over a total of $139.00.\",\n fix:\n \"Say what the shot LOOKS like, not what it reads: 'a bill in her hands, her face falling'. \" +\n \"The ad's numbers belong in the `say` line, where the caption track renders them correctly.\",\n },\n });\n process.exit(1);\n return;\n }\n\n // A line that introduces its own speaker has to come out of their mouth. Refusing\n // on-camera speech without a pinned voice (below) pushed an agent into the mirror\n // failure: it flipped the beat to off-camera and kept the first-person copy, so an\n // ad opened with \"Hola, soy Marta de GreenLeaf Energy\" while Marta stood there with\n // her mouth closed and a stranger's voice said it.\n //\n // Asked through `beatsIntroducingSpeakerOffCamera`, which resolves it the way the\n // emitter does. Reading `beat.on_camera` directly disagreed with `beatToCamera` on\n // the commonest spec there is — a cast avatar owns every beat they appear in, so an\n // absent `on_camera` is overridden to `true` — and refused a spec that would have\n // rendered correctly, with a remedy that changed nothing about the output.\n const introducesOffCamera = beatsIntroducingSpeakerOffCamera(spec.data, reading);\n const firstIntro = introducesOffCamera[0];\n if (firstIntro !== undefined) {\n const line = (spec.data.beats[firstIntro]?.say ?? \"\").trim();\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message:\n `Beat ${firstIntro + 1} says \"${line}\" — the speaker introducing themselves — but ` +\n \"nobody is on camera saying it. A voice from off screen introducing the person standing in shot reads \" +\n \"as a mistake, the same way a moving mouth under someone else's voice does.\",\n fix:\n \"Either set `on_camera: true` on that beat so they say it themselves — which needs the avatar to have \" +\n \"their own accent — or rewrite the line as narration about them rather than by them: \" +\n '\"Marta instaló placas en nueve días\", not \"Hola, soy Marta\".',\n },\n });\n process.exit(1);\n return;\n }\n\n const spokenLanguage = spokenLanguageFor(spec.data, { definitionLanguage, reading });\n const blueprint = adSpecToBlueprint(spec.data, {\n avatarAccent: avatar?.profile?.accent,\n videoModel: chosenVideoModel,\n ...(avatarVoice ? { avatarVoice } : {}),\n ...(definitionLanguage ? { definitionLanguage } : {}),\n reading,\n });\n\n\n // The frame every drawn layer is laid out on, resolved exactly as the engine resolves the\n // picture's, so the captions and the mark cannot land on a different stage from the clips.\n let outAr: string;\n try {\n outAr = resolveAspect(undefined, spec.data.format.aspect_ratio, genAspectsFor(chosenVideoModel)).outAr;\n } catch (e) {\n writeJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: e instanceof Error ? e.message : String(e),\n fix: 'Set `format.aspect_ratio` to one of the ratios the message lists, e.g. \"9:16\" for Reels and Stories or \"4:5\" for the feed.',\n },\n });\n process.exit(1);\n return;\n }\n const outDims = canvasDims(outAr);\n\n const outDir = path.dirname(outPath);\n await mkdir(outDir, { recursive: true });\n\n // The same two shipped compositions `scaffold-video` stages: the overlay layer\n // and the word-synced caption track. Copied beside the canvas and referenced\n // RELATIVELY, so a moved or renamed workspace cannot read a sibling's.\n const compositionDest = path.join(outDir, \"video-overlay-composition\");\n const captionsDest = path.join(outDir, \"tiktok-captions-composition\");\n await cp(SHIPPED_OVERLAY_COMPOSITION_DIR, compositionDest, { recursive: true });\n await cp(SHIPPED_CAPTIONS_DIR, captionsDest, { recursive: true });\n // Shipped at 1080x1920. Unstamped, a 4:5 ad laid its captions and mark out on a 9:16 page.\n await stampCompositionDims(compositionDest, outDims);\n await stampCompositionDims(captionsDest, outDims);\n // The caption track is the composition an ad renders, so its cards are placed here for\n // this frame's safe area rather than at the shipped 9:16 pixel values.\n const captionsIndex = path.join(captionsDest, \"index.html\");\n await writeFile(captionsIndex, injectAdCaptionPlacement(await readFile(captionsIndex, \"utf-8\"), outAr), \"utf-8\");\n // The brand's own face for the captions and the closing button, resolved the way a static\n // ad resolves its headline and staged as a file beside the caption track. With none, the\n // captions keep their shipped look.\n const face = await stageBrandDisplayFace(outDir, captionsDest);\n if (face) {\n await writeFile(captionsIndex, injectAdDisplayFace(await readFile(captionsIndex, \"utf-8\"), face.file), \"utf-8\");\n }\n\n // The blueprint is written out beside the canvas exactly as `scaffold-video`\n // writes it — `prompt.json` plus one file per scene, and the slim style\n // projection every frame reads. `run` and `validate` re-assemble the graph\n // from these, so a canvas without them is not runnable, only well-formed.\n const blueprintPath = path.join(outDir, \"prompt.json\");\n const blueprintStylePath = path.join(outDir, \"prompt.style.json\");\n await writeSceneFiles(outDir, blueprint);\n await writeFile(blueprintStylePath, renderStyleProjectionFromValue(blueprint), \"utf8\");\n await writeFile(path.join(outDir, AD_SPEC_FILE), `${JSON.stringify(specArtifact, null, 2)}\\n`, \"utf8\");\n\n // The mark and the closing card are DRAWN by the overlay composition, here, now —\n // not left as a TODO for the agent and not asked of a picture model. The route to a\n // logo on screen used to be a stub someone had to fill in by hand, which is why an\n // ad ran 28 seconds without one.\n // `--no-brand` has to reach the COMPOSITION, not just the gate. The workspace brand\n // fill sets a logo path of its own, so a company that has a mark had it copied into\n // the render and the closing card built — while the command reported an unbranded ad.\n const logoPath = noBrand ? undefined : spec.data.brand?.logo?.trim();\n // A music-led ad still has words for the screen, so its caption track is written\n // here from the script instead of transcribed from a read that does not exist.\n const transcriptPath = path.join(outDir, \"transcript.json\");\n if (spec.data.voiceover === false) {\n await writeFile(transcriptPath, `${JSON.stringify(staticTranscript(spec.data, chosenVideoModel), null, 2)}\\n`, \"utf-8\");\n }\n\n const opts: ScaffoldVideoOpts = {\n imageModel: AD_IMAGE_MODEL,\n // The frames' model cannot make the sheet: `image_reference_sheet` registers only\n // the Gemini image models, and a sheet asked of gpt-image is an `unknown_model` node\n // that stops the whole canvas. The same sheet model every other scaffold uses.\n sheetModel: ACTOR_SHEET_MODEL,\n videoModel: chosenVideoModel,\n overlayCompositionPath: path.relative(outDir, compositionDest),\n captionsCompositionPath: path.relative(outDir, captionsDest),\n blueprintPath: path.relative(outDir, blueprintPath),\n blueprintStylePath: path.relative(outDir, blueprintStylePath),\n aspect: spec.data.format.aspect_ratio,\n resolution: spec.data.format.resolution,\n // A beat is one clause and one card, so the cap has to clear a whole clause.\n // The composition's default of 3 is TikTok karaoke styling; applied to an ad\n // it overrode the clause rule on every line and rendered \"IS STANDARD. WE\".\n // 8 is the composition's own maximum and clears every beat measured here.\n captionWordsPerGroup: 8,\n // The `say` lines are the copy the viewer reads, so they are what the captions print;\n // the transcription of the voice track only times them.\n captionsFromScript: true,\n // Declared, or read off the lines by Jev; never off the voice description.\n ...(spokenLanguage ? { spokenLanguage } : {}),\n voiceGenders: reading.voiceGenders,\n ...(reading.captionCarriesOn.length ? { captionCarriesOn: reading.captionCarriesOn } : {}),\n // The avatar's ACCENT reaches the clip through the blueprint (`avatarAccent` above,\n // baked into `global.voiceover.accent`), not a pinned voice. A pinned voice was\n // removed on purpose (ADR 0005): the re-voice is speech-to-speech, so it replaces\n // timbre and keeps the pronunciation it is handed. The clip speaks in the voice the\n // video model renders, and the region is directed in the prompt.\n //\n // Same decision, one step further: with an avatar on camera the clip's own voice is\n // kept, not re-voiced. The re-voice is the speech-to-speech route ADR 0005 measured\n // and rejected — it would swap the voice that matches the mouth and the directed\n // region for one cast off an English stock list. Only the on-camera voice; a\n // voiceover read has no rendered voice to keep and is still cast.\n //\n // The KNOWN RISK this carries, recorded here because it is decided here: keeping the\n // rendered voice also means no pass unifies her beats, and each beat is its own\n // generation, so nothing guarantees two of them sound like the same person. The\n // reference image fixes the face; nothing fixes the voice. Measured on a finished\n // three-beat ad (her, a cutaway, her): median speaking pitch 210.5 Hz and 216.2 Hz,\n // near-identical spreads — the same voice as far as pitch can say — and the two\n // extracts were then listened to side by side and judged to be the same person. Not\n // proof for every ad: one listener, one ad, and pitch is one dimension of a voice.\n //\n // If it does show up, the fix is not to drop `keepRenderedVoice` — that brings back\n // the stock voice this exists to avoid. It is to convert the LATER extracts onto the\n // first beat of the same speaker, which keeps a voice the clip really produced.\n ...(avatar ? { keepRenderedVoice: true } : {}),\n ...(spec.data.voiceover === false\n ? { staticTranscriptPath: path.relative(outDir, transcriptPath) }\n : {}),\n };\n // The recurring cast, so every beat renders the SAME person. Passed as `[]` before,\n // which is why one ad came back with five different men playing one customer.\n const canvas = scaffoldVideoCanvas(blueprint, adSpecCastElements(spec.data, avatar), opts);\n\n // Paint the brand layer into the composition the canvas ACTUALLY opens — read off\n // the graph rather than assumed. An ad wires exactly one `hyperframe_render`, and it\n // is the caption track; writing to the overlay composition instead put the mark and\n // the closing card in a staged file nothing reads, and shipped four seconds of empty\n // green plate where the end card should have been.\n const renderNode = canvas.nodes.find((n) => n.type === \"hyperframe_render\");\n const renderedDir = renderNode ? path.join(outDir, String(renderNode.params?.composition ?? \"\")) : null;\n let staged: { file: string; alt: string } | null = null;\n // What the layer has to put BEHIND the mark, read off the mark itself. A white logo on\n // the near-white panel the layer draws by default is not a faint logo, it is no logo:\n // one client's white mark rendered as an empty box in the corner and again, 300px tall,\n // in the middle of the closing card.\n let markIsLight = false;\n if (logoPath && renderedDir) {\n const ext = path.extname(logoPath) || \".png\";\n try {\n await copyFile(logoPath, path.join(renderedDir, `brand-mark${ext}`));\n staged = { file: `brand-mark${ext}`, alt: spec.data.brand?.name ?? \"brand\" };\n markIsLight = await markInkIsLight(logoPath);\n } catch {\n // A logo path that does not resolve is reported in the hints rather than thrown:\n // the rest of the ad is still worth scaffolding.\n }\n }\n const closing = blueprint.scenes[blueprint.scenes.length - 1];\n const overlayHtml =\n !noBrand && endCardWanted(spec.data) && closing && renderedDir\n ? buildAdBrandOverlay({\n logo: staged,\n cta: endCardCta(spec.data),\n cardAtS: closing.start_s,\n cardDurationS: closing.duration_s,\n totalS: blueprint.estimated_duration_s,\n markIsLight,\n // The card's button is coloured against the plate the engine will fill from\n // this same palette — including the black plate an ad with no palette gets.\n plateIsDark: plateIsDark(spec.data.brand?.palette),\n })\n : \"\";\n if (overlayHtml && renderedDir) {\n const indexPath = path.join(renderedDir, \"index.html\");\n const html = await readFile(indexPath, \"utf-8\");\n await writeFile(indexPath, injectAdBrandOverlay(html, overlayHtml, { aspect: outAr, ...(face ? { face: AD_DISPLAY_FAMILY } : {}) }), \"utf-8\");\n }\n\n // The frozen rebuild context, so an edit to `scenes/sNN.json` actually reaches the\n // render. `canvas run` re-flows scene edits by rebuilding the graph from the\n // blueprint — and it needs the same `elements`/`opts` this scaffold used. Without\n // this file it returns `not_applicable` and does nothing, SILENTLY: every ad ever\n // scaffolded here ignored its own scene edits, so the \"fix the shot and re-run\"\n // loop the review findings point at was dead on arrival. `scaffold-video` has\n // written it since the split; this one never did.\n await writeFile(\n path.join(outDir, REBUILD_FILE),\n `${JSON.stringify({ elements: adSpecCastElements(spec.data, avatar), opts }, null, 2)}\\n`,\n \"utf8\",\n );\n\n // Validated as `canvas run` will read it, against a copy whose relative paths resolve to\n // the output dir. Written either way, as `scaffold-video` does: a blocking issue joins the\n // canvas's checklist to fix in place, then the command fails rather than reporting an ad\n // that cannot run.\n const validation = await validateCanvasDeep(resolveRelativeCanvasPaths(canvas, outDir), defaultRegistry());\n if (!validation.ok) {\n const meta = canvas.metadata as Record<string, unknown>;\n meta.todo = { ...((meta.todo ?? {}) as Record<string, unknown>), blocking_validation_issues: validation.issues };\n }\n await writeFile(outPath, `${JSON.stringify(canvas, null, 2)}\\n`, \"utf-8\");\n if (!validation.ok) {\n process.stderr.write(\n `${JSON.stringify(\n {\n ok: false,\n error: { code: \"validation\", issues: validation.issues },\n canvas_path: outPath,\n note: \"The canvas WAS written despite the blocking issue(s). Fix the spec and re-run this command, or fix them in place, then `baker canvas validate` before running.\",\n },\n null,\n 2,\n )}\\n`,\n );\n process.exit(2);\n return;\n }\n\n // A creative folder is not one without its `_definition.md` (the pre-commit gate refuses\n // it), and the dashboard draws its workflow from the synced graph before any billed run.\n // Both as `scaffold-video` does them; an existing definition is kept on re-scaffold.\n if (args.slug) {\n const definitionPath = path.join(outDir, \"_definition.md\");\n const definitionExists = await stat(definitionPath).then(() => true, () => false);\n if (!definitionExists) {\n await writeFile(\n definitionPath,\n buildCreativeDefinition({\n title: titleFromSlug(slug),\n kind: \"video\",\n ...definitionPlatformsOf(args.platforms ? String(args.platforms) : undefined, undefined),\n formats: resolveFormats(spec.data.format.aspect_ratio),\n description: spec.data.beats.map((beat) => beat.say.trim()).join(\" \"),\n }),\n \"utf8\",\n );\n }\n await syncCreativeDefinitionBestEffort({\n slug,\n title: titleFromSlug(slug),\n ...(await readDefinitionPlatforms(outPath)),\n formats: [spec.data.format.aspect_ratio],\n canvas,\n sourceSha: await computeSourceSha(outPath),\n });\n }\n\n writeJson({\n ok: true,\n data: { canvas: outPath, beats: spec.data.beats.length, slug },\n hints: [\n // Before anything else: a beat too short to play is a beat to merge, and it is\n // free to fix here and expensive to discover in a finished ad.\n ...shortBeatHint(beatsTooShortToPlay(spec.data), spec.data.beats.length),\n ...noLogoHint,\n ...(face ? [`The captions and the closing button are set in the brand's face: ${face.label}.`] : []),\n ...(noBrand\n ? [\n \"Built with NO brand mark and no closing card, because you passed --no-brand. Say that in your reply: the user is getting an unbranded ad and should know it, not discover it. When they do have a logo, put it in `src/brand/logos/` and re-run without the flag.\",\n ]\n : []),\n // Same reasoning as `studio animate`: a cast avatar that speaks routes to the\n // default model on purpose, and pinning one discards that silently. An ad's\n // beats always speak, so there is no silent case to exclude here.\n ...pinnedOnAvatar(handle, requestedModel),\n // `--until frames` on anything carrying a face or a mark, because that is where\n // getting it wrong is expensive: the pictures cost a fraction of the clips, and\n // every defect anyone has caught in a finished ad was visible in them. The run\n // stops, the agent reviews the frames, and continuing pays for none of them twice.\n handle || staged\n ? `Wrote ${spec.data.beats.length} beats to ${outPath}. Run it with \\`baker canvas run ${outPath} --until frames --brief \"<what they asked for, their words>\"\\`, review the frames against the brief and Brand, fix any defects, then resume immediately with the \\`--run-id\\` it gives you. Wait for the user only when they explicitly requested storyboards only or a review before continuing. This ad carries ${handle ? \"a person's face\" : \"the client's mark\"}, and a wrong look costs a whole ad to discover after the clips.`\n : `Wrote ${spec.data.beats.length} beats to ${outPath}. Run it with \\`baker canvas run ${outPath} --brief \"<what they asked for, their words>\"\\`.`,\n ...(autoCast\n ? [\n `Cast \\`${autoCast}\\` — the spec described this person in words, and they are one of this company's ` +\n \"avatars. Every shot now grounds on their identity sheet and carries their accent and delivery. \" +\n \"Write `\\\"cast\\\": { \\\"avatar\\\": \\\"\" +\n autoCast +\n '\" }` yourself next time; a written description is for someone the company does not have.',\n ]\n : []),\n `These beats run about ${blueprint.estimated_duration_s}s. If the ask was longer, add beats — the length is the ` +\n `sum of the lines, so a 25s ad needs roughly 25s of script and cannot be stretched by holding shots.`,\n ...(logoPath && !staged\n ? [`Could not read the logo at \\`${logoPath}\\` — the ad has no mark on screen. Give the path as it appears in src/brand/BRAND.md, relative to the workspace root.`]\n : []),\n ...(staged\n ? [\"The brand mark is drawn by the composition — top-left throughout, and large on the closing card. It is never generated as a picture, so it cannot come back garbled.\"]\n : []),\n ...(endCardWanted(spec.data)\n ? [\"The last beat closes on a flat brand plate with the call to action over it, instead of one more photograph.\"]\n : []),\n ...(spec.data.brand?.logo && !filledLogo && !spec.data.brand.logo.startsWith(`${BRAND_DIR}/`)\n ? [\n `The mark at \\`${spec.data.brand.logo}\\` is not in \\`${BRAND_DIR}/logos/\\`. If you drew it for this ad, ` +\n \"it is not the client's logo and the ad is going out wearing something you invented — put the real one \" +\n \"in the brand folder (`/brand-build`) and re-run. A hand-drawn wordmark also tends to overflow its own \" +\n \"viewBox, which renders as a clipped word.\",\n ]\n : []),\n ...(filledLogo || filledPalette\n ? [\n `The spec left the brand empty, so it was read from the workspace: ` +\n `${[filledLogo ? `logo \\`${filledLogo}\\`` : null, filledPalette ? `palette ${filledPalette.slice(0, 3).join(\", \")}` : null].filter(Boolean).join(\" and \")}. ` +\n \"Pass them yourself when the ad needs a different mark or colour.\",\n ]\n : []),\n ...(avatarError ? [avatarError] : []),\n ...(avatar\n ? [\n ...(avatar?.profile?.accent?.trim()\n ? []\n : [\n `Avatar \\`${handle}\\` has no accent on their profile, so the video model picks a region on its ` +\n \"own and usually picks the commonest one. An avatar has no pinned voice by design (ADR 0005) — \" +\n `the accent IS the lever: \\`baker avatars update ${handle} --accent \"Spanish from Spain, Madrid\"\\`.`,\n ]),\n `Every beat the customer appears in is grounded on \\`${handle}\\`'s identity sheet, and their subject description was copied into the frames verbatim — so it is the same face throughout and the same face as the rest of this company's work.`,\n ]\n : []),\n ...(presenterIsInEveryShot(spec.data)\n ? [\n \"The presenter is in every beat, so this ad has no cutaway — the viewer never sees the bill, the roof, \" +\n \"the install or the house, only a face. A rendered ad built this way came back as three near-identical \" +\n \"shots of one person smiling. Set `cast: false` on the beats that should show the thing itself.\",\n ]\n : []),\n ...(!spec.data.cast\n ? [\n \"This ad declares no `cast`, so every beat renders whoever the model invents — a different face per shot. \" +\n \"If a person appears more than once, describe them in `cast: { description: \\\"...\\\" }` (one invented person throughout), or cast an avatar with `cast: { avatar: \\\"<handle>\\\" }` when they must recur across ads.\",\n ]\n : []),\n ...(spec.data.cast && !avatar\n ? [\n \"This cast has a description but no avatar, so a realistic person is invented from it for this ad (a candid portrait every beat grounds on). That is right for a one-off ad; if the same actor has to come back in other ads, cast an avatar (`baker avatars list`) and pass `cast.avatar`.\",\n ]\n : []),\n ...(marketFor(spec.data, definitionLanguage)\n ? []\n : [\n \"This ad names no `market`, so its frames say nowhere and the model picks the place. A language is not \" +\n 'a country: set `market` (\"Mexico\", \"Spain\") or give `voice.language` with its country (\"es-MX\") and re-run.',\n ]),\n ...(reading.read\n ? []\n : [\n `The spec's lines could not be read this time, so ${\n spokenLanguage ? \"\" : \"the voice is cast with no language, \"\n }no voice is held to a gender, captions break on the word count alone, and no line or brief was checked ` +\n \"for a self-introduction or readable text. Re-run to read them, or set `voice.language` to say the language.\",\n ]),\n ...(spec.data.voiceover === false\n ? [\n \"Nobody speaks in this ad, so the `say` lines are ON-SCREEN text: they are captioned straight from \" +\n \"the script, exactly as written, with no voice and no transcription in between. Give it `music` — \" +\n \"a music-led ad with no bed is a silent one.\",\n ]\n : []),\n \"The caption cards print your `say` lines as written, timed to the voice as it reads them; a word the voice slurs or the recogniser mishears still shows as you wrote it. Read the lines back before running: that is the copy the viewer sees.\",\n \"Every clip renders with nobody speaking unless a beat set `on_camera`. If a beat needs a presenter talking, set it there rather than describing it in `show`.\",\n // Keyed on what is MISSING, not on whether `brand` exists at all: a spec holding\n // `brand.name` and nothing else once rendered 28 seconds with no palette anywhere.\n // A missing logo is said once, by `noLogoHint`.\n ...(spec.data.brand?.palette?.length\n ? []\n : [\n \"This spec has no `brand.palette`. Read src/brand/BRAND.md and re-run with it: a name alone \" +\n \"leaves the ad in someone else's clothes.\",\n ]),\n \"`brand.palette` colours the closing plate the card sits on; `brand.logo` is the repo path to \" +\n \"the mark, and it is drawn by the composition — top-left throughout and large on the closing card — \" +\n \"never generated as a picture, so it cannot come back garbled. Give it whenever the client has one.\",\n ],\n });\n },\n});\n\n/**\n * Tell the agent which beats are too short to be a shot, and what to do about it.\n *\n * A beat lasts as long as its line takes to read, so a two-word beat is a three-second\n * clip — and six of those is a slideshow, not an ad. Measured, in the user's words: \"a\n * five-second video explains nothing; eight to ten a scene is fine, but five, where you\n * say everything in a rush, will come out wrong ninety percent of the time.\"\n *\n * A hint rather than a refusal: a short beat can be deliberate (a one-line sting at the\n * end), and the ad still scaffolds and still runs. But it says which ones and what to do,\n * because \"make the beats longer\" is the wrong fix — padding a two-word line buys six\n * seconds of somebody standing still. Fewer beats, each carrying a whole thought.\n */\nfunction shortBeatHint(short: number[], total: number): string[] {\n if (short.length === 0) return [];\n return [\n `Beat${short.length === 1 ? \"\" : \"s\"} ${short.join(\", \")} of ${total} ${short.length === 1 ? \"is\" : \"are\"} a ` +\n \"fragment rather than a line — a few words with a whole shot to themselves. Every beat's picture holds for at \" +\n `least ${SPOKEN_CLIP_DURATION_S}s, so a two-word beat buys six seconds of somebody standing still, and a run of ` +\n \"those plays as a slideshow rather than an ad. Don't pad them. Merge them into the beat before or after, so \" +\n \"each one carries a whole thought. Edit the spec and re-run this command.\",\n ];\n}\n\n/** A web font file is tens of kilobytes; anything near this is not one. */\nconst MAX_FONT_BYTES = 5_000_000;\n\n/**\n * Stage the brand's display face beside the caption composition: its font file, else the\n * family it names fetched as a web font file. Null when the brand has no face of its own or\n * it could not be staged, and the captions keep their shipped look.\n */\nasync function stageBrandDisplayFace(\n outDir: string,\n compositionDir: string,\n): Promise<{ file: string; label: string } | null> {\n const root = (await findBrandRoot(outDir)) ?? process.cwd();\n const kit = await readStaticBrandKit(root);\n const face = await brandHeadlineFont({\n file: kit.headlineFont,\n named: await readNamedTypefaces(root),\n resolveUrl: (family, weight) => webFontUrl(family, weight, { lookupGoogleCss, fetchJson }),\n }).catch(() => null);\n if (!face) return null;\n try {\n if (\"path\" in face.slot) {\n const file = `brand-face${path.extname(face.slot.path).toLowerCase()}`;\n await copyFile(face.slot.path, path.join(compositionDir, file));\n return { file, label: `the font file \\`${path.relative(root, face.slot.path)}\\`` };\n }\n const { buffer } = await fetchExternalBytes(face.slot.url, { maxBytes: MAX_FONT_BYTES });\n const extension = /\\.(woff2|woff|ttf|otf)(?:\\?|$)/i.exec(face.slot.url)?.[1]?.toLowerCase() ?? \"woff2\";\n const file = `brand-face.${extension}`;\n await writeFile(path.join(compositionDir, file), buffer);\n return { file, label: `${face.family ?? \"the brand's typeface\"}, loaded as a web font` };\n } catch {\n return null;\n }\n}\n","import {\n type BlueprintDialogueLine,\n clipDurationsFor,\n frameRealismDirection,\n SEEDANCE_DURATIONS,\n SPOKEN_CLIP_DURATION_S,\n type VideoBlueprint,\n type VideoScene,\n} from \"@baker/canvas-contract\";\nimport { z } from \"zod\";\nimport { READ_WORDS_PER_SECOND, wordCount } from \"../lib/speech.ts\";\nimport type { AdSpecReading } from \"./ad-spec-reading.ts\";\nimport { spokenLanguage } from \"./lib/language.ts\";\nimport { authoredRole } from \"./lib/scene-role.ts\";\n\n/**\n * Baker VideoSpec — the structured representation of an ad, compiled to the\n * engine's own blueprint.\n *\n * The agent writes THIS, not a canvas and not HyperFrames. It is a list of\n * beats, and a beat is the smallest complete unit of an ad: one line the voice\n * says, and one shot the viewer sees while it is said. Everything downstream —\n * the read, the caption card, the clip, the cut — derives from that pair.\n *\n * The shape is doing work, not just carrying data. Three defects found by\n * building this ad by hand six times are unexpressible here:\n *\n * • A caption cannot end mid-sentence, because a beat holds ONE clause and a\n * clause is what becomes a card. The split that produced \"En solo nueve días\n * tu casa\" has nowhere to happen.\n * • The read cannot drift out of sync with the picture, because the line and\n * the shot are declared together rather than timed against each other later.\n * • A presenter cannot be re-voiced into a mouth that does not match, because\n * the whole ad is declared `voiceover` — narration over the picture — and a\n * beat that wants someone talking on camera has to say so explicitly.\n *\n * Compiled rather than executed: the blueprint it emits is what `scaffoldVideo\n * Canvas` already consumes, so this reuses the engine's TTS, caption chain,\n * music bus and render path instead of standing up a second one.\n */\n\n/** One clause. Two sentences in a beat would land as one card holding both. */\nconst oneClause = (line: string) => (line.match(/[.!?](\\s|$)/g) ?? []).length <= 1;\n\n/**\n * A line somebody can actually say.\n *\n * `min(1)` let a beat through whose whole line was \"·\". An ad was scaffolded with four\n * of them and a voice description reading \"No voiceover; music only\" — the agent wanted\n * a music-only ad and this was the only way it found to ask. The engine dutifully sent\n * a middle dot to the voice model, got near-silence back, transcribed the silence, and\n * the transcriber hallucinated \"Thank you.\" — which then became the ONLY caption card,\n * held over all sixteen seconds, in English, in a Spanish ad.\n *\n * Two letters in a row is the bar: it costs nothing and no real line fails it.\n */\nconst isSpeech = (line: string) => /\\p{L}\\p{L}/u.test(line);\n\nconst Beat = z.object({\n /**\n * The line the voice says in this beat — ONE clause, ending in its own\n * punctuation. It becomes the caption card verbatim.\n */\n say: z\n .string()\n .min(1)\n .refine(\n isSpeech,\n \"a beat's line has to be words someone says — a dot or a dash is not a line, and an ad with no voiceover is not supported yet\",\n )\n .refine(oneClause, \"a beat is one clause: split a second sentence into its own beat\"),\n /** What is on screen while it is said, as a shot brief for the video model. */\n show: z.string().min(1),\n /**\n * What this shot SOUNDS like — one effect, in words. Usually absent.\n *\n * An effect earns its place when the picture shows a SPECIFIC PHYSICAL EVENT the\n * viewer expects to hear: a drill tightening a bolt, a door closing, rain on glass, a\n * card tapping a reader, a graphic snapping into place. It grounds the shot.\n *\n * It does NOT belong on a talking head, on a lifestyle shot with no event in it, or\n * on a beat that is simply someone sitting and reacting. Sound laid over those reads\n * as a stock-library sting, and a bed of them turns a calm ad into a noisy one. Most\n * ads are a music bed and a voice; a couple of effects at the right moments, or none\n * at all, is a normal and often better answer than one per beat.\n *\n * Describe the SOUND, not the picture: \"a cordless drill tightening a bolt\", not \"the\n * fitter works on the rail\".\n */\n sound: z.string().min(1).max(200).optional(),\n /**\n * Whether this beat's subject is talking to camera.\n *\n * Left unset it follows the cast: an ad that cast a presenter, in a shot they are in,\n * with a line, is that person speaking. Set it to FALSE for the exception — a cutaway,\n * a product shot, a beat you want a narrator to carry over.\n *\n * It used to be opt-in, back when the only route was dubbing and OFF was the safe\n * default. That inverted the moment on-camera started meaning the video model voices\n * the clip itself: measured on a real run, a brief that said \"talking to camera all the\n * way through\" produced an ad with her face on screen and a narrator cast from a prose\n * description reading her lines, because nothing set this flag.\n */\n on_camera: z.boolean().optional(),\n /**\n * Whether the ad's recurring person is in this shot. Defaults to true whenever the\n * spec declares a `cast`, because an ad is usually about one person and defaulting\n * the other way is how continuity gets forgotten. Set false for a beat they are not\n * in — a fitter on a roof, a product close-up.\n */\n cast: z.boolean().optional(),\n});\n\nexport const AdSpec = z.object({\n format: z\n .object({\n aspect_ratio: z.string().default(\"9:16\"),\n resolution: z.string().default(\"720p\"),\n })\n .default({ aspect_ratio: \"9:16\", resolution: \"720p\" }),\n brand: z\n .object({\n name: z.string().optional(),\n /** Figures to lift typographically — the one gold number every ad has. */\n highlight: z.array(z.string()).optional(),\n /**\n * Brand hex colours, most important first. They dress the brand plate and\n * the type — never the scenes: pushing hex into a shot brief makes the\n * model paint the whole frame that colour, which reads as a filter.\n */\n palette: z.array(z.string()).optional(),\n /** Repo path to the brand mark, so the CTA carries it instead of a name in a font. */\n logo: z.string().optional(),\n })\n .optional(),\n voice: z\n .object({\n description: z.string().min(1),\n language: z.string().optional(),\n })\n .optional(),\n /**\n * Where the ad is set, as a place a model can picture: \"Spain\", \"Mexico\",\n * \"the UK\". Omitted, it is the country a regional `voice.language` names (\"es-MX\" →\n * Mexico), else nowhere: a language alone names no country.\n *\n * It exists because nothing else in a shot brief says where it is, and a model\n * with no location picks its own. An ad for Spain came back full of British\n * houses — sash windows, slate roofs, English suburbs — in every single frame,\n * from briefs that were otherwise perfectly good.\n */\n market: z.string().min(1).optional(),\n /**\n * The one person the ad is about.\n *\n * Declared once and grounded on every beat they appear in, because the engine already\n * builds a reference sheet from this and tells each frame to render THE SAME\n * individual. Without it each beat invents its own face: a 28-second ad came back\n * with five different men playing one customer, which reads as a stock-footage\n * collage rather than a story.\n */\n cast: z\n .object({\n /**\n * A cast Avatar's handle — `baker avatars list` shows who there is.\n *\n * The right way to put a person in an ad. The avatar already has a settled\n * identity and a rendered identity sheet, so the ad grounds on the same face the\n * rest of the company's work uses, and its subject description is copied verbatim\n * rather than re-written per spec — re-phrasing it per render is the other reason\n * a face drifts across a set.\n */\n avatar: z.string().min(1).optional(),\n /** Who they are, plainly: age, build, hair, wardrobe, the register of the ad. */\n description: z.string().min(1).optional(),\n })\n .refine((c) => Boolean(c.avatar || c.description), {\n message: \"give `avatar` (a cast avatar's handle) or `description` — a cast with neither grounds on nothing\",\n })\n .optional(),\n /**\n * The bed, described in words — or `false` for an ad that is meant to be dry.\n *\n * Omitted lays a soft, neutral bed. It used to leave the ad silent, on the reasoning\n * that silence is a legitimate choice; it is, but only as a choice. In practice nothing\n * ever set this, and finished ads shipped with a voice over nothing — which reads as\n * unfinished, not as restraint. A bed is the ordinary case, so it is the default, and\n * an ad that wants silence says `false` and means it.\n *\n * The bed never plays over the first beat: the opening line is the scroll-stopper and\n * has to read clean. That is the engine's rule, not this one, and it is why the prompt\n * is all this needs to carry.\n */\n music: z.union([z.string().min(1), z.literal(false)]).optional(),\n /**\n * The place the ad keeps coming back to, held still across every shot.\n *\n * The person has an identity sheet; nothing held the SETTING. Each shot's start frame is\n * generated on its own, so three beats in \"her living room\" came back as three different\n * living rooms. The engine already builds `location` reference sheets — its own comment\n * calls them the strongest cross-scene consistency lock it has — and the ad path simply\n * never emitted one.\n *\n * `image` is a real picture of the place, and it is what makes this work at all: a sheet\n * fuses source material into a turnaround. Fed nothing, it is not a reference sheet, it\n * is `image_generate` with extra steps — the model registry says exactly that. Generate\n * the plate once with gpt-image-2 and pass its URL here.\n */\n set: z\n .object({\n description: z.string().min(1).max(400),\n image: z.string().min(1).optional(),\n })\n .optional(),\n /**\n * How the ad closes.\n *\n * On by default whenever the spec carries a brand, because an ad that stops instead\n * of closing is what shipped: the last caption fell four seconds before the last\n * frame and the picture simply ran out on a man shuffling paper. The closing beat's\n * PICTURE becomes a flat brand plate — the engine already refuses to generate one as\n * a photograph, since a video model garbles a wordmark — and the mark and the call to\n * action are drawn over it by the composition.\n *\n * `false` opts out, for an ad that genuinely ends on its footage.\n */\n end_card: z\n .union([\n z.literal(false),\n z.object({\n /**\n * The words on the button. No default — with none the card carries the mark\n * alone, because falling back to the last beat's line printed that sentence\n * twice on the closing frame. See `endCardCta`.\n */\n cta: z.string().min(1).optional(),\n }),\n ])\n .optional(),\n /**\n * Whether a voice reads the lines.\n *\n * On by default. Turned off, the ad carries its music and its pictures and the `say`\n * lines become ON-SCREEN text instead of spoken ones — which is how most music-led\n * social ads are actually built.\n *\n * It exists because an agent wanted exactly this and had no way to ask: it wrote \"·\"\n * as every line with a voice description reading \"No voiceover; music only\". The dot\n * was sent to the voice model, the near-silence that came back was transcribed, and\n * the transcriber hallucinated \"Thank you.\" — which became the ad's only caption card,\n * held over all sixteen seconds, in English, in a Spanish ad.\n *\n * The captions are BETTER on this path, not worse: they come from the script itself\n * rather than from transcribing a rendered read, so the text is exact and no speech\n * model is between the copy and the screen.\n */\n voiceover: z.boolean().default(true),\n beats: z.array(Beat).min(2),\n});\n\nexport type AdSpecT = z.infer<typeof AdSpec>;\n\n/**\n * Whether the presenter is in every single shot.\n *\n * A rendered ad came back as three near-identical shots of one woman looking at camera\n * and smiling, and nothing refused it: every beat was valid, the spec parsed, the canvas\n * ran, the captions were right. It simply was not an advertisement — no bill, no roof,\n * no panel, no house. Nothing was ever SHOWN.\n *\n * Judging that from the shot briefs is a lexical guess and a bad one: three different\n * sentences described the same picture. What IS knowable here is narrower and true — an\n * ad whose presenter appears in every beat has no cutaway in it, so the only thing the\n * viewer ever sees is a face. Reported as a warning, never a refusal: a one-shot\n * testimonial is a real format, and the question of whether THIS ad should have been one\n * is answered by looking at the render, not by counting words.\n */\nexport function presenterIsInEveryShot(spec: AdSpecT): boolean {\n if (!spec.cast) return false;\n const storyBeats = spec.beats.filter((_, i) => !(endCardWanted(spec) && i === spec.beats.length - 1));\n return storyBeats.length >= 3 && storyBeats.every((b) => b.cast !== false);\n}\n\n/** The currency a market's on-screen figures would be in, keyed by the country's English name. */\nconst CURRENCY_BY_MARKET: Record<string, string> = {\n spain: \"€ (euros)\",\n mexico: \"$ (Mexican pesos)\",\n portugal: \"€ (euros)\",\n brazil: \"R$ (reais)\",\n france: \"€ (euros)\",\n italy: \"€ (euros)\",\n germany: \"€ (euros)\",\n \"united kingdom\": \"£ (pounds sterling)\",\n \"united states\": \"$ (US dollars)\",\n};\n\nconst currencyFor = (market: string) =>\n CURRENCY_BY_MARKET[\n market\n .trim()\n .toLowerCase()\n .replace(/^the\\s+/, \"\")\n ];\n\n/**\n * The language the lines are spoken in, as a BCP-47 tag: the spec's `voice.language`, else the\n * language the creative declares (a translation's), else the one Jev read off the lines.\n *\n * Read from the copy when nobody declared it, because declaring it is a step somebody has to\n * remember and the failure is silent: an ad whose spec named no language reached the voice\n * selector as `{\"description\":\"voiceover voice\"}` and was cast from the account's English stock\n * voices. A market is NOT a language: Spanish is spoken in twenty countries and Switzerland\n * speaks four languages.\n */\nexport function spokenLanguageFor(\n spec: AdSpecT,\n known: { definitionLanguage?: string; reading?: AdSpecReading } = {},\n): string | undefined {\n const declared = spec.voice?.language ? spokenLanguage(spec.voice.language) : null;\n if (declared) return declared.tag;\n const defined = known.definitionLanguage ? spokenLanguage(known.definitionLanguage) : null;\n if (defined) return defined.tag;\n return known.reading?.scriptLanguage;\n}\n\n/**\n * Where the ad is set: the spec's `market`, else the country a declared regional language names\n * (`es-MX` → Mexico), the voice's or the creative's. Never guessed from the language alone:\n * Spanish is not Spain, and a country nobody chose would be stated on every frame. With none,\n * the frames name no place and `scaffold-ad` says how to give one.\n */\nexport function marketFor(spec: AdSpecT, definitionLanguage?: string): string | undefined {\n if (spec.market) return spec.market;\n for (const tag of [spec.voice?.language, definitionLanguage]) {\n const region = tag ? spokenLanguage(tag)?.region : undefined;\n if (region) return region.name;\n }\n return undefined;\n}\n\n/**\n * Seconds a beat holds — snapped to a length the video model can actually render.\n *\n * The snap is the point, not the estimate. A free-form duration gets rounded down\n * to an allowed model length when the clip is requested, and those losses\n * accumulate: measured on a scaffolded ad, the clips summed to 27.0s while the\n * timeline ran to 31.4s, and the 4.4s difference rendered as a black tail with\n * the overlay still on screen. Laying the clock on the SNAPPED value instead\n * makes that gap unexpressible.\n *\n * It rounds UP, never down: a picture slightly longer than its line is invisible,\n * a picture that ends early is a hole.\n *\n * Timed at the measured read rate (`READ_WORDS_PER_SECOND`), because the beat's line is\n * what the voice reads over its picture.\n *\n * Snapped to the LADDER OF THE MODEL THAT WILL RENDER IT. Seedance goes to 15 and Omni\n * stops at 10, so snapping every ad to Seedance's ladder wrote a 15-second beat onto the\n * clock and then asked Omni for a clip it does not make: the generator caps at its own\n * maximum, the timeline still runs long, and the difference comes back as a black tail\n * with the overlay still up — the gap this snap exists to make unexpressible.\n */\nfunction beatSeconds(line: string, videoModel?: string): number {\n const spoken = wordCount(line) / READ_WORDS_PER_SECOND;\n const allowed =\n (videoModel ? clipDurationsFor(videoModel) : undefined) ?? [...SEEDANCE_DURATIONS].sort((a, b) => a - b);\n // Never shorter than a shot can play, whatever the line says. A two-word beat measures\n // three seconds of read, and three seconds is not a shot — it is a cut, and six of them\n // is a slideshow. Measured, in the user's words: \"a five-second video explains nothing;\n // eight to ten a scene is fine, but five, where you say everything in a rush, will come\n // out wrong ninety percent of the time.\"\n //\n // The floor does not fix a badly split script — it makes the split VISIBLE, by pushing\n // the estimated duration past what was asked for, where `scaffold-ad`'s hint names the\n // beats to merge. The alternative was shipping the slideshow quietly.\n const wanted = Math.max(spoken, SPOKEN_CLIP_DURATION_S);\n return allowed.find((d) => d >= wanted) ?? (allowed[allowed.length - 1] as number);\n}\n\n/**\n * What the closing beat's picture is, in words.\n *\n * The beat is routed to a colour plate by its `route_hint`, not by this wording; the\n * sentence stays because it is what the frame model would receive if the route ever failed\n * open — and a flat brand plate is the right picture either way. It still reads as a brand\n * card to the prose fallback, so an old scaffolder's blueprint routes the same.\n */\nconst BRAND_PLATE =\n \"A solid flat brand colour plate — an end card. No people, no objects, no scenery, no text of any kind.\";\n\n/** Whether this ad closes on a brand card. */\nexport function endCardWanted(spec: AdSpecT): boolean {\n if (spec.end_card === false) return false;\n return Boolean(spec.brand?.name || spec.brand?.logo);\n}\n\n/**\n * The words on the closing button, or null when the card should carry only the mark.\n *\n * Only ever the spec's own words. Defaulting to the last beat's line printed the SAME\n * sentence twice on the closing frame — once as the card's button and once as the\n * caption of the line being spoken over it — which is what a rendered ad did:\n * \"SOLICITA TU PRESUPUESTO GRATIS.\" in the middle of the frame and again along the\n * bottom. The caption track already shows what the voice says; a card that repeats it\n * is not a call to action, it is a duplicate.\n */\nexport function endCardCta(spec: AdSpecT): string | null {\n if (!endCardWanted(spec)) return null;\n const declared = spec.end_card === false ? undefined : spec.end_card?.cta?.trim();\n if (!declared) return null;\n // Declared but identical to the closing line is the same duplicate, said on purpose.\n const closing = (spec.beats[spec.beats.length - 1]?.say ?? \"\").trim().toLowerCase();\n return declared.toLowerCase().replace(/[.!?]$/, \"\") === closing.replace(/[.!?]$/, \"\") ? null : declared;\n}\n\n/**\n * The ad's recurring cast, in the shape `scaffoldVideoCanvas` already consumes.\n *\n * The second argument to that function is the recurring-element list the engine grounds\n * frames on; `scaffold-ad` passed an empty array, so every beat generated its own\n * stranger. The closing beat is never included — it is a flat colour plate with nobody\n * in it.\n */\n/** The one recurring person an ad has. Shared by the cast element and the dialogue. */\nexport const AD_CAST_ID = \"customer\";\n\n/**\n * The speaker every narrated beat names.\n *\n * Its own id, and deliberately NOT one of the engine's narrator labels (`voiceover`,\n * `narrator`, `vo`, …). Those are foldable: the engine treats one of them, in a video with a\n * single on-camera presenter, as that presenter's own off-camera narration and folds the two\n * into one speaker — right for a reproduced ad, where the presenter really does keep talking\n * over the b-roll cut into her read, and wrong for a scaffolded one, where a cutaway is its\n * own shot. Folded, her beats and the cutaway between them merged into a single native take:\n * the video model spoke her lines while an ElevenLabs narrator read the same script over the\n * top, lips matching neither.\n *\n * Not being in `global.cast` is what makes it a voice rather than a face — the engine only\n * looks for a mouth to lip-sync for a speaker the ad casts.\n */\nexport const AD_NARRATOR_ID = \"ad_narrator\";\n/** The recurring place, named the same way the recurring person is. */\nexport const AD_SET_ID = \"set\";\n\n/**\n * The avatar this ad is describing instead of casting, if there is one.\n *\n * A described cast is legitimate — a company with no avatars has nothing else. It is a\n * mistake only when the person being described is already on the roster: the ad then\n * grounds on prose rather than on her identity sheet, so her face drifts between shots,\n * her accent never reaches the read, and the native-audio path never opens because there\n * is no cast member to name as speaker.\n *\n * Matched on whole words so a roster name cannot fire from inside a longer one.\n */\nexport function castedAvatarOnRoster(\n ad: { cast?: { avatar?: string; description?: string }; beats?: ReadonlyArray<{ show?: string }> },\n roster: ReadonlyArray<{ handle: string; name: string }>,\n): string | null {\n if (ad.cast?.avatar) return null;\n // The shot briefs, not only the cast description. A spec came back with no `cast` field\n // at all from a request that named the avatar three times — nothing to match against, so\n // the ad shipped narrated by a stranger. Who is ON SCREEN is written in the briefs, and\n // that is the claim worth acting on: a name in a spoken line may be someone talked about.\n const haystack = [ad.cast?.description ?? \"\", ...(ad.beats ?? []).map((b) => b.show ?? \"\")].join(\" \");\n if (!haystack.trim()) return null;\n // Kept as WRITTEN, not lowercased. Avatars get named Will, Mark, May and Rose, and a\n // shot brief uses every one of those for something else — \"the brand mark\", \"a rose\n // garden\", \"she will explain\". Cased, prose and a name come apart on their own: a person\n // is written with a capital and the ordinary word is not. This is not a suggestion being\n // matched here — an auto-cast grounds every frame on that face and copies their subject\n // description verbatim, so a wrong one is a stranger narrating the whole ad.\n const written = new Set(haystack.split(/[^\\p{L}\\p{N}]+/u).filter(Boolean));\n for (const person of roster) {\n if (labelWrittenAsName(person.name, written) || labelWrittenAsName(person.handle, written)) return person.handle;\n }\n return null;\n}\n\n/** Whether one roster label appears in the text written the way a person's name is. */\nfunction labelWrittenAsName(label: string, written: ReadonlySet<string>): boolean {\n const token = label.trim();\n // A handle like `greenleaf-homeowner` is a slug, not a name someone writes in prose;\n // matching it word by word would fire on the company's own name.\n if (!token || token.includes(\"-\") || token.length < 3) return false;\n // The handle is lowercase by construction, so both labels are compared\n // case-insensitively against a word that is itself capitalised in the text.\n const folded = token.toLowerCase();\n for (const word of written) {\n if (word.toLowerCase() === folded && word[0] === word[0]?.toUpperCase()) return true;\n }\n return false;\n}\n\nexport function adSpecCastElements(\n spec: AdSpecT,\n /**\n * The avatar the spec named, once resolved. Its identity sheet becomes the slot's\n * source image — which is what turns a canvas that needs a photograph dropped in by\n * hand into one that runs — and its subject description is copied verbatim.\n */\n avatar?: { sheetUrl?: string; subjectDescription?: string } | null,\n): {\n type: string;\n label: string;\n cast_id: string;\n description: string;\n scenes: number[];\n source_image?: string;\n source_is_sheet?: boolean;\n}[] {\n const lastIndex = spec.beats.length - 1;\n const speakingScenes = spec.beats.map((_, i) => i).filter((i) => !(endCardWanted(spec) && i === lastIndex));\n const place = spec.set?.description?.trim();\n const elements: ReturnType<typeof adSpecCastElements> = [];\n if (place && speakingScenes.length > 0) {\n elements.push({\n type: \"location\",\n label: AD_SET_ID,\n cast_id: AD_SET_ID,\n description: place,\n scenes: speakingScenes,\n ...(spec.set?.image?.trim() ? { source_image: spec.set.image.trim() } : {}),\n });\n }\n\n const description = (avatar?.subjectDescription ?? spec.cast?.description)?.trim();\n if (!description) return elements;\n const scenes = spec.beats\n .map((beat, i) => ({ beat, i }))\n .filter(({ beat, i }) => beat.cast !== false && !(endCardWanted(spec) && i === lastIndex))\n .map(({ i }) => i);\n if (scenes.length === 0) return elements;\n const sheet = avatar?.sheetUrl?.trim();\n elements.push({\n type: \"person\",\n label: AD_CAST_ID,\n // Same id the dialogue names as speaker: that pairing is what lets the engine see\n // the presenter as present in a scene and route it to native audio.\n cast_id: AD_CAST_ID,\n description,\n scenes,\n // An avatar's identity sheet IS the turnaround the engine would otherwise render,\n // so it is handed over as one. Left unmarked, the run paid to generate a sheet OF\n // a sheet and every frame grounded on the copy instead of the avatar.\n ...(sheet ? { source_image: sheet, source_is_sheet: true } : {}),\n });\n return elements;\n}\n\ntype BlueprintGlobal = NonNullable<VideoBlueprint[\"global\"]>;\n\n/**\n * The blueprint an ad compiles to: the shared `VideoBlueprint` contract the video scaffolder\n * reads, with what an authored ad always sets made required — every beat is timed, says its\n * line (or deliberately says none) and briefs its picture, and the ad states how it is voiced\n * and how long it runs. The contract keeps them optional because a deconstruct may omit them.\n */\nexport type AdBlueprint = {\n estimated_duration_s: number;\n global: BlueprintGlobal & {\n transcript: string;\n voiceover: NonNullable<BlueprintGlobal[\"voiceover\"]> & { mode: string };\n };\n scenes: Array<\n VideoScene & {\n start_s: number;\n end_s: number;\n duration_s: number;\n summary: string;\n narrative_role: string;\n dialogue: BlueprintDialogueLine[];\n motion_prompt: string;\n start_frame_prompt: string;\n }\n >;\n} & VideoBlueprint;\n\n/** One timed word, in the shape the caption composition reads. */\nexport type TranscriptWord = { text: string; start: number; end: number };\n\n/**\n * What the clip does, as opposed to what the opening frame looks like.\n *\n * The closing beat is a flat plate and has no motion to describe. Everything else is\n * the shot brief plus the invariants — and, unless the beat said otherwise, an explicit\n * instruction that nobody is speaking: a mouth moving under a voice that is not theirs\n * reads as bad dubbing, which is what sank the first cut of this.\n *\n * The realism block is deliberately NOT here, though it is on every frame. It is 196 words\n * about what may appear in the picture, and the picture is already decided — the clip is\n * generated FROM the frame, and the prompt's own closing direction says so (\"describe MOTION\n * ONLY — the frames carry the content\"). Carried here it made every ad's clip prompt ~479\n * words against this model's ~200-word budget, which the engine warns about on every clip,\n * with the spoken line buried in the middle of it. Measured on a real render: the presenter\n * said \"la obra acabó cada día\" where the script said \"avanzó\" — a sentence that means\n * nothing, in her own voice, which is the one thing the native path is for. What the clip\n * must not invent (on-screen text, extra fingers) is already stated by the engine's own\n * closing lines, which are short and sit next to the dialogue rather than 200 words from it.\n */\nfunction motionPrompt(\n beat: { show: string },\n // Resolved by `beatToCamera`, never read off the beat here: this brief and the dialogue\n // turn have to agree, or a shot briefed as a piece to camera carries a line marked\n // narration — and the model stages a closed mouth over a voice that is speaking.\n toCamera: boolean,\n isClosingCard: boolean,\n place: string,\n): string {\n if (isClosingCard) return BRAND_PLATE;\n const shot = `${beat.show}${place}`;\n if (toCamera) return shot;\n // \"Nobody is speaking\" was not enough on its own: a beat whose subject is simply\n // present, facing camera, still came back with a mouth moving under a voice that was\n // not theirs — silent mouthing, which reads worse than plain dubbing. So the subject\n // is given something else to be doing with their face.\n return (\n `${shot} Nobody in frame is speaking: mouths CLOSED and STILL throughout, no talking, no lip movement. ` +\n \"Whoever is in shot is looking, reacting or working — never addressing the camera.\"\n );\n}\n\n/**\n * The caption track for an ad nobody speaks, built from the script itself.\n *\n * Words are spread evenly across their beat's window. That is not a guess about\n * delivery — there is no delivery — it is a reading pace, and an even one is what a\n * viewer scanning a silent ad actually gets. Exact text, exact beat boundaries, and no\n * speech model anywhere near it.\n */\nexport function staticTranscript(spec: AdSpecT, videoModel?: string): TranscriptWord[] {\n const out: TranscriptWord[] = [];\n let clock = 0;\n for (const beat of spec.beats) {\n // The SAME model as the blueprint's beats, necessarily: these windows are laid on the\n // same clock, and a caption track snapped to a different ladder drifts off the picture\n // word by word.\n const duration = beatSeconds(beat.say, videoModel);\n const words = beat.say.trim().split(/\\s+/).filter(Boolean);\n const each = words.length > 0 ? duration / words.length : duration;\n words.forEach((text, i) => {\n const start = clock + i * each;\n out.push({\n text,\n start: Math.round(start * 100) / 100,\n end: Math.round((start + each) * 100) / 100,\n });\n });\n clock += duration;\n }\n return out;\n}\n\n/**\n * Which variety of the language the presenter speaks, or null when nobody said.\n *\n * The AVATAR's accent when there is one, because that is where this belongs: an avatar has\n * no pinned voice by design (ADR 0005 — the re-voice is speech-to-speech, so it replaces\n * timbre and keeps pronunciation), which leaves the region directed in the prompt as the\n * only lever there is. `avatars/profile.ts` already states it as `ACCENT:` for Studio\n * clips; this carries the same fact into an ad.\n *\n * The market is the fallback, not the source. Deriving the accent from where the ad is SET\n * was the first attempt here and it is a guess: an ad set in Spain can legitimately be read\n * by a Mexican presenter, and the avatar's own profile knows which it is.\n */\nfunction spokenVariety(avatarAccent: string | undefined, market: string | undefined): string | null {\n const accent = avatarAccent?.trim();\n if (accent) return `${accent} — perform the pronunciation of that region, not a neutral one`;\n if (!market) return null;\n return `the local accent of ${market} — the way people there actually speak, not a neighbouring country's variety of the same language`;\n}\n\n/**\n * The bed this ad plays under, or null when it is meant to be dry.\n *\n * The default is deliberately plain: an ad's music should sit under the voice and carry\n * the tone, not perform. Naming the instruments here rather than leaving the model to\n * invent them is what keeps it from returning a track with a hook and a drop, which\n * fights the read instead of supporting it.\n */\nfunction musicBed(spec: AdSpecT): string | null {\n if (spec.music === false) return null;\n if (typeof spec.music === \"string\") return spec.music;\n return (\n \"A soft, warm instrumental bed that sits well under a spoken voiceover: gentle acoustic \" +\n \"guitar or soft piano with light pads, steady and unobtrusive, no vocals, no lyrics, no \" +\n \"drop, no build to a climax, nothing that pulls attention off the voice.\"\n );\n}\n\n/**\n * Whether this beat is the presenter talking to camera.\n *\n * One resolution for the three places that ask — the native-audio gate, the dialogue turn\n * and the motion prompt. They disagreed once and the result was a shot briefed as a piece\n * to camera whose line was then marked narration.\n */\nfunction beatToCamera(spec: AdSpecT, beat: AdSpecT[\"beats\"][number], isClosingCard: boolean): boolean {\n // Never on the closing plate: a flat colour card with nobody in it, and saying someone\n // is on camera there sent the engine looking for a mouth to lip-sync on a picture that\n // has no person.\n if (isClosingCard) return false;\n // She is in the shot and there is a line, so the line is hers — an explicit `on_camera:\n // false` is overridden rather than obeyed. Obeying it flipped the WHOLE ad to the dubbed\n // path, because the native gate is all or nothing, and the result was reported off a real\n // render: \"the voice makes no sense with the avatar, out of time with the lips, and it is\n // clearly not her\". Her mouth is animated for one set of words while a separate track\n // speaks another. Narration is still available through `cast: false`, which takes her out\n // of the shot — then nothing is being dubbed over anybody.\n if (spec.cast?.avatar && beat.cast !== false) return true;\n if (beat.on_camera !== undefined) return beat.on_camera;\n return Boolean(spec.cast) && beat.cast !== false;\n}\n\n/**\n * Beats that introduce their own speaker with nobody on screen to say it.\n *\n * A voice from off screen saying \"Hola, soy Marta\" over a shot Marta is standing in reads\n * as a mistake, the same way a moving mouth under someone else's voice does — so the\n * scaffolder refuses it.\n *\n * Asked through `beatToCamera`, which is the function that actually decides, rather than\n * off `beat.on_camera`. Those two disagree on the commonest spec there is: a cast avatar\n * owns every beat they appear in, so an absent — or even an explicit `false` — `on_camera`\n * is overridden to `true`. Reading the raw field refused a spec the emitter would have\n * rendered correctly, and the remedy it printed (\"set `on_camera: true`\") changed nothing\n * about the output, so there was no way past it. A gate has to ask the question the\n * emitter answers, or it refuses work that was never wrong.\n *\n * The closing card is excluded for the reason `beatToCamera` excludes it: nobody is on a\n * flat colour plate, and it is the one beat where off-camera speech is correct.\n *\n * Which lines introduce their speaker is the reading's (`readAdSpec`): \"Cześć, jestem Ania\"\n * and \"Ich bin Jonas\" are as much a self-introduction as \"Hola, soy Marta\".\n */\nexport function beatsIntroducingSpeakerOffCamera(spec: AdSpecT, reading: AdSpecReading): number[] {\n const closesOnCard = endCardWanted(spec);\n const last = spec.beats.length - 1;\n return spec.beats.flatMap((beat, i) =>\n reading.introducesSpeaker[i] === true && !beatToCamera(spec, beat, closesOnCard && i === last) ? [i] : [],\n );\n}\n\n/**\n * Whether the video model voices THIS beat itself.\n *\n * Native audio — the model generating the clip WITH the speech, so the mouth and the voice\n * come out of one generation and match by construction. Decided per beat, because that is\n * the unit an ad is built in: a beat is one shot, and whether a mouth is in it is a fact\n * about that shot alone.\n *\n * It used to be one switch for the whole ad, all or nothing, and the cost was measured on a\n * real render: an ad that mixed her beats with two cutaways came back with the video model\n * speaking her lines AND an ElevenLabs narrator reading the same script over the top — two\n * voices, lips matching neither. One `cast: false` beat was enough to flip every other beat\n * to the dubbed path, which is the one outcome an avatar must never reach.\n *\n * The reason the gate was global was the engine's phrase model: a beat the presenter is\n * absent from read as a cutaway INSIDE one continuous take, so it did not break the phrase\n * and the beats merged into a single native read. A cutaway beat now names a NARRATOR as\n * its speaker instead of leaving the label off, and a speaker change is a phrase break — so\n * every beat is its own clip on its own window, which is what an ad is.\n */\nfunction beatSpeaksNatively(spec: AdSpecT, beat: AdSpecT[\"beats\"][number], isClosingCard: boolean): boolean {\n if (!spec.cast || spec.voiceover === false) return false;\n return beatToCamera(spec, beat, isClosingCard) && beat.cast !== false;\n}\n\n/**\n * One beat's spoken turn.\n *\n * The read is built from per-scene dialogue, not from the global transcript: emitting only\n * the transcript scaffolds a SILENT ad. An empty array is the deliberate opposite — it stops\n * the engine wiring a voice track at all, which is what makes a music-led ad rather than one\n * with a silent narrator.\n */\nfunction beatDialogue(\n spec: AdSpecT,\n beat: AdSpecT[\"beats\"][number],\n window: { start: number; end: number; isClosingCard: boolean; nativeSpeech: boolean; avatarVoice?: string },\n): BlueprintDialogueLine[] {\n if (spec.voiceover === false) return [];\n const narrator = narratorVoice(spec, window.avatarVoice);\n return [\n {\n line: beat.say,\n start_s: window.start,\n end_s: window.end,\n // Always stated, never left to the engine: absent, it guesses from who is in frame,\n // which is how a still photograph once got lip-synced.\n on_camera: beatToCamera(spec, beat, window.isClosingCard),\n // Naming the CAST as speaker is the other half of what sends this beat down the\n // native path. Left unnamed, the speaker defaults to \"voiceover\" — a narrator, who is\n // by definition never on camera — so every beat took the dubbed path: a clip generated\n // with one mouth and a separate ElevenLabs track laid over it. That is the mismatch\n // behind every \"the mouth does not match\" in this ad's history.\n //\n // A beat that is NOT hers names the ad's OWN narrator (`AD_NARRATOR_ID`), rather\n // than leaving the label off. A different speaker is what breaks the phrase, and a\n // phrase break is what keeps each beat its own clip: left unlabelled, the engine read\n // the cutaway as her narrating over an insert in one continuous take and merged the\n // beats around it into a single native read with the dubbed one laid on top.\n speaker: window.nativeSpeech ? AD_CAST_ID : AD_NARRATOR_ID,\n // The narrator is cast from the ad's voice, and failing that from the CAST's own\n // description. Naming a speaker of our own cost this: the engine casts an unnamed\n // narrator by folding it into the lone presenter and reusing her casting, so the\n // closing line inherited her persona for free. Named, it is a speaker in nobody's\n // `cast`, and the engine's last-resort description for one of those is the literal\n // \"<speaker> voice\" — so an ad with an avatar, a closing card and no `voice`\n // (a perfectly ordinary spec) had its closing tagline cast off the words\n // \"ad_narrator voice\".\n ...(narrator ? { voice_description: narrator } : {}),\n },\n ];\n}\n\n/**\n * The words the ad's narrator is cast from.\n *\n * The voice the ad described, else the AVATAR it cast, else the person it described — an ad\n * with one presenter and a narrated closing line wants those two to sound like the same kind\n * of person, which is what the engine used to give for free by folding the two speakers into\n * one.\n *\n * The avatar leg is the one that matters in practice: `--avatar` is how an ad casts somebody,\n * and it leaves `cast.description` empty, so without it the commonest spec of all reaches the\n * engine's last-resort brief and casts the closing line off the words \"ad_narrator voice\".\n */\nfunction narratorVoice(spec: AdSpecT, avatarVoice?: string): string | undefined {\n return spec.voice?.description?.trim() || avatarVoice?.trim() || spec.cast?.description?.trim() || undefined;\n}\n\n/** Which beats the video model voices itself, asked of each one. */\nfunction nativeSpeechByBeat(spec: AdSpecT, closesOnCard: boolean): boolean[] {\n const last = spec.beats.length - 1;\n return spec.beats.map((beat, i) => beatSpeaksNatively(spec, beat, closesOnCard && i === last));\n}\n\n/**\n * The master switch for whether ANY mouth on screen may carry its own speech.\n *\n * `voiceover` and `none` both mean narration over the picture, and the engine then routes\n * every line through TTS no matter what an individual scene says — so an ad whose presenter\n * talks to camera has to say `on_camera` here, or the per-beat flag and the named speaker\n * are both read and then discarded. `none` keeps a voice out of it entirely, which is what\n * makes a music-led ad.\n */\nfunction voiceoverMode(spec: AdSpecT, nativeByBeat: readonly boolean[], closesOnCard: boolean): string {\n if (spec.voiceover === false) return \"none\";\n // The closing plate holds no vote. Nobody is on a flat colour card, so its line is read\n // whatever the rest of the ad does — counted, it would make every on-camera ad `mixed`.\n const spoken = closesOnCard ? nativeByBeat.slice(0, -1) : nativeByBeat;\n const native = spoken.filter(Boolean).length;\n if (native === 0) return \"voiceover\";\n // `mixed` is the engine's own word for an ad where SOME lines come off a mouth on screen\n // and the rest are read over the picture — exactly an avatar with cutaways cut into her.\n // It keeps mouths eligible for lip-sync (which `voiceover` does not, at any per-beat\n // setting) while leaving each narrated beat to be read.\n return native === spoken.length ? \"on_camera\" : \"mixed\";\n}\n\n/**\n * Who the person on camera IS, in the ad's own terms.\n *\n * A testimonial came back with the customer repairing the solar panel herself: nothing in\n * the prompt said she was not the installer, so the model cast her as one. The spec already\n * knows — `cast.description` when the agent wrote one, and a customer by default, because\n * that is what an ad with a recurring person almost always is.\n */\nfunction castRole(spec: AdSpecT, reading: AdSpecReading | undefined): string | undefined {\n if (!spec.cast) return undefined;\n const described = spec.cast.description?.trim();\n if (!described) return \"a customer telling their own story, not a worker\";\n // A description of someone who works for the business is the answer to this question, and\n // appending \"not a worker\" to it contradicts it — on every frame, because this is stated on\n // every frame. The reading decides which it is (\"Elektriker, Mitte 40\" is as much a job as\n // \"installer\"); unread, the description stands as written rather than be contradicted.\n if (reading?.castWorksThere === false) return `${described} — a customer telling their own story, not a worker`;\n return described;\n}\n\nexport function adSpecToBlueprint(\n spec: AdSpecT,\n opts: {\n /** The cast avatar's accent, so the read is directed where the speech is made. */\n avatarAccent?: string;\n /** The model the canvas will ask for the clips, so beat lengths snap to ITS ladder. */\n videoModel?: string;\n /**\n * How the cast avatar sounds and who they are, for casting the NARRATOR of the beats\n * they are not in. Never used for their own beats — those are voiced by the clip.\n */\n avatarVoice?: string;\n /** The language the creative declares (`_definition.md`'s `language`, a translation's). */\n definitionLanguage?: string;\n /** What Jev read in the spec's words (`readAdSpec`); unread when absent. */\n reading?: AdSpecReading;\n } = {},\n): AdBlueprint {\n const avatarAccent = opts.avatarAccent;\n const total = spec.beats.length;\n const market = marketFor(spec, opts.definitionLanguage);\n // Stated on EVERY frame, not once globally: each shot brief is sent to the\n // model on its own, so a location mentioned anywhere else is a location the\n // model never sees.\n const place = market ? ` Set in ${market}: the architecture, streets and styling are ${market}'s.` : \"\";\n // Two defects that got all the way to a finished ad, both the same shape: a\n // frame that is well lit, on brief, perfectly legible and impossible. A bill\n // held to camera with the text from its reverse showing through the paper, and\n // a solar panel five metres tall lifted by one person. Neither is something a\n // shot brief thinks to rule out, so it is ruled out here for every frame.\n const currency = market ? currencyFor(market) : undefined;\n // Three rules, one family: a frame that is well lit, on brief, perfectly\n // legible — and contradicts itself. Each was watched reaching a finished ad.\n // • a bill with the text from its reverse showing through the paper;\n // • a solar panel five metres tall, lifted by one person;\n // • a phone reading \"$215.40 SAVED THIS MONTH\" under a caption reading\n // \"Save over £900 a year\" — wrong currency, and a figure that contradicts\n // the claim it sits beneath.\n // The third is the worst, because the viewer reads the number. A model invents\n // one whenever a screen or a document is in shot, so the frames simply do not\n // get legible text: the caption track is where this ad's numbers live.\n const physics = frameRealismDirection({ currency, role: castRole(spec, opts.reading) });\n // The engine renders a closing beat marked `route_hint: \"brand_card\"` as a clean colour\n // plate instead of a generated picture (`sceneIsBrandCard`, scaffold/video/routes). Left\n // to read the prose, a lifestyle CTA beat — what an agent writes by default — comes back\n // as one more photograph. Saying it here is what makes the closing beat actually close.\n const closesOnCard = endCardWanted(spec);\n // Per beat: a cutaway is narrated and the beats around it keep their own voice.\n const nativeByBeat = nativeSpeechByBeat(spec, closesOnCard);\n const spokenMode = voiceoverMode(spec, nativeByBeat, closesOnCard);\n let clock = 0;\n const scenes = spec.beats.map((beat, i) => {\n const isClosingCard = closesOnCard && i === total - 1;\n const duration = beatSeconds(beat.say, opts.videoModel);\n const start = clock;\n clock += duration;\n return {\n start_s: Math.round(start * 100) / 100,\n end_s: Math.round(clock * 100) / 100,\n duration_s: duration,\n summary: isClosingCard ? `${BRAND_PLATE} ${beat.say}` : beat.say,\n narrative_role: authoredRole(i, total),\n ...(isClosingCard ? { route_hint: \"brand_card\" as const } : {}),\n // The read is built from per-scene dialogue, not from the global\n // transcript: emitting only the transcript scaffolds a SILENT ad. And\n // `on_camera` is the engine's own switch for \"this line is narration\" —\n // absent, it guesses from who is in frame, which is how a still photograph\n // once got lip-synced.\n // No dialogue at all when nobody speaks: an empty array is what stops the engine\n // wiring a voice track, and no voice track is what makes this a music-led ad\n // rather than one with a silent narrator.\n // One effect per beat, placed on this beat's window. The engine clamps the\n // length to what the provider accepts. An ad emitted none of these until now,\n // so every one shipped with a music bed and no sound design at all.\n ...(beat.sound?.trim()\n ? { sfx: [{ sound_effect_prompt: beat.sound.trim(), duration_s: Math.min(duration, 30) }] }\n : {}),\n dialogue: beatDialogue(spec, beat, {\n start: Math.round(start * 100) / 100,\n end: Math.round(clock * 100) / 100,\n isClosingCard,\n nativeSpeech: nativeByBeat[i] === true,\n avatarVoice: opts.avatarVoice,\n }),\n motion_prompt: motionPrompt(beat, beatToCamera(spec, beat, isClosingCard), isClosingCard, place),\n start_frame_prompt: isClosingCard ? BRAND_PLATE : `${beat.show}${place}${physics}`,\n };\n });\n\n const accent = spokenVariety(avatarAccent, market);\n const narrator = narratorVoice(spec, opts.avatarVoice);\n const music = musicBed(spec);\n return {\n estimated_duration_s: Math.round(clock * 100) / 100,\n global: {\n transcript: spec.beats.map((b) => b.say).join(\" \"),\n // Resolved: `marketFor` also reads the country a declared regional language names.\n ...(market ? { market } : {}),\n voiceover: {\n mode: spokenMode,\n ...(accent ? { accent } : {}),\n ...(narrator ? { voice_description: narrator } : {}),\n },\n ...(spec.cast\n ? {\n cast: [\n {\n id: AD_CAST_ID,\n description: (spec.cast.description ?? \"the ad's recurring person\").trim(),\n },\n ],\n }\n : {}),\n ...(spec.brand?.name || spec.brand?.logo\n ? {\n branding: {\n ...(spec.brand?.name ? { name: spec.brand.name } : {}),\n ...(spec.brand?.logo ? { logo_path: spec.brand.logo } : {}),\n },\n }\n : {}),\n ...(spec.brand?.palette?.length ? { style: { palette: spec.brand.palette.map((hex) => ({ hex })) } } : {}),\n ...(music ? { music: { music_prompt: music } } : {}),\n },\n scenes,\n };\n}\n\n/**\n * The shortest line that is a whole thought rather than a fragment.\n *\n * Judged on the LINE, not against `SPOKEN_CLIP_DURATION_S`. Comparing the two is the\n * mistake this constant replaces: an 8-second floor is a CLIP length and a line's read is\n * a different quantity, so at 3.06 words a second the old test demanded a 25-word clause\n * before a beat counted as playable. Every beat of this command's own documented example\n * failed it — \"tus vecinos ya dieron el paso.\" is five words and a complete thought — and\n * a hint that fires on every ad is a hint nobody reads.\n *\n * Four words is where a line stops being a thought and starts being a caption fragment.\n * The measured failure was \"Sin papeleo.\" — two words given its own shot.\n */\nconst MIN_BEAT_WORDS = 4;\n\n/**\n * Beats too short to be a shot, named so the agent can merge them.\n *\n * A beat's picture holds for at least `SPOKEN_CLIP_DURATION_S`, so a two-word line buys\n * six seconds of somebody standing still. Six of those is not a twenty-second ad, it is a\n * slideshow, and it is the failure this was measured against: \"a five-second video\n * explains nothing; eight to ten a scene is fine, but five, where you say everything in a\n * rush, will come out wrong ninety percent of the time.\"\n *\n * The fix is fewer, longer beats, not a longer clip per beat. So this reports rather than\n * corrects: the split is the agent's to redo.\n */\nexport function beatsTooShortToPlay(spec: AdSpecT): number[] {\n return spec.beats\n .map((beat, i) => ({ i, words: beat.say.trim().split(/\\s+/).filter(Boolean).length }))\n .filter(({ words }) => words < MIN_BEAT_WORDS)\n .map(({ i }) => i + 1);\n}\n","/**\n * What an ad spec's own words say, read when `scaffold-ad` runs. Jev decides, in one request:\n * the language the lines are in, which line has its speaker introduce themselves, which shot\n * brief asks for readable text, whether the cast is someone who works for the business, and the\n * words a caption card may not end on. A text model reads, beside it, the voice each description\n * asks for (`voice-gender.ts`), a value carried in the words' grammar.\n *\n * Each of these was a list of words in English and Spanish, and an ad is written in any\n * language, or in two at once: a Polish self-introduction walked past the gate it was meant\n * for, a German \"Elektriker\" was told he was a customer, and \"Book a survey.\" was cast in\n * Portuguese. Measured on labelled cases in nine languages (scripts/ad-spec-reading-evals).\n *\n * When Jev cannot answer, the reading degrades and never refuses or labels on a guess: no line\n * introduces its speaker, no brief asks for text, the cast is described as written, the voice is\n * cast without a gender or a language it was not told, and the word cap alone closes a card.\n */\nimport { carriesOnFromAnswers, carriesOnQuestions } from \"../nodes/local/lib/caption-groups.ts\";\nimport type { JevAnswer, JevQuestion } from \"../nodes/local/lib/jev.ts\";\nimport type { AdSpecT } from \"./ad-spec.ts\";\nimport { languageFromAnswer, languageQuestion } from \"./lib/language.ts\";\nimport type { ReadVoiceGenders, VoiceGender } from \"./video/dialogue/voice-gender.ts\";\n\nexport type AdSpecReading = {\n /** The ISO 639-1 code of the language the lines are in, when Jev was sure of it. */\n scriptLanguage?: string;\n /** Per beat: its line has the speaker introduce themselves (\"Hola, soy Marta\"). */\n introducesSpeaker: boolean[];\n /** Per beat: its shot brief asks for words or a figure to be readable in the picture. */\n wantsLegibleText: boolean[];\n /** The cast description is someone who works for the business; undefined when not known. */\n castWorksThere?: boolean;\n /** The voice each description asks for, keyed by the description, those that say. */\n voiceGenders: Record<string, VoiceGender>;\n /** The script's words a caption card may not end on. */\n captionCarriesOn: string[];\n /** False when Jev could not answer: everything above but the genders is then the safe default. */\n read: boolean;\n};\n\n/** Asks Jev every question in one request; null when it could not answer. */\nexport type AskJev = (questions: readonly JevQuestion[]) => Promise<JevAnswer[] | null>;\n\n/** The two readers: Jev for the decisions, the text model for the voices' genders. */\nexport type AdSpecReaders = { ask: AskJev; genders: ReadVoiceGenders };\n\n/** At or above these, a yes/no answer is yes. Measured: see docs/decision-model.md. */\nexport const INTRODUCES_SPEAKER_HELD = 0.5;\nexport const WANTS_LEGIBLE_TEXT_HELD = 0.5;\nexport const WORKS_THERE_HELD = 0.5;\n\nconst INTRODUCES_SPEAKER =\n 'Does the speaker of `line` introduce themselves, saying their own name or who they are (\"Hi, I\\'m Marta\")? A line about somebody else, or a first-person line that names nobody, is not.';\nconst WANTS_LEGIBLE_TEXT =\n \"Does `brief` ask for words, a number, a price or a figure in the picture to be readable (in focus, legible, highlighted, the point of the shot)? A document, screen or sign that is only present, out of focus or not meant to be read is not.\";\nconst WORKS_THERE =\n \"Does `person` describe someone who works for the business in the ad (an installer, a technician, an employee, a doctor, a chef, its founder or owner, its team) rather than a customer or an ordinary person?\";\n\n/** The voice descriptions an ad's speakers are cast from: the spec's voice, the avatar's, the cast's. Pure. */\nexport function adSpecVoices(spec: AdSpecT, avatarVoice?: string): string[] {\n const all = [spec.voice?.description, avatarVoice, spec.cast?.description].map((d) => d?.trim() ?? \"\");\n return [...new Set(all.filter(Boolean))];\n}\n\n/** The reading when Jev could not answer: nothing refused, nothing labelled. Pure. */\nexport function unreadAdSpec(spec: AdSpecT): AdSpecReading {\n return {\n introducesSpeaker: spec.beats.map(() => false),\n wantsLegibleText: spec.beats.map(() => false),\n voiceGenders: {},\n captionCarriesOn: [],\n read: false,\n };\n}\n\nconst yes = (answer: JevAnswer | undefined, held: number) =>\n answer !== undefined && \"noul\" in answer && answer.noul >= held;\n\n/**\n * Read the spec in one request. `voices` are the descriptions to ask a gender for\n * (`adSpecVoices`); `askLanguage` is false when the spec declares its language.\n */\nexport async function readAdSpec(\n spec: AdSpecT,\n options: { voices: readonly string[]; askLanguage: boolean },\n readers: AdSpecReaders,\n): Promise<AdSpecReading> {\n const lines = spec.beats.map((b) => b.say);\n const castDescription = spec.cast?.description?.trim();\n const carries = carriesOnQuestions(lines);\n const sections: Array<{ name: string; questions: JevQuestion[] }> = [\n { name: \"language\", questions: options.askLanguage ? [languageQuestion(lines)] : [] },\n {\n name: \"intro\",\n questions: lines.map((line) => ({ type: \"noul\", instructions: { line, question: INTRODUCES_SPEAKER } })),\n },\n {\n name: \"legible\",\n questions: spec.beats.map((b) => ({\n type: \"noul\",\n instructions: { brief: b.show, question: WANTS_LEGIBLE_TEXT },\n })),\n },\n {\n name: \"works\",\n questions: castDescription\n ? [{ type: \"noul\", instructions: { person: castDescription, question: WORKS_THERE } }]\n : [],\n },\n { name: \"carries\", questions: carries.questions },\n ];\n const [answers, genders] = await Promise.all([\n readers.ask(sections.flatMap((s) => s.questions)),\n readers.genders(options.voices).catch(() => null),\n ]);\n const voiceGenders = genders ?? {};\n if (!answers) return { ...unreadAdSpec(spec), voiceGenders };\n const bySection = new Map<string, JevAnswer[]>();\n let at = 0;\n for (const section of sections) {\n bySection.set(section.name, answers.slice(at, at + section.questions.length));\n at += section.questions.length;\n }\n const of = (name: string) => bySection.get(name) ?? [];\n const scriptLanguage = languageFromAnswer(of(\"language\")[0]);\n const works = of(\"works\")[0];\n return {\n ...(scriptLanguage ? { scriptLanguage } : {}),\n introducesSpeaker: lines.map((_, i) => yes(of(\"intro\")[i], INTRODUCES_SPEAKER_HELD)),\n wantsLegibleText: spec.beats.map((_, i) => yes(of(\"legible\")[i], WANTS_LEGIBLE_TEXT_HELD)),\n ...(works && \"noul\" in works ? { castWorksThere: works.noul >= WORKS_THERE_HELD } : {}),\n voiceGenders,\n captionCarriesOn: carriesOnFromAnswers(carries.words, of(\"carries\")),\n read: true,\n };\n}\n","/**\n * The brand's face in a video ad's drawn words: the captions, the closing button, and the\n * name shown when the mark cannot be.\n *\n * All three were hard-coded Arial Black, whatever the brand's type was. The face is\n * resolved the way a static ad resolves its headline (`brandHeadlineFont`), staged as a\n * file beside the caption composition, and declared under one family name. When the brand\n * has no face of its own, nothing here is applied and the captions keep their shipped look.\n *\n * Declared with `@font-face` in the same document that uses it: HyperFrames refuses a family\n * it cannot map, and a family named in CSS but defined nowhere aborted a whole render.\n */\n\n/** The family the staged face is declared under. */\nexport const AD_DISPLAY_FAMILY = \"AdDisplay\";\n\n/** The stack a heavy display line is set in: the brand's face first, then the shipped look. */\nexport function displayFontStack(face: string | undefined): string {\n const fallback = \"'Arial Black', 'Helvetica Neue', Arial, sans-serif\";\n return face ? `'${face}', ${fallback}` : fallback;\n}\n\n/**\n * The face declaration and the caption rule that uses it. The captions keep their uppercase\n * and their shadow, which is what makes them legible over footage in any face.\n */\nexport function adDisplayFaceCss(file: string): string {\n return [\n \" /* --- the brand's face (baker canvas scaffold-ad) --- */\",\n ` @font-face { font-family: '${AD_DISPLAY_FAMILY}'; src: url('./${file}'); font-weight: 100 900; font-display: block; }`,\n ` .caption-group { font-family: ${displayFontStack(AD_DISPLAY_FAMILY)}; }`,\n ].join(\"\\n\");\n}\n\n/** Append the face to a staged caption composition's stylesheet. */\nexport function injectAdDisplayFace(indexHtml: string, file: string): string {\n return indexHtml.replace(\" </style>\", `${adDisplayFaceCss(file)}\\n </style>`);\n}\n","/**\n * Where a video ad's drawn layers sit: the captions, the corner mark and the closing card.\n *\n * Inside the part of the frame the platform leaves clear (`videoSafeArea`), and in\n * percentages of the frame rather than pixels, so a composition stamped to 4:5 or 1:1\n * keeps them where they belong. The captions used to sit at 320px of 1920 and the mark at\n * 90px: both under the Reels and Stories chrome on every 9:16 ad.\n */\nimport { videoSafeArea } from \"./platform-safe-area.ts\";\n\n/**\n * How far up a feed frame the captions sit at least. A feed frame has no chrome over it,\n * but a caption on its very edge reads as a subtitle bar rather than part of the ad.\n */\nconst CAPTION_MIN_LIFT = 0.1;\n\ntype Box = { top: number; bottom: number; left: number; right: number };\n\nexport type AdLayerPlacement = {\n /** The captions' bottom edge, and the gutter either side of them. */\n caption: { bottom: number; side: number };\n /** The corner mark's top-left corner. */\n mark: { top: number; left: number };\n /** The box the closing card is centred in. */\n card: Box;\n};\n\n/** Every placement as a fraction of the frame. */\nexport function adLayerPlacement(aspect: string): AdLayerPlacement {\n const safe = videoSafeArea(aspect);\n return {\n caption: { bottom: Math.max(safe.bottom, CAPTION_MIN_LIFT), side: Math.max(safe.left, safe.right) },\n mark: { top: safe.top, left: safe.left },\n card: safe,\n };\n}\n\n/** A fraction of the frame as a CSS percentage. */\nexport const cssPct = (fraction: number): string => `${Math.round(fraction * 1000) / 10}%`;\n\n/**\n * The caption track's placement for this aspect, appended after the composition's own rules\n * so it wins over the shipped 9:16 pixel values. The card is anchored by its bottom edge, so\n * one that wraps to a second line grows upward, away from the chrome.\n */\nexport function adCaptionPlacementCss(aspect: string): string {\n const { caption } = adLayerPlacement(aspect);\n return [\n \" /* --- caption placement (baker canvas scaffold-ad) --- */\",\n \" /* Relative to the frame and inside what the platform leaves clear: Reels covers the\",\n \" bottom 35% of a 9:16 frame, and cards drawn at the old 320px sat under it. */\",\n ` .caption-container { bottom: ${cssPct(caption.bottom)}; padding: 0 ${cssPct(caption.side)}; }`,\n ` .caption-group { bottom: 0; max-width: ${cssPct(1 - 2 * caption.side)}; }`,\n ].join(\"\\n\");\n}\n\n/** Append the caption placement to a staged caption composition's stylesheet. */\nexport function injectAdCaptionPlacement(indexHtml: string, aspect: string): string {\n return indexHtml.replace(\" </style>\", `${adCaptionPlacementCss(aspect)}\\n </style>`);\n}\n","import { escapeHtml } from \"./lib/html.ts\";\n\n/**\n * The brand mark and the closing card, drawn locally.\n *\n * An ad shipped with no mark in any of its 28 seconds and no ending — it stopped on\n * a man shuffling paper. Both were reachable the whole time and neither was reached,\n * for the same reason: the only route to a logo on screen was a TODO stub the overlay\n * scaffold seeds for an agent to fill in by hand, and nothing made it happen.\n *\n * So this emits the real thing instead of asking for it. The overlay layer is a genuine\n * HyperFrames composition, which means a logo is an `<img>` and a call to action is a\n * `<div>` — deterministic, correct on the first render, and free. Nothing here goes near\n * a generative model, and it must not: a video model garbles a wordmark every time, which\n * is exactly why the engine already refuses to generate a brand card as a picture.\n *\n * The rule this encodes, beyond ads: anything with a fixed, known appearance — a mark, a\n * price, a URL, a legal line, a figure quoted in the script — is drawn by the composition.\n * Asking the picture model for it buys a garbled version of something we already have.\n */\n\nimport { displayFontStack } from \"./ad-display-face.ts\";\nimport { adLayerPlacement, cssPct } from \"./ad-layer-placement.ts\";\n\n/**\n * How the brand layer is set: the frame it is placed in, and the family its words are drawn\n * in (declared by the host composition; absent, the shipped Arial Black look).\n */\nexport type AdBrandLayerStyle = { aspect?: string; face?: string };\n\n/** A brand mark that the composition can draw, and the filename it is staged under. */\nexport type StagedLogo = { file: string; alt: string };\n\n/**\n * A wordmark drawn as text, shown only if the image cannot be.\n *\n * An `<img>` that 404s, or an SVG whose own geometry clips it, currently renders as\n * nothing or as a fragment — one ad drew \"greenlea\" for the whole of its length because\n * the mark's leaf glyph sat on top of its last letter, inside the file. Nothing in CSS\n * can reach inside an `<img>` to fix that.\n *\n * So the layer carries the brand NAME as a fallback. It is not a logo and does not\n * pretend to be one, but a legible name beats a broken mark, and it costs one attribute.\n *\n * The handler is escaped on its way into the attribute, like any other value here.\n * `JSON.stringify` emits real double quotes and the attribute is delimited by one, so\n * unescaped the first of them CLOSED it: the handler was cut off at `textContent:`, the\n * brand name was parsed as two stray attributes, and the fallback this whole block\n * exists for could never run — for any name.\n */\nconst markFallback = (name: string): string =>\n name.trim()\n ? ` onerror=\"this.replaceWith(Object.assign(document.createElement('span'),{className:this.className+' brand-wordmark',textContent:${escapeHtml(JSON.stringify(name.trim()))}}))\"`\n : \"\";\n\n/**\n * The overlay layer for an ad: a corner mark that runs throughout, and a closing card.\n *\n * The corner mark is small and constant because that is what a viewer scrubbing past\n * an ad actually registers, and because it costs nothing — it is the same `<img>` held\n * for the whole timeline. The closing card is timed to the last beat, so the read and\n * the card land together instead of the picture running on after the voice stops.\n *\n * Emits nothing at all when there is no mark and no call to action: an empty overlay is\n * better than a card announcing a brand it cannot show.\n */\nexport function buildAdBrandOverlay(opts: {\n logo: StagedLogo | null;\n cta: string | null;\n /** When the closing card comes in, and how long it holds. */\n cardAtS: number;\n cardDurationS: number;\n /** Total runtime, so the corner mark spans it. */\n totalS: number;\n /**\n * The mark's ink is light (white or near-white), so it needs a DARK panel behind it.\n * Measured off the file by `markInkIsLight`. Default false — the near-white panel is\n * right for the usual mark, which is drawn to sit on white.\n */\n markIsLight?: boolean;\n /**\n * The closing plate this card sits on is dark, so the button on it must be light.\n * Decided by `plateIsDark` off the palette the engine fills that plate from. Default\n * false — a near-black button on a light plate is the stylesheet's own default.\n */\n plateIsDark?: boolean;\n}): string {\n const { logo, cta, cardAtS, cardDurationS, totalS } = opts;\n if (!logo && !cta?.trim()) return \"\";\n // One class, both places the mark is drawn: the corner and the closing card. A mark\n // washed out in the corner is washed out on the card too — it is the same file.\n const inkClass = opts.markIsLight ? \" on-dark\" : \"\";\n\n const parts: string[] = [\n \"<!-- Brand layer, emitted by `baker canvas scaffold-ad`. The mark and the closing\",\n \" card are drawn HERE, by the composition — never generated as a picture, because\",\n \" a video model garbles a wordmark every time. Restyle freely, but keep the\",\n \" data-start/data-dur attributes and the script below: that script is what shows\",\n \" and hides these, and the host composition has nothing that would. -->\",\n ];\n\n if (logo) {\n parts.push(\n `<img class=\"clip brand-mark${inkClass}\" src=\"${escapeHtml(logo.file)}\" alt=\"${escapeHtml(logo.alt)}\" ` +\n `data-start=\"0\" data-dur=\"${totalS}\"${markFallback(logo.alt)} />`,\n );\n }\n\n const cardBits: string[] = [];\n if (logo) {\n cardBits.push(\n `<img class=\"endcard-logo${inkClass}\" src=\"${escapeHtml(logo.file)}\" alt=\"${escapeHtml(logo.alt)}\"${markFallback(logo.alt)} />`,\n );\n }\n if (cta?.trim()) {\n // The button is coloured AGAINST the plate, not from the palette. It used to be painted\n // in the palette's dominant hex — which is the hex the engine fills the closing PLATE\n // with, so the button was that colour on a frame of that colour: white letters floating\n // on green, invisible as a button, and reading as one more line of the caption text\n // below it. Verified in a browser off the real composition.\n //\n // A fixed near-black fill is the same defect mirrored, and reachable: the palette only\n // drops a hex darker than luma 14, so `#14181f` is a legal plate, and an ad with NO\n // palette gets a black plate by default. So the fill is the opposite of whatever the\n // plate is.\n cardBits.push(\n `<div class=\"endcard-cta${opts.plateIsDark ? \" on-dark-plate\" : \"\"}\">${escapeHtml(cta.trim())}</div>`,\n );\n }\n parts.push(\n `<div class=\"clip endcard\" data-start=\"${cardAtS}\" data-dur=\"${cardDurationS}\" data-role=\"cta\">`,\n ...cardBits.map((b) => ` ${b}`),\n \"</div>\",\n brandLayerDriver(),\n );\n\n return parts.join(\"\\n\");\n}\n\n/**\n * The layer drives its own show and hide.\n *\n * `data-start` / `data-dur` are not a runtime contract — they are a convention that the\n * OVERLAY composition implements in a script of its own. An ad renders the CAPTION\n * composition, which has no such script, so the mark and the closing card were staged\n * correctly, injected correctly, styled correctly, and never shown: the elements sat in\n * the document with nothing to reveal them, and the ad rendered four seconds of empty\n * brand plate. Twice.\n *\n * Rather than depend on the host, the layer brings its own driver, which makes it\n * correct in any composition it is injected into. It hooks `__timelines.main` with a\n * setter instead of polling for it, because the host builds its timeline asynchronously\n * (it fetches the transcript first) and a poll is a race against the renderer's first\n * seek. This script is emitted with the markup, ahead of the host's own script, so the\n * hook is always in place before the assignment happens.\n */\nfunction brandLayerDriver(): string {\n return [\n \"<script>\",\n \" (function () {\",\n \" var els = Array.prototype.slice.call(document.querySelectorAll('.brand-mark, .endcard'));\",\n \" if (!els.length) return;\",\n \" els.forEach(function (el) { gsap.set(el, { visibility: 'hidden' }); });\",\n \" var card = document.querySelector('.endcard');\",\n \" var captions = document.getElementById('captions');\",\n \" function attach(tl) {\",\n \" if (!tl) return;\",\n \" els.forEach(function (el) {\",\n \" var at = parseFloat(el.getAttribute('data-start') || '0') || 0;\",\n \" var dur = parseFloat(el.getAttribute('data-dur') || '0') || 0;\",\n \" tl.set(el, { visibility: 'visible' }, at);\",\n \" if (dur > 0) tl.set(el, { visibility: 'hidden' }, at + dur);\",\n \" });\",\n \" // The closing card owns the frame it lands on. The caption track otherwise\",\n \" // keeps running underneath it, and what it captions there is the line spoken\",\n \" // OVER the card — the call to action, printed a second time in smaller letters\",\n \" // directly below the button that already says it. Hidden on the CONTAINER and\",\n \" // with `display`, because each caption group sets its own `visibility: visible`\",\n \" // and would win against anything set on its parent.\",\n \" if (card && captions) {\",\n \" var cardAt = parseFloat(card.getAttribute('data-start') || '0') || 0;\",\n \" var cardDur = parseFloat(card.getAttribute('data-dur') || '0') || 0;\",\n \" tl.set(captions, { display: 'none' }, cardAt);\",\n \" if (cardDur > 0) tl.set(captions, { display: '' }, cardAt + cardDur);\",\n \" }\",\n \" }\",\n \" var store = window.__timelines || {};\",\n \" var main = store.main;\",\n \" if (main) { attach(main); return; }\",\n \" Object.defineProperty(store, 'main', {\",\n \" configurable: true,\",\n \" get: function () { return main; },\",\n \" set: function (tl) { main = tl; attach(tl); },\",\n \" });\",\n \" window.__timelines = store;\",\n \" })();\",\n \"</script>\",\n ].join(\"\\n\");\n}\n\n/**\n * Styling for what the block above emits.\n *\n * Kept beside the markup rather than baked into the shipped composition, because the\n * composition is shared with the reference-reproduction path and has no business\n * carrying an ad's brand card. Appended into its `<style>` only when an ad actually\n * emits one.\n */\nexport function adBrandOverlayCss(opts: AdBrandLayerStyle = {}): string {\n const { mark, card } = adLayerPlacement(opts.aspect ?? \"9:16\");\n return [\n \" /* --- brand layer (baker canvas scaffold-ad) --- */\",\n \" /* Positioned by this block alone. The composition that actually renders an ad\",\n \" is the caption track, which has no .pos-* helpers — relying on them put the\",\n \" brand layer in a file nothing opens and shipped an empty green end plate. */\",\n \" /* Height-led, not width-led. Pinned to 220px WIDE, a wordmark whose SVG\",\n \" viewBox is wider than it is tall rendered clipped — the first real ad drew\",\n \" `greenlea`. Constraining the height and letting the width follow keeps any\",\n \" aspect ratio whole, and the max-width stops a very wide mark spanning the frame. */\",\n \" /* A LIGHT panel behind the mark by DEFAULT. A brand mark is usually drawn to sit\",\n \" on white — the first one here was #1D5D47 on transparent — so a dark backing hid\",\n \" it on the corner and the brand-coloured closing plate erased it completely: the\",\n \" end card came out as an empty green frame with a single leaf floating in it. A\",\n \" near-white panel is the background most marks in a brand kit are designed\",\n \" against; the ones that are not get `.on-dark` below. */\",\n \" /* Placed in percentages inside the frame's safe area (`adLayerPlacement`): at a fixed\",\n \" 90px from the top it sat under the Stories and Reels header on every 9:16 ad. */\",\n ` .brand-mark { position: absolute; top: ${cssPct(mark.top)}; left: ${cssPct(mark.left)}; height: 52px; width: auto;`,\n \" max-width: 420px; object-fit: contain; padding: 14px 22px; border-radius: 18px;\",\n \" background: rgba(255,255,255,0.94);\",\n \" filter: drop-shadow(0 3px 10px rgba(0,0,0,0.35)); }\",\n \" /* Centred in the safe area, not the frame, so the mark and the call to action stay\",\n \" clear of the chrome on a 9:16 closing card. */\",\n ` .endcard { position: absolute; top: ${cssPct(card.top)}; bottom: ${cssPct(card.bottom)}; left: ${cssPct(card.left)}; right: ${cssPct(card.right)};`,\n \" display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 56px;\",\n \" text-align: center; }\",\n \" /* Sized to FILL, not merely bounded. Given only max-* constraints an SVG\",\n \" renders at its own intrinsic size, and a small viewBox drew a closing mark\",\n \" a few dozen pixels tall in the middle of a 1080px frame. */\",\n \" .endcard-logo { width: 62%; height: auto; max-height: 300px; object-fit: contain;\",\n \" padding: 46px 56px; border-radius: 40px; background: rgba(255,255,255,0.96);\",\n \" box-shadow: 0 10px 40px rgba(0,0,0,0.28); }\",\n \" /* A mark whose own ink is LIGHT gets the opposite panel. The near-white panel\",\n \" above is right for the mark a brand kit usually ships — drawn to sit on white\",\n \" — and it erases the one it does not: a client's white `logo-dark.svg` rendered\",\n \" as an empty white box in the corner, and again 300px tall on the closing card.\",\n \" Which one a mark is gets MEASURED off the file (`markInkIsLight`), never read\",\n \" off its name: `logo-dark` names the background it is for in one brand kit and\",\n \" the ink itself in the next. */\",\n \" .brand-mark.on-dark, .endcard-logo.on-dark { background: rgba(16,20,18,0.92); }\",\n \" /* The name, when the mark itself could not be drawn. */\",\n ` .brand-wordmark { display: inline-block; font-family: ${displayFontStack(opts.face)};`,\n \" font-weight: 900; color: #14231b; letter-spacing: -0.01em; }\",\n \" .brand-mark.brand-wordmark { font-size: 34px; line-height: 1; height: auto; }\",\n \" .endcard-logo.brand-wordmark { font-size: 96px; line-height: 1; width: auto; }\",\n \" /* Capped and wrapping, not sized to its content: measured in a real browser,\",\n \" `GET YOUR FREE QUOTE` renders 948px wide against a 1080px canvas, so the next\",\n \" slightly longer call to action runs off the frame. Two lines beat an edge. */\",\n \" /* The SAME family the caption track uses, and only names the compiler maps.\",\n \" Declaring one matters — rendered without it the call to action inherited the\",\n \" document default and came out in Times beside sans-serif captions. But the\",\n \" first attempt led with 'BrandFont', which the overlay composition defines and\",\n \" the caption composition does not: HyperFrames refuses an unmapped family and\",\n \" the whole render died with `No deterministic font mapping for: BrandFont`. */\",\n \" /* The button is the OPPOSITE of the plate it sits on. Filling it with the brand\",\n \" colour made it invisible — the plate is filled with that same colour, so the\",\n \" button was brand-on-brand and its white copy read as another caption line —\",\n \" and a fixed near-black fill is that defect mirrored, on the black plate an ad\",\n \" with no palette gets. The plate carries the brand; the button carries the\",\n \" contrast. Light copy on the near-black default, dark copy on the light one. */\",\n ` .endcard-cta { font-family: ${displayFontStack(opts.face)};`,\n \" font-size: 64px; font-weight: 900; text-transform: uppercase;\",\n \" letter-spacing: 0.01em; color: #fff; padding: 28px 58px; border-radius: 56px;\",\n \" max-width: 900px; line-height: 1.15; background: rgba(0,0,0,0.82); }\",\n \" .endcard-cta.on-dark-plate { background: rgba(255,255,255,0.96); color: #14231b; }\",\n ].join(\"\\n\");\n}\n\n/**\n * Put the brand layer into the composition that will actually be rendered.\n *\n * Only one composition in an ad's canvas is ever opened — the caption track — and it\n * carries no `<!--OVERLAYS-->` marker, because that marker belongs to the overlay layer\n * the reference-reproduction path uses. Writing to the marker alone put the mark and the\n * closing card in a staged file nothing reads, and the ad shipped with four seconds of\n * empty green where the end card should have been.\n *\n * So the marker is preferred and the close of `#root` is the fallback, which every\n * composition has.\n */\nexport function injectAdBrandOverlay(indexHtml: string, overlayHtml: string, style: AdBrandLayerStyle = {}): string {\n if (!overlayHtml.trim()) return indexHtml;\n const withCss = indexHtml.replace(\" </style>\", `${adBrandOverlayCss(style)}\\n </style>`);\n if (withCss.includes(\"<!--OVERLAYS-->\")) return withCss.replace(\"<!--OVERLAYS-->\", () => overlayHtml);\n const rootClose = withCss.lastIndexOf(\"</div>\");\n if (rootClose === -1) return withCss;\n return `${withCss.slice(0, rootClose)}${overlayHtml}\\n ${withCss.slice(rootClose)}`;\n}\n"],"mappings":"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","names":["spokenLanguage","file"]}
|